2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

X APIが従量課金に!自分のブックマーク・いいねをAPI取得してみた

2
Posted at

はじめに

2026年2月7日、X(旧Twitter)の開発者向けAPIが Pay-Per-Use(従量課金) モデルに正式移行しました。

従来は月額200ドルのBasicプランか月額5,000ドルのProプランしか選択肢がなく、個人開発者にはハードルが高かったのですが、今回の変更で 最低$5のチャージから使えるプリペイド方式 になりました。

「じゃあ、前から気になっていたブックマーク・いいねのAPI取得、安くできるようになったのでは?」と思い、実際に試してみました。

この記事でやること:

  • Developer Console でのアプリ作成・設定
  • OAuth 2.0 PKCE 認証でアクセストークンを取得
  • ブックマーク一覧・いいね一覧を API で取得

コード全体は GitHub で公開しています:
https://github.com/kirozero119/x-api-bookmarks
コマンド数行でテストができるので、ぜひご活用ください。

対象読者

  • X API を触ってみたいけど、料金が気になって手を出せなかった人
  • 従量課金になったと聞いて試してみたい人
  • ブックマーク・いいねをプログラムで管理したい人

API やOAuth の予備知識がなくても進められるように書いています。

背景:X API 従量課金の概要

料金モデル

項目 内容
課金方式 プリペイド(前払い) — クレジットを購入し、APIリクエストごとに消費
最低チャージ $5(約750円)
ポスト読み取り (GET) $0.005/件
ポスト作成 (POST) $0.01/件
重複排除 同じリソースを同日内に再取得しても課金は1回

たとえば自分のブックマーク100件を取得すると 100 × $0.005 = $0.50。
$5チャージすれば1,000件取得できる計算です。

従来プランと比較するとかなり安いですが、やっぱりちょっと高いですね。。。笑

従来プランとの比較

旧Free 旧Basic Pay-Per-Use
月額費用 $0 $200 使った分だけ
ブックマーク取得 ❌ ✅ ✅
いいね取得 ❌ ✅ ✅
参入コスト — 約3万円/月 約750円($5)

Step 0:Developer Console のセットアップ

0-1. 開発者アカウントの申請

https://console.x.com にアクセスします。

初めてアクセスする場合、以下のフォームが表示されます:

image.png

  • アカウント名: 任意(例: MyBookmarkApp)
  • ユースケースの説明: APIの利用目的を英語で250文字以上記述

ユースケースの例:

I am a software developer building a personal knowledge management tool
that integrates with the X platform. My use cases are as follows:

1. Bookmark and Like retrieval: I plan to use the GET /2/users/:id/bookmarks
   and GET /2/users/:id/liked_tweets endpoints to retrieve posts that I have
   previously saved or liked.

2. Content categorization: The retrieved posts will be processed through
   an AI-based classification system to automatically label and organize
   them by topic. This is purely for my own personal use.

3. Personal database storage: Labeled posts will be stored in a local
   database for efficient search and retrieval. No data will be shared
   publicly or with third parties.

I will not resell any data obtained through the X API. All usage is
strictly personal and low-volume.

3つのチェックボックスにすべてチェックを入れて送信します。

0-2. アプリの認証設定

アプリが作成されたら、認証設定を行います:

設定項目 値
アプリの権限 読む
アプリの種類 ウェブアプリ、自動化アプリまたはボット(機密クライアント)
コールバックURI http://localhost:3000/callback
ウェブサイトURL https://example.com

コールバックURIは http(https ではない)です。ローカル開発用なのでHTTPで問題ありません。

0-3. Client ID と Client Secret をメモ

アプリのキーページで OAuth 2.0 セクションの以下をコピー:

  • Client ID
  • Client Secret

API Key / API Key Secret とは別物です。
「OAuth 2.0」と書かれたセクションから取得してください。

0-4. クレジットの購入

左メニューの「Billing」から最低 $5 を購入します。

これをしないと 402 CreditsDepleted エラーになります。 新規アカウントは従量課金への登録が自動で行われ、無料枠はありません。

Step 1:プロジェクトの作成

uv でプロジェクトを作成します。

# リポジトリをクローンする場合
git clone https://github.com/YOUR_USERNAME/x-api-bookmarks.git
cd x-api-bookmarks
uv sync

手動で作る場合:

uv init x-api-bookmarks --python 3.12
cd x-api-bookmarks
uv add requests python-dotenv
mkdir src

Step 2:環境変数の設定

cp .env.example .env

.env を編集して、Step 0 でメモした値を入力:

X_CLIENT_ID=あなたのClient ID
X_CLIENT_SECRET=あなたのClient Secret

Step 3:テストスクリプトの実装

src/x_api_test.py の全体像を説明します。

3-1. OAuth 2.0 PKCE 認証フロー

ブックマークやいいねはユーザーのプライベートデータなので、Bearer Tokenだけでは取得できません。ユーザー本人の同意を得る OAuth 2.0 Authorization Code Flow with PKCE が必要です。

[ユーザー] → ブラウザでXにログイン → 「アプリを認証」クリック
     ↓
[X] → 認証コードをコールバックURLに返す
     ↓
