2006-09-16
いまさら聞けない? 初心者向けPlagger設定覚え書き その5
その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: xxx@gmail.com
mailfrom: xxx+sciencenews@gmail.com
おそらくすべてのエントリに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: xxx@gmail.com
mailfrom: xxx+news@gmail.com
頻繁に更新されるものじゃないけど、更新されたら早めに知りたいから1時間毎にcronで実行しています。Gmailでメールを切り替えるのが意外と時間かかったりするのでできればひとつにまとめたいんだけど・・・。試行錯誤してできたらまた報告します。


些細なことかもしれませんが、正確に理解されている方が、より使いこなせると思いますので、老婆心ながら…
- module: Filter::Rule
rule:
module: Deduped
を
- module: SmartFeed
rule:
module: Deduped
にして、
Publish::Gmail に
rule:
expression: $args->{feed}->id eq ’smartfeed:Deduped’
をつけるといけるような気がしますが、どうでしょうか?
この際、フィードのタイトルが Entries Deduped entries になってしまうので、
- module: SmartFeed
rule:
module: Deduped
config:
title: 適切なタイトル名
と設定することをおすすめします。
config.yamlについてですが、これはSmartFeedでひとまとめにするときにDedupedで重複を削除すると、IDとしてsmartfeed:Dedupedが付加されるということですね。 ようやくSmartFeedについてわかったような気がします。ご丁寧なご指摘ありがとうございました。