いまさら聞けない? 初心者向けPlagger設定覚え書き その2

昨日書いたその1は多くの人に読んでもらえたようで、改めてPlaggerに対する興味の高さを確認しました。いじってみたいけど敷居が高いという人が多いんだなーと実感。Windowsでも簡単にインストールできるようなので試してみたらどうかと思います。すっごくたのしいから! 別にPlaggerコミュニティのまわしもんでもなんでもないけど。


その1ではFilter::EntryFullText(以下:EFT)について説明しました。これは指定したHTMLからサイト内部のリンク先を抽出して指定されたルールに従って内容を持ってくるフィルタです。EFTを使って企業ニュースサイトの見出しページを読み込んでその日のニュースを引っ張ってくることができました。しかし、EFTでは外部サイトのリンクには対応できませんでした。これでは個人ニュースサイトに対応できません。そこで今回はCustomFeed::Configを取り扱ってみようと思います。


前置きが長くなりました。さて、CustomFeed::ConfigはPlaggerをインストールしただけでは使うことができません(バージョン0.7.11現在)。CustomFeed::Configの最新版はSeacolor's Labs.さんが公開しています。

まず枠で囲まれたPerlのコードをエディタにコピーして「Config.pm」という名前で保存します。これをPerlのディレクトリ内にある Plagger/Plugin/CustomFeed/ にコピーします。Plagger/Plugin/CustomFeed/ は、Linuxなら「/usr/lib/perl5/site_perl/5.8.x/」の下、cygwinなら「C:\cygwin\lib\perl5\site_perl\5.8」の下、ActivePerlなら「C:\Perl\site\lib」の下だと思います(cygwinとActivePerlはCドライブ直下に入れた場合)。 そしてPlaggerのassetsディレクトリの中に「CustomFeed-Config」という名前のディレクトリを作ります。ここが抽出動作の指定をするyamlファイルの保存場所になります。これで準備完了です。


まなめはうすさんからニュースを抽出するCustomFeed::Config用のファイルを作ってみました。
maname.yaml

author: Toshi
match: http://homepage1\.nifty\.com/maname/
extract: <DIV CLASS="news">(.*?)<BR /><A HREF="https?://[^"]*">(.*?)</A><BR />.*?<DIV CLASS="newsc">(.*?)</DIV>
extract_capture: title link body

このファイルをさっき作ったCustomFeed-Configディレクトリに適当な名前で保存します。

match
指定したURLにマッチした場合にこのスクリプトが発動します。EFTのcustom_feed_handleと同じ。
extract
指定した文字列にマッチした場合、カッコで括られた部分を抽出する。EFTと違うのはmatchで指定したページのリンク先ではなく、マッチしたページから抽出するという点。
extract_capture
extractで取り出したテキストを結果としてどの部分に使うか指定する。この例では1つめをtitle、link、bodyという名前を付けている。EFTと同じ。このyamlではニュースの見出しをtitleに、コメントをbodyに、リンク先URLをlinkに指定しています。


これを動かすためのconfig.yamlは↓のような感じ。

global:
  assets_path: /PATH/Plagger/assets
  timezone: Asia/Tokyo
  log:
    level: debug

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://homepage1.nifty.com/maname/

  - module: CustomFeed::Config

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: Publish::Gmail
    config:
      mailto:   xxx@gmail.com
      mailfrom: xxx+plagger@gmail.com

EFTの場合と違うのは「module: Filter::EntryFullText」のかわりに「module: CustomFeed::Config」が入っているところ。これによって上で保存したファイルが発動してマッチする領域をメールしてくれます。


上の設定では単純にニュース見出し+コメントをURLと一緒に送ってくれるだけです。せっかくPlaggerなんですかららしいこと(?)をしようってことでリンク先も抽出するようにしてみます。↓のスクリプトを「Publish::Gmail」の前あたりに挿入するだけ。すごいぜPlagger

  - module: Filter::EntryFullText
    config:
      store_html_on_failure: 1

  - module: Filter::BreakEntriesToFeeds

その1で使ったものばかりです。「Filter::EntryFullText」を指定することでlinkに入っているURLから抽出してくれます。1通のメールにしてしまうと長くなるので分割するために「Filter::BreakEntriesToFeeds」を入れました。
しかしリンク先を持ってくるようにするとbodyに入れたコメントが消えてしまいます(Filter::EntryFullTextが上書きする?)。これを回避するためにmaname.yamlを書き換えましょう。

author: Toshi
match: http://homepage1\.nifty\.com/maname/
extract: <DIV CLASS="news">(.*?)<BR /><A HREF="https?://[^"]*">(.*?)</A><BR />.*?<DIV CLASS="newsc">(.*?)</DIV>
extract_capture: title1 link title2
extract_after_hook: $data->{title} =  $data->{title1} . "<br /><span style=\"font-weight:normal;font-size:11px;\">" . $data->{title2} . "</span>"

bodyにすると消えてしまうので、titleにすることにしました。そのままではtitleが2つになってしまうためtitle1、title2として「extract_after_hook」を使って2つを結合してtitleにしています。

extract_after_hook
extract_captureで保存した文字列をPerlの文法を使って操作することができる。ここではtitle1とtitle2の間に<br />とGmail上で太字になることを回避するタグを入れてtitleに代入。このとき、extract_captureで指定した名前がxxxなら$data->{xxx}という変数を使う。最終的に反映されるのは、$data->{title}、$data->{body}、$data->{link}、$data->{icon}、$data->{author}。(他にもあったら教えてください。)


実はここで紹介したスクリプトには問題があります。1つはまなめさんの「日記」・「ことば」が読めないこと。もう1つが致命的で、extractの正規表現がうまくいっていないため日付の変わるところで取得がおかしくなってしまいます(bodyが消えてしまう関係でリンク先を持ってくるようにすると実用に耐えたりします)。これを解決するためにはもうひと工夫必要です。長くなってしまったのでそれについてはまた明日、その3で説明したいと思います。

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