復興ログ

未来の被災地にいるアナタと数十年後のキミたちへ。すべての記録を残します。

PHP 80行で作るTwitterへRSSを投稿するbot

石巻かほくさんの見出しをtwitterへ投稿する仕組みを作ってみました。→ @isnmk_kahoku
個人的にRSSは、なかなか読みません。
そこで、twitterに投稿するbotにしてしまえば、タイムライン上でだらだらと、目にすることができるので情報収集がしやすくなります。
今回投稿したRSSは自分で作っている蛇田.jp石巻かほくRSSです。

いくつかRSSを投稿するbotを作成したのですが、手法が固まってきたのでメモ!

確認点

利点

  1. DBを使用しない
  2. 数行修正するだけでRSSを投稿できる

といった点です。

ただ、PHPの最強関数の
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

処理概要

処理の大まかな流れ

  1. 変数設定
  2. 投稿するRSSの取得
  3. 投稿するtwitterアカウントのAPIを使用し、直近数件のツイートを取得
  4. 投稿するRSSのitemをノードウォーキン
  5. 投稿するフィールドの文字列とtwitterの直近のツイートを文字列比較する(PostCheck関数内のmb_strposにて)
  6. 未投稿だったら、投稿処理
  7. 投稿済みだったら、投稿処理をしない
  8. 投稿するRSSのノードを全て検索し終えた段階で終了

ポイントは投稿済みか未投稿かの判断をするための差分検知です。

起動方法

これで投稿したい時間にこのプログラムを蹴ることが出来れば、RSSの差分を検知して、twitterRSSの情報を投稿します。