気象庁の天気予報JSONファイルを使って Twitter API でつぶやく

スポンサーリンク

前回は OpenWeatherAPI を使い、天気をツイートの実施まで試しました。
今回は気象庁の天気予報JSONファイルを使い、 Twitter API で天気をツイートするところまで作ってみたいと思います。
自動で天気予報をツイートしてみたい方は本記事を参考にしてみてください。

前回の記事はこちらです。

スポンサーリンク

気象庁の天気予報JSONファイルとは

気象庁のWebサイトがリニューアルされ他ことにより、天気予報情報がJSON形式で取得できるようになりました。

しかし、正式な公開のWebAPIではありませんが、
「政府標準利用規約に準拠してご利用いただける」
とのことです。

登録不要でJSONファイルを取得するだけです。
簡単に利用できるのは控えめに言って、最高です!

スポンサーリンク

JSONとは

JSONとは、ウィキペディア先生はこうおっしゃっています。

JavaScript Object Notation(JSON、ジェイソン)はデータ記述言語の1つである。軽量なテキストベースのデータ交換用フォーマットでありプログラミング言語を問わず利用できる。名称と構文はJavaScriptにおけるオブジェクトの表記法に由来する。

引用元:ウィキペディアより

キーと値をペアにして表現します。
以下例です。

{"name": "John Smith", "age": 33}

今回取得する情報も、キーと値のペアとなっています。

スポンサーリンク

JSONファイル取得先

以下のURLにアクセスすればJSONの内容を確認することができます。

・宮城県の天気予報の概要
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/040000.json

・宮城県の今日・明日・明後日の天気予報
https://www.jma.go.jp/bosai/forecast/data/forecast/040000.json

「040000」は宮城県の都道府県コードになります。
この数字を変更することにより、指定した地域のデータを取得することができます。

コード一覧

ウィキペディアの「日本の地域」の区分で記載します。

北海道地方

[011000] 宗谷地方
[012000] 上川・留萌地方
[013000] 網走・北見・紋別地方
[014000] 釧路・根室地方
[014030] 十勝地方
[015000] 胆振・日高地方
[016000] 石狩・空知・後志地方
[017000] 渡島・檜山地方

東北地方

[020000] 青森県
[030000] 岩手県
[040000] 宮城県
[050000] 秋田県
[060000] 山形県
[070000] 福島県

関東地方

[080000] 茨城県
[090000] 栃木県
[100000] 群馬県
[110000] 埼玉県
[120000] 千葉県
[130000] 東京都
[140000] 神奈川県

中部地方

[150000] 新潟県
[160000] 富山県
[170000] 石川県
[180000] 福井県
[190000] 山梨県
[200000] 長野県
[210000] 岐阜県
[220000] 静岡県
[230000] 愛知県

近畿地方

[240000] 三重県
[250000] 滋賀県
[260000] 京都府
[270000] 大阪府
[280000] 兵庫県
[290000] 奈良県
[300000] 和歌山県

中国・四国地方

[310000] 鳥取県
[320000] 島根県
[330000] 岡山県
[340000] 広島県
[350000] 山口県
[360000] 徳島県
[370000] 香川県
[380000] 愛媛県
[390000] 高知県

九州地方

[400000] 福岡県
[410000] 佐賀県
[420000] 長崎県
[430000] 熊本県
[440000] 大分県
[450000] 宮崎県
[460040] 奄美地方
[460100] 鹿児島県(奄美地方除く)
[471000] 沖縄本島地方
[472000] 大東島地方
[473000] 宮古島地方
[474000] 八重山地方

「天気予報の概要」の内容

宮城県を例にします。
JSONファイル取得先のURLをクリックします。

取得できたJSONの内容はこちらです。
※読みやすいように整形しています

