Pythonで作業効率化

Slackbotで今日の天気を確認する〜Python・Node.jsでのBot開発〜

本記事ではSlackbotで天気を表示する方法について説明します。

天気情報は気象予報サイトが提供している天気データを活用することで表示可能です。

PythonやJavaScriptを活用すれば簡単にSlackbotに組み込むことができます。

天気予報の表示手順はWebサイトのデータを利用した他の処理にも応用することができるので仕組みを理解しておきましょう。

本記事の内容は以下の通り。

・Web APIから天気を取得する方法
・Python+Slackbotで天気情報を取得する方法
・JavaScript(Node.js)+Botkitで天気情報を取得する方法

Pythonに加えてJavaScriptでの実装方法についても紹介します。

簡単な処理で実装できるので本記事を参考にしつつ作成してみてください。

Web APIから天気を取得する方法

天気情報の取得は「livedoor天気情報」が非常に便利だったのですが、サービスが終了してしまいました。

公式:■サービス終了のお知らせ

今回は、ライブドアの天気情報と似た方法で使える有志の方が作成してくれたAPIを活用します。

APIご利用の際は下記ページをよく読んだ上でご活用ください。
天気予報 API(livedoor 天気互換)

上記サイトよりJSONデータと呼ばれるデータを取得します。

https://weather.tsukumijima.net/api/forecast/city/130010

URLパラメータの「130010」には都市ごとに割り振られた番号を指定します。上記の例では東京都の番号「130010」を指定しています。

都市ごとに割り振られた番号は「全国の地点定義表 」から確認できます。

都市ごとに、

city title="〇〇" id="xxxxxxx" source="http://weather.livedoor.com/forecast/rss/area/xxxxxxx.xml"

のように定義されています。idの部分が都市ごとに割り振られた番号です。

Python+slackbotで天気情報を取得する方法

天気情報を取得するためにはURLからJSONファイルをダウンロードしてテキストデータとして変換する必要があります。

天気情報取得のコードは以下の通りです。

◆サンプルコード
miyabikno/slackbot-py

# JSONファイルを制御するためのライブラリを読み込む
import json
# URLアクセスを制御するためのライブラリを読み込む
import requests# URL情報を変数に格納する
url = "https://weather.tsukumijima.net/api/forecast/city/130010"
# URLアクセスして情報を取得する
response = requests.get(url)
# URL取得に失敗した場合の例外処理を行うメソッド
response.raise_for_status()
# 取得したjsonデータをテキストとして読み込む
weather_data = json.loads(response.text)

天気の情報は取得したJSONファイルの「'forecasts'」に格納されています。

今日の情報を取得する場合はweather_data['forecasts'][0]のデータを参照します。
weather_data['forecasts'][0]の内容は以下の通りです。

なお、weather_data['forecasts'][1]には明日の天気が格納されています。

実装方法と実行例

今回は以下のファイルを修正します。

・weather.py:天気管理用ファイル(新規ファイル)
・botmodule.py:Botモジュールの定義ファイル

PythonでのSlackbot作成の基本については「SlackbotをPythonで作成しよう」をお読みください。

・weather.py:天気を取得するモジュールを定義する
天気情報を読み込むためのモジュールを定義します。

・botmodule.pyの修正
今日の天気を返答する処理をBotに追記します。

天気情報は「weather_data['forecasts'][0]['telop']」を参照しましょう。

◆実行結果
今日の天気の表示

応答バリエーションの追加

上記は単純に天気をメッセージとして表示するだけでしたが、以下ではメッセージのバリエーションを増やす方法を紹介します。

◆メッセージに天気の絵文字を追加する
天気の絵文字を加える方法です。
辞書型の天気情報を用意しておき、それを元に絵文字に置き換えます。

@respond_to('今日の天気')
def whether_1(message):
# 絵文字リストを作る
dic_weather = {
'晴れ' : 'sunny',
'曇り' : 'cloud',
'雨' : 'rain_cloud',
'雪' : 'snow_cloud'
}
w = weather.get_weather(130010)
t = w['forecasts'][0] telop = t['telop'] # 絵文字情報を取得する
emoji = ':' + dic_weather[telop] + ':'
message.reply('今日の天気は%sです%s' % (telop, emoji))

◆実行結果
絵文字

上記の例では、4種類しか天気は定義していません。「晴れ時々曇り」などイレギュラーなものが来るとエラーとなってしまいます

定義を追加していく方法もありますが、イレギュラーなものが来ても動くようにしておきましょう。

以下、修正を加えたコードです。

◆実行結果
絵文字2

◆天気をリアクションで返す
応答する代わりに天気をリアクションとして返すことも可能です。

◆実行結果
知らない天気は以下のメッセージを返す。
天気

定義を追加します。

リアクションの天気

◆他の日の天気を表示する
当日だけではなく翌日の天気を表示することも可能です。

今日の天気

JavaScript(Node.js)+Botkitで天気情報を取得する方法

JavaScript(Node.js) + Botkitでの実装方法について説明します。
JavaScriptでのSlackbotの作成については「SlackbotをJavaScriptで作成しよう」をお読みください。

JavaScript(Node.js)で天気を表示する方法

Node.jsもrequestライブラリで天気を読み込めます。

上記処理を「controller.hears()」内に組み込めばOKです。

実装例と実行例

実装例と実行例は以下の通りです。

◆実行結果
JavaScriptの実行例

以上、Slackbotで天気情報を応答させる方法でした。

気象サイトのデータを活用する処理は他のWebデータを活用する処理にも応用ができます。
Webサイトをデータの使い方について仕組みを理解しておきましょう。

◆サンプルコード(Python)
miyabikno/slackbot-py

※リファクタリングや不具合の修正などで記事と内容が異なっている場合があります。

SlackbotまとめTOP>>Slackbotの作り方マニュアル〜Python編〜

関連記事>>SlackのRSSを活用して天気予報やブログ記事を定期購読する

こちらの記事も読まれています

  • この記事を書いた人

みやびの

住んでいるところ:神奈川県。 プログラミング歴は13年ほど。 ※プログラミングに関する無料相談・質問への回答は行っていません。

-Pythonで作業効率化
-

Copyright© みやびのどっとぴーわい , 2024 All Rights Reserved Powered by AFFINGER5.