Contents
1. X API の概要と 2025‑2026 年のプラン・権限変更点
X 社は 2024 年に「権限分離モデル」を導入し、従来の Read/Write 一括許可から機能ごとのスコープ取得へ移行しました。これにより、アプリが本当に必要な権限だけをリクエストでき、審査通過率が向上すると同時にセキュリティリスクが低減します【1】。
主要プラン(2025‑10 月版)
| プラン | 月間リクエスト上限* | 主なスコープ例 | 料金 (USD) |
|---|---|---|---|
| Free | 500 リクエスト / 15 分 | tweet.read、users.read | 無料 |
| Basic | 50,000 ツイート / 月 | tweet.read、tweet.write、offline.access | $99 / 月 |
| Enterprise | カスタム上限(要相談) | 全スコープ(例:ads.manage も含む) | 個別見積 |
*「リクエスト」は API エンドポイント呼び出し回数です。
出典: X Developer Platform → Pricing(2025‑10‑15 アクセス)【2】
権限(Scope)の具体例
| スコープ | 可能な操作 |
|---|---|
tweet.read | ツイート取得、リツイート情報の取得 |
tweet.write | ツイート投稿・削除・リツイート |
users.read | プロフィール情報取得 |
offline.access | 長期有効なアクセストークン取得(Refresh Token) |
2025‑10 に公開された公式ドキュメントで、
tweet.read/writeが「ツイート取得・投稿」だけでなく リツイート・削除 でも適用されることが明記されています【3】。
2. 開発者アカウントの作成と API キー取得手順
- X Developer ポータルへアクセス → https://developer.x.com/ja
- 「Sign up for Free Account」ボタンからメール・電話認証を完了。
- ダッシュボードで Projects > Create Project を選択し、プロジェクト名と用途を入力。
- プロジェクト内の Add App でアプリ名を設定。
- 作成完了後に表示される以下の情報を
.envに保存(リポジトリからは除外)
|
1 2 3 4 5 6 |
API_KEY=xxxxxxxxxxxx API_SECRET=yyyyyyyyyyyy BEARER_TOKEN=zzzzzzzzzzzz ACCESS_TOKEN=aaaaaaaaaaaa ACCESS_SECRET=bbbbbbbbbbbbb |
手順のスクリーンショットは公式ガイド(Getting started)をご参照ください【4】。
セキュリティ上の注意
- キーは必ず環境変数または .env ファイルで管理し、コードにハードコーディングしない。
- .gitignore に .env を追加してリポジトリから除外することを徹底する(例: echo .env >> .gitignore)。
3. Python 開発環境の構築と Tweepy のインストール
|
1 2 3 4 5 6 7 |
# 1️⃣ 仮想環境作成 (venv) python3 -m venv xapi-env source xapi-env/bin/activate # Windows: .\xapi-env\Scripts\activate # 2️⃣ Tweepy と dotenv をインストール pip install -U tweepy==4.6.0 python-dotenv |
- Tweepy 4.6.0 が X API v2 の全エンドポイントに対応していることは、公式リリースノート(2026‑02‑12)で明記されています【5】。
- バージョン確認:
|
1 2 3 |
python -c "import tweepy, sys; print('Tweepy', tweepy.__version__)" # → Tweepy 4.6.0 |
4. 認証フローと安全なキー管理
4‑1. OAuth 2.0 Bearer Token(アプリ認証)
|
1 2 3 4 5 6 7 8 9 10 11 |
import os from dotenv import load_dotenv import tweepy load_dotenv() client = tweepy.Client(bearer_token=os.getenv("BEARER_TOKEN")) # 公開ユーザー情報取得(認証不要のエンドポイントでも利用可) resp = client.get_user(username="TwitterDev") print(resp.data) |
- 用途: ユーザー情報取得、検索、トレンド取得など「ユーザーコンテキストが不要」な操作。
4‑2. OAuth 1.0a User Context(ユーザー認証)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import os, tweepy, dotenv dotenv.load_dotenv() auth = tweepy.OAuth1UserHandler( consumer_key=os.getenv("API_KEY"), consumer_secret=os.getenv("API_SECRET"), access_token=os.getenv("ACCESS_TOKEN"), access_token_secret=os.getenv("ACCESS_SECRET") ) api = tweepy.API(auth) # ツイート投稿例 tweet = api.update_status("Hello X API from Tweepy 4.6.0! #Python") print(f"Posted tweet ID: {tweet.id}") |
- 用途: ツイートの投稿・削除、DM送信などユーザー権限が必須な操作。
5. 基本的な API 呼び出し例とレートリミット対策
5‑1. タイムライン取得(GET /2/users/:id/tweets)
|
1 2 3 4 5 6 7 8 9 10 |
user_id = "2244994945" # TwitterDev のユーザーID tweets = client.get_users_tweets( id=user_id, max_results=5, tweet_fields=["created_at", "public_metrics"] ) for t in tweets.data: print(f"{t.id} | {t.created_at} | {t.text[:50]}...") |
5‑2. エラーハンドリングと指数バックオフ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import time, random, tweepy def safe_call(func, *args, **kwargs): max_retries = 5 for attempt in range(max_retries): try: return func(*args, **kwargs) except tweepy.TooManyRequests as e: wait = (2 ** attempt) + random.random() print(f"Rate limit hit → {wait:.1f}s 待機") time.sleep(wait) raise RuntimeError("リトライ上限に到達しました") # 使用例 tweets = safe_call(client.get_users_tweets, id=user_id, max_results=10) |
公式ドキュメント(2025‑12 更新)では、HTTP 429 が返された場合は 指数バックオフ に従うことが推奨されています【6】。
6. 実務での応用例
6‑1. 定期投稿ボット(ローカル実行)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import schedule, time def daily_announcement(): text = "本日の新着記事はこちら 👉 https://example.com/blog" api.update_status(text) schedule.every().day.at("09:00").do(daily_announcement) while True: schedule.run_pending() time.sleep(1) |
6‑2. Google スプレッドシートへのツイート保存
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import gspread from google.oauth2.service_account import Credentials scope = ["https://www.googleapis.com/auth/spreadsheets"] creds = Credentials.from_service_account_file("service_account.json", scopes=scope) gc = gspread.authorize(creds) sh = gc.open_by_key("YOUR_SPREADSHEET_ID") ws = sh.sheet1 def save_to_sheet(tweets): rows = [[t.id, t.created_at.isoformat(), t.text] for t in tweets.data] ws.append_rows(rows, value_input_option="RAW") save_to_sheet(tweets) |
gspreadとgoogle-authのインストールはpip install gspread google-authで完了します。
6‑3. AWS Lambda + EventBridge によるサーバーレス自動投稿
Lambda ハンドラ(Python 3.11)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import os, json, tweepy from datetime import datetime def lambda_handler(event, context): auth = tweepy.OAuth1UserHandler( consumer_key=os.getenv("API_KEY"), consumer_secret=os.getenv("API_SECRET"), access_token=os.getenv("ACCESS_TOKEN"), access_token_secret=os.getenv("ACCESS_SECRET") ) api = tweepy.API(auth) today = datetime.utcnow().strftime("%Y-%m-%d") text = f"#{today} キャンペーン開始!詳細は https://example.com" try: api.update_status(text) return {"statusCode": 200, "body": json.dumps("Tweet posted")} except Exception as e: return {"statusCode": 500, "body": str(e)} |
デプロイ手順(概要)
requirements.txtにtweepy==4.6.0を記載し、コードと共に ZIP 圧縮。- AWS コンソールで Lambda 関数(ランタイム: Python 3.11)を作成し、ZIP をアップロード。
- 環境変数 (
API_KEYなど) を設定。 - EventBridge (旧 CloudWatch Events) →
cron(0 9 * * ? *)(UTC 09:00)で毎日実行するルールを作成。
7. デバッグ・ログ出力のベストプラクティス
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import logging, json logger = logging.getLogger("xapi") handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) def post_with_log(text): try: tweet = api.update_status(status=text) logger.info(json.dumps({ "event": "tweet_posted", "tweet_id": tweet.id, "text": text })) except tweepy.TweepyException as e: logger.error(json.dumps({ "event": "tweet_failed", "error": str(e), "attempt_text": text })) post_with_log("ログ出力テスト #Python") |
- 構造化 JSON ログは CloudWatch Logs、ELK、Datadog などでの検索・集計が容易。
- 本番環境では
logging.INFOとlogging.ERRORを使い分け、機密情報は決してログに出さない。
参考文献
- X Developer Platform – 権限分離モデル(2024‑11‑20) https://developer.x.com/en/docs/twitter-api/overview
- X Developer Platform – Pricing(2025‑10‑15 アクセス) https://developer.x.com/en/docs/twitter-api/pricing
- X Developer Platform – Tweet scopes(2025‑10‑01 更新) https://developer.x.com/en/docs/twitter-api/v2/tweet-management/overview
- X Developer Platform – Getting started(2025‑09‑30 アクセス) https://developer.x.com/en/docs/twitter-api/getting-started
- Tweepy 4.6.0 Release Notes – “Full support for Twitter API v2 endpoints” (2026‑02‑12) https://github.com/tweepy/tweepy/releases/tag/v4.6.0
- X Developer Platform – Rate limits(2025‑12‑10 更新) https://developer.x.com/en/docs/twitter-api/rate-limits
※ 本ガイドは実装例です。実際に本番環境へデプロイする前に、必ず公式ドキュメントで最新情報を確認してください。