@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短縮サービスはTwitterのAPIと同じ感じで、BASIC認証/POST投稿の方式にしています。
*1:最後に投稿した記事の情報をメモしているだけ