Python으로 슬랙봇 만들기

Python과 Slack API를 이용하면 슬랙의 특정 채널에 자동으로 글을 올리는 Bot을 만들 수 있습니다. 먼저, Slack API 페이지에서 App을 생성하고, App 관련 권한 설정 작업을 진행합니다. App 생성 및 권한 설정이 완료된 후에 Slack에 해당 App을 설치하고, 글을 등록할 채널에 생성한 App의 Bot 계정을 초대합니다. 이후 Python으로 Slack API를 호출하여 글을 등록할 수 있습니다. 특정 주기 마다 자동으로 글을 올리고자 할 경우에는 Python Schedule 모듈을 활용하면 됩니다.


Slack API 앱 만들기


PNG


Slack API - Your Apps에 접속하여 Create An App을 클릭합니다.


PNG


From scratch를 클릭합니다.


PNG


앱 이름을 작성하고, 슬랙 작업 환경을 선택한 후에 Create App을 클릭합니다.


PNG


Bots를 클릭합니다.


앱 관련 권한(Scope) 설정하기


PNG


Review Scopes to Add를 클릭합니다.


PNG


Install App to Workspace는 생성한 앱을 슬랙 작업 환경에 설치하도록 하는 버튼입니다. 현재 버튼이 비활성화되어 있는데, 권한(Scope) 설정을 마친 후에 활성화됩니다.


PNG


스크롤을 내리면 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에 앱 설치하기


PNG


Install App to Workspace를 클릭합니다.


PNG


Allow를 클릭합니다.


PNG


Token 문자열을 복사해둡니다. Python으로 Slack API 호출 시 해당 Token 정보가 필요합니다.


bot 앱을 채널에 추가하기


PNG


슬랙 워크스페이스의 좌측 앱에서 bot을 누르고 채널 상단의 bot을 클릭합니다. 팝업이 뜨면 ‘이 앱을 채널에 추가’를 눌러 ‘test’ 채널을 추가해줍니다.


PNG


슬랙 봇 테스트라는 문구를 채널에 등록합니다. 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

    def post_message(self, channel_id, text):
        """
        슬랙 채널에 메세지 보내기
        """
        # chat_postMessage() 메서드 호출
        result = self.client.chat_postMessage(
            channel=channel_id,
            text=text
        )
        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)


PNG

스레드에 bot이 문구를 등록한 것을 확인할 수 있습니다.


자동으로 글 등록하기

schedule 모듈을 활용해 스케줄을 등록하면 자동으로 슬랙에 댓글을 등록할 수 있다.

태그:

카테고리:

업데이트:

댓글남기기