youtube_mass_unsubscriber/README.md

98 lines
11 KiB
Markdown
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.

# YouTube Mass Unsubscriber Script
Скрипт для браузерной консоли, который помогает автоматизировать процесс отписки от YouTube каналов на вашей странице управления подписками.
**Версия:** 4.0 (Использует SAPISIDHASH для аутентификации)
---
## 🚨 ВНИМАНИЕ / ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ 🚨
* **ИСПОЛЬЗУЙТЕ ЭТОТ СКРИПТ НА СВОЙ СТРАХ И РИСК!**
* Автоматизация действий на платформе YouTube **может нарушать Условия использования** сервиса.
* Использование скрипта **может привести к временным или постоянным ограничениям** вашего аккаунта YouTube.
* YouTube **регулярно обновляет** свой веб-сайт и внутренние API. Любое обновление может **сломать этот скрипт** без предупреждения.
* Разработчик скрипта **не несет ответственности** за любые последствия его использования, включая блокировку аккаунта.
* **Используйте скрипт ответственно!** Рекомендуется устанавливать **значительные задержки** между запросами (несколько секунд) и не использовать его слишком часто.
---
## Как это работает?
Скрипт имитирует действия, которые ваш браузер выполняет при ручной отписке от канала:
1. **Поиск каналов:** Скрипт анализирует внутренние данные страницы YouTube (`window.ytInitialData`) или, в крайнем случае, структуру HTML (DOM), чтобы найти идентификаторы (Channel ID) всех каналов, отображаемых на текущей странице управления подписками (`https://www.youtube.com/feed/channels`).
2. **Получение Ключа API:** Извлекает временный ключ API (`INNERTUBE_API_KEY`) из JavaScript-переменных страницы.
3. **Аутентификация:** Считывает необходимую куку аутентификации (`SAPISID`) из вашего браузера.
4. **Генерация Заголовка:** Создает специальный заголовок `Authorization: SAPISIDHASH ...` на основе вашей куки `SAPISID`, текущего времени и домена YouTube. Этот заголовок требуется для подтверждения подлинности запроса к внутреннему API.
5. **Отправка Запросов:** Для каждого найденного ID канала скрипт отправляет POST-запрос на внутренний API YouTube (`/youtubei/v1/subscription/unsubscribe`), включая полученный ключ API, заголовок авторизации и данные о сессии (контекст).
6. **Задержка:** Между отправкой запросов для разных каналов делается пауза (настраивается), чтобы снизить нагрузку на серверы YouTube и уменьшить риск обнаружения автоматизации.
---
## Требования
* Современный веб-браузер (например, Google Chrome, Mozilla Firefox, Microsoft Edge).
* Вы должны быть **авторизованы** в аккаунте YouTube, подписками которого хотите управлять.
---
## Как использовать
1. **Перейдите на страницу управления подписками** YouTube в вашем браузере:
`https://www.youtube.com/feed/channels`
Убедитесь, что список ваших подписок загрузился и виден на странице.
2. **Откройте Консоль разработчика** в браузере. Обычно это делается нажатием клавиши `F12`. Перейдите на вкладку `Консоль` (Console).
3. **Скопируйте весь код** из файла `youtube_mass_unsubscriber.js` (или из блока кода выше).
4. **Вставьте скопированный код** в поле ввода консоли.
5. **Нажмите клавишу `Enter`**, чтобы запустить скрипт.
6. **Следуйте инструкциям:** Появятся всплывающие окна (`alert`) с предупреждениями и информацией о начале работы. Следите за сообщениями, которые скрипт выводит в консоль там будет информация о ходе выполнения, найденных каналах, успешных отписках и возможных ошибках.
7. **Обработка страниц:** Скрипт обрабатывает только те каналы, которые **видны на текущей загруженной странице**. Если у вас много подписок и они разбиты на несколько страниц, вам нужно будет **перейти на следующую страницу** после завершения работы скрипта и **запустить его снова**.
8. **Проверка результата:** После того, как скрипт завершит работу (появится финальное сообщение `alert`), **обновите страницу** (клавиша `F5`), чтобы увидеть фактические изменения в списке подписок.
---
## Конфигурация
В начале скрипта есть несколько констант, которые можно изменить:
* `DELAY_BETWEEN_REQUESTS_MS`: Время ожидания в миллисекундах между запросами на отписку. **Настоятельно рекомендуется не ставить значение ниже 2000-3000 (2-3 секунды).** Чем выше значение, тем безопаснее для вашего аккаунта.
* *Пример:* `const DELAY_BETWEEN_REQUESTS_MS = 5000;` // Пауза 5 секунд
* `providedContextData`: **ВАЖНО!** Текущая версия скрипта использует жестко заданный объект `context` (данные сессии). Этот объект был добавлен по специфическому запросу и **не будет работать для других пользователей или даже для вас через некоторое время**.
* Для того чтобы скрипт работал универсально, необходимо **заменить этот блок** на код, который динамически получает актуальный контекст со страницы из `window.ytcfg.data_.INNERTUBE_CONTEXT` или `window.yt.config_.INNERTUBE_CONTEXT`. Если вы адаптируете скрипт для общего пользования, удалите или закомментируйте `providedContextData` и раскомментируйте/добавьте функцию для динамического получения контекста. Использование жестко заданного контекста **не рекомендуется для распространения скрипта**.
---
## Возможные проблемы (Troubleshooting)
* **Ошибка `401 Unauthorized`, `Куки SAPISID не найдена` или скрипт внезапно перестает работать:**
* Ваша сессия YouTube могла истечь. Попробуйте **выйти из аккаунта YouTube и зайти снова**.
* Убедитесь, что ваш браузер или расширения (например, блокировщики рекламы или скриптов) **не блокируют куки** для домена `youtube.com`.
* Возможно, YouTube изменил механизм аутентификации, и требуется обновить логику генерации `SAPISIDHASH`.
* **Ошибка `Не найдено ID каналов`, `Channels not found`, или скрипт не находит ваши подписки:**
* YouTube мог изменить HTML-структуру страницы управления подписками или структуру объекта `window.ytInitialData`.
* Функция `getChannelIdsFromPageData()` в скрипте требует обновления для соответствия новым реалиям. Потребуется анализ актуальной структуры страницы.
* **Другие ошибки (400, 403, 500 и т.д.):**
* **400 Bad Request:** Возможно, формат отправляемых данных (payload) неверен или контекст устарел.
* **403 Forbidden:** YouTube мог заблокировать действие с вашего IP или аккаунта из-за подозрительной активности. Увеличьте задержку `DELAY_BETWEEN_REQUESTS_MS` и попробуйте позже.
* **500 Internal Server Error:** Временные проблемы на серверах YouTube. Попробуйте позже.
* Внимательно читайте сообщения об ошибках в консоли они могут дать подсказку.
---
## Структура Кода
Основные функции скрипта:
* `getCookie(name)`: Вспомогательная функция для чтения значения куки.
* `sha1(str)`: Асинхронная функция для вычисления SHA-1 хеша.
* `generateSapisidHashHeader()`: Асинхронная функция для создания заголовка `Authorization: SAPISIDHASH ...`.
* `getApiKey()`: Получает актуальный ключ `INNERTUBE_API_KEY` со страницы.
* `getChannelIdsFromPageData()`: Находит ID каналов для отписки на текущей странице.
* `sendUnsubscribeRequest(channelId, apiKey, context)`: Асинхронная функция, отправляющая запрос на отписку для одного канала.
* `massUnsubscribeWithSapisidHash()`: Главная асинхронная функция, которая оркеструет весь процесс (получение данных, цикл по каналам, вызов отписки, задержки, отчет).
---
Удачи и будьте осторожны!