2010年11月20日土曜日

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

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

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

ノートブックを作成・更新・取得するコードの例。
  1. public class NotebookTest {  
  2.   
  3.     private static String consumerKey = "consumer key";  
  4.     private static String consumerSecret = "consumer secret";  
  5.     private static String evernoteHost = "sandbox.evernote.com";  
  6.     private static String userName = "user name";  
  7.     private static String password = "password";  
  8.   
  9.     private static NoteStore.Client setupNoteStore(String evernoteHost, User user) throws TException {  
  10.         // NoteStore クライアントのセットアップ  
  11.         String noteStoreUrl = "https://" + evernoteHost + "/edam/note/" + user.getShardId();  
  12.         THttpClient trans = new THttpClient(noteStoreUrl);  
  13.         TBinaryProtocol prot = new TBinaryProtocol(trans);  
  14.         NoteStore.Client noteStore = new NoteStore.Client(prot, prot);  
  15.         return noteStore;  
  16.     }  
  17.       
  18.     public static void main(String[] args) {  
  19.         UserStore.Client userStore = null;  
  20.         NoteStore.Client noteStore = null;  
  21.         AuthenticationResult authResult = null;  
  22.         try {  
  23.             userStore = AuthUtil.setupUserStore(evernoteHost);  
  24.             authResult = AuthUtil.authenticate(userStore, consumerKey, consumerSecret, evernoteHost, userName, password);  
  25.             User user = authResult.getUser();  
  26.             String authToken = authResult.getAuthenticationToken();  
  27.               
  28.             noteStore = setupNoteStore(evernoteHost, user);  
  29.               
  30.             // 新規ノートブック作成  
  31.             System.out.println("** CREATE **");  
  32.             Notebook notebook1 = new Notebook();  
  33.             notebook1.setName("testbook1");  
  34.             Notebook created1 = noteStore.createNotebook(authToken, notebook1);  
  35.             System.out.println("新規ノートブック\"" + created1.getName() + "\" が作成されました。(guid=" + created1.getGuid() + ")");  
  36.             Notebook notebook2 = new Notebook();  
  37.             notebook2.setName("testbook2");  
  38.             Notebook created2 = noteStore.createNotebook(authToken, notebook2);  
  39.             System.out.println("新規ノートブック\"" + created2.getName() + "\" が作成されました。(guid=" + created2.getGuid() + ")");  
  40.               
  41.             // ノートブック取得  
  42.             System.out.println("** GET **");  
  43.             Notebook notebook1_1 = noteStore.getNotebook(authToken, created1.getGuid());  
  44.             System.out.println("ノートブック\"" + notebook1_1.getName() + "\" を取得しました。(Update Sequence Number: " + notebook1_1.getUpdateSequenceNum() + ")");  
  45.               
  46.             // ノートブック更新  
  47.             System.out.println("** UPDATE **");  
  48.             notebook1_1.setName("testbook1_xyz");  
  49.             int usn = noteStore.updateNotebook(authToken, notebook1_1);  
  50.             System.out.println("ノートブック\"" + notebook1_1.getName() + "\" を更新しました。 (Update Sequence Number: " + usn + ")");  
  51.               
  52.             // ノートブックを削除  
  53.             // XXX デフォルトはで許可されない。(*1)  
  54.             // System.out.println("** EXPUNGE **");  
  55.             // int guid = noteStore.expungeNotebook(authToken, created2.getGuid());  
  56.             // System.out.println("ID: " + guid + " のノートブックが削除されました。");  
  57.               
  58.             // 全ノートをリストアップ  
  59.             System.out.println("** LIST **");  
  60.             List<Notebook> notebooks = noteStore.listNotebooks(authToken);  
  61.             for (Notebook notebook : notebooks) {  
  62.                 System.out.print("- " + notebook.getName());  
  63.                 if (notebook.isDefaultNotebook()) {  
  64.                     System.out.print(" (default)");  
  65.                 }  
  66.                 System.out.println("");  
  67.             }  
  68.         } catch (Exception e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.     }  
  72.   
  73. }  
※ 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 件のコメント:

コメントを投稿