devzone.org.ua/post/kopiiuvannia-veb-saytu-z-obkhodom-anty-bot-zakhystu-z-wget.md
2025-11-01 14:28:20 +02:00

7.7 KiB
Raw Blame History

Копіювання Веб-сайту з обходом анти-бот захисту через wget

В рамках проєкту Реставрація українських Веб-архівів, я періодично роблю "сирі" дампи деяких Веб-сайтів, на випадок їх зникнення з онлайну. Утім один з ресурсів, який мене зацікавив - використовував динамічний анти-бот захист на основі JavaScript + Cookies, перший з яких утиліта wget обробляти не вміє, через що цей сайт також не може проіндексуватись проєктом Webarchive.

Тобто у цьому випадку, його сторінка віддає кравлеру наступний код, точніше логічне завдання для клієнт-сайду, результат якого потрібно зберегти до Cookies та застосувати для подальших запитів:

<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("1a24ba9d09a112d4968c63579db51a24"),b=toNumbers("3e244c2eee86c3994890592585b41a24"),c=toNumbers("4f249fe8595e58d63109a7ae2e5c1e24");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; max-age=21600; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="https://prolinux.pp.ua/?i=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>

Колись я вже мав подібний досвід (з логінами), тому швидко знайшов рішення для цього сайту і написав відповідний гайд для архівного репозиторію. За одно вирішив поділитись рішенням і тут, адже принцип роботи може бути корисним не тільки для архівації, але якщо ви хочете отримати копію сайту для читання в офлайн а той - має схожі заморочки.

Це звісно не є універсальним рішенням, якщо сайт не віддає сторінки без JavaScript в принципі (що в плані SEO сьогодні зустрічається рідко) або використовуються якісь інші, більш складні алгоритми, наприклад на основі майнингу (типу Anubis).

wget

Типова команда для отримання локальної копії звичайного сайту виглядає наступним чином:

wget -e robots=off\
    --recursive\
    --timestamping\
    --page-requisites\
    --convert-links\
    --adjust-extension\
    --reject="*/feed"\
    --user-agent="VALUE"\
    --load-cookies="path/to/cookies.txt"\
    --no-check-certificate\
    https://prolinux.pp.ua/
  • -e robots=off - ігнорувати правила robots
  • --recursive - режим кравлера
  • --timestamping - завантажити файли лише в тому випадку, якщо вони новіші, аніж локальні
  • --page-requisites - завантажити елементи, необхідні для коректного відображення веб-сторінки (CSS, JavaScript, медіа)
  • --convert-links - конвертувати посилання у відносний формат для читання офлайн (з локальних файлів)
  • --adjust-extension - додавати відповідні розширення, наприклад .html
  • --reject="*/feed" - локальне правило виключно для цього сайту
  • у випадку саме цього сайту я вказую https з --no-check-certificate бо сертифікат прострочений а посилання ведуть саме на SSL версію
  • про значення аргументів --user-agent і --load-cookies - нижче

Оскільки даний хостинг (або програмне забезпечення сайту) використовує захист JavaScript з використанням випадкового значення Cookies, потрібно спочатку згенерувати його, перейшовши на головну сторінку сайту програмою, яка це все "розуміє" наприклад, через Firefox.

--load-cookies

Тут потрібно "витягнути" згенеровані Cookies у форматі Netscape HTTP Cookie File для подальшого використання з --load-cookies. Для Firefox найпростіше це зробити скриптом:

chown +x extract_cookies.sh
extract_cookies.sh > cookies.txt
  • опціонально, з цього файлу можна видалити все, що не співпадає з хостом у прикладі - prolinux.pp.ua

В принципі, можна й без скрипта вище руками зкопіювати значення вкладки, якщо не боїтесь помилитись з синтаксисом (Ctrl+Shift+i > Storage > Cookies)

# Netscape HTTP Cookie File
prolinux.pp.ua	FALSE	/	FALSE	1758187902409	__test	c2343463c82123417efd87dadb45678

--user-agent

Для wget важливо вказати такий само --user-agent яким було отримано значення Cookies. Тут можна ввести в Google запит - для Firefox, там виводиться рядок типу Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0.

P.S.

Як бачите, у конкретно цьому випадку - все відносно просто: якщо зрозуміти принцип взаємодії Cookies з wget, то можна легко застосувати дану логіку й для схожих завдань. Саму команду імпорту можна трохи адаптувати, але частину локальної адаптації я вже виконаю окремо.

Оскільки я не впевнений чи варто розміщувати дані цього сайту на Codeberg, можливо хтось доєднається і створить в себе додаткову локальну копію за прикладом вище і коли автор блогу повернеться - ми зможемо таким чином підстрахувати його роботи від втрати даних.