반응형
이 문서는 Python으로 Slack 채널과 사용자에게 DM(Direct Message)을 보내는 방법을 따라할 수 있도록 정리한 가이드입니다.
1. 사전 준비
Slack 앱 생성 및 설정
- Slack API 페이지 접속
- "Create New App" → "From scratch" 선택
- 앱 이름과 워크스페이스 선택 후 생성
필요한 권한 추가
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
- Slack 웹 URL에서 확인: https://app.slack.com/client/TXXXXXX/CXXXXXXX → 마지막 부분이 채널 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입니다.")
반응형
'Python' 카테고리의 다른 글
[Python] .style.yapf YAPF (feat. Python formatter) (0) | 2025.04.16 |
---|---|
[Python] logging.handlers - TimedRotatingFileHandler (0) | 2025.04.09 |
[Python] 데크 deque 대해 아십니까? (feat. 자료구조) (0) | 2025.02.28 |
[Python] Meta classes 메타 클레스 란? (펌 / 링크) (0) | 2024.11.22 |
[python] vscode 들여쓰기 (0) | 2024.07.09 |