先日、夏休みの自由工作で「ごますりぼっと」という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」を実行するように設定すれば完成(笑)

コメントする