2025-12-16 10:15:50 +03:00
|
|
|
|
#!/bin/bash
|
2025-12-20 04:58:52 +03:00
|
|
|
|
# Скрипт для получения cookies YouTube через yt-dlp из Firefox
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Предназначен для запуска на Ubuntu 24.04 с авторизованным Firefox
|
|
|
|
|
|
# Результат копируется через cron на серверы со службами скачивания
|
2025-12-16 10:15:50 +03:00
|
|
|
|
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
|
|
COOKIES_FILE="$SCRIPT_DIR/youtube_cookies.txt"
|
2025-12-20 04:58:52 +03:00
|
|
|
|
BROWSER="firefox"
|
2025-12-25 21:38:13 +03:00
|
|
|
|
TEMP_FILE="${COOKIES_FILE}.tmp"
|
2025-12-16 10:15:50 +03:00
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Определяем HOME пользователя (работает для sudo и обычного запуска)
|
2025-12-20 04:58:52 +03:00
|
|
|
|
if [ -n "$SUDO_USER" ]; then
|
|
|
|
|
|
REAL_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
|
|
|
|
|
|
export HOME="$REAL_HOME"
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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
|
2025-12-20 04:58:52 +03:00
|
|
|
|
fi
|
2025-12-16 10:15:50 +03:00
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
|
|
|
|
echo "Получение cookies YouTube из Firefox..."
|
|
|
|
|
|
echo "Файл cookies будет сохранен в: $COOKIES_FILE"
|
|
|
|
|
|
fi
|
2025-12-16 10:15:50 +03:00
|
|
|
|
|
|
|
|
|
|
# Проверяем наличие yt-dlp
|
|
|
|
|
|
if ! command -v yt-dlp &> /dev/null; then
|
2025-12-25 21:38:13 +03:00
|
|
|
|
echo "ERROR: yt-dlp не найден в системе" >&2
|
|
|
|
|
|
echo "Установите: sudo apt install yt-dlp (Ubuntu) или pip install yt-dlp" >&2
|
2025-12-16 10:15:50 +03:00
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
|
|
|
|
echo "Получаю cookies..."
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Удаляем старый временный файл
|
|
|
|
|
|
rm -f "$TEMP_FILE"
|
2025-12-17 17:53:34 +03:00
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Извлекаем cookies из браузера и сохраняем во временный файл
|
|
|
|
|
|
# Используем главную страницу YouTube для получения всех необходимых куков
|
2025-12-17 17:53:34 +03:00
|
|
|
|
# --no-download - не скачивать видео
|
2025-12-20 04:58:52 +03:00
|
|
|
|
# --skip-download - пропустить скачивание
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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
|
2025-12-17 17:53:34 +03:00
|
|
|
|
|
|
|
|
|
|
EXIT_CODE=$?
|
|
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Функция проверки валидности куков
|
|
|
|
|
|
check_cookies() {
|
|
|
|
|
|
local file="$1"
|
|
|
|
|
|
local current_time=$(date +%s)
|
|
|
|
|
|
|
|
|
|
|
|
# Проверяем существование файла
|
|
|
|
|
|
if [ ! -f "$file" ]; then
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-12-17 17:53:34 +03:00
|
|
|
|
# Проверяем, что файл содержит данные (не только заголовки)
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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"
|
|
|
|
|
|
|
|
|
|
|
|
# Собираем статистику для вывода
|
2025-12-17 17:53:34 +03:00
|
|
|
|
COOKIE_LINES=$(grep -v '^#' "$COOKIES_FILE" | grep -v '^$' | wc -l)
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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)
|
2025-12-17 17:53:34 +03:00
|
|
|
|
|
2025-12-25 21:38:13 +03:00
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
2025-12-17 17:53:34 +03:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "✅ Cookies успешно сохранены в $COOKIES_FILE"
|
2025-12-25 21:38:13 +03:00
|
|
|
|
echo " Всего строк с cookies: $COOKIE_LINES"
|
|
|
|
|
|
echo " YouTube-куков: $YOUTUBE_COOKIES"
|
|
|
|
|
|
echo " Важных куков: $IMPORTANT_COOKIES"
|
2025-12-17 17:53:34 +03:00
|
|
|
|
echo ""
|
2025-12-25 21:38:13 +03:00
|
|
|
|
echo "Файл готов к копированию на серверы через cron"
|
2025-12-17 17:53:34 +03:00
|
|
|
|
else
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Минимальный вывод для cron (можно логировать в файл)
|
|
|
|
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - YouTube cookies updated: $YOUTUBE_COOKIES cookies, $IMPORTANT_COOKIES important"
|
2025-12-17 17:53:34 +03:00
|
|
|
|
fi
|
2025-12-25 21:38:13 +03:00
|
|
|
|
|
|
|
|
|
|
exit 0
|
2025-12-16 10:15:50 +03:00
|
|
|
|
else
|
2025-12-25 21:38:13 +03:00
|
|
|
|
# Очищаем временный файл при ошибке
|
|
|
|
|
|
rm -f "$TEMP_FILE"
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "❌ Ошибка: не удалось получить валидные YouTube-куки"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Возможные причины:"
|
|
|
|
|
|
echo "1. В Firefox нет куков для YouTube"
|
|
|
|
|
|
echo "2. Откройте YouTube в Firefox и войдите в аккаунт"
|
|
|
|
|
|
echo "3. Все куки просрочены - обновите их в браузере"
|
|
|
|
|
|
echo ""
|
2025-12-20 04:58:52 +03:00
|
|
|
|
else
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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 "Проверка:"
|
2025-12-20 04:58:52 +03:00
|
|
|
|
FIREFOX_DIR="$HOME/.mozilla/firefox"
|
2025-12-25 21:38:13 +03:00
|
|
|
|
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
|
2025-12-20 04:58:52 +03:00
|
|
|
|
fi
|
2025-12-25 21:38:13 +03:00
|
|
|
|
|
|
|
|
|
|
# Если был старый файл, оставляем его
|
|
|
|
|
|
if [ -f "$COOKIES_FILE" ]; then
|
|
|
|
|
|
if [ "$VERBOSE" = "1" ]; then
|
|
|
|
|
|
echo "⚠️ Оставляю существующий файл cookies без изменений"
|
|
|
|
|
|
fi
|
|
|
|
|
|
exit 0
|
2025-12-20 04:58:52 +03:00
|
|
|
|
else
|
2025-12-25 21:38:13 +03:00
|
|
|
|
exit 1
|
2025-12-20 04:58:52 +03:00
|
|
|
|
fi
|
2025-12-16 10:15:50 +03:00
|
|
|
|
fi
|
|
|
|
|
|
|