先日、学校祭でプラレールの公開をした。
ただのプラレールではなく、サーバー制御で動くプラレール。
このプラレールに感情をもたせようという趣旨でTwitterのボットを作ることにした。
以下、参考にしたページ。
http://www.sdn-project.net/labo/twitter_bot.html:PHP+OAuthでTwitterのBotを作ってみる
使う言語はPHP。
サーバー上でスクリプトを実行しながらつぶやかせるというもの。
基本的には上記のサイトを参考にすればBotはできる。
あとは、オリジナルのセリフやスピードに応じたセリフを設定する。
コードを下に載せておく。
<?php //-----------------------------------------------------------[ グローバル変数 ] ini_set( 'error_reporting', E_ERROR ); $counter = array('speed' => 400,'direction'=> 150,'rail'=> 350,'point' =>300,'now' =>100); // $timer = array('speed' => 500,'direction'=> 500,'rail'=> 500,'point' => 500,'now' => 500); $hushtag = " #nlab2012"; //-----------------------------------------------------------[ ユーザー定義関数 ] function TweetRail($arg){ global $to,$hushtag,$counter; $point = $arg->nearest_point_number; $str = RandomWords(4,array($point)); $req = $to['rail']->Request("statuses/update.json","POST",array("status"=>"[".date("U")."]".$str.$hushtag)); if(json_decode($req)) echo $str; // 結果判定を表示する $counter['rail']=0; //カウンター初期化 } function TweetBySpeed($arg){ //速度に応じてツイート global $counter,$timer,$to,$hushtag; if($arg->speed >=0) $str = RandomWords(1,array($arg->speed)); elseif($arg->speed <= 0) $str = RandomWords(2,array($arg->speed)); // in_reply_to_status_idを指定するのならば array("status"=>"@hogehoge reply","in_reply_to_status_id"=>"0000000000"); とする。 $req = $to['train']->Request("statuses/update.json","POST",array("status"=>"[".date("U")."]".$str.$hushtag)); if(json_decode($req)) echo $str."\r\n"; // 結果判定を表示する $counter['speed']=0; //カウンター初期化 } function TweetDirection($arg){ global $to,$hushtag,$counter; $point = $arg->nearest_point_number; $direction = $arg->direction; if(preg_match("/left/i",$direction)) $str = RandomWords(3,array($arg->nearest_point_number,"左")); elseif(preg_match("/right/i",$direction)) $str = RandomWords(3,array($arg->nearest_point_number,"右")); elseif(preg_match("/straight/i",$direction)) $str = RandomWords(3,array($arg->nearest_point_number,"まっすぐ")); $req = $to['train']->Request("statuses/update.json","POST",array("status"=>"[".date("U")."]".$str.$hushtag)); if(json_decode($req)) echo $str; // 結果判定を表示する $counter['direction']=0; //カウンター初期化 } function TweetPoint($arg){ global $to,$hushtag,$counter; $point = $arg->nearest_point_number; $str = RandomWords(5,array($arg->nearest_point_number,$point)); $req = $to['point']->Request("statuses/update.json","POST",array("status"=>"[".date("U")."]".$str.$hushtag)); if(json_decode($req)) echo $str; // 結果判定を表示する $counter['point']=0; //カウンター初期化 } function RandomWords($pattern,$opt=null){ //----------------------------------// // 1:スピードアップ@電車くん // // 2:スピードダウン@電車くん // // 3:進行主張@電車くん // // 4:進行予想@レールちゃん // // 5:通過申告@ポイントさん // //----------------------------------// $para = array(rand(1, 3),rand(1, 3),rand(1, 3)); switch ($pattern) { case 1: //1:スピードアップ@電車くん switch ($para[0]) { case 1:$str[0] = "えへへっ!";break; case 2:$str[0] = "よっしゃー!";break; case 3:$str[0] = "いえーい!";break; default:break;} switch ($para[1]) { case 1:$str[1] = "ボクがいちばん早いんだからなっ、";break; case 2:$str[1] = "どんどんとばしてくよっ、";break; case 3:$str[1] = "どんなもんだっ、";break; default:break;} switch ($para[2]) { case 1:$str[2] = "もっともっとスピードあげるぞっ!";break; case 2:$str[2] = "この調子であげてこーっ!";break; case 3:$str[2] = "誰もボクに勝てないだろっ!";break; default:break;} $str[3] = $str[0].$str[1].$str[2]."スピード".$opt[0]."だぞーっ!"; break; case 2: //2:スピードダウン@電車くん switch ($para[0]) { case 1:$str[0] = "えっ!?ボク・・・ボク";break; case 2:$str[0] = "はぁぁ〜。。。";break; case 3:$str[0] = "う〜、うえ〜ん";break; default:break;} switch ($para[1]) { case 1:$str[1] = "どうしよう・・・。";break; case 2:$str[1] = "もうやんなっちゃうなぁ・・・";break; case 3:$str[1] = "なんでだよぅ〜";break; default:break;} switch ($para[2]) { case 1:$str[2] = "なんだか疲れちゃったよぅ・・・。";break; case 2:$str[2] = "はやく帰りたいよぅ〜〜";break; case 3:$str[2] = "やる気なくなっちゃったなぁ・・・。";break; default:break;} $str[3] = $str[0].$str[1].$str[2]."もう".$opt[0]."スピードしかないもん。。。"; break; case 3: //3:進行主張@電車くん switch ($para[0]) { case 1:$str[0] = "はいはーい、";break; case 2:$str[0] = "ねぇねぇ、聞いて";break; case 3:$str[0] = "じゃじゃーん、";break; default:break;} switch ($para[1]) { case 1:$str[1] = "この先の";break; case 2:$str[1] = "これから";break; case 3:$str[1] = "今から";break; default:break;} switch ($para[2]) { case 1:$str[2] = $opt[0]."番ポイントを通過するよっ!";break; case 2:$str[2] = $opt[0]."ポイントがそろそろ見えてくるけど";break; case 3:$str[2] = "分岐点は".$opt[0]."番だよね!?";break; default:break;} $str[3] = $str[0].$str[1].$str[2].$opt[1]."に行こうかなっ!"; break; case 4: //4 進行主張@レールちゃん switch ($para[0]) { case 1:$str[0] = "あは、";break; case 2:$str[0] = "まぁ、";break; case 3:$str[0] = "あらら、";break; default:break;} switch ($para[1]) { case 1:$str[1] = "もしかして";break; case 2:$str[1] = "ひょっとして";break; case 3:$str[1] = "あたしの予想だと";break; default:break;} switch ($para[2]) { case 1:$str[2] = "電車くんてば";break; case 2:$str[2] = "電車くんたら";break; case 3:$str[2] = "電車くんは";break; default:break;} $str[3] = $str[0].$str[1].$str[2].$opt[0]."番のポイントを".$opt[1]."に曲がろうとしてるでしょっ!?"; break; case 5: //5:通過申告@ポイントさん switch ($para[0]) { case 1:$str[0] = "ふんっ、";break; case 2:$str[0] = "なによっ、";break; case 3:$str[0] = "あらあらあら、";break; default:break;} switch ($para[1]) { case 1:$str[1] = "別にあなたになんか興味はありませんけれど";break; case 2:$str[1] = "私は認めませんけど";break; case 3:$str[1] = "決してあなたを褒めてるわけではありませんが";break; default:break;} switch ($para[2]) { case 1:$str[2] = "レールさんが仰った通りでしたわね・・・。";break; case 2:$str[2] = "よくもわたくしの上を通過してくれましたわねっ。";break; case 3:$str[2] = "電車さんが私のところを・・・。";break; default:break;} $str[3] = $str[0].$str[1].$str[2].$opt[0]."番を通過しても、ぜ、全然嬉しくないんだからっ"; break; case 6: //6:現在地@レールちゃん switch ($para[0]) { case 1:$str[0] = "電車くんはね〜";break; case 2:$str[0] = "えっ?電車くん?";break; case 3:$str[0] = "電車くんの場所・・・";break; default:break;} switch ($para[1]) { case 1:$str[1] = "今いるところ知りたい〜?";break; case 2:$str[1] = "知らないわけじゃないんだけどねっ、";break; case 3:$str[1] = "いまどこにいるんだろ〜。。。。あっ";break; default:break;} switch ($para[2]) { case 1:$str[2] = "";break; case 2:$str[2] = "";break; case 3:$str[2] = "";break; default:break;} $str[3] = $str[0].$str[1].$str[2].$opt[0]."番エリアにいるよ〜ん。"; break; default:break;} return $str[3]."\r\n"; } //-----------------------------------------------------------[ twitterAPI ] // twitteroauth.phpを読み込む。 require_once("twitter_bot.php"); // Botのユーザー名 $user = array('point' => "nlab12_point", 'train' => "nlab12_train" , 'rail' => "nlab12_rail" ); // Consumer keyの値 $consumer_key = array('point' => "key1",'train' => "key2",'rail' => "key3"); // Consumer secretの値 $consumer_secret = array('point' => "ksecret1",'train' => "ksecret2",'rail' => "ksecret3"); // Access Tokenの値 $access_token = array ('point' => "token1",'train' => "token2",'rail' => "token3"); // Access Token Secretの値 $access_token_secret = array('point' => "tsecret1",'train' => "tsecret2",'rail' => "tsecret3"); // OAuthオブジェクト生成 $to = array('point' => new Twitter_Bot($user['point'],$consumer_key['point'],$consumer_secret['point'],$access_token['point'],$access_token_secret['point']), 'train' => new Twitter_Bot($user['train'],$consumer_key['train'],$consumer_secret['train'],$access_token['train'],$access_token_secret['train']), 'rail' => new Twitter_Bot($user['rail'],$consumer_key['rail'],$consumer_secret['rail'],$access_token['rail'],$access_token_secret['rail'])); //-----------------------------------------------------------[ストリーム受信] set_time_limit(0); // タイムアウトさせない $port = 7777; // ポート指定 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) die("Socket Error!:".socket_strerror(socket_last_error())."\r\n"); $client = socket_connect($socket, '192.168.11.150',$port); if ($client === false) die("Connection Error!"); /* $socket = socket_create_listen($port); // ソケット生成、ポート占有、待ち受け開始 if ($socket === false) die("Socket Error!:".socket_strerror(socket_last_error())."\r\n"); $client = socket_accept($socket); // リクエストが来るまでここで止まってる if ($client === false) die("Connection Error!"); */ //-----------------------------------------------------------[実行部] while(TRUE){ if($request = socket_read($socket, 4096)){//ソケット受信 $arg = json_decode($request);//ストリームデータ分析 if($arg->arg2){ if($counter['speed']>= $timer['speed']) TweetBySpeed($arg); if($counter['direction']>= $timer['direction']) TweetDirection($arg); if($counter['rail']>= $timer['rail']) TweetRail($arg); if($counter['point']>= $timer['point']) TweetPoint($arg); $counter['speed']++; $counter['direction']++; $counter['rail']++; $counter['point']++; } } } socket_close($client); ?>