概要
python-slack-sdkを使ってチャネルにメッセージをポストする方法を紹介します
環境
- macOS 11.7.10
- Python 3.11.6
- slack_sdk 3.27.1
- Slack 2024/04/05 時点の画面
Slack アプリの作成
https://api.slack.com/tutorials/tracks/getting-a-token このあたりから作成すると良いです
アプリをワークスペースにも追加しましょう
Bot トークン
Slack にはトークンの種類がいくつかあり今回は Bot トークンを使います
アプリの左メニューから「Install App」を選択し「Bot User OAuth Token」を使います
URL で言うと https://api.slack.com/apps/xxxxxxx/install-on-team? という形式になります
インストール
- pipenv install slack_sdk
サンプルコード
先ほど取得した Bot トークンを使用します
サンプルコードは指定したチャネルにメッセージをポストするサンプルで Github にあるサンプルスクリプトをそのまま利用します
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient(token="xoxb-xxxxxxxxxxxxxxxxx")
try:
response = client.chat_postMessage(channel='#private', text="Hello world!")
assert response["message"]["text"] == "Hello world!"
except SlackApiError as e:
# You will get a SlackApiError if "ok" is False
assert e.response["ok"] is False
assert e.response["error"] # str like 'invalid_auth', 'channel_not_found'
print(f"Got an error: {e.response['error']}")
# Also receive a corresponding status_code
assert isinstance(e.response.status_code, int)
print(f"Received a response status_code: {e.response.status_code}")
チャネルの内容を取得する
ついでにチャネルに流れるメッセージを取得するスクリプトも動かしてみました
トークンは先ほど取得した Bot トークンを使用します
直近100件のメッセージを取得します
ちなみに RTM API は非推奨になっています (参考)
なので今回は conversations.history を使っています
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
client = WebClient(token="xoxb-xxxxxxxxxxxxxxxxx")
conversation_history = []
channel_id = "C0123456789"
try:
result = client.conversations_history(channel=channel_id)
conversation_history = result["messages"]
print("{} messages found in {}".format(len(conversation_history), channel_id))
for msg in conversation_history:
print(msg["text"])
except SlackApiError as e:
print("Error creating conversation: {}".format(e))
channel_id はアプリでチャネル名を右クリックし Copy link で取得できます
またボットがチャネルに参加していないと会話は取得できないのでボットを招待してあげましょう (すでにメッセージを送信しているとチャネルに参加しているように見えますがまだいないのでちゃんと /invite してあげましょう)
最後に
Python で Slack のAPI をコールする方法を紹介しました
Slack には 3 つのトークン (User トークン、Bot トークン、アプリレベルトークン) があり今回のようにスクリプトベースの場合には Bot トークンを使います
RTM API が非推奨になり Socket API を変わりに使うようになったようなので機会があれば試してみたいです
0 件のコメント:
コメントを投稿