November 13, 2024

Ломаю Яндекс.Музыку: снятие временного лимита на прослушивание в фоне

Доброго времени суток! Яндекс.Музыка - по истине лучший бесплатный сервис для прослушивания музыки, которому нет аналогов. Я очень ценю этот сервис и его функцию "Волна", которая всегда мне подкидывает приятные треки по моему вкусу, которых я ранее не слышал. Это играет большую роль в мотивации, когда я пишу какой-либо проект на ассемблере. Даже сейчас я пишу эту статью под музыкальную волну от Яндекс.Музыки!

Но в Яндекс.Музыке, очевидно, есть платные функции. И пусть бы, но сервис ограничивает бесплатное использование, например:

  1. Нельзя слушать музыку без аккаунта
  2. Нельзя слушать музыку более 5 минут на фоне
  3. Нельзя слушать музыку более 30 минут

Поправка: слушать можно, но каждые 5 или 30 минут музыку будут останавливать, и вот ты пишешь код, а потом невзначай замечаешь тишину в ушах, и это раздражает.

Сегодня мы будем исправлять это ограничение, чтобы без подписки можно было слушать музыку неограниченное количество времени на фоне и просто на сервисе!

Хочу заметить, что этот способ я открыл сам около года назад, и пользуюсь им до сих пор. Сами судите о работоспособности.

Что потребуется

Навыки, которые пригодятся Вам для понимания происходящих вещей:

  1. Знание JavaScript
  2. Умение пользоваться браузером
  3. Знание PHP
  4. Умение разворачивать PHP-сервер
  5. Умение анализировать обфусцированный JavaScript-код (но это по желанию, ведь в своём Телеграм-канале я предоставлю уже пропатченный .js файл)

Принцип работы временного лимита Яндекс.Музыки и способ обхода

Итак, если Вы владеете вышеперечисленными умениями и навыками, я начинаю объяснять вещи, которые я открыл год назад...

Временной лимит, к счастью для нас, пиратов, встроен на клиентской стороне. То есть, на стороне JavaScript.
(Яндекс, пожалуйста, не переносите ограничитель на сервер)

А значит ход действий следующий:

  1. Мы выкачиваем главный JS-скрипт
  2. Прогоняем его в Beautifier, и ищем участок, отвечающий за остановку музыки
  3. Патчим этот участок. Например, имитируем нажатие на кнопку "Продолжить прослушивание", согласно классу элемента
  4. С помощью расширений отключаем все CSP и CORS, разрешаем небезопасный контент, и с помощью расширения ResourceOverride подменяем в реальном времени подгрузку index.js на наш пропатченный index.js
  5. Готово!
Расширения, которые потребуются - ResourceOverride, CORS unblock, CSP unblock. На остальное не обращайте внимание

И да, забыл сказать, что всё происходить будет на Arch Linux, на браузере Chromium. Но это не имеет значения, ведь главное понять суть обхода, а проделать это можно и на Firefox, и на Windows.

Ломаем временной лимит

Итак, приступаем к тому, за чем Вы все сюда пришли... Заходим на Яндекс.Музыку, входим в аккаунт, и скачиваем index.js по следующему пути - https://music.yandex.ru/index.js

Скрипт частично обфусцирован, но деобфусцировать ничего не надо, нам надо лишь прогнать скрипт через Beautifier, чтобы найти нужный нам участок.

Скрипт после правки всех табуляций через JS-Beautifier

Далее ищем текст "Музыка без остановки" или "Бесплатно слушать музыку можно только в".

Находим следующий участок:

Структура временного лимита состоит в таком порядке, что сначала музыка останавливается, а потом появляется окошко "Музыка без остановки". Это нам снова сыграло на руку, потому что мы можем тут же вместо создания окошка продолжить проигрывание музыки.

Здесь нам нужно просто убрать обработчик внутри return function(i) { ... } и соответственно дописать нажатие на кнопку запуска трека. Вот так:

d-icon_play это класс кнопки старта проигрывания, класс узнать можно с помощью "анализа исходного кода страницы" в браузере (на F12).

Теперь сохраняем наш пропатченный index.js, и приступаем к следующему этапу...

Перехват index.js в реальном времени

Для начала, нам надо запустить PHP-сервер, чтобы сервер смог подгрузить наш скрипт вместо оригинального index.js.

В Arch Linux я это делаю просто с помощью команды sudo php -S 192.168.0.105:80

Отлично, теперь приступаем к тюнингу браузера. У меня это Chromium.

Устанавливаем вышеперечисленные расширения. Напомню: CORS Unblock, CSP Unblock, ResourceOverride.

Включаем CORS Unblock и CSP Unblock, после чего настраиваем ResourceOverride следующим образом:

Звёздочка в ссылка "https://music.yandex.ru/index.js*" нужна по причине того, что сервер передаёт версию в виде "index.js?v=VERSION", но мы всегда будем подгружать одну и ту же версию, у меня она работает, напомню, уже год.

Финиш

Итак, когда Вы попробуете зайти на Яндекс.Музыку после всех действий, перед Вами откроется пустая белая страница. Это нормально, потому что браузер отказался подгружать HTTP-контент (PHP-сервер, на котором висит скрипт). Всё просто - нужно найти в настройки сайта, и найти пункт "Insecure content", после чего установить значение "Allow".

Готово! Теперь когда Вы зайдёте на Яндекс.Музыку, у Вас пойдут запросы на Ваш PHP-сервер на скрипт index.js:

Если так произошло, значит Вы всё сделали правильно, и теперь можно слушать музыку бесконечно!

Окно будет появляться в таком виде:

Но музыка мгновенно будет возобновляться, так что никаких прерываний не слышно совсем, ну а окно не мешает - включил "Волну" на фоне, да и пишешь код, а музыка сама подбирается там, а окно пусть хоть 100 раз вылезет.

Скрипт в моём Телеграм-канале - https://t.me/fasmgenius

Спасибо за внимание.