Twitterランドでは、いつでもどこかで議論が起きています。そんなとき、フォロワー数が多い、いわゆる人気ツイッタラーはファンネルと呼ばれる攻撃を行うそうです。議論の相手に対して、自分のフォロワーにリプライ爆撃をするように、誘導する行為ですね。元ネタはガンダムに出てくる兵器名です。受けた相手は、ファンネルによるクソリプに対処しきれなくなって落ちてしまいます。恐ろしい現象です。
僕には、そんなことをしてくれるフォロワーがいません。いなければ作れば良いだけです。ということでRaspberry piを使って僕のファンネルbotを作りました。
botの仕様について
攻撃
・僕(@t_emcee)のタイムラインを監視する
・僕(@t_emcee)がリプライした相手の情報を得る
・相手に対してbotから「そうだよ(便乗)」とクソリプをする
防御
・僕(@t_emcee)に対するリプライを検索する
・僕(@t_emcee)にリプライした相手の情報を得る
・相手に対してbotから「やめて差し上げろ」とクソリプをする
攻撃側が「僕のタイムラインを監視する」のに対して、防御側が「僕へのリプライを検索する」という点が異なります。それ以外は同じ作業です。
つまり「タイムライン監視」「ツイートの検索」「相手ユーザーの取得」「ツイートの投稿」が出来れば良いわけです。
準備〜Twitter APIに登録〜
プログラムからTwitterを操作するにはTwitter APIに登録が必要です。登録に際して、電話番号が必要になるので、その点ご注意を。下記URLより登録を行います。
Twitter Application Management
記載が必須なのは「Name:アプリケーション名」「Description:アプリケーションの説明」「Website:アプリケーションのURL」の3つです。僕は下記の通り、適当に記載しました。特に怒られる事はなかったので、適当でいいと思います。
登録が終わったら下記画像にて赤線で消している所(Consumer/Access TokensそれぞれのKeyとSecret)をメモしておきましょう。アカウントを操作する時に必要になります。
APIの登録については、この記事を参考にしました。画像付きで詳しく載っていて、分かりやすいです。
Twythonのインストール
TwythonはPython用のTwitterライブラリです。他にTweepyというのが有名そうでしたが、何やら更新が止まっているそうです。そんなわけで、今後の対応の事を考え、Twythonを使う事にしました。
Raspberry piを起動して下記のコマンドを叩きます。
$ sudo pip install twython
これで準備はOKです。
Pythonでコーディング
それでは実際にコーディングに移ります。まずは先ほど入手したKeyとSecretを使って認証を済ませちゃいましょう。
#!/usr/bin/env python # coding: utf-8 from twython import Twython,TwythonError #twitterの認証情報を入力 CONSUMER_KEY = 'XXXXXXXXXXXXXXXXXXXXXX' CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXX' ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXXX' ACCESS_SECRET = 'XXXXXXXXXXXXXXXXXXXXXX' api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET) print('Auth Done!')
タイムライン取得と投稿
認証が終わったら次は僕のタイムラインを監視し、僕からのリプライ情報を得ます。そしてその中からリプライ先ユーザーの情報を取り出し、クソリプを添えて投稿しています。
#タイムラインの取得 try: user_timeline = api.get_user_timeline(screen_name='t_emcee',count=1) except TwythonError as e: print e #最新のタイムラインを出力 for tweet in user_timeline: print(tweet['text'].encode('utf-8')) #リプライの場合、リプライ先ユーザーの取得して返信 if len(tweet['entities']['user_mentions']) != 0: tweet_mension=tweet['entities']['user_mentions'][0]['screen_name'].encode('utf-8') print(tweet_mension) api.update_status(status='@t_emcee @' + tweet_mension + ' そうだよ(便乗)')
動作確認用に時折printで取得内容を出力させているので、その部分は省いてしまって問題ありません。
screen_nameのところを変えてやると、そのユーザーのタイムラインを取得する事が出来ます。欲しい情報にあわせて弄ってあげると良いです。
tweetリストの中に"entities"→"user_mensions"というものがあり、これが言及先のユーザー情報を意味します。これが0でなければリプライを送っていると判断し、"screen_name"すなわちユーザー名を取得して便乗クソリプを投稿します。
"get_user_timeline"ではツイートに関する大量の情報を取得できます。引数として使える物とあわせて、Twitterの開発者ページに載っていますので、確認してみてください。
GET statuses/user_timeline — Twitter Developers
リプライの検索と投稿
次は僕へのリプライについての反応です。今度はタイムライン監視ではなく、ツイートを検索して僕への言及ツイートを取得してみます。
#最新の言及を検索 try: search_results = api.search(q ='@t_emcee', result_type='recent', count=1) except TwythonError as e: print e for tweet in search_results['statuses']: tweet_reply_user=tweet['user']['screen_name'].encode('utf-8') print(tweet_reply_user) api.update_status(status='@t_emcee @' + tweet_reply_user + ' やめて差し上げろ')
api.searchの引数であるqに検索する単語を入れます。result_typeでrecentを指定すると最新のものを持ってきてくれます。
こちらも大量の情報が格納された物が帰ってきます。引数も色々あるので、確認してみてください。
GET search/tweets — Twitter Developers
結果
$ sudo python ファイル名.py
他のユーザーに僕のTwitterアカウントでリプライを送った後、上記コマンドをraspberry piで実行します。
実験用アカウントであるmcsunから見事、巻き込みリプライでクソリプを放つ事が出来ました。防御側の方は試せていませんが、ユーザー名の取得まではprintで確認できているので、恐らく機能してくれる事でしょう。
ちなみに、上記結果のリプライは、pythonのリスト型の理解に悩む僕に、救いの手を差し伸べてくれた友人に向けてのものです。恩を仇で返す、これこそクソリプです。
ストリーミングで実現したなら
今回は手動でプログラムを走らせて、その時点のタイムラインや検索内容に対して動作を行いました。これではリアルタイムに反応が出来ず、結果として僕のファンネルとしてはまだまだ機能しません。
ストリーミングAPIというのがあるらしく、それを利用するともっとファンネル感が出せそうです。
そこまでしなくとも、ループを作っておいて必要な時に合図を投げて攻防を行う体勢に移行させたりは出来そうです。
この辺りの機能の実装は興味がある内容です。ただし、実験の過程に置いて不慮の事故により他人にクソリプを拡散してしまう危険もあります。注意しながら遊んでいきたいです。
こんな記事も書いています。
セットアップです。
温度をつぶやかせたりするのも良いかもしれません。
参考にさせていただいた、からあげ (id:karaage)さんの記事では、そういった使い方をしていました。