PHPでTwitterのユーザー情報を取得する

標準

今回は、PHPでTwitterのユーザー情報を取得してみたいと思います。このユーザーの情報は内部ID(Twitterのシステム内部で定められている、一意のIDの事。このIDは変更することが出来ない。)や、スクリーンネーム、名前を始めとして、アカウント作成した日時などありとあらゆる情報を取得できます。こちらは非常に簡単に作成出来るので、早速作っていきます。

使用するライブラリ

今回も例のごとく abraham/twitteroauth を使っていきます。使い方の詳細は前章を御覧ください。

コード

今回はプロフィール情報としても特に重要だと考える一部の情報を呼び出し、列挙する方法について書いていきます。最終的にコードは以下のようになりました。

<?php
$connection=new TwitterOAuth($api_key, $api_secret, $access_token, $access_token_secret);
$user_data=$connection->get("users/show",["screen_name"=>$user_screen_name]);

echo "name: " . $user_data->name;
echo "screen name: @" . $user_data->screen_name;
echo "location: " . $user_data->location;
echo "description: " . $user_data->description;
echo "url: " . $user_data->entities->url->urls[0]->expanded_url;
if($user_data->protected) {echo "protected";} else {echo "unprotected";}
echo "followers: " . number_format($user_data->followers_count);
echo "follows: " . number_format($user_data->friends_count);
echo "listed: " . number_format($user_data->listed_count);
echo "created at: " . $user_data->created_at;
echo number_format($user_data->favourites_count) . " favs";
echo number_format($user_data->statuses_count) . " tweets";
echo "banner-image: " . $user_data->profile_banner_url;
echo "profile-image" . $user_data->profile_image_url;
if($user_data->following) {echo "have followed";} else {echo "haven't followed";}
if($user_data->follow_request_sent) {echo "haven't sent";} else {echo "have sent";}
?>

今回のコードでは2行目にTwitterに接続して、3行目にユーザー情報を取得しています。この時、ユーザーの情報がstdClassで返ってくるので、それを分解して表示させます。

今回このユーザー情報を取得するためにはusers/showからgetしていますが、この時引数として指定できるのは

  • user_id (必須): Twitterから与えられている一意のID
  • screen_name(必須): 見慣れた@に続くID
  • include_entities(任意): エンティティ(返ってくるデータにエンティティノードが存在する。詳しくは後述。)を含めるか

を指定できます。また、この場合user_idとscreen_nameの両方が必須となっていますが、実際にはどちらか一方を指定するのみで大丈夫です。

返ってくるデータ

実際にgetしてみた時のデータをvar_dump()で見てみるとこんな感じです。

