前回は OpenWeatherAPI を使い、天気をツイートの実施まで試しました。
今回は気象庁の天気予報JSONファイルを使い、 Twitter API で天気をツイートするところまで作ってみたいと思います。
自動で天気予報をツイートしてみたい方は本記事を参考にしてみてください。
前回の記事はこちらです。
気象庁の天気予報JSONファイルとは
気象庁のWebサイトがリニューアルされ他ことにより、天気予報情報がJSON形式で取得できるようになりました。
しかし、正式な公開のWebAPIではありませんが、
「政府標準利用規約に準拠してご利用いただける」
とのことです。
一番伸びてるのはこれかしら。仕様の継続性や運用状況のお知らせを気象庁はお約束していないという意味で、APIではないと申し上げざるを得ないのですが、一方で政府標準利用規約に準拠してご利用いただけます。 https://t.co/QLuhI4DNDv
— TOYODA Eizi (@e_toyoda) February 24, 2021
登録不要で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でツイートする
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に自動でツイートしていますので、確認してみたい方はこちらをフォローしてみてください。
よろしくお願いします。