{
    "publishingOffice": "仙台管区気象台",
    "reportDatetime": "2022-03-22T11:00:00+09:00",
    "targetArea": "宮城県",
    "headlineText": "",
    "text": "低気圧が関東の東にあって、東へ進んでいます。一方、高気圧が三陸沖にあって、東へ移動しています。\n\n【宮城県】\n宮城県は、曇りで雪や雨の降っている所があります。\n\n22日は、低気圧の影響により、曇りで雪や雨の降る所がありますが、夕方からは、次第に晴れとなるでしょう。\n\n23日は、高気圧に覆われて、晴れますが、気圧の谷や湿った空気の影響により、午後は曇りとなる見込みです。\n\n<天気変化等の留意点>\n22日は、特にありません。\n\n\n【東北地方】\n東北地方は、曇りの所が多く、南部では雪や雨の降っている所があります。\n\n22日は、低気圧の影響により、曇りや晴れで、南部では雪や雨の降る所があるでしょう。\n\n23日は、高気圧に覆われて、晴れや曇りの見込みです。"
}

宮城県の天気情報の概要が取得できました。
内容としてもシンプルですね。

「今日・明日・明後日の天気予報」の内容

宮城県を例にします。
JSONファイル取得先のURLをクリックします。

取得できたJSONの内容はこちらです。
※読みやすいように整形しています

