ホーム DoRuby pythonで梅雨対策
 

pythonで梅雨対策

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

pythonで梅雨対策をします。
技術力が低いので、役に立つ技術記事はかけません。
その代わり、ちょっとだけ便利なものを手軽に作ります。

ざっくり概要

  1. APIから天気情報を取得
  2. いろいろする
  3. slackに投げる

結果

一時間後の天気がザーザー降り以上ならslackに通知するbotができました。

ちなみに、強さレベルで言うと
ザーザー<土砂<バケツ<滝<恐怖
となっています。恐怖が最強です。

APIから天気を取得

お天気APIは色々あって、OpenWeatherMapやDark Sky APIなど海外のものも触ってみたのですが、日本の詳細な天気が時間単位で取れなかったり、SSHがうんたらで怒られたりしたので、結局Yahoo! JAPANさんのYOLP 気象情報APIを使います。
ちなみに緯度経度が使えるので、大雑把に会社の近くの緯度経度にしました。
安心です。

色々する

APIから天気情報を取得して色々します。
簡単に言うと、APIからrainfallを抜いてきます。
rainfallは、どうやら降水強度という指標らしいです。
降水強度では分かりやすい目安がすぐに見当たらなかったので、似たような概念の時間降水量を参考に、rainfallをわかりやすくします。

気象庁に分かりやすい指標がありました。
上に書いた雨の強さレベルもこれに基づいてます。
http://www.jma.go.jp/jma/kishou/know/yougo_hp/amehyo.html

slackに投げます

Incoming Webhookというものを使います。

雑記

コード自体は単純ですが、APIの選定が地味に面倒でした。
せっかく作ったので、cronで回して、折りたたみ傘でも買って会社内でレンタル傘屋でもやろうかと思ったのですが、YOLPさんは商用利用に申請が必要そうなのでやめました。
では、良き梅雨を。

以下コード

メイン

# get_rainfall.py
import requests
import slack_post


def main():
    url = build_url()
    json_data = request_json(url)
    in_one_hour_rainfall = extract_rainfall(json_data)

    if in_one_hour_rainfall >= 10:
        rainfall_notice = notification_level(in_one_hour_rainfall)
        slack_post.post(rainfall_notice)


# url組み立て
def build_url():
    APP_ID = "YOLPのAPIキー"
    BASE_URL = "http://weather.olp.yahooapis.jp/v1/place"
    COORDINATES = "139.709008,35.669968"  # 緯度経度
    OUTPUT = "json"

    url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID, COORDINATES, OUTPUT)

    return url


# リクエスト
def request_json(url):
    req = requests.get(url)
    json_data = req.json()

    return json_data


# 降水強度の取得
def extract_rainfall(json_data):
    weather = json_data['Feature'][0]['Property']['WeatherList']['Weather']
    in_one_hour_rainfall = weather[1]['Rainfall']

    return in_one_hour_rainfall


# 降水レベル
def notification_level(in_one_hour_rainfall):
    if in_one_hour_rainfall >= 80:
        return "恐怖"
    elif 50 <= in_one_hour_rainfall < 80:
        return "滝"
    elif 30 <= in_one_hour_rainfall < 50:
        return "バケツ"
    elif 20 <= in_one_hour_rainfall < 30:
        return "どしゃ"
    elif 10 <= in_one_hour_rainfall < 20:
        return "ザーザー"


if __name__ == "__main__":
    main()

スラックになげる処理

import requests
import json


# slsckにpostするスクリプト
def post(text):
    requests.post('slackのAPI関連', data=json.dumps({
        'text': "一時間後に " + text + "降りの雨が降ります",  # 投稿するテキスト
        'username': 'baguette',  # ユーザー名
        'icon_url': 'http://2.bp.blogspot.com/-mhOboAyB0eA/VfS6MnLrttI/AAAAAAAAxOM/rqBqjtoezJ4/s800/fashion_ame_zubunure.png',  # プロフィール画像
        'link_names': 1,  # メンションを有効にする
        })
    )
記事を共有
モバイルバージョンを終了