기타/Python → Webhook

[Slack] requests.post 시 큰따옴표 처리

비번변경 2022. 8. 9. 21:58

개요

아래의 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 "")

400 - invalid_payload

아무래도 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 "")

response 200

 

 

 

참고 문서

https://stackoverflow.com/questions/58310531/python-auth0-post-request-invalid-request-payload-json-format