Twitter APIの基本的な使い方を記事にしてまとめてみました。
この記事ではpythonのTwitter APIのライブラリtweepyを使って、いろいろやっていきます。
関連リンク
Tweepy Documentation — tweepy 3.5.0 documentation
Tweet object — Twitter Developers
前準備
まずはtweepyをpipでインストール。pip install tweepy
Twitter APIを利用するにはAPI keyやAccess tokenが必要になるので、持ってない方はDeveloper登録の申請を始めにする必要があります。
Developer登録の方法は次の記事参照。
REST APIを使ってみる。
ここでは使用制限が厳しいREST APIの使い方について書いていきます。
まずはOAuth認証をしてAPIのインスタンスを作ります。(認証キーは各自Developer登録をすると使えるようになります。)
以下、REST APIをつかうときは上のプログラムの続きに書いているものとします。
タイムラインの取得
自分のタイムラインと指定したユーザーのタイムラインの取得方法について書いた記事。基本的な使い方から一度に大量のツイートを取得する方法が書かれています。
ツイートの検索
ツイートの検索をするにはsearch()
を使います。
ツイートの投稿と指定したユーザーへのリプライ
ツイートを投稿するにはupdate_status()
を使います。
過去に投稿したツイートと全く同じものをツイートしたら以下のエラーが出ます。
リプライするには返信先のツイートのIDをin_reply_to_status_id
に渡します。
例えば次のツイートに返信したい場合、status/以下の値がツイートのIDになります。
リプライするときは必ず返信先のスクリーンネームを入れましょう。
例えば、あるユーザーの最新のツイートにリプライしたいときは次のようにします。
リツイートする
retweet(id)
でリツイートできます。
下の例は特定のユーザの最新のツイートをリツイートしています。
自分or指定したユーザのフォロワーの情報を見る
フォロワーの情報を見るにはfollowers()
を使います。何も渡さなければ自分のフォロワーを見ることができ、指定したユーザーのフォロワーを見るには次のようにします。
一度に取得できるフォロワーの数は最大で100件までです。
フォローしたと見せかけて速攻フォロー解除する
フォローするにはcreate_friendship(screen_name)
フォロー解除するにはdestroy_friendship(screen_name)
あるユーザー同士がお互いにフォローし合っているか確認する
あるユーザー同士がお互いにフォローし合っているか確認するにはfriend_ship(source_screen_name, target_screen_name)
を使います。
結果は長さが2のタプルの形になっていて、一つ目の要素にはユーザーAがユーザーBをフォローしているかをfollowing
にTrueもしくはFalse、ユーザーAがユーザーBにフォローされているかがfollowed_by
にTrueもしくはFalseが入っています。
二つ目の要素でユーザーBがユーザーAをフォローしているか、ユーザーBがユーザーAにフォローされているかを確認できます。
トレンドを取得する
トレンドを取得するにはtrends_place(id)
、idにはWOEIDを指定する。
これにより指定した地域のトレンドを取得できる。
WOEIDはこちらのサイトで検索でき、検索結果は入力フォームを下にスクロールすると見ることができます。
このコードでトレンド(※一度に50個)を取得できる。
Twitter APIを使うとこんなことができます。
①現在地球上(宇宙ステーションを含める)で投稿されているツイートを手に入れる
タイトルが少し大袈裟になってしまいましたが、Streaming APIを使うと現在世界で投稿されているツイートを手に入れることができます。
ただし、すべてのツイートを手に入れることはできません。
世界で投稿されているツイートの中からランダムに選ばれたものを手に入れることができます。
手順はざっとこんな感じです。
- TweepyのStreamListenerを継承する。
- 認証する。
- TweepyのStreamを作成する。
twitter_api.py
とstreaming_status.py
を使ってツイートを手に入れてみます。ソースコードは下に置いてあります。
1. TweepyのStreamListenerを継承する。
手に入れたツイートはStatusオブジェクトの形でon_status()
に渡されます。
ツイートを見るには.text
、スクリーンネームを見るには.user.screen_name
です。詳細はこの記事の一番↓にあるツイートの属性についてに書きました。
2 and 3. 認証し、ストリームの作成。
リアルタイムで投稿されているツイートを手に入れる
1 ~ 3が完了すれば、準備は整いました。あとは、sample()
もしくはfilter()
を使うとこの世界で投稿されているツイートを手に入れることができます。
sample()
を使うと世界で投稿されているツイートの中からランダムに選ばれたものを手に入れることができます。オプションで言語やキーワードの指定はできないのでon_status()
でツイートのフィルタリングをする必要があります。
フィルタリングのサンプル(クリックすると見れるかも)
filter()
を使うとオプションである単語を含むツイート、指定した言語のツイートのみを手に入れることができますが、個人的にこの方法はお勧めしません。
単語を指定するにはtrack
を使いますが、複数の単語を指定したときに手に入れることができるツイートは指定した単語がひとつでも含まれていた場合のみです。
次の例だと、
例(track=["python", "trump"])
- pythonを含むツイート or trumpを含むツイートを手に入れることができる
要するに単語を複数指定した場合、指定した単語全てを含むツイートは手に入れることは難しいです。pythonとjavaを指定すると両方を含んだツイートを手に入れることができるかもしれませんが。
しかも、日本語のような単語の前後に空白が無い言語だとtrack
にカレーを指定すると、
手に入れることができるツイート
川崎 ランチ》ランチ営業始めました!ドリンク&サラダ付きのランチメニュー500円~♪ #川崎 #ランチ #食べ放題 #カレー!!
手に入れることができないツイート
カレーおいすぃ
指定したキーワードがハッシュタグになっているもの、もしくは指定したキーワードの前後に空白があるツイートは手に入れることができます。
そのため、日本語のキーワードでフィルタリングしたい場合はsample()
を使ってon_status()
内で正規表現などでフィルタリングするのがいいと思います。
①のソースコード
streaming_status.py(クリックすると見れるかも)
会話データを手に入れる
seq2seq用のデータを集める方法について。
Twitter APIを利用して3つの発話から構成する対話データを収集してみた。
おまけ
スクリーンネームって何?
スクリーンネームは赤い矢印がさしているところ。
手に入れたツイートがリツイートかどうか調べる方法
ツイートがリツイートでなければ、retweeted_status
がツイートの属性には含まれないので、以下のようにすればツイートがリツイートか確認できる。
in演算子使ったほうが楽かな?
ツイートの中身の情報について
status.text | ツイート |
status.id | ツイート固有のID |
status.in_reply_to_status_id | リプライ先のツイートID |
status.retweet_count | リツイート数 |
status.favorite_count | いいねの数 |
status.user.name | ユーザー名 |
status.user.screen_name | スクリーンネーム(@pytry3g) |
status.user.friends_count | フォロー数 |
status.user.followers_count | フォロワー数 |
status.user.description | 自己紹介? |