その他
    ホーム 技術発信 DoRuby pythonで梅雨対策
    pythonで梅雨対策
     

    pythonで梅雨対策

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

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

    ざっくり概要

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

    結果

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

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

    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,  # メンションを有効にする
            })
        )
    
    記事を共有