Почему сервер возвращает 500 ответов на запрос post

#python #python-requests

Вопрос:

Я пытаюсь загрузить файл с steamworkshopdownloader.io с запросами, но он всегда возвращает ошибку 500. Что я делаю не так? Я не очень хорошо знаком с просьбами.

Код:

 import requests

def downloadMap(map_id):
    session = requests.session()
    file = session.post("https://backend-02-prd.steamworkshopdownloader.io/api/details/file", 
        data={"publishedfileid": map_id})
    print(file)

downloadMap("814218628")
 

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

1. 500 это означает, что сервер сделал что-то странное. Возможно, вы отправляете сообщение не на тот сервер.

2. Проверьте этот URL-адрес » backend-02-prd.steamworkshopdownloader.io/api/details/file » в вашем браузере и посмотрите, работает ли сервер и работает ли он.

3. Пожалуйста, используйте session.get(...) для отправки запроса get на сервер для загрузки файлов

4. Если вы хотите загрузить файл с этого сайта, посмотрите на greasyfork.org/en/scripts/396698-steam-workshop-downloader/code они используют разные URL-адреса для вашего, и URL-адреса, которые они используют, дают 200 ответов «ОК».

Ответ №1:

Если вы хотите загрузить файл из этого API, попробуйте этот код, он адаптирован по ссылке в комментарии, который я опубликовал ранее (https://greasyfork.org/en/scripts/396698-steam-workshop-downloader/code) и преобразован в Python:

 import requests
import json
import time

def download_map(map_id):
    s = requests.session()
    data = {
        "publishedFileId": map_id,
        "collectionId": None,
        "extract": True,
        "hidden": False,
        "direct": False,
        "autodownload": False
    }
    r = s.post('https://backend-01-prd.steamworkshopdownloader.io/api/download/request', data=json.dumps(data))
    print(r.json())
    uuid = r.json()['uuid']
    data = f'{{"uuids":["{uuid}"]}}'
    while True:
        r = s.post('https://backend-01-prd.steamworkshopdownloader.io/api/download/status', data=data)
        print(r.json())
        if r.json()[uuid]['status'] == 'prepared':
            break
        time.sleep(1)
    params = (('uuid', uuid),)
    r = s.get('https://backend-01-prd.steamworkshopdownloader.io/api/download/transmit', params=params, stream=True)
    print(r.status_code)
    with open(f'./{map_id}.zip', 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

download_map(814218628)
 

Код демонстрирует, как использовать API, и загружает файл с именем 814218628.zip (или что бы там ни map_id было предоставлено) в каталоге, из которого запускается скрипт, zip-архив содержит файл .udk (дизайн игровой карты, созданный с помощью комплекта разработки Unreal Engine).