CakePHPでEvernoteのAPIを使ってみました。

ちなみにこちらのサイトでEvernoteへの自動投稿にAPI使ってみました。

http://eventantena.com

CakePHPですけど、CakePHPじゃなくても基本的には同じなので読み替えてみてください。
分かってないことも多いので分かり次第更新していくか、新しい記事を書いて行きます。

Evernote APIを使うための申請をする

こちらからEvernote APIの申請を行います。
http://www.evernote.com/about/intl/jp/developer/api/#key
今回はWebアプリケーションで申請を行いました。

時間がかかるようなことが記載されている情報が多かったのですが、自分の場合はすぐにメールが帰ってきました。
「Consumer Key」「Consumer Secret」が発行されるので発行されたキーでAPIを実行します。

この時点で使えるのはEvernoteのテスト用サーバーです。
テスト用サーバーとプロダクション環境とは分離されてるみたいなので
テスト用サーバーに新しくアカウントを作成して存分にテストしちゃえばいいと思います。
(最初はアカウントがありませんので作成してから始めましょう)

API を使うための準備

「Consumer Key」「Consumer Secret」が発行されたら、ここから API SDK をダウンロードします。
http://www.evernote.com/about/intl/jp/developer/api/
サンプルも入ってるみたいなので興味があれば動かしてみてください。

ダウンロードしたフォルダの中にあるphpフォルダのlibフォルダを全てコピーして、任意の場所に移動します。
evernote-api-1.19/php/lib
自分はアプリケーションのvendorsフォルダに「lib」フォルダを入れました。

app/vendors/evernotelib/
libはフォルダ名をevernotelibに変更しています。

ざっくりOAuth認証

Webアプリケーションで申請したのでOAuth認証を行います。
OAuth認証の方法は色々あると思いますのでここでは割愛します。

OAuth認証を使って
・oauth_token
・edam_shard
の2つを取得します。

ファイルを読み込み

必要なファイルを読み込みます。使わないファイルは読み込まなくていいので必要なときにだけ読み込んでください。

App::import('Vendor', 'thrift', array('file' => 'Evernote'.DS.'Thrift.php'));
App::import('Vendor', 'tHttpClient', array('file' => 'Evernote'.DS.'transport'.DS.'THttpClient.php'));
App::import('Vendor', 'tProtocol', array('file' => 'Evernote'.DS.'protocol'.DS.'TProtocol.php'));
App::import('Vendor', 'tBinaryProtocol', array('file' => 'Evernote'.DS.'protocol'.DS.'TBinaryProtocol.php'));
App::import('Vendor', 'types_types', array('file' => 'Evernote'.DS.'packages'.DS.'Types'.DS.'Types_types.php'));
App::import('Vendor', 'userStore', array('file' => 'Evernote'.DS.'packages'.DS.'UserStore'.DS.'UserStore.php'));
App::import('Vendor', 'noteStore', array('file' => 'Evernote'.DS.'packages'.DS.'NoteStore'.DS.'NoteStore.php'));

全てのノートブック取得

全てのノートブックを取得してみます。

ここではノートブックのタイトルだけを取得しているだけですが、他の情報も格納されています。

// NoteStore生成
$noteStoreTrans = new THttpClient('sandbox.evernote.com', '443', '/edam/note/'. '取得したedam_shard', 'https');
$noteStoreProt = new TBinaryProtocol($noteStoreTrans);
$noteStore = new NoteStoreClient($noteStoreProt, $noteStoreProt);

// 全てのノートブック取得
$noteList = $noteStore->listNotebooks('取得したoauth_token');
foreach ($noteList as $notebook) {
    echo $notebook->name;
}

ノートの取得

ノートの取得方法は色々ある見たいですが、今回は並び順などのフィルタを設定したバージョンです。

// NoteStore生成
$noteStoreTrans = new THttpClient('sandbox.evernote.com', '443', '/edam/note/' .'取得したedam_shard', 'https');
$noteStoreProt = new TBinaryProtocol($noteStoreTrans);
$noteStore = new NoteStoreClient($noteStoreProt, $noteStoreProt);

// 取得するノートのフィルタ設定(ここでは並び替えだけ)
$filter = new edam_notestore_NoteFilter();
$filter->order = edam_type_NoteSortOrder::UPDATED;

// ノートのリスト取得 0と10は開始と終了を指定しています。
$noteList = $noteStore->findNotes('取得したoauth_token', $filter,0, 10);
foreach ($noteList->notes as $notegu) {
    // ノート取得 タイトル表示
    $note = $noteStore->getNote('取得したoauth_token', $notegu->guid, true, true, true, true);
    echo $note->title;
}

ノートの作成

ノート作成します。
ノートの本文にはENMLというXHTMLのようなものが使えます。
自分も詳しくないので説明はちょっと省略しますが、こんな感じでノートが作成出来るみたいです。

// NoteStore生成
$noteStoreTrans = new THttpClient('sandbox.evernote.com', '443', '/edam/note/'. '取得したedam_shard', 'https');
$noteStoreProt = new TBinaryProtocol($noteStoreTrans);
$noteStore = new NoteStoreClient($noteStoreProt, $noteStoreProt);

// 指定したノートブック取得
$notBooks = $noteStore->getNotebook('取得したアクセスoauth_token', '保存先ノートブック');
// 新しくノート生成
$newNote = new edam_type_Note();
// 保存するノートブック設定(上記で取得したノートブックのguidを設定)
$newNote->notebookGuid = $notBooks->guid;

$newNote->title = 'ノートのタイトル';
// ノートの本文設定
$content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    . "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">"
    . "<en-note>"
    . "<ul>";
    . "<li>"
    . "ノートへの書き込み情報"
    . " URL:<a href='"
    . "URL"
    . "' target='_blank'>"
    . "リンクも作れるよ"
    . "</a></li>";
    . "</ul>"
    . "</en-note>";
$newNote->content = $content;

// ノート作成
$no = $noteStore->createNote('取得したoauth_token', $newNote);

ユーザー情報を取得

APIをwebアプリを選択して申請した場合、ユーザー情報には名前しか入っていません。

// userStore生成
$userStoreTrans = new THttpClient('sandbox.evernote.com', '80', 'edam/user', 'https');
$userStoreProt = new TBinaryProtocol($userStoreTrans);
$userStore = new UserStoreClient($userStoreProt, $userStoreProt);

// ユーザー取得
$ur = $userStore->getUser('取得したoauth_token');
// 名前取得
$ur->username;

この他にも色々出来るみたいですね。使いこなすのにはちょっと時間が必要な感じです。

こちらのサイトもどうぞ

http://eventantena.com

テスト環境からプロダクション環境へ行こうするのにEvernoteさんに依頼して2週間くらいかかりました。
というか、多分放置されてたくさいですけど。
ある程度余裕をもったほうがよいかもしれませんね。