개요
아래의 python 코드를 이용해 slack webhook을 전송하려고 한다.
def send_message(name, message):
url = "WEBHOOK_URL"
header = {'Content-type': 'application/json'}
icon_emoji = ":crying_cat_face:"
channel = "# test_alarm"
data = f'{{"channel": "{channel}", "username": "{name}", "text": "{message}", "icon_emoji": "{icon_emoji}"}}'
# 메세지 전송
return requests.post(url, headers=header, data=data)
하지만 아래와 같이 호출해도 메시지를 수신받지 못했다.
if __name__ == "__main__":
name = 'passwd'
message = '"test" message'
response = send_message(name, message)
response 확인
먼저 호출 부분의 코드를 다음과 같이 수정하고 send_message 내의 data를 출력하여 data 형태는 어떤지, response가 어떤지 확인해보았다.
if __name__ == "__main__":
name = 'passwd'
message = '"test" message'
response = send_message(name, message)
print("slack: ", response, response.text if response is not None else "")
아무래도 text value에 큰따옴표가 포함된 게 문제가 되는 것 같다. JSON에서 큰따옴표를 사용하려면 이스케이프 처리가 되어야 하기 때문이다.
해결
전달할 데이터를 문자열이 아닌 dictionary 형 데이터로 변경하고, post 함수 호출 시 data key를 json으로 변경하면 된다.
import requests
# 함수
def send_message(name, message):
url = "https://hooks.slack.com/services/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"
header = {'Content-type': 'application/json'}
icon_emoji = ":crying_cat_face:"
channel = "# test_alarm"
data = {"username": name, "text": message, "icon_emoji": icon_emoji}
print(data)
# 메세지 전송
return requests.post(url, headers=header, json=data)
if __name__ == "__main__":
name = 'passwd'
message = '"test" message'
response = send_message(name, message)
print("slack: ", response, response.text if response is not None else "")
참고 문서