📦

PYTHONからSLACKメンバーにDM(OAuth)

に公開

pythonからBOTで自動でワークスペースのメンバーにDMする方法を忘備録で書きます。
2025年5月14日の情報です。PYTHONはともかくSLACKのほうの呼び方も結構更新が早そうなのでいつまでこの記事が的確かはわかりませんが💦

SLACK側設定

まずSLACK側の準備です。アプリをインストールする権限が必要です。
まず、ワークスペースの設定から、ツールと設定=>アプリを管理する に進みます。

するとブラウザで現在作成したアプリの一覧が出ます。右上のビルドに進みます

ポリシーに同意したうえで、アプリの新規作成をします。

シンプルにスクラッチから実装します。

ここ少しわかりにくいという違和感感じるかもですがアカウントに紐づく設定になるためここでまたアプリ名とどのワークスペースに紐づけるか設定します。

一応アプリはできますがここからOAuthの設定です

まず、下のほうにスクロールしてこのOAuthの権限で何をさせるか権限設定をあたえます。(あとからも変更できます)。取り急ぎ、SLACK内でユーザーのリストとDMだけ送る権限を与えます。

そして、ワークスペースにインストールします。

権限追加確認が来ますのでOKをします

OAuth トークンができますのでコピーしておきます。

これでSLACK側の設定は完了です。現在はただ、ユーザーのリスト(基本情報のみ)とDM用チャネル名のリストを確認する権限、チェネルに書き込む権限、メッセージを書き込む権限のみが付加されてます。
必要に応じてチェネルやその他の権限を追加ください。その場合上記の権限設定に追加変更などして再インストールを実行してください。

PYTHONコード側設定とテスト

まずライブラリのインストールです

pip install slack-sdk

もしくは

conda install slack-sdk

環境に合わせて適切なパッケージ操作をしてください。
あとはサンプルPYTHONを十区します。

  • ユーザリストを出す
import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# 環境変数にセットした Bot Token を取得
# このスクリプトでは users:read スコープだけが必要です
slack_token = os.environ["SLACK_BOT_TOKEN"]
client = WebClient(token=slack_token)

def list_basic_users():
    users = []
    cursor = None
    while True:
        try:
            resp = client.users_list(cursor=cursor, limit=200)
        except SlackApiError as e:
            print(f"ユーザー一覧取得に失敗: {e.response['error']}")
            break
        for member in resp["members"]:
            # Bot ユーザーや退席済みユーザーをスキップ
            if member.get("is_bot") or member.get("deleted"):
                continue
            profile = member.get("profile", {})
            display_name = profile.get("display_name") or profile.get("real_name") or member.get("name")
            users.append({
                "id": member["id"],
                "username": member.get("name"),
                "display_name": display_name
            })
        cursor = resp.get("response_metadata", {}).get("next_cursor")
        if not cursor:
            break
    return users

if __name__ == "__main__":
    for u in list_basic_users():
        print(f"{u['display_name']} ({u['username']}) — ID: {u['id']}")

これでを実行するとユーザーリストが出ます。試しに私自身のCHANNEL名にメッセージを送ります。
上記で実際に送りたいIDを探してメッセージを送ってみます。

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

# 環境変数から Bot Token を取得
slack_token = os.environ["SLACK_BOT_TOKEN"]
client = WebClient(token=slack_token)
try:
    resp = client.chat_postMessage(
        channel="YOUR CHANNEL ID(上記ユーザーリスト参照のコード実行して確認してください)",
        text="はじめてのDMだよ!"
    )
    if resp["ok"]:
        print("メッセージを送信しました: ", resp["ts"])
    else:
        print("送信に失敗しました: ", resp)
except SlackApiError as e:
    print(f"Error sending message: {e.response['error']}")

実行します。

$ python bot2.py
メッセージを送信しました:  1747255255.041539

確かにメッセージがきてました!。

Discussion