LoginSignup
2
6

More than 1 year has passed since last update.

Slack APIで任意のチャンネルにメッセージを投稿する

Last updated at Posted at 2023-03-10

結論

任意のチャンネルに投稿するには chat.postMessage を使う。

公式ドキュメント

メッセージを投稿する方法は複数ある

いずれもSlack APPの作成が前提条件。

参照:https://api.slack.com/messaging/sending#sending_methods

方法 概要 検証対象
chat.postMessage Web APIchat.postMessageを使用してメッセージを投稿。
chat.postEphemeral Web APIchat.postEphemeralを使用してメッセージを投稿。特定の1人にのみ、短時間で消えるメッセージ。「あなたにだけ表示されています」というやつ。
Incoming webhooks URLを使用して特定のチャンネルにメッセージ投稿
response_url メッセージのやり取りに対する応答をポストするために使用できるコールバックURL。スラッシュコマンドとかショートカットとかの実行の応答結果を取得できるURLぽい。
Real Time Messaging API WebSocketベースのAPIで、Slackからイベント(リアクションとか)をリアルタイムで受信し、メッセージをユーザとして送信することができる。"RTM API"というやつ。
現在はEvents APIが推奨されている。「このAPIは、レイアウトブロックまたは添付ファイルをサポートしていません。 メッセージングには使用しないことをお勧めします」とのこと。
Broadcast messages within the 'Messages' tab 「アプリケーションは、ユーザからの返信を聞くことなく、[メッセージ(Messages)]タブでメッセージを送信できます。」とのこと。よく分からない。スレッド返信する時にチャンネルにも投稿する機能のこと?

通常のメッセージ投稿をしたいのでchat.postMessageIncoming webhooksを比較&実験

使用言語:Python3.9

方法 手順 任意のチャンネルへの投稿 投稿後のメッセージ削除
chat.postMessage Slack SDKのWebClientを使用します。認証にはSlack Appの Bot Token ScopesUser Token Scopes が必要。必要な権限はこれRequired scopes
Incoming webhooks Slack AppのIncoming WebhooksにあるURLでPOSTする。投稿チャンネルごとにURLが発行される

Incoming webhooks はシンプルなメッセージ投稿機能なため、複雑なことをする場合は chat.postMessageを使うのが良さそう。

サンプルコード chat.postMessage

import logging
import os
import datetime
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token=os.environ.get("SLACK_BOT_TOKEN")) # Slack Appの `Bot Token Scopes` か `User Token Scopes`
logger = logging.getLogger(__name__)

try:
    result = slackClient.chat_postMessage(
            channel="notify-makimatsun", # DMでも可
            text= f":mega: :new: *TEST*",
            attachments= [{
                "color": "#2eb886",
                "blocks": [
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": "*Title*"
                        }
                    },
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": f":spiral_calendar_pad: *Time* : `{datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}`"
                        }
                    }
                ]
            }]
        )
    logger.info(result)

except SlackApiError as e:
    logger.error(f"Error posting message: {e}")

サンプルコード Incoming webhooks

import logging
import os
import datetime
import json
import urllib.request
import urllib.parse

logger = logging.getLogger(__name__)

try:
    data = {
        "text": f":mega: :new: *TEST*",
        "attachments": [{
                "color": "#2eb886",
                "blocks": [
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": "*Title*"
                        }
                    },
                    {
                        "type": "section",
                        "text": {
                            "type": "mrkdwn",
                            "text": f":spiral_calendar_pad: *Time* : `{datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}`"
                        }
                    }
                ]
            }]
    }
    headers = {
        'Content-Type': 'application/json',
    }
    request = urllib.request.Request(
        'https://hooks.slack.com/services/xxxxx/xxxxx/xxxxx', # Slack Appの`Incoming Webhooks`にあるURL
        json.dumps(data).encode(),
        headers
    )
    with urllib.request.urlopen(request) as res:
        print(res)
        body = res.read()
        print(body.decode('utf-8'))

except Exception as e:
    logger.error(f"Error posting message: {e}")

投稿結果

どちらもこのように投稿されました。

Screen Shot 2023-03-10 at 19.53.08.png

ざっくり解説
Screen Shot 2023-03-10 at 19.48.18.png

投稿レイアウトについて

レイアウトの作成にはBlock Kit Builderを使用しました。
リッチなメッセージレイアウトを作成できます。

まとめ

Incoming webhooksではチャンネルを指定しての投稿ができたようですが、リニューアル後はできなくなりました。
また、いずれの方法でも、あらかじめ投稿先のチャンネルへアプリを追加する必要があります。
私自身はチャンネルを指定して投稿したい場面が多いので、Web APIを活用していきたいと思います。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6