0

Evernote Devcup Meetup 大阪 参加しました。

昨日、これに行って来ました。

エンジニアのみなさんへ: Evernote Devcup Meetup を東京・大阪・札幌で開催します « Evernote日本語版ブログ

8月か9月にアメリカで開催されるアプリ開発コンテストEvernote Devcupの概要、開発時のポイント、アイデアの出し方というのが主なトピックスです。一方的に誰かが話すのではなく、実際みんなでアイデアをブレスト&発表する時間もありました。
Evernoteユーザーの集まりではなく開発者の集まりだったのには関わらずEvernoteはこうあるべきだといった話が至る所で繰り広げられるなんとも刺激的な時間でした。

■Evernote 新GM井上さんのご挨拶
元頓智ドットの方だったんですね。

■Evernote 佐藤さんのEvernote Devcupの案内
「デブカップ」名前ダサいけど当面はこの名前になるらしい。
Evernoteのスローガンである「remember everything」は英語では「記憶する」「思い出す」の2つの意味があるけど、日本語にすると「すべてを記憶する」になる。思い出すの部分が欠けてるけどこれ重要。
あいかわらずの落ちつた話しっぷり、すごい真似てみたい話し方です。

■マインドフリー玉置さん、TAMの中川さんによるUI/UXトーク
実際会社で行われるUIのブレストの仕方、スマートフォンアプリを例に話があったり、エンジニアには目から鱗の落ちるようなな話ばかりでした。
お二方の静と動の話っぷりにも感動。

■Evernote「超」知的生産術の著者倉下さん、DualBrowser 開発者の瀬藤さん、となぜか私のパネルディスカッション。
佐藤さんのリードで去年のファイナリストのアプリを元にあーでもないこーでもないという話をしました。
佐藤さん曰くdatastoreのshareなんかのAPIはあまり使われないので狙い目かも。
ただ個人的には、なんでもかんでもソーシャルだのシェアだのいうのは好きでなく、そこにあまり力の入ってないのがEvernoteの良さだと思ってます。
食べたもの読んだものを保存しておきたいだけ。そんなのシェアしたくない、パーソナルな管理というのもいい、という話ができたのは良かった。

■会場にいる参加者を数人のグループにわけてこんなアプリのアイデアをブレスト。
三人寄れば文殊の知恵とはこの事かと思うような自分だけでは思いつかない面白いアイデアがいっぱいでました。
レシピ管理、ライフログ、自分史、回覧板等々Devcupだすださない関係なく作りたい/作って欲しいアプリだらけでした。

3行まとめ。
Everonoteは読み返してなんぼ。昨日のライフログとか読まない、数年後に進化を発揮するもの。
Evernoteはデータベースである。
小さいグループ(家族、部署)でシェアするのはおもしろい。

主催者、参加者のみなさんお疲れ様でした。
こういったものはだいたい東京で開催なんだけど、今回大阪での開催ともあり地方在住者には嬉しい限りです。
ぜひ今度はuser meetupを大阪でお願いします。

0

evernoteAPIをphpで使う(notestore)

前回はユーザーデータを扱うuserstoreを使ったけど、今回はノートを扱うnotestoreというモジュールを使う方法です。「notestore」となってるけど、実際はuserstoreでできる事以外はnotestoreでできます。
ノートやノートブックを操作するのは勿論、タグに関する事、同期に関する事、共有に関する事もnotebookに属します。

■ユーザーデータと同様、notestoreのインスタンスを生成します。
$noteStoreTrans = new THttpClient('sandbox.evernote.com', 80, '/edam/note/' . $_SESSION['shardId'], 'https');
$noteStoreProt = new TBinaryProtocol($noteStoreTrans);
$noteStore = new NoteStoreClient($noteStoreProt, $noteStoreProt);

userstoreとTHttpClientの引数がuserstoreと少し違う。
/edam/user/が/edam/note/(shardId)というものに変わる。
shardIdはgetAccessTokenでoauth_token、oauth_token_secretと同じようにedam_shardという名前で取得できてるはずなのでsessionにでも入れとく便利です。
値は永続的なものなのかユーザーによってどう変わるか分からないけど自分の環境はずっと「s1」が返ってくる。

あとはnoteStoreのインスタンスでごにょごにゅする。

noteStoreに64ものサービスがあるので代表的なところだけ書きます。
■ノートブックを取得
まず公式のサンプルにもあるlistNotebooksを使う。
$notebooks = $noteStore->listNotebooks($_SESSION['accessToken']);

戻り値はオブジェクトになっているので、プロパティにアクセスして情報をとる形になります。

foreach ($notebooks as $notebook) {
// ノートブックの名前
echo $notebook->name;
// ノートブックのユニークなID。ノートブックの名前が変わっても変わらない。
echo $notebook->guid;
}

■ノート検索
findNotesとedam_notestore_NoteFilterを使って検索をする。
以下の例は「ほげ」と書かれたノートを10件取得するというもの。
$filter = new edam_notestore_NoteFilter();
$filter->words = "ほげ"; // 検索したいワード
$noteList = $noteStore->findNotes($_SESSION['accessToken'], $filter, 0, 10);

