phpでbotを作る(自動フォロー編)

はい、自動フォローまで来ましたー。久しぶりにちょっと頭使ったような気がする…
えーと、本題はいる前に。

最近、モノ作って、発表して…で、それに反応もらう事が多くなりました。
私に直接じゃなくて間接的な意見も多くて、さまざまなモノがあってありがたいです。
こっちには耳の痛い意見でも傾けなければいけないところもあり。(昨日のプログラムはちょっと公開見合わせます)
でも、何も反応がないより、本当、ずっとずっといいよなー、幸せだなーって思います。
モノを作るのがスキで何かしらやってきたけど、文章も絵も大して反応(良くも悪くも)はもらえてなくて、このネットとプログラムが一番受けがいいかな…って最近思います。この世にネットとプログラムがあって良かった。

さて、本題です。自動フォローのコード。

<?php

$username = "なまえ";
$password = "ひみつ";

//フォロワー一覧取得のための情報
$host = "http://twitter.com/statuses/followers.xml?screen_name=";
$XML = getlist($host,$username,$password);
$list = array();
//フォロワーのリストを配列に
foreach ($XML->user as $user){
    $screen_name =  $user->screen_name;
    $list[] = $screen_name;
    }

//フレンズ(フォロー済みの人)一覧取得のための情報
$host = "http://twitter.com/statuses/friends.xml?screen_name=";
$XML = getlist($host,$username,$password);
$friends = array();
//フレンズのリストを配列に
foreach ($XML->user as $user){
    $screen_name =  $user->screen_name;
    $friends[] = $screen_name;
    }

//フォロワーからフレンズの差分を求める(つまり、これからフォローするリスト)
$followlist = array_diff($list, $friends);

//print_r($followlist);

//フォローリストが空じゃなかったらforeachでフォローする
if ( !empty($followlist) ) {
foreach($followlist as $value){
        $screen_name = $value;
    following($screen_name,$username,$password);
    }
}


//一覧取得の関数(例によってcurl使用)
function getlist($host,$username,$password){
$host.=$username;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$result = curl_exec($ch);
curl_close($ch);
$XML = simplexml_load_string($result);
//戻り値
return $XML;
}

//フォローする関数
function following($screen_name,$username,$password){
$base_url = "http://twitter.com/friendships/create/";
$base_url.=$screen_name.".xml";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//フォローはPOSTじゃないと駄目なので
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$buffer = curl_exec($ch);
curl_close($ch);
}

?>

以上、これを前のリプライのスクリプトと同様に、短めの間隔でcronでまわせば自動フォローできるはず!

解説。

$host = "http://twitter.com/statuses/followers.xml?screen_name=";
$host = "http://twitter.com/statuses/friends.xml?screen_name=";

フォロワーやフレンズを取得するところ、処理が似ていたので関数作りました。
今回は、ふたつの配列を作ってそれを比較するというのをやりました。
array_diff
という関数、存在を初めて知りましたがphpは何でも揃っていますねえ。
あと、戻り値について。私今まで関数の戻り値についてよく理解していなかったのですが、今回はじめてわかったような気がします。

コードはご自由に使って下さい。
ただ、apiがフォローできる数は制限があるようなので、そこらへんはお気をつけを。
邪気眼に適用しようかと思ったがすでに1000近いのでなあ…
この次に生かします。