fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m36s
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>
This commit is contained in:
parent
5092d882e5
commit
d597a5e1c5
19 changed files with 373 additions and 733 deletions
|
|
@ -11,27 +11,9 @@
|
|||
|
||||
### 1. Настройка cookies
|
||||
|
||||
Перед запуском сервиса необходимо получить cookies Instagram. Есть несколько способов:
|
||||
Перед запуском сервиса нужно положить `instagram_cookies.txt` в папку `instagram-downloader/`.
|
||||
|
||||
#### Способ 1: Через скрипт (рекомендуется)
|
||||
|
||||
```bash
|
||||
cd instagram-downloader
|
||||
./get_instagram_cookies.sh
|
||||
```
|
||||
|
||||
Скрипт попросит выбрать браузер и автоматически извлечет cookies.
|
||||
|
||||
#### Способ 2: Обновление существующих cookies
|
||||
|
||||
```bash
|
||||
cd instagram-downloader
|
||||
./update_instagram_cookies.sh
|
||||
```
|
||||
|
||||
#### Способ 3: Вручную
|
||||
|
||||
См. подробные инструкции в `INSTAGRAM_COOKIES_INSTRUCTIONS.md`
|
||||
Куки экспортируются вручную из браузера расширением для `cookies.txt` — пошаговая процедура в [`cookies/README.md`](../cookies/README.md). Скрипты автоматического экспорта через `yt-dlp --cookies-from-browser` убраны: этот способ ломает сессию, куки после него быстро протухают.
|
||||
|
||||
### 2. Запуск сервиса
|
||||
|
||||
|
|
@ -71,6 +53,21 @@ curl http://localhost:5556/health
|
|||
}
|
||||
```
|
||||
|
||||
### POST /cookies/check
|
||||
|
||||
Проверка, работают ли cookies прямо сейчас: делает лёгкий `extract_info` (без скачивания) по публичному тестовому ролику. Используется фоновым мониторингом в `bot.py`.
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"cookies_present": true,
|
||||
"cookies_valid": false,
|
||||
"detail": "текст ошибки от yt-dlp"
|
||||
}
|
||||
```
|
||||
|
||||
`cookies_valid: null` означает, что файл с куками не найден. Тестовый URL переопределяется переменной `INSTAGRAM_COOKIE_TEST_URL`.
|
||||
|
||||
### POST /download/stream
|
||||
|
||||
Скачивание видео с Instagram.
|
||||
|
|
@ -93,40 +90,22 @@ curl http://localhost:5556/health
|
|||
|
||||
## Обновление cookies
|
||||
|
||||
Cookies Instagram имеют ограниченный срок действия. Рекомендуется обновлять их раз в несколько недель.
|
||||
Ключевые куки Instagram живут около года, поэтому обновлять их по расписанию не нужно. Триггер на обновление — алерт `🍪⚠️ ПРОАКТИВНАЯ ПРОВЕРКА COOKIES` из админ-бота (за состоянием следит фоновая проверка в `bot.py`, которая раз в 30 минут дёргает `POST /cookies/check`).
|
||||
|
||||
Для обновления:
|
||||
|
||||
```bash
|
||||
cd instagram-downloader
|
||||
./update_instagram_cookies.sh
|
||||
```
|
||||
|
||||
После обновления перезапустите сервис:
|
||||
|
||||
```bash
|
||||
docker compose restart instagram-downloader
|
||||
```
|
||||
Процедура экспорта и доставки — в [`cookies/README.md`](../cookies/README.md). Перезапускать сервис после обновления не нужно: `yt-dlp` читает файл с диска при каждом запросе.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Сервис не может скачать видео
|
||||
|
||||
1. Проверьте наличие файла `instagram_cookies.txt` в папке `instagram-downloader/`
|
||||
2. Проверьте срок действия cookies (они могут истечь)
|
||||
3. Обновите cookies через скрипт `update_instagram_cookies.sh`
|
||||
1. Проверьте состояние куков: `curl -s -X POST localhost:5556/cookies/check`
|
||||
2. Проверьте наличие файла `instagram_cookies.txt` в папке `instagram-downloader/` и что в нём есть `sessionid`
|
||||
3. Если `cookies_valid: false` — обновите куки по инструкции в [`cookies/README.md`](../cookies/README.md)
|
||||
4. Проверьте логи: `docker compose logs instagram-downloader`
|
||||
|
||||
### Cookies истекли
|
||||
### Cookies есть и не истекли по сроку, но всё равно `login required`
|
||||
|
||||
Если видите ошибку "Instagram cookies истекли", выполните:
|
||||
|
||||
```bash
|
||||
cd instagram-downloader
|
||||
./update_instagram_cookies.sh
|
||||
```
|
||||
|
||||
Затем перезапустите сервис.
|
||||
Instagram умеет блокировать сессию на своей стороне — тогда в логах видно `Main webpage is locked behind the login page` при формально валидном `sessionid`. Лечится только повторным экспортом куков. Провоцирует такую блокировку активная автоматическая работа с аккаунтом (например, постоянно открытая вкладка Instagram, непрерывно ходящая в сеть), поэтому после экспорта браузер лучше закрывать.
|
||||
|
||||
## Структура файлов
|
||||
|
||||
|
|
@ -136,9 +115,7 @@ instagram-downloader/
|
|||
├── Dockerfile # Образ Docker
|
||||
├── docker-compose.yml # Конфигурация для отдельного запуска
|
||||
├── requirements.txt # Python зависимости
|
||||
├── get_instagram_cookies.sh # Скрипт для получения cookies
|
||||
├── update_instagram_cookies.sh # Скрипт для обновления cookies
|
||||
├── INSTAGRAM_COOKIES_INSTRUCTIONS.md # Подробные инструкции по cookies
|
||||
├── INSTAGRAM_COOKIES_INSTRUCTIONS.md # Отсылка к cookies/README.md
|
||||
└── README.md # Этот файл
|
||||
```
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue