コーヒ豆通販はこちら

【簡単・無料】n8nで日本の天気予報をDiscordに毎日自動通知する方法

社会人の勉強

「毎朝、決まった時間に今日の天気予報を受け取りたい!」

この記事では、最もシンプルな認証方式であるDiscordのWebhookと、APIキー不要の日本の天気予報データを組み合わせ、n8nで通知ワークフローを構築する方法を練習用として解説します。

ステップ0:必要なものと完成URL

このワークフローに必要なのは、以下の3点です。

  1. n8n環境(クラウドまたはセルフホスト)
  2. Discordアカウント(通知用)
  3. 天気予報URL:取得したい地域のコードを含んだURL。

🗼 東京都千代田区の天気予報URL

今回は東京都千代田区(東京地方)の予報URLを使用します。

https://weather.tsukumijima.net/api/forecast/city/130010

地域のコードの選び方(全国対応)

このワークフローで利用する無料APIは、気象庁が定める**「一次細分区域コード」**という数字を使います。このAPIは、特定の市町村のピンポイント予報ではなく、その地域全体(予報区)の天気を返します。

AIを活用してURLを特定する(最も簡単な方法)

使いたい地域のコードを調べる最も簡単な方法は、ChatGPTやGeminiなどの生成AIに尋ねることです。欲しい形式の回答を指定することで、自分でコードを検索し、URLを組み立てる手間が省けます。

目的AIへの指示文例
鹿児島市のURLを尋ねる「鹿児島市の天気予報を取得するための気象庁一次細分区域コードを使って、API形式のURLをそのまま表示してください。例:https://weather.tsukumijima.net/api/forecast/city/130010 の形式で、URL全体を出力してください。」
(AIからの回答例)https://weather.tsukumijima.net/api/forecast/city/460010

この方法で得られたURLを、次のステップでそのまま使います。

ステップ1:DiscordのWebhook URLを取得する

