・slackにBotsアプリを追加してAPIトークンを取得する
・厚生省のコロナ感染者情報をpythonで取得してグラフ化する
slackにBotsアプリを追加してAPIトークンを取得する
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
ここにアクセスして検索窓に「Bots」と入力して、「Bots」を選択して「slackに追加」をするワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/efac1e656884254b8bed7455a52bd66b-600x249.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/75604e6306404c0e06b24e0c83e6ddb6-1-600x282.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
次にBotのユーザー名(slack投稿時のuser名になる)を記入して、「ボットインテグレーションを追加する」を選択するワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/63f49e00043f10083c60e7a00d7286d7-1-600x428.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
インテグレーションの設定にbotのAPIトークンが自動生成されるので、画面の下の方に移動して、「アイコンのカスタマイズ」で、好きな画像(slack投稿時のアイコンになる)をアップロードして、「インテグレーションの保存」をクリックしてワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/912129bc118c6184795eab24a5d49156-600x418.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/f7f26f85e2bb21e2041676b14e8897f3-600x413.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/30870ce898c25304632b9c2060d680a9-600x518.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/ded6fd8a810efaf9f5959e9ad14a1122.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/2f1b69570a916f3e4c5728933f889c22-600x427.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
次にslack上でグラフを投稿したチャンネルにbotを追加するワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
slackを起動して、以下のようにするワン
1)グラフを投稿したいチャンネル(上記ではdog_botとしている)をクリックするワン
2)右上にあるチャンネルの設定をクリックするワン
3)インテグレーションをクリックするワン
4)アプリを追加するをクリックするワン
1)グラフを投稿したいチャンネル(上記ではdog_botとしている)をクリックするワン
2)右上にあるチャンネルの設定をクリックするワン
3)インテグレーションをクリックするワン
4)アプリを追加するをクリックするワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/d82610f40ad92624be1a4e58eb3b8804-1-600x353.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
アプリを管理する画面で、検索窓から追加したいAPI名称(例としてchiwa-chanとしている)を検索して「追加」をクリックするワン。
![](https://apl-py.com/blog/wp-content/uploads/2022/01/90e91ff3955224f4ec7cdc9a03ccdc75-600x283.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/941c8f4bdcee3b59f06c9196e5eb8ce7-600x438.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
これでslack上でのbotの設定は完了ワン
厚生省のコロナ感染者情報をpythonで取得してグラフ化する
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
botを使ってグラフ投稿をするには設定したAPIトークンが必要なので、その情報をコピーしてから、config.jsonファイルとして設定するワン。
コードにAPIキーをベタ書するのは危険なので、直接解らないようにしておくのが吉ですワン
コードにAPIキーをベタ書するのは危険なので、直接解らないようにしておくのが吉ですワン
# apiキー読み込み用のJSONを用意 { "slack_api_token":"{ ここにbotのAPIトークンを貼り付けて保存する }" }
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
config.jsonをGoogle colabにアップロード(ドラッグ&ドロップ)するワン
![](https://apl-py.com/blog/wp-content/uploads/2022/01/73cf1cc0dca10f7836184f7297ca4679-600x305.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/44900eaea954bd9b797d9ccba03be56f-2.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
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()
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
config.jsonをGoogle colabのフォルダにアップロードしてから、上記のコードを実行するワン
エラーなどが出なければ、以下のグラフがslack上の指定チャンネルに投稿されるワン。
エラーなどが出なければ、以下のグラフがslack上の指定チャンネルに投稿されるワン。
![](https://apl-py.com/blog/wp-content/uploads/2022/01/f350629ddce6e0e50d0d2224f347f17c-600x325.png)
![](https://apl-py.com/blog/wp-content/uploads/2022/01/aef2eb6b8e01d99257ea81fd69fc6ecb.png)
チワちゃん
あとはこのコードをサーバに設置してcronで動かすか、Google cloud functions や AWS Lambdaなどで毎日定期実行の設定をすれば、特定のslackチャンネルに毎日自動でグラフ投稿することが可能ワン!
※無料枠で使えないものもあるので、その辺りは色々調べて試してみてワン!
※無料枠で使えないものもあるので、その辺りは色々調べて試してみてワン!