「毎朝、決まった時間に今日の天気予報を受け取りたい!」
この記事では、最もシンプルな認証方式であるDiscordのWebhookと、APIキー不要の日本の天気予報データを組み合わせ、n8nで通知ワークフローを構築する方法を練習用として解説します。
ステップ0:必要なものと完成URL
このワークフローに必要なのは、以下の3点です。
- n8n環境(クラウドまたはセルフホスト)
- Discordアカウント(通知用)
- 天気予報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で発行します。
- 通知用のチャンネルを作成: Discordで、通知を受け取りたいサーバーを開き、新しいテキストチャンネル(例:
#天気予報
)を作成します。 - Webhookの作成: チャンネル名を右クリックし、「チャンネル設定」 → 「連携サービス」 → 「ウェブフック」へ進みます。
- 「ウェブフックを作成」をクリックし、作成された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ノード
- 設定:
- Mode:
Every Day
(毎日) - Time: 毎朝通知を受け取りたい時間(例:
07:00
)を設定します。
- Mode:
2. 天気予報の取得:HTTP Requestノード
- 設定:
- Authentication:
None
- Request Method:
GET
- URL: 東京都千代田区の予報URLを設定します。
https://weather.tsukumijima.net/api/forecast/city/130010
- Response Format:
JSON
- Authentication:
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ノード
- 設定:
- Credential to connect with:
- ステップ1で取得したWebhook URLを認証情報として設定・選択します。
- Operation:
Post Message
を選択します。 - Text: Functionノードで作成したメッセージ本文の変数を設定します。
{{$node["Function"].json["messageBody"]}}
- Credential to connect with:
ステップ3:テスト実行と有効化
- ワークフロー全体を保存します。
- 「Run Workflow」ボタンをクリックし、手動で実行テストを行います。
- Discordの指定したチャンネルに、天気予報メッセージが正しく届くことを確認します。
- テストが成功したら、ワークフローの**トグルスイッチをオン(Active)**にして有効化します。
これで、あなたの好みに合わせて設定できる、自動通知ワークフローが完成です!