videoDownloadTGbot/cookies/deliver_cookies.sh
vrubelroman d597a5e1c5
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m36s
fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест
Возрастные 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>
2026-07-26 00:31:16 +00:00

94 lines
4 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Доставка cookies на прод и тестовый стенд.
#
# Запускается ВРУЧНУЮ после разового экспорта cookies из браузера — не по крону.
# Как правильно экспортировать cookies, см. README.md рядом с этим скриптом.
# Автоматический экспорт через `yt-dlp --cookies-from-browser` убран намеренно:
# он ломает YouTube-сессию ("cookies have likely been rotated in the browser").
set -euo pipefail
# Определяем директорию скрипта
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# Настройки
INSTAGRAM_COOKIES="$SCRIPT_DIR/instagram_cookies.txt"
YOUTUBE_COOKIES="$SCRIPT_DIR/youtube_cookies.txt"
REMOTE_HOST="germany"
REMOTE_INSTAGRAM_PATH="/root/services/videoDownloadTGbot/instagram_cookies.txt"
REMOTE_YOUTUBE_PATH="/root/services/videoDownloadTGbot/youtube_cookies.txt"
DEV_HOST="hermesDev"
DEV_INSTAGRAM_PATH="services/videoDownloadTGbot/instagram-downloader/instagram_cookies.txt"
DEV_YOUTUBE_PATH="services/videoDownloadTGbot/youtube-downloader/youtube_cookies.txt"
LOG_FILE="$SCRIPT_DIR/deliver.log"
# Функция логирования
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
# Функция обработки ошибок
error_exit() {
log "ОШИБКА: $*"
exit 1
}
# Проверяет, что файл существует и содержит хотя бы одну строку с cookie
check_cookies_file() {
local file="$1"
local name="$2"
if [ ! -f "$file" ]; then
error_exit "Файл не найден: $file. Сначала экспортируйте cookies $name — см. README.md"
fi
local lines
lines=$(grep -cv -e '^#' -e '^$' "$file" || true)
if [ "$lines" -eq 0 ]; then
error_exit "Файл $file пустой (0 строк с cookies). Экспорт $name не удался — см. README.md"
fi
log "$name: $file ($lines строк с cookies)"
}
log "=== Начало доставки cookies ==="
check_cookies_file "$INSTAGRAM_COOKIES" "Instagram"
check_cookies_file "$YOUTUBE_COOKIES" "YouTube"
# Копируем cookies на удаленный хост (прод)
log "Копирование cookies на удаленный хост $REMOTE_HOST..."
# Копируем Instagram cookies
if scp -q "$INSTAGRAM_COOKIES" "${REMOTE_HOST}:${REMOTE_INSTAGRAM_PATH}" 2>>"$LOG_FILE"; then
log "✅ Instagram cookies скопированы на $REMOTE_HOST"
else
error_exit "Ошибка при копировании Instagram cookies (код возврата: $?)"
fi
# Копируем YouTube cookies
if scp -q "$YOUTUBE_COOKIES" "${REMOTE_HOST}:${REMOTE_YOUTUBE_PATH}" 2>>"$LOG_FILE"; then
log "✅ YouTube cookies скопированы на $REMOTE_HOST"
else
error_exit "Ошибка при копировании YouTube cookies (код возврата: $?)"
fi
# Копируем cookies на тестовый стенд (не блокируем прод-доставку, если стенд недоступен)
log "Копирование cookies на тестовый стенд $DEV_HOST..."
if scp -q "$INSTAGRAM_COOKIES" "${DEV_HOST}:${DEV_INSTAGRAM_PATH}" 2>>"$LOG_FILE"; then
log "✅ Instagram cookies скопированы на $DEV_HOST"
else
log "⚠️ Не удалось скопировать Instagram cookies на $DEV_HOST (продолжаем)"
fi
if scp -q "$YOUTUBE_COOKIES" "${DEV_HOST}:${DEV_YOUTUBE_PATH}" 2>>"$LOG_FILE"; then
log "✅ YouTube cookies скопированы на $DEV_HOST"
else
log "⚠️ Не удалось скопировать YouTube cookies на $DEV_HOST (продолжаем)"
fi
log "=== Доставка cookies завершена успешно ==="
log "Проверить результат: ssh ${REMOTE_HOST} \"curl -s -X POST localhost:5557/cookies/check; curl -s -X POST localhost:5556/cookies/check\""
exit 0