n8nがメッセージを送信するための「鍵」を、Discordで発行します。

  1. 通知用のチャンネルを作成: Discordで、通知を受け取りたいサーバーを開き、新しいテキストチャンネル(例: #天気予報)を作成します。
  2. Webhookの作成: チャンネル名を右クリックし、「チャンネル設定」 → 「連携サービス」 → 「ウェブフック」へ進みます。
  3. ウェブフックを作成」をクリックし、作成されたWebhookのURLをコピーします。
    • 重要: このURLはn8nの認証情報として使用するため、絶対に漏洩しないようご注意ください。

ステップ2:ワークフローの構築(ノードの選択と接続)

n8nで新しいワークフローを作成し、以下の4つのノードを順に接続します。

ノード構成と役割

このワークフローの基本構成は、以下の流れです。

[Schedule Trigger]⟶[HTTP Request]⟶[Function]⟶[Discord]

ノード名役割目的
Schedule Triggerトリガー(起点)ワークフローを毎日、決まった時間に開始する。
HTTP Request情報取得外部の天気予報APIからJSONデータを取得する。
Functionデータ整形取得したJSONデータをDiscord向けのテキストに加工する。
Discord情報送信加工済みのテキストをDiscordのWebhookに送信する。

1. ワークフローの起点:Schedule Triggerノード

  • 設定:
    • ModeEvery Day (毎日)
    • Time: 毎朝通知を受け取りたい時間(例: 07:00)を設定します。

2. 天気予報の取得:HTTP Requestノード

  • 設定:
    • AuthenticationNone
    • Request MethodGET
    • URL東京都千代田区の予報URLを設定します。https://weather.tsukumijima.net/api/forecast/city/130010
    • Response FormatJSON

3. メッセージの整形:Functionノード

  • 目的: 取得したJSONデータから情報を抽出し、Discordメッセージに整形します。地域名の表示方法に応じて、コードをどちらか一方を選んで貼り付けてください。

選択肢A:地域名を自動で取得する場合(推奨・メンテナンスフリー)

URLを変更しても、このコードは一切変更する必要がありません。ただし、地域名は広域の予報区名になります。

// HTTP Requestノードから渡されたデータ項目を取得
const weatherJson = items[0].json;

// 「今日」の予報(配列の0番目)を取得し、地域名をAPIのJSONデータから自動で取得
const todayForecast = weatherJson.forecasts[0];
const locationName = weatherJson.location.city; // 👈 自動取得のため、変更不要です

// 必要な情報を抽出
const date = todayForecast.dateLabel;
const telop = todayForecast.telop;
const tempMax = todayForecast.temperature.max ? todayForecast.temperature.max.celsius : '不明';
const tempMin = todayForecast.temperature.min ? todayForecast.temperature.min.celsius : '不明';

// 詳細な天気概況文を取得
const description = weatherJson.description.text.split('\n').filter(line => line.trim() !== '');

// Discordメッセージ本文を作成
let messageBody = `**【${locationName} の${date}の天気予報】**\n`;
messageBody += `\n**⛅ 天気**: ${telop}`;
messageBody += `\n**⬆️ 最高気温**: ${tempMax}℃`;
messageBody += `\n**⬇️ 最低気温**: ${tempMin}℃\n`;
messageBody += `\n--- 概況 ---\n`;
messageBody += description.join('\n');
messageBody += `\n----------------\n`;
messageBody += `今日も一日、良い日になりますように!`;

// 次のノードに渡すデータを出力
return [{
  json: {
    messageBody: messageBody // 整形したDiscordメッセージ本文
  }
}];

選択肢B:地域名を手動で設定する場合(市町村名などにしたい場合)

市町村名など、任意の名前を表示できますが、URLを変更するたびに、このコード内のlocationNameも手動で書き換える必要があります

// HTTP Requestノードから渡されたデータ項目を取得
const weatherJson = items[0].json;

// 「今日」の予報(配列の0番目)を取得
const todayForecast = weatherJson.forecasts[0];
const locationName = "東京都千代田区"; // 👈 ここを通知したい地域名に手動で変更してください!

// 必要な情報を抽出
const date = todayForecast.dateLabel;
const telop = todayForecast.telop;
const tempMax = todayForecast.temperature.max ? todayForecast.temperature.max.celsius : '不明';
const tempMin = todayForecast.temperature.min ? todayForecast.temperature.min.celsius : '不明';

// 詳細な天気概況文を取得
const description = weatherJson.description.text.split('\n').filter(line => line.trim() !== '');

// Discordメッセージ本文を作成
let messageBody = `**【${locationName} の${date}の天気予報】**\n`;
messageBody += `\n**⛅ 天気**: ${telop}`;
messageBody += `\n**⬆️ 最高気温**: ${tempMax}℃`;
messageBody += `\n**⬇️ 最低気温**: ${tempMin}℃\n`;
messageBody += `\n--- 概況 ---\n`;
messageBody += description.join('\n');
messageBody += `\n----------------\n`;
messageBody += `今日も一日、良い日になりますように!`;

// 次のノードに渡すデータを出力
return [{
  json: {
    messageBody: messageBody // 整形したDiscordメッセージ本文
  }
}];

4. Discordへの送信:Discordノード

  • 設定:
    1. Credential to connect with:
      • ステップ1で取得したWebhook URLを認証情報として設定・選択します。
    2. OperationPost Message を選択します。
    3. Text: Functionノードで作成したメッセージ本文の変数を設定します。
      • {{$node["Function"].json["messageBody"]}}

ステップ3:テスト実行と有効化

  1. ワークフロー全体を保存します。
  2. Run Workflow」ボタンをクリックし、手動で実行テストを行います。
  3. Discordの指定したチャンネルに、天気予報メッセージが正しく届くことを確認します。
  4. テストが成功したら、ワークフローの**トグルスイッチをオン(Active)**にして有効化します。

これで、あなたの好みに合わせて設定できる、自動通知ワークフローが完成です!

タイトルとURLをコピーしました