|
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m36s
Возрастные YouTube-видео не скачивались: с cookies yt-dlp отбрасывает клиент
android и остаётся web, которому нужно решить n-challenge, а в образе стоял
Node 20 при требуемом минимуме 22 ("JS runtimes: node-20.19.2 (unsupported)").
Ставим Deno — рекомендованный yt-dlp рантайм и один статический бинарник.
Instagram падал с "empty media response" одинаково с cookies и без них —
дело было не в сессии, а в устаревшем экстракторе: слой pip был закеширован
на yt-dlp 2026.06.09. Поднимаем нижнюю границу до 2026.7.4.
/cookies/check помечал проблемой с cookies ЛЮБОЙ сбой, из-за чего на поломку
JS-рантайма прилетел алерт про протухшие cookies и увёл разбор не туда.
Теперь ответ содержит status: ok | cookies_invalid | extraction_failed |
no_cookies, и админ-бот шлёт разные сообщения. Разбор ответа в bot.py
сохраняет совместимость со старым форматом без поля status.
Добавлен smoke_test.py — гоняет реальные ссылки (включая обе регрессии выше)
через запущенные сервисы и печатает таблицу. Запускать после каждой правки.
Схема получения cookies переведена с крона на разовый ручной экспорт:
cookies-cron/ -> cookies/, удалены скрипты с анти-паттерном
`--cookies-from-browser BROWSER --cookies FILE`, который wiki yt-dlp прямо
запрещает и который сам ломал YouTube-сессию ротацией. Ключевые cookies живут
около года, поэтому обновление по расписанию не нужно — триггером служит алерт
health-check. deliver_cookies.sh только доставляет файлы по scp.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| app.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| instagram_cookies.txt | ||
| INSTAGRAM_COOKIES_INSTRUCTIONS.md | ||
| README.md | ||
| requirements.txt | ||
Instagram Downloader Service
Микросервис для скачивания видео с Instagram.
Требования
- Docker и Docker Compose
- Файл с cookies Instagram (
instagram_cookies.txtв папкеinstagram-downloader/)
Быстрый старт
1. Настройка cookies
Перед запуском сервиса нужно положить instagram_cookies.txt в папку instagram-downloader/.
Куки экспортируются вручную из браузера расширением для cookies.txt — пошаговая процедура в cookies/README.md. Скрипты автоматического экспорта через yt-dlp --cookies-from-browser убраны: этот способ ломает сессию, куки после него быстро протухают.
2. Запуск сервиса
Вариант 1: Через корневой docker-compose (рекомендуется)
cd .. # вернуться в корень проекта
docker compose up -d instagram-downloader
Вариант 2: Отдельно
docker compose up -d
3. Проверка работы
# Проверка здоровья сервиса
curl http://localhost:5556/health
# Должен вернуть: {"status":"ok","service":"instagram-downloader"}
API Endpoints
GET /health
Проверка здоровья сервиса.
Ответ:
{
"status": "ok",
"service": "instagram-downloader"
}
POST /cookies/check
Проверка, работают ли cookies прямо сейчас: делает лёгкий extract_info (без скачивания) по публичному тестовому ролику. Используется фоновым мониторингом в bot.py.
Ответ:
{
"cookies_present": true,
"cookies_valid": false,
"detail": "текст ошибки от yt-dlp"
}
cookies_valid: null означает, что файл с куками не найден. Тестовый URL переопределяется переменной INSTAGRAM_COOKIE_TEST_URL.
POST /download/stream
Скачивание видео с Instagram.
Запрос:
{
"url": "https://www.instagram.com/p/..."
}
Ответ:
- Успех: бинарные данные видео (Content-Type: video/mp4)
- Ошибка: JSON с описанием ошибки
Порты
- Внешний порт: 5556
- Внутренний порт контейнера: 5000
Обновление cookies
Ключевые куки Instagram живут около года, поэтому обновлять их по расписанию не нужно. Триггер на обновление — алерт 🍪⚠️ ПРОАКТИВНАЯ ПРОВЕРКА COOKIES из админ-бота (за состоянием следит фоновая проверка в bot.py, которая раз в 30 минут дёргает POST /cookies/check).
Процедура экспорта и доставки — в cookies/README.md. Перезапускать сервис после обновления не нужно: yt-dlp читает файл с диска при каждом запросе.
Troubleshooting
Сервис не может скачать видео
- Проверьте состояние куков:
curl -s -X POST localhost:5556/cookies/check - Проверьте наличие файла
instagram_cookies.txtв папкеinstagram-downloader/и что в нём естьsessionid - Если
cookies_valid: false— обновите куки по инструкции вcookies/README.md - Проверьте логи:
docker compose logs instagram-downloader
Cookies есть и не истекли по сроку, но всё равно login required
Instagram умеет блокировать сессию на своей стороне — тогда в логах видно Main webpage is locked behind the login page при формально валидном sessionid. Лечится только повторным экспортом куков. Провоцирует такую блокировку активная автоматическая работа с аккаунтом (например, постоянно открытая вкладка Instagram, непрерывно ходящая в сеть), поэтому после экспорта браузер лучше закрывать.
Структура файлов
instagram-downloader/
├── app.py # Основной код сервиса
├── Dockerfile # Образ Docker
├── docker-compose.yml # Конфигурация для отдельного запуска
├── requirements.txt # Python зависимости
├── INSTAGRAM_COOKIES_INSTRUCTIONS.md # Отсылка к cookies/README.md
└── README.md # Этот файл