Для ЛЛ: скрипт позволяет скачивать моды с сайта top-mods .ru без ожидания. Если файлы расположены на modsfire .com или sharemods .com, скачивание начинается сразу. Скачать скрипт можно в разделе Установка. В статье описывается анализ функций "ожидание", и способы их обхода.
Пробелы пред точками добавлены умышленно, что бы не превращались в бессмысленные ссылки.
В начале поясню, прекрасно понимаю для чего все это: ожидание перед загрузкой, перенаправления, реклама и т.д. Ресурсам необходимо монетизироваться, придумывать способы дольше удерживать пользователя на странице, в том числе что-бы засчитался показ рекламного материала. Подобные ресурсы предоставляют возможность условно-бесплатно пользоваться теми или иными услугами. Просто держите это в уме, и добавляйте полезные для Вас ресурсы в список исключения блокировщиков рекламы. За исключением тех, кто перекрывает контент вплывающими баннерами, или пихают баннеры после каждого абзаца статьи. Нет им прощения = )
Не вдаваясь сильно в подробности, появилась необходимость обновить пачку модов, ~80 для RimWorld. Мало того, что было ожидание на файловом хостинге, так еще и сам сайт с модами его добавил. top-mods .ru, возможно, не самый лучший пример, потому что там после регистрации ожидание пропадает (хотя я и не проверял). Он просто попался под руку, и интересен как пример подобных функций ожидания.
Я постараюсь описать пошагово, как можно обходить их, на что обращать внимание, и что с этим можно сделать.
Обход top-mods .ru
На страницах сайта перед загрузкой предлагается подождать тридцать секунд. После ожидания появляются кнопки перехода к скачиванию, в моем случае две, Скачать и Зеркало. Осмотрим пациента в инспекторе Google Chrome. Нажимаем на клавиатуре [ ctrl + shift + C ] и жмем на интересующий нас блок.
Мы видим тег div#timer_1 и сразу же под ним div#timer_2. Нижний скрыт изначально и появляется, когда таймер заканчивается. Значит, все что мы должны сделать - это сразу после загрузки страницы удалить div#timer_1 (что-бы не мешался) и отобразить div#timer_2. И все.
Переходим к написанию скрипта в браузерном расширении Byte Eight Lab - MultiTool (для Google Chrome). Про его установку в самом конце статьи, в разделе Установка, там же можно скачать уже готовый скрипт.
Весь код, проделывающий все выше описанное, сводится всего к паре строк:
Единственно что добавим еще, это DOMContentLoaded, иначе скрипт выполнится, когда на странице нужных элементов еще нет.
И важно не забыть в настройках указать https://top-mods .ru/* что-бы скрипт выполнялся на всех страницах. И так же для всех остальных доменов, о которых будет ниже.
Сохраняем, включаем скрипт, обновляем страницу, видим, что сразу доступны все кнопки.
Обход modsfire .com
Попадая на страницу, нас приветствует кнопка GENERATE LINK (которая еще может быть скрыта под блоком перенаправляющая на рекламу). Посмотрим как она работает. После клика пять секунд делает вид что генерирует ссылку, после меняется на DOWNLOAD LINK, которая нечего не скачивает, а направляет нас на еще одну страницу. Пока что вернемся назад, и разберемся с первой страницей.
Переходим в инспектор, и наблюдаем за изменениями.
Видим, что кнопка - это ссылка, имеет класс download-button, но изначально у нее отсутствует атрибут href. Там же в инспекторе, во вкладке "Сеть" можно заметить, что никакие запросы на сервер не отправляются. Значит ссылка была на странице изначально. Поищем, откуда же она берется. На это может пролить свет функция, которая обрабатывает событие click по этой кнопке. Ищем вкладку "Прослушивание событий" (элемент должен быть выделен).
Любой обработчик может содержать нужный нам код. Но всегда в первую очередь стоит проверять самый очевидный. А именно, тот который привязан непосредственно к элементу, в нашем случает это a .download-button. Нажмем на него и посмотрим что там внутри.
var btn = $('.download-button') - наша кнопка помещается в переменную
btn .click(function(){... - привязывается событие click
Далее по порядку, проверяет btnClicked - было ли нажатие на кнопку ранее. Если нет, вставляет html в кнопку, эмитирующий генерацию. И самое интересное setTimeout - таймер, который через определенное время изменит вид кнопки, и... добавит атрибут attr('href', btnHref). Это именно то, что мы и искали, переменная btnHref очевидно хранит ссылку. В третьей строке кода на скрине видим: var btnHref = btn.attr('href'); То есть ссылка у этой кнопки была изначально, скрипт просто перенес ее в переменную и удалил атрибут.
Тут тоже все довольно просто, но как всегда есть одно но. Так же как мы это сделали выше может не получится, DOMContentLoaded может выполнится уже после того как отработается скрипт удаляющий href из кнопки. Пойдем другим путем, мы вообще не будем дожидаться загрузки страницы и перейдем по ссылке сразу, как она появится на странице.
Расширение Byte Eight Lab - MultiTool встраивает код сразу, как становится это возможно, до загрузки контента, что позволяет нам воспользоваться MutationObserver. Это наблюдатель, который будет сообщать обо всех изменениях на странице. Нас интересуют новые элементы, они будут содержаться в addedNodes. Перебирая элементы, найдем a .download-button.
Нашли, сразу переходим по ссылке location .href = node .href; В итоге получилось, что страница даже не успела загрузиться до конца, как мы уже переходим далее.
После запуска скрипта происходит удивительное, файл начинает скачиваться сразу, хотя у нас должна была быть еще одна страница с рекламой и кнопкой. Оказывается на второй странице такая же кнопка a .download-button, наш скрипт нашел ее, и точно так же перешел по ссылке location .href = node .href; она уже содержала прямую ссылку на файл.
Обход sharemods .com
Аналогичным образом сначала просто наблюдаем за поведением. Нас встречает кнопка Create download link, через шесть секунд меняется на Download link is ready. Повторное нажатие перезагружает страницу, при этом адрес не меняется, даже не добавляется GET параметр в адрес. Как правило, такое поведение свидетельствует о том, что был передан POST запрос, или установлена cookie. Проверить эту теорию можно в инспекторе, во вкладке "Сеть". Повторяем действия и смотрим на загруженную страницу, она будет самой первой в списке.
Метод запроса: POST - подтверждает догадку о том, что была отправлена форма.
Проверим HTML:
Значит все что нужно сделать - отправить форму сразу, как она появится на странице, так же через MutationObserver. Единственным отличием будет только элемент, который нужно найти, в этот раз это form#dForm.
Когда нужный элемент найден, выполняем node .submit(); это отправит форму. На следующей странице появляется кнопка Start Download, которая уже содержит прямую ссылку на файл. Посмотрим на нее в инспекторе:
a#downloadbtn - будем дополнительно искать и ее.
И сразу переходим по ссылке.
Итог
Все вышеописанное я собрал в один скрипт, добавил только определение текущего хоста, и выполнение кода соответствующего этому хосту. Подобный обход можно реализовать на многих ресурсах, но далеко не на всех. Если администрация реализует функцию немного белее ответственно чем никак, например контролировать время удаленно, передавая ссылку только когда оно вышло, обойти такое будет невозможно. С другой стороны, не узнаешь, пока не попробуешь разобраться самостоятельно.
Установка
Устанавливаем расширение Byte Eight Lab - MultiTool для Chrome
Скачиваем скрипт Быстрый переход к скачиванию.json
Кликаем по значку расширения, затем во вкладке "Страница" в самом низу, в блоке "Встраиваемые скрипты и стили" жмем добавить.
Откроется вкладка, в ней переходим во вкладку "Настройки", и загружаем скрипт.