Skip to content

Instantly share code, notes, and snippets.

@CLCL
Last active December 18, 2015 15:19
Show Gist options
  • Save CLCL/5803345 to your computer and use it in GitHub Desktop.
Save CLCL/5803345 to your computer and use it in GitHub Desktop.
Adobe MAGIC MASTER( https://magic-master.jp/pc/index.html ) のTwitter連動で自動的に投稿されてしまったうざいメッセージを即座に消します。自分のアカウントで作ったTwitterアプリのConsumer Key、Access Tokenなどなどが必要。
#!/usr/bin/perl
use version; our $VERSION = qv('0.0.1');
use AnyEvent::Twitter::Stream;
use FindBin;
use File::Spec;
use Net::Twitter;
use utf8;
use YAML;
binmode STDOUT => ':utf8';
my $my_screen_name ='CLCLCL';
# AnyEvent リスナー設定(グローバル:お互いのイベントリスナー内部から操作する必要がある)
my $listener_twitter; # AnyEvent::Twitter::Streamのイベントリスナー
my $listener_timer; # AnyEventのTimerのイベントリスナー
my $set_timer; # $set_twitter内で$set_timerを書くのでここで宣言しておく必要がある
my $keys = YAML::LoadFile( File::Spec->catfile( $FindBin::RealBin, 'twitter_keys.yaml') );
# 同じディレクトリにtwitter_keys.yaml ファイルを以下の形式で置いておく
# 同じディレクトリだとHTTPアクセスで鍵漏れするので、【HTTPでアクセスできないところに
# 置かなくてはならない】このサンプルはわかりやすさ優先のため同じディレクトリにおいている
# また.htaccessなどで一応HTTPで読み込めないよう指定をしているが設置者の自己責任で。
# キーはTwitterにDevelopper登録して、自分で取得する必要がある。
# "consumer_key" : 'aaaaaaaaaaaaaaaaaaa'
# "consumer_key_secret" : 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
# "access_token" : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# "access_token_secret" : 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
my $nt = Net::Twitter->new(
traits => [qw/API::RESTv1_1 WrapError/],
consumer_key => $keys->{consumer_key},
consumer_secret => $keys->{consumer_key_secret},
access_token => $keys->{access_token},
access_token_secret => $keys->{access_token_secret},
ssl => 1,
);
# AnyEvent のCondVar
my $cv = AE::cv;
# AnyEvent::Twitter::Streamの設定
my $set_twitter = sub {
$listener_twitter = AnyEvent::Twitter::Stream->new(
consumer_key => $keys->{consumer_key},
consumer_secret => $keys->{consumer_key_secret},
token => $keys->{access_token},
token_secret => $keys->{access_token_secret},
method => 'userstream', # ユーザストリーム
on_tweet => sub {
my $tweet = shift; # $tweetはflagged utf8
my $user = $tweet->{user}{screen_name};
my $text = $tweet->{text} || '';
my $lang = $tweet->{user}{lang} || '';
return unless $user && $text; # たまに空のTweetが流れるのを防ぐ
return unless $user eq $my_screen_name;
return unless $tweet->{source} =~ m/MagicMaster/;
print "$tweet->{id}\n";
$nt->destroy_status( $tweet->{id} );
print $nt->http_message."\n";
$text =~ s/[\x00-\x1f\x7f]//g; # コントロールコード除去
$text =~ s/&lt;/</g;
$text =~ s/&gt;/>/g;
print "$user : $text\n"; # コンソールに表示
#my $dm = $nt->new_direct_message({
# text => "迷惑なので消しました。$text",
# screen_name => 'adobestore_jp',
#});
},
# AnyEvent::Twitter::Stream 接続エラー
on_error => sub {
my $error = shift;
warn "ERROR: $error";
undef $listener_twitter; # AnyEvent::Twitter::Streamのイベントリスナーいったん消去
undef $listener_timer; # AnyEventのTimerイベントリスナーいったん消去
$set_timer->(5); # AnyEventのTimerでAnyEvent::Twitter::Streamのイベントリスナー作り直す
},
on_eof => sub {
},
);
};
# AnyEventのタイマーイベント(AnyEvent::Twitter::Streamの接続監視・再接続用)
# 引数の分だけ待ったあと、AnyEvent::Twitter::Streamのリスナーの存在監視をします。
# AnyEvent::Twitter::Streamのリスナーでは接続が切れたとき、自身から再接続の手続
# きが出来ないので、別のイベントリスナーが監視して再接続をします。
# あらかじめ宣言する必要があったので、ここではmyを付けずに代入
$set_timer = sub {
my $after = shift || 0;
$listener_timer = AnyEvent->timer(
after => $after,
interval => 10,
cb => sub {
unless ( $listener_twitter ) {
$set_twitter->();
warn "AnyEvent_Timer:(re)connecting";
}
},
);
};
$set_timer->();
$cv->recv;
"consumer_key" : 'aaaaaaaaaaaaaaaaaaa'
"consumer_key_secret" : 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
"access_token" : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
"access_token_secret" : 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment