今まで「Twitterへ投稿するPHPスクリプト 」や「Twitterのタイムラインを取得するPHPスクリプト 」を書いていて、データを取得するURLだけ変えればいけんじゃね、って思ってたら意外とはまった。
Twitterのフォロワーを取得するPHPスクリプト
ここまでは、今までどおりの書き方を少し工夫するだけでいけます。
<?php require_once "HTTP/Client.php"; $username = "yourname"; $password = "yourpassword"; // 取得したいユーザーのscreen_nameを指定 $page = "statuses/followers/it_boy.xml"; $basic = array('Authorization'=>'Basic '.base64_encode($username.':'.$password)); $client = new HTTP_Client(null, $basic); $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml = new SimpleXMLElement($body); for ($i = 0; $i < count($xml->user); $i++) { echo $xml->user[$i]->screen_name . "\n"; }
上記だと最大100人のフォロワーを直近のツイート付きで取得することが出来ます。
で、問題は次の100件を取得したい場合。
Twitter API 仕様書 (勝手に日本語訳シリーズ) @ 観測気球
のAPIの日本語訳を見ると、followersのAPIのオプションとしてpageと言うものがあるので、これで次の100件が取得できるかと思いきや同じユーザー一覧が返ってきます。
で、本家の方のAPIのドキュメントを見ると
Twitter REST API Method: statuses followers @ Twitter API Wiki
pageオプションがない・・・。(仕様が変わった?)
変わりに、cursorオプションを使えと書いています。
と言うことで、プログラムを改変。ちなみにcursorオプションは「-1」からスタートする必要があるらしい。
<?php require_once "HTTP/Client.php"; $username = "yourname"; $password = "yourpassword"; // 取得したいユーザーのscreen_nameを指定 $page = "statuses/followers/it_boy.xml?cursor=-1"; $basic = array('Authorization'=>'Basic '.base64_encode($username.':'.$password)); $client = new HTTP_Client(null, $basic); $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml = new SimpleXMLElement($body); for ($i = 0; $i < count($xml->users->user); $i++) { echo $xml->users->user[$i]->screen_name . "\n"; }
※ 返り値のXMLのフォーマットも異なっているので注意
まず、一番最初はcursorのオプションを「-1」でアクセスし、100件分のフォロワーを取得します。
すると、返ってきたXMLの一番最後に
<next_cursor>1324680976289962274</next_cursor> <previous_cursor>0</previous_cursor>
という値がついてきます。
つまり、このカーソルの値を操作して次の100件を取得しに行くような仕様のようです。
(個人的にはpageオプションでよいのではないかと思いますが・・・)
なので、次の100件を取得したい場合のプログラムは
$page = "statuses/followers/it_boy.xml?cursor=1324680976289962274";
のように書く必要が出てきます。(上記だと私のフォロワーを取得しますので、取得したい人のscreen_nameを適宜指定します)
cursorはフォロワー数が変動すると変化していくようです。
前の100件を取得したい場合は、「previous_cursor」の値を指定すると取得できます。
ちなみに、自分のフレンド(自分がフォローしているユーザー一覧)を取得したい場合は、「statuses/followers.xml」じゃなくて「statuses/friends.xml」へアクセスすると取得できます。(XML形式で取得したい場合)
次の100人を取得したい場合も同様です。
[PR]アイルのホスティングサービス 月額1,995円~(税込)
[PR]【早い者勝ち!】 .com/.net/.jp ドメイン取るならお名前.com