PHPでTwitterのBotを作ってみた(3)

こんにちは。
モモンガです。

前回は内容をランダムにしてみたり、リプライを飛ばしたりというところでした。
今回はフォロー、アンフォローを実装したいと思います。

追記:現在のTwitter APIの最新バージョンはv1.1です。
記事記載当時と多少異なっている部分がありますのでご注意ください。
気が向いたら最新版のやつ書きます!


僕の作ったbotはこちら→
@RTkawase_bot
為替情報をつぶやきます。リプライもします。
@yu_okini_Bot
@yu29ozakiのお気に入りに追加したツイートをつぶやきます。

フォロー、アンフォロー実装の前に、まずフォロワーリストとフォローリストの抽出から入ります。
リストはjson形式やxml形式で取得できますが、今回はさっくりとjsonで取得したいと思います。

それぞれ、以下のURLにリクエストを飛ばすと取得できます。

自分がフォローしているアカウントのID一覧
http://api.twitter.com/1/friends/ids.json?screen_name=ユーザー名

自分をフォローしているアカウントIDの一覧
http://api.twitter.com/1/followers/ids.json?screen_name=ユーザー名

それではサンプルをどうぞ。

//※今回もget_json()を使っていますので、この記事の最下部にあるget_json()を参考にしてください。
$my_screen_name = "RTkawase_bot";

//@RTkawase_botがフォローしているアカウントのID一覧
echo "@RTkawase_botがフォローしているアカウントのID一覧<br />";
$url = 'http://api.twitter.com/1/friends/ids.json?screen_name=' .$my_screen_name;
$follows = get_json($url);
foreach($follows as $xk => $x){
	echo $xk .'=>' .$x . '<br />';
	if(is_array($x)){
		foreach($x as $xsk => $xs){
			echo '   ' .$xsk .'=>' .$xs . '<br />';
		}
	}
}
echo '<br /><br />';

//@RTkawase_botをフォローしているアカウントIDの一覧
echo "@RTkawase_botをフォローしているアカウントIDの一覧<br />";
$url = 'http://api.twitter.com/1/followers/ids.json?screen_name=' .$my_screen_name;
$followers = get_json($url);
foreach($followers as $yk => $y){
	echo $yk .'=>' .$y . '<br />';
	if(is_array($y)){
		foreach($y as $ysk => $ys){
			echo '   ' .$ysk .'=>' .$ys . '<br />';
		}
	}
}

これで、それぞれのユーザーIDが取得できます。
ちなみにデータは$follows[‘ids’]と$followers[‘ids’]に入っていることがわかります。

ここからフォローしてくれている人でフォローしていない人を抽出してフォローします。
フォローするには
http://api.twitter.com/1/friendships/create/
にPOSTします。

以下、サンプルです。

//※今回もget_json()を使っていますので、この記事の最下部にあるget_json()を参考にしてください。
//twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
//※cronで実行する場合はサーバー内のフルパスが良い…と思う
require_once("./twitteroauth.php");

// Consumer keyの値
$consumer_key = "*****************";
// Consumer secretの値
$consumer_secret = "*****************";
// Access Tokenの値
$access_token = "*****************";
// Access Token Secretの値
$access_token_secret = "*****************";

// OAuthオブジェクト生成
$to = new TwitterOAuth(
		$consumer_key, 
		$consumer_secret, 
		$access_token, 
		$access_token_secret);

$my_screen_name = "RTkawase_bot";

//@RTkawase_botがフォローしているアカウントのID一覧
$url = 'http://api.twitter.com/1/friends/ids.json?screen_name=' .$my_screen_name;
$follows = get_json($url);

//@RTkawase_botをフォローしているアカウントIDの一覧
$url = 'http://api.twitter.com/1/followers/ids.json?screen_name=' .$my_screen_name;
$followers = get_json($url);

//フォロワーにいるけどフォローしてないidを探す
for($i = 0; $i < count($followers['ids']); $i ++) {
	//フォロワーとフォローのリスト比較
	if (array_search($followers['ids'][$i], $follows['ids']) === FALSE) {
		// ここでフォローするリクエスト
		$req = $to->OAuthRequest("http://api.twitter.com/1/friendships/create/" .$followers['ids'][$i] .".xml","POST","");
		echo 'sended request:' .$followers['ids'][$i] ."フォローリクエスト送信<br />\n";
	}
}

