トップ «前の日記(2008-08-14) 最新 次の日記(2008-09-01)» 編集

2008-08-24 [長年日記]

_ Yapra で FreeNAS News の野良 feed を作った

※ 2010-06-22 に feed 生成をやめました。今は blog の feed を購読してます。

FreeNAS


先日からちょっと気になっていたことがありまして。それは何かというと、なんでオレ FreeNAS の情報に疎いんだろう?ということなんですが、はたと気づきました。

Feed 購読してねぇ! てゆーか News の Feed がねぇ!

で、ないものは作ろうと。

ブツはこの上の階層にあります。

FreeNAS News unofficial feed

ここの日記データは毎日昼過ぎくらいにバックアップしてるんですけど、そのとき同時にこの feed を更新することにしました。つまり1日1回。まぁそんなもんでいいかなーと。

※ 本当は最初は Yahoo! Pipes で作ろうと思ったんですよ。自分で feed を更新し続けるのもだるいし、Yahoo! に任せちゃえと思ったんですが、なぜか Fetch Page しても failed to parse non HTML page と怒られまして。試しに validate サービスに掛けると怒られるんで、なんか途中に utf-8 じゃないコードが混ざってるんだろうなぁと思って*1 自分の手元でやってみることにしました。

で、これの作成に先日から入れ込んでいる yapra を使いました。YAML ファイル(これなんて呼ぶの?)は以下のようになります。

- module: Feed::Custom
  config:
    base_url: http://www.freenas.org/
    url: http://www.freenas.org/index.php?option=com_content&task=category&sectionid=1&id=1&Itemid=24
    extract_xpath:
      capture: //table[@class="contentpane"]
      split: //tr
      raw_date: /td[1]/text()
      title: /td[2]/a/text()
      link:
        first_node: /td[2]/a
        attr: :href
    apply_template_after_extracted:
      title: <%= item.title.strip %>
#      link: <%= (@plugin_config["base_url"] + item.raw_link) if item.raw_link %>
      date: '<%= ( item.link ) ? DateTime.parse( item.raw_date ) : DateTime.now %>'
- module: Filter::grep
  config:
    regex: '[^\s]'
    attribute: link
- module: Filter::EntryFullText
  config:
    extract_xpath:
      raw_content: //table[@class="contentpaneopen"][2]//tr[2]/td/*
    apply_template_after_extracted:
      content_encoded: '<%= ele = Hpricot( item.raw_content ); ele.search( "script" ).remove(); ele.to_html() %>'
- module: RSS::save
  config:
    title: FreeNAS News unofficial feed
    about: http://www.freenas.org/
    link: http://aligach.net/diary/
    filename: /PATH/TO/FEED

ぼくにも EFT できたよ!

でも実は不満があって、気づいた人は気づいたと思いますが、date がうまくセットできんのです。何かの拍子にうまくセットできたときがあったように思うのですが、なんかアレコレいじってるうちに二度とうまくいかなくなってしまいました;_;(レベル低すぎ) 結構いろんなパターンで試したのですが。

いい加減イヤになって、date 待ちで公開しないよりはできた分で公開しちゃうことにしました。

で、これに関係して不安があって。というのも date がセットできない状態で1日1回更新してたら毎回全 item 更新扱いにならんかな?と。ということでまず自分でこの feed を購読して確認してみます。大丈夫そうなら報告します。

こうすれば date セットできるよ!という情報もお待ちしております。というか直したついでに代わりに feed をホストしてくれると大喜びします。

あー疲れた。もっとサクっと作れるようになりたいよ。

[2008-06-25 追記] なんか最新の item が問答無用で更新されたことになってしまう感じがしますね。やっぱちゃんと date 入れないとまずいなー。

できました。しごく単純な話で date に空のもの入れちゃダメってことでした。

今回 Feed::Custom の capture で抜き取った中身(tr, td)には News とそうでないものが混ざっています。だからこそ link と date をいったん別な変数に保存して改めて apply_template_after_extracted で正しい値をセットしているのですが、このとき毎回呼び出される date: <%= %> の中で空のデータをセットしようとする場合があり、そこでコケていました。うーん。

※ これ実は extract_xpath が今の形でなければもっと簡単に書けるんですけど、その話は次回にします。

[2008-09-03 追記]

いつの間にか link に絶対 URI がはまるようになっていたので対応。

[2008-09-06 追記]

content から <script> を除去。どうも spam 対策に script に毎回違うパラメータを埋め込んでメールアドレスを表示していたらしく、その部分の HTML が毎回変化していっつも新着情報として表示されていた模様。

奥が深い。

でも Yapra::Plugin::MechanizeBase を積んだ Yapra は Hpricot でグリグリし放題だから楽ちんだね! (正規表現だけで正確に <script> だけ除去しろと言われたらイヤだ。)

*1 以前 nkf 2.0.4 辺りでテキストじゃないコードが混ざっていると落ちて fetch した HTML をまったく処理できなかったという経験があるので、似たようなもんかなーと。

本日のツッコミ(全4件) [ツッコミを入れる]
_ Yuanying (2008-08-25 12:08)

date: '<%require "date";%><%= if item.raw_link; DateTime.strptime(item.raw_date.strip, "%A, %d %B %Y").to_s; else; DateTime.now.to_s; end%>'<br><br>dateはこんな感じで取得できました、かなり変態的ですが…。<br><br>item.dateが受け取るオブジェクトがイマイチよくわかりませんねー。なんで Date.now で駄目なんだろ。

_ wtnabe (2008-08-25 15:23)

おぉ、ありがとうございます。そうなんですよね、なんか普通にオブジェクトを渡せたような気がするのですが、パタッと動かなくなってしまいまして。rss/1.0.rb とか dublincore.rb とかザッと読んだけどよく分からず。また調べてみます。

_ wtnabe (2008-08-25 23:21)

できました。require 'date' はなんか要らないみたいですけど、これはバージョンによるのかな? あちこち grep しても require しているところもなさそう。

_ Yuanying (2008-08-26 09:08)

おお、dateがきれいにまとめられてるw