twitterのfollowing、followersを得るスクリプト

twitterから簡単にfollowing、followersの一覧を得る方法として、Rがあるようです。
iGraphでTwitterのネットワークを表してみる
igraphでTwitterのネットワークを描いてみる2
しかし、100人までしか取得できないし、僕自身がRに慣れていないので、自分でスクリプトを書いてみました。

#!/usr/bin/php
<?php
require_once 'Services/Twitter.php';

$user='username'; // ユーザ名
$pass='password'; // パスワード
$max_loop=10; // プログラムにバグがあったときの保険
$delay=10; // 1リクエスト後のスリープ時間(秒)

class Services_Twitter2 extends Services_Twitter {
  public $followers_url=
           'http://twitter.com/statuses/followers/%s.json?cursor=%.0f';
  public $friends_url=
           'http://twitter.com/statuses/friends/%s.json?cursor=%.0f';

  function __construct($user,$pass) {
    parent::__construct($user,$pass);
  }

  function getAllFollowersFrom($user,$cursor=-1) {
    return $this->_getData('GET',
                           sprintf($this->followers_url,$user,$cursor),
                           'getAllFollowersFrom');
  }

  function getAllFriendsFrom($user,$cursor=-1) {
    return $this->_getData('GET',
                           sprintf($this->friends_url,$user,$cursor),
                           'getAllFriendsFrom');
  }
}

function usage() {
  fprintf(STDERR,"Usage: getwitter [-fo | -fr]\n");
  exit(1);
}

if ($argc===2) {
  if ($argv[1]==='-fo') {
    $inquire='getAllFollowersFrom';
  }
  else if ($argv[1]==='-fr') {
    $inquire='getAllFriendsFrom';
  }
  else {
    usage();
  }
}
else {
  usage();
}

$st=&new Services_Twitter2($user,$pass);

// クライアント情報。適当でいい
$st->setAppName('getwitter');
$st->setAppVersion('0.0.1');

while (($target=fgets(STDIN))!==FALSE) {
  $results=array();
  $target=rtrim($target);
  $people_json=$st->$inquire($target);
  $people=json_decode($people_json);
  for ($i=0;$i<$max_loop && !empty($people);$i++) {
    if (count($people->{'users'})===0) {
      sleep($delay);
      break;
    }
    foreach ($people->{'users'} as $person) {
      /*
       * 100人を超えて取得する場合、何故かたまに重複する
       */
      if (!isset($results[$person->{'screen_name'}])) {
        fprintf(STDERR,$target."\t".$person->{'screen_name'}."\n");
        $results[$person->{'screen_name'}]=1;
      }
    }
    if ($people->{'next_cursor'}===0) { // もう次はない
      sleep($delay);
      break;
    }
    sleep($delay);
    $people_json=$st->$inquire($target,$people->{'next_cursor'});
    $people=json_decode($people_json);
  }
}
?>

Services_Twitterを使っているので、事前にインストールしておいてください。


このスクリプトは標準入力から一覧を得たいユーザ名を入力し、「標準エラー出力」に結果を出力します。標準出力にはよくわからないメッセージがServices_Twitterから出るので出力を分けました。
followingの一覧を出力したい場合は「-fr」オプションを付け、followersの一覧を出力したい場合は「-fo」オプションを付けます。
結果の形式は次の通りです。

ユーザ名1\t人1
ユーザ名1\t人2
ユーザ名1\t人3
.
.
.

人1、2、3というのはfollowing、またはfollowers一覧に名前がある人のことです。
なお、動かす前に$user、$pass、$max_loop、$delayを設定しておいてください。


使用例を挙げておきます。
入力用のファイル
標準入力からユーザ名を入力できるので、ファイルに書いておくと便利です。

ユーザ名1
ユーザ名2
ユーザ名3
.
.
.

followingの一覧を取得
bashの場合

getwitter.php -fr < 入力ファイル 1> /dev/null 2> 出力ファイル

followersの一覧を取得
bashの場合

getwitter.php -fo < 入力ファイル 1> /dev/null 2> 出力ファイル

スクリプト自体は単純だと思うので、是非用途に応じて改造してください!