同様にアンフォロー(リムーブ)も行ないます。
フォローされてないのにこちらがフォローしている場合はサクッとアンフォローしちゃいます。
アンフォローは
http://api.twitter.com/1/friendships/destroy/
にPOSTすればOK

//※今回もget_json()を使っていますので、この記事の最下部にあるget_json()を参考にしてください。
//twitteroauth.phpを読み込む。パスはあなたが置いた適切な場所に変更してください
//※cronで実行する場合はサーバー内のフルパスが良い…と思う
require_once("./twitteroauth.php");

// Consumer keyの値
$consumer_key = "*****************";
// Consumer secretの値
$consumer_secret = "*****************";
// Access Tokenの値
$access_token = "*****************";
// Access Token Secretの値
$access_token_secret = "*****************";

// OAuthオブジェクト生成
$to = new TwitterOAuth(
		$consumer_key, 
		$consumer_secret, 
		$access_token, 
		$access_token_secret);

$my_screen_name = "RTkawase_bot";

//@RTkawase_botがフォローしているアカウントのID一覧
$url = 'http://api.twitter.com/1/friends/ids.json?screen_name=' .$my_screen_name;
$follows = get_json($url);

//@RTkawase_botをフォローしているアカウントIDの一覧
$url = 'http://api.twitter.com/1/followers/ids.json?screen_name=' .$my_screen_name;
$followers = get_json($url);

//フォロワーにいないのにフォローしているidを探す
echo "フォロワーにいないのにフォローしているidを探す<br />\n";
for($i = 0; $i < count($follows['ids']); $i ++) {
	if (array_search($follows['ids'][$i], $followers['ids']) === FALSE) {
		//※ID:12345678はアンフォローしない
		if($follows['ids'][$i] != '12345678'){
			// ここでアンフォローするリクエスト
			$req = $to->OAuthRequest("http://api.twitter.com/1/friendships/destroy/" .$follows['ids'][$i] .".xml","POST","");
			echo 'sended request:' .$follows['ids'][$i] ."をアンフォロー<br />\n";
		}
	}
}

function get_json()はこんな感じ

//jsonの取得(返り値は連想配列形式)
function get_json($url){
	$json_data = wbsRequest2('GET',$url);
	if ($json_data){
		//連想配列でデータを返す
		$data = json_decode($json_data, true);
		return $data;
	}else{
		return false;
	}
}

function wbsRequest2($method, $url, $params = array()){
	$data = http_build_query($params);
	if($method == 'GET') {
		$url = ($data != '')?$url.'?'.$data:$url;
	}
	$ch = curl_init($url);
	
	if($method == 'POST'){
		curl_setopt($ch,CURLOPT_POST,1);
		curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
	}
	
	//curl_setopt($ch, CURLOPT_HEADER,true); //header情報も一緒に欲しい場合
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_TIMEOUT, 2);
	$res = curl_exec($ch);
	
	//ステータスをチェック
	$respons = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	if(preg_match("/^(404|403|500)$/",$respons)){
		return false;
	}
	
	mb_language("Japanese");
	//エンコードをUTF-8へ
	$res = mb_convert_encoding($res, "utf-8", "auto");
	
	return $res;
}

こんなんでフォローとアンフォローは出来ちゃいます。
定期的に実行するとフレンドリストが綺麗に…ってBotにフレンドって概念あるのか…!?
わかんないけど、フォローしてあげるとフォロワーさん喜びます。たぶん。

次回は、お気に入りの取得やろうかな。
こんな感じのもできるんだよ→@yu_okini_Bot
@yu29ozakiのお気に入りに追加したツイートをつぶやくBot。

    • Rocco
    • 2015 02/24 8:11pm

    Wonderful posting! Good to find someone who really knows what it is all about and can produce common sense material for us the readers. without a doubt looking forward to your next blog post.

  1. トラックバック 0

return top