n8n入門:Xに自動投稿する④ スプシから画像付きでXに自動投稿する

生成AI

この記事では、スプレッドシートの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としておく

ノードの全体像

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

  1. Schedule Trigger(定期実行)
  2. Google Sheets → Get rows(対象シート)
  3. Limit(1行のみ)
  4. Google Drive → Download file(画像本体)
  5. HTTP Request/2/media/upload へ画像アップロード)
  6. HTTP Request/2/tweets で投稿)
  7. 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 Items1
  • Keep = First Items

画像の取得(Google Drive → Download file)

設定

  • Resorce:File
  • OperationDownload
  • 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 TypeForm-Data
  • Body Parameters(3行追加)
    1. Parameter Type = n8n Binary File / Name = media / Input Data Field Name = data(Driveのバイナリ名に合わせる。既定は data
    2. Parameter Type =Form Data / Name=media_category / Value=tweet_image
    3. Parameter Type =Form Data / Name=media_type / Value={{$binary.data.mimeType}}

投稿作成(HTTP Request → /2/tweets)

設定

  • URL:https://api.twitter.com/2/tweets
  • Authentication:Prededined Credential Type、X OAuth2 API
  • Send Body:ON / Body Content TypeJSON
  • 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 ModeMap 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がうまくいかないときもありますので注意ください(オフラインと出る)

この場合は再度フローを実行すると解消されます。

コメント

タイトルとURLをコピーしました