モチベ
やりたいこと
定期的にDBのデータをグラフ化してslackに投げたい。
なぜこの方法か
- redashの定額プランを払うほど使わない。
- lambdaやcloud functionsを使って費用を節約するつもりだが、ローカルに一時保存ができなさそう。
本題
概要
ざっくりいうと
- pyplotのグラフを
io.BytesIO()
を用いてメモリ上へ一時保存する。 - そのバイト列をslack api のリクエストに入れる。
- slackに投稿される。
サンプルコード
sample.py
import matplotlib.pyplot as plt
import numpy as np
import seaborn; seaborn.set() # for plot style
import io
import requests
# 適当なグラフを作成
rand = np.random.RandomState(42)
mean = [0, 0]
cov = [[1, 2], [2, 5]]
X = rand.multivariate_normal(mean, cov, 100)
fig = plt.figure()
plt.scatter(X[:, 0], X[:, -1])
# io を用いてメモリ上に保存
format = "png"
sio = io.BytesIO()
plt.savefig(sio, format=format)
# グラフの出力をしない
plt.close(fig)
# slackのアクセストークン
accessToken ='<YOUR_SLACK_ACCESS_TOKEN>'
channel_id = '<YOUR_SLACK_CHANNEL_ID>'
# ファイルに直接バイトを入れる
files = {'file': sio.getvalue()}
param = {'token': accessToken, 'channels': channel_id}
res = requests.post(url="https://slack.com/api/files.upload",params=param, files=files)
print(res.content)
参考サイト
- pyplot => io.BytesIO
- file => slack
- io
- [16.2. io — ストリームを扱うコアツール — Python 3.6.5 ドキュメント](https://docs.python.jp/3/library/io.html 16.2. io)