・slackにBotsアプリを追加してAPIトークンを取得する
・厚生省のコロナ感染者情報をpythonで取得してグラフ化する
slackにBotsアプリを追加してAPIトークンを取得する
チワちゃん
ここにアクセスして検索窓に「Bots」と入力して、「Bots」を選択して「slackに追加」をするワン
チワちゃん
次にBotのユーザー名(slack投稿時のuser名になる)を記入して、「ボットインテグレーションを追加する」を選択するワン
チワちゃん
インテグレーションの設定にbotのAPIトークンが自動生成されるので、画面の下の方に移動して、「アイコンのカスタマイズ」で、好きな画像(slack投稿時のアイコンになる)をアップロードして、「インテグレーションの保存」をクリックしてワン
チワちゃん
次にslack上でグラフを投稿したチャンネルにbotを追加するワン
チワちゃん
slackを起動して、以下のようにするワン
1)グラフを投稿したいチャンネル(上記ではdog_botとしている)をクリックするワン
2)右上にあるチャンネルの設定をクリックするワン
3)インテグレーションをクリックするワン
4)アプリを追加するをクリックするワン
1)グラフを投稿したいチャンネル(上記ではdog_botとしている)をクリックするワン
2)右上にあるチャンネルの設定をクリックするワン
3)インテグレーションをクリックするワン
4)アプリを追加するをクリックするワン
チワちゃん
アプリを管理する画面で、検索窓から追加したいAPI名称(例としてchiwa-chanとしている)を検索して「追加」をクリックするワン。
チワちゃん
これでslack上でのbotの設定は完了ワン
厚生省のコロナ感染者情報をpythonで取得してグラフ化する
チワちゃん
botを使ってグラフ投稿をするには設定したAPIトークンが必要なので、その情報をコピーしてから、config.jsonファイルとして設定するワン。
コードにAPIキーをベタ書するのは危険なので、直接解らないようにしておくのが吉ですワン
コードにAPIキーをベタ書するのは危険なので、直接解らないようにしておくのが吉ですワン
# apiキー読み込み用のJSONを用意 { "slack_api_token":"{ ここにbotのAPIトークンを貼り付けて保存する }" }
チワちゃん
config.jsonをGoogle colabにアップロード(ドラッグ&ドロップ)するワン
チワちゃん
Pythonのコードは以下になるワン
Google Colab上で動くようにしてるワン。
ローカル環境などで実行する場合は、事前にpip installしてライブラリをインストールする必要があるワン。
Google Colab上で動くようにしてるワン。
ローカル環境などで実行する場合は、事前にpip installしてライブラリをインストールする必要があるワン。
# colabに入ってないモジュールをインストールする !pip install japanize_matplotlib !sudo pip install slackweb import requests # slackへのpost用 import json import pandas as pd import matplotlib.pyplot as plt from pylab import rcParams plt.style.use('ggplot') import japanize_matplotlib import seaborn as sns sns.set(font="IPAexGothic") %matplotlib inline ## 取得するオープンデータのURLを指定する url = 'https://covid19.mhlw.go.jp/public/opendata/newly_confirmed_cases_daily.csv' ## slack投稿用のトークンを読み込んでおく with open('config.json') as f: parm = json.load(f) TOKEN = parm["slack_api_token"] CHANNEL = '#dog_bot' #------------------------------------------------------------------------ # 描画用に外部のオープンデータを取得(URL指定する) #------------------------------------------------------------------------ def get_data(): # オープンデータを取得 df = pd.read_csv(url,encoding="utf-8") # 取得したデータから描画に必要な項目のみを抽出する df = df[['Date', 'ALL', 'Tokyo', 'Kanagawa', 'Saitama', 'Chiba']] return df #------------------------------------------------------------------------ # slackに作成した画像とメッセージを編集して投稿する処理 #------------------------------------------------------------------------ def slack_send(df_japan): ## 前日のデータを取得 yesterday_uu = df_japan[-1:].iloc[0]['ALL'] ## 直近1週間のデータを取得し移動平均を算出 one_week_uu = df_japan[-7:].iloc[0:7]['ALL'] one_week_moving_average_uu = round(one_week_uu.rolling(window=7).mean().iloc[6]) ## 前日と1週間分の移動平均の比率を算出 rate = (yesterday_uu / one_week_moving_average_uu).round(2) ## 前日の感染者数が100名以上の時にはその改善状況によってメッセージを変化させる if yesterday_uu >= 100: ## 改善状態によってメッセージを変化させる if rate >= 1.0: chihua_talk = 'また悪化してきてるので注意ワン。お出かけは最小限にしようワン。' elif 0.8 <= rate < 1.0: chihua_talk = 'ちょっと改善の兆しですワン。でもまだ油断は禁物ですワン' elif 0.5 <= rate < 0.8: chihua_talk = 'かなり改善してきてそうワン。でも外から帰ったら、うがい手洗いは忘れずにワン' else: chihua_talk = 'いい感じですワン!これならそろそろ美味しいスイーツ食べ放題にも行けそうですワン!' else: chihua_talk = '感染者数、少なめだけど油断は禁物ワン!' TEXT = f"前日の感染者数は「{yesterday_uu}人」でしたワン。1週間分の平均が「{one_week_moving_average_uu}人」なので、比較すると「{(rate * 100).round(2)}%」になったワン! \n {chihua_talk}" # main処理内で作成したPNGを読み込む files = {'file': open("covid_graph.png", 'rb')} param = { 'token': TOKEN, 'channels': CHANNEL, 'filename': "covid_graph", 'initial_comment': TEXT, 'title': "チワちゃんのコロナ感染者状況レポート" } # requestsでメッセージと画像をslackへ投稿 requests.post(url="https://slack.com/api/files.upload",params=param, files=files) return files, param def main(): #-- 描画用に外部のオープンデータを取得(URL指定する) df_japan = get_data() #-- グラフ用のデータを準備 # 描画前設定 rcParams['figure.figsize'] = 15,10 #描画の際のサイズを指定 plt.tight_layout() # 画像の文字の位置などが重ならないように自動調整 # 描画 df_japan.plot(x = "Date") plt.title('COVID 日本国内日別感染者数の推移', fontsize=36) plt.ylabel('感染者数', fontsize=24) plt.xlabel('日付', fontsize=24) plt.legend(fontsize=36) plt.tick_params(labelsize=18) # 画像を保存(slack連携用に一旦保存必要) plt.savefig('covid_graph.png') # 画像表示 plt.show() # slackに作成した画像を投稿する処理 send_items = slack_send(df_japan) # 利用したパラメータをreturnしておく(確認保存用) return df_japan, send_items if __name__ == '__main__': main()
チワちゃん
config.jsonをGoogle colabのフォルダにアップロードしてから、上記のコードを実行するワン
エラーなどが出なければ、以下のグラフがslack上の指定チャンネルに投稿されるワン。
エラーなどが出なければ、以下のグラフがslack上の指定チャンネルに投稿されるワン。
チワちゃん
あとはこのコードをサーバに設置してcronで動かすか、Google cloud functions や AWS Lambdaなどで毎日定期実行の設定をすれば、特定のslackチャンネルに毎日自動でグラフ投稿することが可能ワン!
※無料枠で使えないものもあるので、その辺りは色々調べて試してみてワン!
※無料枠で使えないものもあるので、その辺りは色々調べて試してみてワン!