PythonスクリプトとSlackをつなげます. 長時間かかる処理をSlackで監視することができるようになります.
機械学習の学習進捗確認や, サーバの状態確認に使用できそう.
最初にSlack Botのアカウントを作成する必要があります.
以下のwebサイトを参考に, Botアカウントの作成とAPIトークンの取得を行ってください.
- Pythonを使ったSlackBotの作成方法(https://qiita.com/kunitaya/items/690028e33ba5c666f3e2)
- API トークンの生成と再生成(https://get.slack.help/hc/ja/articles/215770388-API-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%94%9F%E6%88%90%E3%81%A8%E5%86%8D%E7%94%9F%E6%88%90)
APIトークンを取得できたら, 環境変数にAPIトークンを設定してください.
環境変数名は BOT_KEY
としてください.
Linux, MAC:
export BOT_KEY=set_your_api_tokenxxxxxxxxxxxxxxxxxxxxxxxxxx
Windows:
http://www.k-cube.co.jp/wakaba/server/environ.html
- githubから, このレポジトリをダウンロード
git clone https://github.com/swy5/MonitorBot.git
- レポジトリ内へ移動
cd MonitorBot
- インストール
pip install -e .
環境変数BOT_KEYが適切に設定されていれば, 以下のコードで Botを使用する準備ができます.
from monitor_bot.bot import MonitorBot
bot = MonitorBot()
メッセージを送るには以下の関数を使います.
MonitorBot.send_message(channel, message, attachments=None)
- channel(string): メッセージを送る先となるchannelです.
- message(string): メッセージ.
- attachments(json): メッセージの色を変えるなど, 付加情報をつけられます. データ構造などの詳しい情報はSlackClientのWebページを参考にしてください.
from monitor_bot.bot import MonitorBot
bot = MonitorBot()
bot.send_message(`@someone`, 'Hello')
画像を送る関数は2種類あります.
以下の関数はMatplotlibで作成したグラフをSlackに送り, 表示します.
MonitorBot.upload_pyplot(channel, pyplot_obj)
- channel(string): メッセージを送る先となるchannelです.
- pyplot_obj(matplot module): upload_pyplot関数内で
pyplot_obj.savefig()
を呼んでいるので, savefig関数を持つmatplotlibのオブジェクトを渡してください.
import matplotlib.pyplot as plt
from monitor_bot.bot import MonitorBot
bot = MonitorBot()
plt.plot([1, 3, 2])
bot.upload_pyplot("@someone", plt)
以下の関数はPillowモジュールのImageオブジェクトをSlackに送り, 表示します.
MonitorBot.upload_pillow(channel, pillow_img_obj)
- channel(string): メッセージを送る先となるchannelです.
- pillow_img_obj(pillow image bject): Pillowモジューつが提供しているImageオブジェクト.
from PIL import Image
from monitor_bot.bot import MonitorBot
bot = MonitorBot()
img = Image.fromarray(np.random.randint(0, 255, size=(128, 128, 3)).astype(np.uint8))
bot.upload_pillow("@someone", img)
SlackからBot宛に送られたメッセージに対する処理を定義するデコレータを使うことができます. デコレートされた関数は, メインスレッドとは非同期に実行されます. そのため, メインの処理を 妨げることなく, メッセージに対する処理を実行できます.
MonitorBot.response_to(pattern)
- pattern(string): どのようなメッセージに対して反応するかを定義する文字列. 正規表現が使用可能.
以下のコード例では, Botに対してHelloという文字を含むメッセージが送られた時に,
関数func
を呼び出すよう定義しています. 関数funcではsend_message関数を使って, Holaという
メッセージを送り返しています.
from monitor_bot.bot import MonitorBot
bot = MonitorBot()
@bot.response_to("Hello")
def func(message):
# Checking from which channel the message came.
ch = message['channel']
bot.send_message(ch, "Hola")
MonitorBotを短い時間に何度もインスタンス化すると, Slackへのリクエストが拒否されることがあります.