프로그램 실행 상황 Slack 알림 메시지로 보내기
많은 개발자들은 작업 자동화를 위해 Slack으로 알림 메시지를 보내고자 합니다. 특히 자동거래 프로그램에서 특정 이벤트가 발생하면 실시간으로 모바일로 전달할 수 있어서 매우 유용합니다. 이 글에서는 Python을 활용해 Slack 채널에 알림 메시지를 보내는 방법을 소개합니다.
아래 그림과 같이 윈도우 작업 스케줄러로 자동으로 실행되고하고 PC 또는 모바일로 확인할 수 있다면 멋지지 않을까요? 👍
Slackbot 생성 및 채널 설정
Slack 봇을 사용하기 위해서는 아래와 같은 준비 과정이 필요합니다.
Slack 가입 및 워크스페이스 생성
https://slack.com/ 에서 Slack에 가입하고, 새로운 워크스페이스를 생성합니다.
Bot 생성
https://api.slack.com/ 에 접속하여 새로운 봇을 생성합니다. 다음은 봇을 생성하는 순서를 캡쳐한 그림입니다.
Scope 지정과 Token 생성
"OAuth & Permissions" 메뉴에서 봇에 필요한 권한을 부여하고 OAuth 토큰을 생성합니다. Bot이 Slack 채널에 메시지를 보내기 위해서는 "chat:write"권한이 꼭 필요합니다.
여기까지 했으면 현재 페이지의 스크롤되어 안보이는 페이지 상단으로 이동해서 Bot을 워크스페이스에 설치하면 API 토큰이 생성됩니다. 이 토큰을 API Token으로 사용합니다.
Slack 프로그램에서 Bot 초대
봇이 특정 채널에 메시지를 보내기 위해서는 생성한 봇을 메시지를 수신할 Slack 채널에 초대해야 합니다. Slack 채널에서 /invite @t2_bot 같은 명령어를 입력하여 봇을 초대할 수 있습니다.
데스크탑용 Slack에서 지정한 워크스페이스로 로그인합니다.
워크스페이스에서 채널을 생성합니다. 이번 예에서는 "test"라고 하겠습니다.
이전 Bot 앱 생성 및 설치를 정상적으로 완료했다면 Slack App 좌측 하단에 생성된 앱이 보입니다.
최종적으로 앱을 채널에 초대하면 모든 준비가 완료되었습니다.
초대하는 방법은 해당 채널의 채팅창에서 "/invite @t2_bot" 이런식으로 봇 이름을 지정합니다.
Python에서 Slack으로 알림 메시지 보내기
제가 이 글을 작성하는 시점에서는 정상적으로 위 설정을 모두 마쳤는데도 slacker 패키지를 사용할때 메시지를 전송하면 인증 오류가 발생했습니다. 인터넷에서는 slacker package 사용하는 코드가 많은데 이것을 사용하면 안되고 대신에 공식 패키지인 slack_sdk를 사용하니 정상적으로 메시지가 슬팩에 전달되었습니다. 메시지 사용법이 크게 다르지 않으니 slack_sdk 공식 패키지를 사용하는게 좋을것 같습니다.
# pip install slack_sdk
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
slack_token = 'xoxb-7884496403105....'
client = WebClient(token=slack_token)
try:
response = client.chat_postMessage(channel='#test', text='hello world')
except SlackApiError as e:
print(f"Error posting message: {e.response['error']}")
참고로 slacker 사용시 오류 메시지는 다음과 같습니다.
from slacker import Slacker
slack = Slacker('xoxb-7884496403105....') # Slack Bot token
slack.chat.post_message('#auto_t2', 'hello world')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/lib/python3.10/site-packages/slacker/__init__.py", line 499, in post_message
return self.post('chat.postMessage',
File "/lib/python3.10/site-packages/slacker/__init__.py", line 124, in post
return self._request(
File "/lib/python3.10/site-packages/slacker/__init__.py", line 102, in _request
raise Error(response.error)
slacker.Error: invalid_auth