Tech Waves

produced by Hakuhodo DY ONE

本ブログは、株式会社Hakuhodo DY ONEの開発チームによるエンジニアブログです。
それぞれのメンバーが業務を通して得た技術情報や、各種セミナーの参加レポート、またその他トピックについて情報発信を行っています。

n8nでブログ執筆エージェントをつくってみた

こんにちは、廣本です✏️。

今回はn8nを使って、「廣本っぽいブログ記事」を執筆してくれるエージェントを作成しました。その作成方法を、エージェント自身に記事化してもらったのが以下の文章です。果たして、「廣本っぽいブログ記事」に仕上がっているのでしょうか?

※なお、キャプチャ画像の挿入・コードの記述・細かい微調整は、人間の私がおこなっています。

以下、エージェントが執筆した記事ですーーー

こんにちは、廣本です✏️。

今回は「n8nでブログ執筆エージェントをつくってみた」というテーマで、業務効率化を目的にn8nを使って自分の過去記事を参照しながらブログ記事を自動生成・Slack通知・最終的なNotion管理までを一気通貫で行うフローを構築した事例をまとめてみました。

「アイデアはあるけど執筆にかける時間がない」「過去のテイストを活かして自動化したい!」という方の参考になれば幸いです。


全体構成

今回つくったエージェントの全体フローは以下の通りです。

  1. フォーム入力(自分)
  2. 過去記事のランダム選択(n8n)
  3. 情報抽出(n8n)
  4. 記事の執筆(n8n)
  5. Slack通知(n8n)
  6. Slackで記事確認&承認(自分)
  7. Notion DBへの保存(n8n)
  8. Notion上で最終編集・公開(自分)

n8nフロー全体図


1. フォーム入力

まず最初は「Form Trigger」ノードで、タイトル・記事概要・ターゲット読者など、記事の軸となる情報を自分でフォーム入力します。

実装例:

  • 利用ノード:Form Trigger
  • 入力項目:title, description

この時点で「どんな記事を書きたいか」のアウトラインを自分の手で定義しておくことで、以降のAI執筆がブレにくくなります。

n8n Form Trigger設定
n8nフォーム入力内容

title

n8nでブログ執筆エージェントをつくってみた

description

n8nを使用して、自分の過去記事を参照してブログ執筆を代替してくれるエージェントフローを作成。

<全体構成>
1. フォーム入力(自分)  
2. 過去記事のランダム選択(n8n)  
3. 情報抽出(n8n)  
4. 記事の執筆(n8n)  
5. Slack通知(n8n)  
6. Slackで記事確認&承認(自分)  
7. Notion DBへの保存(n8n)  
8. Notion上で最終編集・公開(自分)

<構成詳細:1. フォーム入力>
n8nの「From Trigger」ノードを使用。ブログのタイトルと内容の説明を記載する。

<構成詳細:2. 過去記事のランダム選択>
n8nの「Code」ノードを使用。JavaScriptを使用し、自分が過去に執筆した記事のリンクからランダムに5本選択させる。

<構成詳細:3. 情報抽>
まずは「HTTP Request」と「HTML」ノードを使用し、2で選択されたリンクの本文を取得。「Aggregate」ノードで抽出した本文の情報をまとめ、最後に「Code」ノードでAIに渡しやすい形に整形する。

<構成詳細:4. 記事の執筆>
「AI Agent」ノードで記事を執筆。過去記事の文体や構成を参照させ、私が書きそうな記事を執筆する。

<構成詳細:5. Slack通知 >
「Slack」ノードを使用し、作成した記事案をSlackのDMで私宛に通知する。

<構成詳細:6. Slackで記事確認&承認>
5の「「Slack」ノード」内でResponse TypeをApprovalにすることで承認を送ることができる。私がSlack上で承認をすると次のステップに進む。

<構成詳細:7. Notion DBへの保存>
「Notion」ノードを使用し、執筆した記事をNotionDBへ追加する。その際、NotionDBに一度に連携できる文字数には2000字以内という上限があるため、Codeノードでブロックに分割してから連携するのがポイント。

<構成詳細:8. Notion上で最終編集・公開>
NotionDBに記載された内容をチェック、手直しし、はてなブログに転記して公開。

2. 過去記事のランダム選択

続いて「Code」ノードで、あらかじめリストアップしておいた自分の過去記事URL集合からランダムに5本ピックアップします。

実装例(JavaScript)

// 既存記事URLを配列で定義
const articleUrls = [
  "https://~~",
  "https://~~"
];

// ランダムに5本だけ抽出(トークン節約)
const shuffled = articleUrls.sort(() => Math.random() - 0.5);
const selected = shuffled.slice(0, 5);

return selected.map(url => ({ json: { url } }));

「どの記事のカラーを参考にするか」が毎回ランダムなのが面白いポイントです。


3. 情報抽出

選ばれた過去記事の本文を取得します。

  • HTTP Requestノードで記事を取得
  • HTMLノードで本文部分を抽出
  • Aggregateノードで記事ごとにパーツをまとめ
  • 最後にCodeノードでAIに渡しやすい形式に整形

HTTP Requestノード

n8n HTTP Requestノード設定

HTMLノード

n8n HTMLノード設定

Aggregateノード

n8n設定 Aggregateノード設定

Codeノード

n8n コードノード設定(AI用に整形)

const items = $input.all();

