twitterのbotをphpで制作する | 星光のつれづれ日記

twitterのbotをphpで制作するまとめ

シェアする

  • このエントリーをはてなブックマークに追加

始めに

最近ニュースで取り上げられるほど隆盛を極めている『twitter』。
twitterの紹介は割愛するが、その中でプログラムで動いている『bot』と言うものがある。
例えば、@buzztterや@bombtterなどがある。
他にもおもしろ所として@wakatterや@ha_ru_kaなんて言うユーザーの発言にをうまく利用したものもある。
地震速報や天気、料理のレシピ、人工知能を使ったものなど枚挙にいとまがない。

これらのbotの制作はプログラム初心者にとってハードルの高いものだと思う。
そこで今回、プログラミング言語の一つであるphpを使って作る方法をドドーンと公開する事にした。
僕も@dq_pencilや@nyafuuu、そして@nanikiruといくつか作った。
これらに使われているテクニックや関数なんかを公開しようと言う事ね。
僕が作ったボットについて詳しくはこちらへ。他の参考サイトも下のページに書いてあります。
どらぺんってどんなやつ?

かなり長い記事なので続きへ。

ダウンロード

このファイルをダウンロードして使ってちょうだい。
ダウンロードする
ダウンロードするOAuth対応版なので下の解説があまり役に立ちません(;><))

解説

ダウンロードしたファイルの中身は『base.php』と『xml.php』、『status_number.php』そして『db_sub.php』。
テキストファイルが『number.txt』と『bunsho.txt』と『readme.txt』があるはずだ。
それぞれについて使い方を交えた解説をする。
ライブラリとか色々あるけど、ここは全部手打ちだ!なのでコピペして使い回してね!

base.php

全ての基本はこのプログラム。投稿に関するプログラムだ。
ブログの横幅の関係で見にくいので、ファイルを開いて見ながら解説を読んでください。

$id = "botのID";
$pass = "botのパスワード";

//関数定義
function tweet($message, $username, $password){
    $context = stream_context_create(array(
        'http' => array(
        'method' => 'POST',
        'header' => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
            "Content-type: application/x-www-form-urlencoded\r\n",
        'content' => http_build_query(array('status' => $message)),
        'timeout' => 5,
        ),
    ));
    $ret = file_get_contents('http://twitter.com/statuses/update.xml', false, $context);

    return false !== $ret;
}

//ここから投稿する文章制作
$mes = "こんにちは!世界!";

//投稿
$toukou = tweet($mes, $id, $pass);

見て貰うと分かると思うけど、まずはIDとパスワードを入れましょう。
『function tweet』がtwitterに投稿する関数で、『Tweeting from PHP』からとってきた。
$toukouの所で実行しています。
投稿する内容は$mesに入れている。
ここを色々いじる事でアイデアの数だけたくさんのbotが生まれるというわけ。
実行するためには、ファイルをアップロードしてアクセスするだけ。
php簡単だね!

xml.php

これはtwitterのAPIを利用するためのプログラム。
これ作るのに1年くらいかかったしw
APIって言うのはプログラム上でtwitterのタイムラインやリプライを取得するための仕組みだ。
これを使うと開発が大変楽になる。
中身に$urlって言うのがあるんだけど、そのアドレスがAPIの一つで、リプライを取得するもの。
アドレスにアクセスして見れば内容は大体わかると思う。
Twitter API 仕様書 (勝手に日本語訳シリーズ)』を見て貰えれば多くのAPIがあるのがわかる。

2010/2/4 追記
Twitter API Documentation』英語だけどtwitter API の公式のページ。
Twitter-API-Specification–written-in-Japanese-』上の勝手に日本語訳と同じ内容だけど一応。

//XMLからデータを取得しいじる
	$kaiseki = array();						//この配列にxmlから取り出したモノを入れる
	foreach( $xml->status as $value ){
		$status_number = $value->id;				//ステータスナンバーを$status_numberに挿入
		$screen_name = $value->user->screen_name;	//userIDを$screen_nameに挿入
		$hatugen = $value->text;					//発言内容を$hatugenに挿入

		$text = $screen_name."のステータスナンバー".$status_number."の内容は".$hatugen."です。";

		array_push($kaiseki, $text);
	}

//いろいろいじった$kaisekを出力する
	foreach ($kaiseki as $value){
		echo $value."
"; }

この部分が取得したAPIをいじる所だ。
プログラムがどの様に動いているかは『http://twitter.com/statuses/replies.xml?count=30』にアクセスして見れるものと、
プログラムを実行して表示されているものを見比べて貰えばわかるはず。

$status_number = $value->id;				//ステータスナンバーを$status_numberに挿入
$screen_name = $value->user->screen_name;	//userIDを$screen_nameに挿入
$hatugen = $value->text;					//発言内容を$hatugenに挿入

この部分がAPIをいじっているところの中核で、APIの階層を現している。
つまりAPIから取り出したいものはここをいじれって事。レッツトライ&エラーだ。
捕捉として、ブログのRSSと言ったようなxmlでも動きます。

status_number.php

これはステータスナンバーを利用して発言が新しいかチェックするためのテクニック。
ステータスナンバーは各発言に割り振られている数字の事で、『https://twitter.com/dq_pencil/status/3574230857』の『3574230857』の部分の事だ。
基本はxml.phpと同じで、APIからステータスナンバーを取りだし比較すると言うもの。

//status_numberの比較_start
	$number = fopen("./number.txt", "r");
	$hikaku = fgets($number);  // 読み込み
	$num10 = $hikaku;
	fclose($number);

//XMLからデータを取得しいじる
	$nm = 0;										//この定数はステータスナンバーを一度だけ記述するためのカウント。
	foreach( $xml->status as $value ){
	    $status_number = $value->id;
		$screen_name = $value->user->screen_name;

		settype($status_number, "float");			//ステータスナンバーを文字列から数字に変換。無くても良いけどあったらGOOD

		if ($num10 < $status_number){
			//一度だけステータスナンバーをnumber.txtに書き出す。
			if ($nm == 0){
				$status = $status_number + 1;
				$numbers = fopen("./number.txt", "w");
				fwrite($numbers, $status);
				fclose($numbers);
				$nm += 1;
			}

			$text = $value->text;

			echo "新しいリプライがありました。その内容は".$text."です。
"; } }

ステータスナンバーを『number.txt』に書き出しておき、
その数字とAPIから取得した数字を比較する事でその発言が新しいかを判断する。

db_sub.php

最後にデータベースの代わりとなるテクニックを一つ。
これもテキストファイルを利用したもので、各行を配列に取り込む事でデータベースを使った風味の事が出来る。
何はともあれ実行してみてちょうだい。
『bunsho.txt』の中身がランダムで表示されるようになっているはず。たぶん。

readme.txt

この中身はファイルのパーミッションについて書いてあります。
phpのファイルが『755』または『644』で、テキストファイルが『606』だとバッチリ動く。
全てのファイルを同じフォルダにアップロードする事。

最後に

今回紹介したものを使えば@nyafuuuと同等に近いものが出来ると思う。
APIからリプライを取得、ステータスナンバーを比較、データベースの代わりのテキストファイルから文章取得、そして投稿。
いろいろ試すのに作って見るのもありかもね。
テストをする時はコメントアウトやechoを使うと良い。
著作権とかあまり興味ないけど、もし使ってくれたならこの記事を紹介してくれるとありがたいですな-。
またトラックバックを飛ばして貰えればbotの紹介も出来るかも知れないね。

おまけ

余談としてなぜphpなのかだけど、一つは簡単だから。適当に作っても動く←これ重要。
もう一つは多くのレンタルサーバーでphpが動くから。ただし、php5以上じゃないと危ないかも(; ・`д・´)なので古いサーバーだと無理だと思う。
僕はxreaのレンタルサーバー使ってる。
あと、ググれば一杯情報が出てくるから。ぜひ色々調べてみて。

また、プログラムで時報的なものを作るのにはcronを使うんだけど、海外サイトの『cron-job.org』が非常に便利。(2017年5月5日リンク切れ確認)
ドイツ語っぽい上に時差もあって設定が少し面倒だけど『cron タスクの設定 【 Cron-job.org の利用】』を見ながら設定すれば乗り切れるはず。

2009年11月20日 追記
twitterでOAuthを使う方法をまとめてみた。
twitterのbotなどでOAuthを使う方法(PHPバージョン)

2010年1月23日 追記
bot用のcronサービスは『GAE-Cron Club』をオススメします。(2017年5月21日リンク切れ確認)
今のところ無料っぽい。本当にすごい。

2010年1月25日 追記
『プログラミングができなくても作れるTwitter botの作り方』を勝手にOAuthにした
こんな記事も書いてみた。

2010年2月8日 追記
GitHub』にもソースを公開。

2010年4月2日 追記
OAuth対応版の公開と『Access Token』などを取得するページを用意した。

2010年4月29 追記
やたら追記ばかりになってきたけど、OAuthに関してはこちらで決まり!

コメント

  1. たかたん より:

    ダウンロードって所を押すと、文字化けしたサイトが表示されます。
    もうダウンロードできないって事でしょうか?

  2. hosimitu より:

    コメントありがとうございます。
    こちらでもダウンロードが出来るか試してみました。
    Windows7 64bit の環境で IE、Firefox、Chromeでダウンロードが出来ることを確認しました。
    なので私の環境にではダウンロードが出来るようなのですが、
    たかたんさんの環境ではちょっと出来ない理由がわかりません。申し訳ないです。

    ちょっと昔のことで中身が最新版かどうか確認していませんが、
    https://github.com/hosimitu/twitter-bot
    こちらでダウンロードできるかも知れません。
    またダメでしたらコメントしていただいたメールアドレスにお送りしますので、
    コメントしてくださいね。