object(stdClass)#3 (46) {
	["id"]=> int(2414640626)
	["id_str"]=> string(10) "2414640626"
	["name"]=> string(5) "yoooo"
	["screen_name"]=> string(9) "yoshi_pc_"
	["location"]=> string(12) "鹿屋基地"
	["profile_location"]=> NULL
	["description"]=> string(53) "長門主義(ハルヒ)/SCP財団職員/提督業"
	["url"]=> string(23) "https://t.co/MP3ew8X4mK"
	["entities"]=> object(stdClass)#8 (2) {
		["url"]=> object(stdClass)#9 (1) {
			["urls"]=> array(1) {
				[0]=> object(stdClass)#10 (4) {
					["url"]=> string(23) "https://t.co/MP3ew8X4mK"
					["expanded_url"]=> string(18) "http://yoshipc.net"
					["display_url"]=> string(11) "yoshipc.net"
					["indices"]=> array(2) {
						[0]=> int(0)
						[1]=> int(23)
					}
				}
			}
		}
		["description"]=> object(stdClass)#11 (1) {
			["urls"]=> array(0) { }
		}
	}
	["protected"]=> bool(false)
	["followers_count"]=> int(663)
	["friends_count"]=> int(812)
	["listed_count"]=> int(14)
	["created_at"]=> string(30) "Thu Mar 27 16:51:41 +0000 2014"
	["favourites_count"]=> int(42076)
	["utc_offset"]=> int(32400)
	["time_zone"]=> string(5) "Tokyo"
	["geo_enabled"]=> bool(true)
	["verified"]=> bool(false)
	["statuses_count"]=> int(99429)
	["lang"]=> string(2) "ja"
	["status"]=> object(stdClass)#12 (22) {
		["created_at"]=> string(30) "Tue Oct 18 10:54:24 +0000 2016"
		["id"]=> int(788332394625441792)
		["id_str"]=> string(18) "788332394625441792"
		["text"]=> string(21) "千葉県魔うまい"
		["truncated"]=> bool(false)
		["entities"]=> object(stdClass)#13 (4) {
			["hashtags"]=> array(0) { }
			["symbols"]=> array(0) { }
			["user_mentions"]=> array(0) { }
			["urls"]=> array(0) { }
		}
		["source"]=> string(63) "TheWorld Rev"
		["in_reply_to_status_id"]=> NULL
		["in_reply_to_status_id_str"]=> NULL
		["in_reply_to_user_id"]=> NULL
		["in_reply_to_user_id_str"]=> NULL
		["in_reply_to_screen_name"]=> NULL
		["geo"]=> NULL
		["coordinates"]=> NULL
		["place"]=> NULL
		["contributors"]=> NULL
		["is_quote_status"]=> bool(false)
		["retweet_count"]=> int(0)
		["favorite_count"]=> int(1)
		["favorited"]=> bool(false)
		["retweeted"]=> bool(false)
		["lang"]=> string(2) "ja"
	}
	["contributors_enabled"]=> bool(false)
	["is_translator"]=> bool(false)
	["is_translation_enabled"]=> bool(false)
	["profile_background_color"]=> string(6) "C0DEED"
	["profile_background_image_url"]=> string(78) "http://pbs.twimg.com/profile_background_images/602136959914418176/TWaUNkvB.jpg"
	["profile_background_image_url_https"]=> string(79) "https://pbs.twimg.com/profile_background_images/602136959914418176/TWaUNkvB.jpg"
	["profile_background_tile"]=> bool(true)
	["profile_image_url"]=> string(74) "http://pbs.twimg.com/profile_images/762332527734378496/AzzARkY3_normal.jpg"
	["profile_image_url_https"]=> string(75) "https://pbs.twimg.com/profile_images/762332527734378496/AzzARkY3_normal.jpg"
	["profile_banner_url"]=> string(59) "https://pbs.twimg.com/profile_banners/2414640626/1468929549"
	["profile_link_color"]=> string(6) "3B94D9"
	["profile_sidebar_border_color"]=> string(6) "000000"
	["profile_sidebar_fill_color"]=> string(6) "DDEEF6"
	["profile_text_color"]=> string(6) "333333"
	["profile_use_background_image"]=> bool(true)
	["has_extended_profile"]=> bool(true)
	["default_profile"]=> bool(false)
	["default_profile_image"]=> bool(false)
	["following"]=> bool(false)
	["follow_request_sent"]=> bool(false)
	["notifications"]=> bool(false)
	["translator_type"]=> string(7) "regular"
	["suspended"]=> bool(false)
	["needs_phone_verification"]=> bool(false)
}

これを使うだけでも十分なユーザープロフィール画面が作れそうですね。前述したエンティティを含めるか、と言うのは上記のデータの中で「entities」以下のハイライトされている部分を含めるかどうかということです。主にURLについてのデータなので、不要だと感じたのであれば拒否ることで(若干ですが)早い挙動を得ることが出来るでしょう。
実際に作ってみたサンプルがこちらです。

最後になりますが、実践としてクライアントを同時並行で制作しているので、お試しいただければ幸いです。
http://yoshipc.net/twitter/

では、次回をお楽しみに。

PHPでTwitterのタイムラインを取得する

標準

今回、色々な事情を鑑みてこのレンタルサーバーを利用してWebアプリという形態でTwitterクライアントを作成することにしました。Webクライアントの強みはどのプラットフォームでも動作可能など、強みがたくさんあるので、作る価値があるかもしれません。しかも、私の場合は例の「事情」もあるので尚更です。というわけでPHPを利用したTwitterのクライントを作っていくシリーズがこれより始まります。

