企画が迷走した
事の発端は、周りの友人たちがこぞって「低気圧のせいか体調わるいわ~」とおっしゃるので、本当に気圧のせいなのか可視化したくなったことです。
こんな時はラズパイの出番だ!なんて思ったのですが、
友人たちは全国各地に住んでいて、私の自宅で観測したデータ等なんの役にも立ちません。
そして「気圧がどのような変化をしたときに体調が悪くなるのか」を定義して、体調不良予報なんてものを作ろうにも、調査を含めてちょっと壮大な計画になってしまう・・・
とりあえずスモールスタートだ!という事で、はじめの一歩として試しにお天気APIを叩いて、任意の地域の天気情報をGetしてみる事にしました。
本記事のゴール
- WebAPIを叩いて天気情報を取得する
- 取得するだけでは面白くないので、LINE BOTに天気を通知してもらう
開発ツール
- Python3.9.0
- OpenWeatherMap(気象情報API)
- LINE Messaging API
概要
気象情報APIとして有名なOpenWeatherMapより、Pythonのrequestsライブラリを利用して気象情報を取得します。
取得した情報を文字列にフォーマットし、LINEで通知します。
では行こう。
OpenWeatherMapを利用できるようにしよう
下記URLより、アカウントを作成して利用登録を行います。
以降の導入に関しては、下記記事を参考にさせて頂きました。
URLにパラメータを指定するのみで、データを取得できるようです。
試しにAPIを叩いてみよう!
下記記事を参考にさせて頂き、PythonでAPIを叩いて、json形式のデータをdumpしてみます。
コンソールに、気象に関する様々なデータが出力されます。
今回はこの取得したデータから必要なデータを抜き出し、LINE BOTでSendMessageしましょう!
LINE BOTでメッセージを送ろう!
今回はJSON形式のデータから、おいしいデータだけ抜きとって利用する、という点にフォーカスします。
LINE BOT導入の概要や作成例については、私の過去記事を参考に頂けると幸いです。
いきなりソースコード全文いくで!
先ずは全文公開します。
ざっと全体をご覧頂いたら、関数ごとに見て行きましょう!
import json
import requests
from linebot import LineBotApi
from linebot.models import TextSendMessage
import random
file = open("info.json", "r")
info = json.load(file)
def getWeatherData():
cityName = "kusatsu"
ApiKey = info["WEATHER_API_KEY"]
api = info["WEATHER_API"]
url = api.format(city=cityName, key=ApiKey)
apiResponse = requests.get(url)
data = apiResponse.json()
weatherInfo = json.dumps(data, indent=4)
return json.loads(weatherInfo)
def ConvertWeatherName(weatherInfo):
weather = weatherInfo["weather"][0]["icon"]
if (weather == "01d" or "02d"):
text = "晴れ"
elif (weather == "03d" or "04d"):
text = "くもり"
elif (weather == "09d" or "10d"):
text = "雨"
elif (weather == "11d"):
text = "雷雨"
elif (weather == "13d"):
text = "雪"
elif (weather == "50d"):
text = "霧"
else:
text = "謎の天気"
return text
def CreateWeatherMessage():
weatherInfo = getWeatherData()
weather = weatherText
tempMax = round(weatherInfo["main"]["temp_max"])
tempMin = round(weatherInfo["main"]["temp_min"])
humidity = weatherInfo["main"]["humidity"]
pressure = weatherInfo["main"]["pressure"]
message = [
f"おはよう!今日の天気をお知らせするよ!\n天気:{weatherText}\n最高気温:{tempMax}℃\n最低気温:{tempMin}℃\n湿度:{humidity}%\n気圧:{pressure}hpa\nだよ!"]
return message
def main():
CHANNEL_ACCESS_TOKEN = info["CHANNEL_ACCESS_TOKEN"]
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
USER_ID = info["USER_ID"]
message = CreateWeatherMessage()
messages = TextSendMessage(text=message[0])
line_bot_api.push_message(USER_ID, messages=messages)
if __name__ == "__main__":
main()
getWeatherData!
getWeatherData()
関数は、OpenWeatherMapのAPIを叩いて、取得したjson形式のデータを辞書型で返す関数です。
ApiKey
などはベタ書きせず、別途トークン用のjsonファイルに記述してあるので、そちらから呼び出します。
ConvertWeatherName!
OpenWeatherMapより取得したデータでは、天気情報は英語となっています。
そのままでも良いのですが、LINE BOTのキャラクター性を考慮して、日本語に変換しましょう
weather = weatherInfo["weather"][0]["icon"]
にて、天気名のIDを取り出します。
天気名とIDの対応表は下記を参考にします。
天気icon用IDの方が仕分けがざっくりしているので、こちらを利用する事にしました。
IDを対応させれば、より細かく天気を表現できます。
後はif文で、日本語テキストに対応させて返却します。
CreateWeatherMessage!
CreateWeatherMessage()
関数で、LINE BOTのセリフを作ります。
getWeatherData()
関数でAPIを叩いて辞書型でget
ConvertWeatherName()
で日本語天気名を取得
以下の処理にて、weatherInfo変数に格納した辞書型データから、
最高気温、気圧等のデータを拾っていきます。
最後にこれらのデータを文字列に組み込んで、messageとして返却します。
ここまで出来たら準備はOK!
では早速実行してみましょう!
実行ボタンをポチっとな・・・
見事成功です!
他にも使えそうなお天気情報が色々あるので、活用の幅は広そうですね!
おわりに
今回作成したコードは、実行する度に一通のメッセージを送信します。
ラズパイやGitHubActionsに導入しておいて、cronでタイマを設定することで、任意のタイミングでお天気情報を通知させることができます。
私は今回はGitHubActionsにて自動実行するように設定したので、毎朝7時14分にお天気を通知してくれます。
ここまでお読み頂いた読者様も是非、お試し頂ければ幸いです。