LoginSignup
3
3

More than 3 years have passed since last update.

【Python × Zapier】警報情報を取得してSlackで通知する

Posted at

やりたいこと(BEFORE)

気象庁の警報情報を取得して指定する地域に警報が出ていればSlackで通知する

こちらの記事がやりたいことドンピシャだ!
と思い記事の通りに進めていましたが、気象庁のデータが更新される度にZapier(作業を自動化できるツール)のタスクを動かしていると自分のプランの上限タスクを超えてしまう...

screencapture-zapier-app-billing-plans-2020-02-09-17_41_58.png

そこでやりたいことの範囲を狭めました。

やりたいこと(AFTER)

気象庁の警報情報を「毎朝7時」に取得して指定する地域に警報が出ていればSlackで通知する

▼こんな感じ(動かした時に警報が出ていなかったので代わりに注意報を取得した様子)

毎朝7時に1回だけ情報を取得してタスク実行回数を1回/日にしました。

Zap全体図

  1. Every Day:ここで毎朝7時にタスクを実行するように設定
  2. Run Python:気象庁の情報を取得・抽出(下にコードを記載)
  3. Only continue if...:2で出力があれば(警報が出ていれば)次に進む
  4. Send Channel Message in Slack:Slackの指定するチャンネルで通知

Pythonコード

やりたいことが若干変わったので勉強せねば...と思いスクレイピングの方法を調べて書きました。初Python!
調べているとどうやらBeautifulSoupというものを使うのか〜ということを知りましたがZapierのヘルプにこんなことが書いてありました。
スクリーンショット 2020-02-09 18.23.51.png
お"ぉぉおおおんBeautifulSoupが使えない!
ということで無理矢理感ありますがBeautifulSoup使わずにほしい箇所(警報部分)だけ抽出します。

import re
import requests
import time

code_list = [['札幌市', '0110000'], ['仙台市東部', '0410001'], ['さいたま市', '1110000']]
output = {'text': ''}

for code in code_list:
    html = requests.get('https://www.jma.go.jp/jp/warn/f_' + code[1] + '.html').text
    data_list = re.findall('<span style="color:#FF2800">(.*?)</span>', html)

    if len(data_list) == 0:
        continue

    text = '【' + code[0] + '】'
    i = 1
    for data in data_list:
        if i == len(data_list):
            text += data
        else:
            data = re.sub('警報', '', data)
            text  += data + ','
        i += 1
    output['text'] += text + '\n'
    time.sleep(1)

各地域のページで警報部分のフォントカラーは#FF2800なので、<span style="color:#FF2800">〜</span>で囲まれた部分を全て抽出しています。
また、複数ページをスクレイピングするのでtime.sleep(1)で1秒休ませます。

参考

気象庁から情報を取得して東京23区の気象警報をSlackに通知する
Zapierの使い方も含めてとても参考にさせていただきました。

3
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3