국내주식자동거래개발

프로그램 실행 상황 Slack 알림 메시지로 보내기

알토란7 2024. 10. 13. 17:21

많은 개발자들은 작업 자동화를 위해 Slack으로 알림 메시지를 보내고자 합니다. 특히 자동거래 프로그램에서 특정 이벤트가 발생하면 실시간으로 모바일로 전달할 수 있어서 매우 유용합니다. 이 글에서는 Python을 활용해 Slack 채널에 알림 메시지를 보내는 방법을 소개합니다.

아래 그림과 같이 윈도우 작업 스케줄러로 자동으로 실행되고하고 PC 또는 모바일로 확인할 수 있다면 멋지지 않을까요? 👍

Slackbot 생성 및 채널 설정

Slack 봇을 사용하기 위해서는 아래와 같은 준비 과정이 필요합니다.

Slack 가입 및 워크스페이스 생성

https://slack.com/ 에서 Slack에 가입하고, 새로운 워크스페이스를 생성합니다.

Bot 생성

https://api.slack.com/ 에 접속하여 새로운 봇을 생성합니다. 다음은 봇을 생성하는 순서를 캡쳐한 그림입니다.

"Create New App" 클릭
"From scratch" 선택
App Name과 workspace 선택후 "Create App" 선택

Scope 지정과 Token 생성

"OAuth & Permissions" 메뉴에서 봇에 필요한 권한을 부여하고 OAuth 토큰을 생성합니다. Bot이 Slack 채널에 메시지를 보내기 위해서는 "chat:write"권한이 꼭 필요합니다.

생성된 Bot의 "OAuth & Permissions" 선택
"Add an OAuth Scope" 버튼 클릭해서 "channels:history"과 "chat:write" 권한 추가

여기까지 했으면 현재 페이지의 스크롤되어 안보이는 페이지 상단으로 이동해서 Bot을 워크스페이스에 설치하면 API 토큰이 생성됩니다. 이 토큰을 API Token으로 사용합니다.

API 사용시 사용하는 토큰값 복사해서 사용


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