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 をまったく処理できなかったという経験があるので、似たようなもんかなーと。 

More

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Develop Document Jekyll