PythonでTwitterAPIをいじろう [Advent2016]

これは慶應ロ技研 Advent Calendar 2016 13日目の記事です。

←12日目の記事 / 14日目の記事→


ご挨拶

どうもこんにちは、tokkyo13です。こうやって、ブログとかを書くのは初めてなので緊張しています。今も、震える右手を左手で必死におさえながら文字を打っています。今回Advent Calendarに参加するにあたって、なんのネタもなかったので、1,2日かけてPythonでTwitterを操作する方法を模索していました。この記事はそれを2,3日前の僕に解説するつもりで書いたものです。未熟者ですが、どうぞ宜しくお願いいたします。


APIとは?

さて、タイトルから分かる通り、この記事のテーマはTwitterです。皆さんはTwitter 使ってますか?使ってる、あるいは使ったことがある人ならわかると思いますが、Twitter上にはbotなるものが存在しますね。定期的に同じことをつぶやいたりする、あれです。(ちなみに僕はバイオゴリラbotが好きです)

でもあれ、どういう仕組みでうごいてるのか気になりませんか? 気になれ!

結論から言うとbotの機能はTwitterが公開しているTwitterAPIを利用して実現しているんです。それだけじゃないです。botに限らず、(みなさんが一度くらいはしたことがあるであろう)アプリ認証を求めてくるサービス、さらにはみなさんのスマホにインストールされているTwitterアプリでさえ、すべてTwitterAPIを利用しています。

APIというのは、僕が理解できた範囲で言うと、ウェブサービス(Twitter、Youtube、Amazon…etc)が、外部向けに公開している、各サービスへアクセスする方法のようなものです(要出典)。APIが公開されているからこそ、botがTwitterにアクセスできるし、ウェブページにYoutubeの動画が埋め込めるし、アフィカスが稼げるというワケです。

ということは、このAPIなるものを利用すれば、Twitterでなにか楽しいことができるはず!!ということですね。


TwitterAPIをどう使うか

では具体的に、公開されているTwitterAPIとはどのような情報なのか。簡単に言うと、「このアドレスにこういうリクエストを送信すると、こういう情報が返ってくるよ。」のような情報です。これをどんな形で使うかは人それぞれで、いろんなプログラミング言語で使えます。(世に出回っている解説書ではPHPのサンプルコードが多かったです)

僕はPythonというプログラミング言語をつかってみたいなぁ、と前々から思っていたので、それを使うことにしました。(細かいこと言うと、今回使ったのはPython3です)

PythonでTwitterAPIを使う方法を調べると、TweepyというTwitterAPI用のライブラリが存在することがすぐにわかりました。ライブラリというのは、「汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの」(wikipedia) だそうです。

やるべきことがだんだん明確になってきましたね!


Tweepyのインストール

注:これ以降は環境によって多少違いがあると思います。僕の環境は、macにPython3がインストールされている状態です。(時間の都合上、Pythonのインストールについては解説しません。ググってください)

では早速Tweepyのインストールからやっていきます。以下の3ステップで終わります。

  • get-pip.pyをこのページからダウンロードする。(リンク先のページ内にある、get-pip.pyというリンクを右クリックして、保存を選びます。)
  • ダウンロードしたファイルをターミナルで実行する。(ファイルを保存したディレクトリに移動してからでないと実行されません。例えばデスクトップにファイルを保存した場合、以下のように入力します)
$ cd desktop
$ python3 get-pip.py
  • Tweepyをインストールする。以下のようにターミナルに入力します。
$ pip install tweepy

これで、Tweepyのインストールは完了です。


各種アクセスキーを入手する

Tweepyもインストールできたし、いよいよツイッターAPIをいじれる!……かと思いきや、まだです。まだやることがあるのです。それはアクセスキーの入手です。

TwitterはAPIを公開していますが、そのAPIを使うためには4つのカギ(暗証番号)が必要なのです。以下、その手順を説明します。

  • ツイッターアカウントを作る。(当然ですね)
  • ツイッターアカウントを電話番号と紐付ける。このページで設定ができます。
  • Twitterアプリを作成する。このページでCreate New Appと書いてあるボタンをクリックします。するとこのような画面が表示されると思います。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-14-33-57

