Twitter APIの使い方、第3回目です。今回から、Twitter APIを利用して様々な情報を取得したり、書き込んでいきましょう。まずは「ユーザーのプロフィール情報を取得する方法」を紹介します。

「ユーザープロフィール」とは、その名の通り、フォロー数、フォロワー数、アイコン画像URLなどなど、Twitterのユーザーに関する様々な情報です。Twitterと関連したwebサービス開発においては、最も大切な項目になるはずです。

目次

  1. リクエスト方法(3件)
    1. リクエストURL(メソッド)
    2. パラメータ
    3. URLのサンプル
  2. ユーザープロフィールを取得する手順(4件)
    1. OAuth1.0認証と署名が必要!
    2. 必要なもの
    3. 署名を作成する
    4. リクエストを送る
  3. 取得できるJSONデータ(1件)
    1. [entities]とは?
  4. JSONデータを取り扱おう!(8件)
    1. JSONを変換する
    2. 練習用のJSONデータ
    3. 基本的な取り出し方
    4. 階層が深い場合
    5. 配列形式の場合
    6. 複雑な場合
    7. 数をこなそう!
    8. 当ブログはJSON表示に力を入れてます。
  5. ユーザープロフィールを出力する(2件)
    1. サンプルプログラム
    2. デモを確認する
  6. 完成版プログラムのダウンロード
  7. 今回のまとめ

1リクエスト方法

「ユーザープロフィールの取得」に関する公式の解説(英語)は下記ページにあるので、参考にして下さい。

GET users/show Twitter Developer Center

1-1リクエストURL(メソッド)

リクエストをする方法は下記の通りです。GETメソッドで行ないます。

1-2パラメータ

データの取得に指定できるパラメータ(OAuth1.0認証を除く)は下記の通りです。

項目 解説 初期値
user_id プロフィールを表示するユーザーを「ID(識別番号)」で指定する。 -
screen_name プロフィールを表示するユーザーを「スクリーンネーム(@arayutw)」で指定する。[@]は入っても、入らなくても大丈夫。 -
include_entities 「最終のつぶやき」に、[entities](つぶやき内のリンク情報など)を含めるか。 true

は「指定必須」、は「どちらか指定必須」のパラメータです。

1-3URLのサンプル

GETメソッドなので、リクエストURLは、例えば下記のように組み立てます。@arayutwさんのプロフィールを取得する例です。

2ユーザープロフィールを取得する手順

それでは、早速、ユーザープロフィールを取得してみましょう。プログラムに利用する言語はPHPです。

2-1OAuth1.0認証と署名が必要!

Twitter APIの利用にはこいつが付いてまわります…。そう、「OAuth1.0認証」!何回も繰り返しますが、リクエストを送る度に、署名の作成が必要になります。うーん、面倒くさい。ですが、このシリーズ、まだ序盤ですので、1から行なっていきましょう。

「署名の作り方」が分からない場合は、下記の記事に一度、目を通して下さい。面倒な場合は、この記事を読みながら一緒に見比べていって下さいね。

初心者にも分かるOAuth1.0の署名の作り方 Syncer

2-2必要なもの

OAuth1.0認証のための条件です。なお、背景が黄色の項目は、既に取得しているべきものです。まだ取得していない場合は、「アプリケーション登録」「アクセストークン取得」を行なって下さい。

認証で送るパラメータ

パラメータ 解説
oauth_consumer_key アプリケーション登録時に作成した「API Key」。
oauth_token アクセストークン取得時に取得した「アクセストークン」。
oauth_signature_method 署名の作成方式。HMAC-SHA1を指定する。
oauth_signature 作成した署名の値。
oauth_timestamp 現在のUNIX TIMESTAMP。PHPならtime()の値をそのまま指定すればいい。
oauth_nonce ランダムな文字列。PHPならmicrotime()の値をそのまま指定すればいい。
oauth_version OAuth認証のバージョン。1.0を指定する。

署名を作るのに必要なデータ

パラメータ 解説
consumer_secret アプリケーション登録時に作成した「API Secret」。
oauth_token_secret アクセストークン取得時に取得した「アクセストークンシークレット」。

2-3署名を作成する

「またか…、トホホ…」と思った人、少しの間だけ頑張りましょう。ちゃちゃっと署名を作っていっちゃいましょう。ここからプログラムを書いていきます。ファイル名は何でも大丈夫です。

設定項目

<?php
//[API Key]と[API Secret] ([API Secret]はついでにURLエンコード)
$api_key = 'jqirc25fnwoybX7e1s6X9Pw4j';
$api_secret = rawurlencode('wGhZrxrkaMyTvvjHkUf1tjQJVBBzC0CRUfwOuE0Zqzcbf7FcE3');
 
//[アクセストークン]と[アクセストークンシークレット] ([アクセストークンシークレット]はついでにURLエンコード)
$access_token = '1528352858-8QUZgOv01iG4bXZKEcFxrfoXDl5639UJYWY5T8n';
$access_token_secret = 'g3YXllfia8AT3orOHMcTp0Zw3f1lNIFME6JCWoCHiMy7M';

//リクエストURLとリクエストメソッド
$request_method = 'GET';
$request_url = 'https://api.twitter.com/1.1/users/show.json';

キーを作成

//キーを作成する
$signature_key = "{$api_secret}&{$access_token_secret}";

データを作成

アクセストークンを取得した時とは違って、認証用のパラメータとは別に、データ取得用のパラメータが存在します。どちらも署名を作成するために必要な材料ですが、ここでは2つの配列に分けておきます。これは便宜上の理由です。後々の処理で役立ってくるので、意識しながら読み進めて下さいね。

//データ取得用のパラメータ(連想配列形式)
$params_a = array(
	'screen_name' => 'arayutw',
);

//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'
);

署名作成用の「データ」を作成するには、データ取得用と認証用、2つのパラメータを混ぜる必要があります。

//データ取得用パラメータ[$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}";

署名を作成

//キー[$signature_key]とデータ[$signature_data]を利用して、HMAC-SHA1方式のハッシュ値に変換する
$hash = hash_hmac('sha1',$signature_data,$signature_key,TRUE);
 
//base64エンコードして、署名[$signature]が完成する
$signature = base64_encode($hash);

これでOAuth1.0認証用の署名が完成しましたね。

2-4リクエストを送る

それでは準備ができたので、Twitterにリクエストを送ってみましょう。GET方式のリクエストの場合、リクエストURLの末尾に、クエリーを付ける必要があります。クエリーの内容は「データ取得用のパラメータ」のみで、「認証用のパラメータ」を付ける必要はありません。2つのパラメータを別々に扱ったのはここで処理を書きやすいようにするためです。

//31行目で作成した署名用の連想配列[$params_c]に、作成した署名を加える
$params_c['oauth_signature'] = $signature;

//配列[$params_c]を[キー=値,キー=値,...]の文字列に変換する
//http_build_query()で、「値」は自動的にURLエンコードされる
$header_params = http_build_query($params_c,'',',',PHP_QUERY_RFC3986);

//データ取得用の配列[$params_a]を、リクエストURLの末尾に付けるクエリーパラメータに変換する
//[例] ?screen_name=arayutw
$tail = '?'.http_build_query($params_a,'','&',PHP_QUERY_RFC3986);

//TwitterにGETリクエストを送る [$response]にTwitterから返ってきたデータが格納される
$response = @file_get_contents(
	$request_url.$tail,					//[第1引数:リクエストURL($request_url)とクエリー($tail)を合体]
	false,											//[第2引数:リクエストURLは相対パスか?(違うのでfalse)]
	stream_context_create(			//[第3引数:stream_context_create()でメソッドとヘッダーを指定]
		array(
			'http' => array(
				'method' => $request_method, //リクエストメソッド
				'header' => array(					 //カスタムヘッダー
					'Authorization: OAuth '.$header_params,
				),
			)
		)
	)
);
 
//Twitterから返ってきた値を検証のために出力
echo $response;

お疲れ様でした!ここまでできたら、早速ファイルを起動してみて下さい。画面にJSONデータ(文字列)が出力されれば成功です。

3取得できるJSONデータ

リクエストに成功すれば、下記のJSONデータが$responseに格納され、57行目のechoでブラウザに出力されます。JSONデータを改行して見やすくすると、次のようになります。ユーザーに関するこれらの情報を、webサービスなどで利用することが可能というわけです。なお、青文字はここで付け足したコメントです。

3-1[entities]とは?

entities(エンティティ)というデータがあります。これはどんなデータかというと、プロフィールの説明文や、つぶやきなどに含まれている「リンク内容」を格納しているデータです。リンクとは、外部サイトのURLアドレスはもちろん、メンション(@arayutw)に付いた他ユーザーページへのリンク、ハッシュタグ(#arayutw)やシンボル($arayutw)に付いた検索結果へのリンク、添付画像に付いた画像URLへのリンクなど広く含みます。

リンクを付けたい時に使う

例えば、JSONデータの7行目、description(説明文)の中には、URLアドレスが含まれていますが、これにはリンクタグが付いていません。なので、このデータをそのまま扱うと、リンクが付いてない説明文をそのまま出力することになります。これにリンクを付けるために、entitiesの中の情報が必要になってくるわけです。entitiesは「プレーンテキスト」を「リッチテキスト」に変えるためのデータなのです。

不要なら取得しないこともできる

このentitiesが必要なければ、データ取得のリクエスト時に指定できるパラメータ、include_entitiesfalseにすることで、省くことができます。「JSONの内容が多過ぎて見難いから取得する内容を減らしたい!」という時に指定して下さい。

4JSONデータを取り扱おう!

「じぇいそんがよく分からない」と、Twitter上で某友人(双子のパパ)にリクエストを受けましたので、専用の項目を設けてみました。「JSON」というのはデータの保存形式の名称です。どんな保存形式かは、前章で見た通りです。

4-1JSONを変換する

現在、JSONデータは$responseに入っています。PHPでJSONデータの内容を取り扱うには、まずは、json_decode()を使って「オブジェクト」か「連想配列」に変換する必要があります。自分で扱いやすい方を選択して下さいね。コードの、2行目か5行目のコメントを外して下さい。

//オブジェクトに変換する
//$data = json_decode($response,false);

//連想配列に変換する
//$data = json_decode($response,true);

json_decode PHP公式マニュアル
[json_decode()]は、JSON形式のデータを、「オブジェクト」か「連想配列」に変換する関数です。

4-2練習用のJSONデータ

変換したら、何か、値を取り出してみましょう。前章のJSONデータは内容が多過ぎるので、下記に練習用のJSONを用意しました。下記を「オブジェクト」か「連想配列」に変換し、$dataに格納していると仮定します。

4-3基本的な取り出し方

まずは、基本的な取り出し方を説明します。例えば、ユーザー名の「あらゆ」というデータを取り出して出力したい場合は、次のように行ないます。

//オブジェクトの場合
echo $data->name;

//連想配列の場合
echo $data['name'];

これが、IDの「1528352858」というデータだったら次のようになります。

//オブジェクトの場合
echo $data->id;

//連想配列の場合
echo $data['id'];

4-4階層が深い場合

続いて、2ステップ目にいきましょう。性別の「男」という値を取り出してみましょう。IDや名前よりも、1つ深い階層にありますよね?JSONデータにおいて、階層が1つ深くなる場合は、{〜}の「波括弧」で囲まれる形になります。その場合の取り出し方は、次の通りです。

//オブジェクトの場合
echo $data->info->gender;

//連想配列の場合
echo $data['info']['gender'];

URLの「http://syncer.jp」という値だったら次の通り、取り出します。

//オブジェクトの場合
echo $data->info->website;

//連想配列の場合
echo $data['info']['website'];

webサービスによっては、次のように深い階層のデータも存在したりします。

//オブジェクトの場合
echo $data->house->japan->tokyo->adachiku->takenotsuka;

//連想配列の場合
echo $data['house']['japan']['tokyo']['adachiku']['takenotsuka'];

4-5配列形式の場合

基本的な取り出し方は理解できたと思います。どれだけ深くなろうとも応用できますよね?最後に、配列形式のデータを取り出してみましょう。配列形式のデータは[〜]の「角括弧」で囲まれています。

例えば、サンプルのJSONデータにあるfavoriteは、次のような配列だと思って下さい。

//[favorite]
array('お菓子','漫画','インターネット','テレビ');

例えば、「インターネット」という値を取り出したければ、次のように行ないます。

//オブジェクトの場合
echo $data->favorite[2];

//連想配列の場合
echo $data['favorite'][2];

「お菓子」なら次の通りですね。

//オブジェクトの場合
echo $data->favorite[0];

//連想配列の場合
echo $data['favorite'][0];

配列なので、もちろん、「ループ処理」を行なうことも可能です。全ての値を出力するには、次のように処理を行ないます。

//オブジェクトの場合
foreach($data->favorite as $item){
	echo $item;
}

//連想配列の場合
foreach($data['favorite'] as $item){
	echo $item;
}

4-6複雑な場合

次のように、配列と深い階層がごちゃまぜになっている場合があります。

そんな場合も、今までのことを応用すれば、取り出すことができます。例えば、「メンマ、海苔」という値を取り出すには次のようにします。

//オブジェクトの場合
echo $data->ramen[0]->topping;

//連想配列の場合
echo $data['favorite'][0]['topping'];

4-7数をこなそう!

JSONの取り扱い方のイメージが掴めましたか?「結局そうか…」と思われると悲しいのですが、「数をこなすこと」が重要です。取得したユーザープロフィールのJSONデータがあるので、目的の値を決めて、実際に取り出してみて下さい。

4-8当ブログはJSON表示に力を入れてます。

余談ですが、当ブログではJSONコードを載せている場所の、右上にあるボタンをクリックすると表示モードを変更することができます(JavascriptをONにしている場合)。2014年8月現在は「通常」「波括弧(青)と角括弧(赤)を強調」「階層の強調」の3モード。JSONの確認しやすさに定評があるブログになりたいです(なんだそれ)。

5ユーザープロフィールを出力する

基本的なJSONデータの扱い方が分かったところで、早速、JSONのデータを出力してみましょう!サンプルを用意しましたが、自分なりに、値を決めてコードを書いてみて下さい!

5-1サンプルプログラム

ユーザープロフィールを出力するサンプルです。57行目のJSONデータを出力している行はコメントアウト(先頭に「//」を付ける)しておいて下さいね。

//取得したJSONデータ([オブジェクト]か[連想配列]に変換して$dataに格納)を出力する

//文字化けしないよう、HTMLヘッダーを出力しておく
echo "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"/></head><body>";

//オブジェクトの場合
if(isset($data->id)){

	//$data->id	名前
	//$data->screen_name	スクリーンネーム
	//$data->location	居住地
	//$data->friends_count	フォロー数
	//$data->followers_count	フォロワー数
	//$data->profile_image_url	プロフィール画像URL
	//$data->statuses_count	つぶやき数

	//出力する
	echo "<h1>{$data->name}(@{$data->screen_name})さんの情報</h1>";
	echo "<p>";
	echo "フォロー数:{$data->friends_count}<br/>";
	echo "フォロワー数:{$data->followers_count}<br/>";
	echo "つぶやき数:{$data->statuses_count}<br/>";
	echo "居住地:{$data->location}<br/>";
	echo "プロフィール画像:{$data->profile_image_url}<br/>";
	echo '<img src="'.$data->profile_image_url.'">';
	echo "</p>";

//連想配列の場合
}elseif(isset($data['id'])){

	//$data['id']	名前
	//$data['screen_name']	スクリーンネーム
	//$data['location']	居住地
	//$data['friends_count']	フォロー数
	//$data['followers_count']	フォロワー数
	//$data['profile_image_url']	プロフィール画像URL
	//$data['statuses_count']	つぶやき数

	//出力する
	echo "<h1>{$data['name']}(@{$data['screen_name']})さんの情報</h1>";
	echo "<p>";
	echo "フォロー数:{$data['friends_count']}<br/>";
	echo "フォロワー数:{$data['followers_count']}<br/>";
	echo "つぶやき数:{$data['statuses_count']}<br/>";
	echo "居住地:{$data['location']}<br/>";
	echo "プロフィール画像:{$data['profile_image_url']}<br/>";
	echo '<img src="'.$data['profile_image_url'].'">';
	echo "</p>";

}

5-2デモを確認する

今回の内容を確認したい人向けに、デモを用意しました。どんな風に表示されるか確認してみて下さいね。

デモを見る

6完成版プログラムのダウンロード

この記事で作成したPHPプログラムを下記リンクからダウンロードすることができます。確認用などにご利用下さい。デフォルトでは、JSONデータをオブジェクトに変換して、出力するようにしてあります。

完成版プログラムをダウンロードする

7今回のまとめ

お疲れ様でした!スムーズに出力することはできたでしょうか…?今回は「GET方式のリクエスト」「JSONデータを変換する方法」「変換後のデータから値を取り出す方法」を紹介しました。大体のイメージが掴めたら、今度はサンプルで紹介していないデータを、自分なりに取り出してみて下さいね。

次回は、「POST方式のリクエスト」を行ないたいので、「つぶやきの書き込み方」を紹介したいと思います。それでは、それでは。