検索したいワードは普段Evernoteの検索で使うものと同じです。
普通の文字列からsource:やtodo:を使った高度な検索も使えます。
参考: Evernoteを自由に検索するための10の条件

ループで回してメタ情報を取得していく。
foreach ($taskNotes->notes as $note) {
// 属してるノートブックのユニークID
echo $note->notebookGuid
// ノートのユニークID
echo $note->guid
// ノートのタイトル
echo $note->title
}

ただこれだと肝心のノートの内容が取れない。
ノートの内容を取るには別のメソッドをサービスを利用する。

■ノートの内容を取得
$contents = $noteStore->getNoteContent($_SESSION['accessToken'], '2f7rfbc8-0d46-4bf9-91f2-2da715cs99e5');
第二引数はノートのユニークID(guid)が入る。戻り値はstring。
内容はXHTMLに似たENMLで記述されているので、後はPHP Simple HTML DOM Parserとか使ってパースしてやる。

ENMLはこんな形になってます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note><div>ほげほげ</div>
<div>テスト</div>
<div><en-todo></en-todo>やること1</div>
<div><en-todo></en-todo>やること<span style="color: #ff6600;">2</span></div></en-note>

0

evernoteAPIをphpで使う(userstore)

EvernoteAPIは、ユーザーに関するデータの取得・更新の場合はuserstore、ノート(ノートブックやタグを含む)に関するものの場合はnotesoreというサービスを使います。

■ユーザーデータの取得する場合、userstoreのインスタンスを生成します。
$userStoreTrans = new THttpClient('sandbox.evernote.com', 80, '/edam/user', 'https');
$userStoreProt = new TBinaryProtocol($userStoreTrans);
$userStore = new UserStoreClient($userStoreProt, $userStoreProt);

開発中なので、sandbox.evernote.comへ接続してるけど本番なら勿論evernote.comへ接続するようにします。

userstoreのもつメソッドはnotestoreに比べるとかなり少なくて5つ。oauthで認証されたユーザーに関しては実質3つ。

* authenticate
* checkVersion
* getPublicUserInfo
* getUser
* refreshAuthentication

userstoreのインスタンスができたらユーザーに関するデータの取得を行う。
$user = $userStore->getUser($_SESSION['accessToken']);
引数はoauthで認証した際に取得したアクセストークン。

$userはオブジェクトとなっているので、
ユーザー名の取得
$user->username;

メールアドレスの取得
$user->email

ユーザーID
$user->id

のようにして取得する。
他にも基本的なものは取得できるけど、ノート数とかタグ数とかそのようなものは取れない。
取得できるものはこちら

jsonやxmlが返ってくるRESTなAPIと違い、基本的にオブジェクトを操作する感覚でできます。

0

evernoteAPIをphpで使う(oauth)

oauthのログインはサンプルを参考にするのが一番だけど、そのままだと動かない。(11/14現在)
やるべき事は3つ。
環境はmacOS10.7.2。php5.3.6。
■peclのoauthをインストールする。
$ sudo pecl install oauth

