Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

やりたいこと

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チートシート

stkdev
naviplus
ECサイト・コンテンツサイト向けのサイト内検索エンジン、レコメンドエンジン、レビュー投稿エンジンや離脱したユーザへのフォローメール配信クラウドサービス(SaaS)を提供する会社。サイトの活性化・売上拡大・運用効率化を実現する総合ソリューションを提供しています。
https://www.naviplus.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした