SweetPotato::Plagger このページをアンテナに追加 RSSフィード

2007-01-27

[] Filter::WriteSource(仮)を使ってみた 03:42  Filter::WriteSource(仮)を使ってみた - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  Filter::WriteSource(仮)を使ってみた - SweetPotato::Plagger  Filter::WriteSource(仮)を使ってみた - SweetPotato::Plagger のブックマークコメント

つまり,

** assets/plugins/Filter-EntryFullText/hoge.yaml

hogeをfugaしてpiyoする。

>||

...

||<

こんな感じのはてな記法で書かれた部分のソースコードをファイルに保存するということかな。

このフォーマットが変わらない限りは,ファイルにコピペする手間が省けるわけだから便利だ。

サンプルconfigにうちのRSSが指定されていたので,実際に試してみた。

config.source.yaml

Filter::Ruleでソースコードが存在するエントリを絞り込んで処理したかったんだけど,両Filterのソースとプラグインの実行フェーズを見ると,

  • Filter::WriteSource: update.entry.fixup フェーズにて実行
  • Filter::Rule: smartfeed.feed フェーズにて実行

と,Filter::Ruleの方が後に実行されるらしい。それじゃあ意味ねーよということで以下のソースではFilter::Rule部分をコメントアウトしてある。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://plagger.g.hatena.ne.jp/SweetPotato/rss2
# - module: Filter::Rule
#   rule:
#     expression: $args->{entry}->title =~ /(?:scraper|upgrader)/
  - module: Filter::WriteSource
    config:
      dir: ./src

実行結果

ディレクトリ ./src/$feed_dir/$entry_dir (2つの変数にはdigestが入る)の下に,確かにファイルが生成されていた。

h4とpreの間に段落が入っている場合も,preの内容が正しく保存された。

ファイルの先頭に必ず改行が入るのはなぜだろう。まあ実行に際しては問題ないからいっか。

h4に日本語が含まれているとファイル名が化けるっぽい。「環境」が「迺ー蠅」に,「結果」が「邨先棡」になっていた。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070127

2007-01-16

[] さらに新しいCustomFeed::Configでは$data->{title}か$data->{link}を必ずセットすべし 23:18  さらに新しいCustomFeed::Configでは$data->{title}か$data->{link}を必ずセットすべし - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  さらに新しいCustomFeed::Configでは$data->{title}か$data->{link}を必ずセットすべし - SweetPotato::Plagger  さらに新しいCustomFeed::Configでは$data->{title}か$data->{link}を必ずセットすべし - SweetPotato::Plagger のブックマークコメント

さもなくばこんなエラーが出る。

Plagger::Plugin::CustomFeed::Config [error] doesn't have either 'title' nor 'link'

例えばこんなassetsは,titleもlinkも指定されていないのでアウト。

match: http://www.example.com/
extract_xpath:
  body: //div[@class='entry']

[] CustomFeed::Configをバージョンアップしたらassetsを見直した方がいいかもしれない 01:25  CustomFeed::Configをバージョンアップしたらassetsを見直した方がいいかもしれない - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  CustomFeed::Configをバージョンアップしたらassetsを見直した方がいいかもしれない - SweetPotato::Plagger  CustomFeed::Configをバージョンアップしたらassetsを見直した方がいいかもしれない - SweetPotato::Plagger のブックマークコメント

以前のCustomFeed::Config->aggregateにあったローカル変数が,新しいバージョンではなくなっていたことに気づいた。$urlとか平気でextract_after_hookに入れてたので,念のため全面的にassetsを見直し中。

あとYAMLもmatchがcustom_feed_handleに代わっていたりするから書き直さなきゃならんなー。このブログで公開してる野良assetsは「下位互換性のため」という言葉でしばらく逃げてみる(ひどい)。

誤解を招く書き方だったので追記。

YAMLは以前のCustomFeed::Configの変数名でも問題なく,かどうかは分からないけど,動作する。

けど今後は新CustomFeed::Configでの変数名を使ったほうがいいよねという話。

[] タイトル文字列のタグ除去に関する不具合報告 00:58  タイトル文字列のタグ除去に関する不具合報告 - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  タイトル文字列のタグ除去に関する不具合報告 - SweetPotato::Plagger  タイトル文字列のタグ除去に関する不具合報告 - SweetPotato::Plagger のブックマークコメント

