027_日本大荒れ

天気予報APIを利用したお知らせBOTのプログラミング解説~slackとSMSに自動通知~

朝、仕事に行くときに傘を忘れてしまうことはありませんか?

今回は、降水確率が高い場合に、slackとSMS(ショートメール)にお知らせ通知をしてくれるツールの作り方をご紹介します。

概要

こんな方におススメ(*´▽`*)
・雨が降ってないと傘を忘れがちなので、通知してほしい
・決まった時間にslackやSMSへ自動通知する方法を知りたい
・Pythonの基本的な知識で、生活の役に立つアプリを作りたい

ツールの仕組みは次のようになります。

1、毎朝8時に、天気予報のAPIを実行して、降水確率を取得
2、降水確率が50%以上の場合、傘を持っていくように通知
【slackの場合】
slackのAPIを使い、slackに自動通知
【SMS(ショートメール)の場合】
AWSのSNS(Simple Notification Service)を使い、SMSに自動通知

※実行時間や降水確率は数値を変更するだけで変更できます

slackとSMS両方同時に通知ができるコードにしていますが、どちらかに通知すればよいという場合は、不要な方のコードを書かなければ片方だけ実行されます。

slackでは設定した時間になると、次の画像のように通知されます。

キャプチャ5

また、ショートメール(SMS)には次のように通知されます。
※降水確率も通知させるようにしていますが、画像はサンプルなので6%になっています。

画像7

ぜひ実際に試してみてください!

今回のカギになる技術は、cronです。

cron はプログラムを自動実行するための仕組みです。
Linuxに標準に設定されているので、ログのローテートや、バックアップなど、定期的に自動実行したいジョブが場合、通常このcronを使って実行します。

cronは、クーロンって読むよ(^^♪

早速ですが、順を追って、コードの解説をしてきます。
今回は50行程度のシンプルなコードなので、他の記事を読んでいただいている方は、サクッと理解できると思います(^^♪
また、最後に、コードをまとめていますので、まずは全体をざっと見ていただくと理解しやすいと思います(^_-)-☆

サーバーはAWSのEC2を利用しますので、EC2についても少しだけ解説します。

サーバーをHerokuにする場合、自動実行は、Heroku schedulerを利用しますが、schedulerだと毎日〇時という設定ができず、〇時間ごとに実行のようなしていになってしまうのため、今回はEC2を使い、cronで定期実行をします。

プログラムの全体像を決める

まず、いつものように全体の流れを決めましょう。
今回は、ファイルを分けず、1つのファイル内でプログラムを書いていくこととします。
流れとしては、まず降水確率をAPIから取得するコードを書きます。次にslackにリクエストするコード、SMSにリクエストするコードを書きます。どちらか片方だけでよい場合を考えて、slackとSMSにリクエストするコードは別々の関数にして実行できるようにします。最後に降水確率50%以上の場合のみ実行するプログラムを書くという流れにします。

1.降水確率をAPIから取得する

降水確率を取得するために、今回は無料でも使えるDark Sky APIを利用します。

https://api.darksky.net/forecast/[key]/[latitude],[longitude]

Dark Sky APIの仕様を確認するとまず、上記のようにリクエストURLが確認できます。入力パラメーターには、登録すると発行されるkeyと緯度、経度を指定するだけで良いようなので、これを参考に関数を作ります。

def darksky():   
   latitude = "35.685175"
   longitude = "139.7528"
   apikey = "your-api-id"
   url = "https://api.darksky.net/forecast/{0}/{1},{2}".format(apikey, latitude, longitude)

上記のように、緯度、経度、APIキーを各変数に代入して、format関数でリクエストURLに追加します。上記の緯度、経度はサンプルとして皇居の緯度、経度を指定していますが、実際に利用する際は、自宅などの、降水確率を知りたい地点の緯度経度を設定してください。

APIへ接続し辞書形式でデータを得る

次にAPIに接続するための処理を書きます。

import requests
   
------中略-----

    try:
       r = requests.get(url, timeout=5)
       r = r.json()
    except requests.exceptions.RequestException as e:
       return e

今回もAPIを利用する際に便利なライブラリーであるrequestsを利用しますので、忘れずにファイルの先頭のimport文にrequestsを追記しておきます。

次に、try~except文で、requests.getにより設定したURLとパラメータを元にGET通信を行います。そして、requestsライブラリの関数json()により変数contentにデコードしたjsonデータを辞書として格納します。

また例外処理として、requestsライブラリーではDark Sky API起因ではなく、通信のリクエスト起因に関するエラーメッセージをrequests.exceptions.RequestExceptionで取得できるため、今回は取得したエラーメッセージをそのまま出力するようにします。

ここから先は

13,670字 / 8画像

¥ 1,200

この記事が気に入ったらサポートをしてみませんか?