ОТПРАВИТЬ запрос через почтальона работает, но через запросы python нет

#python #api #python-requests #postman #put

Вопрос:

Когда я отправляю запрос PUT через почтальона, все в порядке, но когда я копирую код с почтальона на python, я получаю следующее:

 {"code": 50035, "errors": {"_errors": [{"code": "CONTENT_TYPE_INVALID", "message": "Expected "Content-Type" header to be one of {'application/json'}."}]}, "message": "Invalid Form Body"}
 

код:

 url = "https://discord.com/api/v9/guilds/860859559908474900/premium/subscriptions"

payload={'user_premium_guild_subscription_slot_ids': '853228009795223572'}
files=[

]
headers = {
  'authorization': 'here token',
  'Cookie': '__dcfduid=c5cbabf10a8344558c8c4b90a6e306e2'
}

response = requests.request("PUT", url, headers=headers, data=payload, files=files)

print(response.text)
 

если я добавлю «тип содержимого»: «приложение/json» в заголовки, я получу это:

{"message": "400: Bad Request", "code": 0}

Комментарии:

1. Вы должны указать правильный тип содержимого, а затем определить, что вызывает следующую ошибку (400).

2. Приложение типа содержимого-Json.

Ответ №1:

Либо используйте json= вместо data= , либо добавьте Content-Type заголовок со значением application/json , как вам скажет сервер.

Также проверьте Authorization заголовок, в основном там есть префикс, в котором упоминается, какую аутентификацию использовать, например:

 Authorization: Basic base64-encoded(user:pass)
Authorization: Bearer token
Authorization: Token token
 

и убедитесь files , что API действительно разрешил параметру быть пустым, а если нет, попробуйте удалить его.

Затем __dcfduid вы предоставляете файл cookie. Некоторые файлы cookie, как правило, динамичны, поскольку их значение меняется между запросами. Затем попробуйте установить сеанс и выполните в нем часть входа в систему:

 import requests as r
ses = r.Session()
resp = ses.post(<login to the API>)
print(resp.text)
ses.put(
    url="https://discord.com/api/v9/guilds/860859559908474900/premium/subscriptions",
    headers={
        'Authorization': 'here token',
        # cookies are in the ses object
    },
    json={
        'user_premium_guild_subscription_slot_ids': '853228009795223572'
    },
    # if required
    files=[...]
)
 

Комментарии:

1. если я использовать JSON= вместо Data= я получаю эту ошибку: pastebin.com/raw/gnb6zHH0 (его на долго, чтобы вставить его здесь), и если я добавлю ‘тип содержимого’ : ‘приложение/JSON’ в заголовках, я получаю это: {"message": "400: Bad Request", "code": 0} а если я использовать JSON= и добавить ‘тип содержимого’ : ‘приложения/JSON’ как и я получу эту ошибку pastebin.com/raw/gnb6zHH0

2. @1bura Итак, вы продвинулись на один шаг ближе — длинное сообщение становится все ближе к успешному ответу. Судя по тому, что там написано ( SET_TYPE_ALREADY_CONTAINS_VALUE ), какие бы данные вы ни передавали, они, по-видимому, уже настроены. Попробуйте удалить их вручную, затем вызовите API.

3. он пишет SET_TYPE_ALREADY_CONTAINS_VALUE, но это не так, проверьте это видео youtube.com/watch? v=WpyyJH1mc9M (да, я знаю, что там есть токен авторизации, он мне просто не нужен, это мой тестовый токен, и вы можете его взять)