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からメッセージが来ていれば成功です。
コメント