diff --git a/README.md b/README.md index e13d207..489357c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,98 @@ -# youtube_mass_unsubscriber +# 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()`: Главная асинхронная функция, которая оркеструет весь процесс (получение данных, цикл по каналам, вызов отписки, задержки, отчет). + +--- + +Удачи и будьте осторожны! \ No newline at end of file