Twitterのフレンドやフォロワーを取得するPHPスクリプト | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

今まで「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人を取得したい場合も同様です。