Ошибка 412 при загрузке видео в MAX: причины и решение
При попытке отправить видеофайл в мессенджер MAX через API разработчики часто сталкиваются с HTTP 412 Precondition Failed. Эта ошибка указывает на невыполнение предварительных условий, заданных сервером. В этой статье мы подробно разберём, почему возникает статус 412, какие заголовки необходимо добавить для корректной передачи данных и как реализовать возобновляемую загрузку при обрыве соединения.
Что означает ошибка 412 Precondition Failed?
Код 412 Precondition Failed возвращается, когда сервер не может выполнить одно или несколько условий, указанных в заголовках запроса. Чаще всего это связано с неправильной работой условных заголовков, таких как If-Match, If-None-Match, If-Modified-Since или Content-Range. В контексте загрузки видео в MAX сервер может требовать определённые метаданные или корректный размер чанка.
Основные причины ошибки 412 при отправке видео
Отсутствие обязательных заголовков
В вашем коде используется только Authorization. Для работы с API MAX могут потребоваться дополнительные заголовки:
Content-Type- обычноapplication/octet-streamдля бинарных данных.Content-Length- точный размер отправляемого тела (обязателен, если не используется chunked transfer).Content-Range- нужен для дозагрузки (resumable upload).X-Upload-Content-Type- исходный MIME-тип файла, напримерvideo/mp4.X-Upload-Content-Length- общий размер видео.
Некорректный токен или сессия
Вы получаете URL для загрузки через POST-запрос, но не передаёте полученный token в последующем запросе. Сервер может проверять его как часть предварительного условия. Убедитесь, что токен включён в заголовки или тело запроса, как того требует документация.
Проблемы с размером чанка
Вы читаете файл по 1 МБ, но не указываете Content-Range. Без этого сервер не может проверить, какой именно фрагмент вы отправляете, и возвращает 412. Для возобновляемой загрузки обязательно указывайте диапазон байтов.
Как исправить ошибку: правильные заголовки для загрузки видео
Для успешной отправки видеофайла в MAX добавьте следующие заголовки в POST-запрос:
headers = {
'Authorization': TOKEN,
'Content-Type': 'application/octet-stream',
'Content-Length': str(total_size),
'X-Upload-Content-Type': 'video/mp4',
'X-Upload-Content-Length': str(total_size)
}Если вы используете чанкованную передачу (chunked), уберите Content-Length и добавьте Transfer-Encoding: chunked. Однако для дозагрузки лучше применять Content-Range.
Реализация возобновляемой загрузки (resumable upload)
Чтобы видео догружалось после обрыва, нужно:
- Сначала узнать, сколько байт уже принято сервером (через GET-запрос к URL загрузки с заголовком
Range: bytes=0-). - Затем отправить оставшуюся часть с заголовком
Content-Range: bytes start-end/total. - Обрабатывать ответы с кодом
308 Resume Incomplete(стандарт для возобновляемых загрузок).
Пример функции с дозагрузкой:
def upload_video_resumable(video_path, upload_url):
total_size = os.path.getsize(video_path)
# Проверяем прогресс
head_resp = requests.head(upload_url)
uploaded = int(head_resp.headers.get('X-Uploaded-Bytes', 0))
with open(video_path, 'rb') as f:
f.seek(uploaded)
headers = {
'Authorization': TOKEN,
'Content-Range': f'bytes {uploaded}-{total_size-1}/{total_size}'
}
while True:
chunk = f.read(1024 * 1024)
if not chunk:
break
resp = requests.put(upload_url, data=chunk, headers=headers)
if resp.status_code in [200, 201, 308]:
# обновляем прогресс
pass
else:
print(f'Ошибка: {resp.status_code}')
break
return resp.json().get('token')Проверка токена и статуса загрузки
Если видео не появляется даже спустя неделю, проблема может быть в том, что токен не активируется после завершения загрузки. После успешной отправки всех байтов отправьте финальный POST-запрос на эндпоинт подтверждения, указав полученный токен. Внимательно изучите документацию MAX: возможно, требуется отправить метаданные (название, описание) отдельным запросом.
Пошаговый план исправления ошибки 412
- Проверьте актуальность токена авторизации.
- Добавьте заголовки
Content-Type,Content-LengthиX-Upload-Content-Type. - Реализуйте дозагрузку с
Content-Rangeи обработкой кода 308. - После завершения отправки подтвердите токен через отдельный запрос.
- Протестируйте с маленьким файлом (1-5 МБ) для отладки.
Следуя этим рекомендациям, вы избавитесь от ошибки 412 и сможете надёжно загружать видео любого размера в MAX.