先日、夏休みの自由工作で「ごますりぼっと」というTwitterのbotを作りました。
(詳しくは -> 「Twitter_botつくった:ごますりぼっと」)
完成したbotについて冷静になって考察しいるうちに、だんだんと悲しくなってきました。
一見すると小学生が作ったbotのように見えるかもしれませんが、中の人は24歳のピチピチなおじさんなのです(ドヤッ
ただ、ブログのネタが無くて困っていたところでせっかく作ったbotなので、ソースコードは掲載しておくことにします。
某所からコピペしたコードだったり、同じ処理なのに場所によって書き方が違ったり、テストが超不十分だったりしますが、細かいことは気にしないでくださいネ♪
あ、でもアドバイスとかは大歓迎です!
あと前提として「twitteroauth」を導入してます。
先人の知恵は素晴らしいです♪
connect.php
<?php require_once("twitteroauth.php"); //botのスクリーンネーム $ids = "surisuri_bot"; //OAuth認証、オブジェクト生成 $consumer_key = "HOGEHOGE"; $consumer_secret = "FUGAFUGA"; $access_token = "MORIMORI"; $access_token_secret = "BUHIBUHI"; $bot = new TwitterOAuth ($consumer_key, $consumer_secret, $access_token, $access_token_secret);
follow.php
<?php /********************************************* フォロー返し、リムーブ返しを自動で実行する **********************************************/ require_once("connect.php"); //followerとfriendを取得 $followers = $bot->OAuthRequest ("http://api.twitter.com/1/statuses/followers.xml", "GET", array()); $friends = $bot->OAuthRequest ("http://api.twitter.com/1/statuses/friends.xml", "GET", array()); $followers = simplexml_load_string($followers); $friends = simplexml_load_string($friends); //ユーザIDを配列に格納 $followers_id = array(); $friends_id = array(); foreach($followers as $key => $val){ $followers_id[] = $val->id; } foreach($friends as $key => $val){ $friends_id[] = $val->id; } //処理を実行するユーザのリストを生成 $follow_user_list = array_diff($followers_id, $friends_id); $destroy_user_list = array_diff($friends_id, $followers_id); //自動フォロー foreach ($follow_user_list as $value) { $bot->OAuthRequest ("http://twitter.com/friendships/create/".$value.".xml", "POST",array()); } //自動リムーブ foreach ($destroy_user_list as $value) { $bot->OAuthRequest ("http://twitter.com/friendships/destroy/".$value.".xml", "POST",array()); }
post.php
参考 : mtFlash | twitter bot
<?php /********************************** 定時tweetを実行 **********************************/ require_once("follow.php"); //infile_post.txtファイルからtweetするメッセージをランダムに取得 $input_array = file("infile_post.txt"); $key = array_rand($input_array,1); $msg = $input_array[$key]; //日付を取得 $month = date("m"); $date = date("d"); //ステータス生成 $status = sprintf("%s月%s日なう。%s", $month, $date, $msg); //ツイート $bot->OAuthRequest ("http://api.twitter.com/1/statuses/update.xml", "POST", array("status"=>$status));
getTweet.php
参考 : twitterのbotで超巨大なステータスナンバーを比較できた
<?php /************************************************* これまでに未取得のツイート中から、 各ユーザ最新ツイートのstatusIDを連想配列に格納 ************************************************/ require_once("connect.php"); //前回処理時の最終statusID取得 $file = 'sid_count.txt'; if (! ($fp = fopen ( $file, "r" ))) echo "file open failure"; $sid_count = fgets($fp); $array_sid_count = str_split($sid_count); fclose($fp); //フラグ $page_end_flag = false; //tweet収集 $page = 1; while($page <= 16){ //status取得 $req = $bot->OAuthRequest ("http://api.twitter.com/1/statuses/friends_timeline.xml", "GET",array("page" => "$page")); $xml = simplexml_load_string($req); //statusIDの最新値をtxtファイルに書き込み if($page == 1){ $max_sid = strval($xml->status->id); if (! ($fp = fopen ( $file, "w" ))) echo "file open failure"; fwrite($fp, $max_sid); fclose($fp); } //statusID比較。前回収集時の最終値以降のもののみ取得。 foreach( $xml->status as $s){ //statusIDを配列に格納 $sid = strval($s->id); $array_sid = str_split($sid); //比較のためのフラグ $exec_flag = false; $break_flag = false; //初めに桁数比較。次に文字→数字変換を順に実行 if(count($array_sid) > count($array_sid_count) ){ //桁数が違う場合 $exec_flag = true; } else { //桁数が同じ場合 $i = 0; foreach($array_sid as $val){ if($val === $array_sid_count[$i] && $break_flag === false){ //処理しない。 }elseif($val > $array_sid_count[$i] && $break_flag === false){ $exec_flag = true; $break_flag = true; }else{ $break_flag = true; } $i++; } } //比較結果ごとに処理を分岐 if ($exec_flag){//新しいstatusの場合 $uname = $s->user->screen_name; $text = $s->text; //各ユーザ最新1件のみ、statusIDを連想配列に格納 $uid = (string)($s->user->id); if(isset($user_list[$uid])){ //処理せず. }else{ $user_list[$uid] = $sid; } }else{//古いstatusの場合 $page_end_flag = true; } } $page++; if($page_end_flag)break; }
fav.php
<?php /*************************************************** user_list配列に格納されているstatusをふぁぼり、 ごますりリプライを行う。 **************************************************/ require_once("follow.php"); require_once("getTweet.php"); if(isset($user_list)){ foreach($user_list as $uid => $sid){ //infile_surisuri.txtファイルからtweetするメッセージをランダムに生成 $input_array = file("infile_surisuri.txt"); $key = array_rand($input_array,1); $msg = $input_array[$key]; //ユーザIDからスクリーンネームを取得 $req = $bot->OAuthRequest ("http://api.twitter.com/1/users/show/".$uid.".xml", "GET", array()); $xml = simplexml_load_string($req); $reply_uname = $xml->screen_name; //スクリーンネームが空でなく、尚且つ自分以外のときの処理 if(!empty($reply_uname) && ($reply_uname != $ids)){ //リプライをツイート $status = sprintf("@%s %s", $reply_uname, $msg); $bot->OAuthRequest ("http://api.twitter.com/1/statuses/update.xml", "POST", array("status"=>$status, "in_reply_to_status_id"=>$sid)); //ふぁぼる $bot->OAuthRequest ("http://api.twitter.com/1/favorites/create/".$sid.".xml", "POST", array()); } } }
上記5つのファイルとは別に「sid_count.txt」「infile_post.txt」「infile_surisuri.txt」というファイルを用意します。
「infile_post.txt」「infile_surisuri.txt」にはごますり用のセリフを書きまくります。
「sid_count.txt」は、前回処理をしたステータスIDを保存しておくためのファイルです。
毎日7時に「post.php」を、0時、10時、20時に「fav.php」を実行するように設定すれば完成(笑)
コメントする