あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

ハイクの投稿をTwitterに転送するスクリプト

@tmftake氏or id:tmftake氏からのリクエストでハイク→Twitter転送のソースを晒してみる。
とはいえ、よく考えたらhl2mixiからソース削っただけだった件。RSS拾って、Twitterに投げるだけなので、他のRSSでも使えるんじゃないかしら。
続きにソースとインストール方法。

How to use.

  • ディレクトリを掘る。
    • ディレクトリ「アッー!」
  • 掘ったディレクトリの中にスクリプトを入れる。
  • まずは1回コマンドを叩く。latest.txtって言うのが作られる*1よ。
$ php haiku-twit.php
  • crontabに1行入れとく。例えばこんな感じ。
 */4 * * * * php /home/akkie/hatena-twit/hatena-twit.php

あ、phpスクリプトだけど、Webから実行する物じゃないので、URLでアクセス出来るようなところに置かないでね。

Script

<?php

/* 次のライブラリが必要です。
   * XML/RSS
        http://pear.php.net/package/XML_RSS
*/


/* -- 設定項目 ---------------------------------------------- */

	/* RSSのURL */
	$rssurl = "http://h.hatena.ne.jp/Akkiesoft/.rss";

	/* Twitter User name */
	$username = "ID";

	/* Twitter Password */
	$password = "Password";

/* ---------------------------------------------------------------- */

	require_once("XML/RSS.php");
	require_once 'HTTP/Request.php';

	mb_http_output ( 'UTF-8' );

	$dir = dirname(__FILE__);			/* スクリプトを置いているディレクトリ */
	$datfile = $dir . "/latest.txt";

	/* -- RSSの取得 -- */
	$rss =& new XML_RSS($rssurl);
	$rss->parse();
	$rssdata = $rss->getItems();
	$rssinfo = $rss->getChannelInfo();
	$blogname = $rssinfo['title'];

	/* -- ステータスファイルの読み込み -- */
	if (file_exists($datfile)) {
		$latest = file_get_contents($datfile);
	} else {
		$latest = strtotime($rssdata[0]['pubdate']);
		file_put_contents($datfile, $latest);
		print(
			"RSSの監視を開始しました。\n" .
			"最新のエントリー投稿日: ". $rssdata[0]['pubdate'] . "\n" .
			"これより新しいエントリから通知を送信します。"
		);
		exit;
	}

	$out = "";
	$cnt = 0;
	$flag = 0;
	foreach ($rss->getItems() as $item) {
		/* -- 記事投稿日時の取得 -- */
		$date  = strtotime($item['pubdate']);
		if ($date <= $latest) { break; }

		/* -- タイトルは1コまで。  -- */
		if ($flag == 1) { $out .= ""; break; }

		/* -- 記事データの取得 -- */
		$title = $item['title'];
		$desc  = strip_tags($item['description']);
		$desc  = mb_strcut($desc, 0, 260);

		/* -- Twitの生成 -- */
		$out .= "[$title]$desc";
		$flag = 1;
	}

	if ( $out == "" ) {
		exit;			// 更新無し、終了
	}

	/* -- ステータスファイルの更新 -- */
	$latest = strtotime($rssdata[0]['pubdate']);
	file_put_contents($datfile, $latest);

	/* Twitterに投稿 */
        $req = new HTTP_Request();
        $req->setMethod(HTTP_REQUEST_METHOD_POST);
        $req->setBasicAuth($username, $password);
        $req->addPostData('status', $out);
        $req->setURL('http://twitter.com/statuses/update.xml');
        $res = $req->sendRequest();
        if(PEAR::isError($res)) {
          var_dump($res);
          exit;
        }

	exit();

?>

URL短縮がない件

アレはまた別スクリプトなので、該当部分はソースから削っています。
ちなみに、自前URL短縮サービスはTwitterAPIと同じ感じで、BASIC認証/POST投稿の方式にしています。

*1:最後に投稿した記事の情報をメモしているだけ