saveapi.org

yt-dlp пишет «Sign in to confirm you're not a bot» — что делать на сервере

На ноутбуке yt-dlp скачивает YouTube без проблем. Перенесите ту же команду на VPS — и почти на каждом видео получите «Sign in to confirm you're not a bot». Что значит это сообщение, что мы измерили с адреса дата-центра и какой вызов API его заменяет — ниже.

Обновлено

Что на самом деле говорит ошибка

Плеерный эндпоинт YouTube отказался отдавать данные потока и попросил авторизованную сессию. yt-dlp передаёт это и предлагает cookies, потому что сессия — единственное, что он может добавить со своей стороны. Видео публичное; запрос отклонили ещё до того, как он добрался до видео.

Terminal
$ yt-dlp https://www.youtube.com/watch?v=aqz-KE-bpKQ
ERROR: [youtube] aqz-KE-bpKQ: Sign in to confirm you're not a bot.
Use --cookies-from-browser or --cookies for the authentication.
See the yt-dlp FAQ for how to manually pass cookies.

Дело в адресе, а не в инструменте

Мы измерили это до того, как построили свой конвейер: 16 случайных публичных видео с адреса Hetzner — 0 из 16 со стандартными клиентами yt-dlp (одно знаменитое видео, которое работает везде, — аномалия, а не сигнал). Тот же бинарник за выходным адресом, которому YouTube доверяет: 22 из 22. Диапазоны дата-центров оцениваются как боты целиком; решение — не флаг.

Почему cookies — бег на месте

Экспорт браузерной сессии работает сегодня. Потом YouTube привязывает cookies к IP и устройству, с которых они пришли, ротирует их и помечает аккаунт, увидев сотни загрузок с сервера. В итоге вы содержите карусель одноразовых аккаунтов, генераторов PO-токенов и прокси — это операция по скрейпингу, а не команда загрузки.

Шаг первый: что предлагает видео

Один GET со ссылкой. Ответ перечисляет каждый вариант с точным размером в байтах, плюс название, длительность и превью — та часть yt-dlp -F, которой вы реально пользовались. Ссылок пока нет: этот вызов стоит 2 кредита, и его безопасно кэшировать.

Terminal
curl -s "https://api.saveapi.org/v1/youtube/info" \
  -H "Authorization: Bearer sk_live_xxxx" \
  -G --data-urlencode "url=https://www.youtube.com/watch?v=dQw4w9WgXcQ"

Шаг второй: собрать нужный вариант

Передайте ту же ссылку и качество из списка. Ответ — подписанная ссылка, отдающая MP4 (или M4A/MP3) потоком с нашей стороны, с filename, file_size и сроком действия. Поток идёт через нас намеренно: YouTube подписывает медиа-URL под запросивший IP, поэтому сырая ссылка на вашем сервере ответила бы 403.

Terminal
curl -s "https://api.saveapi.org/v1/youtube/create" \
  -H "Authorization: Bearer sk_live_xxxx" \
  -G --data-urlencode "url=https://www.youtube.com/watch?v=aqz-KE-bpKQ" \
  --data-urlencode "quality=720p"

Замена в Python без переписывания

Если ваш код вызывал yt-dlp ради файла, а потом что-то с ним делал, контракт тот же: передайте ссылку, получите URL для скачивания. Вы теряете селекторы форматов вроде bestvideo+bestaudio; получаете точный размер до принятия решения и отсутствие бот-стены, за которой нужно присматривать.

Python
import httpx

API = "https://api.saveapi.org/v1/youtube"
HEADERS = {"Authorization": "Bearer sk_live_xxxx"}

def youtube_link(url: str, quality: str = "720p") -> dict:
    """Instead of yt-dlp -f: list the renditions, then build one."""
    info = httpx.get(f"{API}/info", params={"url": url},
                     headers=HEADERS, timeout=30).json()
    if not info["success"]:
        raise RuntimeError(info["error"]["code"])
    available = {f["quality"] for f in info["formats"]}
    if quality not in available:
        quality = info["formats"][-1]["quality"]   # highest one this video has
    made = httpx.get(f"{API}/create", params={"url": url, "quality": quality},
                     headers=HEADERS, timeout=60).json()
    if not made["success"]:
        raise RuntimeError(made["error"]["code"])
    return made   # url, filename, file_size, expires

Вопросы перед началом

yt-dlp всё ещё скачивает YouTube с домашнего подключения?
Обычно да. Стена смотрит на класс адреса; резидентный IP с браузероподобным клиентом чаще всего проходит. Падает это на серверах — а именно там работают боты и бэкенды.
Использует ли API мой аккаунт YouTube или cookies?
Нет. Запрос — это ссылка и ваш API-ключ. Ваш аккаунт не участвует, и ротировать нечего.
Сколько стоит одно видео?
12 кредитов за info и create вместе — с пакетом за $9 это примерно десятая часть цента за загрузку. Ссылка, которую отклонил сам YouTube, стоит 0.1 кредита; сбой на нашей стороне — бесплатно.

Платформы, использованные здесь

Другие руководства

Запустите это руководство со своим ключом

Ключ за минуту. 1 000 бесплатных кредитов, без карты и без срока.

Получить ключ и попробоватьПолный справочник API