読者です 読者をやめる 読者になる 読者になる

いまさら聞けない? 初心者向け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:   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でメールを切り替えるのが意外と時間かかったりするのでできればひとつにまとめたいんだけど・・・。試行錯誤してできたらまた報告します。


いまPla シリーズ 目次はこちらから

*1:いまさら聞けないPlagger

*2:昨日の夜中、はてな落ちてたのかな? 更新できなかったからこれ昨日分で。