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 кредита, и его безопасно кэшировать.
Terminalcurl -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.
Terminalcurl -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; получаете точный размер до принятия решения и отсутствие бот-стены, за которой нужно присматривать.
Pythonimport 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 бесплатных кредитов, без карты и без срока.