ユーザープロフィールを取得する[users/show] (Twitter API)
Twitter APIの使い方、第3回目です。今回から、Twitter APIを利用して様々な情報を取得したり、書き込んでいきましょう。まずは「ユーザーのプロフィール情報を取得する方法」を紹介します。
「ユーザープロフィール」とは、その名の通り、フォロー数、フォロワー数、アイコン画像URLなどなど、Twitterのユーザーに関する様々な情報です。Twitterと関連したwebサービス開発においては、最も大切な項目になるはずです。
目次
1リクエスト方法
「ユーザープロフィールの取得」に関する公式の解説(英語)は下記ページにあるので、参考にして下さい。
GET users/show Twitter Developer Center
1-1リクエストURL(メソッド)
リクエストをする方法は下記の通りです。GETメソッドで行ないます。
[GET] https://api.twitter.com/1.1/users/show.json
1-2パラメータ
データの取得に指定できるパラメータ(OAuth1.0認証を除く)は下記の通りです。
| 項目 | 解説 | 初期値 |
|---|---|---|
| user_id ※ | プロフィールを表示するユーザーを「ID(識別番号)」で指定する。 | - |
| screen_name ※ | プロフィールを表示するユーザーを「スクリーンネーム(@arayutw)」で指定する。[@]は入っても、入らなくても大丈夫。 | - |
| include_entities | 「最終のつぶやき」に、[entities](つぶやき内のリンク情報など)を含めるか。 | true |
※は「指定必須」、※は「どちらか指定必須」のパラメータです。
1-3URLのサンプル
GETメソッドなので、リクエストURLは、例えば下記のように組み立てます。@arayutwさんのプロフィールを取得する例です。
https://api.twitter.com/1.1/users/show.json?screen_name=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サービスなどで利用することが可能というわけです。なお、青文字はここで付け足したコメントです。
{
"id": 1528352858,ユーザーID(数値型)
"id_str": "1528352858",ユーザーID(文字型)
"name": "あらゆ",ユーザーネーム
"screen_name": "arayutw",スクリーンネーム
"location": "Japan",居住地
"description": "webサービスの作成が趣味です。\nGoogle+で、足立区コミュニティを開設しました→https://t.co/mnr1wYeFkU",プロフィール説明文
"url": "http://t.co/ScEV7Be96V",webサイト
"entities": {エンティティデータ
"url": {プロフィールの「webサイト」に含まれるURL情報
"urls": [
{
"url": "http://t.co/ScEV7Be96V",短縮URL
"expanded_url": "http://syncer.jp",実態URL
"display_url": "syncer.jp",ラベル
"indices": [オフセット情報
0,URLが含まれる最初の場所
22URLが含まれる最後の場所
]
}
]
},
"description": {プロフィールの「説明文」に含まれるURL情報
"urls": [
{
"url": "https://t.co/mnr1wYeFkU",短縮URL
"expanded_url": "https://plus.google.com/communities/111258687743643122329",実態URL
"display_url": "plus.google.com/communities/11…",ラベル
"indices": [オフセット情報
43,URLが含まれる最初の場所(何文字目か)
66URLが含まれる最後の場所(何文字目か)
]
}
]
}
},
"protected": false,つぶやきが非公開か?
"followers_count": 499,フォロワー数
"friends_count": 321,フォロー数
"listed_count": 17,リストに入ってる数
"created_at": "Tue Jun 18 17:28:51 +0000 2013",アカウント作成日
"favourites_count": 1096,お気に入りの数
"utc_offset": 32400,UTCとの時差(秒)
"time_zone": "Irkutsk",タイムゾーン
"geo_enabled": true,ツイートに位置情報を追加する設定か?
"verified": false,本人認証済みか?
"statuses_count": 4004,つぶやき数
"lang": "ja",言語
"status": {最後のつぶやき
...
},
"contributors_enabled": false,ライター(複数人による投稿)機能を利用しているか?
"is_translator": false,翻訳ボランティアの参加しているか?
"is_translation_enabled": false,
"profile_background_color": "B2DFDA",プロフィールの背景色
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme13/bg.gif",プロフィールの背景画像URL
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme13/bg.gif",プロフィールの背景画像URL(https版)
"profile_background_tile": false,背景をタイル(繰り返し)しているか?
"profile_image_url": "http://pbs.twimg.com/profile_images/439701751487152128/d-zz5HX6_normal.jpeg",プロフィール画像URL
"profile_image_url_https": "https://pbs.twimg.com/profile_images/439701751487152128/d-zz5HX6_normal.jpeg",プロフィール画像URL(https版)
"profile_banner_url": "https://pbs.twimg.com/profile_banners/1528352858/1371754808",プロフィールバナー画像URL
"profile_link_color": "93A644",プロフィールのリンク色
"profile_sidebar_border_color": "EEEEEE",サイドバーのボーダー色
"profile_sidebar_fill_color": "FFFFFF",「重ねて表示」の色
"profile_text_color": "333333",プロフィールの文字色
"profile_use_background_image": true,プロフィールの背景画像を利用しているか?
"default_profile": false,プロフィールはデフォルトか?
"default_profile_image": false,プロフィール画像はデフォルトか?
"following": false,アクセストークンの主が、このユーザーをフォローしているか?
"follow_request_sent": false,アクセストークンの主が、このユーザーにフォローリクエストを送っているか?
"notifications": false,アクセストークンの主が、このユーザーのツイートを通知設定しているか?
"suspended": false,アカウントが凍結中か?
"needs_phone_verification": false二段階認証を利用中か?(現在Twitter全体で機能停止中)
}3-1[entities]とは?
entities(エンティティ)というデータがあります。これはどんなデータかというと、プロフィールの説明文や、つぶやきなどに含まれている「リンク内容」を格納しているデータです。リンクとは、外部サイトのURLアドレスはもちろん、メンション(@arayutw)に付いた他ユーザーページへのリンク、ハッシュタグ(#arayutw)やシンボル($arayutw)に付いた検索結果へのリンク、添付画像に付いた画像URLへのリンクなど広く含みます。
リンクを付けたい時に使う
例えば、JSONデータの7行目、description(説明文)の中には、URLアドレスが含まれていますが、これにはリンクタグが付いていません。なので、このデータをそのまま扱うと、リンクが付いてない説明文をそのまま出力することになります。これにリンクを付けるために、entitiesの中の情報が必要になってくるわけです。entitiesは「プレーンテキスト」を「リッチテキスト」に変えるためのデータなのです。
不要なら取得しないこともできる
このentitiesが必要なければ、データ取得のリクエスト時に指定できるパラメータ、include_entitiesをfalseにすることで、省くことができます。「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に格納していると仮定します。
{
"id": 1528352858,
"name": "あらゆ",
"info": {
"gender": "男",
"mail": "example@mail.com",
"website": "http://syncer.jp"
},
"favorite": [
"お菓子",
"漫画",
"インターネット",
"テレビ"
]
}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複雑な場合
次のように、配列と深い階層がごちゃまぜになっている場合があります。
{
"id": 1528352858,
"name": "しおの風",
"ramen": [
{
"topping": "メンマ、海苔",
"seasoning": "胡椒、ニンニク"
},
"豚骨",
"菅野製麺所"
]
}そんな場合も、今までのことを応用すれば、取り出すことができます。例えば、「メンマ、海苔」という値を取り出すには次のようにします。
//オブジェクトの場合 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方式のリクエスト」を行ないたいので、「つぶやきの書き込み方」を紹介したいと思います。それでは、それでは。
Twitter API
この記事へのコメント
感想、ご指摘などお気軽にお寄せ下さい。「関連記事を書いた」という方はご報告いただければリンクします。
記事の更新履歴
- 記事を公開しました。
2014/08/10 18:30
※Twitter、Facebook、はてな、いずれかのアカウントをお持ちの方は、本人認証(ログイン)を行なうことができます。
※本人認証をすることで、書き込みの待ち時間なし、画像アップロード、アイコンなどが利用できます。
※認証時にサービスと連携しますが、名前とアイコン以外の情報を読み込んだり、また書き込みを行なうことはありません。連携で要求する権限は「公開情報の読み取り」のみです。
コメントは、0件です。