【Python】天気予報をLINEに通知するプログラムを作ってみた。

  • URLをコピーしました!

Pythonで、天気予報の情報を入手する方法、LINEにメッセージを送る方法をまとめておきます。

私が住んでいる都市の、当日の最低気温、最高気温、時間別降水確率を確認できるようにしました。
目次

ライブラリのインポート

import requests #webサイトにリクエストを送るためのライブラリ

天気予報の取得、LINEへの通知共にAPI(Application programming interface)を使用します。
APIを提供しているURLにアクセスして情報のやりとりをしますが、その際にrequestsのライブラリが必要です。

コードの最初に記載して、ライブラリをインポートしておきます。
APIに関する詳しい説明記事は後日アップしようと思います。

必要なAPIを探す

今回必要なのは、天気予報の情報を提供してくれるAPIと、LINEに通知を送信するAPIです。それぞれ使用したAPIを紹介します。

天気予報API

https://weather.tsukumijima.net/

個人的に作成くださっているAPIのようです。

去る 2020 年 7 月、livedoor 天気がサービス終了となりました。livedoor 天気の API はわかりやすく、認証も不要でとても利用しやすかったのですが、突然の終了となりとても残念です。

代替として使えそうな API を探しましたが、OpenWeatherMap は API キーが必要な上に予報自体が正確でなかったり、気象庁のサイトはそもそも API がなかったりなど livedoor 天気のように手軽に使える API は見つからず、こうして自作することとなりました。

https://weather.tsukumijima.net/

個人使用目的としては十分ですので、今回使用させていただきました。

LINE notify API

https://notify-bot.line.me/doc/ja/

LINE公式が提供してくださっているAPIです。
このAPIを使用するには、LINEアカウントにログインしてトークンを発行する必要があります。

トークンを発行する手順① ログインする

リンク先をクリックし、普段使用しているLINEのアカウントにログインします。

トークンを発行する手順② マイページへ移動

ログインしたら右上にご自身の名前が表示されます。そこをクリックしてマイページへ飛びます。

マイページに飛ぶと、下の方にトークンを発行するリンクがあるのでおします。

自分宛に送りたい場合は、一番上に出てくる行を選択して発行します。トークン名は通知の際に文頭に表示されます。何でも構いません。

トークンが発行されます。必ずコピーしておきましょう。

これで準備は完了です。実際にコードを書いていきます。

jsonから必要な情報を取得

次に、天気予報のAPIから取得できる情報を元に、その日の最低気温、最高気温、降水確率、日付を格納していきます。

まず、あとで編集しやすいようにAPIのURLを宣言しておきます。

APIのURLはそれぞれ先述のリンク先に記載されています。(ページ自体のURLとは異なります。APIとしてのURLです。)

Request_URL_weather = 'https://weather.tsukumijima.net/api/forecast'
Request_URL_LINE = 'https://notify-api.line.me/api/notify'

天気予報に必要な情報は入手したい都市のID、LINE通知に必要な情報はトークンなので、それぞれ宣言します。
トークンは先ほど発行・コピーした物を貼り付けます。都市ごとのIDはここで確認できます。

https://weather.tsukumijima.net/primary_area.xml

City_ID = '100010' #これは前橋市
Token = '' #コピーしたやつを貼り付け

以上のインプット情報を元に、まず天気予報の情報を取得します。
requests.get は、最初にインポートしたrequestsライブラリからgetと言う関数を使って、アクセス先のURLにアクセスして情報をもらってくるコードです。()内は都市情報も含めたAPIのURLになっています。どうやって情報を取得するかは、APIが配布されてるwebサイトを読めば見つかります。

出力される結果はjson形式なので、それをresultに格納します。

res = requests.get(Request_URL_weather + '/city/' + City_ID)
result = res.json()

得られたjsonの文章の中には、今日・明日・明後日の予定が含まれているので、今日の分だけ取り出します。
朝6時に通知することを想定しているので、6時から24時までの降水確率と、最低気温、最高気温を取り出します。
最低気温はNoneになっている可能性もあるみたいなのでその場合をif文で分岐しておきます。

weather_td = result['forecasts'][0] #[0]:今日、[1]:明日、[2]:明後日になる
date = weather_td['date'] #今日の日付

if weather_td['temperature']['min'] == None:
    weather_td['temperature']['min'] = '--'
    temperature = [weather_td['temperature']['min'],weather_td['temperature']['max']['celsius']]
else:
    temperature = [weather_td['temperature']['min']['celsius'],weather_td['temperature']['max']['celsius']]
chanceOfRain = [weather_td['chanceOfRain']['06-12'],weather_td['chanceOfRain']['12-18'],weather_td['chanceOfRain']['18-24']]

LINEに通知したい文章作成

次に、LINEに送る文章を作ります。

messages = date + 'の天気\nminT:' + temperature[0] + '℃\nmaxT:' + temperature[1] + '℃\n06-12:'+ chanceOfRain[0] + '\n12-18:' + chanceOfRain[1] + '\n18-24:' + chanceOfRain[2]

LINE APIでは、トークンとメッセージの送信方法が設定されているので、それにしたがってrequestsライブラリのpost関数を宣言します。

TOKEN_dic = {'Authorization':'Bearer' + ' ' + TOKEN}
send_dic = {'message': messages}
requests.post(Request_URL_LINE, headers=TOKEN_dic, data=send_dic)

これで、自分のLINEにLINE notifyからメッセージが来ていれば成功です。

参考にしたサイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次