例の痛いtwitter bot(ごますりぼっと)の中身[PHP + twitteroauth]

bot_logo.JPG


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

Track Back

Track Back URL

コメントする

公開されません

このページの上部へ