Python + GoogleChat(webhook) で天気予報を送信したい

はじめまして。
たまにPythonに関する記事を書くことにしました。
難しい記事を書いてプロフェッショナルムーブをしようかと思いましたが、
まだまだ:hatching_chick:なので自身の復習も兼ねて、簡単な内容についてまとめます。

最近とても暑いので、今回はあると活躍するかもしれない「天気予報を送信するモノ」を作っていこうと思います。

***

## 1.チャットルーム作成

まずはGoogleChatのチャットルームを作成します。
このルームでwebhookが天気予報を送信してくれます。
画像とかチェックボックスとかご用意されていますが、今回は名前だけ入力します。

![step_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/d064e88d-f1af-700a-ce0e-0b312df4223b.png)

（切り抜き下手ですみません…:upside_down:）

## 2.Webhookの作成

次に、天気予報を送信してくれるwebhookを作成します。
webhook君をざっくり説明すると、外部からのリクエストを受けることが可能なシステムのようなものです。
今回はPythonのrequests.postを用いて、テキストベースでこのwebhook君に天気予報をプレゼントしていきます。

作成したチャットルーム名の **「▼ボタン」→「Webhookを管理」** の順でクリックします。

![step_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/f9a8f705-54ec-ad31-53f4-34a4f9c48be3.png)

クリック後、以下のようなダイアログが表示されるので、Webhook君に名前を付けて差し上げます。
名前を付けたら「保存」ボタンをクリックします。
アバターURLを入力することが可能ですが、こちらはトプ画設定のようなものなので、
あってもなくても大丈夫です。

![step_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/ea9cee37-3d46-8343-95a0-898db17437f0.png)

保存後、画面が切り替わるのでURLをコピーしておきます。
このURLに対して、Pythonから天気予報（リクエスト）を送信していきます。

![step_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/05119f79-f2c7-12c4-6b2f-d1c516a8e628.png)

GoogleChat側の準備はこれでばっちしです:clap:


## 3.いざPython側での実装

**前項でも少し触れましたが、今回はrequestsというライブラリを用いて、天気予報を送信していきます。**
**requestがお使いの環境に存在しない場合は、pip等でインストールしてください。**


まずは簡単にテキストを送信してみましょう。

```python:weather.py
# encoding: utf-8
import requests

# メイン処理
def main():

    # コピーしたwebhookのurlを記入
    webhook_url = 'https://chat.googleapis.com/---以下略---'

    # webhook経由で送信するメッセージ
    send_text = "おはこんばんにちは！"

    # 送信
    response = requests.post(
        webhook_url,
        json={"text": send_text}
    )

if __name__ == "__main__": main()
```

これを実行すると…

![step_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/5223f420-7e62-e3b5-856b-55cd2c434e3f.png)

おてんきくんに心が芽生えます。めでたい。

***

問題なく送信されることが分かったので（茶番）
天気予報のAPIから情報を取得→パースして送信していきましょう。

今回はtsukumijima様の[天気予報API（livedoor 天気互換）](https://weather.tsukumijima.net/)をお借りいたしました。
**こちらのAPIをご利用になる際は、注意事項等をよくご確認の上ご利用ください。**
（tsukumijima様、APIを公開していただきありがとうございます。）

```python:weather.py
# encoding: utf-8
import requests

# 天気予報を取得してテキストで返す
def GetWeatherInfo():

    endpoint = "https://weather.tsukumijima.net/api/forecast/city/130010"

    # 天気予報のAPIに接続
    weather_data = requests.get(endpoint).json()

    # ここに送信する内容が格納される
    ret_info = []

    # ↓----------欲しい天気の情報を取得してret_infoに情報を格納----------↓

    # どの地域の天気か知りたい…！
    ret_info.append(weather_data['title'])

    ret_info.append("")

    # 細かい内容を知りたい…！
    ret_info.append(weather_data['description']['text'].replace("\n\n", "\n"))

    ret_info.append("")

    # 明日と明後日の天気が一度に見れたいい
    for forecast in weather_data['forecasts']:
        if "今日" in forecast['dateLabel']:
            continue
        ret_info.append("-----" + forecast['dateLabel'] + "--------------------")
        ret_info.append("最高気温：" + str(forecast['temperature']['max']['celsius']))
        ret_info.append("最低気温：" + str(forecast['temperature']['min']['celsius']))
        ret_info.append("天気　　：" + forecast['detail']['weather'])
        ret_info.append("")
    
    return "\n".join(ret_info)


# メイン処理
def main():

    # コピーしたwebhookのurlを記入
    webhook_url = 'https://chat.googleapis.com/---以下略---'

    # webhook経由で送信するメッセージ
    send_text = GetWeatherInfo()

    # 送信
    response = requests.post(
        webhook_url,
        json={"text": send_text}
    )

if __name__ == "__main__": main()
```

空行を入れて見栄えをよくするため 
**ret_info.append("")**
をちょくちょく挟んでいます。
これを実行すると…

![step_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780415/81cf5eb8-b11a-de24-2812-4103dd86e51d.png)


無事明後日までの予報を送信することが出来ました！

近頃のチャットツールは絵文字も充実しているので、
置換処理を用いて「晴れ→:sunny:」
みたいに置き換えるとオシャレベルが上がるかもしれませんね。