- 2009-01-08 (木) 21:35
- Perl
前回,わざわざログインしてFavを取るやつ を書きましたが,あんなことしなくても 普通にFavのフィード取れることが分かったので,さくっと作り直しました. これを使えば,Twitter, Favotter→Tumblrに流すことができます.てか,実は Tumblrにはフィードを食う機能があるのですが,整形できないのと調子が悪くて すぐに死ぬので自分でAPI使ってあげた方が早いです.
ちなみに,ソースはすべてgithubにあげているので使い方分かる人はそっちから 取った方がいいかも.
Plagger::Plugin::Plugin::Tumblr
まずはメインのTumblrにポストするプラグイン.別にたいそうなことは していなくて,WWW::TumblrというCPANモジュールをラップしただけ. しかも,めんどくさいからTextとQuoteとLinkしか作ってない.
- module: Publish::Tumblr
config:
username: your-email
password: your-password
type: post type(text, quote, or link)
interval: 2
typeの部分を変更するとこんな感じでPostしてくれます.
- text
- title
- body(added link to the url at the end)
- quote
- quote(body)
- source(title linked to the url)
- link
- name(title)
- url
- description(body)
lib/Plagger/Plugin/Publish/Tumblr.pm
use strict;
use base qw( Plagger::Plugin );
use Encode;
use Time::HiRes qw(sleep);
use WWW::Tumblr;
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'publish.entry' => \&publish_entry,
'plugin.init' => \&initialize,
);
}
sub initialize {
my($self, $context) = @_;
$self->{tumblr} = WWW::Tumblr->new;
$self->{tumblr}->email($self->conf->{username});
$self->{tumblr}->password($self->conf->{password});
}
sub publish_entry {
my($self, $context, $args) = @_;
my $title = $args->{entry}->{title};
$title = encode_utf8($title);
my $body = $args->{entry}->{body};
$body = encode_utf8($body);
my $link = $args->{entry}->{link};
my $type = $self->conf->{type} || 'regular';
$context->log(info => "Tumblr($type) posting '$title'");
if($type eq 'text'){
my $post = $body . "<div><a href=\"" . $link . "\">" . $title . "</a></div>";
$self->{tumblr}->write(
type => 'regular',
title => $title,
body => $post,
);
}
elsif($type eq 'quote'){
my $source = "<a href=\"" . $link . "\">" . $title . "</a>";
$self->{tumblr}->write(
type => 'quote',
quote => $body,
source => $source,
);
}
elsif($type eq 'link'){
$self->{tumblr}->write(
type => 'link',
name => $title,
url => $link,
description => $body,
);
}
my $sleeping_time = $self->conf->{interval} || 5;
$context->log(info => "sleep $sleeping_time.");
sleep( $sleeping_time );
}
1;
Plagger::Plugin::Filter::TwitterQuote
続いて,TwitterのフィードをTumblrのQuote形式にあわせて整形するFilterプラグイン. 参考にしてるのはTomblooのやつね.あれが気に入ってるんでそれにしてます. 他の形にしたい人はお好きに変更して下さい.Publish::Tumblrのポスト方法は 上を参考にして下さい.
使い方は以下をYAMLに挟むだけ.
- module: Filter::TwitterQuote
lib/Plagger/Plugin/Filter/TwitterQuote.pm
use strict;
use base qw( Plagger::Plugin );
use Encode;
sub register {
my ($self, $context) = @_;
$context->register_hook(
$self,
'update.entry.fixup' => \&filter,
);
}
sub filter {
my ($self, $context, $args) = @_;
my $body = $args->{entry}->{body};
$body =~ /^(.+?): (.+)/o;
my $id = $1;
my $quote = encode_utf8($2);
my $title = "Twitter / " . $id;
$args->{entry}->title($title);
$args->{entry}->body($quote);
}
1;
Plagger::Plugin::Filter::FavotterQuote
ふぁぼったーから流すやつも作りました.Link先はFavotterのままです.
lib/Plagger/Plugin/Filter/FavotterQuote.pm
use strict;
use base qw( Plagger::Plugin );
use Encode;
sub register {
my ($self, $context) = @_;
$context->register_hook(
$self,
'update.entry.fixup' => \&filter,
);
}
sub filter {
my ($self, $context, $args) = @_;
my $body = $args->{entry}->{body};
$body =~ /^.+?<\/img>(.+?)<\/a> (.+?)<br \/>/o;
my $id = $1;
my $quote = $2;
my $title = "Twitter / " . $id;
$args->{entry}->title($title);
$args->{entry}->body($quote);
}
1;
Plagger::Plugin::Filter::Reverse
それから,Twitterとかのフィードは最新の方から処理されてしまうので, そのままPlaggerでTumblrに流すと一番古い奴が一番上にくるので,それを 逆転させておく.これはid:inirvashさんの書かれた奴をコピーしただけです. id:nirvash++
lib/Plagger/Plugin/Filter/Reverse.pm
use strict;
use base qw( Plagger::Plugin );
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'update.feed.fixup' => \&feed
);
}
sub feed {
my($self, $context, $args) = @_;
$context->log(debug => "reverse");
my @entries = $args->{feed}->entries;
@entries = reverse(@entries);
$args->{feed}->{entries} = \@entries;
}
1;
レシピのYAMLファイル
こいつらを自分のPlaggerが入ってるマシンの適当な所に放り込みます. おすすめは自分用のプラグインフォルダを作っておいて,それを YAMLで読み込むことです.僕の場合,githubからPullしたものを そのまま読み込んでいます.
前回も書いた様に,僕はプラグインの場所とかを設定したbase.yamlを includeさせています.一応そちらも載せておきます.
base.yaml
plugin_path:
- /home/user/plagger/lib/Plagger/Plugin
- /home/user/github/plagger/lib/Plagger/Plugin
assets_path: /home/user/plagger/assets
timezone: Asia/Tokyo
log:
level: debug
# level: info
cache:
base: /home/user/cache
define_recipes:
で,以下がメインのYAML.Filter::Ruleを使っているのは,以前に 送信したものを送信しないようにするためです.Tumblrはそういうチェックを してくれないので,テストする段階で何度もやると,同じものを大量に 送信してしまいますので,こいつを使いましょうw 指定したファイルが DBとなって,同じものは送らないようにしてくれます.
twitterfav2tumblr.yaml
- /home/user/yaml/base.yaml
plugins:
- module: Subscription::Config
config:
feed:
- http://twitter.com/favorites/riywo.atom
- module: Filter::Rule
rule:
module: Deduped
path: /home/user/cache/plagger-twitterfav2tumblr.db
- module: Filter::TwitterQuote
- module: Filter::Reverse
- module: Publish::Tumblr
config:
username: email address
password: *****
type: quote
interval: 3
こちらは,Favotter用.
favotter2tumblr.yaml
- /home/user/yaml/base.yaml
plugins:
- module: Subscription::Config
config:
feed:
- http://favotter.matope.com/userrss.php?user=riywo&mode=new
- module: Filter::Rule
rule:
module: Deduped
path: /home/user/cache/plagger-favotter2tumblr.db
- module: Filter::FavotterQuote
- module: Filter::Reverse
- module: Publish::Tumblr
config:
username: email address
password: ******
type: quote
interval: 3
使用方法
あとは,こいつらを指定してPlaggerを起動すればOKです.
$ plagger -c /home/user/yaml/twitterfav2tumblr.yaml
$ plagger -c /home/user/yaml/favotter2tumblr.yaml
うまくいった様でしたら,cronに設定しちゃって下さい.以下の設定なら 10分毎に実行してくれます.
*/10 * * * * plagger -c /home/user/yaml/favotter2tumblr.yaml
注意すべきキャッシュの存在
さて,Plaggerの使用にあたって最も注意すべきこと,それは「キャッシュ」の 存在です.Plaggerはフィードを取りに行く前にローカルのキャッシュを見ます. もしキャッシュがあれば(かつそれほど古くなければ?)フィードを見に行きません. そのため,あまり短い時間感覚でcronでまわしても新しいフィードを取りに行って くれないのです.
ですので,僕はキャッシュフォルダを削除するcronを1分毎にまわすという,アホなことを やっています.しかも厄介なのが,base.yamlで指定したキャッシュフォルダの 他に/home/user/.plagger辺りに別のキャッシュを勝手に作っていました.なので, 指定したものの他にこいつも消さないといけません.これに気づかなくてしばらく キレてたのは秘密です.
というわけで,現在はbase.yamlで/home/user/.plaggerを指定して,ここのキャッシュを 削除するcronを回しています.
- Newer: TwitterをHTMLから取得してPlaggerで使おう
- Older: C75にサークル参加してきました
Comments:0
Trackbacks:2
- Trackback URL for this entry
- http://blog.riywo.com/2009/01/08/213537/trackback
- Listed below are links to weblogs that reference
- Plagger使ってTwitterのFavやふぁぼったーをTumblrに流すプラグイン作ったよ from As a Futurist...
- trackback from As a Futurist... 09-01-08 (木) 21:44
-
PlaggerでTwitterからTumblrへFavを流す
書き直しました! わざわざログインしなくてもFavのフィードは取れるので書き直しました! Plagger使ってTwitterのFavやふぁぼったーをTumblrに流すプラグイン作ったよ - As...
- trackback from As a Futurist... 09-01-08 (木) 21:55
-
UbuntuでPlaggerやるならこれでいけ!〜VirtualBoxからcronまで〜
インストールがむずかしいことで評判の「Plagger」ですが,その評判通り 使える様になるまでが大変です.一般的には,CPANからPlaggerを入れれば いいのですが,依存関係が複雑な...