ホーム > Programming > Evernote API に PHP から接続する全行程 (OAuth エクステンションを使わない)

Evernote API に PHP から接続する全行程 (OAuth エクステンションを使わない)

2012 年 4 月 18 日 コメントをどうぞ コメント

EvernoteのAPIを使うには、OAuthとThriftという2つの技術を用いる必要がある。
PHPからEvernote APIに接続する際、自分が困ったのは OAuth エクステンションもThriftもインストールされていないサーバーでどうするかということ。

諸々調べた結果、うまく繋がるようになったのでメモ。
拾って来たコードを多用しているのだけど、どこで拾って来たか覚えていない…

とりあえず続きにコードを貼り付けておく。説明はインラインのコメントをご覧下さい。
ファイルのダウンロードはココをクリック。

赤いところだけ書き換えてください。

 <?php

/*

PHP用のOAuth.php をダウンロードして、このスクリプトと同じディレクトリに置く。
http://code.google.com/p/oauth/

EvernoteのウェブサービスAPIページからAPI SDKをダウンロードしてくる。
PHPディレクトリの中の、libディレクトリにある thrift フォルダをこのスクリプトと同じディレクトリに置く。
http://www.evernote.com/about/intl/jp/developer/api/

EvernoteのサイトでAPI接続に必要なAPIキーを申請する。

*/

// OAuth.phpをロード
require_once("./OAuth.php");

// Thrift関連の、使うモノだけをロード(全部でも問題ないけれど)
require_once("./thrift/Thrift.php");
require_once("./thrift/transport/THttpClient.php");
require_once("./thrift/transport/TTransport.php");
require_once("./thrift/protocol/TProtocol.php");
require_once("./thrift/protocol/TBinaryProtocol.php");
require_once("./thrift/packages/NoteStore/NoteStore.php");

/* Evernoteへの接続情報を定義
CONSUMER_KEYとCONSUMER_SECRETはEvernoteから送られてきたものを指定する。
CONSUMER_CALLBACK_URLはOAuth認証後に戻ってくるページ(このスクリプトの後ろにstep=2というパラメータを付けたもの)

*/
$api_settings = array(    'CONSUMER_KEY'                => 'hogehoge',
                        'CONSUMER_SECRET'            => '12ab34cd56ef78gh',
                        'CONSUMER_CALLBACK_URL'        => 'http://YOUR_DOMEIN.com/evernote_api.php?step=2',
                        'REQUEST_TOKEN_URL'            => 'https://sandbox.evernote.com/oauth',
                        'USER_AUTHORIZATION_URL'    => 'https://sandbox.evernote.com/OAuth.action',
                        'NOTESTORE_URL_BASE'        => 'https://sandbox.evernote.com/edam/note/',
                        'ACCESS_TOKEN_URL'            => 'https://sandbox.evernote.com/oauth');

if($_GET["step"] == NULL){
    // stepパラメータが指定されていなかったら、EvernoteのOAuth処理をする

    // OAuthConsumer と Signature Method を定義
    $consumer = new OAuthConsumer($api_settings['CONSUMER_KEY'], $api_settings['CONSUMER_SECRET'], $api_settings['CONSUMER_CALLBACK_URL']);
    $signature_method = new OAuthSignatureMethod_HMAC_SHA1();

    // リクエストトークンを取得するためのパラメータを定義
    $params = array('oauth_callback' => $consumer->callback_url);
    $request = OAuthRequest::from_consumer_and_token($consumer, NULL, 'GET', $api_settings['REQUEST_TOKEN_URL'], $params);
    $request->sign_request($signature_method, $consumer, NULL);

    // curlでGETリクエスト
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $request->to_url());
    $result = curl_exec($ch);
    curl_close($ch);

    // 返ってきた値から oauth_token と oauth_token_secret を取得
    parse_str($result, $result_map);
    $req_token = new OAuthToken($result_map['oauth_token'], $result_map['oauth_token_secret']);

    // 後で必要になるので、SESSIONにリクエストトークン一式を保存
    ini_set('session.use_cookies', 1);
    ini_set('session.use_only_cookies', 1);
    session_start();
    $_SESSION["req_token"] = $req_token->key;
    $_SESSION["req_secret"] = $req_token->secret;

    // EvernoteのOAuth認証画面にリダイレクトして、ユーザーに承諾して貰う
    $auth_url = $api_settings['USER_AUTHORIZATION_URL'];
    $url = $auth_url.'?'.OAuthUtil::build_http_query(array('oauth_token' => $req_token->key));
    header('Location: '.$url);

}elseif($_GET["step"] == 2){
    // stepパラメータが2だったら、EvernoteのOAuth認証から戻って来たということで処理の続き

    // Evernoteから戻ってくるとGETパラメータとして oauth_token と oauth_verifier が付与されてくるので取得
    $oauth_token = $_GET["oauth_token"];
    $oauth_verifier = $_GET["oauth_verifier"];

    // SESSIONに保存してあったリクエストトークン一式を参照
    ini_set('session.use_cookies', 1);
    ini_set('session.use_only_cookies', 1);
    session_start();
    $req_token = $_SESSION["req_token"];
    $req_secret = $_SESSION["req_secret"];

    // OAuthConsumer と Signature Method を定義
    $consumer = new OAuthConsumer($api_settings['CONSUMER_KEY'], $api_settings['CONSUMER_SECRET'], NULL);
    $signature_method = new OAuthSignatureMethod_HMAC_SHA1();

    // アクセストークンを取得するためのパラメータを定義
    $params = array('oauth_token' => $oauth_token, 'oauth_verifier' => $oauth_verifier);
    $request = OAuthRequest::from_consumer_and_token($consumer, $req_token, 'GET', $api_settings['ACCESS_TOKEN_URL'], $params);

    // Evernoteから戻って来たときにGETパラメータに付与されていた oauth_token と 最初に取得した req_secret を配列 $tokener にしてリクエストを生成
    $tokener = new OAuthConsumer($oauth_token, $req_secret);
    $request->sign_request($signature_method, $consumer, $tokener);

    // curlでGETリクエスト
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $request->to_url());
    $result = curl_exec($ch);
    curl_close($ch);

    // アクセストークンの取得ができたので、レスポンスから必要な情報(oauth_token と edam_shard 必須)を取得
    parse_str($result, $result_map);
    $oauth_token = $result_map["oauth_token"];
    $edam_shard = $result_map["edam_shard"];
    $edam_expires = $result_map["edam_expires"];

    // セッションを破棄
    $_SESSION = array();
    session_destroy();

    // 気が早いけど、ThriftでEvernote APIにリクエスト(この例では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;

    $noteList = $noteStore->findNotes($oauth_token, $filter,0, 10);

    // 結果を出力
    var_dump($noteList);
}
?>
カテゴリー: Programming
  1. コメントはまだありません。
  1. トラックバックはまだありません。