Hangouts Chatの雨通知botを爆速で作る


@murs313 さんのSlackの雨通知botを爆速で作る【メッ●●】を読み、
早速同じ物を作ろうと思いましたが、弊社はSlackが使えませんでした。

というわけでHangouts Chat版雨通知botを作ってみました。
GASだと真似しすぎで作っててつまらないのでPythonとcronで実装してみました。

※ なおHangouts ChatはG Suiteでのみ使用でき、個人のGoogleアカウントでは現在使用できません。

つくったもの

テストで送信してみたものがこちら。
実際は時間を合わせて17:00に送信されるように設定しています。

Hangouts ChatはMarkdownっぽい記法が使えるのが良いですね。
(画像では強調表示がうまいこといってませんが……)

つかったもの

  • CentOS 8
    cronで定期実行します。
  • Python 3.6.8
  • Hangouts Chat の incoming webhook
  • livedoorお天気API

Hangouts ChatへのPOST

Hangouts Chat は incoming webhook が使用できます。
@iitenkida7 さんの [超簡単]Hangouts Chat の incoming webhooks を使ってAPIから簡単にメッセージを投稿するを参考にさせて頂きました。

Pythonのソースコード

weather.py
import requests

weather_url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010' # Tokyo
resp = requests.get(weather_url)
data = resp.json()

# 一部ぼかしていますがコピペでおk
webhook_url = "https://chat.googleapis.com/v1/spaces/HOGEHOGE/messages?key={YOUR_KEY}&token={YOUR_TOKEN}" 

tomorrow_weather = data['forecasts'][1]
telop = tomorrow_weather['telop']
max_temp = tomorrow_weather['temperature']['max']
min_temp = tomorrow_weather['temperature']['min']
image = tomorrow_weather['image']['url']

text = ''
text += '明日の天気は'
text += '*' + telop + '*'
text += 'です。\n'
# なぜかmaxとminが時々取得できない
if max_temp is not None:
    text += '最高気温'
    text += max_temp.get('celsius')
    text += '℃'
if min_temp is not None:
    text += '/最低気温'
    text += min_temp.get('celsius')
    text += '℃\n'
text += image

content = {"text": text}
response = requests.post(webhook_url, json=content)

cronの設定

cronの設定はこちらが参考になると思います。

cronの設定を行うにはcrontab -eを叩きましょう。

$ crontab -e

するとVimで設定ファイルが開くので、実行する時間と実行するコマンドを入力しましょう。
今回はホームディレクトリ直下に置いたという設定です。

0 17 * * * python3 ~/weather.py

ファイルを保存してVimを閉じた時にcrontab: installing new crontabと表示されれば設定完了です。

動作確認する場合は、再度crontab -eを開き、

*/1 * * * * python3 ~/weather.py

のように記述すれば1分おきにコマンドが実行されるようになります。

感想

参考にさせていただいたリンクたちがわかりやすかったので特に詰まることなく設定できました。
これで私も雨の日の前日にPCを持って帰るのを忘れずに済みます。

……まぁ弊社は先日リモート禁止の御触れがでちゃったんですけど。