以前のエントリのid:miyagawaさんのコメントについて,

ちなみにHTML削らなくても title は Plagger::Text という仕組みを使っているのでいい具合にあとで勝手にけずられるはず(そうでなければバグなので再現するケースを教えてください)

Plaggerグループ - SweetPotato::Plagger - HTML::ResolveLink 0.04のHTML実体参照まわりにバグ

随分遅くなりましたが,不具合が再現できたので報告します。他に必要な情報がありましたらお願いします。

不具合の内容

エントリのタイトルにHTMLタグが含まれている場合に,出力結果に本来なら削られるはずのタグが含まれてしまう。

環境

Plaggerのパージョン
>plagger -v
Plagger version 0.7.16
CustomFeed::Config

バージョン0.02を使用。

assets

CustomFeed::ConfigおよびFilter::EntryFullTextについて,自作のとらのあな用のassetsを使用。前者については,最終行のextract_after_hookをコメントアウトしたまま使用。

Publish::Gmailについて,trunkの gmail_notify.tt を使用。

config.yaml

assets_path,mailto,mailfrom,username,passwordはダミーに置き換えましたが,それ以外はそのままです。

global:
  assets_path: /path/to/assets
  timezone: Asia/Tokyo
  log:
    level: info

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.toranoana.jp/info/
  - module: CustomFeed::Config
  - module: Publish::Feed
  - module: Publish::Feed
    config:
      format: RSS
      dir: .
      filename: toranoana.rss
  - module: Publish::Gmail
    config:
      mailto: example+plagger@gmail.com
      mailfrom: example@gmail.com
      mailroute:
        via: smtp_tls
        host: smtp.gmail.com:587
        username: hogehoge
        password: ********

結果

CustomFeed::Configにより,タイトルとして抽出される部分のHTMLソース

以下のstrong要素をタイトルとして抽出するのですが,

<strong class="topictitle">
<img src="../topicicon/i_02.gif">
「今日の5の2」シリーズ続編発売!DVD「3学期」編「春休み」編発売記念 トーク&特典お渡し会 開催!
</strong>

このように,子にimg要素を含みます。

Publish::Feed→出力されたRSS

RSSのtitle要素が,

<title>&lt;strong class="topictitle"&gt; &lt;img src="../topicicon/i_02.gif" /&gt; 「今日の5の2」シリーズ続編発売!DVD「3学期」編「春休み」編発売記念 トーク&特典お渡し会 開催! &lt;/strong&gt;
</title>

このように,実体参照交じりのものになります。

Publish::Gmail→Gmailでの閲覧結果

f:id:SweetPotato:20070116001840p:image

タイトルの先頭に壊れた(リンク先が存在しない)画像が表示されます。

CustomFeed::Config用assetsのコメントアウトを取り除いた場合

タイトルからタグが取り除かれ,Gmailで閲覧しても上記の壊れた画像は表示されなくなります。

SeacolorSeacolor2007/01/18 12:46> $data->{title}と$data->{link}が必須
 これは仕様だったのですが外した方が良いでしょうか?
titleやlinkがセットされないケースを想定していなかったのですが……。

SweetPotatoSweetPotato2007/01/18 22:56「情報本体が得られればそれで」的思考でtitleをセットしないってことはあるかもしれません。linkもFilter::ForcePermalink(自作野良プラグイン)とかで適当にセットしたり。
ただ,それが仕様であるのなら無理に変更される必要はないと思います。必要であれば個々人でソース書き換えてカスタマイズできますし。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070116

2007-01-15

[][][] scraper and upgrader とらのあな インフォメーション 00:10  scraper and upgrader とらのあな インフォメーション - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  scraper and upgrader とらのあな インフォメーション - SweetPotato::Plagger  scraper and upgrader とらのあな インフォメーション - SweetPotato::Plagger のブックマークコメント

フィードが提供されるようになったので今後はそっちを使えばいいと思うよ。

EFTは引き続き使えると思う。思うってだけで確認はしてないけど。

とらのあな インフォメーションの3カラムの中央を解析し,トピックごとにエントリ化するCustomFeed::Config用のassetsと,フェア情報や『とらだよ。』『虎通』の本文を取得するEFT用のassets,およびプライズ情報の本文を取得するEFT

assets/plugins/CustomFeed-Config/toranoana_info.yaml

extract_after_hookがコメントアウトされている理由は次のエントリで。

# author: SweetPotato
match: http://www\.toranoana\.jp/info/(?:index\.html)?$
extract_xpath:
  title: //table[@class='topictable']//strong[@class='topictitle']
  icon: //table[@class='topictable']//div[@class='topicicon']/img/@src
  link: //table[@class='topictable']//div[@class='topic']//a[1]/@href
  body: //table[@class='topictable']//div[@class='topic']
# extract_after_hook: $data->{title} =~ s/<.*?>//g

assets/plugins/Filter-EntryFullText/toranoana_shop_torabook.yaml

handle_forceを若干修正。

# author: SweetPotato
handle_force: http://www\.toranoana\.jp/(?:shop|torabook)/
extract_xpath:
  body: //div[@id='tab']

assets/plugins/Filter-EntryFullText/toranoana_ufo.yaml

# author: SweetPotato
handle_force: http://www\.toranoana\.jp/ufo/item_info/
extract_xpath:
  body: //table[@width='100%']

config.toranoana_info.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.toranoana.jp/info/
  - module: CustomFeed::Config
  - module: Filter::EntryFullText
  - module: Filter::ResolveRelativeLink
トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070115

2007-01-14

[][] scraper for CustomFeed::Config MOON PHASE 03:01  scraper for CustomFeed::Config MOON PHASE - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  scraper for CustomFeed::Config MOON PHASE - SweetPotato::Plagger  scraper for CustomFeed::Config MOON PHASE - SweetPotato::Plagger のブックマークコメント

断片部から移動。元の記事は削除し,はてブでフォロー。

MOON PHASEを解析し,日付ごとにエントリ化する。

assets/plugins/CustomFeed-Config/moonphase.yaml

テキストの色をできるだけ再現するためにextract_after_hookで手入れ。

サイト構造の変化に合わせて正規表現を修正。

# author: SweetPotato
match: http://www\.moonphase\.cc/$
extract: (<table width="98%".*?<a name="#(.*?)"></a>(.*?)</font>.*?</table>)
extract_capture: body date title
extract_date_format: %y%m%d
extract_date_timezone: Asia/Tokyo
extract_after_hook: |
  $data->{link} = 'http://www.moonphase.cc/#%23'.$data->{date};
  $data->{body} =~ s!<font size="2">!<font size="2" color="#FFFFFF">!g;
  $data->{body} =~ s!<a(.*?)>(.*?)</a>!<a$1><font color="#66FFCC">$2</font></a>!gs;

config.moonphase.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.moonphase.cc/
  - module: CustomFeed::Config

[][] upgrader for EFT ヤマカム 02:41  upgrader for EFT ヤマカム - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  upgrader for EFT ヤマカム - SweetPotato::Plagger  upgrader for EFT ヤマカム - SweetPotato::Plagger のブックマークコメント

断片部から移動。元の記事は削除し,はてブでフォロー。

ヤマカムを解析し,記事ごとにエントリ化する本文を抽出する

断片部時代のコードを改良した。大分すっきりしたコードになったと思う。

断片部時代にはCustomFeed::Config用のassetsもあったけど,CustomFeed::Simpleで代用できることが分かったので掲載しない。

assets/plugins/Filter-EntryFullText/yamakam.pl

日付も抽出するようにした。

# author: SweetPotato
sub handle {
    my ($self, $args) = @_;
    $args->{entry}->link =~ qr!^http://www1\.odn\.ne\.jp/cjt24200/yamada/log/\d+/index\.html#\d+$!;
}

