December 31, 2007

特定のキーワードにマッチした内容の記事をTumblrやMovableTypeに自動的に投稿する

via 特定のキーワードにマッチした内容の記事をTumblrやMovableTypeに自動的に投稿する@空即是色

ぷ.jpの活動にインスパイアされたので、RSSフィードから、特定のキーワードにマッチした内容の記事をTumblrやMovableTypeに自動的に投稿するプログラムを作ってみた。 例えば、自分がよく読むブログからprocessingに関連した記事を抽出してTumblrに自動的にブックマークする。と言ったことができたり、MovableTypeに自動的に投稿して紹介することでprocessingの日本語情報ポータルを運営する。と言ったことができると思う。 汎用的に使えるようにプログラミングしたつもりなので、いろいろ弄って自分用にカスタマイズしてみるとよいかも。 RSSフィードはRSS0.9とRSS1.0に対応。 投稿先のCMSは、メールで記事を投稿できる機能があるものであれば特に問わず。

デモ

nogamiのRSSリーダーから/ぷ.jp|ぷろせっしんぐ.jp|processing.org|processing.jp|processing|p5/にマッチする記事を抽出してTumblrに投稿してみた例。

ダウンロード

ライセンスはCC GNU GPLで配布。

ファイルの構成

  • autofilter.php(本プログラムの本体)
  • lastentry.dat(過去に投稿したエントリの履歴を保存しておく為のファイル)
  • magpierss(RSS パーサー)

使い方(はてなRSSリーダーに登録した記事の中からprocessingに関連するものを抽出してTumblrに投稿する場合)

  1. 自分のはてなRSSリーダーにソースとなるブログや動画を登録。
  2. ダウンロードしたファイルのautofilter.phpをテキストエディタで開いて以下の部分を編集。
    // 抽出したい記事に含まれていそうなキーワードの一覧(正規表現) $filter = "/ぷ.jp|ぷろせっしんぐ.jp|processing.org|processing.jp|processing|p5/"; // 投稿先のメールアドレス(※1) $mailAddress = "自分のTumblrの投稿先メールアドレス"; // 記事のRSS(RSS0.9とRSS1.0に対応) $rssPath = "http://r.hatena.ne.jp/(自分のはてなID)/rss"; // 投稿履歴を保存しておく為のファイル $lastEntryDataPath = "lastentry.dat";
  3. 保存してサーバーにファイルを全てアップロード。
  4. cronを設定して定期的にautofilter.phpを実行する。
  5. お茶でも飲みながら待つ。
(※1) Tumblrの場合は、Account → Extras → Mobile Postingに投稿用のメールアドレスが記されているはず。

いろいろな使い方

上記は、はてなRSSリーダーからTumblrに投稿する場合の例だけど、他にもこんな使い方ができると思ふ。
  • ソースとなるRSSフィードの例
    • RSSリーダー
    • ニュース検索
    • ブログ検索
    • 動画
    • ソーシャルブックマーク
    • 誰かのブログ
    • 誰かのWiki
  • 投稿先の例
    • Tumblr
    • MovableType ※MTmailを使用
    • 自分のメールアドレスとかどっかのコミュニティのメーリングリスト
お奨めは、はてなRSSリーダーを使って、ある程度ソースを精査してからキーワードでフィルタリングした記事をTumblrやMovableTypeに投稿する方法。 この方法だと、はてなRSSリーダーでソースの管理ができるし、RSS0.9とRSS1.0以外(ATOMとか)の記事も対象にできると思うので。

複数のソース(RSS)から抽出する場合

はてなRSSリーダーを使わず直接特定の複数のブログからぶっこ抜きたいという人にはこんな方法もご紹介。 autofilter.phpのmainプログラム部分を次のように修正。
// 記事のRSS(RSS0.9とRSS1.0に対応) $rssPathArr = array( "http://feeds.japan.cnet.com/cnet/rss", "http://rss.rssad.jp/rss/itmatmarkit/rss2dc.xml", "http://www.pheedo.jp/f/slashdot_japan" );
foreach($rssPathArr as $rssPath){ $autoFilter = new AutoFilter($filter, $mailAddress, $rssPath, $lastEntryDataPath); if($autoFilter->load()){ $autoFilter->update(); } }