27
7

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】毎朝7時にQiita人気記事TOP5をLINEに自動通知する仕組みを作ってみた

27
Posted at

はじめに

隙間時間にQiitaの記事を効率よくチェックしたいと思い、
人気記事を自動で取得して通知する仕組みを作成しました。

今回は、n8nを使ってQiitaの人気記事をLINEに自動通知する方法を紹介します。

完成イメージ
毎朝こんな感じでLINEに届きます
昨日のQiita人気記事 TOP5

  1. 記事タイトル
    👍 10 / 📌 5
    👤 author
    URL

使用技術

  • n8n
  • Qiita API
  • LINE Messaging API

全体構成

今回のワークフローはこんな感じ👇

スケジュール → Qiita API取得 → データ加工 → LINE送信
image.png

n8nワークフロー

① スケジュールトリガー

n8nの「Schedule Trigger」を使用し、毎日7時にワークフローが実行されるように設定します。

このノードが、定期実行の起点となります。
image.png

② Qiita APIで記事取得

QiitaのAPIを使用して、記事データを取得します。

Qiita APIの詳細については、以下の公式ドキュメントを参照してください。
公式ドキュメント

今回は以下のエンドポイントを使用し、JavaScriptタグの記事を100件取得します。

GET https://qiita.com/api/v2/tags/javascript/items?per_page=100
  • タグを指定(今回は「javascript」)
  • 最大100件取得し、後続処理で必要なデータに絞り込みます

image.png

③ 昨日の記事だけ抽出 + 人気順にソート

ここでは、取得した記事データの中から昨日投稿された記事だけを抽出し、いいね数順に並び替えて上位5件を取り出します。

const rows = $input.all().map(item => item.json);

// JSTで昨日の範囲を作成
const now = new Date();
const jstNow = new Date(
  now.toLocaleString("en-US", { timeZone: "Asia/Tokyo" })
);

const start = new Date(jstNow);
start.setDate(start.getDate() - 1);
start.setHours(0, 0, 0, 0);

const end = new Date(jstNow);
end.setDate(end.getDate() - 1);
end.setHours(23, 59, 59, 999);

// 昨日の記事だけ抽出
const filtered = rows.filter(row => {
  if (!row.created_at) return false;
  const createdAt = new Date(row.created_at);
  return createdAt >= start && createdAt <= end;
});

// いいね順でソート
filtered.sort((a, b) => (b.likes_count || 0) - (a.likes_count || 0));

// 上位5件取得
const top5 = filtered.slice(0, 5);

ポイント

  • 日付の判定は JST(Asia/Tokyo) で行っている
  • likes_count を使って人気順に並び替えている
  • slice(0, 5) で上位5件に絞っている

Qiita APIからは複数日の記事が返ってくるため、このように後続処理で対象期間を絞り込むようにしています。

④ LINE用メッセージ生成

次に、抽出した記事データをLINEで送信しやすい形式に整形します。

lines.push("昨日のQiita人気記事 TOP5");

top5.forEach((row, index) => {
  const author = row.user?.id || "unknown";
  lines.push("");
  lines.push(`${index + 1}. ${row.title}`);
  lines.push(`👍 ${row.likes_count ?? 0} / 📌 ${row.stocks_count ?? 0}`);
  lines.push(`👤 ${author}`);
  lines.push(row.url);
});

const message = lines.join("\n");

ポイント

  • 配列(lines)に1行ずつ追加し、最後に join("\n") で1つの文字列にまとめています
  • 記事タイトル・いいね数・ストック数・投稿者・URLを見やすく整形しています
  • 空行を挿入することで、LINE上での視認性を向上させています

このように整形することで、LINE APIでそのまま利用できる形式になり、LINEに送信した際にも一覧として見やすく表示されます。

⑤ LINEに送信

最後に、作成したメッセージをLINE Messaging APIを使って送信します。

以下のエンドポイントにPOSTリクエストを送ることで、指定したユーザーにメッセージをプッシュ送信できます。

POST https://api.line.me/v2/bot/message/push
{
  "to": "ユーザーID",
  "messages": [
    {
      "type": "text",
      "text": "メッセージ内容"
    }
  ]
}

実装してみて良かった点

  • 朝の情報収集を自動化できる
  • 人気記事だけを効率よくチェックできる
  • n8nだけで完結するため、構築や運用がシンプル

まとめ

今回の仕組みによって、隙間時間を有効的に使えるようになりました。
ただ、もう少しこういう改善もできそうだなと感じました。

  • タグを複数対応(Java / AWS / React など)
  • ChatGPTで記事の要約をつける

少し工夫するだけで、さらに便利な情報収集ツールにできそうです。
気になる方はぜひ試してみてください。

27
7
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
27
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?