Tweepy
前回、PythonでTwitterを制御するためのライブラリTweepyのインストールから、API設定、初めてのツイートをしてみました。

今回はどんなアプリケーションを作りたいのか、そのためにTweepyで必要なコマンドの勉強していきたいと思います。
最終的には1日の私の発言に対して「いいね」や「リツイート」をしてくれたユーザーをランキングにして、感謝のメッセージをつぶやくというアプリケーションを作りたいというのは、前にAPI取得の際にお話しした通りです。
そのためにはTweepyのどんな機能を使うといいのか、そこをまず見定めて勉強していくというわけです。
もちろんTweepyでできること全部先に学び、その後でアプリケーションを作るという考えもあります。
でもプログラミングを習得するには作りたいものを思い描いて、作りたいものを作るという点に集中して勉強するということの方が上達は速いと思います。
ということで始めていきましょう。
作りたいアプリケーションの機能を分割
まずはどんなアプリケーションを作りたいのか、そのためにプログラムで必要なステップは何かを分割していきましょう。
最終的に作りたいアプリケーションは「1日の私のつぶやきに対して、いいねやリツイートをしてくれたユーザーをランキングにして、感謝のメッセージをつぶやく」というものです。
ただ色々調べていくうちにどうやら「いいねをしてくれたユーザーの取得」は基本機能としてはなく、かなり難しいプログラムとなるようです。
こういう場合は妥協も大事です。
ということで「1日の私のつぶやきに対して、リツイートをしてくれたユーザーをランキングにして、感謝のメッセージをつぶやく」というアプリケーションを最終目標としましょう。
この場合、
- 1日の私(@Nori_3PySci)のツイートを取得(旧アカウントです。新アカウントは@3PySci_Nori)
- 取得したツイートの中でリツイートされたツイートを取得
- リツイートされたツイートからリツイートしてくれたユーザーの取得
- リツイートした回数によってランキングの作成
- 作成したランキングをツイートする
といった流れになるでしょう。
この中でTweepyの機能を使って行うことは、1. 2. 3. 5. です。
ちなみに5. に関しては前回ツイートの仕方を学んだのですでに終了。
そして1. 2. 3.に関しては「ツイートの取得」ということで一括りにできそうです。
ということで今回と次回を使ってツイートの取得を学んでいきましょう。
特定ユーザーのツイートの取得
今回は特定ユーザーのツイートを取得する方法を学んでいきましょう。
ちなみにTweepyにはツイートの取得方法がいくつかあるようなので、また機会がありましたら解説していきたいと思います。
まずは前回行ったようにTwitter APIへの接続を行います。
<セル1>
import tweepy
consumer_key = 'API keyを入力'
consumer_secret = 'API key secretを入力'
access_token = 'Access tokenを入力'
access_token_secret = 'Access token secretを入力'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
実行結果
これで今後は「api」とするとTweepyのコマンドが使えるようになります。
特定のユーザーのツイートを取得するには、「api.user_timeline(“@アカウント名”)」となります。
私のTwitterアカウント名は「@Nori_3PySci」としてタイムラインを取得してみましょう。
<セル2>
print(api.user_timeline("@Nori_3PySci"))
実行結果
[Status(_api=<tweepy.api.API object at 0x7fa02d5d9f90>, _json={'created_at': 'Thu Jan 07 12:03:02 +0000 2021', 'id': 1347151757764403201, 'id_str': '1347151757764403201', 'text': '1ヶ月くらいで私としてはまあまあな結果を出せた。(以下略)
何やらツイートが取れてきましたが、かなり生データに近く、読みづらいデータが表示されました。
(以下、私が試している時のツイートのデータが表示されていますので、みなさんが全く同じコマンドで試した際には異なるツイートのデータが取得されますので、ご注意ください)
タイムラインの各ツイート本文を取得
このままではどんなツイートなのかよく分からないので、ツイート本文を取得してみましょう。
ちなみに先ほど取得したのはタイムラインということで、複数のツイートのデータが含まれているようです。
ということでfor文を使って、ツイートを一つずつ取得して、本文を表示してみます。
ツイート一つを取得したのち、「.text」とすることでツイート本文を取得できます。
<セル3>
tweets = api.user_timeline("@Nori_3PySci")
for tw in tweets:
print(tw.text)
実行結果
1ヶ月くらいで私としてはまあまあな結果を出せた。
(以下略)
ツイート本文が取得できました。
ツイートIDの取得
ちなみにツイートはそれぞれ固有のIDを持っています。
逆にいうとツイートIDからツイートのデータを取得するということも可能なわけです。
ということで先ほど取得したツイートのIDを表示させてみましょう。
先ほど同様、for文を使ってツイートを一つずつ取得したのち、「.id」とすることでツイートIDを取得できます。
<セル4>
tweets = api.user_timeline("@Nori_3PySci")
for tw in tweets:
print(tw.id)
実行結果
1347151757764403201
1347139585881513988
1347136844723494918
1347110192958169092
1347107212997636096
1347074909340504067
1347061563547471874
1347056756526964738
1347055348260065280
1347036436063666178
1347027010606878727
1347013156657262592
1346995398401904640
1346995372745392130
1346986708781260804
1346986189618778114
1346986142298591232
1346985918175956993
1346985892049666058
1346970189808603137
19桁の数字がIDで、それが20個取得できているのが分かります。
特定のツイートIDからツイートのデータの取得
少し横道にそれますが、取得したツイートIDから特定のツイートのデータを取得してみましょう。
ツイートIDからデータを取得するには「api.get_status(id)」とします。
先ほどの20個のツイートIDのうち、最後の「1346970189808603137」のデータを取得してみましょう。
<セル5>
print(api.get_status(1346970189808603137))
実行結果
Status(_api=<tweepy.api.API object at 0x7fa02d5d9f90>, _json={'created_at': 'Thu Jan 07 00:01:33 +0000 2021', 'id': 1346970189808603137, 'id_str': '1346970189808603137', 'text': 'RT @minoris2020: おはようございます😊\n\n1/7 11:00~ 吉野家で牛丼無料っていうのに飛び付いちゃいました\n\nまず、テイクアウトで頼んで、\n大吉と書かれた器だったら、\n次回、お店に行った時に\nその器を出すと\n牛丼並盛が1杯無料、とのこと\n\nドキドキのおみく…', 'truncated': False, 'entities': {'hashtags': [], 'symbols': [], 'user_mentions': [{'screen_name': 'minoris2020', 'name': 'みのり', 'id': 1269306546963443718, 'id_str': (以下略)
IDからツイートデータが取得できました。
20個以上のツイートの取得 その1
ちなみに先ほど20個のツイートが取得できていましたが、20個までしか取得できないかというとそうではありません。
実は先ほど用いた「api.user_timeline(“@アカウント名”)」は、Twitterのページをもとにデータを取得する方法なのです。
つまり先ほどの20個のデータは、私のタイムラインの1ページ目に出てくる20個のツイートというわけです。
他のページのツイートを取得するにはオプション関数として「page = ページ数」とすることで取得できます。
ということで2ページ目を取得してみましょう。
<セル6>
tweets = api.user_timeline("@Nori_3PySci", page=2)
for tw in tweets:
print(tw.text)
実行結果
RT @hero_mieno: 本当にそう。
リーダーは部下の障壁を取り払うのが仕事。
成長や成果に必要な心理的障壁、能力的障壁、物理的障壁をどうやって越えさせるか、取り払うか。
RT @hero_mieno: どの技術がイノベーションとなり得るかを予測することは難しい。
まだアップルのように最終製品を製造する企業では自ら変化を生み出すことができるが、アップルに部品や素材を提供する企業にはその変化を予測することは極めて難しい。
@hawkchild111013 タカさん、おはようございます😆
今日も一日頑張っていきましょう👍
(以下略)
先ほどとは違うツイートが取得できました。
20個以上のツイートの取得 その2
ページで他のツイートが取得できることは分かりました。
しかしいちいちページを指定してツイートを取得するのは面倒ですよね。
実は他のコマンドと組み合わせることで、もっと多くのツイートを取得できるようになっています。
それが「Cursor」というコマンドです。
先ほどの「api.user_timeline」と合わせて「tweepy.Cursor(api.user_timeline, id = アカウント名).item(取得数)」とします。
とりあえず100個のツイートを取得して、idを変数に格納し、格納されたidの個数を表示させてみましょう。
<セル7>
tweets = tweepy.Cursor(api.user_timeline, id="@Nori_3PySci").items(100)
tweet_ids = []
for tw in tweets:
tweet_ids.append(tw.id)
print(len(tweet_ids))
実行結果
100
確かに100個のツイートが取得できているようです。
これで特定ユーザーのツイートを取得する方法が大まかにですが学ぶことができました。
次回はここからリツイートされたツイートを取得、リツイートしてくれたユーザーの取得を行っていきましょう。

ということで今回はこんな感じで。
コメント