お久しぶりです。
X(Twitter) API v2 を使って画像付きで投稿する方法のメモを、このブログに残しておきます。
前提
- X Developerアカウントを持っていること
- Postmanが使えること
- ACCESS TOKENを取得するために使います
準備
何をするにも、まずはACCESS TOKENを取得する必要があります。
Postmanを使って取得します。
X Developerでアプリを作成
まず、X Developerでアプリを作成します。
手順に従って作成してください。
注意点として、User authentication settingsの設定が挙げられます。
少し分かりづらいので、ここに記載します。

User authentication settingsにあるEditをクリックします。
認証設定画面が表示されます。
以下のように設定します。
重要なのが、Callback URI / Redirect URLの設定です。
Postmanでコールバックを受け取れるように設定します。
- App permissions: Read and write
- Type of App: Web App. Automated App or Bot
- Callback URI / Redirect URL: https://oauth.pstmn.io/v1/browser-callback
- Website URL: ご自身のブログURLなど

PostmanでACCESS TOKENを取得
Postmanを開いて、以下の手順でACCESS TOKENを取得します。
まずPostmanを開きます。
ここで注意が必要なのは、Web版のPostmanを使うことです。
Web版を使用しないと、認証がうまくいかない場合があります。
話を戻し、新しいリクエストを作成し、認可タブを選択します。
Auth TypeでOAuth 2.0を選択します。

次に、以下のように設定します。
重要なのが、Scopeの設定です。
メディアをアップロードするには、media.writeのScopeが必要です。
- トークン名: x
- Grantタイプ: 認可コード(PKCE利用)
- 認可URL: https://twitter.com/i/oauth2/authorize
- アクセストークンURL: https://api.twitter.com/2/oauth2/token
- クライアントID: ご自身のアプリのClient ID
- クライアントシークレット: ご自身のアプリのClient Secret
- コードチャレンジメソッド: SHA-256
- Scope: tweet.read tweet.write users.read offline.access media.write
- State: 任意の文字列
- クライアント認証: Basic認証ヘッダーとして送信

最後に新しいアクセストークンを取得をクリックし、認証を完了させます。
認証が成功すると、アクセストークンが取得できます。
これで、X(Twitter) API v2を使う準備が整いました。

画像付きで投稿してみる
ここからは、実際に画像付きで投稿してみます。
まず、画像を1枚アップロードして投稿します。
画像をアップロード
画像をアップロードするには、以下のようにリクエストを送信します。
注意点として、画像のサイズは5MB以下である必要があります。
※ 5MB以上のメディアをアップロードすることも可能ですが、その方法については注意点で後述します。
curl -X POST "https://api.x.com/2/media/upload" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H 'Content-Type: multipart/form-data' \
-F "media=@/path/to/sample.jpg" \
-F "media_type=image/jpeg" \
-F "media_category=tweet_image"
以下のレスポンスが返ってくれば成功です。
{"data":{"id":"123456789","media_key":"123456789","size":2160129,"expires_after_secs":86400,"image":{"image_type":"image\/jpeg","w":3864,"h":2576}}}
ちなみに、メディアの容量が大きすぎるとレスポンスが返ってこないことがあります。
投稿する
画像をアップロードしたら、次に投稿します。
投稿するには、以下のようにリクエストを送信します。
media_idsには、画像のアップロード時に受け取ったidを指定します。
curl -X POST 'https://api.x.com/2/tweets' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-d '{ "text": "hello world", "media": { "media_ids": [ "123456789" ] } }'
以下のレスポンスが返ってくれば成功です。
{"data":{"edit_history_tweet_ids":["56789"],"text":"hello world https://t.co/xxxx","id":"56789"}}
複数の画像付きで投稿してみる
複数の画像を付けて投稿する方法もあります。
すでにお気づきかもしれませんが、基本的な手順は画像を1枚だけ投稿する場合と同じです。
画像を複数アップロードした後、投稿する際にmedia_idsへ複数の画像IDを指定するだけです。
これで、複数画像を含む投稿ができます。
curl -X POST 'https://api.x.com/2/tweets' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-d '{ "text": "複数枚", "media": { "media_ids": [ "13579", "2468" ] } }'
注意点
試している中で、つまずいた点をいくつか記載します。
Scopeの設定
画像をアップロードするには、media.writeのScopeが必要でした。
私が見たドキュメントにはその情報がなく、n8nのissueでこの情報を知りました。
e.g. https://community.n8n.io/t/post-media-to-x-twitter-via-api-new/90997
メディアのアップロード制限
仕様の詳細は、以下のリンクを参照してください。
1リクエストあたり、画像は5MB以下、動画はさらに細かい制限があるようです。
「高画質なメディアをアップロードしたい!」という場合は、次に示すリンクの通り、チャンクアップロードを利用できるようです。
※ 私自身は試していないため、動作は未確認です。
まとめ
X(Twitter) API v2 を使って画像付きで投稿する方法について、基本的な流れをまとめました。
これで、画像付きで投稿するための準備が整いました。
このAPIを使って、今後色々なことを試していきたいと思います。