X(旧Twitter)で著名人のポストを取得する方法(2024年11月)

(内容やコードは誤りを含む可能性があるのでその点ご理解の上各自自己責任のもとご参照下さい)

# 概要
本記事で取り扱うことは次の通りです。
1. Ｘの開発者用アカウントを取得する
1. 認証関連のキーを取得する
1. コードを書いてポスト（ツイート）を取得する

# ちょっとした背景
筆者は仮想通貨を時々触ってbotを作りたいなと思っては途中で断念するということを繰り返してしまっておりました。その中で、私がフォローさせて頂いている方々が「イーロンのツイート監視して動物呟いていないか見るべきでは」みたいなことをつぶやいておられました。ほかにも「トランプがXに戻ったので常にツイート見ておいたほうがいいんじゃないか」のみたいなのもありました。

自分は過去botを作ろうにもアイディアがなくて頓挫ということを繰り返しているのですが、これを見てアイディアのベースとなるものを頂いた気がしたので作ってみることにしました。

# 本題
概要で述べた3ステップに分けて進めていきます。

## ステップ1：開発者アカウントを取得する
まずは開発者アカウントの作成です。とりあえず[開発者向けページ](https://developer.x.com/en)に行きます。日本語ページもあるようですが、英語のほうが充実している気がするので最初からそれで進みます。

さて、少し下に進むと下記のようにプランの説明があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936754/de3eed34-0422-e66d-3aee-52a12664cbbd.png)

まあ結構真面目に情報取ろうとするとすぐ制限引っかかりそうだしとりあえずベーシックかなぁとかおもって値段を見ると月額200ドルもします。現在のドル円レートで3万円ちょい。いや高いわ。そんな技術もないのにまた即飽きて撤退となったらたまらん、、、ということでとりあえずFreeプランで進みます。

すると「Describe all of your use cases」というのが出てきます。あーはいはい、何に利用するか書けばいいのね、「I would like to retrieve some tweets from an account」と…と打ち込むと気が付くと思いますが、よもやの「250単語以上で書きなさい」というメッセージが出ています。いや長い。どこかの入社試験の志望動機並みに長いじゃないのよ。ということでここは人類の叡智であるAI様に「次のことをやりたいんだけど250単語以上のいい感じの英語に膨らませてください」とお願いしました。

志望動機書かせるくらいなので審査とかあるのかと思いきゃ即ログイン可能に。ありがたい。

## ステップ2：認証キーを取得する
さて、登録を済ませると開発者ポータルというところに進めるようになります。ここでは自分の作ったプロジェクト一覧が見られるようですが、何もしなくても次のようにデフォルトで何かが生成されていますが、とりあえずこのプロジェクトのDefaultxxxのところを押すと、そのプロジェクトの詳細に進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936754/d9073dcf-9ce0-a585-367b-ec2b342b8d05.png)

進んだ先のページでは、Accessというところで今のプランに応じた制限がかかれていたり、Usageというところで今どれくらいリクエストを消費したか(この場合無料プランで1か月のツイート取得制限100のうち10使用済)、などが書かれています。一番下のAppsの右側のカギのようなマークを押すと各種認証関連のキーのページへ進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936754/b7edb90c-65b2-e6bb-330a-41ca4db42502.png)

すると、Consumer KeysとAuthentication Tokensというものが出てきます。これらは認証方法やバージョン、用途などによってどれが必要かは異なるようですが、ここでは詳説は割愛。後でBearer Tokenというものを使うので、それをGenerateしてコピペしておきます。どうやら表示は一度しかされず、あとで再表示するということはできない仕様になっているようです（それでもRegenerateすれば作成できるので問題はありませんが）。

## ステップ3：コードを書く
さて本題のコードです。もちろん正式なドキュメントを読むのがベストだとは思いますが、サンプルコードもいろんな言語で書かれていて非常に充実しています。

https://github.com/xdevplatform/Twitter-API-v2-sample-code

検索を行うとかLikeの数を集計するとか、自分の想像以上に様々なユースケースがあるようで自分がやりたいことはどれに相当するのか、若干困惑しました。

が、機能としては[user_tweets](https://github.com/xdevplatform/Twitter-API-v2-sample-code/blob/main/User-Tweet-Timeline/user_tweets.py)で少なくともやりたいことはできます。
具体的には下記。（一部、解説及び省略のためにコメントを変えました。）

```python:qiita.rb
import requests
import os
import json

bearer_token = "上記で取得したbearer_token"

def create_url():
    user_id = 44196397 #ユーザーID。注意なのが@elonmuskなどではなくそれを変換したものであること。これはelonmuskのもの。
    return "https://api.twitter.com/2/users/{}/tweets".format(user_id)

def get_params():
    return {"tweet.fields": "created_at"}

def bearer_oauth(r):
    r.headers["Authorization"] = f"Bearer {bearer_token}"
    r.headers["User-Agent"] = "v2UserTweetsPython"
    return r

def connect_to_endpoint(url, params):
    response = requests.request("GET", url, auth=bearer_oauth, params=params)
    print(response.status_code)
    if response.status_code != 200:
        raise Exception(
            "Request returned an error: {} {}".format(
                response.status_code, response.text
            )
        )
    return response.json()

url = create_url()
params = get_params()
json_response = connect_to_endpoint(url, params)
print(pd.DataFrame(json_response['data']))
```

bearer tokenは良いとして、コード内にも書いた通り、useridというのが"elonmusk"のような文字列ではないという点に注意。User LookupというEndpointを使って取得するのが正攻法なようですが、面倒な場合はありがたいことにChatGPTが教えてくれます。すごい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936754/33e44e57-b558-b9bb-f5e0-820a17af074b.png)

さて、こうして取得したuseridを入れて上のコードを走らせると次のような結果が出ます。
テキスト、いつのツイート、そのIDなど。見ればわかりますが左側の列がツイートの中身ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936754/5db63923-825f-3798-312d-fe7487a3f0ae.png)

なおこれは自身から発したツイートのみではなく、誰かへのリプライやRepost(RT)も含まれることに注意が必要です。別の言い方をすると、「Post」のページ(各ユーザーのトップページ)ではなく、「Replies」のページを取得しているぽいです。例えばこの3つのツイートは、「＠だれだれ」で始まることからも確認できるように、いずれも誰かへの返信の形で行われています。また、RTも含むものになっています。あとはこのテキスト部分を自分なりに利用する(とある特定の単語、動物名を含むか等々)ことで面白いものが見えてくるかもしれません。

色々検索してみましたがプランや仕様が時々変わることもあるようなので、とりあえずは動くものを作れてよかったです。どなたかの参考になれば幸いです。

(本記事は間違いを含む可能性もあり、筆者は如何なる責任も負いません)