![027_日本大荒れ](https://assets.st-note.com/production/uploads/images/14192044/rectangle_large_type_2_c96405b521b63212a5ca0126e53a6439.jpeg?width=1200)
天気予報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では設定した時間になると、次の画像のように通知されます。
また、ショートメール(SMS)には次のように通知されます。
※降水確率も通知させるようにしていますが、画像はサンプルなので6%になっています。
ぜひ実際に試してみてください!
今回のカギになる技術は、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で取得できるため、今回は取得したエラーメッセージをそのまま出力するようにします。
ここから先は
¥ 1,200
この記事が気に入ったらチップで応援してみませんか?