n8nでXへの自動ポスト機能を実装しました

前回の記事でご紹介した「無料ゲーム自動収集システム」に続き、今回はその新着情報を検知した瞬間に、X(旧Twitter)へ自動でアナウンスを投稿する機能を実装しました。

構築の過程で、Xの仕様変更やAPI認証のバグ、データ形式の罠など、数々の技術的な壁にぶつかり激しい試行錯誤を行いました。同じようにn8nからのSNS連携で頭を悩ませている方の参考になるよう、トラブル解決の全プロセスを詳しく解説します

目次

新着情報のSNS通知

WordPressの無料ゲーム一覧ページは完全に無人で更新され続けるようになりましたが、ページを作っただけではユーザーに気付いてもらえません。「今、何が無料で手に入るのか」をリアルタイムで世の中に発信し、サイトへの導線を作るため、システムが新着データを検知した瞬間にXへ自動ポストする仕組みを追加することにしました。

新着検知からX投稿へ繋がるワークフロー

文字数制限の壁とロジック

最初の課題は、X特有の「文字数制限(全角140文字/半角280文字)」でした。セール時期などは一度に10件以上の新着ゲームが検知されることもあり、すべてを愚直に並べると確実に文字数オーバーでフローが強制停止してしまいます。

そこで、JavaScriptのCodeノードを挟み、Xの特殊なカウント仕様(URLは一律半角23文字扱い、日本語は2文字扱いなど)をシミュレートする計算ロジックを構築しました。ゲーム名や配信プラットフォーム名をパズルのように組み合わせ、文字数が溢れそうになったら自動で「ほか計〇件」と綺麗に省略して1ポストに収める、文字数防衛ロジックを完成させました。また、前回の仕組みでData Tablesに格納した type 属性を活かし、DLC(追加コンテンツ)の場合は自動で [DLC] とラベルが付く親切設計にしました。

OAuth 2.0認証の無限ループ

テキストの自動生成は完璧でしたが、本システム最大の壁が立ちはだかりました。「XのAPI認証」です。

n8nに用意されている公式のX(Twitter)ノードは、認証方式として「OAuth 2.0」を要求します。しかし、本システムは外からアクセスできないセキュアなローカル環境(ポート5678付きのHTTP)で動いています。この環境で認証を通そうとすると、X側の画面でログインと2段階認証を通過した直後、「このアプリを使うには、Xにログインしてください」という初期画面へ突き戻される無限ループのバグが発生してしまいました。

n8n公式のトンネル機能(現在は廃止)や外部ツール(localhost.run)によるHTTPS化など、あらゆる手段でURLのセキュリティ制限のクリアを試みましたが、X側のOAuth 2.0サーバーのセッション不整合によるバグを前に、何時間も絶望することになりました。

Xの認証画面で発生する無限ログインループの画面

HTTP Requestでの自作

n8n公式のXノードを使う限り、この不毛なOAuth 2.0の罠から抜け出せないと判断し、発想を180度切り替えました。「公式ノードを諦め、HTTP Requestノードで投稿機能を自作する」というアプローチです。

n8nの認証情報登録(Credentials)では、URLのリダイレクトを必要とせず、4つの暗号鍵を直接入力する古い方式の「OAuth 1.0a(X OAuth account)」であれば、ローカル環境のまますんなり登録に成功していました。

そこで、汎用の「HTTP Request」ノードを配置し、認証タイプに登録済みの「X OAuth account(OAuth 1.0a)」を指定。Xの最新のツイート投稿用APIエンドポイント(https://api.twitter.com/2/tweets)に対して、直にPOSTリクエストを送りつける構造を自作しました。リダイレクト処理そのものを完全にバイパスしたことで、これまで苦しんできたログインループを1秒で置き去りにし、完全なローカル環境のままで認証の壁を完全突破しました。

ローカルでの自動運用開始

数々の罠をねじ伏せた結果、安全なローカルサーバー環境を1mmも危険にさらすことなく、裏側から直接Xへ綺麗なメッセージを送り届ける自動投稿システムが完成しました。

テスト時に短時間で連続投稿した際は、XのAPI仕様(重複コンテンツ排除)によって弾かれましたが、本番運用の「6時間おきに、その時々の新しいゲームを投稿する」というスケジュールであれば、レートリミットに引っかかることもなく、極めてクリーンに動作し続けています。

まとめ

WordPressの自動更新に続き、新着無料ゲーム情報をXへ自動ポストする機能を実装しました。構築にあたっては、複数件のデータを140文字以内に収めるCodeロジックの設計、そしてn8n公式Xノードの「OAuth 2.0認証無限ループ」という高い壁に直面しました。これを「OAuth 1.0a + HTTP Requestノード」によるAPIの直接叩きへ切り替えることで完全バイパスし、ローカル環境のままで認証を突破しました。6時間周期で安定稼働する、無人かつ堅牢なSNS発信基盤が完成しました。