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