[
    {
        "publishingOffice": "仙台管区気象台",
        "reportDatetime": "2022-03-22T11:00:00+09:00",
        "timeSeries": [
            {
                "timeDefines": [
                    "2022-03-22T11:00:00+09:00",
                    "2022-03-23T00:00:00+09:00",
                    "2022-03-24T00:00:00+09:00"
                ],
                "areas": [
                    {
                        "area": {
                            "name": "東部",
                            "code": "040010"
                        },
                        "weatherCodes": [
                            "211",
                            "111",
                            "200"
                        ],
                        "weathers": [
                            "くもり 夜 晴れ 所により 夕方 まで 雪か雨",
                            "晴れ 昼過ぎ から くもり",
                            "くもり"
                        ],
                        "winds": [
                            "東の風 後 南東の風",
                            "北西の風 後 南東の風",
                            "北の風 後 北西の風"
                        ],
                        "waves": [
                            "1メートル",
                            "1メートル 後 1.5メートル",
                            "1.5メートル"
                        ]
                    },
                    {
                        "area": {
                            "name": "西部",
                            "code": "040020"
                        },
                        "weatherCodes": [
                            "211",
                            "111",
                            "200"
                        ],
                        "weathers": [
                            "くもり 夕方 から 晴れ 所により 昼過ぎ まで 雪か雨",
                            "晴れ 昼過ぎ から くもり",
                            "くもり"
                        ],
                        "winds": [
                            "東の風 後 西の風",
                            "西の風 後 東の風",
                            "西の風"
                        ]
                    }
                ]
            },
            {
                "timeDefines": [
                    "2022-03-22T12:00:00+09:00",
                    "2022-03-22T18:00:00+09:00",
                    "2022-03-23T00:00:00+09:00",
                    "2022-03-23T06:00:00+09:00",
                    "2022-03-23T12:00:00+09:00",
                    "2022-03-23T18:00:00+09:00"
                ],
                "areas": [
                    {
                        "area": {
                            "name": "東部",
                            "code": "040010"
                        },
                        "pops": [
                            "20",
                            "0",
                            "0",
                            "0",
                            "0",
                            "10"
                        ]
                    },
                    {
                        "area": {
                            "name": "西部",
                            "code": "040020"
                        },
                        "pops": [
                            "20",
                            "0",
                            "0",
                            "0",
                            "0",
                            "10"
                        ]
                    }
                ]
            },
            {
                "timeDefines": [
                    "2022-03-22T09:00:00+09:00",
                    "2022-03-22T00:00:00+09:00",
                    "2022-03-23T00:00:00+09:00",
                    "2022-03-23T09:00:00+09:00"
                ],
                "areas": [
                    {
                        "area": {
                            "name": "仙台",
                            "code": "34392"
                        },
                        "temps": [
                            "5",
                            "5",
                            "-1",
                            "9"
                        ]
                    },
                    {
                        "area": {
                            "name": "石巻",
                            "code": "34292"
                        },
                        "temps": [
                            "5",
                            "5",
                            "-2",
                            "8"
                        ]
                    },
                    {
                        "area": {
                            "name": "古川",
                            "code": "34216"
                        },
                        "temps": [
                            "5",
                            "5",
                            "-5",
                            "8"
                        ]
                    },
                    {
                        "area": {
                            "name": "白石",
                            "code": "34461"
                        },
                        "temps": [
                            "4",
                            "4",
                            "-3",
                            "9"
                        ]
                    }
                ]
            }
        ]
    },
    {
        "publishingOffice": "仙台管区気象台",
        "reportDatetime": "2022-03-22T11:00:00+09:00",
        "timeSeries": [
            {
                "timeDefines": [
                    "2022-03-23T00:00:00+09:00",
                    "2022-03-24T00:00:00+09:00",
                    "2022-03-25T00:00:00+09:00",
                    "2022-03-26T00:00:00+09:00",
                    "2022-03-27T00:00:00+09:00",
                    "2022-03-28T00:00:00+09:00",
                    "2022-03-29T00:00:00+09:00"
                ],
                "areas": [
                    {
                        "area": {
                            "name": "東部",
                            "code": "040010"
                        },
                        "weatherCodes": [
                            "111",
                            "200",
                            "101",
                            "200",
                            "203",
                            "201",
                            "101"
                        ],
                        "pops": [
                            "",
                            "40",
                            "20",
                            "40",
                            "60",
                            "30",
                            "20"
                        ],
                        "reliabilities": [
                            "",
                            "",
                            "A",
                            "B",
                            "B",
                            "A",
                            "A"
                        ]
                    },
                    {
                        "area": {
                            "name": "西部",
                            "code": "040020"
                        },
                        "weatherCodes": [
                            "111",
                            "200",
                            "101",
                            "200",
                            "203",
                            "201",
                            "101"
                        ],
                        "pops": [
                            "",
                            "40",
                            "20",
                            "40",
                            "70",
                            "30",
                            "20"
                        ],
                        "reliabilities": [
                            "",
                            "",
                            "A",
                            "C",
                            "A",
                            "A",
                            "A"
                        ]
                    }
                ]
            },
            {
                "timeDefines": [
                    "2022-03-23T00:00:00+09:00",
                    "2022-03-24T00:00:00+09:00",
                    "2022-03-25T00:00:00+09:00",
                    "2022-03-26T00:00:00+09:00",
                    "2022-03-27T00:00:00+09:00",
                    "2022-03-28T00:00:00+09:00",
                    "2022-03-29T00:00:00+09:00"
                ],
                "areas": [
                    {
                        "area": {
                            "name": "仙台",
                            "code": "34392"
                        },
                        "tempsMin": [
                            "",
                            "2",
                            "4",
                            "6",
                            "8",
                            "7",
                            "5"
                        ],
                        "tempsMinUpper": [
                            "",
                            "3",
                            "5",
                            "8",
                            "10",
                            "9",
                            "7"
                        ],
                        "tempsMinLower": [
                            "",
                            "0",
                            "2",
                            "4",
                            "7",
                            "5",
                            "4"
                        ],
                        "tempsMax": [
                            "",
                            "12",
                            "14",
                            "17",
                            "16",
                            "15",
                            "14"
                        ],
                        "tempsMaxUpper": [
                            "",
                            "13",
                            "16",
                            "20",
                            "19",
                            "19",
                            "16"
                        ],
                        "tempsMaxLower": [
                            "",
                            "10",
                            "12",
                            "15",
                            "14",
                            "11",
                            "11"
                        ]
                    },
                    {
                        "area": {
                            "name": "白石",
                            "code": "34461"
                        },
                        "tempsMin": [
                            "",
                            "0",
                            "2",
                            "3",
                            "8",
                            "5",
                            "3"
                        ],
                        "tempsMinUpper": [
                            "",
                            "2",
                            "4",
                            "5",
                            "10",
                            "8",
                            "5"
                        ],
                        "tempsMinLower": [
                            "",
                            "-1",
                            "0",
                            "1",
                            "5",
                            "2",
                            "0"
                        ],
                        "tempsMax": [
                            "",
                            "12",
                            "16",
                            "20",
                            "16",
                            "15",
                            "15"
                        ],
                        "tempsMaxUpper": [
                            "",
                            "15",
                            "19",
                            "23",
                            "21",
                            "20",
                            "20"
                        ],
                        "tempsMaxLower": [
                            "",
                            "10",
                            "14",
                            "18",
                            "15",
                            "13",
                            "12"
                        ]
                    }
                ]
            }
        ],
        "tempAverage": {
            "areas": [
                {
                    "area": {
                        "name": "仙台",
                        "code": "34392"
                    },
                    "min": "2.6",
                    "max": "11.5"
                },
                {
                    "area": {
                        "name": "白石",
                        "code": "34461"
                    },
                    "min": "0.8",
                    "max": "11.6"
                }
            ]
        },
        "precipAverage": {
            "areas": [
                {
                    "area": {
                        "name": "仙台",
                        "code": "34392"
                    },
                    "min": "5.5",
                    "max": "18.5"
                },
                {
                    "area": {
                        "name": "白石",
                        "code": "34461"
                    },
                    "min": "5.5",
                    "max": "19.3"
                }
            ]
        }
    }
]

