Twitter攻撃の原因はTorrentサイトの裏口だった

twitter statusから「パスワード変えろ」的なメールが来たので何かと思ったら、そういうことだったのねという記事。変えておこう

Powered by Livedoor Clip

Twitter / shuzo_matsuoka: おい!読める!読めるぞ!バルスッ!はい!死んだ!君の …

Powered by Livedoor Clip

Twitterのぴかぴかの新本社オフィス、社員がみせびらかし中(写真多数)

どこもかしこも鳥だらけで、twitter初期の人気を支えた猫の姿が微塵もない。すっかり変わっちまったな…オレもお前も…(エラそう)

Powered by Livedoor Clip

Wassrの発言をTwitterに転送するスクリプト

 いわゆるミニブログサービスは現在TwitterWassrを使っているのですが、徐々に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__