- 動作確認日:2026-10-01
- n8nのバージョン:2.41.3(Docker、セルフホスト)
① 結論:このワークフローでできること
天気予報のAPI(Open-Meteo)から東京の今日の予報を取り、「天気・最高気温・最低気温・降水確率」をまとめて、Discordのチャンネルに送ります。
- Open-MeteoはAPIキーなしで使えます。登録は不要です。
- 天気は、APIが返す「天気コード」を、絵文字付きの日本語(快晴、くもり、雨など)に直して送ります。
- 降水確率が50%以上の日は、「傘を持って行きましょう」と一言添えます。
- Discordの設定は、チャンネルの「ウェブフック」を1つ作るだけです。
- 動作確認のため、起動にはWebhookを使っています。実際に使うときは、Schedule Triggerで毎朝実行する想定です。
② 完成イメージ

WebhookのURLにGETでアクセスすると、Discordにメッセージが届きます。

届いたメッセージは、次のとおりです(実際の内容です)。
**2026-10-01 東京の天気**
☁️ くもり
🌡️ 最高 26.7℃ / 最低 18.5℃
☔ 降水確率 6%
この日の天気コードは 3(くもり)、降水確率は6%だったので、傘の一言は付きませんでした。
実行したときの件数の流れは、次のとおりです。
| ノード | 出てきた件数 |
|---|---|
| Webhook | 1 |
| Get Weather(HTTP Request) | 1 |
| Make Message(Code) | 1 |
| Discord | 1 |
| Respond to Webhook | 1 |
③ 使うノードと必要なもの
必要なもの
- n8n(今回はバージョン2.41.3をDockerで動かしました)
- Discordのサーバーと、通知を送るチャンネルの「ウェブフックURL」
- 認証情報:Discord Webhook(ウェブフックURLを登録します)
- Open-Meteoの登録やAPIキー:不要
Open-Meteoは、商用でない使い方なら無料です。商用で使う場合は、Open-Meteoの利用条件を確認してください。
ウェブフックURLは、Discordで「チャンネルの編集(歯車)」→「連携サービス」→「ウェブフックを作成」→「ウェブフックURLをコピー」の順に作れます。n8nの認証情報(Credentials)に登録しておけば、ワークフローのJSONにURLが入りません。
使うノード
| ノード | 役割 | 設定したこと |
|---|---|---|
| Webhook | 動作確認用の起動ボタン | Path:test-weather-discord、Respond:Using 'Respond to Webhook' Node |
| HTTP Request(Get Weather) | Open-Meteoから予報を取る | Method:GET、URL:下のURL、Authentication:None |
| Code(Make Message) | 天気コードを日本語にして、メッセージの文章を作る | 下のコード |
| Discord | メッセージを送る | Connection Type:Webhook、Operation:Send a Message、Message:{{ $json.content }} |
| Respond to Webhook | 送った文章を返す | Respond With:Text |
Get Weatherでは、次のURLを呼んでいます。
https://api.open-meteo.com/v1/forecast?latitude=35.6895&longitude=139.6917&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max&timezone=Asia%2FTokyo&forecast_days=1
| パラメータ | 意味 |
|---|---|
latitude / longitude | 場所(今回は東京) |
daily | 取りたい項目(天気コード・最高気温・最低気温・降水確率の最大値) |
timezone=Asia/Tokyo | 日付の区切りを日本時間にする |
forecast_days=1 | 今日の分だけ取る |

