Twitterのbotの簡単な作り方@PHP

(以前mixiに上げたものを再編集して掲載)
Twitterbotはとても簡単に作れてしまうので紹介。

作成にはServices_Twitterというものを使う。


参考にしたサイト

プログラミングができなくても作れるTwitter botの作り方
http://pha22.net/text/twitterbot.html

ここの配布してるphpのソースを参考にしながら作った。

Services_Twitter
http://labs.transrain.net/products/services_twitter/

上のサイトはこれを使ってボットを作ってる。非常に便利。getFriendsTimeline();みたいな関数が用意されてる。



作り方を書こうかと思ったけど、ソース見た方がずっと早いと思うので最低限の説明と、ソースを書く。
基本的には、
Service_Twitterクラスのオブジェクト作成。$stとかそういう変数に入れる。

$timeline = $st->getFriendsTimeline(); // タイムライン読み込み。
$st->setUpdate("かきこむないようだよー"); // タイムライン書き込み。

こんな感じで簡単。
読み込んだタイムラインのデータは、配列と連想配列入れ子になってる。

$timeline[何番目]["text"]:本文
$timeline[何番目]["id"]:TweetのID
$timeline["user"]["name"]:つぶやいた人の名前

などなど。詳しくはService_Twitterのサイトへ。


getFriendTimelineで取得したTLを自分でつぶやき直すボットのコード。

<?php

$username = "_haltest";
$password = "ないしょ";

require_once("Services/Twitter.php");

$st =& new Services_Twitter($username, $password);


// 前回読み込んだTweetの最後のIDを取り出す。
$id = file_get_contents("data.log");

// タイムライン取得。
$timeline = $st->getFriendsTimeline();

// タイムラインごとに処理。
foreach($timeline as $tweet)
{
 // まだ書き込んでないTweetなら
 if($tweet["id"] > $id){
  // かきこむ。
  $st->setUpdate($tweet["text"]);

  // デバッグのためにブラウザ上でも表示。
  print $tweet["id"] . " --- " . $tweet["text"] . "<BR>\n";
  $id = $tweet["id"];
 }
}

// 最後に書き込んだTweetのIDを覚えておく。
$fp = fopen("data.log", "w");
fwrite($fp, $id);
fclose($fp);

?>

※本来はgetFriendsTimeline()に引数を与えてある時間以降のタイムラインのみとるのが正当な方法。

ちなみに、$timeline = getFriendsTimeline();で取得したデータ$timelineがどういう構造になってるかは、
print_r($timeline);で見れる。

phpの動くサーバーさえあればできるのでやってみると面白いかも。




若干細かいいろいろ。

いわゆるbotとして動いてもらうためには、定期的に上のプログラムを動かさないといけない。紹介した一つ目のサイトにも書かれているけど、クローンジョブというのを使って定期的にプログラムを呼び出してもらう。
どのようなものが無料で使えるか等は上記サイトに載っているので割愛。
私はXREA+のサーバーを使っているのでそこのクロンジョブを使用した。

もう一つ。
Services_Twitterの説明を見ているとenableJsonConvert()というのを呼び出してやればgetなんたらの返り値はjson式の文字列ではなく連想配列($hoge["text"]とかいうやつ)にしてくれる、との話だったけどどうもそれがうまくいかなかった。
なので、紹介した一つ目のサイトのソースコードを参考にして、Services_TwitterTwitter.phpを少し変えた。具体的にはデータを返すときにjson文字列の変換を行うようにした。

require_once("Services/Twitter/Jsphon/Decoder.php");

と最初の方でやっておいて、

_getData, _setDataの最後の行、

return $body;

となっているところを

$json =& new Jsphon_Decoder();
return $json->decode($body);

とした。これでjson文字列が連想配列に変換される。

Decoder.phpは一つ目のサイトの方で使われているServices_Twitterに入っていた。



ちなみに今はタイムラインを見て受け答えを勝手に学習するbotを動かしています。
@nisehorn

みなさまもお試しあれ。