#python #python-3.x #api #codec
#python #python-3.x #API #кодек
Вопрос:
Я пытаюсь загрузить видео, которое было загружено в облако, и я использую API для извлечения данных.
Кажется, что скрипт python загружает файл нормально, но когда я открываю видео, он выдает эту ошибку:
Я пытался использовать различные опции (VLC, проигрыватель Windows Media и т. Д.) Для воспроизведения видео, Но безуспешно. Может кто-нибудь, пожалуйста, помочь?
if res.status_code == 200:
body = res.json()
for meeting in body["meetings"]:
try:
password = requests.get(
f"{root}meetings/{meeting['uuid']}/recordings/settings?access_token={token}").json()["password"]
url = f"https://api.zoom.us/v2/meetings/{meeting['uuid']}/recordings/settings?access_token={token}"
res = requests.patch(
url,
data=json.dumps({"password": ""}),
headers=sess_headers)
except:
pass
topic = meeting["topic"]
try:
os.makedirs("downloads")
except:
pass
for i, recording in enumerate(meeting["recording_files"]):
#os.makedirs(topic)
download_url = recording["download_url"]
name = recording["recording_start"]
"-" meeting["topic"]
ext = recording["file_type"]
filename = f"{name}.{ext}"
path = f'./downloads/{filename}'.replace(":", ".")
res = requests.get(download_url, headers=sess_headers)
with open(Path(path), 'wb') as f:
f.write(res.content)
else:
print(res.text)
Комментарии:
1. Вы пробовали загружать какие-либо из этих URL-адресов напрямую с помощью какого-либо загрузчика? Не с помощью скрипта python. Также не воспроизводится?
2. Прямая загрузка работает нормально. В ответе JSON есть ссылка, и когда я пытаюсь открыть эту ссылку в браузере, файл автоматически загружается.
3. Может быть так, что
requests.get()
функция получает какие-то странныеContent-Type
и преобразует содержимое в некоторый недвоичный формат.4. можете ли вы распечатать значение res.status_code после выполнения последнего
requests.get
запроса?5. Если у вас есть
curl
инструмент, сделайте следующее —curl -I https://google.com/
но замените вместо URL-адреса Google URL-адрес загрузки. Эта команда выведет HTTP-заголовки, проверьте, какаяContent-Type
строка там есть.
Ответ №1:
Одна из возможных проблем заключается в следующем:
После выполнения каждого res = requests.get(...)
из них вам нужно вставить строку res.raise_for_status()
.
Это необходимо для проверки того, что код состояния равен 200.
По умолчанию requests
ничего не выдает, если код состояния не равен 200. Следовательно, ваш res.content
может быть недопустимым телом ответа в случае неправильного кода состояния.
Если вы это сделаете res.raise_for_status()
, то requests
выдаст ошибку, если код состояния не равен 200, что избавит вас от возможных проблем.
Но наличие кода состояния 200 определенно не означает, что ошибки не было. Некоторые серверы отвечают HTML, содержащим описание ошибки и код состояния 200.
Другая возможная проблема может заключаться в том, что в URL-адресе загрузки отсутствует токен авторизации, тогда вам нужно указать его через заголовки. Поэтому вместо последнего requests.get(...)
введите следующий код:
res = requests.get(download_url, headers = {
**sess_headers, 'Authorization': 'Bearer ' token})
Также вам необходимо проверить, какой тип контента имеет результирующий ответ, поэтому после последнего res = response.get(...)
выполните следующее:
print('headers:', res.headers)
и проверьте, что там внутри. В частности, посмотрите на поле Content-Type
, оно должно иметь какой-то двоичный тип, например application/octet-stream
, или video/mp4
. Но определенно не какой-то текстовый формат, такой как application/json
или text/html
, файл текстового формата определенно не является видеофайлом. В случае, если это text/html
так, попробуйте переименовать файл в test.html
и открыть его в браузере, чтобы посмотреть, что там, вероятно, сервер ответил какой-то ошибкой внутри этого HTML.
Также просто визуально сравните в каком-либо средстве просмотра содержимое двух файлов — загруженных скриптом и загруженных каким-либо загрузчиком (например, браузером). Возможно, есть какая-то очевидная проблема, видимая на глаз.
Также размер файла должен быть довольно большим для видео. Если это так 50KB
, то, возможно, внутри находятся какие-то неверные данные.
Обновить:
Наконец-то сработало следующее решение, заменив последнее requests.get(...)
на строку:
res = requests.get(download_url '?access_token=' token, headers=sess_headers)