sub extract {
    my ($self, $args) = @_;
    my $hash = ($args->{entry}->link =~ /#(\d+)/)[0];

    return unless $args->{content} =~ m!(<TABLE width="450" cellpadding="10" cellspacing="5">\s+<TBODY>\s+<TR>\s+<TD[^>]*><A name="$hash">.*?<B>(.*?)</B>.*?\n</TABLE>)!s;

    my ($body, $date) = ($1, $2);
    $date = Plagger::Date->strptime('%Y年%m月%d日', $date);
    $date->set_time_zone('Asia/Tokyo');

    return +{ body => $body, date => $date };
}

config.yamakam.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www1.odn.ne.jp/cjt24200/yamada/
          meta:
            follow_link: /log/\d+/index.html#\d+
  - module: CustomFeed::Simple
  - module: Filter::EntryFullText
  - module: Filter::ResolveRelativeLink

[][] scraper for CustomFeed::Config OHP 01:33  scraper for CustomFeed::Config OHP - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  scraper for CustomFeed::Config OHP - SweetPotato::Plagger  scraper for CustomFeed::Config OHP - SweetPotato::Plagger のブックマークコメント

assetsを若干リファクタリング。

断片部から移動。元の記事は削除。

OHPを解析し,日付ごとにエントリ化する。

assets/plugins/CustomFeed-Config/ohp.yaml

# author: SweetPotato
match: http://picnic\.to/~ohp/$
extract: <A HREF="(diary/\d{4}/\d{2}[abc]\.htm#(\d{4}-\d{4}))">(\d+/\d+.*?)</A>([^\n]*)\n</P>\n(.*?)<IMG SRC="gray\.gif" WIDTH="100%" HEIGHT="3">
extract_capture: link date title1 title2 body
extract_date_format: %Y-%m%d
extract_date_timezone: Asia/Tokyo
extract_after_hook: |
  $data->{title} = $data->{title1}.$data->{title2};
  $data->{link} = 'http://picnic.to/~ohp/'.$data->{link};

config.ohp.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://picnic.to/~ohp/
  - module: CustomFeed::Config
  - module: Filter::ResolveRelativeLink

[][] scraper for CustomFeed::Config 最後通牒 01:28  scraper for CustomFeed::Config 最後通牒 - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  scraper for CustomFeed::Config 最後通牒 - SweetPotato::Plagger  scraper for CustomFeed::Config 最後通牒 - SweetPotato::Plagger のブックマークコメント

assetsを若干リファクタリング。

断片部から移動。元の記事は削除。

最後通牒フレーム内ページを解析し,日付ごとにエントリ化する。

assets/plugins/CustomFeed-Config/saigotsucho.yaml

# author: SweetPotato
match: http://www10\.ocn\.ne\.jp/~comic/top\.htm$
extract: <A name="(\d{8})">.*?<A HREF="(#\d{8})" TARGET="_self"><FONT.*?><B>(.*?)</B>.*?</TABLE>(.*?)<A HREF="#zakki" TARGET="_self">
extract_capture: date link title body
extract_date_format: %Y%m%d
extract_date_timezone: Asia/Tokyo
extract_after_hook: $data->{link} = 'http://www10.ocn.ne.jp/~comic/top.htm'.$data->{link};

config.saigotsucho.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www10.ocn.ne.jp/~comic/top.htm
  - module: CustomFeed::Config

2007-01-12

[] みんないつPlaggerを定期実行してる? 19:11  みんないつPlaggerを定期実行してる? - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  みんないつPlaggerを定期実行してる? - SweetPotato::Plagger  みんないつPlaggerを定期実行してる? - SweetPotato::Plagger のブックマークコメント

私は1日4回,こんな感じに。

  • 8:00: 朝大学で読む(朝Pla)
  • 12:00: 昼休みに読む(昼Pla)
  • 18:00: 帰宅して夕飯前に読む(夕Pla)
  • 22:00: メインサイトの更新前に読む(夜Pla)

少し前までは0:00や2:00にも実行してたけど,夜更かしの原因になるのでやめた。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070112

2007-01-10

[] はてなカウンターの解析ログを自動的に取得し,新たなサイトからのリンクを出力する 20:14  はてなカウンターの解析ログを自動的に取得し,新たなサイトからのリンクを出力する - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  はてなカウンターの解析ログを自動的に取得し,新たなサイトからのリンクを出力する - SweetPotato::Plagger  はてなカウンターの解析ログを自動的に取得し,新たなサイトからのリンクを出力する - SweetPotato::Plagger のブックマークコメント

はてな外ならtrack feedがあるんだけどなあ。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070110

2007-01-09

[][] scraper for CustomFeed::Config TINAMI ちえりリスト 01:06  scraper for CustomFeed::Config TINAMI ちえりリスト - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  scraper for CustomFeed::Config TINAMI ちえりリスト - SweetPotato::Plagger  scraper for CustomFeed::Config TINAMI ちえりリスト - SweetPotato::Plagger のブックマークコメント

TINAMIのちえりリストを取得し,更新ページごとにエントリ化する。最新~過去24時間,過去24~48時間,RSS更新リストに対応。authorをセットするのでCustomFeed::Configは新しいものを使うこと。現時点での最新バージョンは0.02

assets/plugin/CustomFeed-Config/tinami_chierilist.yaml

神経質にも程があるextract。

# author: SweetPotato
match: http://www\.tinami\.com/chieri/list_(?:new|old|rss)_[a-e]\.html$
extract: <TD ROWSPAN=3 WIDTH=80 ALIGN="right" VALIGN="top">.*?<IMG SRC="(.*?)".*?<SPAN CLASS="chielink"><A HREF="(.*?)">\s*(.*?)\s*</A>.*?\n\s*(.*?)\s\x{3055}\x{3093}.*?</TD>.*?<TD ALIGN="left".*?>\s*(.*?\s.*?)\s.*?<TD ALIGN="left".*?>(.*?)</TD>
extract_capture: icon link title author date body
extract_date_format: %Y/%m/%d %H:%M:%S
extract_date_timezone: Asia/Tokyo
extract_after_hook: $data->{link} = 'http://www.tinami.com'.$data->{link}

assets/plugin/Filter-TruePermalink/tinami_launcher.yaml

おまけとして作成。Filter::TruePermalinkのためのassets。リダイレクタURLを本来のページそのもののURLに変換。使用はお好みで。

# author: SweetPotato
match: http://www\.tinami\.com/cgi-bin/launcher\?
query_param: URL

config.tinami_chierilist.yaml

上にも書いた通り,Filter::TruePermalinkの使用はお好みで。RSS更新リストを取得する場合はFilter::ResolveRelativeLinkを使うのが吉。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.tinami.com/chieri/list_new_a.html
        - url: http://www.tinami.com/chieri/list_new_b.html
        - url: http://www.tinami.com/chieri/list_new_c.html
        - url: http://www.tinami.com/chieri/list_new_d.html
        - url: http://www.tinami.com/chieri/list_new_e.html
        - url: http://www.tinami.com/chieri/list_old_a.html
        - url: http://www.tinami.com/chieri/list_old_b.html
        - url: http://www.tinami.com/chieri/list_old_c.html
        - url: http://www.tinami.com/chieri/list_old_d.html
        - url: http://www.tinami.com/chieri/list_old_e.html
        - url: http://www.tinami.com/chieri/list_rss_a.html
        - url: http://www.tinami.com/chieri/list_rss_b.html
        - url: http://www.tinami.com/chieri/list_rss_c.html
        - url: http://www.tinami.com/chieri/list_rss_d.html
        - url: http://www.tinami.com/chieri/list_rss_e.html
  - module: CustomFeed::Config
  - module: Filter::ResolveRelativeLink
  - module: Filter::TruePermalink
トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070109

2007-01-04

[] ルー語変換 00:18  ルー語変換 - SweetPotato::Plagger を含むブックマーク はてなブックマーク -  ルー語変換 - SweetPotato::Plagger  ルー語変換 - SweetPotato::Plagger のブックマークコメント

あとはFilter::Kansaiに続くFilter::Lou(ルー語変換)の開発が待たれる所です。トゥギャザーしようぜ。

なつみかん@はてな - Plaggerはこんなに便利

わざわざMeCabを使うのもだるいんで,Webのルー語変換に対して本文をPOST→レスポンスのHTMLを切り出して本文にセット,でうまくいくんじゃないかと思った。HTMLタグの処理が面倒だなあと思ったけど,上のルー語変換はタグを無視して本文だけ上手く処理してくれているみたいだし。

トラックバック - http://plagger.g.hatena.ne.jp/SweetPotato/20070104