Nameは作成するアプリの名前です。すでに存在する名前でなければなんでもいいです。32文字以内です。

Descriptionは作成するアプリの内容についての説明です。めんどくさいですが、10文字以上は何か書かなくてはいけないようです。適当に埋めときましょう。

Websiteは作成するアプリが存在するウェブサイトのURLを入力するところです。今回はまだWebアプリを作成するような段階まで進まないので、なんでもいいです。僕は、自分のブログページのURLを入力しておきました。

Callback URLは、詳しく調べていないのですが、作成するアプリがユーザーのアプリ認証を終えた後に自動的に移動する先のURLだと思います。今回はWebsiteで入力したURLと同じで問題ないです。

以上4つの項目を埋めたら、Developer Agreementに同意するにチェックを入れて、Create Your Twitter Applicationと書かれたボタンをクリックします。これでTwitterアプリの作成は完了です。

  • 4つの鍵をメモする。Twitterアプリの作成が終わると、アプリの管理ページが表示されると思います。管理ページはDetails、Settings、Keys and Access Tokens、Permissionsの4つのタブにわけられているので、Keys and Access Tokensを開きます。するとこのような画面が表示されると思います。(黒塗りで隠していますが、英数文字列が表示されているはずです)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-40-56

ここに表示されているConsumer Key (API Key)Consumer Secret (API Secret)をメモします。

続いて、ページの下の方を見ると、Access Tokenを生成するボタンがあるので、それをクリックし、このような画面を表示させます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-11-15-41-42

同様にAccess TokenAccess Token Secretをメモします。

これで、4つの鍵が揃い、ようやくTwitterAPIを使う準備が整いました!疲れた…。


Tweepyの使い方

では、満を持してTwitterAPIをいじっていきましょう!Tweepyのドキュメンテーションを読むと、下のような基本形のPythonプログラムが紹介されています。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

public_tweets = api.home_timeline()
for tweet in public_tweets:
    print tweet.text

これは何をするプログラムかというと、「自分のアカウントのタイムライン(TL)から、最新のツイート20件の情報を取得し、その文章をターミナル上に表示する」プログラムです。

7行あるプログラムのうち、上4行はTwitterAPIを使うためのインスタンスを作成するプログラムで、カッコの中のconsumer_key、consumer_secret、access_token、access_token_secretは、先程メモした英数文字列に置き換えます。この4行はTweepyを使うプログラムでは、必ず記述する必要があります。

下3行は、このプログラムが具体的に何をするかを決めています。そして、ピンク色の部分が、TwitterAPIを実際に利用しているコードです。

Tweepyが提供してくれる関数(要出典)は以下のような形で使います。

api.関数名(引数=値, 引数=値,...).取り出したいデータポイント

引数に何を入れればいいのかは、Tweepyのドキュメンテーションに書いてあります。

上のプログラムで使っている「home_timeline」は「自分のアカウントのTLから最新のツイートの情報を取得する」関数で、最後の行で「.text」が適用されて、文章内容が表示されています。実は、home_timelineが取得する情報は大量で、その一部として「text = ‘ツイート内容’」があるのです。

試しにデータポイントを何も指定せずに最初のプログラムを実行してみると、大量のデータがターミナル上に表示されるでしょう。送られてくるデータは、「text」や「statuses_count」などのデータポイントの名前と、数値、文字列、辞書などのデータがセットになっているので、それを見ながらどんな情報を取り出すことができるのか知ることができます。

Tweepyの使い方は大まかに言うとこれだけです。(これ以外の使い方には手を出していないのでわからない、と言った方が正確かもしれません)


idの罠

引数やデータポイントとして使われる変数の中に「id」があります。しかし一言でidと言っても指すものが複数あり、非常にわかりにくかったのでここで、わかったことをまとめます。

user_id:ユーザーが持つ固有の番号。途中で変更はできない。「@tokkyo13」のようなものは「screen_name」という別物だが、役割はほとんど同じ。

api.get_user(id='@tokkyo13').id   #@tokkyo13のユーザー情報を取得し、user_idを返す

