2009 8 9月

twitterのbotをつくってみた。

かなり久しぶりのBlog投稿です。しかもコーダーらしい投稿は初めて・・・
もっとどんどん投稿しなければと思い、先日twitterで”那須”で検索されたつぶやきをRTで投稿させるnasutter_botというものを作ったのでその内容を備忘録としてメモ。

まず、botを作成するための下準備。
twitterからXMLデータを取得してサーバー内にXMLファイルとして書き出す。
特にxmlファイルとして書き出す必要は無かったんだけど確認のため。
あとはPHPで簡単にXMLを扱いたかったからKeith Devens .comのPHP XML Libraryを使ってみた。

// twitterのxmlを取得
define("UPDATE", "http://twitter.com/statuses/update.xml?");
define("TL", "APIのURL");
define("ID", "ユーザーID");
define("PASS", "ユーザーPW");
$context = stream_context_create(array(
    "http" => array(
        "method" => "GET",
        "header" => "Authorization: Basic ".base64_encode(ID.":".PASS)
    )
));
$result = file_get_contents(TL, false, $context);

// xmlに書き込む $fp = fopen("tweet.xml","w"); fputs($fp, $result); fclose($fp);

// PHP XML Libraryを読み込む include_once("xml.php");


ここから本題。
読み込んだPHP XML Libraryを使用して、書き出したXMLファイルを配列に入れて必要なものを取り出してtwitterに投稿。
ただ、すべて取り出して投稿させると記事の内容がかぶってしまう。
記事の内容がかぶらないように、記事のIDを保存させてそこまでを投稿させる。
twitterの記事のIDは”tag:search.twitter.com,2005:IDナンバー”となっておりIDナンバーは新しい記事程大きい数字になっていたので、保存させたID ナンバー以上の記事を投稿させるようにする。
また、RTで投稿させたいので、つぶやきの前に”RT @投稿者の名前:”を付け加える。
// XMLファイルを読み込む
$xml_data = file_get_contents("tweet.xml");
// 読み込んだデータを配列に入れる
$data = XML_unserialize($xml_data);
// entryタグのデータを取り出す
$item_datas = $data["feed"]["entry"];

// IDを読み込む $fp = fopen("id.txt","r"); $recentid = fgets( $fp, 9182 ); fclose($fp);

// データを表示する if (is_array($item_datas)) { foreach ($item_datas as $key => $value) { $id = $value["id"]; $id = str_replace(‘tag:search.twitter.com,2005:’, ”, $id); if($id > $recentid) { $name = $value["author"]["name"]; $name = preg_replace(‘/\((.*)\)/’, ”, $name); $title = $value["title"]; $text= "RT @$name: "."$title"; $params2 = "status=".rawurlencode($text); $context2 = stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ".base64_encode(ID.":".PASS) ) )); $result2 = file_get_contents(UPDATE.$params2 , false, $context2); } }

// 最新idを保存する $fp = fopen("id.txt","w"); foreach ($item_datas as $key => $value) { $id = $value["id"]; if($id == 0) { $id = str_replace(‘tag:search.twitter.com,2005:’, ”, $id); fputs($fp, $id); break; } } fclose($fp); }


こんな感じでtwitterのbotを作ってみたんだけど書き方にムダなところがいっぱいあるような気がする。
まぁ実際に動いてるから気にしないようにしよう・・・