OpenWeatherMapから取得した気象データを、LINE BOTで通知してみよう

# 企画が迷走した
事の発端は、周りの友人たちがこぞって「低気圧のせいか体調わるいわ～」とおっしゃるので、本当に気圧のせいなのか可視化したくなったことです。
こんな時はラズパイの出番だ！なんて思ったのですが、
友人たちは全国各地に住んでいて、私の自宅で観測したデータ等なんの役にも立ちません。
そして「気圧がどのような変化をしたときに体調が悪くなるのか」を定義して、体調不良予報なんてものを作ろうにも、調査を含めてちょっと壮大な計画になってしまう・・・

とりあえずスモールスタートだ！という事で、はじめの一歩として試しにお天気APIを叩いて、任意の地域の天気情報をGetしてみる事にしました。

## 本記事のゴール
- WebAPIを叩いて天気情報を取得する
- 取得するだけでは面白くないので、LINE BOTに天気を通知してもらう

## 開発ツール
- Python3.9.0
- OpenWeatherMap(気象情報API)
- LINE Messaging API

## 概要
気象情報APIとして有名なOpenWeatherMapより、Pythonのrequestsライブラリを利用して気象情報を取得します。
取得した情報を文字列にフォーマットし、LINEで通知します。

では行こう。

## OpenWeatherMapを利用できるようにしよう
下記URLより、アカウントを作成して利用登録を行います。

https://openweathermap.org/

以降の導入に関しては、下記記事を参考にさせて頂きました。

https://qiita.com/nownabe/items/aeac1ce0977be963a740

URLにパラメータを指定するのみで、データを取得できるようです。

## 試しにAPIを叩いてみよう！
下記記事を参考にさせて頂き、PythonでAPIを叩いて、json形式のデータをdumpしてみます。

https://qiita.com/akif999/items/047d676a6ca4c0441877

コンソールに、気象に関する様々なデータが出力されます。

今回はこの取得したデータから必要なデータを抜き出し、LINE BOTでSendMessageしましょう！

## LINE BOTでメッセージを送ろう！
今回はJSON形式のデータから、おいしいデータだけ抜きとって利用する、という点にフォーカスします。

LINE BOT導入の概要や作成例については、私の過去記事を参考に頂けると幸いです。

https://qiita.com/kohey0701/items/e86c76f3779cf03621db

# いきなりソースコード全文いくで！

先ずは全文公開します。
ざっと全体をご覧頂いたら、関数ごとに見て行きましょう！

```python
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の対応表は下記を参考にします。

https://openweathermap.org/weather-conditions

天気icon用IDの方が仕分けがざっくりしているので、こちらを利用する事にしました。

IDを対応させれば、より細かく天気を表現できます。

後はif文で、日本語テキストに対応させて返却します。

## CreateWeatherMessage!
`CreateWeatherMessage()`関数で、LINE BOTのセリフを作ります。

`getWeatherData()`関数でAPIを叩いて辞書型でget
`ConvertWeatherName()`で日本語天気名を取得
以下の処理にて、weatherInfo変数に格納した辞書型データから、
最高気温、気圧等のデータを拾っていきます。

最後にこれらのデータを文字列に組み込んで、messageとして返却します。

## ここまで出来たら準備はOK!

では早速実行してみましょう！
実行ボタンをポチっとな・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/75f5f1ed-acfd-89ff-f31c-ce90ad532f37.png)

見事成功です！

他にも使えそうなお天気情報が色々あるので、活用の幅は広そうですね！

## おわりに
今回作成したコードは、実行する度に一通のメッセージを送信します。

ラズパイやGitHubActionsに導入しておいて、cronでタイマを設定することで、任意のタイミングでお天気情報を通知させることができます。

私は今回はGitHubActionsにて自動実行するように設定したので、毎朝7時14分にお天気を通知してくれます。

ここまでお読み頂いた読者様も是非、お試し頂ければ幸いです。