この記事では、スプレッドシートの1行=1投稿として、本文とGoogle Driveの画像を使い、n8nでX(旧Twitter)へ画像付きで自動投稿し、成功した行だけStatusをTRUEに更新するまでを解説します。各ステップに画像も組み込んでいるので、うまくいかないときは参考にしてください
Xへの自動投稿、スプシを使った自動投稿については以下をご参照ください。


事前準備(最初に1回だけ)
n8nのX資格情報に+media/writeを付加する
1.「Overview」>「Credentials」>「X account」をクリックする。

2.「Reconnect」をクリックする

3. XのOAuth2認証画面が出てきたらURLの末尾に「+media/write」を付加する。「アプリにアクセス許可」をクリックする。

この処理を行う理由としてはn8n OAuth2API 認証情報にはまだ+media.writeが含まれていない為だそうです。

Google Drive APIを有効化、n8nからのOAuth接続を行う
1.n8n入門:Xに自動投稿する③ スプシからXに自動投稿するを参考に、Google Drive APIの有効化までを行う
(OAuth同意画面の開始以降は不要)
2.n8nを立ち上げ、「Create Workflow」の右の▼をクリック、「Create Credential」をクリックする。

3.「Google Drive OAuth2 API」を選択し、「Continue」をクリックする。
4.「OAuth Redirect URL」、「Client ID」、「Client Secret」はGoogle Sheets OAuth2 APIと同じものを入力し、認証を行う

5. スプレッドシートの列を以下の構成にする。image_fileIDはGoogle Driveにアップロードした画像のIDを記載しておく。statusはFALSEとしておく

ノードの全体像
ノードの全体像は以下になります。次章以降で一つずつ説明します。

- Schedule Trigger(定期実行)
- Google Sheets → Get rows(対象シート)
- Limit(1行のみ)
- Google Drive → Download file(画像本体)
- HTTP Request(/2/media/upload へ画像アップロード)
- HTTP Request(/2/tweets で投稿)
- Google Sheets → Update(TRUE更新)
行抽出(Google Sheets → Get rows)
設定
- Operation:Get Row(s)
- Document:By ID ID
- Sheet:By Name シート名
- Filters:Column:status Value:false
とする

1行取得(Limit)
設定
- Max Items:1
- Keep = First Items

画像の取得(Google Drive → Download file)
設定
- Resorce:File
- Operation:Download
- File:By ID:
{{$json.image_fileId}}
(先ほどのLimitで取得したImage_fielIDをドラッグ&ドロップ)

「Execute Step」でdataが取得できていればOKです
画像アップロード(HTTP Request → /2/media/upload)
api.x.comは不安定の為HTTP Requestでapi.twitter.comを直接たたきます。
設定
- URL:
https://api.twitter.com/2/media/upload
- Authentication:Prededined Credential Type、X OAuth2 API
- Send Body:ON / Body Content Type:Form-Data
- Body Parameters(3行追加)
- Parameter Type = n8n Binary File / Name =
media
/ Input Data Field Name =data
(Driveのバイナリ名に合わせる。既定はdata
) - Parameter Type =Form Data / Name=
media_category
/ Value=tweet_image
- Parameter Type =Form Data / Name=
media_type
/ Value={{$binary.data.mimeType}}
- Parameter Type = n8n Binary File / Name =



投稿作成(HTTP Request → /2/tweets)
設定
- URL:
https://api.twitter.com/2/tweets
- Authentication:Prededined Credential Type、X OAuth2 API
- Send Body:ON / Body Content Type:JSON
- JSON本文
{
"text": {{ JSON.stringify($node["Get row(s) in sheet"].json.text) }},
"media": {
"media_ids": [ {{ JSON.stringify($node["HTTP Request_image_upload"].json.data.id) }} ]
}
}


本文に改行や「”」があると壊れるのでJSON.stringify(...)
で包むと安全です。
TRUE更新(Google Sheets → Update row in sheet)
設定
- Resource:Seet Within Document
- Operation:Update Row
- Document:From list ドキュメント名を選択(By IDでも可)
- Sheet:From list シート名を選択(By IDでも可)
- Mapping Column Mode:Map Each Colmun Manually
- Column to match on:id
- Values to Update
tweet_id = {{ $('Limit').item.json.id }}
(Limitで取得したID ドラッグ&ドロップで可)status = TRUE


自分は後でdatetime列を追加して現在時刻を記載する{{ $now }}を追加しています。
まとめ
以上がXに画像付きの投稿を行う方法になります。
やることは「シート1行=1投稿」、画像は先に上げてIDを受け取り、そのIDを付けて投稿し、成功した行だけTRUEにするだけです。
- 流れ:Drive(Download)→ HTTP Request(/2/media/upload)→ HTTP Request(/2/tweets)→ Sheets(UpdateでTRUE)
- 注意点:tweet.write / media.write を付けて認可、api.twitter.com を使う
ただHTTP Requestのuploadがうまくいかないときもありますので注意ください(オフラインと出る)
この場合は再度フローを実行すると解消されます。
コメント