Twitterボットを作ってみた

先日、学校祭でプラレールの公開をした。
ただのプラレールではなく、サーバー制御で動くプラレール

このプラレールに感情をもたせようという趣旨で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);

?>