いまさら聞けない? 初心者向けPlagger設定覚え書き その5
いまPla*1 その5です。*2
その4でSmartFeedを使った出力のまとめ方を紹介しましたが、まとめずに出力すると上書きしてしまうと書きました。まとめずに1つのconfig.yamlから複数のRSSに出力を行う方法をコメントでid:otsuneさんから教えていただきましたので紹介します。これはOtsuneさんのサイト「MYCOM野良Atomレシピ」で紹介されている方法です。この方法でもSmartFeedを用いていますが、その使い方がちょっと違います。
その4の方法(1つにまとめる)では↓のようにしていました。
- module: SmartFeed::All - module: Publish::Feed rule: expression: $args->{feed}->id eq 'smartfeed:all' config: format: atom dir: /home/toshi/public_html/feed/ title: plagger.atom
このスクリプトでは SmartFeed::All をつかって各エントリにID“smartfeed:all”を付けてそのIDであるものをまとめて出力していました。(詳しくはその4を読んでください。)別々に出力しようとすると上書きしてしまうと説明しましたが、上書きすることなく複数のフィードを出力するためにはこの方法を逆に利用します。こんな↓かんじです。
Otsuneさんのサイトからの引用・抜粋しています。
- module: SmartFeed rule: expression: $args->{entry}->link =~ m|http://journal\.mycom\.co\.jp/series/\w+/\d+/| config: id: series title: 【連載】 (MYCOMジャーナル) link: http://journal.mycom.co.jp/top/series/ - module: SmartFeed rule: expression: $args->{entry}->link =~ m|http://journal\.mycom\.co\.jp/articles/\d{4}/\d\d/\d\d/.*/| config: id: articles title: 【レポート】 (MYCOMジャーナル) link: http://journal.mycom.co.jp/top/report/ : : - module: Publish::Feed config: format: Atom dir: /home/otsune/public_html/plagger/feed filename: pcweb-mycom-%i.atom
この例ではMYCOMジャーナルのトップページからカテゴリ別のフィードを作成しようとしています。カテゴリ分けをリンクのURLで行っています。
- module: SmartFeed → rule → expression
- SmartFeedを適用するものの条件を正規表現を使って設定しています。例えば最初のところではリンク先が“http://journal\.mycom\.co\.jp/series/\w+/\d+/”を満たすものにSmartFeedを適用するようにしています。次のconfigで何をするかを設定しています。
- config → id
- 付けるidを指定しています。固有のものであればなんでもかまいませんが、あとで出力するときに使うのでわかりやすいものが良いと思います。
- config → title
- フィードのタイトルになります。
- config → link
- Atomフィードの中のlinkに入ります。
カテゴリ分けしたいものについて全部例のように書いて最終的に Publish::Feed で出力しています。
- Publish::Feed → config → filename
- ここでファイル名に「%i」を入れるとここにエントリ毎のIDをいれてファイルを出力してくれます。ですから分けた数だけAtomフィードのファイルがdirで指定したディレクトリに生成されるというわけです。
企業ニュースサイトにはカテゴリが多岐にわたって、更新頻度が多いものがあるのでその場合には分割してしまった方が整理もしやすいし読みやすくなるのではないかと思います。
また、その4でフィードをまとめる方法を使ってフィードではなく Publish::Gmail を使うことで、メールとして出力することもできると書きました。これは実際にできるのですが、過去に抽出したことのあるエントリも抽出してしまう(Dedupedによる削除がうまくできていない)という問題点がありました。具体的なconfig.yamlは↓こんな風になってます。
global: assets_path: /PATH/Plagger/assets timezone: Asia/Tokyo cache: base: /HOME/plagger-log log: level: debug plugins: - module: Subscription::Config config: feed: - url: http://www.asahi.com/science/ - url: http://www.yomiuri.co.jp/science/ - url: http://www.mainichi-msn.co.jp/science/ - module: Filter::Rule rule: module: Deduped - module: Filter::EntryFullText config: store_html_on_failure: 1 - module: SmartFeed::All - module: Publish::Gmail rule: expression: $args->{feed}->id eq 'smartfeed:all' config: mailto: [email protected] mailfrom: [email protected]
おそらくすべてのエントリにID“smartfeed:all”がついてしまうのが原因なのではないかと思います。だからDedupedで削除されても復活してしまっているような感じの挙動です。毎回ほぼ変更のないすげーデカいメールが来るので実用できではありません。そこでSmartFeed側で条件を付けることでうまくいかないか考えてぐぐってみたところ、ONE×ONEさんが「Plagger::Rule::Fresh」を使うと良いって紹介していたので使ってみました。
これが付け加えた分。プラグインの使い方はソースに書いてあることがほとんどです。といってもソースを読むわけじゃなくて最後の方の“SYNOPSIS”とかを見たら使い方が書いてあります。 というわけでPlagger本家のTracでソースをみたところこんな感じ。
# entries updated within 60 minutes - module: SmartFeed config: id: fresh-entries rule: module: Fresh duration: 60 # remove entries older than mtime of /tmp/foo.tmp - module: Filter::Rule rule: module: Fresh mtime: path: /home/toshi/plagger/tmp/news_sci.tmp autoupdate: 1
- SmartFeed → rule → module: Fresh
- ルールにモジュールFreshを使うことを設定。durtionで設定した時間内に更新されたものだけにSmartFeedを適用できる。
- SmartFeed → rule → durtion: 60
- 60分以内に更新されたものだけにSmartFeedを適用すると設定。
一端SmartFeed関係の設定を消して、これをPublish::Gmailの前に追加して実行してみたんだけど、出力は相変わらず全部まとめて古いものまで飛んでくる。tmpファイルをチェックしてみると何も書き込まれていないという状況。なにがいけないのかな? そもそも使い方が違う? むー。
いまのところとりあえずまとめずにサイト毎にメールを受け取るようにしています。
config.yamlはこんな感じです。
plugins: - module: Subscription::Config config: feed: - url: http://www.asahi.com/science/ - url: http://www.yomiuri.co.jp/science/ - url: http://www.mainichi-msn.co.jp/science/ - module: Filter::Rule rule: module: Deduped - module: Filter::EntryFullText config: store_html_on_failure: 1 - module: Widget::HatenaBookmark - module: Filter::HatenaBookmarkUsersCount - module: Widget::HatenaBookmarkUsersCount - module: Publish::Gmail config: mailto: [email protected] mailfrom: [email protected]
頻繁に更新されるものじゃないけど、更新されたら早めに知りたいから1時間毎にcronで実行しています。Gmailでメールを切り替えるのが意外と時間かかったりするのでできればひとつにまとめたいんだけど・・・。試行錯誤してできたらまた報告します。