初めに
この記事で紹介するプログラムは下記のバージョンにおいて、2022年5月の時点ではTwitterAPI v2のアクセスレベルがEssentialの場合でも動作することを確認しています。また、TwitterAPIを利用する際のキー取得などの手続きの記載はここでは割愛しています。しかしながら、アクセスレベルがEssentialの場合は2022年5月の時点ではTwitterAPIの利用申請が不要であるため、興味がある方は是非ともこの機会に手続きしてみましょう!
この記事は備忘録という形で書かせていただきますが、出来るだけ分かりやすいものになるようにコメントなどを多く記載しました。
バージョン
Python==3.9.2
tweepy==4.10.0
注意
この方法では直近3,200件のツイートしか取得することが出来ないため、それよりも昔のツイートも取得したい!という方は、申し訳ありませんが別の方法をお試しください。
本プログラム全文
import tweepy
import json
# キー情報
bearer_token = "あなたのbearer_tokenをここに書いてください"
consumer_key = "あなたのconsumer_keyをここに書いてください"
consumer_secret = "あなたのconsumer_secretをここに書いてください"
access_token = "あなたのaccess_tokenをここに書いてください"
access_token_secret = "あなたのaccess_token_secretをここに書いてください"
# Twitter API v2 Client
client = tweepy.Client(
bearer_token=bearer_token,
consumer_key=consumer_key,
consumer_secret=consumer_secret,
access_token=access_token,
access_token_secret=access_token_secret,
wait_on_rate_limit=True,
)
# 直近のツイートを取得したいアカウントのユーザー名(@~~~)を指定
username = "直近のツイートを取得したいアカウントのユーザー名をここに書いてください"
# 直近のツイートを取得したいアカウントのIDを取得
user = client.get_user(username=username)
user_id = dict(user[0])["id"]
out_file_name = "out.json"
oldest_id = None
tweet_count = 0
tweets_data = dict()
while True:
# ツイートを100件ずつ取得
tweets = client.get_users_tweets(id=user_id, max_results=100, until_id=oldest_id)
# ツイートを取得することが出来なくなったら終了
if "oldest_id" not in tweets[3]:
break
for tweet in tweets[0]:
# ツイートを追加
tweet_dict = dict(tweet)
tweets_data[tweet_dict["id"]] = tweet_dict["text"]
tweet_count += 1
# 次のループでさらに過去のツイートを取得出来るようにする
oldest_id = tweets[3]["oldest_id"]
# ツイートをjsonデータとして保存
with open(out_file_name, "w", encoding="utf-8") as f:
json.dump(tweets_data, f, ensure_ascii=False, indent=4)
#取得したツイートデータの数を出力
print(f"取得したツイートの数: {tweet_count}")
書き込んだキー情報とユーザー名に誤りがなければ、このプログラムがあるディレクトリ内にout.jsonという先ほど取得したツイートがまとまったjsonファイルが作成されます。続いてこのプログラムについて補足をさせていただきます。
wait_on_rate_limit=True,
tweepy.Client()において、この引数をTrueにすると、メソッドの呼び出し回数がレート制限に引っかかった場合に次のリセットまで待機してくれるので非常に便利です。ここは原則Trueにした方が良いと思います。
tweets = client.get_users_tweets(id=user_id, max_results=100, until_id=oldest_id)
まず、ここではoldest_idよりもidが小さいツイートの中で1~100番目にidが大きいツイートを取得しています。idは古いツイートほど小さくなります。なお、ツイートを100件ずつ取得している理由ですが、Client.get_users_tweets()において一度に取得することが出来るツイート数の最大が100件だからです。
oldest_id = tweets[3]["oldest_id"]
次に、ここでは先ほど取得したツイートの中で最もidが小さいツイートのidをoldest_idに代入することで、次のループではさらに過去に遡ってツイートを取得することが出来るようにしています。
最後に
もしも、もっと良いコードの書き方がある場合や誤った記述がある場合は、コメントにて教えていただけると非常に助かります......。