最終兵器Plagger RSSフィード

2006-12-08

[][][]ソフトバンククリエイティブ GA Graphic ソフトバンククリエイティブ GA Graphic - 最終兵器Plagger を含むブックマーク

--追記 12/9/06

yamlが正しく表示されたりされなかったりしたんでちょいと修正しました。

--

ソフトバンククリエイティブ GA Graphicを購読

http://ga.sbcr.jp

老舗故かfeed吐いてそうではいてないんで。

indexタイトル羅列で毎日のエントリ数自体はやたら多いわけではないので、CustomFeed::Configでtitleとlinkを取得。そしてlinkからEFTbody取得。


EFTが二つあるのは、g-toysのみhtmlテンプレートが違うため。

ざっくり取ってきてafter_hookで泥臭いパースするのもアリアリなんだけど、EFTが一方でhandleできなかったら別のupgraderを使うというcool仕様なので、二つ用意してみた。


assets/plugin/Filter-EntryFullText/sbcr.yaml

# GA Graphic  http://ga.sbcr.jp
author: Tennetiss
handle: http://ga\.sbcr\.jp/[^g].*
extract: <!--本文 //-->(.*?)<!--本文 end //-->
extract_capture: body

assets/plugin/Filter-EntryFullText/sbcr2.yaml

# GA Graphic  http://ga.sbcr.jp/g-toys/*
author: Tennetiss
handle: http://ga\.sbcr\.jp/g-toys/.*
extract: <!-- NEWS END -->(.*?)<!--MOVE-->
extract_capture: body

assets/plugin/CustomFeed-Config/sbcr.yaml

# http://ga.sbcr.jp/
author: Tennetiss
match: http://ga\.sbcr\.jp/.*
extract: <h3 class="title"><a href="(.*?)">(.*?)</a>
extract_capture: link title
extract_encode: cp932
extract_after_hook: |
  $data->{link} =~ s!\./!!g;
  $data->{link} = "http://ga.sbcr.jp/" . $data->{link};

config.sbcr.yaml(の一部)

plugins:

  - module: Subscription::Config
    config:
      feed:
        - http://ga.sbcr.jp/

  - module: Filter::EntryFullText
    config:
      store_html_on_failure: 0
      force_upgrade: 1
  - module: Filter::ResolveRelativeLink

  - module: CustomFeed::Config

#  - module: Filter::BreakEntriesToFeeds
  - module: Filter::Rule
    rule:
      module: Deduped


g-toysは特に、写真が多いためかtableタグが大量に入ってるので、readerによってはややレイアウトが崩れ気味になるけど。EFTではよくあること!

実際、table内のwidthだけひっこぬいてみたりしたんだけど、あまり効果的とは言えなかったので、下手に弄らないことにした。


entryごとに日付が書いてあったらそれを取りたかったんだけど。


ちなみに、PublishをGmailにすると、初期(キャッシュなし)状態だと200は超えるくらいのentryができちゃうんで、BreakEntriesToFeeds使ってgmailsmtpを使う場合、たぶん怒られる。(自分の場合はpublish::gmailsendmail(というかexim)なので試してない。)

breakしないで送ると、クソでっかいメールになるんで、やっぱり怒られるかも。試してない。

個人的にはこれも含めてほとんどはPublish::Feedにしてるんで。

2006-11-05

[][]Tentative Name (Ver 2) Tentative Name (Ver 2) - 最終兵器Plagger を含むブックマーク

以前のものだとLDRでは具合は良かったんですが、Google Readerだとpreタグのおかげでブロック内で行が折り返さない状態だったので修正。

match: http://mew5.com/
author: Tennetiss
extract: <A name=([^>]*)></A>.*?<font color="#ffffff">(.*?)</font></td></table>[\n]<pre>(.*?)</pre>[\n]<A name=\d\d\d\d
extract_capture: link title body
extract_encode: cp932
extract_after_hook: |
  $data->{link} = 'http://mew5.com/#' . $data->{link};
  $data->{body} =~ s/[\n]/<br>/g;

pre内を引っこ抜いて、改行をbrにreplace。

あとlink取ってなかったのを修正しました。恥ず・・・

2006-09-10

[]Egone その2 Egone その2 - 最終兵器Plagger を含むブックマーク

== 10/13/06 追記 ==

egoneのパースは、Muibrogのとしさんところの方が後発な分、よろしいかと思われます。

http://d.hatena.ne.jp/toshi123/20060914#p1


一応残しておきますが。

== 追記終わり ==