利用するライブラリ

今回は abraham/twitteroauth というものを使っていきます。このライブラリはTwitterの一通りのAPIが実装されているので、私が目標とするクライアント作成にはもってこいです。

ダウンロードした後、autoload.phpを読み込ませることで利用できるようになります。(本来はcomposer.jsonを使って読み込ませるのが正規ルートです。)

$connection = new TwitterOAuth($api_key, $api_secret, $access_token, $access_token_secret);
$statuses = $connection->get("statuses/home_timeline", ["count" => 50]); //タイムラインを50ツイート取得
if(isset($statuses->errors)) {
  //エラー発生
  echo "some error occurred.";
  echo "error message: " . $statuses->errors[0]->message;
} else {
  //ツイートの取得に成功
  for ($i=0; $i < 49; $i++) {
    echo "profile image url: " . $statuses[$i]->user->profile_image_url;
    echo "user name: " . $statuses[$i]->user->name;
    echo "user's id: " . $statuses[$i]->user->screen_name;
    echo "tweet text: " . $statuses[$i]->text;
    echo "created at: " . $statuses[$i]->created_at;
    echo "via: " . $statuses[$i]->source;
    echo $statuses[$i]->retweet_count . " rt";
    echo $statuses[$i]->favorite_count . " fav";
    if($statuses[$i]->user->protected) {echo "非公開";}
    echo "-------------------------------"
    }
  }

1行目で取得済みの各キーでTwitterに接続するための前準備を行い、2行目でタイムラインを50ツイート分取得しています。この時、APIのレートリミットを超過したアクションを行うとerrors[]->messageにその内容が帰ってきます。(エラーコードなども取得できるので詳しくはvar_dumpなどを行ってください。)

8行目以降はツイート取得に成功した場合です。最小限で利用するような情報を引き抜いてみました。それぞれのツイートには、ツイートに関する情報が$statuses以下、投稿者に関する情報が$statuses->userにそれぞれ格納されています。

以下は、試しにたまたま流れてきたユーザーの$statuses(Array 配列だけではなく、stdClass オブジェクトでも構成されていることに注意。Arrayは$statuses[“hoge”]と指定するのに対して、オブジェクトは$statuses->hogeと指定。)をvar_dump()で出力してみた結果が以下です。

