いわゆるミニブログサービスは現在TwitterとWassrを使っているのですが、徐々にWassrで発言することの方が多くなりました。
メールでの投稿や画像付きのポストを標準でサポートしていること、携帯電話版のページが使いやすいこと、のメリットがやはり大きいですね。投稿の半分くらいは携帯からやってる気がする。
でも、このままTwitterで発言しなくなるのも何か寂しいので、Wassrでの自分の発言をそのままTwitterに投稿するスクリプトを作ってみました。
スクリプトのルール:
- 規定時間以内(デフォルト10分)にWassrで発言した内容を、そのままTwitterに投稿する
- 画像付きの投稿をした場合、画像のURLも付加して投稿する
- cronで10分間隔で回すことを想定
- 例外として、
- 誰かの発言へのレスポンスは対象としない(レスだけ切り出しても意味ないので)
- “.”で終わる発言は対象としない(Wassrの外に出したくない発言をしたい時用)
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use XML::Simple;
use Encode;
use CGI::Util qw(escape);
# Wassrのアカウント
my $WASSR_ID = 'WassrのID';
my $WASSR_PASSWORD = 'Wassrのパスワード';
# Twitterのアカウント
my $TWITTER_ID = 'TwitterのID';
my $TWITTER_PASSWORD = 'Twitterのパスワード';
my $LIMIT_TIME = 60 * 10; # 転送する対象発言の規定時間(秒)
my $PASS_CHAR = '.'; # 末尾がこの文字列の場合、転送対象にしない
my @post_list = ();
# Wassrのポストを取得する
my $ua = LWP::UserAgent->new;
$ua->credentials('api.wassr.jp:80', 'API Authentication', $WASSR_ID, $WASSR_PASSWORD);
my $req = HTTP::Request->new('GET', 'http://api.wassr.jp/statuses/user_timeline.xml');
my $res = $ua->request($req);
die $res->status_line if (!$res->is_success);
my $xml = XMLin($res->content);
# 発言した順に並べ替える
my @id_list = sort(keys(%{$xml->{status}}));
foreach my $id (@id_list) {
my $item = $xml->{status}->{$id};
# 誰かへのレスポンスは対象としない
next if (ref($item->{reply_user_login_id}) ne 'HASH');
# 規定時間以上前の発言は対象としない
next if (time() - $item->{epoch} > $LIMIT_TIME);
# "."で終わる発言は対象としない
next if (substr($item->{text}, -1 * length($PASS_CHAR)) eq $PASS_CHAR);
# 画像が投稿されている場合、それも投稿に含める
my $text = $item->{text};
$text .= " $item->{photo_url}" if (ref($item->{photo_url}) ne 'HASH');
# URLエスケープする
$text = escape(encode('utf-8', $text));
# 発言リストに追加
push @post_list, $text;
}
# Twitterに投稿する
$ua->credentials('twitter.com:80', 'Twitter API', $TWITTER_ID, $TWITTER_PASSWORD);
foreach my $text (@post_list) {
$req = HTTP::Request->new('POST', 'http://twitter.com/statuses/update.xml?status=' . $text);
$res = $ua->request($req);
last if (!$res->is_success);
}
# おわり
__END__