情報量が多いですね。
こちらの内容は、気象庁のホームページの内容と同一となります。
https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=040000

twitter api

※週間天気は割愛

こちらの情報をもとに、明日の天気をツイートしてみます。

Twitterでツイートする

Twitter APIのキーを取得している、Firebase Functionの構築ができていることが前提になります。
まだTwitter APIを取得していない方は、こちらを参考に取得してみてください。

それでさっそく試してみましょう。

HTTP通信

今回はHTTP通信にaxiosを使用してみます。

const axios = require('axios');

Twitter API v2のクライアント設定

Firebaseの環境変数に設定している値を取得します。

const config = functions.config();
const client = new TwitterApi({
    appKey: 任意.key,
    appSecret: 任意.api.secret,
    accessToken: 任意.access.token,
    accessSecret: 任意.access.secret,
});

天気取得

以下を実行し天気を取得します。

const response = await axios.get('https://www.jma.go.jp/bosai/forecast/data/forecast/040000.json');

天気データ

「data[0].timeSeries[0].areas[0].weathers[1]」に明日の天気、
「data[0].timeSeries[2].areas[0].temps[2]」に明日の最低気温、
「data[0].timeSeries[2].areas[0].temps[3]」に明日の最高気温が格納されています。

ツイート

天気をツイートしてみます。

// タイムゾーンの設定.
const timezone = 'Asia/Tokyo';
process.env.TZ = timezone;

// ツイート(毎夜22:00).
exports.doTweetGoodNight = functions
    .region('asia-northeast1')
    .pubsub
    .schedule('every day 22:00')
    .timeZone(timezone)
    .onRun(async () => {
        // 天気取得.
        const response = await axios.get('https://www.jma.go.jp/bosai/forecast/data/forecast/040000.json');

        // ツイート.
        client.v2.tweet(
            '本日もお疲れ様でした🍀' + '\n' +
            '\n' +
            '🌞明日の仙台のお天気情報🌞' + '\n' +
            '天気:' + response.data[0].timeSeries[0].areas[0].weathers[1] + '\n' + 
            '最高気温:' + response.data[0].timeSeries[2].areas[0].temps[3] + '℃' + '\n' + 
            '最低気温:' + response.data[0].timeSeries[2].areas[0].temps[2] + '℃' + '\n' + 
            '\n' +
            '明日も皆さんにとって良い1日でありますように🍀');
});

まとめ

本記事では、気象庁の天気予報JSONファイルを使って天気をツイートしてみました。
こちらでも簡単にできましたね。

毎夜22:00に自動でツイートしていますので、確認してみたい方はこちらをフォローしてみてください。
よろしくお願いします。