Python으로 슬랙봇 만들기
Python과 Slack API를 이용하면 슬랙의 특정 채널에 자동으로 글을 올리는 Bot을 만들 수 있습니다. 먼저, Slack API 페이지에서 App을 생성하고, App 관련 권한 설정 작업을 진행합니다. App 생성 및 권한 설정이 완료된 후에 Slack에 해당 App을 설치하고, 글을 등록할 채널에 생성한 App의 Bot 계정을 초대합니다. 이후 Python으로 Slack API를 호출하여 글을 등록할 수 있습니다. 특정 주기 마다 자동으로 글을 올리고자 할 경우에는 Python Schedule 모듈을 활용하면 됩니다.
Slack API 앱 만들기
Slack API - Your Apps에 접속하여 Create An App
을 클릭합니다.
From scratch를 클릭합니다.
앱 이름을 작성하고, 슬랙 작업 환경을 선택한 후에 Create App
을 클릭합니다.
Bots
를 클릭합니다.
앱 관련 권한(Scope) 설정하기
Review Scopes to Add
를 클릭합니다.
Install App to Workspace
는 생성한 앱을 슬랙 작업 환경에 설치하도록 하는 버튼입니다. 현재 버튼이 비활성화되어 있는데, 권한(Scope) 설정을 마친 후에 활성화됩니다.
스크롤을 내리면 Scopes
를 설정하는 부분이 나타납니다. Bot Token Scopes
부분에 있는 Add an OAuth Scope
버튼을 클릭하여 관련 권한을 설정하면 됩니다. 참고로 Slack API Methods에 가면 여러 슬랙 API 메소드를 확인할 수 있습니다. 이 중에서 conversations.list
, conversations.history
그리고 chat.postMessage
세 가지 메소드를 사용하도록 하겠습니다. 순서대로 슬랙 채널 목록 조회, 채널 내 글 이력 조회, 메시지 등록하는 메소드를 의미합니다. 각 메소드 별로 기능을 사용하기 위해 필요한 권한이 정의되어 있습니다.
메소드 명 | 기능 | 필요 권한(Scopes) |
---|---|---|
conversations.list | 채널 목록 조회 | channels:read, groups:read, im:read, mpim:read |
conversations.history | 채널 내 글 이력 조회 | channels:history, groups:history, im:history, mpim:history |
chat.postMessage | 메시지 등록 | chat:write |
Add an OAuth Scope
버튼을 클릭하여 위 메소드들을 이용하기 위해 필요한 Scope들을 모두 등록합니다.
Slack에 앱 설치하기
Install App to Workspace
를 클릭합니다.
Allow
를 클릭합니다.
Token 문자열을 복사해둡니다. Python으로 Slack API 호출 시 해당 Token 정보가 필요합니다.
bot 앱을 채널에 추가하기
슬랙 워크스페이스의 좌측 앱에서 bot을 누르고 채널 상단의 bot을 클릭합니다. 팝업이 뜨면 ‘이 앱을 채널에 추가’를 눌러 ‘test’ 채널을 추가해줍니다.
슬랙 봇 테스트
라는 문구를 채널에 등록합니다. Python으로 Slack API를 호출하여 test 채널과 이 채널에 등록된 슬랙 봇 테스트
문구를 찾아 댓글을 달아보도록 하겠습니다.
Python으로 Slack API 호출하기
Slack Python SDK 설치하기
터미널에서 아래 명령어를 실행하여 Slack Python SDK를 설치합니다.
pip install slack_sdk
Slack Bot Class 만들기
Slack API를 사용하기 편리하도록 간단한 클래스를 하나 만들어줍니다.
from slack_sdk import WebClient
class SlackAPI:
"""
슬랙 API 핸들러
"""
def __init__(self, token):
# 슬랙 클라이언트 인스턴스 생성
self.client = WebClient(token)
def get_channel_id(self, channel_name):
"""
슬랙 채널ID 조회
"""
# conversations_list() 메서드 호출
result = self.client.conversations_list()
# 채널 정보 딕셔너리 리스트
channels = result.data['channels']
# 채널 명이 'test'인 채널 딕셔너리 쿼리
channel = list(filter(lambda c: c["name"] == channel_name, channels))[0]
# 채널ID 파싱
channel_id = channel["id"]
return channel_id
def get_message_ts(self, channel_id, query):
"""
슬랙 채널 내 메세지 조회
"""
# conversations_history() 메서드 호출
result = self.client.conversations_history(channel=channel_id)
# 채널 내 메세지 정보 딕셔너리 리스트
messages = result.data['messages']
# 채널 내 메세지가 query와 일치하는 메세지 딕셔너리 쿼리
message = list(filter(lambda m: m["text"]==query, messages))[0]
# 해당 메세지ts 파싱
message_ts = message["ts"]
return message_ts
def post_thread_message(self, channel_id, message_ts, text):
"""
슬랙 채널 내 메세지의 Thread에 댓글 달기
"""
# chat_postMessage() 메서드 호출
result = self.client.chat_postMessage(
channel=channel_id,
text = text,
thread_ts = message_ts
)
return result
슬랙 API 세션 만들기
위에서 발급받은 OAuth Token값을 아래 token 변수에 할당하여 슬랙 API 세션을 만들어줍니다.
token = "<<Slack API Token>>"
slack = SlackAPI(token)
특정 채널 내 메세지에 댓글 달기
‘test’ 채널에 등록한 ‘슬랙 봇 테스트’라는 메세지의 Thread에 ‘자동 생성 문구 테스트’라는 댓글을 달아봅니다. 채널 ID나 메세지 ts 값은 채널이나 메세지를 식별할 수 있는 값이라고 생각해도 됩니다.
channel_name = "test"
query = "슬랙 봇 테스트"
text = "자동 생성 문구 테스트"
# 채널ID 파싱
channel_id = slack.get_channel_id(channel_name)
# 메세지ts 파싱
message_ts = slack.get_message_ts(channel_id, query)
# 댓글 달기
slack.post_thread_message(channel_id, message_ts, text)
스레드에 bot이 문구를 등록한 것을 확인할 수 있습니다.
자동으로 글 등록하기
schedule 모듈을 활용해 스케줄을 등록하면 자동으로 슬랙에 댓글을 등록할 수 있다.
댓글남기기