phpでtwitterのbotを作る(TLに反応編)
今までは、自分に対する@返信があった時に反応する、というリプライでしたが、今回は
TL上に特定の語句が現れた場合、それに大して反応する、というものです。
原稿催促botでも付けたしたい機能だったのでいい機会。さっそくソース。
※他の人へのポストや自分宛の返信に反応しない修正版を作りました。
そちらの方がおすすめです→修正版はこちら!
<?php $username = ""; $password = ""; //最新のTLのステータスIDを保存しておくファイルです。パーミッションは書き込み可に。 $filename = "./tmp/last.dat"; //過去の開いて取得 $fp = @fopen($filename,'rb') or die("ファイルが開けません"); flock($fp, LOCK_EX); $line = fgets($fp, 64); fclose($fp); //自分がフォローしているfriendsのリストです。 $host = "http://twitter.com/statuses/friends_timeline.xml"; //ユーザーの発言一覧 //一番最初の時やファイルが壊れた時、最新1件のみ発言を取得する if(!empty($line)){ $last_id=$line; $host .="?since_id=".$last_id; } else{ $host .="?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); // ////cURLセッションを実行する $result = curl_exec($ch); // ////cURLリソースを閉じ、システムリソースを解放する curl_close($ch); //XML文字列をオブジェクトに代入する $XML = simplexml_load_string($result); $i = count($XML)-1; $j = 0; while($i >= $j) { $var = $XML->status[$i]->text; $reply_name = $XML->status[$i]->user->screen_name; $name = $XML->status[$i]->user->name; if($reply_name != $username){ if(ereg("おやす", $var)){ $message = "@".$reply_name." おやすみ!"; tweet($message ,$username,$password); } else if(ereg("おはよ", $var)){ $message = "@".$reply_name." おはよう!"; tweet($message ,$username,$password); } } $i--; } //ファイルに最新id書き込み $last_id = $XML->status[0]->id; $dat = (string)$last_id; file_put_contents($filename,$dat,LOCK_EX); //ポスト部分の関数 function tweet($message ,$username,$password) { $message =urlencode($message); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://twitter.com/statuses/update.xml'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$message "); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); $buffer = curl_exec($ch); curl_close($ch); } ?>
解説ですが、とってくるhostがhttp://twitter.com/statuses/friends_timeline.xmlになってます。
TLですね。自分の発言も拾ってしまいますので注意が必要です。
if($reply_name != $username){の部分で自分の発言除外するようにしてます。
見て頂ければわかると思いますが「おはよ」、「おやす」で反応するようになってます。
拾ってくる発言が基本的に20件なので、クローンは1回で拾いきれる間隔で設定されればいいと思います。
フォローしている人=TLなので迷惑にあたりませんが、全く接点のない人に@を飛ばすのは迷惑がられるのでやめた方がいいようです。