본문 바로가기

프로그래밍

[Python] Slack sdk를 이용해서 Slack 메시지 보내기

from typing import Optional
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError


class SlackNotifier:
    __latest_thread_identifier: float = None

    def __init__(self, token):
        try:
            self.__client = WebClient(token)
        except Exception as e:
            print(f"Slack notifier got an error : {e}")

    def notify(self, header_blocks: [str], show_msg: str, channel: str) -> bool:
        if not self.__client:
            return False

        try:
            response = self.__client.chat_postMessage(
                channel=channel,
                text=show_msg,
                blocks=header_blocks
            )
            if response.status_code != 200:
                print(f"Request to slack returned an error {response.status_code}, the response is \n{response}")
                return False

            self.__latest_thread_identifier = response.get('ts')
            return True
        except SlackApiError as e:
            assert e.response["ok"] is False
            assert e.response["error"]
            print(f"Got an error : {e.response['error']}")
            return False

    def reply_msg(
            self,
            reply_contents: str,
            fall_back_msg: str,
            channel: str,
            thread_identifier: Optional[float] = None
            ) \
            -> bool:
        if not self.__client:
            return False

        # If no thread is specified, use latest notify thread identifier
        if thread_identifier:
            target_thread = thread_identifier
        else:
            target_thread = self.__latest_thread_identifier

        if target_thread is None:
            print("target thread unidentified.")
            return False

        try:
            response = self.__client.chat_postMessage(
                channel=channel,
                text=fall_back_msg,
                blocks=reply_contents,
                thread_ts=target_thread
            )

            if response.status_code != 200:
                print(f"Request to slack returned an error {response.status_code}, the response is \n{response}")

        except SlackApiError as e:
            assert e.response["ok"] is False
            assert e.response["error"]
            print(f"Got an error : {e.response['error']}")
            return False

        return True

 Python 관련 툴에서 Slack으로 메시지를 보내줄 필요가 있어서 관련 문서들을 보면서 만들었다.

 Slack sdk를 사용하려면 Slack 홈페이지에서 Token을 받아와서 이 Notifier에게 넘겨주어야 한다.

 

 필요한 기능인 메시징과 댓글달기만 구현해 놓았고, 아래와 같이 사용해주면 된다.

token = GetSlackToken()
Notifier = SlackNotifier(token)

test_text = [{
    "type": "section",
    "text": {
        "type": "plain_text",
        "text": "테스트 메시지 입니다. :OK:",
        "emoji": True
    }
}]
is_notify_success = self.__notifier.notify(test_text, "Test", "#test_channel")
self.assertTrue(is_notify_success)

 

근데 Tistory 코드 블럭의 백슬래시가 원화 표시로 바뀌네.
근데 또 그냥 에디터에서는 \ 원화 표시로 치면 백슬래시로 나옴. 약간 열받음.