はてなBookmarkに登録

[Plagger] 列車運行情報をPublishしてみる(続編)

[Plagger] 列車運行情報をPublishしてみるの野良プラグインを動かしていて、気になるところが有ったため少しずつ改造していました。
  • titleの情報を増やしたい
    http://twitter.com/train_kantoを見ると、【運転見合わせ】とか【運転再開】とか【列車遅延】といった情報が入っていて、非常に見やすいです。すばらしいです。ということで、このアイデアを使わせて頂くようにしました。(アイデアをパクってごめんなさい)
    本文中のキーワードで条件分けするという、ひねりも何も無い方法としているため、ちょっとショボい実装になってしまいました。
  • Publish::Twitterでの取りこぼし
    同じ時刻に、複数の路線の情報が入ると、Publish::Twitterでは1つだけしか出力されないようです。色々とFilter::Ruleの記述などをいじってみたのですが、どうにも上手くいきません…。
    で、単純に「時刻が異なれば良いんじゃないか」ということで、秒の部分にタイトルと本文の文字数の合計を60で割った値を入れて、重複扱いされないようにしています。かなりショボい解決策です…。
ということで、改訂版は、こんな具合になっています。
package Plagger::Plugin::CustomFeed::LDTraffic;
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 $sec = "0";
my $urls = $self->conf->{url};
my $feed = Plagger::Feed->new;
$feed->link($urls);
$feed->title("鉄道運行情報");

my $list = $self->parse(Plagger::Util::load_uri(URI->new($urls)));

for my $item (@$list) {
my $entry = Plagger::Entry->new;

if( $item->{body} =~ /運転を再開しました/ ) {
$entry->title($item->{title}."【運転再開】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /遅れが出ています/ ) {
$entry->title($item->{title}."【列車遅延】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /運転を見合わせています/ ) {
$entry->title($item->{title}."【運転見合わせ】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /平常通り運転しています/ ) {
$entry->title($item->{title}."【平常運転】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /一部列車に運休が出ています/ ) {
$entry->title($item->{title}."【一部運休】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /運転変更が出ています/ ) {
$entry->title($item->{title}."【運転変更】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} elsif( $item->{body} =~ /遅れや運休が出ています/ ) {
$entry->title($item->{title}."【運休・遅延】(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
} else {
$entry->title($item->{title}."(".$item->{month}."/".$item->{day}." ".$item->{hour}.":".$item->{min}.")");
}

$entry->body($item->{body});
$entry->link($urls);

$sec = (length($entry->title) + length($entry->body)) % 60; ←Publish::Twitter対策
$entry->date(Plagger::Date->strptime("%y%m%d%H%M%S", $ym.$item->{day}.$item->{hour}.$item->{min}.$sec));

$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,
};
}

$list;
}

=head1 NAME

Plagger::Plugin::CustomFeed::LDTraffic - Custom feed for livedoor traffic information

=head1 SYNOPSIS

- module: CustomFeed::LDTraffic
config:
url: http://transit.livedoor.com/traffic_info/kantou

=head1 DESCRIPTION


=head1 AUTHOR


=head1 SEE ALSO

L<Plagger>

=cut

1;
yamlはこんな感じにしています。
plugins:
- module: CustomFeed::LDTraffic
config:
url: http://transit.livedoor.com/traffic_info/kantou

- module: Filter::Rule
rule:
module: Deduped
compare_body: 1

- module: Publish::Twitter
config:
username: Twitterのユーザ名
password: Twitterのパスワード




投稿者 Izumi : 23:23 | PC / Net

トラックバック

このエントリーのトラックバックURL:
http://www.simazaki.com/~izumi/cgi-bin/tt-cgi/tt_tb.cgi/537

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

雑記 : 2008年1月10日 09:38

コメント

はじめまして、トラックバックをいただきありがとうございました。
前回に引き続き、今回も参考にさせていただきました。
今後もよろしくお願いします。

ちなみに、MSN アラートで列車運行情報をメールで受けることもできるようです。
http://alerts.msn.co.jp/
ご存知でしたらすみません。

投稿者 まるひ : 2008年1月10日 12:36

トラックバックと共にコメントまで頂き、ありがとうございます。
野良プラグインを使って頂いているのを見つけて、おもわずトラックバックしてしまいました。
改良版プラグインも拝見しました。勉強になります。
今後とも宜しくお願いします。

>ちなみに、MSN アラートで列車運行情報をメールで受けることもできるようです。

こちらのサービスは知りませんでした。MSNもなかなかですね。ご教示ありがとうございます。

投稿者 Izumi : 2008年1月10日 23:43

コメントしてください




保存しますか? はいいいえ


 
< 2008年1月 >
    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    
サイト内検索
Recent Comments
Recent Trackback
リンクリスト