やりたいこと
BotやプログラムからSlackに画像付きのメッセージを送りたい。
やり方としては2通り
- 通常のメッセージにimage_urlを指定する
- file.upload apiを利用して画像を送る
image_urlを指定する方法
こちら、投稿したい画像がWeb上にあることが前提の方法です。
準備
WebhookのURLを取得
まず、メッセージ送信用にWebhookの設定を行います。
WebHookの設定はAppディレクトリで着信Webフックを検索するかWebhooksの" incoming webhook integration"のリンクあたりから設定画面に行って行うことができます。
チャンネルを指定するとURLが発行されるのでこれを使います。
サンプルソース
import requests
import json
SLACK_POST_URL = #取得したURL
post_json = {
"text": "テストです",
"attachments": [{
"fields": [
{
"title": "てすと",
"value": "てすと",
}],
"image_url": "http://hogehoge/fuga.png"
}]
}
requests.post(SLACK_POST_URL, data = json.dumps(post_json))
image_urlに画像のURLを指定することで、slack上では上の図のように画像が自動的に展開されて表示されます。
attachmentsの公式リファレンスははこちら
file.uploadを利用する方法
こちらは、画像を直接slackにアップロードする方法です。
web上に置いていない場合や、画像を生成して投稿したい場合はこちらになります。
準備
Tokenを取得する
こちらを利用するためにはTokenを取得する必要があります。
トークンは色々種類がありますが、リファレンスによると"bot"か"workspace"か"user"使ってね、とあるのでどれかにします。
レガシートークンだとこの辺りの指定を考えなくて良いのですが、あんまり使わないでねとあった気がするのでやめましょう。
AppディレクトリでBotsを検索するとBotの設定画面にたどり着くのでここで新しく設定を追加してみましょう。
(この辺りの各種設定、いつもどこで設定すればいいのかわからなくなる。)
Channelを取得する
投稿先のChannelのIDを指定します。
ChannelIDの取得はどうやるのが楽なんでしょうか?
私はWeb版のSlackで該当チャンネルを開いてURLからコピペしてます。
サンプルソース
import requests
import json
import pandas as pd
import numpy as np
import matplotlib
matplotlib.use('Agg') # CUI環境でmatplotlib使いたい場合、指定する
import matplotlib.pyplot as plt
TOKEN = # 取得したトークン
CHANNEL = # チャンネルID
#####################################
# 画像を生成する例、アップロードするだけなら不要
#####################################
# データ読み込む
data = pd.read_table(
"/path/to/data/input.tsv", #なんかtsv/csv読み込むサンプル
header=-1,
names=("date","value")
)
# 軸の基準になるとこ
data.index = pd.to_datetime(data.iloc[:,0])
data.plot()
# 保存するよ
plt.savefig('figure.png')
###############
# 画像送信ここから
###############
files = {'file': open("figure.png", 'rb')}
param = {
'token':TOKEN,
'channels':CHANNEL,
'filename':"filename",
'initial_comment': "initial_comment",
'title': "title"
}
requests.post(url="https://slack.com/api/files.upload",params=param, files=files)