2026年7月6日更新:X の従量課金の料金を再確認し、Sorsa のコストの数字を1,000項目あたりのバッチレートで捉え直し、100回分の無料リクエストの開始オファーを追加しました。
要点: 2026年に Python で Twitter/X データを取得する実用的な方法は4つあります。X の公式 SDK(
pip install xdk)、Tweepy、ベアラートークンでの素のrequests、またはサードパーティの REST API です。公式の経路はリソース単位で課金し OAuth を必要とします。読み取り専用のサードパーティ API は API キーだけを必要とし、読み取りの多い作業に向いています。
「twitter api python」を検索して、手早い pip install と動くスニペットを期待していたなら、現在の状況は古いチュートリアルが示唆するよりも雑然としています。X(旧Twitter)API は料金モデルを変え、認証を変え、今は1年前には存在しなかった公式の Python SDK を出荷しています。
当社は代替の Twitter/X API である Sorsa API をビルドして運用しているため、読み取り専用の経路は最も熟知した領域です。それは、ヘッダーの中の1つの API キーで、OAuth フローも、待つべき開発者アカウントの承認もなく、プロフィール、ツイート、検索、フォロワーを素の requests からきれいな JSON として返します。読み取りの多い作業では、Sorsa は公式 X API の最大50分の1のコストで動きます。バッチエンドポイントがコストを1,000ツイートあたり$0.02、1,000プロフィールあたり$0.01からに下げ、すべてのプランが一律の毎秒20リクエストを保ち、すべての新規アカウントが100回分の無料リクエストで、クレジットカード不要で始まります。どのプロジェクトもその型に合うわけではありません。投稿が必要なものもあれば、コンプライアンスのために公式 API が必要なものもあり、単にすべてがどう動くかを理解したい開発者もいます。本ガイドは、動作する Python のコード、並べての比較、現行の料金、そしてページネーションして結果を pandas にまっすぐ読み込む完全なデータコレクターとともに、4つの方法すべてを扱います。コードを書かずに呼び出しをテストすることも Sorsa API playground でできます。
目次
- 何が変わったか:2026年の X API
- X API v2 に最適な Python ライブラリ(手早い答え)
- どのアプローチを使うべきか?
- 方法1:公式の X Python SDK(XDK)
- 方法2:Tweepy
- 方法3:ベアラートークンでの素の Python requests
- 方法4:Python requests でのサードパーティ API
- 本番のデータコレクターを作る:ページネーション、リトライ、pandas
- 比較:4つの方法を並べて
- API 認証情報の取得方法
- よくあるタスク:コード例
- 実践:読み取り専用の取得を公式 API から移す
- よくある質問
- 始め方
何が変わったか:2026年の X API {#what-changed-x-api-in-2026}
Twitter API に最後に触れたのが2023年以前なら、変わったのは以下です。
従量課金がデフォルト。 2026年初め、X は古いサブスクリプションの層を消費モデルに置き換えました。新規登録に$100の Basic も$5,000の Proプランもなく、無料枠もありません。前払いでクレジットを買い、読むリソース単位で支払います。投稿あたり$0.005、ユーザープロフィールあたり$0.010、フォロワーまたはフォロー中のレコードあたり$0.010です(数字は2026年7月確認)。自分のアカウントのデータ(自分のタイムライン、自分のブックマーク、自分のフォロワー)の読み取りはリソースあたり$0.001で安いですが、その割引レートは他のアカウントを読むときには適用されません。
書き込みは2026年4月の更新後により高くなった。 標準の投稿は今やリクエストあたり$0.015、URL を含む投稿は$0.20に跳ねます。フォロー、いいね、引用投稿のアクションはセルフサーブの層から完全に引き上げられ、今は Enterprise 契約を必要とします。フォローバックボットや自動いいねを計画していたなら、それは標準の従量課金アカウントではもう不可能です。
ハードな読み取り上限がある。 標準アカウントは月間200万投稿読み取りに制限されます。X はまた、支出の一部を xAI(Grok)API クレジットとして、より高い量で最大20%返します。実際の予算にとってこれが何を意味するかの完全な内訳は、X API 料金の分析 と なぜ Twitter API はこれほど高いか の解説をご覧ください。
X は公式の Python SDK をリリースした。 XDK(X Developer Kit)は、型ヒント、自動ページネーション、ストリーミングのサポートを持つ自動生成された SDK です。pip install xdk でインストールします。X がこれまでに出荷した最初の公式 Python ライブラリです。
Tweepy はまだ動く。 X API v2 をサポートし、最も成熟したコミュニティライブラリであり続けています。既存の Tweepy のコードは現行の認証情報で問題なく動きます。
古いライブラリは死んでいる。 bear による元の python-twitter パッケージはアーカイブされ、PyPI 上の twitter パッケージは何年も更新されていません。チュートリアルが pip install python-twitter と告げるなら、そのチュートリアルは時代遅れです。(sns-sdks が公開する、別の、活発にメンテナンスされる v2 ラッパーは次のセクションで扱います。)
X API v2 に最適な Python ライブラリ(手早い答え) {#best-python-library-for-the-x-api-v2-quick-answer}
短い版だけ欲しいなら:Tweepy が X API v2 に最適な汎用の Python ライブラリです。成熟し、よく文書化され、ベアラートークンと OAuth のフローを通じて読み取りと書き込みの両方をサポートするからです。API 仕様を正確に追うファーストパーティのツールが欲しいなら、公式の XDK を使います。読み取り専用のデータ収集には、多くの開発者がライブラリを完全に飛ばして、素の requests でサードパーティの REST API を呼びます(方法4を参照)。
主要な選択肢の比較は次のとおりです。
| ライブラリ / ツール | 種類 | 最適な用途 | 備考 |
|---|---|---|---|
| Tweepy | コミュニティ | 一般的な連携、ボット、スクリプト | 成熟、大きなコミュニティ、ページネーションとレート制限のリトライを扱う。有料の X API クレジットが必要。 |
| XDK(X Developer Kit) | 公式 | 仕様に厳密なプロジェクト、新規ビルド | OpenAPI 仕様から生成、型付きモデル、新しい(2026年初めにローンチ)。 |
| Twarc2 | コミュニティ | 学術研究、アーカイブ | コマンドライン優先、レート制限を待ち抜き、オフライン分析用に JSON を保存。 |
| python-twitter(sns-sdks) | コミュニティ | 軽量な v2 ラッパー | シンプル、v2エンドポイントに焦点。Tweepy より小さいコミュニティ。 |
| requests(ラッパーなし) | 標準 | 最小限の依存、カスタムクライアント | ページネーションとエラー処理を自分で作る。サードパーティ API とよく合う。 |
上の公式 API のライブラリはすべて X の従量課金の料金を通じて課金します。XDK、Tweepy、素の requests のどれで X を呼んでもコストは同じです。課金が X の側でライブラリ単位ではなくリソース単位だからです。実際に制御できる変数は何件のリソースを取得するかで、そこがサードパーティ API とバッチエンドポイントが計算を変えるところです(以下で扱います)。
どのアプローチを使うべきか? {#which-approach-should-you-use}
コードを書く前に経路を選びます。何時間も節約できます。
| 必要なもの… | 使うもの… |
|---|---|
| 完全な公式サポートでの読み書き | 公式 XDK または Tweepy |
| 規模のある読み取り専用データ、最小限のセットアップ | サードパーティ API(Sorsa クイックスタート を参照) |
| HTTP の完全な制御、依存なし | 素の requests とベアラートークン |
| 書き込みアクション(投稿、Enterprise ではいいね・フォロー) | 公式 XDK または Tweepy(OAuth 必須) |
プロジェクトが公開データ(プロフィール、ツイート、検索結果、フォロワー)を読むだけなら、サードパーティ API が OAuth の煩雑な手順を取り除きます。ヘッダーの中の1つの API キーで、開発者アカウントの申請もクレジットの購入もなく、データの取得を始められます。投稿や書き込みアクションが必要なら、XDK、Tweepy、または素の requests を通じて公式 X API を使います。Sorsa は読み取り専用で、ユーザーの代わりに投稿しません。
方法1:公式の X Python SDK(XDK) {#method-1-official-x-python-sdk-xdk}
XDK は X の最初の公式 Python SDK です。v2 API の全表面を型付きモデルでラップし、ページネーションを自動で扱い、3つの認証方法すべて(ベアラートークン、OAuth 2.0 PKCE、OAuth 1.0a)をサポートします。
インストールします。
pip install xdk
最近のツイートを検索する
import os
from xdk import Client
client = Client(bearer_token=os.environ["BEARER_TOKEN"])
response = client.posts.recent_search(query="python lang:en")
for post in response.data:
print(f"@{post.author_id}: {post.text[:120]}")
これは直近7日間からクエリに一致する投稿を返します。response オブジェクトはページネーショントークンを含むため、カーソルを手で追わずにページをループできます。
ユーザープロフィールを照会する
user = client.users.find_by_username(username="elonmusk")
print(f"@{user.data.username} - {user.data.public_metrics}")
ツイートを投稿する(OAuth 2.0 が必要)
書き込み操作はユーザーコンテキストの認証を必要とします。Client ID と Client Secret を環境変数として設定し、それから:
client = Client(
client_id=os.environ["CLIENT_ID"],
client_secret=os.environ["CLIENT_SECRET"],
)
client.posts.create(post_data={"text": "Hello from the XDK!"})
XDK は、トークンのリフレッシュを含む OAuth 2.0 PKCE フローを内部で扱います。
XDK を使うとき
XDK は、公式サポートが欲しく、書き込みアクセスが必要で、新しいプロジェクトを始めるときの正しい選択です。型付きモデルが IDE の自動補完をよく働かせ、自動ページネーションが定型文を省きます。欠点:SDK は新しく(2026年初めにローンチ、小さいが成長中の GitHub のフォロワー数)、ドキュメントはまだ薄く、そしてすべてのリクエストで X の従量課金の料金を支払うため、投稿読み取りは$0.005、ユーザー照会は$0.010かかり、それらの課金は規模で積み重なります。完全な SDK のドキュメントは docs.x.com/xdks/python/overview にあります。
方法2:Tweepy {#method-2-tweepy}
Tweepy は2009年から存在し、Twitter API に最も人気の Python ライブラリであり続けています。X API v2 をサポートし、レート制限を扱い、広範なコミュニティのドキュメントを持ちます。
インストールします。
pip install tweepy
最近のツイートを検索する
import os
import tweepy
client = tweepy.Client(bearer_token=os.environ["BEARER_TOKEN"])
response = client.search_recent_tweets(
query="python lang:en",
max_results=10,
tweet_fields=["created_at", "public_metrics"],
)
for tweet in response.data:
metrics = tweet.public_metrics
print(tweet.text[:120])
print(f" Likes: {metrics['like_count']} Retweets: {metrics['retweet_count']}")
ユーザーのフォロワーを取得する
user = client.get_user(username="elonmusk")
followers = client.get_users_followers(
id=user.data.id,
max_results=100,
user_fields=["description", "public_metrics"],
)
for follower in followers.data:
print(f"@{follower.username} - {follower.public_metrics['followers_count']} followers")
ツイートを投稿する
client = tweepy.Client(
consumer_key=os.environ["API_KEY"],
consumer_secret=os.environ["API_SECRET"],
access_token=os.environ["ACCESS_TOKEN"],
access_token_secret=os.environ["ACCESS_TOKEN_SECRET"],
)
client.create_tweet(text="Hello from Tweepy!")
Tweepy を使うとき
Tweepy はほとんどの Python 開発者にとって安全なデフォルトです。実戦で試され、コミュニティは大きく、ほぼどんな問題にも Stack Overflow の答えがあります。レート制限の処理、リトライ、ページネーションをきれいなインターフェースでラップします。トレードオフは XDK と一致します。依然として X 開発者アカウントが必要で、依然としてリソース単位で支払い、レート制限は公式 API から継承されます(検索では通常15分の窓あたり300リクエスト、ただしエンドポイントによって変動)。すでに Tweepy のコードが動いているなら、Tweepy に欠ける機能が必要でない限り、XDK に移行する理由はありません。完全なドキュメント:docs.tweepy.org。
方法3:ベアラートークンでの素の Python requests {#method-3-plain-python-requests-with-a-bearer-token}
ライブラリもラッパーもなく、ただの HTTP リクエストです。このアプローチは、送受信されるものの完全な制御が欲しい開発者や、サードパーティのパッケージのインストールが制限された環境で働く人に向いています。
最近のツイートを検索する
import os
import requests
search_url = "https://api.x.com/2/tweets/search/recent"
headers = {"Authorization": f"Bearer {os.environ['BEARER_TOKEN']}"}
params = {
"query": "python lang:en",
"max_results": 10,
"tweet.fields": "created_at,public_metrics,author_id",
}
response = requests.get(search_url, headers=headers, params=params)
data = response.json()
for tweet in data["data"]:
print(tweet["text"][:120])
print(f" Likes: {tweet['public_metrics']['like_count']}")
ユーザープロフィールを取得する
user_url = "https://api.x.com/2/users/by/username/elonmusk"
headers = {"Authorization": f"Bearer {os.environ['BEARER_TOKEN']}"}
params = {"user.fields": "description,public_metrics,created_at"}
response = requests.get(user_url, headers=headers, params=params)
user = response.json()["data"]
print(f"@{user['username']} - {user['public_metrics']['followers_count']} followers")
手動でページネーションを扱う
search_url = "https://api.x.com/2/tweets/search/recent"
next_token = None
all_tweets = []
while True:
params = {
"query": "python lang:en",
"max_results": 100,
"tweet.fields": "created_at,public_metrics",
}
if next_token:
params["next_token"] = next_token
response = requests.get(search_url, headers=headers, params=params)
data = response.json()
all_tweets.extend(data.get("data", []))
next_token = data.get("meta", {}).get("next_token")
if not next_token:
break
print(f"Collected {len(all_tweets)} tweets")
素の requests を使うとき
これは、requests を超える依存をゼロにしたいとき、API の挙動をデバッグしているとき、または1つか2つのエンドポイントだけを呼んで完全な SDK が過剰なときに動きます。欠点は明らかです。ページネーション、エラーコード、レート制限、リトライのロジックを自分で扱います。単発のスクリプトにはそれで問題ありません。本番のパイプラインには、結局自分のラッパーを書くことになり、その時点で Tweepy を再発明しています。この方法も X 開発者アカウントと従量課金クレジットを必要とし、ヘッダーは読み取り専用アクセスにベアラートークンを使います。
方法4:Python requests でのサードパーティ API {#method-4-third-party-api-with-python-requests}
プロジェクトが公開の Twitter データを読むだけなら、公式 API を完全に飛ばしてサードパーティのデータプロバイダーを呼びます。これが 開発者アカウントなしの Twitter データ への実用的な経路です。OAuth も、申請のステップも、クレジット購入のワークフローもなく、ヘッダーの中の1つの API キー、標準の REST 呼び出し、JSON レスポンス、そして何かを支払う前にテストする100回分の無料リクエストだけです。Sorsa の API での見え方は次のとおりです。
ユーザープロフィールを取得する
import requests
headers = {"ApiKey": "YOUR_SORSA_API_KEY"}
response = requests.get(
"https://api.sorsa.io/v3/info",
headers=headers,
params={"username": "elonmusk"},
)
user = response.json()
print(f"@{user['username']}: {user['display_name']}")
print(f"Followers: {user['followers_count']}")
print(f"Tweets: {user['tweets_count']}")
レスポンスは1回のリクエストで完全なプロフィールを含みます。ID、ユーザー名、表示名、プロフィール文、所在地、フォロワー数とフォロー数、ツイート数とメディア数、認証状態、プロフィール画像、アカウント作成日、ピン留めツイート、プロフィール文の URL です。
ツイートを検索する
response = requests.post(
"https://api.sorsa.io/v3/search-tweets",
headers=headers,
json={"query": "python programming", "order": "popular"},
)
for tweet in response.json()["tweets"]:
print(f"@{tweet['user']['username']}: {tweet['full_text'][:120]}")
print(f" Likes: {tweet['likes_count']} Views: {tweet['view_count']}")
各検索リクエストは最大20ツイートを返し、すべてのツイートは user フィールドに完全な作者プロフィールを含みます。ツイート主のフォロワー数や認証状態を得るための追加のリクエスト(そして追加の課金)はありません。ユーザーデータの展開がユーザーあたり$0.010を加える公式 API とは異なります。検索エンドポイントは、X 検索に打ち込むのと同じ高度なコマンド(from:、to:、since:、until:、引用符のフレーズ、ハッシュタグ)をサポートします。完全なリストは Twitter 検索コマンドのチートシート にあります。
フォロワーを取得する
response = requests.get(
"https://api.sorsa.io/v3/followers",
headers=headers,
params={"username": "elonmusk"},
)
for follower in response.json()["users"][:5]:
print(f"@{follower['username']} - {follower['followers_count']} followers")
/followers エンドポイントはリクエストあたり最大200件の完全なプロフィールを、next_cursor パラメータを通じたページネーションとともに返します。
複数のツイートを一括で取得する
response = requests.post(
"https://api.sorsa.io/v3/tweet-info-bulk",
headers=headers,
json={
"tweet_links": [
"https://x.com/elonmusk/status/1234567890",
"https://x.com/OpenAI/status/9876543210",
"1122334455667788",
]
},
)
for tweet in response.json()["tweets"]:
print(f"@{tweet['user']['username']}: {tweet['full_text'][:100]}")
/tweet-info-bulk エンドポイントは1回のリクエストで最大100件のツイート URL または ID を受け付け、作者データ付きの完全なツイートオブジェクトを返します。1回の呼び出しで100ツイートです。
なぜこのアプローチが読み取り専用のプロジェクトに効くか
方法1から3は、X 開発者アカウント(申請のステップ付き)、購入したクレジット、OAuth トークン、そしてリソース単位の課金を必要とします。方法4はヘッダーの中の1つの API キーを必要とします。Sorsa はフラットなリクエスト単位の料金を使います。1回の呼び出しは、何件のツイートやプロフィールを返そうと、自分の枠からの1リクエストなので、20ツイートを返す検索は1つの ID 照会と同じコストです。Sorsa Proプラン(100,000リクエストで月額$199)では、それはリクエストあたり$0.00199になります。バッチエンドポイント経由でルーティングすると、それは /tweet-info-bulk 経由で1,000ツイートあたり$0.02、/followers 経由で1,000プロフィールあたり$0.01からで、レート制限は15分の窓なしにすべてのプランで毎秒20リクエストです。
トレードオフは、書き込みアクセスがないことです。読み取り専用のサードパーティ API を通じて投稿、いいね、フォローはできません。それらが必要なら、書き込みには方法1か2を、読み取りの多い作業にはサードパーティ API を使います。そのハイブリッドこそ、感情分析のパイプラインを動かす fintech のクライアントのためにセットアップした構成です。同クライアントはレガシーの Proプランで月額$5,000を支払っていましたが、すべての読み取り(メンション追跡、競合監視、フォロワー分析)をサードパーティのプロバイダーに移し、アラートを投稿するための最小限の公式のセットアップを保ち、総支出は月額$250未満に落ちました。公式 API から来ているなら、X API 移行ガイド がエンドポイントとフィールド名を対応付けます。
本番のデータコレクターを作る:ページネーション、リトライ、pandas {#building-a-production-data-collector-pagination-retries-and-pandas}
上の単一呼び出しの例はキーのテストには十分ですが、実際のデータ作業はさらに3つのものを必要とします。最初の20件を超えて進むページネーション、1つの悪いレスポンスが長い実行を殺さないためのエラー処理、そして JSON を分析できるものに変える方法です。以下は、Sorsa に対してその3つすべてを行い、それから結果を pandas の DataFrame に読み込んで CSV に保存する、完全な実行可能なコレクターです。
import os
import time
import requests
import pandas as pd
API_KEY = os.environ["SORSA_API_KEY"] # read the key from the environment, never hard-code it
BASE = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": API_KEY}
def post_with_retry(path, payload, retries=3):
"""POST to Sorsa with exponential backoff on transient errors and 429 responses."""
for attempt in range(retries):
try:
response = requests.post(f"{BASE}{path}", headers=HEADERS, json=payload, timeout=30)
response.raise_for_status()
return response.json()
except requests.HTTPError as error:
status = error.response.status_code
if status == 429 and attempt < retries - 1: # rate limited: wait and retry
time.sleep(2 ** attempt)
continue
raise # 401 (bad key), 400 (bad params), and the final 429 surface here
except requests.RequestException:
if attempt == retries - 1:
raise
time.sleep(2 ** attempt)
def collect_tweets(query, order="latest", max_pages=5):
"""Collect tweets for a query, following next_cursor pagination up to max_pages."""
cursor, rows = None, []
for page in range(max_pages):
payload = {"query": query, "order": order}
if cursor:
payload["next_cursor"] = cursor
data = post_with_retry("/search-tweets", payload)
batch = data.get("tweets", [])
rows.extend(batch)
print(f"page {page + 1}: +{len(batch)} tweets (total {len(rows)})")
cursor = data.get("next_cursor")
if not cursor: # no cursor means there are no more pages
break
return rows
if __name__ == "__main__":
tweets = collect_tweets('"machine learning" lang:en', max_pages=3)
df = pd.json_normalize(tweets)
df.to_csv("tweets.csv", index=False)
print(f"Saved {len(df)} rows to tweets.csv")
指摘する価値のあることがいくつか:
- ページネーションは
next_cursorを使う。 各/search-tweetsのレスポンスは最大20ツイートにnext_cursorを加えて返します。そのカーソルを次のリクエストのボディで戻し、空になるまで繰り返します。max_pagesのガードが、幅広いクエリが暴走して枠を燃やすのを止めます。Sorsa のドキュメントがカーソルのフローを詳しく扱っています。 - リトライとバックオフ。
raise_for_status()は失敗したレスポンスを例外に変えます。429(毎秒20リクエストの制限を超えた)は短い指数バックオフとリトライを引き起こします。401は悪いキーを意味し、即座に現れるため、静かに何も収集しない代わりにそれに気づきます。 - キーは環境変数に住む。
export SORSA_API_KEY='your_key'で一度設定し、os.environで読みます。キーをソース管理に決してコミットしないでください。
データを pandas に読み込む
pandas.json_normalize は、ネストされたツイートオブジェクト(user.* の下の埋め込まれた作者を含む)を、1行でフラットなテーブルに平坦化します。
df = pd.json_normalize(tweets)
# Keep the columns most analyses need
columns = [
"id", "full_text", "created_at", "lang",
"likes_count", "retweet_count", "reply_count", "view_count",
"user.username", "user.followers_count", "user.verified",
]
df = df[columns]
# Example: engagement rate per tweet
df["engagement_rate"] = (
df["likes_count"] + df["retweet_count"] + df["reply_count"]
) / df["view_count"].clip(lower=1)
df.to_csv("tweets.csv", index=False) # portable, opens in Excel or Sheets
df.to_parquet("tweets.parquet") # compact, fast to reload for repeated analysis
ここから、作者でグループ化したり、エンゲージメント率を計算したり、感情分類を実行したり(Twitter 感情分析ガイド を参照)、モデルの訓練データセットを作ったりできます。すべてのツイートがすでに完全な作者プロフィールを含むため、フォロワー数や認証状態を得るために作者ごとに2回目の呼び出しは要らず、それがこのパターンが規模で安く留まる主な理由です。
比較:4つの方法を並べて {#comparison-all-four-methods-side-by-side}
| 公式 XDK | Tweepy | 素の requests | Sorsa API | |
|---|---|---|---|---|
| インストール | pip install xdk | pip install tweepy | 組み込み | 組み込み(requests) |
| 認証 | ベアラーまたは OAuth 2.0 PKCE | ベアラーまたは OAuth 1.0a | ベアラートークンヘッダー | ApiKey ヘッダー |
| 読み取りアクセス | あり(リソース単位で課金) | あり(リソース単位で課金) | あり(リソース単位で課金) | あり(リクエスト単位で課金) |
| 書き込みアクセス | あり | あり | あり | なし |
| レート制限 | エンドポイント別の窓(約300/15分) | X API から継承 | X API から継承 | 毎秒20リクエスト(全エンドポイント) |
| ページネーション | 自動 | 自動 | 手動 | 手動(next_cursor) |
| セットアップ時間 | 約30分 | 約15分 | 約10分 | 約5分(承認なし) |
| 最適な用途 | 完全な API が必要な新規プロジェクト | 成熟したプロジェクト、コミュニティ | 学習、最小限の依存 | 規模のある読み取り専用データ |
API 認証情報の取得方法 {#how-to-get-your-api-credentials}
X 開発者アカウント(方法1から3)
- developer.x.com に行き、X アカウントでサインインし、その中に Project と App を作ります。
- 読み取り専用アクセスには、ベアラートークン をコピーします。この1つのトークンは検索、ユーザー照会、タイムラインに十分です。
- 投稿と他の書き込みアクションには、ユーザー認証設定 を開いて権限を 読み書き に設定し、それから4つの OAuth 1.0a の認証情報を生成します。API キー(コンシューマーキー)、API キーシークレット(コンシューマーシークレット)、アクセストークン、アクセストークンシークレット です。投稿には4つすべてが必要です。
- 開発者コンソールでクレジットを購入します。従量課金に最低支出はありませんが、認証済みの呼び出しが成功する前に残高がゼロを超えていなければなりません。
認証情報は、コードの中ではなく環境変数に保存します。
export BEARER_TOKEN='AAAAAAAAAAAAAAAAAAAAAxxxxxxx'
export API_KEY='your_api_key'
export API_SECRET='your_api_secret'
export ACCESS_TOKEN='your_access_token'
export ACCESS_TOKEN_SECRET='your_access_token_secret'
ベアラートークンをどこで見つけるか、権限を読み書きにどう切り替えるかを含む、ポータルのスクリーンショットごとの案内は、Twitter/X API キーの取得方法 のガイドをご覧ください。各認証情報がリクエストあたりいくらかかるかは、上の「何が変わったか」のセクションをご覧ください。
Sorsa API キー(方法4)
- api.sorsa.io/overview でアカウントを作ります。
- API キーはダッシュボードのキーのページで即座に生成されます。
- リクエストを始めます。すべての新規アカウントは100回分の無料リクエストを含みます。1回限り・クレジットカード不要・有効期限なしで、40個のエンドポイントすべてをカバーします。申請プロセスも、始めるためのクレジット購入もありません。
Sorsa のドキュメントのクイックスタートが、ApiKey ヘッダーの形式を含む最初の呼び出しを1分未満で案内します。
よくあるタスク:コード例 {#common-tasks-code-examples}
キーワードでツイートを検索する方法
4つの方法すべてがキーワード検索をサポートします。方法1から3は X API v2 の recent-search エンドポイント(直近7日間、またはレガシー Pro では完全なアーカイブ)を使います。方法4は完全な公開アーカイブを検索します。複雑なクエリを作るには、コマンドを組み合わせます。"machine learning" from:OpenAI since:2026-01-01 -is:retweet は、2026年1月以降にそのフレーズに言及する @OpenAI からのオリジナル投稿を返します。ビジュアルなビルダーには、Sorsa の playground の中の検索ビルダーを使います。完全なコマンドのリファレンスは上でリンクした検索コマンドのチートシートにあります。
過去のツイートを取得する方法
公式 API の recent-search エンドポイントは、レガシーの完全アーカイブアクセスを持たない限り、直近7日間しかカバーしません。サードパーティ API は完全なアーカイブを直接検索し、日付のコマンド(since:、until:)が古い投稿を遡ってページネーションさせます。大きな過去の取得とそれに伴うトレードオフは、過去の Twitter データ のガイドをご覧ください。
ユーザーのフォロワーを取得する方法
公式 API では、フォロワーリストは1ページ100ユーザーでページネーションされ、各プロフィールは課金可能な$0.010のリソースなので、1,000フォロワーはユーザー読み取りでおよそ$10かかります。Sorsa を通じては、/followers がリクエストあたり最大200プロフィールを返すため、1,000フォロワーは5リクエスト、Proプランでおよそ$0.01です。より詳しくは Twitter フォロワー API ガイド にあります。
ID でツイートデータを取得する方法
ツイート ID のリストがあるとき、バッチ照会が効率的な経路です。公式 API では、GET /2/tweets?ids=... が最大100 ID を受け付け、返されたツイートあたり$0.005で課金します。Sorsa では、POST /tweet-info-bulk が最大100の URL または ID を受け付け、1リクエストと数え、作者データ付きの完全なツイートオブジェクトを返します。
実践:読み取り専用の取得を公式 API から移す {#in-practice-moving-read-only-pulls-off-the-official-api}
よく見るパターン:チームが、古いチュートリアルが示すからという理由で Tweepy とともに公式 X API で始め、それからデータを読むだけのプロジェクトで摩擦に当たります。あるチームは、数千の追跡アカウントのプロフィールと最近のツイートを取得する日次のコレクターを作った後に相談に来ました。コードは動いていましたが、すべての実行が課金可能な投稿とユーザーの読み取りを燃やし、開発者アカウントの承認と OAuth リフレッシュのロジックがセットアップ時間を加え、月間200万読み取りの上限が、アカウントのリストが増えるにつれて量を注意深く見張ることを意味しました。
修正は書き直しではなく、トランスポート層での入れ替えだけでした。収集のロジック、pandas の正規化、そしてスケジューリングはすべて同じままでした。Tweepy クライアントを方法4の素の requests のパターンに置き換え、それを検索と /followers のエンドポイントに向け、OAuth フローを完全に落としました(トークン管理の代わりに1つの ApiKey ヘッダー)。各リクエストが、リソース単位で課金する代わりに最大20ツイートまたは200フォロワープロフィールを返すため、同じ日次の取得が以前の何分の1かかかり、そして毎秒の制限が、ペースを配分すべき唯一のものとして月次上限に取って代わりました。読み取り専用のワークロードには、公式 API は単純な仕事をする高価な方法だったのです。
よくある質問 {#faq}
2026年に Python 向けの無料の Twitter API はある?
X からはありません。公式 X API は従量課金の下で無料アクセスがありません。リクエストをする前にクレジットを購入しなければならず、新規アカウントは無料クレジットを得ません。Sorsa はすべての新規アカウントに100回分の無料リクエストを与えます。1回限り・クレジットカード不要・有効期限なしで、40個のエンドポイントすべてをカバーし、バッチエンドポイントを通じて最大10,000ツイートまたは20,000プロフィールに十分です。完全な内訳は、2026年に Twitter API が無料か の分析をご覧ください。
Python で Twitter データを取得する最も簡単な方法は?
requests ライブラリでサードパーティの REST API を呼びます。API キーを取得し、ヘッダーで渡し、クエリを検索エンドポイントに POST します。JSON は Python の辞書に、そして pandas にまっすぐ対応します。OAuth フローも、待つべき開発者アカウントの承認もないため、公式 API に Tweepy を加えるより簡単です。
Python でツイートを pandas の DataFrame にどう読み込む?
ツイートオブジェクトをリストに収集し、それから pandas.json_normalize(tweets) を呼んで、ネストされたフィールド(埋め込まれた作者を含む)を1行で DataFrame に平坦化します。ポータブルなファイルには df.to_csv("tweets.csv", index=False) で、素早く再読み込みできるコンパクトな列指向のファイルには df.to_parquet(...) で保存します。ここから、通常の pandas でフィルター、グループ化、エンゲージメント指標の計算ができます。
Python でツイートをどうページネーションする?
各レスポンスは next_cursor(公式 API では next_token)を含みます。それを次のリクエストで戻し、空になるまで繰り返します。幅広いクエリが暴走して枠を消費しないよう、必ずループを max_pages のガードで制限します。上のコレクターのスクリプトがそのパターンを示します。
API キーなしで Python で Twitter データを取得できる?
技術的にはyes、Twikit や Playwright のようなライブラリでのウェブスクレイピングを通じてですが、X が内部トークンと GraphQL 識別子を回すたびにスクレイパーは2〜4週間ごとに壊れ、アカウント停止のリスクを負います。信頼できるアクセスには、API キー(X またはサードパーティのプロバイダーから)が実用的な経路です。技術的なアプローチは X のスクレイピングガイド を、マネージドの選択肢は Twitter スクレイパーの比較 をご覧ください。
Python 開発者にとって Twitter API アクセスはいくらかかる?
公式 X API では:投稿読み取りあたり$0.005、ユーザープロフィール読み取りあたり$0.010、作成される標準の投稿あたり$0.015、URL を含む投稿は$0.20です。20ツイートを返す検索は$0.10、1,000件のフォロワープロフィールの取得はおよそ$10かかります。月間200万投稿読み取りの上限があります。Sorsa では、フラットなリクエスト単位の課金が、バッチエンドポイントで1,000ツイートあたり$0.02、1,000プロフィールあたり$0.01からになり、プランは月額$49から、開始に100回分の無料リクエストが付きます。
Tweepy は2026年にまだ動く?
はい。Tweepy は X API v2 をサポートし、現行の認証(ベアラートークンと OAuth)で動きます。有料の X API クレジットを必要とします。従量課金の下では、購入したクレジットを持つアクティブな X 開発者アカウントなしに Tweepy を使う方法はありません。
Python で Twitter API のレート制限をどう扱う?
公式 API は15分の窓ごとに制限を強制し(エンドポイントによって通常300〜900リクエスト)、達すると Retry-After ヘッダー付きの 429 を返します。Tweepy と XDK は自動でバックオフします。素の requests では、ヘッダーを確認してリトライ前にスリープします。エンドポイント別の制限の完全な表は、X API レート制限ガイド をご覧ください。Sorsa のようなサードパーティ API は窓の代わりに毎秒の制限(毎秒20リクエスト)を使うため、429 で1秒待ってリトライします。
始め方 {#getting-started}
方法を選んで、上の例の1つを実行します。
- 読み取り専用のデータ: Sorsa のダッシュボード からキーを取得し、任意の方法4の例の
headersの辞書に貼り付け、スクリプトを実行します。最初の100リクエストは無料で、クレジットカード不要、そして1分未満で構造化された Twitter データがターミナルに届きます。Sorsa API のドキュメント が40個すべてのエンドポイントを扱います。 - 読み書き: developer.x.com で X 開発者アカウントを作り、クレジットを購入し、ベアラートークンで XDK か Tweepy の例を実行します。
- まだコードなし: 上でリンクしたブラウザベースの playground が、Python を1行書く前に任意のエンドポイントをウェブ UI を通じてテストさせます。
読み取り専用のプロバイダーのより広い見方は、Twitter API の代替の比較 をご覧ください。
監修:Keksich(Sorsa創業者、マーケター兼X APIリサーチャー)
本ガイドの検証方法 {#how-we-verified-this-guide}
当チームは2026年7月に、すべての外部の主張を一次情報源に対して確認しました。公式 XDK の詳細(pip install xdk パッケージ、自動生成されたクライアント、自動ページネーション、ストリーミング、そして3つの認証方法)は、Python と TypeScript の XDK に関する X の開発者向けの発表と、docs.x.com 上の XDK ドキュメントから来ています。Tweepy の継続的な v2 サポートは、Tweepy のドキュメントに対して確認しました。X API の料金の数字は、2026年4月の書き込みコストの変更を含む現行の従量課金モデルを反映し、Sorsa のエンドポイントの挙動、リクエスト単位のバッチ処理、プランの料金は Sorsa API のドキュメントから来ています。ツイート数やライブラリのスター数は動くため引用しません。数字が古くなり得るところでは、代わりに仕組みを記述します。公開以降にずれた数字を見つけたら、製品内のドキュメントがつねに現行の信頼できる情報源です。