# 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()`: Главная асинхронная функция, которая оркеструет весь процесс (получение данных, цикл по каналам, вызов отписки, задержки, отчет). --- Удачи и будьте осторожны!