array(25) { 
	[0]=> object(stdClass)#3 (23) { 
		["created_at"]=> string(30) "Fri Oct 14 12:44:02 +0000 2016"
		["id"]=> int(786910433936420869)
		["id_str"]=> string(18) "786910433936420869"
		["text"]=> string(30) "コジィさん出るのかな"
		["truncated"]=> bool(false)
		["entities"]=> object(stdClass)#8 (4) {
			["hashtags"]=> array(0) { }
			["symbols"]=> array(0) { }
			["user_mentions"]=> array(0) { }
			["urls"]=> array(0) { }
		}
		["source"]=> string(81) "Twitter for iPad"
		["in_reply_to_status_id"]=> NULL
		["in_reply_to_status_id_str"]=> NULL
		["in_reply_to_user_id"]=> NULL
		["in_reply_to_user_id_str"]=> NULL
		["in_reply_to_screen_name"]=> NULL
		["user"]=> object(stdClass)#9 (41) {
			["id"]=> int(219588098)
			["id_str"]=> string(9) "219588098"
			["name"]=> string(9) "ふゆべ
			["screen_name"]=> string(11) "who_you_bee"
			["location"]=> string(0) ""
			["description"]=> string(64) "Tumblr:https://t.co/X4hF7e4Jvi Pixiv:https://t.co/8vCm4L63xm"
			["url"]=> string(23) "https://t.co/8vCm4L63xm"
			["entities"]=> object(stdClass)#10 (2) {
				["url"]=> object(stdClass)#11 (1) {
					["urls"]=> array(1) {
						[0]=> object(stdClass)#12 (4) {
							["url"]=> string(23) "https://t.co/8vCm4L63xm"
							["expanded_url"]=> string(27) "http://pixiv.me/savoiaxxs21"
							["display_url"]=> string(20) "pixiv.me/savoiaxxs21"
							["indices"]=> array(2) {
								[0]=> int(0)
								[1]=> int(23)
							}
						}
					}
				}
				["description"]=> object(stdClass)#13 (1) {
					["urls"]=> array(2) {
						[0]=> object(stdClass)#14 (4) {
							["url"]=> string(23) "https://t.co/X4hF7e4Jvi"
							["expanded_url"]=> string(26) "http://huyube21.tumblr.com"
							["display_url"]=> string(19) "huyube21.tumblr.com"
							["indices"]=> array(2) {
								[0]=> int(7)
								[1]=> int(30)
							}
						}
						[1]=> object(stdClass)#15 (4) {
							["url"]=> string(23) "https://t.co/8vCm4L63xm"
							["expanded_url"]=> string(27) "http://pixiv.me/savoiaxxs21"
							["display_url"]=> string(20) "pixiv.me/savoiaxxs21"
							["indices"]=> array(2) {
								[0]=> int(37)
								[1]=> int(60)
							}
						}
					}
				}
			}
			["protected"]=> bool(false)
			["followers_count"]=> int(8710)
			["friends_count"]=> int(668)
			["listed_count"]=> int(350)
			["created_at"]=> string(30) "Thu Nov 25 08:30:34 +0000 2010"
			["favourites_count"]=> int(15994)
			["utc_offset"]=> int(32400)
			["time_zone"]=> string(5) "Tokyo"
			["geo_enabled"]=> bool(false)
			["verified"]=> bool(false)
			["statuses_count"]=> int(96048)
			["lang"]=> string(2) "ja"
			["contributors_enabled"]=> bool(false)
			["is_translator"]=> bool(false)
			["is_translation_enabled"]=> bool(false)
			["profile_background_color"]=> string(6) "C0DEED"
			["profile_background_image_url"]=> string(79) "http://pbs.twimg.com/profile_background_images/488513744176037888/Jq1mlOeM.jpeg"
			["profile_background_image_url_https"]=> string(80) "https://pbs.twimg.com/profile_background_images/488513744176037888/Jq1mlOeM.jpeg"
			["profile_background_tile"]=> bool(true)
			["profile_image_url"]=> string(74) "http://pbs.twimg.com/profile_images/759076048420032512/nXPEc9QI_normal.jpg"
			["profile_image_url_https"]=> string(75) "https://pbs.twimg.com/profile_images/759076048420032512/nXPEc9QI_normal.jpg"
			["profile_banner_url"]=> string(58) "https://pbs.twimg.com/profile_banners/219588098/1471816404"
			["profile_link_color"]=> string(6) "ABB8C2"
			["profile_sidebar_border_color"]=> string(6) "FFFFFF"
			["profile_sidebar_fill_color"]=> string(6) "DDEEF6"
			["profile_text_color"]=> string(6) "333333"
			["profile_use_background_image"]=> bool(true)
			["has_extended_profile"]=> bool(false)
			["default_profile"]=> bool(false)
			["default_profile_image"]=> bool(false)
			["following"]=> bool(true)
			["follow_request_sent"]=> bool(false)
			["notifications"]=> bool(false)
		}
	["geo"]=> NULL
	["coordinates"]=> NULL
	["place"]=> NULL
	["contributors"]=> NULL
	["is_quote_status"]=> bool(false)
	["retweet_count"]=> int(0)
	["favorite_count"]=> int(0)
	["favorited"]=> bool(false)
	["retweeted"]=> bool(false)
	["lang"]=> string(2) "ja"
}

想像以上に情報が取得できていて、驚きです。これらの情報を使うことで、クライアントとしての道以外にも使い道が出来ると思うので、ぜひご活用ください。

また、実際にクライアントを作成している様子をこちらのサーバーで公開中なので、ぜひお試しいただければと。
http://yoshipc.net/twitter