mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-19 14:32:40 +00:00
add bypass-js-cookies-anti-bot-on-website-dump-with-wget.gmi
This commit is contained in:
parent
16da80bd45
commit
9361678169
2 changed files with 86 additions and 0 deletions
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Копіювання Веб-сайту з обходом анти-бот захисту через 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
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
### Нотатки
|
### Нотатки
|
||||||
|
|
||||||
|
=> bypass-js-cookies-anti-bot-on-website-dump-with-wget.gmi 2025-09-18 Копіювання Веб-сайту з обходом анти-бот захисту через wget
|
||||||
=> setup-anonymous-ftp-server.gmi 2025-09-17 Організація гостьового сервера FTP
|
=> setup-anonymous-ftp-server.gmi 2025-09-17 Організація гостьового сервера FTP
|
||||||
=> my-alfis-dns-preset-on-yggdrasil-mycelium-router.gmi 2025-09-17 Мій пресет Alfis DNS на роутері Yggdrasil / Mycelium
|
=> my-alfis-dns-preset-on-yggdrasil-mycelium-router.gmi 2025-09-17 Мій пресет Alfis DNS на роутері Yggdrasil / Mycelium
|
||||||
=> install-mycelium-network-router-in-linux.gmi 2025-09-16 Встановлення роутера мережі Mycelium в Linux
|
=> install-mycelium-network-router-in-linux.gmi 2025-09-16 Встановлення роутера мережі Mycelium в Linux
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue