柴田Xにツイートするの、正直大変だなぁ…っていうか、そもそもネタがないぞ…



ツイートすることがない…それは毎日変わらない日々を送っていて、成長していない、ということですネ?



え…?なに?すっごいキツめのダメ出しされた



ということで、頑張って勉強してその学んだことをツイートしてくだサイ



いや、まぁそれもツイートするけど(多分)!なんかさ、こう…一緒にツイート内容考えておくれよ!
というわけで、Xへのツイートを自動化しました。
使ったのはTavily API(AIニュース検索)、Claude API(文章生成)、GAS(通知・承認UI)、X API(投稿)の組み合わせ。全部をn8nでつないで「ネタ収集→文章生成→承認→投稿」の流れを自動で回せるようにしています。
この記事ではXへの自動ツイート投稿の全容について説明していきます。
全体の構成
フェーズは大きく3つです。
フェーズ①:生成(n8n) 毎日1回、TavilyでAIニュースを検索してClaude APIがツイートを生成し、スプレッドシートに追記します。
フェーズ②:通知・承認(GAS) GASが1時間おきにスプレッドシートを確認して、新しい下書きをLINEに通知します。WebアプリUIで承認・訂正・ボツを選べます。
フェーズ③:投稿(n8n) 1日2回(12時・20時)、承認済みツイートを1件取得してXに投稿し、ステータスを更新します。







n8nは生成のワークフローと投稿のワークフローに分けています!
GASまわりの詳細(WebアプリUIの作り方・LINE通知の実装)は別記事で解説しています。
この記事では全体の流れとn8n側の構築に絞って説明していきます。
フェーズ①:生成ワークフロー


ノードの流れはこんな感じ。
Schedule Trigger(1日1回)
↓
Code①(クエリをランダム選択)
↓
HTTP Request①(Tavily API:AIニュース検索)
↓
Code②(プロンプト組み立て)
↓
HTTP Request②(Claude API:ツイート生成)
↓
Append row in sheet(スプシに追記)
クエリをランダム選択する
毎日同じキーワードで検索するとニュースが偏るので、3パターンのクエリをランダムで切り替えるようにしました。
const queries = [
"AI tools make money online 2026",
"AI side hustle freelance news 2026",
"AI automation business productivity 2026"
];
const selected = queries[Math.floor(Math.random() * queries.length)];
return [{ json: { query: selected } }];TavilyでAIニュースを検索する
Tavilyは検索特化のAPIで、最新ニュースの取得に向いています。HTTP RequestノードでPOSTリクエストを送るだけで使えます。



あらかじめTavilyにサインインしてAPIをゲットしておいてください!




- Method:POST
- URL:
https://api.tavily.com/search - Body:
api_key(→TavilyのAPIキー)、query(前のノードから{{ $json.query }}で参照)、max_results: 3
Claude APIでツイートを生成する
最初検索結果をそのままClaude APIに渡そうとしましたが、生データだと上手くJSONの形にできませんでした。



HTTP RequestでClaude APIを叩くには、結構JSONの形が重要です。具体的に言うと、JSON内では改行を使わずに1行でベタ書きします。検索結果を整形しながら、ついでにプロンプトに埋め込んで1行にしちゃいます。
ということで、ちょっと面倒ですがHTTP RequestでClaude APIに渡す前にCodeノードでプロンプトを整形して組み立てます。
プロンプト整形用Codeノード
const results = $('HTTP Request1').item.json.results;
const newsText = results.map(r => {
const title = r.title.replace(/\n/g, ' ');
const content = (r.content || '').slice(0, 200).replace(/\n/g, ' ');
return title + ':' + content;
}).join(' / ');
const prompt = "あなたはAI副業ブログ『AIで稼ぐ奮闘記』の中の人『どーじょー』です。以下の最新情報をもとに、Xに投稿するツイートを1件生成してください。【最新情報】" + newsText + "条件:140文字以内、AI×副業・自動化で稼ぎたい人に刺さる内容、どーじょー自身のコメントや視点を入れる、親しみやすい口語体、ハッシュタグ2〜3個。ツイート本文のみ出力してください。";
return [{ json: { prompt } }];.replace(/\n/g, " ") で改行をスペースに置換することで、JSON内にプロンプトを埋め込んでも壊れなくなります。
Claude APIにプロンプトを投げる(HTTP Requestノード)
あとはHTTP RequestノードのBodyで {{ $json.prompt }} を参照するだけです。
このノードで実際にClaude APIにプロンプトを投げます。Claude APIの取得とn8nで使うクレデンシャル(認証)の登録がまだの人はコチラの記事から設定を済ませておいてください。




| 項目 | 内容 |
|---|---|
| Method | POST |
| URL | https://api.tavily.com/search |
| Authentication | None |
| Send Body、Body Content Type、Specify Body | トグルオン、JSON、Using Fields Below |
| Name、Value | query、{{ $json.query }}(←Expressionで入力すること) |
| Name、Value | max_results、3 |
スプシに追記(Google SheetsのApend row in sheetノード)


Google Sheets APIを使うので、こちらも取得とクレデンシャルの設定がまだの人はコチラの記事から設定を済ませておいてください。
スプレッドシートへの追記は、Claudeのレスポンスから {{ $json.content[0].text }} でツイート本文を取得してB列に入れています。C列のステータスは初期値「下書き」で固定です。



このシートは後々、LINEへ自動通知する際のGASも仕込んでいきます!コチラの記事もご覧ください!
ちなみに今回の投稿を書くClaude APIの消費は入力414トークン、出力125トークン、$0.005(約0.81円)でした。
フェーズ②:承認ワークフロー
生成した下書きのX投稿をそのまま投稿していいか、承認します。



ここは一度人の目を通します。自動生成されたものは、最新の情報を拾ってくるので内容は面白いんですけどねぇ…トンマナを指定しても言い回しとかは自分流みたいなのあるし



面倒くさがってる割にはこだわるんデスネ



…
ということで承認も挟みます。
GASで「下書き」状態の投稿をLINEに通知(1時間に1回、なければスルー)
↓
GASで作ったWebアプリで承認or訂正
↓
スプシの下書き投稿を「承認済み」状態にする
…正直ここが一番大変でした。詳しくはコチラの記事をご覧ください。





自分のユーザーID調べるのが一番面倒だった…
さらに、Webアプリで承認or訂正できるようにしました!



これで、LINE通知からワンタップで承認orその場で訂正できます!


フェーズ③:投稿ワークフロー
承認済みのツイートを1日2回Xに投稿します。1日2回にしたのは、もし通知をスルーしたりしたときに投稿が溜まるのを防ぐためです。
Schedule Trigger(12時・20時)
↓
Get row(s) in sheet(承認済み1件取得・古い順)
↓
HTTP Request(X API v2 POST)
↓
Update row in sheet(ステータスを「投稿済み」に更新)
X OAuth認証で詰まった話
n8nにはXノード(Create Tweet)が標準搭載されているんですが、OAuth 2.0の認証フローでログインが通らず、使えませんでした。何度試してもダメだったので途中で諦めて方針転換しました。



ログイン画面にユーザー名とパスワード入れたらログイン…できると思いきやまた最初の画面に戻る…という永遠の悪魔に捕まってしまいました
解決策:XノードをやめてHTTP Request + OAuth 1.0aで代替する。


- Method:POST
- URL:
https://api.twitter.com/2/tweets - Authentication:OAuth1 API(n8nのOAuth1クレデンシャルを使用)
- Body:
{ "text": "{{ $json.tweet_text }}" }



X APIの取得方法や詳しい設定方法はコチラの記事で説明しています!


完成後の運用イメージ
運用イメージはこんな感じです。
- 夜中にn8nがニュースを取得してClaudeがツイートを生成する
- LINEに通知が来る
- リンクを開いて承認・訂正・ボツを選ぶ
- 12時か20時に自動でXに投稿される
「毎日投稿できない」問題はこれでかなり解消されました。とはいえまだ動かし始めたばかりなので、投稿の質や反応については引き続き検証していきます。
まとめ
今回作った機能は、
Xへの投稿をClaude APIで自動生成&スプシに書き込み
↓
GASでLINE通知&Webアプリで承認
↓
承認済みの投稿をXに自動投稿
AIを使った部分は少ないですが、LINEへ自動通知、GASでのWebアプリ作成など、色んなことに応用できる技術は多かったかな、という感じですね。
n8nを使った自動化に興味がある方や、自分の環境に合わせて構築したい方はLINEから個別相談も受け付けています。








