今回はPythonでSlackに天気を定期配信する方法について紹介します。
手順は以下の3つです。
・Pythonで天気を取得する方法
・PythonでSlackに天気を通知する方法
・天気をタスクスケジュールで配信するPythonコードの実装例
目次
Pythonで天気を取得する方法
Pythonは「requests」ライブラリを活用して天気サイトにアクセスし、情報をダウンロードすることで取得することができます。
Pythonで東京の天気を取得する方法
下記はPythonで東京の天気を取得する場合の記述例です。
◆記述内容(weather.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import json import requests def get_weather(city_number): # 天気のURL設定 city_numberには都市番号を指定 url = "https://weather.tsukumijima.net/api/forecast/city/%s" % city_number # URLを取得 response = requests.get(url) # URL取得結果のチェック response.raise_for_status() # 天気データを読み込む weather_data = json.loads(response.text) return(weather_data) # テストコード def main(): # 東京の天気を取得する(130010)は東京の都市番号 w = get_weather(130010) t = w['forecasts'][0] print(t['dateLabel']) # 今日 print(t['date']) # 日付 print(t['telop']) # 天気 if __name__ == "__main__": main() |
テスコードを実行すると以下の結果が得られます。
2019-01-04
晴れ
Pythonでインターネットを取得する手順については「Slackbotで今日の天気を確認する」にて詳しく説明しています。
東京以外の天気を取得するには
都市ごとに割り振られた番号は「全国の地点定義表(RSS) 」から確認できます。
都市ごとに番号が割り振られています。
上記のidの部分が都市ごとに割り振られた番号です。
調べた番号をget_weather()の引数に渡すことで他の都市の天気を取得することができます。
1 2 3 4 5 6 7 8 | def main(): # 調べた番号を引数に渡す w = get_weather(xxxxxx) t = w['forecasts'][0] print(t['dateLabel']) # 今日 print(t['date']) # 日付 print(t['telop']) # 天気 |
PythonでSlackに天気を通知する方法
Slackにメッセージを通知する場合は「Slacker」というライブラリを活用します。
天気を配信するコードの記述例は以下の通りです。
◆記述内容(cronweather.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from slacker import Slacker import weather def main(): dic_weather = { '晴れ' : 'sunny', '曇り' : 'cloud', '雨' : 'rain_cloud', '雪' : 'snow_cloud', '曇時々晴' : 'barely_sunny', } dic_date = { '今日': 0, '明日': 1, '明後日': 2 } w = weather.get_weather(130010) t = w['forecasts'][dic_date['今日']] telop = t['telop'] # 辞書にない天気が来たら絵文字に空文字を設定する if telop in dic_weather: emoji = ':' + dic_weather[telop] + ':' else: emoji = "" # APIトークンを設定する slack = Slacker("xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") # Slackにメッセージを送信する slack.chat.post_message('timeline', '今日の天気は%sです%s' % (telop, emoji), as_user=True) if __name__ == "__main__": main() |
天気をタスクスケジュールで配信するPythonコードの実装例
タスクスケジュールで配信する方法には「OSのタスクスケジューラーを使用する方法」と「Pythonでタスクスケジュールを制御する方法」があります。
いずれの方法を使用する場合でもBotのAPIトークンを取得しておく必要があります。
◆APIトークンの取得手順
1.ワークスペースのAPPフォルダに移動します
https://xxxxxxxxx.slack.com/apps
2.サイドメニューの「カテゴリ」から「Bot関連を選択」します
3.「Hubot」を選択します
4.「設定の追加」ボタンをクリックします
5.名前を入力して「Hubotインテグレーションの追加」を押します
6.「API トークン」に書かれている内容をコピーします
既にSlackbotのAPIを取得している場合は併用することも可能です。
OSのタスクスケジューラーを使用する方法
多くのOSには特定の時刻になったら処理を実行する機能(以下、タスクスケジューラーと呼称)が備わっています。
今回は代表的なタスクスケジューラーであるcrontabを使用して天気を制御する方法について説明します。
ターミナルを開いて「crontab -e」と入力することで、タスクスケジューラーの設定を編集することが可能です。
設定ファイルを開いたら以下の内容を記述します。
PATH=$PATH:/Library/Frameworks/Python.framework/Versions/3.7/bin
0 11 * * * python3 /Users/user/PycharmProjects/botTest/cronweather.py
1行目と2行目は環境変数の設定です。それぞれAPIトークンとpython3のパスを指定しています。
3行目はタスクスケジュールの設定です。
「0 11 * * *」は実行する時間、「python3〜」の部分は実行するコマンドを意味します。
上記例では毎日11時丁度に天気を配信するスクリプトを実行する例です。
「0 11 * * *」の見方は後ほど説明します。
記述したら「:wq」で保存して終了します。
◆実行結果
時間になると以下の内容で表示されます。
Pythonでタスクスケジュールを制御する方法
「python-crontab」というライブラリを使用する方法です。
◆記述内容(regularly.py)
まずはライブラリをインストールします。
Pythonで以下の内容を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | from crontab import CronTab class CrontabControl: def __init__(self): self.cron = CronTab() self.job = None self.all_job = None # ファイルにジョブを書き込むメソッド def write_job(self, command, schedule, file_name): self.job = self.cron.new(command=command) self.job.setall(schedule) self.cron.write(file_name) # ファイル中のジョブを全て読み込むメソッド def read_jobs(self, file_name): self.all_job = CronTab(tabfile=file_name) # ジョブを監視するメソッド def monitor_start(self, file): # スケジュールを読み込む self.read_jobs(file) for result in self.all_job.run_scheduler(): # スケジュールになるとこの中の処理が実行される print("予定していたスケジュールを実行しました") def main(): command = 'python3 ./cronweather.py' schedule = '* * * * *' file = 'output.tab' # インスタンス作成 c = CrontabControl() # ファイルに書き込む c.write_job(command, schedule, file) # タスクスケジュールの監視を開始 c.monitor_start(file) if __name__ == "__main__": main() |
◆このクラスの使い方
●Jobを生成する
1.インスタンスを生成します。
2.コマンド、スケジュール、ファイル名を指定してwrite_job()メソッドをコールします。
※ファイル名は任意です。スケジュールの記述方法はOSのcrontabと同じです。
●スケジュールを開始する
1.タスクスケジュールを記述したファイルを指定してread_jobs()をコールします。
2.monitor_start()をコールします。
これで監視状態となり、指定した時刻になるとコマンドが実行されます。
◆実行結果
テストコードを実行した場合、時間になると以下の内容で表示されます。
◆スケジュールの見方
「0 11 * * *」の部分は「[分] [時] [日] [月] [曜日]」の並びとなっています。
アスタリスクを指定すると毎回実行します。
例1) 毎月10日の12:30に処理を実行したい場合
「30 12 10 * *」
例2) 12月20日の9:00に処理を実行したい場合
「0 9 20 12 *」
例3) 金曜日の15:00に処理を実行したい場合
「0 15 * * 5」
曜日は曜日対応した数字(0〜6)または英語の略字(sun,mon,satなど)を使用できます。
曜日に使用できる数字・英字は以下の通りです。
日曜日 | 0 | sun |
---|---|---|
月曜日 | 1 | mon |
火曜日 | 2 | tue |
水曜日 | 3 | wed |
木曜日 | 4 | thu |
金曜日 | 5 | fri |
土曜日 | 6 | sat |
以上、Pythonで天気を定期配信する方法でした。
Pythonでスケジュール管理する方法については以下の記事にまとめています。
Pythonでスケジュール管理する方法まとめ