Python
Slack

プログラムからSlackに画像投稿する方法まとめ

やりたいこと

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)

参考

pythonでslackに画像をアップロードする方法
Slack API attachmentsチートシート