このブログを検索

2013/02/27

tweetを大量に削除

わけあって、自分の過去のtweetを大量にしかし全部ではなく削除する必要があった。

1個ずつWEBで削除していきながら、「これはAPIを使ってやるべきだな・・・」と思ったものの、やり方がわからず結局全部「手動で」消した。

調べたらごく簡単だったのでメモしておく。

tweetを削除するにはそのidを知る必要がある。まずはそれを知る方法。


#!/usr/bin/perl
use strict;
use warnings;
use YAML::Tiny;
use Net::Twitter::Lite;
use Encode;

my $config = ( YAML::Tiny->read('/hoge/config.yml') )->[0];
my $twit = Net::Twitter::Lite->new(
legacy_lists_api => 0,
consumer_key => $config->{'cs_key'}, consumer_secret => $config->{'cs_secret'} );

$twit->access_token( $config->{'ac_token'} );
$twit->access_token_secret( $config->{'ac_secret'} );


eval {
my $statuses = $twit->friends_timeline({ since_id => 1000, count => 10 });
for my $status ( @$statuses ) {
print encode('utf8',"$status->{created_at} <$status->{user}{screen_name}> $status->{text} $status->{id}\n");
}
};
warn "$@\n" if $@;


これは、Net::Twitter::Liteの、cpanのページの最初のサンプルほとんどそのままである。

tweet(status) は日本語なのでencodeしている。encodeしなくても表示できるが警告がうるさいのでencodeした。

use warning をはずせばいいのか・・・まあいいや。

since_id というのは名前からして、表示する最小のidであろう。ちなみにゼロにしたらエラーになった(省略できる)。

$status->{id}が、tweet(status)のidである。これはおそらく全tweetでユニークなidだ。

statusは新しいものからcountの数だけ取得される。

idがわかったら、以下のようにidを指定して destroy_statusを実行する。


eval {
my $statuses = $twit->destroy_status(3047606842882xxxxx);
};
warn "$@\n" if $@;


eval, warnとかの書き方はよくわからないがサンプルのままである。

あとは、tweetとidを表示し、消したいidを選んでdestroyすればよい。

「一括削除アプリ」みたいなものもあったのだが、遅い上に削除もできなかった。

注意すべきなのはあまり大量にいっぺんに表示・削除するとAPIの利用制限に引っかかるおそれがあることだ。

destroy_statusはAPIを1回呼び出すごとに1個ずつ消すから多分すぐアウトになるんじゃないか?

上記のやり方では1個だけ消せることを確認した。

大量に削除する際は要注意だ。