2024年4月5日金曜日

Python で Slack API をコールする

Python で Slack API をコールする

概要

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 件のコメント:

コメントを投稿