IEでは表示がおかしいところがあるかもしれません。Firefoxを推奨します。

現在 エントリー詳細を表示しています。  | 目標1日1エントリー...

Photo
お気に入り写真
Calendar & Archives
 «
» 
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Search


BlogPet

Categories
  • モノ (1)
  • カメラ (13)
  • ゲーム (2)
  • モバイル (186)
  • 自動車 (39)
  • 自転車 (2)
  • 音楽 (10)
  • 日常 (47)
  • 健康 (106)
  • 食べ物 (18)
  • 覚え書き (2)
  • 雑記 (5)
  • Tags
    Recent Entries (modified)
    Recent Comments
    Links
    Information

    Powered by

    雑記 - 趣味は広く、浅くといきたいところ。
    主にモバイル系(ヘタレレベル)、家庭菜園(初級者)、はな(ヨーキー)の話題です。

    « ZERO3後継機はUMPC? | メイン | Plaggerで列車運行情報を取得(その後2)- 2chdat_m.pm »

    2008年01月09日

    Plaggerで列車運行情報を取得(その後)- LDTrain.pm

    以前2chdat.pmを変更してから小変更を何度か経て、そのまま運用していた。
    特に問題は出ていないように見えたが、Livedoor列車運行情報に特化しすぎていて少しもやもやしていた。

    そんな中、Livedoor列車運行情報CustomFeedの作者様からトラックバックをいただき、変更があったことを知った。
    主な変更点は、タイトルの情報を増やすこととTwitterへの投稿の部分のようだ。
    タイトルの情報については自分も少しいじっていて、ほぼ平常通りの場合は「○」、遅れがある場合は「△」などを付加していたが、LDTrain.pmではなくて2chdat.pmの方で処理していた。
    汎用性も考えると、作者にならってLDTrain.pmの方で処理した方が良いので変更した。
    変更したところは、

    • プラグインの名前
      すみません。列車関連の情報なので変えさせていただきました。
    • Feedのタイトル
      更新日時を付加した。
      sub loadのところで$ymに処理時点の日時が入っているが、形式が違うので新たに$renewaltimeを定義した。
    • FeedのDescription
      以前は2chdat_m.pmでLivedoor列車運行情報に関するテキストを直接書き出していたが、LDTrain.pmに持ってきた。
      内容的にはFeedのDescriptionではないが、他に適当なものがなかったので代用した。
    • Entryのタイトル
      以前は2chdat_m.pmで運行状態を表すシンボルを付加していたが、LDTrain.pmに持ってきた。
      本文の内容とシンボルが直感的にあっているか様子見する必要がある。
      作者みたいに【運転再開】【列車遅延】などを付加した方がわかりやすいのでどうするか迷い中。
    • パース後に取得したリストをソート
      LivedoorのサイトではJRや私鉄などで掲載が分かれているが、単純に時間の新しいものが上に来て欲しいのでソートするようにした。

    オリジナルはこちら
    以下、変更後のコード。
    作者様、本当にありがとうございました。

    package Plagger::Plugin::CustomFeed::LDTrain;
    use utf8;
    use strict;
    use base qw( Plagger::Plugin );
     
    use Plagger::Date;
    use Plagger::Util;
    use Switch;
    use URI;
     
    sub register {
        my ($self, $context) = @_;
     
        $context->register_hook(
            $self,
            'subscription.load' => \&load,
        );
    }
     
    sub load {
        my($self, $context) = @_;
     
        my $ym = Plagger::Date->now()->strftime("%y%m");
        my $feed = Plagger::Feed->new;
        $feed->aggregator(sub {$self->aggregate($context, $ym);});
        $context->subscription->add($feed);
    }
     
    sub aggregate {
        my ($self, $context, $ym) = @_;
     
        my $urls = "http://transit.livedoor.com/traffic_info/kantou";
        my $feed = Plagger::Feed->new;
        my $renewaltime = Plagger::Date->now();
        $renewaltime->set_locale("ja_JP");
     
        $feed->link($urls);
        $feed->title("Livedoor鉄道運行情報 [".$renewaltime->strftime("%m/%d(%a) %H:%M")."更新]");
        $feed->description("○:ほぼ平常通り、△:運転再開、遅れあり、×:運転見合わせ、運休");
     
        my $list = $self->parse(Plagger::Util::load_uri(URI->new($urls)));
        for my $item (@$list) {
            my $entry = Plagger::Entry->new;
            $entry->title($self->add_status($item->{body})." ".$item->{title}." [".$item->{hour}.":".$item->{min}."]");
            $entry->body($item->{body});
            $entry->date(Plagger::Date->strptime("%y%m%d%H%M", $ym.$item->{day}.$item->{hour}.$item->{min}));
     
            $feed->add_entry($entry);
        }
     
        $context->update->add($feed);
    }
     
    sub parse {
        my ($self, $content) = @_;
     
        my $list = [];
        while ($content =~ m{
    <tr>
    .*?<th.*?>(\d{2})/(\d{2}).(\d{2})\:(\d{2})</th>
    .*?<td.*?>(.*?)</td>
    .*?<td.*?>(.*?)</td>
    .*?</tr>
        }gsx) {
            push @$list, {
                month => $1,
                day => $2,
                hour => $3,
                min => $4,
                title => $5,
                body => $6,
                hm => $3.$4,
            };
        }
     
        @$list = sort { $b->{hm} cmp $a->{hm} } @$list;
        $list;
    }
     
    sub add_status {
        my($self, $body) = @_;
        my $status = "";
        {
        if ($body =~ /平常通り/) { $status = "○" ; last ; }
        if ($body =~ /再開|遅れ|運転変更/) { $status = "△" ; last ; }
        if ($body =~ /見合わせ|運休/) { $status = "×" ; last ; }
        $status = " ";
        }
     
        $status;
    }
     
    1;
    

    Posted at 23:31 | Categories: PC | Tags: Photo, Plagger, W-ZERO3, さくらのサーバ

    Trackback (0) URL :

    Comments (1)

    コメント

    トラックバックに加えコメントまで頂き、誠にありがとうございます。
    また、野良プラグインを使って頂きありがとうございます。多少なりともお役に立てたようで嬉しく思っております。

    今回提示して頂いた改造の内容ですが、洗練されていてイイですね。大変勉強になります。

    これからも宜しくお願い致します。

    コメント投稿

    名前 :

    メールアドレス :

    URL :

    コメント(スタイル用のHTMLタグが使えます。) :



    footer