Twitter APIの使い方も第5回目を迎えました。一番使い方が分かってない私ですが、頑張って学習結果を記録に残していこうと思います。今回はTwitter APIの利用がグーンと楽になる「OAuth1.0認証用ライブラリの作り方」を紹介します。

今回作成する関数の名前は「twoh10_scr」にしていますが、もしも、既にこれと同じ名前の関数を利用している場合は、競合しないように名前を変更してご利用下さい。

目次

  1. ライブラリとは…
  2. ライブラリの概要(2件)
    1. 関数にまとめる処理の一覧
    2. ライブラリのイメージ
  3. ライブラリを作成する(8件)
    1. 関数の設定部分
    2. キーの作成
    3. データの作成
    4. 署名の作成
    5. GET方式、POST方式で条件を分ける
    6. リクエストを実行する
    7. レスポンスヘッダーを取得する
    8. 値を返却する
  4. 完成版ライブラリのダウンロード
  5. ライブラリの使い方(2件)
    1. デモ(ユーザープロフィールの取得)
    2. デモ(つぶやきの投稿)
  6. 今回のまとめ(3件)
    1. リクエストが簡単になった!
    2. ライブラリを改良しよう!
    3. 次回予告

1ライブラリとは…

「ライブラリの作成」とは何のことでしょうか。簡単に言えば、「重複する処理を一カ所にまとめること」です。Twitter APIを利用するプログラムを書いていて、プロフィールを取得したり、つぶやきを取得したりする時に、その都度、署名作成やOAuth1.0認証のコードを書いてたらキリがないですよね?

だから、それらの処理を行なうコードを1カ所にまとめてしまい、プロフィールを取得する時、つぶやきを取得する時など、複数の場所から呼び出せる関数にしてしまおうという計画です。

2ライブラリの概要

2-1関数にまとめる処理の一覧

それでは、どんな処理をまとめてしまおうか、整理しておきましょう。まとめてしまいたいのは、次の面倒くさい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次回予告

お疲れ様でした。次回は、「ホームタイムライン」を取得してみましょう。自分を含めた、フォローしている人たちのつぶやきリストです。今回のライブラリを利用するので、使い方を理解しておいて下さい。不明点や不具合、至らない点などがありましたら、お気軽にコメント欄で教えて下さい。