status_id:各ツイートが持つ固有の番号。Twitter上でツイートの詳細を開くとアドレスバーに表示される。

api.home_timeline(count=1),id  #自分のTL上にある最新のツイートの情報を一件取得し、status_idを返す。

リツイートid:他人のツイートをリツイートしたときに、そのツイートが持つステータスidとは別に、新たに生成される番号。リツイート取り消しは、「ツイート削除の関数destroy_statusに、このリツイートidを引数として渡す」という仕様になっています。

api.user_timeline(id='@tokkyo13', count=1).id  #@tokkyo13の最新のツイート一つの情報を取得し、リツイートidを返す

api.home_timeline(count=1, include_my_retweet=1).current_user_retweet  #自分のTL上にある最新のツイート一つの情報を取得し、それが自分のリツイートであった場合、リツイートidを含む辞書データを返す

実践

やはり応用例として何か自分でも作らなければいけないな、と思ったので、自分のツイートを全部削除するプログラムを作ってみました。動機は、以前mt_caret君(Advent Calendar 2016 3日目担当)が、トラブルを避けるために定期的にツイートを全部消しているという話を聞いたことをふと思い出したからです。(彼も何かしらのプログラムで操作していたと思います)

作ったコードはこんな感じです。

import tweepy

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

#自分のアカウントの情報を取得
me = api.me()

#総ツイート数(リツイートを含める)を取り出す
count = me.statuses_count

#総ツイート数を表示
print('総ツイート数:',count)

#ツイートが0になるまで繰り返す
while count > 0:
          for tweet in api.user_timeline(id = me.id, count = 200): #一度に200のツイート情報を取得する
                   api.destroy_status( tweet.id ) #それぞれ削除していく
                   count -= 1 #総ツイート数を1減らす
                   print(count) #総ツイート数を表示する

print ('finish')

一度に200のツイート情報を取得する意味は、単に僕の環境では一度に200が限界だったからです。それ以上の数をcountに指定しても、意味がありませんでした。

そしてこれを実行すると…

img_3734

おお〜!どんどんツイが消えていく…!

そして数十分後、5500件ほどのツイートが全部消えました。しかし最後にAPI通信制限がかかり、エラーを吐いて終了したので少し後味が悪かったです。みなさんも気をつけましょう。

APIの中には、短時間の間にたくさん利用すると、一定期間使えなくなるものがあります。ファボ魔が「ファボ規制かかった〜」とか言ってるあれです。


おわりに

PythonでTwitterAPIを操作するための入口になるような記事を目指しました。よくよく考えると、全然ロ技研と関係なかったような気もしますが、もういまさら遅いので考えることはやめましょう。ここまで読んで下さった方には感謝しかないです。この記事が少しでも役に立ったり、興味を掻き立てたなら光栄です。では皆さん良いクリスマスとお正月を〜😌


おまけ

僕が今回、PythonでTwitterAPIをいじるにあたって、一番大きな壁となり、時間を取られた問題を紹介したいと思います。本文で紹介しなかったのは、その問題がPythonやTwitterとなんの関係もないことだったからです。その問題とは、macに標準でインストールされている「テキストエディタ」の「スマート引用符」という機能です。

スマート引用符とは、テキストエディタで引用符( ‘ ‘ )を入力すると自動で( ‘ ’ )に変換してくれるというApple様のお作りになられたなんともスマートな機能であります。しかし変換後の引用符をつかってPythonコードを書くとエラーが出るので、テキストエディタでプログラムを書いていた僕にはいい迷惑でした。スマート引用符がエラーの原因だと気づくまでの時間はかなり精神的に厳しく、カービィのアニメを2話ほど観ました。

解決方法はかんたんで、テキストエディタの環境設定で、スマート引用符のチェックを外せば完了です。ただし、一度スマート引用符が適用されてしまった過去の保存済みファイルは、依然としてスマートなままなので注意が必要です。

広告

PythonでTwitterAPIをいじろう [Advent2016]」への1件のフィードバック

  1. ピンバック: 自分の作りたいロボット | 慶應義塾大学ロボット技術研究会

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中