1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

n8nで毎日ニュースをAIエージェントが要約してSlackに通知する仕組みを作ってみた

Posted at

背景

毎朝「小売業界の最新ニュース」をSlackに共有していましたが、手作業では時間もかかるし抜け漏れも発生しがちでした。
そこでオープンソースのワークフロー自動化ツール n8nAIエージェント(Gemini 2.5 Flash) を使って、
ニュース収集 → 要約 → Slack通知 を完全自動化しました。

完成したフロー

n8n上ではこのようなシンプルなフローになりました。
この記事のコードを1つずつコピペしていけばみなさんも同じフローが作れます

image.png

全体フロー

  1. Cron : 平日8:30 JSTに起動
  2. Code(JavaScript) : GoogleニュースRSS URLを生成
  3. RSS Feed Read : 記事データを取得
  4. Code(JavaScript) : 直近24時間以内&最大10件にフィルタ
  5. AIエージェント(Gemini 2.5 Flash) : 要約を生成
  6. Code(JavaScript) : Slack投稿用に結合
  7. Slack : チャンネルに通知

実際のノード設定

1. Code(JavaScript): RSS URL生成

const queries = [
  '小売 業界',
  'EC 小売',
  'ドラッグストア',
  'コンビニ',
  'スーパー 小売'
];

const urls = queries.map(q =>
  `https://news.google.com/rss/search?q=${encodeURIComponent(q)}&hl=ja&gl=JP&ceid=JP:ja`
);

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

2. RSS Feed Read

  • URL : {{$json.url}}
    これで Code ノードが出力した複数のRSSを順番に取得できます。

3. Code(JavaScript): 24時間フィルタ & 件数上限

const now = Date.now();
const DAY = 24 * 60 * 60 * 1000;
let items = $input.all().map(i => i.json);

items = items.filter(it => {
  const t = new Date(it.pubDate || 0).getTime();
  return t && (now - t) <= DAY;
});

items.sort((a,b) => new Date(b.pubDate) - new Date(a.pubDate));
items = items.slice(0, 10);

function plain(s) {
  return (s || '')
    .replace(/<[^>]+>/g, ' ')
    .replace(/&nbsp;/g, ' ')
    .trim();
}

return items.map(it => ({
  json: {
    title: it.title,
    link: it.link,
    pubDate: it.pubDate,
    description: plain(it.contentSnippet || it.content || '')
  }
}));

4. AIエージェント(Gemini 2.5 Flash)

接続するときにまずモデルを登録する必要があります。
今回は簡単にAPIを発行できるGeminiを使います。
Googleアカウントを持っていればGoogle AI Studioから発行できます。
image.png

System Prompt

あなたは日本語のビジネスニュース編集者です。
入力記事を事実ベースで3文以内に要約し、固有名詞と数値を残してください。
出力は必ず1行、先頭に「・」を付け、文末にURLを丸括弧でつけてください。

User Prompt

タイトル: {{$json.title}}
概要: {{$json.description}}
URL: {{$json.link}}

5. Code(JavaScript): Slack投稿用に結合

const lines = $input.all().map(i => {
  const t = i.json.text ?? i.json.completion ?? i.json;
  return typeof t === 'string' ? t : JSON.stringify(t);
});
const header = `*本日の小売業界ニュース(${new Date().toLocaleDateString('ja-JP')})*`;
return [{ json: { text: `${header}\n${lines.join('\n')}` } }];

6. Slack(Post Message)

  • Text : {{$json.text}}
  • Channel : 通知したいチャンネルID

Tips

  • 1つノードを作ったら「Execute Step」で実験する。
    左側に入力前、右側に入力後が表示されるので、これを使ってデバッグやテストができる。

image.png

Slackとの認証

Slackアプリを作成 → chat:write 権限を付与 → ワークスペースにインストールすると
xoxb-... 形式のBot Tokenが取得できます。
これを n8n の Slack Credentials に設定します。

image.png

実際に通知できた!

Slack Botからニュース要約をチャンネルに投稿できました 🎉

image.png

完成したフロー

n8n上ではこのようなシンプルなフローになりました。

image.png

ハマりどころ

  • RSS Feed Readの出力:記事はすでに「1アイテムごと」に出るので i.json.items ではなく i.json を扱う
  • 24時間フィルタ:テスト時は記事がゼロになりやすいので、時間を72hに広げて検証した
  • Slack投稿:Botをチャンネルに /invite し忘れると投稿されない

成果

  • 毎朝のニュース収集・共有が完全自動化
  • Slackを見るだけで業界動向が把握できる
  • 情報収集時間がゼロに、抜け漏れも防止

まとめ

n8nを使えば、ニュース収集のような定型作業を短時間で自動化できます。
今回は「小売ニュース」でしたが、キーワードを変えるだけで他業界のトレンド把握にも応用可能です。
そして AIエージェント(Gemini 2.5 Flash) を組み込むことで、人力では大変な要約も自然にこなせるようになりました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?