videoDownloadTGbot/cookies-cron/get_youtube_cookies.sh
vrubelroman 772e9fd5b4
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 1m47s
chore: remove obsolete per-folder scripts, add cookies-cron reference, update docs
- Remove get_cookies.sh (targets a container without yt-dlp, already
  broken), get_cookies_local.sh, start_all.sh/stop_all.sh — these
  implement the old per-service-compose startup that now conflicts
  with the unified root docker-compose.yml.
- Add cookies-cron/ — a reference copy of the scripts actually running
  via cron on the separate browser-equipped machine, with setup
  requirements and instructions for standing up a new cron host.
- Update README.md/ARCHITECTURE.md to describe the current unified
  docker-compose + CI/CD deploy flow and host-mounted cookies instead
  of the old per-folder workflow.
2026-06-30 22:16:40 +00:00

217 lines
8.9 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 YouTube через yt-dlp из Firefox
# Предназначен для запуска на Ubuntu 24.04 с авторизованным Firefox
# Результат копируется через cron на серверы со службами скачивания
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COOKIES_FILE="$SCRIPT_DIR/youtube_cookies.txt"
BROWSER="firefox"
TEMP_FILE="${COOKIES_FILE}.tmp"
# Определяем HOME пользователя (работает для sudo и обычного запуска)
if [ -n "$SUDO_USER" ]; then
REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
export HOME="$REAL_HOME"
elif [ -z "$HOME" ] || [ "$HOME" = "/root" ]; then
# Если HOME не установлен или это root, пытаемся найти реального пользователя
REAL_USER=$(whoami)
if [ "$REAL_USER" != "root" ]; then
export HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
fi
fi
# Проверка для cron: если запущен без терминала, меньше вывода
if [ -t 0 ]; then
VERBOSE=1
else
VERBOSE=0
fi
if [ "$VERBOSE" = "1" ]; then
echo "Получение cookies YouTube из Firefox..."
echo "Файл cookies будет сохранен в: $COOKIES_FILE"
fi
# Проверяем наличие yt-dlp
if ! command -v yt-dlp &> /dev/null; then
echo "ERROR: yt-dlp не найден в системе" >&2
echo "Установите: sudo apt install yt-dlp (Ubuntu) или pip install yt-dlp" >&2
exit 1
fi
if [ "$VERBOSE" = "1" ]; then
echo "Получаю cookies..."
fi
# Удаляем старый временный файл
rm -f "$TEMP_FILE"
# Извлекаем cookies из браузера напрямую из базы данных
# --cookies-from-browser извлекает cookies для всех доменов, связанных с URL
# Используем один запрос с основным URL - cookies для всех поддоменов будут извлечены
if [ "$VERBOSE" = "1" ]; then
echo "Получаю cookies из браузера..."
timeout 10 yt-dlp \
--cookies-from-browser "$BROWSER" \
--cookies "$TEMP_FILE" \
--no-download \
--quiet \
--socket-timeout 5 \
"https://www.youtube.com" > /dev/null 2>&1 || true
else
timeout 10 yt-dlp \
--cookies-from-browser "$BROWSER" \
--cookies "$TEMP_FILE" \
--no-download \
--quiet \
--socket-timeout 5 \
"https://www.youtube.com" > /dev/null 2>&1 || true
fi
# Функция проверки валидности куков
check_cookies() {
local file="$1"
local current_time=$(date +%s)
# Проверяем существование файла
if [ ! -f "$file" ]; then
return 1
fi
# Проверяем, что файл содержит данные (не только заголовки)
local cookie_lines=$(grep -v '^#' "$file" | grep -v '^$' | wc -l)
if [ "$cookie_lines" -eq 0 ]; then
return 1
fi
# Проверяем наличие YouTube-куков
local youtube_cookies=$(grep -E '\.youtube\.com|youtube\.com' "$file" | grep -v '^#' | wc -l)
if [ "$youtube_cookies" -eq 0 ]; then
return 1
fi
# Проверяем срок действия куков (должен быть хотя бы один не просроченный)
local valid_cookies=0
local expired_cookies=0
# Используем awk для более надежного парсинга
while IFS=$'\t' read -r domain flag path secure expiration name value; do
# Пропускаем комментарии и пустые строки
[[ "$domain" =~ ^#.*$ ]] && continue
[[ -z "$domain" ]] && continue
# Проверяем только YouTube-куки
if [[ "$domain" =~ youtube\.com ]]; then
if [ "$expiration" = "0" ] || [ -z "$expiration" ]; then
# Сессионные куки (expiration=0) считаем валидными
valid_cookies=$((valid_cookies + 1))
else
# Проверяем срок действия
if [ "$expiration" -gt "$current_time" ] 2>/dev/null; then
valid_cookies=$((valid_cookies + 1))
else
expired_cookies=$((expired_cookies + 1))
fi
fi
fi
done < "$file"
# Должен быть хотя бы один валидный YouTube-куки
if [ "$valid_cookies" -eq 0 ]; then
return 1
fi
# Если есть просроченные куки, выводим предупреждение, но не считаем критичным
if [ "$expired_cookies" -gt 0 ] && [ "$VERBOSE" = "1" ]; then
echo "⚠️ Предупреждение: найдено $expired_cookies просроченных YouTube-куков" >&2
fi
return 0
}
# Проверяем результат
if [ -f "$TEMP_FILE" ] && check_cookies "$TEMP_FILE"; then
# Куки валидны, переносим во временный файл в финальный
mv "$TEMP_FILE" "$COOKIES_FILE"
# Собираем статистику для вывода
COOKIE_LINES=$(grep -v '^#' "$COOKIES_FILE" | grep -v '^$' | wc -l)
YOUTUBE_COOKIES=$(grep -E '\.youtube\.com|youtube\.com' "$COOKIES_FILE" | grep -v '^#' | wc -l)
IMPORTANT_COOKIES=$(grep -E 'VISITOR_INFO1_LIVE|__Secure-3PSID|PREF|__Secure-YNID' "$COOKIES_FILE" | grep -v '^#' | wc -l)
if [ "$VERBOSE" = "1" ]; then
echo ""
echo "✅ Cookies успешно сохранены в $COOKIES_FILE"
echo " Всего строк с cookies: $COOKIE_LINES"
echo " YouTube-куков: $YOUTUBE_COOKIES"
echo " Важных куков: $IMPORTANT_COOKIES"
echo ""
echo "Файл готов к копированию на серверы через cron"
else
# Минимальный вывод для cron (можно логировать в файл)
echo "$(date '+%Y-%m-%d %H:%M:%S') - YouTube cookies updated: $YOUTUBE_COOKIES cookies, $IMPORTANT_COOKIES important"
fi
exit 0
else
# Очищаем временный файл при ошибке
rm -f "$TEMP_FILE"
if [ "$VERBOSE" = "1" ]; then
echo ""
echo "❌ Ошибка: не удалось получить валидные YouTube-куки"
echo ""
echo "Возможные причины:"
echo "1. В Firefox нет куков для YouTube"
echo "2. Откройте YouTube в Firefox и войдите в аккаунт"
echo "3. Все куки просрочены - обновите их в браузере"
echo ""
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Failed to get valid YouTube cookies" >&2
fi
if [ ! -f "$COOKIES_FILE" ]; then
# Если файла не было, это критичная ошибка
exit 1
else
# Если файл был, просто оставляем старый (лучше работать со старыми куками чем без них)
if [ "$VERBOSE" = "1" ]; then
echo "⚠️ Оставляю существующий файл cookies без изменений"
fi
exit 0
fi
fi
if [ ! -f "$TEMP_FILE" ] && [ ! -f "$COOKIES_FILE" ]; then
if [ "$VERBOSE" = "1" ]; then
echo ""
echo "❌ Ошибка: файл cookies не был создан"
echo ""
echo "Возможные причины:"
echo "1. Firefox не найден или недоступен"
echo "2. Проблемы с правами доступа к файлу cookies браузера"
echo "3. Cookies не найдены в браузере"
echo ""
echo "Проверка:"
FIREFOX_DIR="$HOME/.mozilla/firefox"
if [ -d "$FIREFOX_DIR" ]; then
echo " ✓ Директория Firefox найдена: $FIREFOX_DIR"
else
echo " ✗ Директория Firefox не найдена: $FIREFOX_DIR"
echo " Убедитесь что Firefox установлен и вы авторизованы на YouTube"
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: Cookies file was not created" >&2
fi
# Если был старый файл, оставляем его
if [ -f "$COOKIES_FILE" ]; then
if [ "$VERBOSE" = "1" ]; then
echo "⚠️ Оставляю существующий файл cookies без изменений"
fi
exit 0
else
exit 1
fi
fi