gemlog/public/uk/bypass-js-cookies-anti-bot-on-website-dump-with-wget.gmi
2025-09-18 13:22:21 +03:00

85 lines
No EOL
7.7 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Копіювання Веб-сайту з обходом анти-бот захисту через wget
В рамках проєкту з реставрації українських Веб-архівів, я періодично роблю "сирі" дампи деяких Веб-сайтів, на випадок їх зникнення з онлайну. Утім один з ресурсів, який мене зацікавив (https://prolinux.pp.ua/news/prolinuxua-stopped.html) - використовував динамічний анти-бот захист на основі JavaScript + Cookies, перший з яких утиліта wget обробляти не вміє, через що цей сайт також не може проіндексуватись проєктом Web-archive:
=> https://web.archive.org/web/20231130201641/https://prolinux.pp.ua/?i=1
Тобто у цьому випадку, його сторінка віддає кравлеру наступний код, точніше логічне завдання для клієнт-сайду, результат якого потрібно зберегти до Cookies та застосувати для подальших запитів:
``` html
<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>
```
Колись я вже мав подібний досвід (з логінами), тому швидко знайшов рішення для цього сайту і написав відповідний гайд:
=> https://codeberg.org/uarchive/prolinux.pp.ua#readme
За одно вирішив поділитись рішенням і тут, адже принцип роботи може бути корисним не тільки для архівації, але якщо ви хочете отримати копію сайту для читання в офлайн а той - має схожі заморочки.
Це звісно не є універсальним рішенням, якщо сайт не віддає сторінки без JavaScript в принципі (що в плані SEO сьогодні зустрічається рідко) або використовуються якісь інші, більш складні алгоритми, наприклад на основі майнингу типу Anubis:
=> https://github.com/TecharoHQ/anubis
## wget
Типова команда для отримання локальної копії звичайного сайту виглядає наступним чином:
``` bash
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 найпростіше це зробити скриптом:
=> https://gist.githubusercontent.com/hackerb9/d382e09683a52dcac492ebcdaf1b79af/raw/fcc8dcc0b8c3ca1d81e5ba2fb8d4f346dfe0a511/extract_cookies.sh
``` bash
chown +x extract_cookies.sh
extract_cookies.sh > cookies.txt
```
* опціонально, з цього файлу можна видалити все, що не співпадає з хостом у прикладі - `prolinux.pp.ua`
В принципі, можна й без скрипта вище руками зкопіювати значення вкладки, якщо не боїтесь помилитись з синтаксисом (Ctrl+Shift+i > Storage > Cookies)
``` cookies.txt
# Netscape HTTP Cookie File
prolinux.pp.ua FALSE / FALSE 1758187902409 __test c2343463c82123417efd87dadb45678
```
### --user-agent
Для wget важливо вказати такий само `--user-agent` яким було отримано значення Cookies. Тут можна ввести в Google запит:
=> https://www.google.com/search?q=get+current+user+agent+online
* для Firefox, там виводиться рядок типу:
```
Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0
```
## P.S.
Як бачите, у конкретно цьому випадку - все відносно просто: якщо зрозуміти принцип взаємодії Cookies з wget, то можна легко застосувати дану логіку й для схожих завдань. Саму команду імпорту можна трохи адаптувати, але частину локальної адаптації я вже виконаю окремо.
Оскільки я не впевнений чи варто розміщувати дані цього сайту на Codeberg, можливо хтось доєднається і створить в себе додаткову локальну копію за прикладом вище і коли автор блогу повернеться - ми зможемо таким чином підстрахувати його роботи від втрати даних.
## Посилання
=> https://devzone.org.ua/post/kopiiuvannia-veb-saytu-z-obkhodom-anty-bot-zakhystu-z-wget Веб-версія цього матеріалу з коментарями на DevZone