トップページ > 空即是色 > 2007年の記事 > 特定のキーワードにマッチした内容の記事をTumblrやMovableTypeに自動的に投稿する
空即是色 特定のキーワードにマッチした内容の記事をTumblrやMovableTypeに自動的に投稿する
2007年 12月30日
ぷ.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に投稿する場合)
- 自分のはてなRSSリーダーにソースとなるブログや動画を登録。
- ダウンロードしたファイルの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";
- 保存してサーバーにファイルを全てアップロード。
- cronを設定して定期的にautofilter.phpを実行する。
- お茶でも飲みながら待つ。
(※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(); } }
トラックバック
この記事のトラックバックURL:http://null-null.net/mt/mt-tb.cgi/494
コメント
プールデザイン菅沼 (2008年03月13日)
AutoFilter を先日ダウンロードしまして、いろいろ試行錯誤しております。
しかし、素晴らしいアプリだと思いますので、是非マスターしたいと思っておりますが、現在、cronの設定までは完了しましたが、どうもMT MailからMovable Typeへの記事投稿がうまくいきません。
RSSの引用ソースははてなRSSリーダーで、phpへの設定は参考例をもとに、キーワードとMT Mailから発行される自分のメールアドレスに書き換えただけです。
MT Mail(他のメール対応型CMSもそうだと思いますが)独自の投稿形式があると思います。
例えば
?タイトル?
?内容?
など。
このあたりは、設定不要と考えてよろしいのでしょうか。
cronまでなんとか成功しただけに、後一歩という感じがしております。
ご指導いただければ幸いです。 どうぞよろしくお願いいたします。
nogami (2008年03月14日)
プールデザイン菅沼さん。
ご想像の通りMT Mail用にプログラムを一部変更する必要があります。
autofilter.phpの167行目にpostEntryというメソッドがありますので、
そこを例えば、
// エントリの投稿
function postEntry($mailAddress, $entryArr){
foreach($entryArr as $entry){
$subject = 'MT Mailの認証コード';
$body = '?タイトル?\n';
$body .= '$entry->title;\n\n';
$body .= '?内容?\n';
$body .= '<p>';
$body .= 'via ';
$body .= '<a href="' . $entry->link . '">';
$body .= $entry->title;
$body .= $entry->source == '' ? '' : ('@' . $entry->source); // sourceが無い場合がある
$body .= '</a></p>';
$body .= '<blockquote cite="' . $entry->link . '">' . $entry->description . '</blockquote>';
mb_send_mail($mailAddress, $subject, $body);
}
}
のように書き換えます。
プールデザイン菅沼 (2008年03月14日)
nogami さん。
早速、わかりやすいご回答ありがとうございました。
実はお答えを頂くまでに、いろいろ試行錯誤しておりまして、
模範のコードに近い形まで整形することができ、なんとか動くようになっていたのですが、気がつけばそこにたどり着くまでに、10時間ほどかかっておりました(汗)。
nogami さんのコードと違うところもあり、なるほど~と思いました。
最後の質問になりますが、よろしければ教えてください。
現在の機能で十分ですが、バリエーション的な使い方は出来ないかと思い書かせていただきます。
現在、RSS パーサーが新着を認識すれば、それを拾って記事を単体で追記していく仕様ですが、これをまとめる方法はないでしょうか。
例えば、RSSから新着記事をパーサーが5個発見したとして、ブログの投稿は1記事、その記事内容の中に、5つのURLタイトルと内容が入るという方法です。
(ニュースサイターが今日発見した複数のニュースを1つの記事にまとめているイメージです。)
ただ、そのまとめた記事自体のタイトルをどこから引っ張ってくるか、ということが問題になりそうですが、そもそも仕様としてカスタマイズ出来る範囲なのでしょうか。
ここまでくると、手に負えません(笑)変な日本語ですが、よろしければよろしくお願いします。
nogami (2008年03月18日)
プールデザイン菅沼さん。
>RSSから新着記事をパーサーが5個発見したとして、ブログの投稿は1記事、その記事内容の中に、5つのURLタイトルと内容が入るという方法
ですが、まず、postEntryを次のように書き換えます。
// エントリの投稿
function postEntry($mailAddress, $entryArr){
$subject = 'MT Mailの認証コード';
$body = '?タイトル?\n';
$body .= '本日(' . date('Y年n月j日') . ')のお奨めの記事\n\n';
$body .= '?内容?\n';
$body .= '<ul>';
foreach($entryArr as $entry){
$body .= '<li><a href="' . $entry->link . '">';
$body .= $entry->title;
$body .= $entry->source == '' ? '' : ('@' . $entry->source); // sourceが無い場合がある
$body .= '</a>';
$content = mb_substr($entry->description, 0, 100); // 先頭100文字だけ取得
$body .= '<blockquote cite="' . $entry->link . '">' . $content . '</blockquote>';
$body .= '</li>';
}
$body .= '</ul>';
mb_send_mail($mailAddress, $subject, $body);
}
次に、cronで1日に1回、若しくは1週間に1回などある程度の期間を置いて、autofilter.phpを実行するように設定すれば、その期間での新着記事がまとめて投稿されるはずです。
まとめた記事のタイトルについては、例えば「本日(YYYY年MM月DD日)のお奨めの記事」などにしては如何でしょう?
プールデザイン菅沼 (2008年03月25日)
nogami さん。
アドバイスありがとうございます!
自分はphpの超初心者なので、nogamiさんのおっしゃることが
そのままソースを書けば動くし、やったー!とかうれしいのですが
半分くらいしか理解できていないと思います(汗)。
今日、「やさしいphp」(ソフトバンク 2600円)を買ってきて
1から勉強をはじめました。
今は全然カスタマイズなど応用は出来ませんが、
nogamiさんのソースをサンプルにさせていただいて、自分でも
しっかり分かるように勉強していこうと思います!
今後ともどうぞよろしくお願いいたします。
yuiyui (2008年04月12日)
nogami様。
とても洗練されたコードでかっこいいです。
さっそくダウンロードして試用させていただきました!
Tumblrにはバッチリ投稿できました。すごい!!
ところが・・・wordpressのwp-mail(メール投稿)などを利用して、wordpressに投稿してみようと試したところ(フィードのitem数10程度)、再構築がなくて軽いはず!?のwordpressが落ちてしまいます。
1~2分ほど処理が続き真っ白い画面に。それを何度かしていたところ某レンタルサーバーですがphp拡張子のページがすべて500エラー処理され一定時間制限までされてしまいました。あは・・。
wordpressをはじめて数日なので原因はわからないのですが、データベースの遅さかいくつかのプラグインが毎回処理をしているためかもしれませんが。
そこで、sleep(1)などいれては見たのですが、個別にitemを投稿するのを断念して、プールデザイン菅沼さんが言われたような方法で投稿は1記事にまとめるという方法にしてみたところどうにか投稿まではできる段階に。ところが、文字化け。これはwordpress側のwp-mailが原因ということはわかっているのですがもう投げてしまいました・・。
一方的で大変恐縮なのですが・・・質問?リクエスト?させてください。
すみません。
とても長くてお恥ずかしいのですが、nogami様のAutoFilterスクリプトを利用して、1記事にまとめたものをxml-rpcでwordpressに投稿するにはどんなコードにすればいいでしょうか??
何かご教示頂けますと大変助かります。勝手なコメントで恐縮です。
よろしくお願いします。