[スクリプト] → ローカルサーバー(localhost:3000)で認証コードを受け取る
     ↓
[スクリプト] → 認証コードをアクセストークンに交換
     ↓
[スクリプト] → アクセストークンでAPI呼び出し

PKCE(Proof Key for Code Exchange)は、認証コードの横取りを防ぐ仕組みです。code_verifier と code_challenge のペアを使います:

import hashlib, base64, secrets

code_verifier = secrets.token_urlsafe(64)[:128]
code_challenge = base64.urlsafe_b64encode(
    hashlib.sha256(code_verifier.encode()).digest()
).rstrip(b"=").decode()

3-2. ローカルサーバーでコールバックを受け取る

Python の http.server でコールバックを受け取ります。

from http.server import HTTPServer, BaseHTTPRequestHandler

class CallbackHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # URLのクエリパラメータから認証コードを取得
        query = urllib.parse.urlparse(self.path).query
        params = urllib.parse.parse_qs(query)
        auth_code = params["code"][0]
        # ...

server = HTTPServer(("localhost", 3000), CallbackHandler)
server.handle_request()  # 1リクエストだけ受け取って終了

3-3. アクセストークンの取得

認証コードを受け取ったら、X の token エンドポイントに POST して、アクセストークンに交換します:

resp = requests.post(
    "https://api.x.com/2/oauth2/token",
    data={
        "grant_type": "authorization_code",
        "code": auth_code,
        "redirect_uri": "http://localhost:3000/callback",
        "code_verifier": code_verifier,
    },
    auth=(CLIENT_ID, CLIENT_SECRET),
)

access_token = resp.json()["access_token"]

3-4. ブックマーク・いいねの取得

あとはアクセストークンを使ってGETリクエストを送るだけです:

# ブックマーク取得
resp = requests.get(
    f"https://api.x.com/2/users/{user_id}/bookmarks",
    params={
        "max_results": 5,
        "tweet.fields": "created_at,author_id,text",
    },
    headers={"Authorization": f"Bearer {access_token}"},
)
# いいね取得
resp = requests.get(
    f"https://api.x.com/2/users/{user_id}/liked_tweets",
    params={
        "max_results": 5,
        "tweet.fields": "created_at,author_id,text",
    },
    headers={"Authorization": f"Bearer {access_token}"},
)

Step 4:実行と結果

uv run python src/x_api_test.py

実行するとブラウザが開きます。Xにログインして「アプリを認証」をクリック。

実行結果

🔍 X API ブックマーク・いいね取得テスト
============================================================
Step 1: ブラウザで X の認証ページを開きます
============================================================
✅ 認証コード取得成功!

============================================================
Step 2: アクセストークンを取得します
============================================================
✅ アクセストークン取得成功!
   スコープ: offline.access bookmark.read like.read users.read tweet.read
   有効期限: 7200 秒
   リフレッシュトークン: あり

============================================================
Step 3: 自分のユーザー情報を取得 (GET /2/users/me)
============================================================
   ステータスコード: 200
   ✅ ユーザー名: @kirozero72

============================================================
Step 4: ブックマーク取得テスト
============================================================
   ステータスコード: 200
   ✅ ブックマーク取得成功! (5 件)

   [1] ID: 2022470515001319671
       AIエージェントがWebサイトと構造化された方法でやり取りするための標準規格...
   [2] ID: 2022447231006306615
       これおもしろい "Hono on Node.js 最速レスポンス選手権"...

============================================================
Step 5: いいね取得テスト
============================================================
   ステータスコード: 200
   ✅ いいね取得成功! (5 件)

   [1] ID: 2022297749593682130
       ClaudeのSkillsが教えてくれたことは...

ブックマーク・いいねともに問題なく取得できました。

レートリミットと課金

実行結果から確認できたレートリミット:

エンドポイント レートリミット
GET /2/users/me 75回/15分
GET /2/users/:id/bookmarks 180回/15分
GET /2/users/:id/liked_tweets 75回/15分

注意点

  • 同日内の同一リソースへの重複リクエストは課金されない(デデュプリケーション)
  • ブックマークは最大 800件 まで取得可能(ページネーション対応)
  • アクセストークンの有効期限は 2時間。リフレッシュトークンで再取得可能

Pay-Per-Useプランの注意事項

2026年2月の正式ローンチ直後ということもあり、開発者フォーラムではいくつかの問題が報告されています:

  • ブックマーク・いいねAPIが429エラーを返し続ける という報告あり(筆者環境では再現せず)
  • Developer Console(console.x.com)のUI不具合 — 支払い設定の失敗、認証設定の404エラーなど
  • 旧プランからの移行時に client-not-enrolled エラーが発生するケース

問題が起きた場合は、X Developer Community Forumを確認してみてください。

まとめ

  • X APIの従量課金モデルにより、$5(約750円)からブックマーク・いいね取得が可能になった
  • OAuth 2.0 PKCE認証が必要だが、Pythonのローカルサーバーで簡潔に実装できる
  • 2026年2月14日時点で、ブックマーク・いいね取得ともに正常動作を確認

コードは GitHub で公開しています。
https://github.com/kirozero119/x-api-bookmarks

参考リンク

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?