はじめに
特定ジャンルのバズ記事を毎日チェックするの、面倒ですよね。
今回は n8n を使って、APIキーなし・完全無料でバズ記事を自動収集する仕組みを作ってみました。
何ができるの?
⏰ 毎日決まった時間に自動実行
→ 📰 はてブの人気記事(RSS)を取得
→ 📰 Google Newsの検索結果(RSS)を取得
→ 📝 重複排除 & 件数を絞り込み
→ 💾 n8n内部に保存
APIキーも外部サービスの登録も一切不要です。
使った技術
| 技術 | 用途 |
|---|---|
| n8n | ワークフロー自動化 |
| RSS | はてブ / Google News から記事取得 |
ワークフローの構成
収集フロー
スケジュール実行で、RSSフィードから記事を取得して保存します。
ポイント解説
1. RSSフィードを使う理由
はてなブックマークとGoogle Newsは、どちらもRSSフィードを公開しています。
https://b.hatena.ne.jp/search/tag?q=<検索ワード>&mode=rss
https://news.google.com/rss/search?q=<検索ワード>&hl=ja&gl=JP&ceid=JP:ja
RSSなので、APIキーの取得もアカウント登録も不要。好きなキーワードを指定するだけです。
💡
<検索ワード>の部分を変えれば、どんなジャンルでも対応できます。
例:恋愛,旅行,グルメ,プログラミングなど
2. 整形 & 絞り込み(Codeノード)
取得したRSS記事を、使いやすいJSON形式に整形します。
const allItems = items;
const seen = new Set();
const unique = [];
for (const item of allItems) {
const link = item.json.link || item.json.guid || '';
if (link && !seen.has(link)) {
seen.add(link);
const title = item.json.title || 'untitled';
// HTMLタグを除去して説明文を生成
const rawDesc = item.json.contentSnippet || item.json.content || '';
const description = rawDesc.replace(/<[^>]*>/g, '').substring(0, 150);
unique.push({
json: { title, description, sourceUrl: link }
});
}
}
// 件数を絞って返す
return unique.slice(0, 5);
ポイント:
-
SetでURLベースの重複排除 - 正規表現でHTMLタグを除去
-
sliceで件数制限
3. 保存には staticData を使う
n8nには $getWorkflowStaticData('global') という便利な機能があります。
const staticData = $getWorkflowStaticData('global');
const newPosts = items.map(i => i.json);
const existing = staticData.posts || [];
// 新しい記事 + 既存の記事をマージ
const allPosts = [...newPosts, ...existing];
// タイトルで重複排除
const seen = new Set();
const deduped = allPosts.filter(post => {
if (seen.has(post.title)) return false;
seen.add(post.title);
return true;
});
staticData.posts = deduped.slice(0, 20);
これを使うと外部DBやファイル保存なしで、ワークフロー内にデータを永続化できます。
⚠️ 最初は
Write Fileノードを使おうとしましたが、バイナリ変換のエラーが出たのでstaticData方式に変更しました。こっちのほうがシンプルです。
実行結果
テスト実行した結果:
| ノード | 取得件数 | 状態 |
|---|---|---|
| RSS ① | 40件 | ✅ |
| RSS ② | 71件 | ✅ |
| 整形 & 絞り込み | 5件 | ✅ |
| 保存 | 10件(累積) | ✅ |
実行時間: 約1.6秒 で完了。全ノードエラーなし。
カスタマイズ例
検索ジャンルを変更する
RSSノードのURLの検索ワードを変えるだけ:
| ジャンル | 検索ワード例 |
|---|---|
| 恋愛 | 恋愛 |
| 旅行 | 旅行 |
| テクノロジー | AI+ChatGPT |
| グルメ | グルメ+おすすめ |
保存件数を変更する
// この数値を変えるだけ
staticData.posts = deduped.slice(0, 20); // ← 20件保持
実行頻度を変更する
Schedule Triggerノードの設定を変えるだけ:
-
毎日:
"field": "days" -
毎週:
"field": "weeks" -
毎時:
"field": "hours"
まとめ
| 項目 | 内容 |
|---|---|
| 構築時間 | 約30分 |
| APIキー | 0個 |
| 外部サービス登録 | なし |
| 実行時間 | 約1.6秒/回 |
RSSフィードと staticData を組み合わせることで、外部APIに依存しないシンプルな自動収集システムが作れました。
ジャンルを変えれば、カフェ情報・ニュース・技術記事など、なんでも収集できます。ぜひ試してみてください!