・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)アプリを追加するをクリックするワン

チワちゃん
アプリを管理する画面で、検索窓から追加したいAPI名称(例としてchiwa-chanとしている)を検索して「追加」をクリックするワン。

チワちゃん
これでslack上でのbotの設定は完了ワン

厚生省のコロナ感染者情報をpythonで取得してグラフ化する

チワちゃん
botを使ってグラフ投稿をするには設定したAPIトークンが必要なので、その情報をコピーしてから、config.jsonファイルとして設定するワン。
コードにAPIキーをベタ書するのは危険なので、直接解らないようにしておくのが吉ですワン
# apiキー読み込み用のJSONを用意
{
    "slack_api_token":"{ ここにbotのAPIトークンを貼り付けて保存する }"
}  

チワちゃん
config.jsonをGoogle colabにアップロード(ドラッグ&ドロップ)するワン

チワちゃん
Pythonのコードは以下になるワン
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上の指定チャンネルに投稿されるワン。

チワちゃん
あとはこのコードをサーバに設置してcronで動かすか、Google cloud functions や AWS Lambdaなどで毎日定期実行の設定をすれば、特定のslackチャンネルに毎日自動でグラフ投稿することが可能ワン!

※無料枠で使えないものもあるので、その辺りは色々調べて試してみてワン!
おすすめの記事