hnwの日記

それPlaレシピ(その1)RSSを全文入りに

僕はいつも流行に二周り乗り遅れるような超保守的人間なのですが、最近困ったことがあると耳の奥から「それPla」と聞こえてくる奇病にかかりました。今頃こんな病気にかかるなんて流行遅れにもほどがありますよね。ま、かかってしまったものは仕方ないですし、治るまではこの病気をエンジョイしようと思います。


それはそれとして、Plaggerについて調べていて思ったことは「それPla」という単語の知名度の割には意外と処方箋が少ないなあ、ということです。というのは、ピザが届くとか寿司が届くとかは見つかるんですけど、サンプルとしてPlagger初心者には高度すぎると思うんですよね。それどころか、Publish::Gmailでメールを送るのさえ最初は高度だと思うんです。


というわけで、超初心者にもすぐ役に立つPlaggerレシピ集みたいなものを連載してみようかと思います。似たコンセプトの記事が「いまPla」だと思うんですけど、僕のやりたいことがそのまま書いてあるわけでも無かったので、僕なりのまとめを作ってみます。


まず最初に。僕が思うに、Plagger初心者に最初に伝えるべきことって右の絵だと思うんですよね。


Plaggerの基本はRSSを加工してRSSを作ることなんです!Plaggerの凄さはそれだけじゃ伝えられないとは思いますけど、最初はそう言い切っちゃった方が伝わるんじゃないでしょうか。


というわけで、LDRで読んでいるRSSを改造して今以上に快適になりましょう!具体的には、「セキュリティホールmemo」さんのRSSを改造します。


LDRに慣れて来るとLDRの中だけで全部済ませたい気分になってくるんですが、このサイトのRSSは本文が1文字も含まれていないので、毎回「v」を押して元の記事を読まないといけないんですよね*1。それがどうも不満だったので、タイトルだけのRSSから記事全文を含むRSSを作り出すのをPlaggerでやってみましょう。


このような場合、Filter::EntryFullText(以下EFTと略します)を利用してpermalink先のHTMLから抜き出す箇所をXPathで指定する、という解決策が考えられます。通常であれば、YAMLファイルを2個(Plaggerのconfigと、EFTの該当サイト用)用意するだけで簡単に全文つきRSSにアップグレードできるはずです。


ところが、今回の改造対象の「セキュリティホールmemo」ではpermalinkがfragment付きのURLで、複数記事を含んだページの一部が1つの記事の本文なんですよね。こういうパターンだとXPathで抜き出す場所を指定するのは不可能です。こういう場合にどうするのが一番正しいのかイマイチわからなかったのですが、EFTを使い、YAMLではなくPerlスクリプトを書いて対応することにしました。

global:
  assets_path: /home/hnw/.plagger/assets
  timezone: Asia/Tokyo
  log:
    level: error
  cache:
    base: /home/hnw/.plagger/cache
    expires: 259200

↑config/base-config.yaml。何個もYAMLを書くつもりなら、共通設定は別ファイルに抜き出した方が良いと思います。

include:
  - /home/hnw/.plagger/config/base-config.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.st.ryukoku.ac.jp/~kjm/security/memo/memo.rdf
  - module: Filter::EntryFullText
  - module: Publish::Feed
    config:
      format: RSS
      dir: /home/hnw/www/
      filename: secmemo.rss

↑config/secmemo.yaml。この設定でRSSを改造します。

# author: hnw
sub handle {
    my($self, $args) = @_;
    $args->{entry}->link =~ qr!^http://www\.st\.ryukoku\.ac\.jp/~kjm/security/memo/\d+/\d+\.html#.*$!;
}
sub extract {
    my($self, $args) = @_;
    if($args->{entry}->link =~ m!#(.*)$!) {
        my $fragment = $1;
        if ($args->{content} =~ m|(<h3>((?!</?h3).)*<a[^>]*\sname="\Q$fragment\E"[^>]*>((?!<h[r3]).)*)|is) {
            my $body = $1;
            return "<div>$body</div>";
        }
    }
    return;
}

↑assets/plugins/Filter-EntryFullText/secmemo.pl。EFTによる変換内容を記述するスクリプトです。単にURLのfragment部分を正規表現で抜き出して、本文を抜き出す正規表現を作り出しているだけです。


そんなわけで、下記が「セキュリティホールmemo」さんの全文入りRSSです。現状10分に1回再作成しています(実際には上より少しだけ複雑な処理をしています)。

  • と思ったのですが一端URLを削除いたします。


また、僕が読んでいる中では「どさどさにっき(SP1)」さんも本文無しのRSSだったので、同様に全文入りRSSを作ってみました。

全くどうでもいいことなのですが、日記タイトルが変わってもRSSのtitleは変わらないんですね…。


ちなみに色々な場所からパクって作っているので、カッコいい悪いなどは全くわかっていません。達人の方のアドバイスなど頂ければ助かります。



追記(2008/05/05):「どさどさにっき(SP1)」さんでフォロー記事を書いて頂きました。長い事放置していてすみません。

http://ya.maya.st/d/200803b.html#s20080312_2

内容についてはその通りだと思います。RSSが有害なJavascript含んでたりしたらどうするんだ、って心配は非常にもっともですし、赤の他人がRSSを作っちゃうってことは危険性が増えるってことですよね。僕はそんなことをする気はないですけど、僕を信用していいのかなんてネット上の大半の人にはわからないわけですから。

その話題とは別にRSSのURLを取り下げた背景として、「全文入りRSS著作権」といった内容で記事を書かなきゃな、と思っていましたが、テーマとして重すぎて記事が書けていません。不完全でもいいからまずは書くべきですよね…。

*1:一方でhttp://neun9.sakura.ne.jp/web2rss/ で配られている全文入りRSSは小ネタ入りで、僕には分量が多すぎるんです