#!/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 из браузера и сохраняем во временный файл # Используем главную страницу YouTube для получения всех необходимых куков # --no-download - не скачивать видео # --skip-download - пропустить скачивание if [ "$VERBOSE" = "1" ]; then yt-dlp \ --cookies-from-browser "$BROWSER" \ --cookies "$TEMP_FILE" \ --no-download \ --skip-download \ "https://www.youtube.com" > /dev/null 2>&1 else yt-dlp \ --cookies-from-browser "$BROWSER" \ --cookies "$TEMP_FILE" \ --no-download \ --skip-download \ --quiet \ "https://www.youtube.com" > /dev/null 2>&1 fi EXIT_CODE=$? # Функция проверки валидности куков 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