そんなわけでegone用にCustomFeed作り直し。

サイト: everything is gone

http://egone.org/


package Plagger::Plugin::CustomFeed::Egone;
use strict;
use base qw( Plagger::Plugin );

use Encode;
use Plagger::Mechanize;

sub register {
  my($self, $context) = @_;
  $context->register_hook(
    $self,
    'subscription.load' => \&load,
    );
}

sub load {
  my($self, $context) = @_;
  
  my $feed = Plagger::Feed->new;
  $feed->aggregator(sub { $self->aggregate(@_) });
  $context->subscription->add($feed);
}

sub aggregate {
  my($self, $context, $args) = @_;

  my $start = "http://egone.org/";
  
  my $mech = Plagger::Mechanize->new(cookie_jar => $self->cookie_jar);
  $mech->get($start);

  my $data = decode('euc-jp', $mech->content);

  my $title;
  my $link;
  my $exception_counter = 0;

  my $feed = Plagger::Feed->new;
  $feed->title("everything is gone");
  $feed->link($start);

################
# diary parsing
################
  if( $data =~ m!<p class=["]?diary["]? .*?><b>(.*?)</b><br>(.*?)</p>!s ){
    my $entry = Plagger::Entry->new;
    $entry->title($1);
    $entry->link($start);
    $entry->body($2);
    $entry->author("316");
#        $entry->tags([$table[3]]);
    $feed->add_entry($entry);    
  }
################
# body
################
  while( $data =~ m!<tr bgcolor="#4050A0"><td (.*?)>.*?<a href="(.*?)"><font.*?>(.*?)\(.*?(<p .*?)</td>!sg ){

    if( $2 ne "" ){
      my $entrybody = $4;
      $title = $3;
      $link  = $2;
      
      if( $1 =~ m!font-size:15px!sg ) {
        if($exception_counter++ == 1){
          last;
        }
      }
      
      if( $link =~ m!^./!sg ){
        $link =~ s!./!http://egone.org/!sg;
      }
      $entrybody =~ s/style=".*?"//sg;
      $entrybody =~ s/Onmousedown=".*?"//sg;
      
#    	Plagger->context->log(info => "Entry = $entrybody");
      
      my $entry = Plagger::Entry->new;
      $entry->title($title);
      $entry->link($link);
      $entry->body($entrybody);
      $entry->author("316");
      #        $entry->tags([$table[3]]);
      
      $feed->add_entry($entry);
    }
  }
  $context->update->add($feed);
}

1;

CustomFeed::Config用ではないです。独立したCustomFeedです。

トップページのfeedを生成するんで、前verの専用CustomFeedのような「日付次第では何も拾ってこない」ということはないです。

雑記も拾って来られます。


うちのplagger環境FreeBSDなので、もしかしたらWindowsだと具合の悪いparsingかもわかりません。その時は適当に改変してください。

前Versionのは斜線ひいておきます。

2006-09-09

[][] Hjk/変人 Hjk/変人窟 - 最終兵器Plagger を含むブックマーク

CustomFeed::Config用、

変人窟のyaml

http://www.henjinkutsu.net/

match: http://www.henjinkutsu.net/
extract: <p><a name="\d\d/\d\d" .*?></a>(.*?)</p>.*?<blockquote>.*?<blockquote>(.*?)</blockquote>[\r\n|\n][ ]*</blockquote>[\r\n|\n][ ]*<hr>
extract_capture: title body
extract_encode: cp932
extract_after_hook: $data->{link} = 'http://www.henjinkutsu.net/' . $data->{link}

実はさっき楽画喜堂もやって、パターンはとれたんだけど、エントリ内にtableが多いのはまだしも、見出し以外の本文とかもh#タグ使ってるので、Publish::Gmailするとかなり悲惨なことになった。全ての文字がデカイ。

なので、これは専用のCustomFeedこしらえて置換しまくった方がいいぽいかなあ。

あと以前書いたegone.yamlはあまりうまくいってないっぽいので、なんとかします。


[]::Configのyaml書いてて気がついたこと ::Configのyaml書いてて気がついたこと - 最終兵器Plagger を含むブックマーク

色々と作成時に引っかかった部分があったんでメモ

どれもとどのつまりそのページの製作者の原因でもないし、そもそも直接plaggerとは関係ないのだけど。罠ではあるので。

改行は全て\nで処理するとダメなこともある

HMV作ってたSHIMIBOWさんも書かれている通り、CRLF(\r\n)かどうか前もって見ておくか、あるいは\r\n|\nとかに。

tbodyが入ったり入らなかったりする

table内にtbodyが入ったり入らなかったりする。ブラウザによるのか、あるいはOSによるのかまでは調べてないけど、少なくとも自分がやった中では

WindowsXP + Firefoxだとtbodyが入って、FreeBSD6.1 + plaggerだと入らない、ということがあった。

パターンを探すか、[]?とか。

勝手にtagnameをupper<->lowerする

場合がある。ブラウザソース見ると小文字にするような事があった。



今のところこんなですか。まだあったような気がするけど。

どれも、レンダリングエンジンで差違を吸収してるところなので、実際ブラウザ上での見た目には解らない。でもソースよく眺めるとなんじゃあこりゃあみたいな。

ブラウザソース表示やページ保存して眺めるよりも、結局実際に処理させるplaggerで目当てのページ拾ってきて、ソースを画面にたれ流してみるのがいいぽい。


06/09/10追記。

思い出したんで追加。

tag内でattributeの順序が変わる場合がある

たしかに、同tag内でattributeの位置が他のattributeと入れ替わろうとも、ブラウジング動作には影響ないわけだけど、parseするときは困る。

具体的にいうと、

<table style="なんちゃら;" width="なんたら" name="blahblah">

ソース表示では見えていたのが、拾ってくると

<table width="なんたら" name="blahblah" style="なんちゃら;">

になってたりした。

2006-08-31

[][]TentativeName TentativeName - 最終兵器Plagger を含むブックマーク

11/5 追記

以下のハンドラだといまいち、という方はこちら。

--------------

otsuneさんからご指摘いただいたので早速CustomFeed::Configで書き直しました。

CustomFeed::ConfigはSeacolorさんの2006-08-20 - Seacolor Labs. - Plaggerグループよりいただきました。

assets/plugins/CustomFeed-Config/sarasiru.yaml

match: http://mew5.com/
extract: <A name=[^>]*></A>(.*?<font color="#ffffff">(.*?)</font></td>.*?)<A name=\d\d\d\d
extract_capture: body title
extract_encode: cp932
extract_after_hook: $data->{link} = 'http://mew5.com/' . $data->{link}

config.sarasiru.yaml

  - module: Subscription::Config
    config:
        feed:
          - http://mew5.com/

  - module: CustomFeed::Config

Publishはお好きなもので。


[][]golgo31 golgo31 - 最終兵器Plagger を含むブックマーク

assets/plugins/CustomFeed-Config/golgo31.yaml

match: http://www.golgo31.net/
extract: <tr><td align=left valign=top width="548" bgcolor=.*?>.*?<b><font color=.*?><a name="(\d\d\d\d\d\d)".*?</font>(.*?)</font></b></td></tr>.*?(<font color="#006600">.*?</font>)</td></tr>
extract_capture: link title body
extract_encode: cp932
extract_after_hook: $data->{link} = 'http://www.golgo31.net/#' . $data->{link}

config.golgo31.yaml

  - module: Subscription::Config
    config:
        feed:
          - http://www.golgo31.net/

  - module: CustomFeed::Config
    config:
        title: golgo31

[][]Katoyuu Katoyuu - 最終兵器Plagger を含むブックマーク

assets/plugins/CustomFeed-Config/katoyuu.yaml

match: http://www6.ocn.ne.jp/~katoyuu/
extract: <TABLE BGCOLOR="#5173e6" WIDTH="100%" BORDER="0" CELLSPACING="2" CELLPADDING="0"><TR>.*?<TD.*?>.*?(<P><A NAME="\d\d\d\d"><FONT.*?>(.*?)</FONT>.*?)</TD></TR></TABLE>
extract_capture: body title
extract_encode: cp932
extract_after_hook: $data->{link} = 'http://www6.ocn.ne.jp/~katoyuu/' . $data->{link}


config.katoyuu.yaml

  - module: Subscription::Config
    config:
        feed:
          - http://www6.ocn.ne.jp/~katoyuu/

  - module: CustomFeed::Config
    config:
        title: カトゆー家断絶

[][]egone egone - 最終兵器Plagger を含むブックマーク

egoneに関しては、下のCustomFeed::egoneのままでいいかなと思ってます。クリックカウンタを殺す関係上。(酷

追記訂正:

といいつつ、結局作った。(照り

ただ、これだとみひろくんの雑記を取りに行けないんですよね。うーん。

パターンの違うエントリを同時に生成できないもんかなあ。feed分けてしまえば可能だけどそれはなんだかスマートじゃない気がする。

assets/plugins/CustomFeed-Config/egone.yaml

match: http://egone.org/
extract: <tr bgcolor="#4050A0">.*?<a href="(.*?)"><font.*?>(.*?)\(.*?(<p .*?)</td>
extract_capture: link title body
extract_encode: cp932
extract_after_hook: $data->{link} = 'http://egone.org/' . $data->{link}

config.egone.yaml

  - module: Subscription::Config
    config:
        feed:
          - http://egone.org/

  - module: CustomFeed::Config
    config:
 

[]CustomFeed::TentativeName CustomFeed::TentativeName - 最終兵器Plagger を含むブックマーク

ー`)<淡々と更新し続けるぞ雑記。ωもみゅもみゅ

も。やってみた。酷いヤツですねボクは。


package Plagger::Plugin::CustomFeed::TentativeName;

use strict;
use warnings;

use base qw( Plagger::Plugin );

use Plagger::Util;
use Plagger::Feed;
use Plagger::Entry;

use URI;

sub register {
  my ($self, $context) = @_;
  $context->register_hook(
    $self,
    'subscription.load' => \&load,
    );
}

sub load {
  my($self, $context) = @_;
    
  my $day = $self->conf->{day} || _today(time);    
  my $feed = Plagger::Feed->new;
  $feed->aggregator( sub { $self->aggregate($context, $day ); });
  $context->subscription->add($feed);
}

sub aggregate {
  my($self, $context, $day ) = @_;
  my $uri = URI->new("http://mew5.com/");
  my $data = Plagger::Util::load_uri($uri);
    
  my $title;
  my $link;

  #  <A name=2006_8_31></A>
  if( $data =~ m!<A name=$day></A>(.*?<font color="#ffffff">(.*?)</font></td>.*?)<A name=\d\d\d\d!sg ){

    my $entrybody = $1;
    
    #    	Plagger->context->log(info => "Entry = $entrybody");
    $title = $2;
    $link  = "http://mew5.com/";
    
    my $feed = Plagger::Feed->new;
    $feed->title("今日のω");
    
    my $entry = Plagger::Entry->new;
    $entry->title($title);
    $entry->link($link);
    $entry->body($entrybody);
    $entry->author("さらしる");
    #        $entry->tags([$table[3]]);
    
    $feed->add_entry($entry);
    
    $context->update->add($feed);
  }
}


sub _today {
  my @t = localtime(shift);
  my $day = sprintf("%04d_%d_%d", $t[5]+1900, $t[4]+1, $t[3]);
  return $day;
}

1;


[]CustomFeed::Katoyuu CustomFeed::Katoyuu - 最終兵器Plagger を含むブックマーク

no title

もうこうなったらガンガン行く。

package Plagger::Plugin::CustomFeed::Katoyuu;

use strict;
use warnings;

use base qw( Plagger::Plugin );

use Plagger::Util;
use Plagger::Feed;
use Plagger::Entry;

use URI;

sub register {
  my ($self, $context) = @_;
  $context->register_hook(
    $self,
    'subscription.load' => \&load,
    );
}

sub load {
  my($self, $context) = @_;
    
  my $feed = Plagger::Feed->new;
  $feed->aggregator( sub { $self->aggregate($context ); });
  $context->subscription->add($feed);
}

sub aggregate {
  my($self, $context) = @_;
  my $uri = URI->new("http://www6.ocn.ne.jp/~katoyuu/");
  my $data = Plagger::Util::load_uri($uri);

  my $title;
  my $link;
  my $firstborder = '<TABLE BGCOLOR="#5173e6" WIDTH="100%" BORDER="0" CELLSPACING="2" CELLPADDING="0"><TR>.*?<TD.*?>';

  while( $data =~ m!($firstborder((.*?)</TD></TR></TABLE>))!sg ){

    my $entrytmp = $3;
    if( $entrytmp =~ m!<P><A NAME="\d\d\d\d"><FONT.*?>(.*?)</FONT>.*?!sg ){
      
      my $entrybody = $entrytmp;
      
      $title = $1;
      $link  = "http://www6.ocn.ne.jp/~katoyuu/";
      
      my $feed = Plagger::Feed->new;
      $feed->title("今日のカトゆー");

      my $entry = Plagger::Entry->new;
      $entry->title($title);
      $entry->link($link);
      $entry->body($entrybody);
      $entry->author("カトゆー");
      #        $entry->tags([$table[3]]);
      
      $feed->add_entry($entry);

      $context->update->add($feed);
    }
  }
}

1;