phpでtwitterのbotを作る(複数リプライ・改良編)
※ソースに抜けがありました。22時12分に更新。それ以前にコピペして動かない人はソースの箇所をごらん下さい!
どうも。phpでtwitterのbotを作る(返信編)が少し反響ありまして、嬉しい限りです。
ただ、欠点もありまして「最新1件のリプライしか反応しない」という…今回、改良できましたので掲載させていただきます。
プログラム全体を見渡して変数やら流れやらがちょっと変わってしまったので、既に前ので運用されている方はご注意下さい。
特に、変数名はスペルミス(間抜け過ぎるだろう…)等で一見、同じように見えて変わっていたりするので、以前のを流用するより、こちらで新しく作るぐらいお気持ちでいかれた方がうまくいくと思います。
<?php $username = "なまえ"; $password = "ひみつ"; $filename = "./tmp/data.txt"; //ここ重要!コピペミスってました!すみません!以前のコピペで動かない人はこの1行をこの場所に入れて下さい! $host = "http://twitter.com/statuses/mentions.xml"; //返信一覧 $fp = @fopen($filename,'rb') or die("ファイルが開けません"); flock($fp, LOCK_EX); $line = fgets($fp, 64); fclose($fp); //保存しておいたステータスid取得。このid以降の返信を読み込む。なかったり読み込めなかったら最新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); //ここからが変わったところ。以前保存したid以降、複数リプライある場合whileで処理。 //新しい程配列のキーが若いので、減算子を使う(for文でもできるんじゃ…) $i = count($XML)-1; $j = 0; while($i >= $j) { $var = $XML->status[$i]->text; $com = ereg_replace("\@$username", "", $var); $reply_name = $XML->status[$i]->user->screen_name; $name = $XML->status[$i]->user->name; //ゴチャゴチャするので、返信のセリフ組み合わせはユーザー定義関数で。 $message = serif($reply_name,$name,$com); //そのままポストの関数へ… tweet($message ,$username,$password); $i--; } //最終発言リプライのidを保存してる部分。先頭を調べて… $string = $XML->status[0]->id; //空じゃなかったら書き込み if(!empty($string)){ $dat = (string)$string; file_put_contents($filename,$dat,LOCK_EX); } //これでメインの処理は終わり //セリフ生成のユーザー定義関数 function serif($reply_name,$name,$com){ //配列を用意して… $uranai=array("大吉","中吉","小吉","末吉","吉","凶"); $janken=array("ぐー","ちょき","ぱー"); //スクリーンネームに@を付ける $reply_name = "@$reply_name"; //特定語句に反応する部分 if(stristr($com, "占い")){ $key = array_rand($uranai); $post = $uranai[$key]; $return = $reply_name." ".$name."さんの運勢…".$post; } else if(stristr($com, "じゃんけん")){ $key = array_rand($janken); $post = $janken[$key]; $return = $reply_name." ".$name."さん、勝負だ!じゃんけん…".$post; } else{ //このままだと鸚鵡返し。色々工夫してみて下さい $return = $reply_name." ".$com; } //戻り値 return $return; } //ポスト部分の関数 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); } ?>
以上です。これで複数でもOKのはずです。以前は$massageと$message間違えたりとか、本当、アホな間違いが多く…申し訳ありませんでした。
ただ、このような仕様にしてもtwitterのもつAPI制限の壁や、同じく@に反応するbotなどと相見えると、延々と@を飛ばし続ける…なんて怖い事態にもなりかねませんので、ご注意下さい。(x回連続で会話が続くと自動的に切る機能とかも必要かも?!)絶対返す(名目上は)律儀なbotということで、遊んで下さる人にあまり長時間占有されないようお願いしたり、理解していただけるよう留意するのがいいのかもしれませんね。
またご意見ありましたらコメントなりトラバなりで下さい。