MENU
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
n8n × Claude 自動化の実践記録 | 自動化ラボ
自動化ラボ
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
自動化ラボ
  • はじめての n8n
  • 作り方
  • エラー対処
  • Claude 活用
  • 運営者
  1. ホーム
  2. ワークフローの作り方
  3. n8nでブログの新着記事をDiscordに通知するワークフロー(重複なし)

n8nでブログの新着記事をDiscordに通知するワークフロー(重複なし)

2026 10/07
ワークフローの作り方
Discord RSS
2026年10月1日2026年10月7日
当ページのリンクには広告が含まれています。
ワークフロー全体(Webhook → RSS Read → Pick New → Has New → Discord / Respond None)
  • 動作確認日:2026-10-01
  • n8nのバージョン:2.41.3(Docker、セルフホスト)
目次

① 結論:このワークフローでできること

ブログのRSSフィードを読み、まだ通知していない記事だけを、1通のメッセージにまとめてDiscordのチャンネルに送ります。

  • 送った記事のURLをn8nに覚えさせているので、何回実行しても、同じ記事は2回送りません。
  • 新しい記事がないときは、Discordには何も送りません。
  • 初回は、最新の3件だけを送ります(過去の記事がまとめて届かないようにするためです)。
  • Discordの設定は、チャンネルの「ウェブフック」を1つ作るだけです。ボットの作成は要りません。
  • 動作確認のため、起動にはWebhookを使っています。実際に使うときは、Schedule Triggerで定期的に実行する想定です。

② 完成イメージ

ワークフロー全体(Webhook → RSS Read → Pick New → Has New → Discord / Respond None)

WebhookのURLにGETでアクセスすると、Discordにメッセージが届きます。

Discordに届いたメッセージ(作り直しの前後で1回ずつテストしたため、同じ内容が2通届いています)

届いたメッセージは、次のとおりです(実際の内容です)。

📰 新着記事 3件

**n8nでGmailの受信メールを検索してGoogleスプレッドシートに記録するワークフロー**
10/01 01:58  <https://automatelabo.com/2026/10/01/n8n-gmail-google-sheets/>

**n8nでGoogleスプレッドシートの一覧からGmailの下書きを作るワークフロー**
10/01 01:58  <https://automatelabo.com/2026/10/01/n8n-google-sheets-gmail-drafts/>

**n8nで天気予報(Open-Meteo)をGoogleスプレッドシートに毎日記録するワークフロー**
10/01 01:58  <https://automatelabo.com/2026/10/01/n8n-weather-google-sheets/>

続けてもう一度実行すると、Discordには何も届かず、呼び出し元には次の文章が返ってきました。

実行返ってきた文章Discord
1回目3件をDiscordに送りました1通届いた
2回目新着記事はありませんでした何も届かない

そのあと、ブログに新しく3本の記事を公開してから、もう一度実行しました。届いたのは、新しく公開した3本だけでした。前に送った記事は、送られていません。

新しく3本を公開したあとに届いたメッセージ
📰 新着記事 3件

**n8nでGoogleカレンダーの今日の予定をDiscordに通知するワークフロー**
10/01 07:16  <https://automatelabo.com/2026/10/01/n8n-google-calendar-discord/>

**n8nで今日の天気予報をDiscordに通知するワークフロー(APIキー不要)**
10/01 07:16  <https://automatelabo.com/2026/10/01/n8n-weather-discord/>

**n8nでブログの新着記事をDiscordに通知するワークフロー(重複なし)**
10/01 07:16  <https://automatelabo.com/2026/10/01/n8n-rss-discord/>

続けてもう一度実行すると、新着記事はありませんでした が返り、Discordには何も届きませんでした。

実行返ってきた文章Discord
新しく3本を公開したあと3件をDiscordに送りました新しい3本だけが1通で届いた
その直後にもう一度新着記事はありませんでした何も届かない

実行したときの件数の流れは、次のとおりです。

