チャンネルメンバーから抽選するSlackBotを作成した話


該当のチャンネルに対して「@メンバー抽選」の文言を投稿することで、チャンネルにJoinしているメンバーの中からランダムに2名を抽出するBotをPythonで作成しました。

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import random

SLACK_BOT_TOKEN = "xoxb-XXXXX"
SLACK_APP_TOKEN = "xapp-XXXXX"

app = App(token=SLACK_BOT_TOKEN)

# メンバーをランダムに選ぶ関数
def get_random_members(channel_id, n):
    try:
        # メンバーリストを取得
        response = app.client.conversations_members(channel=channel_id)
        if response["ok"]:
            # メンバーIDのリストを取得
            members = response["members"]
            print(members)

            # n個のランダムなメンバーを選択
            random_member_ids = random.sample(members, n)
            names = []
            for member_id in random_member_ids:
                member_info = app.client.users_info(user=member_id)
                if member_info["ok"]:
                    print(member_info)
                    name = member_info["user"]["real_name"]
                    names.append(name)
            return names
        else:
            print("Error:", response["error"])
            return []
    except Exception as e:
        print("Error:", e)
        return []


@app.message("@メンバー抽選")
def choose_members(message, say):
    # チャンネルIDを取得
    channel_id = message["channel"]

    # チャンネルからランダムにメンバーを選ぶ(ここでは2名)
    num_members_to_select = 2
    random_members = get_random_members(channel_id, num_members_to_select)

    # 選ばれたメンバーの表示
    selected_members = ", ".join(random_members)
    message_text = f"ランダムに選ばれたメンバー: {selected_members}"

    # メッセージを返信
    say(message_text)

if __name__ == "__main__":
    SocketModeHandler(app, SLACK_APP_TOKEN).start()