KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

Pythonスクリプトの成否をSlackで通知する

これまでPythonで作成したスクリプトにロガーを仕込んでいましたが、毎回sshでサーバに接続して確認するのが億劫だったのでログと同時にSlack通知するようにしました。

事前準備

PythonでSlack通知をするためにはSlackにワークスペースを作成してwebhookの設定をしてあげる必要があります。今回は既にワークスペース作成済みの前提でwebhookの設定から行います。

https://my.slack.com/services/new/incoming-webhook/

Slackのワークスペースにサインインしている状態で上記URLからアクセスするとSlackのwebhook設定画面に入れます。

f:id:masayuki_kato:20190128231646p:plain
slack webhookの設定画面

画面右上にワークスペースの選択ができるドロップダウンリストがあるのでSlack通知を行いたいワークスペースであることを確認する。

f:id:masayuki_kato:20190128232130p:plain
ワークスペースの選択もできる

次に「Post to channel」の項目からSlack通知するチャンネルを選択する。今回は事前に「log」というチャンネルを作成しておいた。

f:id:masayuki_kato:20190128232508p:plain
Slack通知するチャンネルの選択

チャンネルを選択すると「Add Incoming WebHooks integration」のボタンが有効化されるのでクリックする。

すると「Setup Instructions」画面が表示されるので、設定は変えずに「Webhook URL」をコピーしてエディタか何かにメモしておく。

f:id:masayuki_kato:20190128233451p:plain
Webhook URL

画面を下までスクロールすると「Save Settings」ボタンがあるのでクリックするとSlack Webhookの準備が完了する。

f:id:masayuki_kato:20190128234054p:plain

Slack通知をスクリプトに仕込む

実際にPythonスクリプトでSlack通知を行います。

PythonでSlack通知を行う便利なライブラリがあるのでスクリプトを実行するサーバーにインストールします。

$ sudo pip install slackweb

私がインストールした時点での「slackweb」のバージョンは1.0.5でした。

下記スクリプトがKABU+から「日本株全銘柄」CSVファイルを日次で取得するスクリプトです(ロガー部分は除く)。

#coding:utf-8

import requests
import csv
import datetime
import sys
import slackweb


KABU_PLUS_ID = "【KABU+のID】"
KABU_PLUS_PW = "【KABU+のパスワード】"
BASE_DIR = '/usr/local/script/'  # スクリプトの格納ディレクトリ
DOWNLOAD_SAVE_DIR = BASE_DIR + "../data/japan_all_stock_prices/"  # スクリプト格納ディレクトリと同じ階層に各種CSVファイルを格納するディレクトリがある想定

def retrieve_csv_file(url):
    res = requests.get(url, auth=(KABU_PLUS_ID, KABU_PLUS_PW))
    if res.status_code != 200:
        slack.notify(text="日本株全銘柄取得処理:異常終了")
        sys.exit(1)
    data = res.content.decode('shift-jis')
    return data

def to_csv(data, file=None):
    if file:
        with open(file, 'w', encoding='utf-8') as f:
            writer = csv.writer(f)
            reader = csv.reader(data.splitlines())
            for row in reader:
                writer.writerow(row)


if __name__ == '__main__':
    # Slack Incoming webhook設定
    slack_log_url = "【Slack Webhook URL】"
    slack = slackweb.Slack(url=slack_log_url)

    dt = datetime.date.today().strftime("%Y%m%d")
    file_name = 'japan-all-stock-prices_' + dt + '.csv'
    URL = 'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/' + file_name
    data = retrieve_csv_file(URL)
    to_csv(data, DOWNLOAD_SAVE_DIR + file_name)
    slack.notify(text="日本株全銘柄取得処理:正常終了")
    sys.exit(0)

f:id:masayuki_kato:20190128235709p:plain
Slackの通知が行われる

この画面はPCのウェブブラウザの画面ですが、アプリを入れればスマートフォンからも通知の確認ができます。