ノード1回目2回目
Webhook11
RSS Read1010
Pick New1(3件をまとめた1通分)1(0件)
Has New1(true側)1(false側)
Discord1動かない
Respond Sent / Respond NoneRespond Sent:1Respond None:1

動かしてみて気づいた点が2つあります。

  • URLを < と > で囲むと、Discordでリンクのプレビュー(大きなカード)が出なくなります。3件まとめて送るときは、囲んでおくと見やすくなります。
  • タイトル のように ** で囲むと、Discordでは太字で表示されます。

③ 使うノードと必要なもの

必要なもの

  • n8n(今回はバージョン2.41.3をDockerで動かしました)
  • 読み込みたいRSSフィードのURL(今回は https://automatelabo.com/feed)
  • Discordのサーバーと、通知を送るチャンネルの「ウェブフックURL」
  • 認証情報:Discord Webhook(ウェブフックURLを登録します)

ウェブフックURLは、Discordで次の順に作れます。

  1. 通知を送りたいチャンネルの歯車(チャンネルの編集)を押す
  2. 「連携サービス」→「ウェブフックを作成」を押す
  3. 作られたウェブフックを開き、「ウェブフックURLをコピー」を押す

ウェブフックURLを知っている人は、誰でもそのチャンネルに書き込めます。n8nの認証情報(Credentials)に登録しておけば、ワークフローのJSONにURLが入らないので、JSONを人に渡しても安心です。

使うノード

ノード役割設定したこと
Webhook動作確認用の起動ボタンPath:test-rss-discord、Respond:Using 'Respond to Webhook' Node
RSS Readフィードを読み込むURL:https://automatelabo.com/feed
Code(Pick New)まだ送っていない記事を選び、メッセージの文章を作る下のコード
If(Has New)送る記事があるか確かめるcount が 0 より大きい
Discordメッセージを送るConnection Type:Webhook、Operation:Send a Message、Message:{{ $json.content }}
Respond to Webhook(Respond Sent / Respond None)結果を返す送ったとき:○件をDiscordに送りました、送らなかったとき:新着記事はありませんでした
Pick New(Codeノード)の設定画面

Pick Newでは、次の処理をしています。

// まだ送っていない記事だけを選ぶ(送った記事のURLを覚えておく)
const state = $getWorkflowStaticData('global');
const items = $input.all()
  .map(i => ({ ...i.json, url: i.json.link.split('?')[0] }))
  .sort((a, b) => b.isoDate.localeCompare(a.isoDate));
const sent = state.sentUrls || [];
// 初回は最新3件だけ送り、残りは送ったことにする
const fresh = state.sentUrls ? items.filter(a => !sent.includes(a.url)) : items.slice(0, 3);
state.sentUrls = [...new Set([...items.map(a => a.url), ...sent])].slice(0, 100);

const lines = fresh.map(a => {
  const date = DateTime.fromISO(a.isoDate).setZone('Asia/Tokyo').toFormat('MM/dd HH:mm');
  return `**${a.title}**\n${date}  <${a.url}>`;
});
const content = `📰 新着記事 ${fresh.length}件\n\n` + lines.join('\n\n');
return [{ json: { count: fresh.length, content } }];
  • $getWorkflowStaticData('global') は、実行が終わっても消えない、ワークフロー専用の保存場所です。ここに、送った記事のURLを覚えさせています。
  • 初回は state.sentUrls がまだないので、最新の3件だけを送り、フィードにあるほかの記事も「送った」ことにします。
  • 2回目からは、覚えているURLにない記事だけを送ります。
  • 覚えておくURLは、新しいものから100件までにしています。
  • URLの「?」以降(utm_source などの計測用パラメータ)は、取り除いてから比べています。
Discordノードの設定画面

Discordノードでは、Connection Typeを Webhook にして、Discord Webhookの認証情報を選びます。Messageには、Pick Newで作った content をそのまま入れています。

④ JSON

n8nの公開API(POST /api/v1/workflows)でこのJSONからワークフローを作成し、有効化してから、上の結果を確認しました。

使うときは、次の箇所を自分の環境に合わせて書き換えてください。

  • YOUR_DISCORD_CREDENTIAL_ID:n8nに登録したDiscord Webhookの認証情報のID。読み込んだあとに、ノードの画面で認証情報を選び直しても大丈夫です。
  • RSS ReadのURL:通知したいブログのフィードに変えてください。
{
  "name": "test-rss-discord",
  "nodes": [
    { "parameters": { "path": "test-rss-discord", "responseMode": "responseNode", "options": {} },
      "id": "b1000000-0001-4000-8000-000000000001", "name": "Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [0, 0], "webhookId": "b1000000-aaaa-4000-8000-000000000001" },
    { "parameters": { "url": "https://automatelabo.com/feed", "options": {} },
      "id": "b1000000-0002-4000-8000-000000000002", "name": "RSS Read", "type": "n8n-nodes-base.rssFeedRead", "typeVersion": 1.2, "position": [220, 0] },
    { "parameters": { "jsCode": "// まだ送っていない記事だけを選ぶ(送った記事のURLを覚えておく)\nconst state = $getWorkflowStaticData('global');\nconst items = $input.all()\n  .map(i => ({ ...i.json, url: i.json.link.split('?')[0] }))\n  .sort((a, b) => b.isoDate.localeCompare(a.isoDate));\nconst sent = state.sentUrls || [];\n// 初回は最新3件だけ送り、残りは送ったことにする\nconst fresh = state.sentUrls ? items.filter(a => !sent.includes(a.url)) : items.slice(0, 3);\nstate.sentUrls = [...new Set([...items.map(a => a.url), ...sent])].slice(0, 100);\n\nconst lines = fresh.map(a => {\n  const date = DateTime.fromISO(a.isoDate).setZone('Asia/Tokyo').toFormat('MM/dd HH:mm');\n  return `**${a.title}**\\n${date}  <${a.url}>`;\n});\nconst content = `📰 新着記事 ${fresh.length}件\\n\\n` + lines.join('\\n\\n');\nreturn [{ json: { count: fresh.length, content } }];" },
      "id": "b1000000-0003-4000-8000-000000000003", "name": "Pick New", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [440, 0] },
    { "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "loose", "version": 2 },
          "conditions": [ { "id": "n1", "leftValue": "={{ $json.count }}", "rightValue": 0, "operator": { "type": "number", "operation": "gt" } } ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {} },
      "id": "b1000000-0004-4000-8000-000000000004", "name": "Has New", "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [660, 0] },
    { "parameters": { "authentication": "webhook", "content": "={{ $json.content }}", "options": {} },
      "id": "b1000000-0005-4000-8000-000000000005", "name": "Discord", "type": "n8n-nodes-base.discord", "typeVersion": 2, "position": [880, -100],
      "webhookId": "b1000000-bbbb-4000-8000-000000000005",
      "credentials": { "discordWebhookApi": { "id": "YOUR_DISCORD_CREDENTIAL_ID", "name": "Discord Webhook account" } } },
    { "parameters": { "respondWith": "text", "responseBody": "={{ $('Pick New').item.json.count }}件をDiscordに送りました", "options": {} },
      "id": "b1000000-0006-4000-8000-000000000006", "name": "Respond Sent", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [1100, -100] },
    { "parameters": { "respondWith": "text", "responseBody": "新着記事はありませんでした", "options": {} },
      "id": "b1000000-0007-4000-8000-000000000007", "name": "Respond None", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [880, 120] }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "RSS Read", "type": "main", "index": 0 }]] },
    "RSS Read": { "main": [[{ "node": "Pick New", "type": "main", "index": 0 }]] },
    "Pick New": { "main": [[{ "node": "Has New", "type": "main", "index": 0 }]] },
    "Has New": { "main": [[{ "node": "Discord", "type": "main", "index": 0 }], [{ "node": "Respond None", "type": "main", "index": 0 }]] },
    "Discord": { "main": [[{ "node": "Respond Sent", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}

⑤ つまずきポイントと対処

公開日時で比べると、同じ時刻の記事を取りこぼす

  • 起きたこと:最初は「前回送った記事より公開日時が新しいもの」を送る作りにしていました。しかし、今回のフィードには、同じ時刻(01:58)に公開した記事が4件並んでいました。この作りだと、前回送った記事と同じ時刻の記事は「新しくない」と判断され、送られないままになります。
  • 対処:公開日時ではなく、記事のURLで「送ったかどうか」を覚える作りに直しました。URLは記事ごとに違うので、同じ時刻に何件公開しても取りこぼしません。
  • 確かめたこと:直したあとに、同じ時刻(07:16)に3本の記事を公開して実行したところ、3本とも1通にまとまって届きました。取りこぼしはありませんでした。

手動の「Execute workflow」では、送った記事を覚えない

  • 気をつけること:n8nの説明では、$getWorkflowStaticData に保存した内容が残るのは、ワークフローを有効にして本番のURL(/webhook/...)やトリガーで動かしたときだけです。エディタの「Execute workflow」で試したときは保存されません。
  • 対処:今回は、ワークフローを有効にしてから、本番のWebhookのURLで2回実行して確かめました。

⑥ 応用アイデア

どれも、まだ試していないアイデアです。

  • Webhookを「Schedule Trigger」に替えて、1時間ごとに新着を確かめる
  • 複数のブログのフィードを読み込んで、1つのチャンネルにまとめて通知する
  • Discordノードの「Embeds」を使って、記事ごとにカード形式で送る
  • 通知先をSlackやLINEに替える(Pick Newのコードはそのまま使えます)
ワークフローの作り方
Discord RSS
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
  • n8nでGmailの受信メールを検索してGoogleスプレッドシートに記録するワークフロー
  • n8nで今日の天気予報をDiscordに通知するワークフロー(APIキー不要)

この記事を書いた人

自動化ラボ管理人のアバター 自動化ラボ管理人

コードは書けないけれど、n8n と Claude(Claude Code)で仕事とブログを自動化しています。実際に動かしたワークフローを、動作確認日・JSON・つまずいたところまで記録しています。

関連記事

  • n8nで通知を送る方法まとめ:Discord・LINE・Telegram・Slackを実際に試して比べた
    2026年10月3日
  • n8nのGoogle Sheetsで「Unable to sign without access token」になるときの対処
    2026年10月3日
  • ワークフロー全体(Webhook → RSS Read → Pick New → Has New → Slack / Respond None)
    n8nでブログの新着記事をSlackに通知するワークフロー(重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → Get Releases → Pick New → Has New → Discord / Respond None)
    n8nの新しいバージョンが出たらDiscordに通知するワークフロー(GitHub API・重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → RSS Read → Pick New → Has New → Telegram / Respond None)
    n8nでブログの新着記事をTelegramに通知するワークフロー(重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → RSS Read → Pick New → Has New → LINE Broadcast / Respond None)
    n8nでブログの新着記事をLINEに通知するワークフロー(Messaging API・重複なし)
    2026年10月1日
  • ワークフロー全体(Webhook → Today's Events → Make Message → Discord → Respond to Webhook)
    n8nでGoogleカレンダーの今日の予定をDiscordに通知するワークフロー
    2026年10月1日
  • ワークフロー全体(Webhook → Get Weather → Make Message → Discord → Respond to Webhook)
    n8nで今日の天気予報をDiscordに通知するワークフロー(APIキー不要)
    2026年10月1日

記事の種類

  • Claude 活用
  • n8n リリース情報
  • はじめての n8n
  • エラー・つまずき対処
  • サーバー・WordPress
  • テンプレート配布
  • ワークフローの作り方
  • 運営記録
つなぐサービス
Google スプレッドシートRSSLINESlackGmailDiscordTelegramWebhookn8n API天気 APIGoogle カレンダーGoogle ドライブ
目次
  • プロフィール
  • お問い合わせ
  • プライバシーポリシー

© 自動化ラボ.

目次