#python #python-requests #slack
#python #python-запросы #провисание
Вопрос:
у меня есть эта команда
curl -X POST --data-urlencode "payload={"channel": "#test", "username": "kuhkuh", "text": "This is posted to #test", "icon_emoji": ":ghost:"}" https://hooks.slack.com/services/123/123/123
я пытаюсь создать его с помощью Python, чтобы я мог использовать его в своем проекте
import requests
import json
class SlackWrapper:
def __init__(self):
pass
@classmethod
def post_message_to_slack(self, err):
url = 'https://hooks.slack.com/services/123/123/123'
payload = {
'channel' : '#test',
'username' : 'kuhkuh',
'message' : err,
'icon_emoji' : ':ghosts:'
}
try:
alert = requests.post(url, data=payload, headers={'Content-Type': 'application/json'})
print(alert.status_code, ' - ', alert.text, ' - ', json.dumps(payload))
except Exception as e:
print(e)
SlackWrapper.post_message_to_slack("testing error message requests")
проблема в том, что я продолжаю получать эту ошибку
<Response [400]>
где я ошибся?
Комментарии:
1. Попробуйте
print(alert.status, ' - ', print(alert.text))
2. это дает этот invalid_payload 400 — None
3.
print(alert.status, ' - , alert.text)
— исправлена строка;4. смотрите текстовую ошибку из slack API, скорее всего, ваша полезная нагрузка не в правильном формате
Ответ №1:
Ошибка 400 означает «Неверный запрос», поэтому ваша полезная нагрузка неверна.
Если ваш payload
уже является dict
, нет необходимости json.dumps
указывать его в json
параметре post request
. Также requests
достаточно умен, чтобы вывести Content-Type
, поэтому нет необходимости явно устанавливать этот заголовок.
@classmethod
def post_message_to_slack(self, err):
url = 'https://hooks.slack.com/services/123/123/123'
# changed the payload
payload = {
"channel": "#test",
"username": "kuhkuh",
"text": "This is posted to #test",
"icon_emoji": ":ghost:"
}
try:
# changed the parameters for posting
alert = requests.post(url, json=payload)
print(alert.status_code, ' - ', alert.text, ' - ', json.dumps(payload))
except Exception as e:
print(e)
Ответ №2:
Вы можете вставить код curl в postman, затем получить код python и использовать его. Для вашего кода эквивалентный код Python :
import requests
url = "https://hooks.slack.com/services/123/123/123"
payload = 'payload={"channel": "#test", "username": "kuhkuh", "text": "This is posted to #test", "icon_emoji": ":ghost:"}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data = payload)
print(response.text.encode('utf8'))
Ответ №3:
Вы пытаетесь отправить данные на сервер в виде словаря.
Вместо этого попробуйте отправить его в виде данных json, используя атрибут json requests POST
payload = {
"channel" = '#test',
"username" = 'kuhkuh',
"message" = err,
"icon_emoji" = ':ghosts:'
}
alert = requests.post(url, json = payload)
Комментарии:
1. я сделал, я выдает недопустимую полезную нагрузку.
2. печать (alert.status_code, ‘ — ‘, alert.text, ‘ — ‘, json.dumps(полезная нагрузка)) 400 — invalid_payload — {«канал»: «#тест», «имя пользователя»: «kuhkuh», «сообщение»: «запросы на сообщение об ошибке тестирования», «icon_emoji»: «:призраки:»}
3. Если вы использовали
data
и json.dumps, попробуйте использоватьheaders={'Content-Type': 'application/json'}
в качестве аргумента функции. Если вы использовалиjson
, запросы должны были автоматически отправлять заголовок json. (Помните, что не следует использовать json.dumps для полезной нагрузки, если вы используетеjson
аргумент…4. @Boidushya Это также было ошибкой в моем ответе, используя
json.dumps
5. Также убедитесь, что отправленная вами полезная нагрузка была в правильном формате.