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

こんにちは。
カニです。

前回はOAuthと投稿部分のコードまでだったので、もう少しBotっぽく投稿内容などを考えてみます。

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


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

まずは投稿内容を配列に突っ込んでランダムで投稿するパターン。
以下は@yu29ozakiがきみにささやくっていう検索と投稿のAPIテスト用に作ったスクリプトから

// 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);

$sasayaki[0] = "君の瞳に乾杯だ!";
$sasayaki[1] = "世界のすべてが欲しいぃ?それはできねぇな…けど、半分ならやってもいいぜ。";
$sasayaki[2] = "やりたいことをやりたいだけやれば良いんだよ。それが、お前の人生だろ?";
$sasayaki[3] = "あーお腹すいた。お腹すいた。";
$sasayaki[4] = "ささやくのも疲れるんだぜ。だって24時間態勢でBotだからな。";
$sasayaki[5] = "あーっと、きみ…だれだっけ??";
$sasayaki[6] = "遊んでばっかいないで、本気出そうぜ。ほら、未来は君が作るんだよ!";
$sasayaki[7] = "ちょこれーと…くれてもいいんだよ?";
$sasayaki[8] = "もし、明日で世界が終わるんだとしてもいつもと同じ1日を送りたい。だって毎日が幸せだからな。";
$sasayaki[9] = "結婚したら君のみそ汁が毎日飲みたいって言う人いるけど、みそ汁よりガラナ飲みたい。";

//乱数発生
$intmn = mt_rand(0,9);

// TwitterへPOSTする。パラメーターは配列に格納する
$req = $to->OAuthRequest(
	"http://api.twitter.com/1/statuses/update.xml", 
	"POST", 
	array("status"=>$sasayaki[$intmn]
		."@yu29ozaki が君にささやく http://t.co/4XBtkmdQ"));

これを一定時間毎に実行していれば、この配列の中身がランダムで投稿される。

リプライに反応するのは少し厄介。
下手すると延々と同じ人にリプライを飛ばし続ける可能性があるからね。
(※かくいう自分もハマった人である。)
サンプルでは、一度リプライを送ったつぶやきについてはIDをデータベースに登録し、データベースに登録がない場合のみリプライするようにしている。
もっと賢い方法があれば教えてください。
データベースを使わないで日時で比較する方法

// 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);

//Botのアカウント名
$bot_name = "RTkawase_bot";

//返信メッセージ
$rep_mes = "返信だよ〜";

//つぶやき取得数(一度にリプライを送る最大数)
$rpp = 5;

//@bot_nameのつぶやきを取得
//get_json()については次のところでコードを書いておきます。
$json_url = "http://search.twitter.com/search.json?callback=&q=@" .$bot_name ."&rpp=" .$rpp;
$tw_data = get_json($json_url);
if(!$tw_data){
	//データ取得失敗の場合
	exit;
}

$search_result = $tw_data['results'];
foreach($search_result as $val){
	//ユーザーのID
	$user_name = $val["from_user"];
	//ユーザー表示名
	$user_screen_name = $val["from_user_name"];
	//つぶやきのID
	$tweet_id = $val["id_str"];
	//つぶやきのテキスト
	//改行の取得・置換(※これは表示用なので行なう必要はない)
	$tweet_text = str_replace("\n","<br />",$val["text"]);
	//ユーザープロフィールURL
	$profile_img = $val["profile_image_url"];

	//自分の投稿ではないことを確認
	if($user_name == $bot_name){
		//自分の投稿の場合次のループへ
		break;
	}

	//つぶやきのはじめが@Bot名になっているつぶやきにのみ反応
	if(preg_match("#^@" .$bot_name .".*#",$tweet_text)){
		//多重投稿しないようチェック
		//ここで僕はDBを使った
		//$tweet_idの読み込み結果を代入(接続等は今回ははしょります。)
		$db_result_load = データベースロード($tweet_id);
		if($db_result_load){
			//データベースに登録がある(=リプライしない)
			break;
		}

		//データベースに登録がない(=リプライする)
		//データベースに登録(ここも各自でコーディングお願いします。)
		$db_result = データベース登録($tweet_id);
		if(!$db_result){
			//データベース登録失敗
			break;
		}

		// TwitterへPOSTする。パラメーターは配列に格納する
		$req = $to->OAuthRequest(
			"http://api.twitter.com/1/statuses/update.xml",
			"POST",
			array("status"=>
				"@" .$user_name ." " .$rep_mes,
				"in_reply_to_status_id"=>$tweet_id));
		//in_reply_to_status_idの指定はどのつぶやきへの返信かというもの。
		//指定無しだと、ただの@ツイートになる。
	}
}

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;
}

これでリプライには対応できるハズ…
データベース使うのがちょっとねー
まぁ、とりあえずなので。

2012/03/06追記
データベースを使わないでcronの実行間隔とつぶやきの時間で比較する方法がありました。
データベースを使わないで日時で比較する方法

次回は、フォローとアンフォローやろうかな。

  1. コメント 0

  1. トラックバック 0

return top