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 코드 블럭의 백슬래시가 원화 표시로 바뀌네.
근데 또 그냥 에디터에서는 \ 원화 표시로 치면 백슬래시로 나옴. 약간 열받음.
'프로그래밍' 카테고리의 다른 글
Github for Android의 베타 버전이 나왔습니다. (0) | 2020.01.15 |
---|---|
내가 기대하는 C++17 - std::optional (0) | 2019.05.05 |