phpでtwitterのbotを作る(返信編)
phpでbotを作るの続き。
前回、取得と投稿をやったので、今回は返信編。
twitterの仕組みとして、アカウント名の前に@を付けると、フォローしていた場合TLに現れる(他にも確認の方法ある)
これをbotの機能として付けるとしたら、「@自分のアカウント」のメッセージを拾って、その発言をした相手の名前を入れたメッセージを投稿しなければならない…ってことですね。
まずソース。
<?php $username = "なまえ"; $password = "パスワード"; //最新の返信発言を残しておくためのファイル $filename = "./tmp/data.txt"; //ファイル読み込む $fp = @fopen($filename,'rb') or die("ファイルが開けません"); flock($fp, LOCK_EX); $line = fgets($fp, 64); fclose($fp); //最新id $s_name=$line; //Twitter APIのメソッドURLを設定する $host = "http://twitter.com/statuses/mentions.xml?count=1"; //@返信一覧の最新一件 //cURLセッションを初期化する、ここらへんは前と一緒 $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文字列をオブジェクトに代入する $XML = simplexml_load_string($result); //$xmlを解析して発言idや名前なんかを取り出し加工 $string = $XML->status[0]->id; $dat = (string)$string; $var = $XML->status[0]->text; $massage = ereg_replace("\@$username", "", $var); $reply_name = $XML->status[0]->user->screen_name; $reply_name = "@$reply_name"; $name = $XML->status[0]->user->name; //投稿部分を整え $massage = $reply_name." "ここらへんは自分で考えてね!"; //読み込んだ最新idが同じ場合はスルー、違う場合は相手への返信を投稿 if($dat != $s_name){ //投稿部分は前やったのと同じ tweet($massage ,$username,$password); //投稿と一緒に最新idをファイルに書き込み file_put_contents($filename,$dat,LOCK_EX); } //以下略 ?>
えーと、解説です。
//最新の返信発言を残しておくためのファイル $filename = "./tmp/data.txt";
もちろん書き込み可にしておく。
$host = "http://twitter.com/statuses/mentions.xml?count=1"; //@返信一覧の最新一件
最新のapi翻訳によると、今までのrepliesでもいいのですが今後はmentionsがメインで使われるだろうとのことでこっちにしました。引数のcount=1は最新1件だけという指定。
あとは今の最新@返信と記録されたファイルを比較して違っていたら投稿する。同時にファイル書き換え。
2分間隔でcron実行させてます。
欠点あります。この2分の間隔の間に複数の@が来ても最新1件の人しか返信出来ません
もっとうまいやり方もあるんでしょうけど…改良の余地有り。でも、とりあえず動いてます。
返信の内容とかは省略。工夫次第で色々面白い事が出来ると思います。