Make Messageでは、次の処理をしています。
// 天気コード(WMO)を日本語にする
const names = [
[[0], '☀️ 快晴'], [[1, 2], '🌤️ 晴れ'], [[3], '☁️ くもり'], [[45, 48], '🌫️ 霧'],
[[51, 53, 55, 56, 57], '🌦️ 霧雨'], [[61, 63, 65, 66, 67], '🌧️ 雨'], [[71, 73, 75, 77], '🌨️ 雪'],
[[80, 81, 82], '🌦️ にわか雨'], [[85, 86], '🌨️ にわか雪'], [[95, 96, 99], '⛈️ 雷雨'],
];
const d = $json.daily;
const code = d.weather_code[0];
const weather = (names.find(([codes]) => codes.includes(code)) || [null, `天気コード ${code}`])[1];
const rain = d.precipitation_probability_max[0];
const lines = [
`**${d.time[0]} 東京の天気**`,
`${weather}`,
`🌡️ 最高 ${d.temperature_2m_max[0]}℃ / 最低 ${d.temperature_2m_min[0]}℃`,
`☔ 降水確率 ${rain}%`,
];
if (rain >= 50) lines.push('👉 傘を持って行きましょう');
return [{ json: { date: d.time[0], code, rain, content: lines.join('\n') } }];
- Open-Meteoの天気は、
weather_codeという数字(WMOの天気コード)で返ってきます。数字のままではわかりにくいので、表を作って日本語に直しています。 - 表にない数字が来たときは、「天気コード ○」とそのまま出します。
- APIの値は項目ごとの配列で返ってくるので、今日の分として
[0]を取り出しています。 **で囲んだ部分は、Discordでは太字になります。
Discordノードの設定は、「ブログの新着記事をDiscordに通知する」ワークフローと同じです。Connection Typeを Webhook にして、Discord Webhookの認証情報を選びます。
④ JSON
n8nの公開API(POST /api/v1/workflows)でこのJSONからワークフローを作成し、有効化してから、上の結果を確認しました。
使うときは、次の箇所を自分の環境に合わせて書き換えてください。
YOUR_DISCORD_CREDENTIAL_ID:n8nに登録したDiscord Webhookの認証情報のID。読み込んだあとに、ノードの画面で認証情報を選び直しても大丈夫です。- Get WeatherのURLの
latitudeとlongitude:自分の住む地域に変えてください。
{
"name": "test-weather-discord",
"nodes": [
{ "parameters": { "path": "test-weather-discord", "responseMode": "responseNode", "options": {} },
"id": "b2000000-0001-4000-8000-000000000001", "name": "Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [0, 0], "webhookId": "b2000000-aaaa-4000-8000-000000000001" },
{ "parameters": { "url": "https://api.open-meteo.com/v1/forecast?latitude=35.6895&longitude=139.6917&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max&timezone=Asia%2FTokyo&forecast_days=1", "options": {} },
"id": "b2000000-0002-4000-8000-000000000002", "name": "Get Weather", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [220, 0] },
{ "parameters": { "jsCode": "// 天気コード(WMO)を日本語にする\nconst names = [\n [[0], '☀️ 快晴'], [[1, 2], '🌤️ 晴れ'], [[3], '☁️ くもり'], [[45, 48], '🌫️ 霧'],\n [[51, 53, 55, 56, 57], '🌦️ 霧雨'], [[61, 63, 65, 66, 67], '🌧️ 雨'], [[71, 73, 75, 77], '🌨️ 雪'],\n [[80, 81, 82], '🌦️ にわか雨'], [[85, 86], '🌨️ にわか雪'], [[95, 96, 99], '⛈️ 雷雨'],\n];\nconst d = $json.daily;\nconst code = d.weather_code[0];\nconst weather = (names.find(([codes]) => codes.includes(code)) || [null, `天気コード ${code}`])[1];\nconst rain = d.precipitation_probability_max[0];\nconst lines = [\n `**${d.time[0]} 東京の天気**`,\n `${weather}`,\n `🌡️ 最高 ${d.temperature_2m_max[0]}℃ / 最低 ${d.temperature_2m_min[0]}℃`,\n `☔ 降水確率 ${rain}%`,\n];\nif (rain >= 50) lines.push('👉 傘を持って行きましょう');\nreturn [{ json: { date: d.time[0], code, rain, content: lines.join('\\n') } }];" },
"id": "b2000000-0003-4000-8000-000000000003", "name": "Make Message", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [440, 0] },
{ "parameters": { "authentication": "webhook", "content": "={{ $json.content }}", "options": {} },
"id": "b2000000-0004-4000-8000-000000000004", "name": "Discord", "type": "n8n-nodes-base.discord", "typeVersion": 2, "position": [660, 0],
"webhookId": "b2000000-bbbb-4000-8000-000000000004",
"credentials": { "discordWebhookApi": { "id": "YOUR_DISCORD_CREDENTIAL_ID", "name": "Discord Webhook account" } } },
{ "parameters": { "respondWith": "text", "responseBody": "={{ $('Make Message').item.json.content }}", "options": {} },
"id": "b2000000-0005-4000-8000-000000000005", "name": "Respond to Webhook", "type": "n8n-nodes-base.respondToWebhook", "typeVersion": 1.1, "position": [880, 0] }
],
"connections": {
"Webhook": { "main": [[{ "node": "Get Weather", "type": "main", "index": 0 }]] },
"Get Weather": { "main": [[{ "node": "Make Message", "type": "main", "index": 0 }]] },
"Make Message": { "main": [[{ "node": "Discord", "type": "main", "index": 0 }]] },
"Discord": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
},
"settings": { "executionOrder": "v1" }
}
⑤ つまずきポイントと対処
このワークフロー自体は、1回目の実行でエラーなく動きました。
気をつける点として、「傘を持って行きましょう」の一言は、このワークフローを動かしたとき(降水確率6%)には出ていません。降水確率が50%以上の日にだけ付く作りです。
追記:同じ日の8時27分に、同じ判定のコードを使った「天気予報をLINEに通知する」ワークフローを動かしたところ、予報が「霧雨・降水確率55%」に変わっていて、「👉 傘を持って行きましょう」が付くことを確かめられました。このDiscord版のワークフローで、雨の日にDiscordへ送ったときの見え方そのものは、まだ確かめていません。
⑥ 応用アイデア
どれも、まだ試していないアイデアです。
- Webhookを「Schedule Trigger」に替えて、毎朝7時に通知する
forecast_days=2にして、明日の天気もあわせて送る- 複数の都市の予報を、1通のメッセージにまとめて送る
- 天気予報を記録するワークフロー(Google Sheets)と組み合わせて、通知と記録を同時に行う
