TinyURLを操作するPlagger用フィルタ
昨日の1日のTwitterをまとめてMixi日記になげるレシピをつかってMixiに投稿するとURLがTinyURLのままになってた。公開して読んでもらう日記なのにちょっと怖いし不親切かなってことで、TinyURLを元に戻すためのフィルタを作ってみた。ついでだったのでTinyURLを生成することもできるようにした。
フィードのbody部分の加工をするためのフィルタはBase.pmを継承してfilterをオーバーライドするだけで良いのですごく簡単。ここではWWW::Shorten::TinyURLを使ったのでほとんど何も考えてないのにできちゃった。継承ってすごいね!
TinyURL.pm
package Plagger::Plugin::Filter::TinyURL; use strict; use base qw( Plagger::Plugin::Filter::Base ); use URI::Find; use URI::http; use WWW::Shorten::TinyURL; sub filter { my($self, $body) = @_; local @URI::ttp::ISA = qw(URI::http); my $count = 0; my $opt = $self->conf->{be} || 'short'; my $finder = URI::Find->new(sub { my ($uri, $orig_uri) = @_; if ($opt eq 'long' && $uri =~ /tinyurl/) { $count++; return makealongerlink($orig_uri); } elsif ($opt eq 'short') { $count++; return makeashorterlink($orig_uri); } }); $finder->find(\$body); ($count, $body); } 1; __END__ =head1 NAME Plagger::Plugin::Filter::TinyURL - convert URL by TinyURL =head1 SYNOPSIS - module: Filter::TinyURL config: be: long =head1 DESCRIPTION This plugin replaces URL with TinyURL or TinyURL with OriginalURL. =head1 CONFIG =over 4 =item text_only When set to 1, uses HTML::Parser to avoid replacing URL inside HTML attributes. Defaults to 0. =item be When set to long, TinyURL extracted to Original URL. When set to short, URL converted into TinyURL. =back =head1 AUTHOR Toshi Tatsuhiko Miyagawa =head1 SEE ALSO L<Plagger>, L<HTML::Parser> =cut
貼り付けてみて半分以上がPODだって気がついた(笑)
これを使うためのyamlには
- module: Filter::TinyURL config: be: long
とか書けば良い。TinyURLを元に戻すときにはbe:にlongをTinyURL生成時にはshortを指定する。
注意点として、ほかのFilterと使うときにはyaml中でTinyURL.pmをFilterの先頭で指定しないとうまく適用できない。少なくとも昨日のFilter::AssembleEntries.pmではそうだった。実際にはこんな感じ。
plugins: - module: Subscription::Config config: feed: - url: http://twitter.com/statuses/user_timeline/ユーザID.atom - module: Filter::TinyURL config: be: long - module: Filter::AssembleEntries rule: expression: $args->{entry}->date->set_time_zone('Asia/Tokyo')->ymd eq Plagger::Date->now(timezone=>'Asia/Tokyo')->ymd config: title: 今日のTwitter link: http://twitter.com/xxxxxx/ delimiter: <br /> reverse: 1 timelabel: hms empty_msg: なにもTwiってないよ。 del_word: Toshi: - module: Publish::MixiDiary config: username: [email protected] password: password interval: 10