/usr/include/php/ext/pcre/php_pcre.h:29:18: error: pcre.h: No such file or directory
In file included from /private/tmp/pear/temp/oauth/php_oauth.h:47,
from /private/tmp/pear/temp/oauth/oauth.c:14:
/usr/include/php/ext/pcre/php_pcre.h:37: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
/usr/include/php/ext/pcre/php_pcre.h:38: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
/usr/include/php/ext/pcre/php_pcre.h:44: error: expected specifier-qualifier-list before ‘pcre’
make: *** [oauth.lo] Error 1
ERROR: `make' failed

で止まる。
pcreというのが入ってないかららしいので、macportsでインストール。
$ sudo port install pcre

インストールが完了したので再度挑戦。
が、同じところで同様のエラーが発生。

pcre.hが読み込めてないので、コピーで済ます。
$ sudo cp /opt/local/include/pcre.h /usr/include/

$ sudo pecl install oauth
はい、これで無事インストールされたので、php.iniにextensionを追記してapacheを再起動。
extension=oauth.so

■ショートタグを有効にする
ショートタグ(php_flag short_open_tag On

■config.phpを編集する。
evernoteから送られてきたキーを入力する。
sample/oauth/config.php
define('OAUTH_CONSUMER_KEY', 'hogehoge');
define('OAUTH_CONSUMER_SECRET', 's42fefc90ff2vf');
 
本番環境移行時は、EVERNOTE_SERVERも変更する必要がある。
define('EVERNOTE_SERVER', 'https://sandbox.evernote.com');

サンプルには、詳細版ログインと簡易版ログインが用意されてる。
– 詳細版ログイン(1ステップずつ動作を確認できる。)
sample/oauth/sampleApp.php
– 簡易版ログイン(実際のアプリでも使える。)
sample/oauth/index.php

どちらかのスクリプトにブラウザからアクセスして無事接続できたらとりあえずは安心。

ここからは他のAPIでoauthを使ったことある人なら、全然難しくない。
基本的に処理はすべてfuncion.phpに書かれている。

リクエストトークンとリクエストトークンシークレットを取得しにいく。
oauth_tokenとoauth_token_secretという名前になってるけど要はリクエストトークン。

$requestTokenInfo = $oauth->getRequestToken(REQUEST_TOKEN_URL, getCallbackUrl());
 
if ($requestTokenInfo) {
$_SESSION['requestToken'] = $requestTokenInfo['oauth_token'];
$_SESSION['requestTokenSecret'] = $requestTokenInfo['oauth_token_secret'];
$currentStatus = 'Obtained temporary credentials';
}


evernoteの認証画面(getAuthorizationUrl)にリダイレクト

リダイレクトから戻ってきたら、今度はaccess_tokenを取得させるためにリダイレクト。
oauth_verifierをsessionにセット
if (isset($_GET['oauth_verifier'])) {
$_SESSION['oauthVerifier'] = $_GET['oauth_verifier'];
$currentStatus = 'Content owner authorized the temporary credentials';
return TRUE;
}



アクセストークンをsessionにセット
$oauth->setToken($_SESSION['requestToken'], $_SESSION['requestTokenSecret']);
$accessTokenInfo = $oauth->getAccessToken(ACCESS_TOKEN_URL, null, $_SESSION['oauthVerifier']);
if ($accessTokenInfo) {
$_SESSION['accessToken'] = $accessTokenInfo['oauth_token'];
$_SESSION['accessTokenSecret'] = $accessTokenInfo['oauth_token_secret'];
$_SESSION['shardId'] = $accessTokenInfo['edam_shard'];
$currentStatus = 'Exchanged the authorized temporary credentials for token credentials';
return TRUE;
}

この$_SESSION[‘accessToken’]がeveronteAPIでデータを取得する度に必要です。
access_tokenは認証画面ででた期間中は変わることはないのでこれを使いまわします。

次はnoteStoreやuserStoreを使うサンプル予定。

0

evernoteAPIをphpで使う(序章)

phpでのevernoteAPIの使い方を数回に分けてツラツラと書いていきます。
まずそもそものevernoteAPIの話。


この画面はよくみるけど、


この画面を見たことがない人も多いと思う。
evernoteをけっこう使ってる自分でも2年間の間に1度しか見たことがないです。

evernoteAPIを利用したwebサービスは少ないです。一概には比べられてないけど、twitterなんかと比べれば圧倒的に少ない。

原因は思うに2つあって、1つ目が解説する書籍やブログ等情報が少ないという事。

もちろんゼロではないけど、androidやiOSでの利用が多い為が言語もそっちに偏りがちで、phpやperl等のweb系の言語に関してはさらに少ない印象。
公式ドキュメントの入り口までは日本語で書かれてるが、肝心の公式ドキュメントフォーラムはすべて英語となっているので敷居が高かったりする。
Thriftもそうだけど、実際はそんなに敬遠する所ではないけどやはり敷居は上がる。

もう一つはAPIのインターフェイスにThriftを採用してる事。
単純なHTTPの呼び出しでリソースにアクセスできるREST APIがwebでは主流の中、Thrift名前は聞いたことあるけど…って人は多い。

curlとかコマンドラインでtwitterAPIをサクッと試す事ができても、thriftだとそういうわけにはいかない。

evernoteがThriftを採用したかはdeveloper blogでも詳しく紹介されてるけど、

twitterAPIはREST APIということ非常にシンプルだけど、仕様の変更に弱かったりバイナリデータのやりとりには不向きであったりするけど、Thriftはその点をカバーできるようになってる。
Thriftを調べるのはこれはこれで面白そうだけど、単にevernoteAPIを使いたいだけであれば、SDKを通してThriftは透過的に扱えるのでそんなに意識する事もない。

何が言いたいかというと、別に難しくもなんともないのでPHPな人もやってみるといいよ!ということです。

開発を始めるにはまずディベロッパーサイトからAPIキーを申し込む必要があります。

申込み時に認証方法をクライアントアプリケーション用ウェブアプリケーション用から選択する必要があります。
phpでwebサービスとなればもちろんウェブアプリケーション用(oAuth)を選択します。

APIキーは即時発行されるのではなく1〜2日要して、登録したメールアドレスに飛んできます。

本番と同じ仕様のサンドボックスが用意されてるのでここで開発を進める、ある程度動くものができてきたら本番環境で動かしたいです、とevernoteに連絡して本番で動かせるパーミッションをもらうという流れです。

次に、サンプルコードも含まれてるAPI SDKをダウンロードする。

ウェブアプリケーションはtwitterやFacebookと同じくoAuthを採用している。

oAuthで承認されたaccess tokenを使ってノートブックを作ったり、ノートを編集したりする。
twitterは一度access tokenを取得すると永遠に使えるけど、evernoteの場合、有効期限は1日〜1年(サンドボックスは1日)なので切れると再度取得する必要があります。

次は実際のコード編。