2010年11月20日土曜日

Evernote API を使ってみる (3) ノートブック作成・更新・取得

Evernote Service のデータ(ノートブック、ノート、タグ、etc.)を操作(取得、作成、更新、削除)するには NoteStore サービスのクライアントを使う。
手順は以下。

  1. UserStoreクライアントをセットアップ/認証
    -認証されたUserオブジェクトと、認証トークンが渡される
  2. NoteStoreをセットアップ
    -認証されたUserオブジェクトがもつshardIdが必要
  3. NoteStoreサービスのメソッド(プロシージャ)を呼ぶ
    -プロシージャコールの都度、認証トークンをパラメータで渡す

ノートブックを作成・更新・取得するコードの例。
public class NotebookTest {

    private static String consumerKey = "consumer key";
    private static String consumerSecret = "consumer secret";
    private static String evernoteHost = "sandbox.evernote.com";
    private static String userName = "user name";
    private static String password = "password";

    private static NoteStore.Client setupNoteStore(String evernoteHost, User user) throws TException {
        // NoteStore クライアントのセットアップ
        String noteStoreUrl = "https://" + evernoteHost + "/edam/note/" + user.getShardId();
        THttpClient trans = new THttpClient(noteStoreUrl);
        TBinaryProtocol prot = new TBinaryProtocol(trans);
        NoteStore.Client noteStore = new NoteStore.Client(prot, prot);
        return noteStore;
    }
    
    public static void main(String[] args) {
        UserStore.Client userStore = null;
        NoteStore.Client noteStore = null;
        AuthenticationResult authResult = null;
        try {
            userStore = AuthUtil.setupUserStore(evernoteHost);
            authResult = AuthUtil.authenticate(userStore, consumerKey, consumerSecret, evernoteHost, userName, password);
            User user = authResult.getUser();
            String authToken = authResult.getAuthenticationToken();
            
            noteStore = setupNoteStore(evernoteHost, user);
            
            // 新規ノートブック作成
            System.out.println("** CREATE **");
            Notebook notebook1 = new Notebook();
            notebook1.setName("testbook1");
            Notebook created1 = noteStore.createNotebook(authToken, notebook1);
            System.out.println("新規ノートブック\"" + created1.getName() + "\" が作成されました。(guid=" + created1.getGuid() + ")");
            Notebook notebook2 = new Notebook();
            notebook2.setName("testbook2");
            Notebook created2 = noteStore.createNotebook(authToken, notebook2);
            System.out.println("新規ノートブック\"" + created2.getName() + "\" が作成されました。(guid=" + created2.getGuid() + ")");
            
            // ノートブック取得
            System.out.println("** GET **");
            Notebook notebook1_1 = noteStore.getNotebook(authToken, created1.getGuid());
            System.out.println("ノートブック\"" + notebook1_1.getName() + "\" を取得しました。(Update Sequence Number: " + notebook1_1.getUpdateSequenceNum() + ")");
            
            // ノートブック更新
            System.out.println("** UPDATE **");
            notebook1_1.setName("testbook1_xyz");
            int usn = noteStore.updateNotebook(authToken, notebook1_1);
            System.out.println("ノートブック\"" + notebook1_1.getName() + "\" を更新しました。 (Update Sequence Number: " + usn + ")");
            
            // ノートブックを削除
            // XXX デフォルトはで許可されない。(*1)
            // System.out.println("** EXPUNGE **");
            // int guid = noteStore.expungeNotebook(authToken, created2.getGuid());
            // System.out.println("ID: " + guid + " のノートブックが削除されました。");
            
            // 全ノートをリストアップ
            System.out.println("** LIST **");
            List<Notebook> notebooks = noteStore.listNotebooks(authToken);
            for (Notebook notebook : notebooks) {
                System.out.print("- " + notebook.getName());
                if (notebook.isDefaultNotebook()) {
                    System.out.print(" (default)");
                }
                System.out.println("");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
※ AuthUtil は、UserStore初期化・認証用に作成したユーティリティクラス

NoteStoreクライアント作成時(setupNoteStore())に、URLの最後に付けている shardId というのは、API Overview ドキュメントによると

This allows the service to efficiently pass your requests to the appropriate NoteStore shard server.

とあるので、なにかしらサーバーのロケーションを特定するのに使っている?

実行例。
** CREATE **
新規ノートブック"testbook1" が作成されました。(guid=263db0da-edb1-43a2-af0e-bb7491be275d)
新規ノートブック"testbook2" が作成されました。(guid=456ffd44-a71c-4c3e-a297-104465a354b7)
** GET **
ノートブック"testbook1" を取得しました。(Update Sequence Number: 112)
** UPDATE **
ノートブック"testbook1_xyz" を更新しました。 (Update Sequence Number: 114)
** LIST **
- default notebook (default)
- testbook1_xyz
- testbook2

(*1)
NoteStore.Client#expungeNotebook() というメソッドを呼ぶと、認証トークンは正しいはずなのに
EDAMUserException(errorCode:PERMISSION_DENIED, parameter:authenticationToken)
という例外が発生してノートブックが削除できない。
フォーラムを検索してみると、「デフォルトのAPIキーだとCREATE/READ/UPDATEしかできないようにしている、もしexpungeXXXをしたいのなら別途申請して」ということらしい。。
http://forum.evernote.com/phpbb/viewtopic.php?f=43&t=16949&p=67917&hilit=expungenotebook#p67917

0 件のコメント:

コメントを投稿