const combinedText = items[0].json.data
  .map((item, index) => {
    const text = item.articleText || "";
    const trimmed = text.slice(0, 1500);
    return `【参考記事${index + 1}】\n${trimmed}`;
  })
  .join("\n\n---\n\n");

return [{ json: { combinedText } }];

ここで、記事執筆AIは「どういう文章の癖・記事構成を参考にすべきか」を把握できます。


4. 記事の執筆

ここからがメインです。AI Agentノード(GPT-4やClaudeなど、API経由で使えるエージェント)を使って、指定テーマ&過去記事テイストを踏襲した記事を自動生成します。

n8n AIエージェントノード設定

Prompt (User Message)

以下のタイトルと概要でテックブログ記事を書いてください。

タイトル:{{ $('Form Trigger').item.json.title }}
概要:{{ $('Form Trigger').item.json.description }}

System Message

あなたははてなブログのテックブログ代筆AIです。

## 参考記事(この文体・構成を真似してください)
{{ $json.combinedText }}

## 再現すべき文体のポイント
- 語尾・口調のトーン
- 見出しの付け方と階層構造
- コードブロックの使い方
- 具体例の出し方
- 記事の締め方・まとめの書き方

## 文体の特徴
- 書き出しは必ず「こんにちは、廣本です」で始める
- です・ます調で統一
- 各セクションに具体例を入れる
- まとめセクションで読者へのメッセージを入れる

## 出力フォーマット
Markdown形式で出力してください。

## 禁止事項
- 技術的に不正確な内容を書かない
- 参考記事にない造語・スラングを使わない

指示を詳細にすることで、質も安定しやすくなります。


5. Slack通知

生成が完了した記事案は、「Slack」ノードを介して自分のDMに通知されます。

  • DM文:「📝 新しい記事案が生成されました!」
  • 本文はSlackにMarkdownで貼り付け
  • Slackの1メッセージの上限は約3000文字程度で、上限を超えるとエラーになるので注意が必要

SlackのDMに記事案を送付


6. Slackで記事確認&承認

Slackノードの「Response Type: Approval」を使うことで、DM上で「承認」「却下」のリアクションボタンを表示できます。

n8n Slackノード設定

  • 承認なら次(Notion保存)へ進む
  • 却下ならフローが終了

このステップにより、品質を担保することが可能です。

n8n IFノード設定
承認フロー


7. Notion DBへの保存

「Notion」ノードで記事本文・メタ情報をNotionのブログ用DBに保存します。

注意点として、1回のリクエストで送り込める文字数に制限(2000文字まで)があるため、CodeノードでMarkdown本文を1900文字ごとのブロックに分割し、Notionノードに複数のブロックとして一度に渡す作りとしています。

n8n コードノード(文字数調整)設定

const output = $('AI Agent').item.json.output;

const chunkSize = 1900;
const chunks = [];

for (let i = 0; i < output.length; i += chunkSize) {
  chunks.push(output.slice(i, i + chunkSize));
}

// 必ず6つになるよう空文字で埋める
while (chunks.length < 6) {
  chunks.push("");
}

return [{ json: { 
  chunk0: chunks[0] || "",
  chunk1: chunks[1] || "",
  chunk2: chunks[2] || "",
  chunk3: chunks[3] || "",
  chunk4: chunks[4] || "",
  chunk5: chunks[5] || ""
}}];

8. Notion上で最終編集・公開

Notionで記事を最終チェック。誤字・表現などを微修正し、公開準備が整ったらはてなブログへ転記&公開します。

実際にはNotionで「タグ付け・カテゴリ付与・公開日調整」も合わせておこないます。

Notion DBに追加


まとめ

今回はn8nを活用したブログ自動執筆エージェント構築の流れをまとめてみました。

ゼロから原稿を考える時間が劇的に減り、「過去の自分のスタイル&内容を活かした自動執筆」が実現できたのが個人的に一番の収穫です。
細かい最終調整は自分でやることになりますが「下書きを “提案” してもらう」だけでもアウトプットの生産性はかなり向上します。

同じように、「執筆や資料作成を自動化したい」「過去資産を最大限活かしたい」「承認フローや履歴も管理したい」といった方はぜひ一度n8nを活用してみてください!

今後も面白い自動化フローができれば紹介したいと思います。


    

ーーーいかがでしたか?

私の文体にかなり近い文章に仕上がっていたのではないでしょうか。 私自身も違和感なく読むことができました。

ただ、全体的に簡潔によくまとまっているのですが、もう少し詳しく手順を説明したいところや、背景や意図を説明したいところもありました。 最初のアウトラインに、より詳細な情報や、執筆者としての「気持ち」をのせると、より私の意志に近い記事に仕上がるかもしれません。

とはいえ、下書きとしては十分すぎるくらいの出来に仕上がったと思います。ブログを執筆する際、文章構成を考えるのに時間が取られてしまいますが、このエージェントを活用することで、その時間が大幅に短縮されそうです。

自分自身の言葉で伝えたいところは自分で書きつつ、今後もうまくエージェントを活用したいと思います。 みなさんもオリジナルのブログ執筆エージェントをつくってみてはいかがでしょうか?

この記事を書いた人

廣本 (id:hrhrkun)

以前はBIの開発業務を担当。今はナレッジマネジメントの推進や、AIエージェントの開発をメインにいろいろ行っています。