ちょこちょこ調べたことの備忘。
「Request an API Key」フォームに必要事項記入の上送信。
しばらくすると(1~2日かかる様子)記入したメールアドレスにキーの組み合わせが送信されてくる。
このキーはサンドボックス用らしく、これでは本物の Evernote へアクセスすることはできない。
まずお試しでサンドボックスでAPIを使ってみて、その後再度申請すれば本サービスへアクセスできるキーがもらえる、
という流れらしい。
Consumer Key, Consumer Secretの入手
http://www.evernote.com/about/developer/api/にアクセスし、「Request an API Key」フォームに必要事項記入の上送信。
しばらくすると(1~2日かかる様子)記入したメールアドレスにキーの組み合わせが送信されてくる。
このキーはサンドボックス用らしく、これでは本物の Evernote へアクセスすることはできない。
まずお試しでサンドボックスでAPIを使ってみて、その後再度申請すれば本サービスへアクセスできるキーがもらえる、
という流れらしい。
Java SDK の入手
上記の同 URL の「Download the API SDK」からダウンロード。(執筆時点でバージョン 1.19 だった)Java, C++, Perl, Python, Ruby など色んな言語が全部入り。
Java ディレクトリの中身は evernote-api-1.19.jar, libthrift,jar, log4j-1.2.14.jar の3つ。
とりあえずアクセスしてみる
sample のソースが同梱されているのでひと通りの事はこれを眺めればできそう。private final String authToken; private final NoteStore.Client noteStore; EvernoteOperation( String username, String password, String consumerKey, String consumerSecret) throws EDAMUserException, EDAMSystemException, TException { String userStoreUrl = "https://sandbox.evernote.com/edam/user"; THttpClient userStoreTrans = new THttpClient(userStoreUrl); TBinaryProtocol userStoreProt = new TBinaryProtocol(userStoreTrans); UserStore.Client userStore = new UserStore.Client(userStoreProt); AuthenticationResult authResult = userStore.authenticate( username, password, consumerKey, consumerSecret); String noteStoreUrlBase = "https://sandbox.evernote.com/edam/note/"; User user = authResult.getUser(); String noteStoreUrl = noteStoreUrlBase + user.getShardId(); THttpClient noteStoreTrans = new THttpClient(noteStoreUrl); TBinaryProtocol noteStoreProt = new TBinaryProtocol(noteStoreTrans); authToken = authResult.getAuthenticationToken(); noteStore = new NoteStore.Client(noteStoreProt); }こんな感じでユーザ名,パスワード,入手したキーを元に authToken と NoteStore を作成し、これを使ってアクセスする。
(URL の sandbox の部分は本サービスへアクセスする際は変更する必要があるんだろう。)
ノートの内容を取得する
作成日でソートしてタイトルと作成日,更新日を 100 件まで表示するにはこんな感じ。void getAllNotes() throws EDAMUserException, EDAMSystemException, EDAMNotFoundException, TException { List notebooks = noteStore.listNotebooks(authToken); for (Notebook notebook : notebooks) { NoteFilter filter = new NoteFilter(); filter.setNotebookGuid(notebook.getGuid()); filter.setOrder(NoteSortOrder.CREATED.getValue()); filter.setAscending(true); NoteList noteList = noteStore.findNotes(authToken, filter, 0, 100); List notes = noteList.getNotes(); for (Note note : notes) { String title = note.getTitle(); System.out.println("[title]" + title); System.out.println("[create]" + new Date(note.getCreated())); System.out.println("[update]" + new Date(note.getUpdated())); } } }ちなみに Note クラスには getContent(), getTagNames() といったメソッドがあるけれど、
上記のように取得した場合には値が入っておらず null が帰ってくるので、 内容やタグを取得するには
System.out.println("[content]" + noteStore.getNoteContent(authToken, note.getGuid())); System.out.println("[tagnames]" + noteStore.getNoteTagNames(authToken, note.getGuid()));というように、一意の ID をもとに別途取得する必要がある。
ノートに「test」とのみ入力している場合、内容は
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE en-note SYSTEM " <en-note> <div>test</div> </en-note>という Evernote 独自のタグをルートに持つ HTML として取得されるようだ。
ノートの添付ファイルを取得する
ノートに添付ファイルがある場合、getNoteContent() の一部として<en-media hash="e47b94c2ac0627207522ab8cb3ffe439" type="image/jpeg"/>とキーとファイルタイプのみ返ってくる。
添付ファイルの取得は別途このようにする。
void getResources(Note note, File dir) { for (Resource resource : note.getResources()) { String name = resource.getAttributes().getFileName(); byte[] body = resource.getData().getBody(); InputStream in = null; try { in = new ByteArrayInputStream(body); OutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(new File(dir, name))); IOUtils.copy(in, out); } finally { if (out != null) out.close(); } } finally { if (in != null) in.close(); } } }
ノートを作成する
取得した内容をみるに、ルート要素が en-note タグであればよさそうなのでこんな感じかな。とりあえず作成には成功した。
void create(String title, String text) throws EDAMUserException, EDAMSystemException, EDAMNotFoundException, TException { Note note = new Note(); note.setTitle(title); String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">" + "<en-note><div>" + text + "</div></en-note>"; note.setContent(content); Note createdNote = noteStore.createNote(authToken, note); System.out.println("[guid]" + createdNote.getGuid()); }