2009-11-28
PHP 80行で作るTwitterへRSSを投稿するbot
石巻かほくさんの見出しをtwitterへ投稿する仕組みを作ってみました。→ @isnmk_kahoku
個人的にRSSは、なかなか読みません。
そこで、twitterに投稿するbotにしてしまえば、タイムライン上でだらだらと、目にすることができるので情報収集がしやすくなります。
今回投稿したRSSは自分で作っている蛇田.jpの石巻かほくRSSです。
いくつかRSSを投稿するbotを作成したのですが、手法が固まってきたのでメモ!
確認点
利点
といった点です。
file_get_contentsが使用可能か確認してください。
php.iniにおいて
allow_url_fopen on
に設定されていないと外部URLに対しては使用できない関数です。
ソースコード
<?php //echo "\n twitter投稿モジュール \n"; // twitterのアカウント・・・(1) $username = 'isnmk_kahoku'; // twitterのパスワード・・・(2) $password = '********'; // APIから取得するツイートの件数 $api_count = 20; // twitterのツイート更新API $url = "http://twitter.com/statuses/update.xml?"; $sTime = time(); // 投稿するRSSの取得・・・(3) $sRSS = file_get_contents('http://hebita.jp/rss/ikahoku.xml'); // オブジェクト化 $oXML = simplexml_load_string($sRSS); // RSSのitem以下のノードを使用する $oItems = $oXML->channel->item; // 投稿するアカウントの直近$api_count件数のツイートを取得 $sTw = file_get_contents("http://twitter.com/statuses/user_timeline.rss?screen_name=$username&count=$api_count"); $oTw = simplexml_load_string($sTw); $oTwItems = $oTw->channel->item; foreach($oItems as $oItem){ // 投稿するRSSのitem(投稿する文字列)を取り出す・・・(4) $sTitle = $oItem->title; // 投稿済み1 未投稿0 if(!PostCheck($oTwItems,$sTitle)){ // ソースはEUC-JPで記述されているためUTF-8へ変換する $sDate = E2U(date(" - n月j日G時i分",$sTime)); // RSSオブジェクトからリンクを取得・・・(5) $sLink = $oItem->link; // 投稿形式に文字列を成型 $sMassage = $sTitle . $sDate ." ". $sLink; $params = "status=". rawurlencode($sMassage); echo $sMassage . " OK\n"; // 投稿 $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); } } // RSSオブジェクト,見出し function PostCheck($oItems,$oHead){ $sHead = (string) $oHead; foreach($oItems as $oItem){ $sTitle = (string) $oItem->title; // 投稿済みの確認 if(mb_strpos($sTitle,$sHead,0,'UTF-8') > 0){ // 投稿済み return 1; } } // 未投稿 return 0; } // EUC-JPからUTF-8へ変換 function E2U($sStr){ return mb_convert_encoding($sStr,'UTF-8','EUC-JP'); } ?>
修正箇所
以下の5箇所を修正します。
| 修正箇所 | 概要 |
|---|---|
| (1) | 投稿するtwitterのアカウント(screen name)を設定します |
| (2) | (1)で設定したアカウントのパスワードを設定します |
| (3) | 投稿するRSSのURLを設定します |
| (4) | RSSオブジェクトから投稿するテキストを取り出す形に修正します。RSS->channel->item->titleを取り出す形であればこのままでOK |
| (5) | RSSオブジェクトから投稿するURLを取り出す形に修正します。RSS->channel->item->linkを取り出す形であればこのままでOK |
処理概要
処理の大まかな流れ
- 変数設定
- 投稿するRSSの取得
- 投稿するtwitterアカウントのAPIを使用し、直近数件のツイートを取得
- 投稿するRSSのitemをノードウォーキング
- 投稿するフィールドの文字列とtwitterの直近のツイートを文字列比較する(PostCheck関数内のmb_strposにて)
- 未投稿だったら、投稿処理
- 投稿済みだったら、投稿処理をしない
- 投稿するRSSのノードを全て検索し終えた段階で終了
ポイントは投稿済みか未投稿かの判断をするための差分検知です。
起動方法
これで投稿したい時間にこのプログラムを蹴ることが出来れば、RSSの差分を検知して、twitterへRSSの情報を投稿します。
トラックバック - http://d.hatena.ne.jp/hebita164/20091128/1259376498




