OAUth認証用のライブラリを作ろう(Twitter API)
Twitter APIの使い方も第5回目を迎えました。一番使い方が分かってない私ですが、頑張って学習結果を記録に残していこうと思います。今回はTwitter APIの利用がグーンと楽になる「OAuth1.0認証用ライブラリの作り方」を紹介します。
今回作成する関数の名前は「twoh10_scr」にしていますが、もしも、既にこれと同じ名前の関数を利用している場合は、競合しないように名前を変更してご利用下さい。
目次
1ライブラリとは…
「ライブラリの作成」とは何のことでしょうか。簡単に言えば、「重複する処理を一カ所にまとめること」です。Twitter APIを利用するプログラムを書いていて、プロフィールを取得したり、つぶやきを取得したりする時に、その都度、署名作成やOAuth1.0認証のコードを書いてたらキリがないですよね?
だから、それらの処理を行なうコードを1カ所にまとめてしまい、プロフィールを取得する時、つぶやきを取得する時など、複数の場所から呼び出せる関数にしてしまおうという計画です。
2ライブラリの概要
2-1関数にまとめる処理の一覧
それでは、どんな処理をまとめてしまおうか、整理しておきましょう。まとめてしまいたいのは、次の面倒くさい2点ですよね。「見るのも嫌だ」という人も多いと思います。
- 署名の作成
- OAuth1.0認証方式のリクエスト
2-2ライブラリのイメージ
どんなライブラリが理想でしょうか?例えばtwoh10_scr()
という関数を作って、次のようにできたら、お手軽ですよね。[1][2][3]を変えるだけで、例外を除いたほとんどのAPIリクエストができるようになっちゃいます。コードをなんとなく流し見してみて下さい。「レスポンスヘッダー」に関しては、今は無視しておいて大丈夫です。
<?php // twoh10_scr()の使い方 // // $data = twoh10_scr($url,$method,$params) // [第1引数:$url] リクエストURL(文字列で指定) // [第2引数:$method] リクエストメソッド(文字列で指定) // [第3引数:$params] データ取得用パラメータ(連想配列で指定) // // [$dataに格納される返り値(配列形式)] // [0] JSONデータ // [1] レスポンスヘッダー //[1]リクエストURL $url = 'https://api.twitter.com/1.1/statuses/update.json'; //[2]リクエストメソッド $method = 'POST'; //[3]データ取得用パラメータを連想配列で指定 $params = array( 'status' => 'つぶやく内容', 'lat' => '35.133', 'long' => '139.133', ); //[4]リクエストを実行 $data = twoh10_scr($url,$method,$params); //$data[0]にJSONデータが格納される //$data[1]にレスポンスヘッダーが格納される
3ライブラリを作成する
それでは、順を追って関数ライブラリを作成していきましょう。「署名の作成」と「OAuth1.0認証」について分からない場合は、この連載の過去記事をご覧下さい。
初心者にも分かる!なOAuth1.0における署名の作成方法 Syncer
署名の作成方法を解説しています。
ユーザープロフィールを取得する Syncer
OAuth1.0認証のリクエストの流れ、GETメソッドのリクエスト方法を紹介しています。
つぶやきを投稿する Syncer
POSTメソッドのリクエスト方法を紹介しています。
3-1関数の設定部分
それでは作り始めていきましょう。まずは関数の定義と引数の受け取りを指定します(2行目)。第1引数から第3引数までは「リクエストURL」「リクエストメソッド」「パラメータ」の順ですね。そして、4〜10行目では「API Key」などを設定しておきます。
<?php function twoh10_scr( $request_url , $request_method , $params_a ){ //[API Key]と[API Secret] ([API Secret]はついでにURLエンコード) $api_key = 'jqirc25fnwoybX7e1s6X9Pw4j'; $api_secret = rawurlencode('wGhZrxrkaMyTvvjHkUf1tjQJVBBzC0CRUfwOuE0Zqzcbf7FcE3'); //[アクセストークン]と[アクセストークンシークレット] ([アクセストークンシークレット]はついでにURLエンコード) $access_token = '1528352858-8QUZgOv01iG4bXZKEcFxrfoXDl5639UJYWY5T8n'; $access_token_secret = 'g3YXllfia8AT3orOHMcTp0Zw3f1lNIFME6JCWoCHiMy7M'; //続き //〜 }
3-2キーの作成
12行目から続きを書いていきましょう。続いては署名のキーを作成しましょう。
//キーの作成 $signature_key = "{$api_secret}&{$access_token_secret}";
3-3データの作成
次に署名の「データ」を作成します。やっていることは、これまでと全く同じです。ただ1点だけ、$request_url
、$request_method
、$params_a
は、[2行目]で引数として受け取っていることを確認して下さいね。
//OAuth1.0認証用のパラメータ(連想配列形式) $params_b = array( 'oauth_consumer_key' => $api_key, 'oauth_token' => $access_token, 'oauth_nonce' => microtime(), 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_version' => '1.0' ); //データ取得用パラメータ[$params_a]と認証用パラメータ[$params_b]を //1つに合体した、署名作成用の配列[$params_c]を用意する $params_c = array_merge($params_a,$params_b); //署名作成用の配列[$params_c]をアルファベット順に並び替え ksort($params_c); //配列[$params_c]を[キー=値&キー=値...]の文字列に変換 $signature_params = http_build_query($params_c,'','&',PHP_QUERY_RFC3986); //変換した文字列をURLエンコードする $signature_params = rawurlencode($signature_params); //リクエストメソッドをURLエンコードする $encoded_request_method = rawurlencode($request_method); //リクエストURLをURLエンコードする $encoded_request_url = rawurlencode($request_url); //リクエストメソッド、リクエストURL、パラメータを[&]で繋ぐ $signature_data = "{$encoded_request_method}&{$encoded_request_url}&{$signature_params}";
3-4署名の作成
そして署名の作成ですね。ここまでは問題ないはずです。
//キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する $hash = hash_hmac('sha1',$signature_data,$signature_key,TRUE); //base64エンコードして、署名[$signature]が完成する $signature = base64_encode($hash);
3-5GET方式、POST方式で条件を分ける
続いて、仕上げのリクエスト部分を記述していきましょう。ここで注意したいのは、引数として受け取ったリクエストメソッド($request_method
)が「GET」か「POST」かで、条件分けをする必要がある点です。大雑把には、次のような違いがありましたね。
メソッド | 説明 |
---|---|
GET | データ取得用のパラメータを、リクエストURLの末尾に付ける。 |
POST | データ取得用のパラメータを、リクエストボディに含める。 |
以上を踏まえて、コードを追加していきましょう。リクエストを実行する前に、次のように条件分けして準備をしておきます。
//リクエストメソッドが[GET]の場合、 //・リクエストURL[$request_url]の末尾にデータ取得用パラメータ[$tail]を付ける //・リクエストボディ[$request_body]は空 if($request_method == 'GET'){ $tail = '?'.http_build_query($params_a,'','&',PHP_QUERY_RFC3986); $request_url .= $tail; $request_body = ''; //リクエストメソッドが[POST]の場合 //・リクエストURL[$request_url]の末尾には何も付けない //・リクエストボディ[$request_body]にデータ取得用パラメータを含める }elseif($request_method == 'POST'){ $request_body = http_build_query($params_a); }
3-6リクエストを実行する
仕上げにリクエストを実行しましょう。
//署名用の連想配列[$params_c]に、作成した署名を加える $params_c['oauth_signature'] = $signature; //配列[$params_c]を[キー=値,キー=値,...]の文字列に変換する //http_build_query()で、「値」は自動的にURLエンコードされる $header_params = http_build_query($params_c,'',',',PHP_QUERY_RFC3986); //リクエストを実行する $response = @file_get_contents( $request_url, //[第1引数:リクエストURL] false, //[第2引数:リクエストURLは相対パスか?(違うのでfalse)] stream_context_create( //[第3引数:stream_context_create()でメソッドとヘッダー、ボディを指定] array( 'http' => array( 'method' => $request_method, //リクエストメソッド 'header' => array( //カスタムヘッダー 'Authorization: OAuth '.$header_params, ), 'content' => $request_body, //リクエストボディ ) ) ) );
3-7レスポンスヘッダーを取得する
ここは、まだ意味をあまり考えず、作業として記述して下さい。リクエストを送って、Twitterからデータが返ってきた際の、レスポンスヘッダーという情報を$response_header
に格納しておきます。
//レスポンスヘッダーを[$response_header]に格納する //リクエスト後、[$http_response_header]には自動的にレスポンスヘッダーが格納されている $response_header = $http_response_header;
3-8値を返却する
いよいよ仕上げです。取得したJSONデータ($response
)とレスポンスヘッダー($response_header
)を、配列にひとまとめにして、関数の返り値に設定しましょう。関数を呼び出した側は、「第1要素がJSONデータ」「第2要素がレスポンスヘッダー」の配列を受け取ることができます。
//JSONデータとレスポンスヘッダーを配列にする $return_array = array( $response , $response_header ); //配列[$return_array]を返却する return $return_array;
以上で、非常に簡易ではありますが、オリジナルの関数ライブラリの完成ですね。お疲れ様でした。
4完成版ライブラリのダウンロード
作成したライブラリを、下記のリンクからダウンロードすることができます。確認用などにご利用下さい。14〜20行目(API Keyなど)を設定しておいて下さいね。
5ライブラリの使い方
完成したライブラリを、例えばtwoh10_scr.php
という名前で保存し、外部ファイルとして読み込みます。そして、引数を指定して呼び出しましょう。
<?php //ライブラリを読み込む require_once './twoh10_scr.php'; //[1]リクエストURL $url = 'https://api.twitter.com/1.1/users/show.json'; //[2]リクエストメソッド $method = 'GET'; //[3]データ取得用パラメータを連想配列で指定 $params = array( 'screen_name' => 'arayutw', ); //[4]リクエストを実行 $data = twoh10_scr($url,$method,$params);
5-1デモ(ユーザープロフィールの取得)
それでは、実際にライブラリを使ってみましょう。これまでに行なってきたAPIをサンプルに使ってみます。まずは「ユーザープロフィールの取得」ですね。これはGETメソッドのリクエストです。
サンプルリクエスト
<?php //ライブラリを読み込む require_once './twoh10_scr.php'; //引数の指定 $url = 'https://api.twitter.com/1.1/users/show.json'; $method = 'GET'; $params = array( 'screen_name' => 'arayutw', ); //リクエスト実行 $data = twoh10_scr($url,$method,$params); //取得したJSONデータの出力 echo $data[0];
サンプルのデモ
下記からデモを見ることができます。取得したユーザープロフィールのJSONデータを、ブラウザに出力します。
5-2デモ(つぶやきの投稿)
続いては「つぶやきの投稿」、POSTメソッドのリクエストです。
サンプルリクエスト
<?php //ライブラリを読み込む require_once './twoh10_scr.php'; //引数の指定 $url = 'https://api.twitter.com/1.1/statuses/update.json'; $method = 'POST'; $params = array( 'status' => 'つぶやきまーす。', ); //リクエスト実行 $data = twoh10_scr($url,$method,$params); //取得したJSONデータの出力 echo $data[0];
サンプルのデモ
こちらがデモです。下記ページにアクセスすると、つぶやきを投稿すると同時に、JSONデータを取得してブラウザに出力します。つぶやきを確認するにはSyncerの公式アカウント(@syncerjp)にアクセスしてみて下さいね。
なお、このデモのつぶやきは1分間につき、1回だけすることができます。もし、アクセスしてもつぶやきが投稿できない場合は、他の誰かが直近1分以内に操作している可能性があるので時間をおいて下さい。
6今回のまとめ
いかがでしたか?リクエストには成功しましたか?ここまで読んでいただき、心から感謝します。
6-1リクエストが簡単になった!
このライブラリを利用すれば、次回以降は面倒くさいOAuth1.0の認証を1から書く必要がないので、手間が1/10くらいになっちゃいますね。記事を書いてる方としても嬉しいです(笑)。自分が作成するwebサービスに合わせて、こういったオリジナルのライブラリを自作してみると、開発が捗ると思います。
6-2ライブラリを改良しよう!
今回作成したライブラリは非常に簡易なものです。例えば、アクセストークンは設定部分にセットした、1人のものしか利用できません。そして、認証用パラメータ($params_b
)を見比べれば分かりますが、アクセストークンを取得する際のOAuth1.0認証には対応していません。
あくまでも「ライブラリを作成する流れ」を紹介するのがこの記事のメインだったので、処理を分かりやすくする理由からこういう形になっています。この記事を通して内容を理解し、読者一人一人が改良していってほしいと思います。上手く丸投げできていますか?
余談ですが、アクセストークンを不特定多数のユーザーに対応させたい場合は、アクセストークンとアクセストークンシークレットを、関数の引数にしちゃえば、実現できますね。1つの案として、カスタマイズの参考にして下さい。
6-3次回予告
お疲れ様でした。次回は、「ホームタイムライン」を取得してみましょう。自分を含めた、フォローしている人たちのつぶやきリストです。今回のライブラリを利用するので、使い方を理解しておいて下さい。不明点や不具合、至らない点などがありましたら、お気軽にコメント欄で教えて下さい。
Twitter API
この記事へのコメント
感想、ご指摘などお気軽にお寄せ下さい。「関連記事を書いた」という方はご報告いただければリンクします。
記事の更新履歴
- 記事を公開しました。
2014/08/12 23:30
※Twitter、Facebook、はてな、いずれかのアカウントをお持ちの方は、本人認証(ログイン)を行なうことができます。
※本人認証をすることで、書き込みの待ち時間なし、画像アップロード、アイコンなどが利用できます。
※認証時にサービスと連携しますが、名前とアイコン以外の情報を読み込んだり、また書き込みを行なうことはありません。連携で要求する権限は「公開情報の読み取り」のみです。
コメントは、0件です。