본문 바로가기

Python

[Python] Python으로 Slack 메시지 보내기 (채널 & DM)

반응형

이 문서는 Python으로 Slack 채널과 사용자에게 DM(Direct Message)을 보내는 방법을 따라할 수 있도록 정리한 가이드입니다.


1. 사전 준비

Slack 앱 생성 및 설정

  1. Slack API 페이지 접속
  2. "Create New App" → "From scratch" 선택
  3. 앱 이름과 워크스페이스 선택 후 생성

필요한 권한 추가

Slack 앱의 OAuth & Permissions 탭에서 아래 Bot Token Scopes 추가:

  • chat:write
  • im:write
  • users:read
  • channels:read (퍼블릭 채널 메시지 전송 시 필요)
  • groups:read (비공개 채널 메시지 전송 시 필요)

권한 추가 후 앱을 워크스페이스에 재설치할 것!

토큰 준비

설치 완료 후 나오는 Bot Token(xoxb-...)을 복사해 .env 파일에 저장:

SLACK_BOT_TOKEN=xoxb-여기에_토큰_붙여넣기

2. 유저 ID 또는 채널 ID 얻기

유저 ID

  • Slack에서 유저 프로필 → 우측 상단 "···" → "사용자 ID 복사"
  • 또는 코드로 전체 유저 리스트 조회 (아래 참고)

채널 ID

from slack_sdk import WebClient
import os
from dotenv import load_dotenv

load_dotenv()
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

channels = client.conversations_list()
for ch in channels["channels"]:
    print(f'{ch["name"]}: {ch["id"]}')

3. 채널에 메시지 보내기

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

load_dotenv()
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

def send_message_to_channel(channel_id: str, text: str):
    try:
        response = client.chat_postMessage(
            channel=channel_id,  # 예: "C01ABCDEF"
            text=text
        )
        print(f"채널 메시지 전송 성공 (ts={response['ts']})")

    except SlackApiError as e:
        print(f"채널 메시지 전송 실패: {e.response['error']}")

if __name__ == "__main__":
    channel_id = "C0XXXXXXX"  # 채널 ID
    send_message_to_channel(channel_id, "안녕하세요, 채널에 전송된 메시지입니다.")

주의: 채널에 메시지를 보내려면 봇이 채널에 초대되어 있어야 합니다. /invite @봇이름 으로 초대하세요.


4. DM 보내기

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

load_dotenv()
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

def send_dm(user_id: str, text: str):
    try:
        result = client.conversations_open(users=user_id)
        dm_channel_id = result["channel"]["id"]

        response = client.chat_postMessage(
            channel=dm_channel_id,
            text=text
        )
        print(f"DM 전송 성공 (ts={response['ts']})")

    except SlackApiError as e:
        print(f"DM 전송 실패: {e.response['error']}")

if __name__ == "__main__":
    user_id = "U0XXXXXXX"  # 보낼 대상의 유저 ID
    send_dm(user_id, "안녕하세요, 이 메시지는 Python으로 보낸 DM입니다.")

5. 실행

python send_channel.py   # 채널에 메시지 전송
python send_dm.py        # DM 전송

6. 자주 발생하는 오류

오류 코드 설명

user_not_found 유저 ID가 틀렸거나 권한 부족
channel_not_found 채널 ID 오류, 또는 봇이 채널에 초대되지 않음
not_in_channel DM 채널을 열지 않음 (conversations_open 필요)

참고 사항

  • .env 파일을 꼭 프로젝트 루트에 둘 것
  • dotenv와 slack_sdk가 설치되어 있어야 함
pip install slack_sdk python-dotenv
  • 앱 권한 변경 후 항상 재설치 필요 (Install App to Workspace)

이 문서를 통해 Slack 채널 및 DM 전송 기능을 성공적으로 구현하시길 바랍니다.

샘플 통합코드

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

load_dotenv()  # .env 파일 로드
token = os.environ["SLACK_BOT_TOKEN"]
client = WebClient(token=token)

# send_to_channel.py
def send_message_to_channel(channel_name: str, text: str):
    try:
        response = client.chat_postMessage(
            channel=channel_name,   # '#general' 또는 채널 ID('C12345678')
            text=text
        )
        print(f"메시지 전송 성공: ts={response['ts']}")
    except SlackApiError as e:
        print(f"Error sending message: {e.response['error']}")

# send_dm.py
def send_dm(user_id: str, text: str):
    try:
        # 1) 유저와의 DM 채널 열기
        result = client.conversations_open(users=user_id)
        dm_channel_id = result["channel"]["id"]

        # 2) 메시지 전송
        response = client.chat_postMessage(
            channel=dm_channel_id,
            text=text
        )
        print(f"DM 전송 성공 (ts={response['ts']})")

    except SlackApiError as e:
        print(f"DM 전송 실패: {e.response['error']}")

def get_user_list():
    users = client.users_list()
    for member in users["members"]:
        if not member["is_bot"] and not member["deleted"]:
            print(f'{member["name"]}: {member["id"]}')

if __name__ == "__main__":
    send_message_to_channel("C00MP00EUBU", "안녕하세요! Python에서 보낸 메시지입니다.")
    # get_user_list()
    user_id = "U000R0HDJB0"
    send_dm(user_id, "안녕하세요, 이 메시지는 Python으로 보낸 DM입니다.")
반응형