
Как curl, но обходит бот-защиту Anubis и Cloudflare.
$ nix run github:fzakaria/anubis-fetch -- --text https://lore.kernel.org/
CLI-утилита на Go для загрузки URL, защищённых proof-of-work-задачами Anubis. Она решает устаревшие задачи SHA-256 и WASM внутри процесса, а headless Chromium используется как резервный вариант.
Сайты вроде lore.kernel.org и kernel.org используют Anubis, чтобы
требовать proof of work перед выдачей страницы. Обычный HTTP-клиент может
получить страницу с задачей вместо запрошенного содержимого. anubis-fetch
решает задачу, отправляет ответ и записывает полученную страницу в stdout.
req для имитации TLS- и HTTP/2-отпечатка
Chrome. Это может помочь при пассивных проверках на ботов, включая
проверки Cloudflare. Для методов Anubis fast и slow инструмент
вычисляет nonce и отправляет ответ напрямую. Для WASM-методов sha256,
argon2id и hashx он скачивает модуль сайта и запускает его в Go с
помощью wazero.chromedp выполняет
код задачи, отдаваемый сайтом.Резервный вариант с браузером обрабатывает методы Anubis preact и
metarefresh, а также страницы-задачи Cloudflare (ответы с
cf-mitigated: challenge). Инструмент также переключается на браузер, когда
сложность устаревшего SHA-256 превышает его лимит, выполнение WASM
завершается ошибкой или по таймауту, либо Anubis отклоняет решение.
Используйте --browser, чтобы сразу начать с Chromium, или --no-browser,
чтобы требовать только HTTP-путь. Все три WASM-метода работают с
--no-browser.
Нативный решатель позволяет не запускать процесс браузера для каждой загрузки. Chromium всё равно включён в пакет Nix для задач, которым нужен резервный вариант.
Приблизительное время загрузки для исходного пути SHA-256:
| Путь | Реальное время | Нужен Chromium |
|---|---|---|
| Решатель SHA-256 внутри процесса | ~0.6s | Нет |
| Резервный вариант с браузером | ~2.0s | Да |
Время загрузки WASM против локального сервера Anubis со сложностью 2:
| WASM-метод | Медианное реальное время | Нужен Chromium |
|---|---|---|
| SHA-256 | ~0.025s | Нет |
| Argon2id | ~0.55s-2.33s | Нет |
| HashX | ~0.041s | Нет |
Для методов fast и slow Anubis встраивает задачу в страницу:
{"rules":{"algorithm":"fast","difficulty":4},
"challenge":{"id":"...","method":"fast","randomData":"6214bd88...","difficulty":4}}
Решатель ищет такой nonce, чтобы hex(sha256(randomData || nonce))
начинался с difficulty нулевых символов. Nonce кодируется как десятичная
строка. Ответ отправляется в Anubis:
GET /.within.website/x/cmd/anubis/api/pass-challenge?id=...&response=<hash>&nonce=<n>&redir=<url>&elapsedTime=<ms>
Успешный ответ устанавливает auth-cookie и перенаправляет на запрошенную страницу. Сложность 4 требует в среднем около 65 536 хешей.
Для sha256, argon2id и hashx Anubis отдаёт модуль WebAssembly,
реализующий proof of work. anubis-fetch скачивает модуль, декодирует
hex-данные задачи в байты и передаёт данные и сложность модулю. Модуль ищет
nonce и возвращает nonce и хеш для отправки на тот же endpoint, указанный
выше.
Модуль выполняется внутри процесса Go с помощью wazero, поэтому эти методы
работают с --no-browser. Выполнение ограничено по памяти и времени. Модуль
определяет правила сложности; числа сложности WASM не сравнимы напрямую с
устаревшим методом SHA-256.
Запуск напрямую:
$ nix run github:fzakaria/anubis-fetch -- <url>
Или добавьте input в ваш flake:
{
inputs.anubis-fetch.url = "github:fzakaria/anubis-fetch";
}
Добавьте inputs.anubis-fetch.packages.${system}.default в
home.packages или environment.systemPackages.
anubis-fetch [flags] URL
| Флаг | Действие |
|---|---|
--text | Преобразовать HTML в простой текст |
--timeout MS | Задать таймаут на шаг в миллисекундах; по умолчанию 30000 |
--ua STRING | Задать User-Agent |
--browser | Использовать Chromium напрямую |
--no-browser | Завершиться с кодом 3, если HTTP-решателю нужен резервный вариант с браузером |
--no-cache | Отключить чтение и запись сохранённых cookie |
--help, -h | Вывести справку и завершиться |
# HTML в stdout
anubis-fetch https://lore.kernel.org/
# Простой текст
anubis-fetch --text https://lore.kernel.org/
# Требовать HTTP-путь; проверять код завершения 3
anubis-fetch --no-browser https://lore.kernel.org/
Cookie сохраняются для каждого хоста в
$XDG_CACHE_HOME/anubis-fetch/cookies/<host>.json или
~/.cache/anubis-fetch/cookies/<host>.json, если XDG_CACHE_HOME не задан.
Действительная auth-cookie может позволить последующим запросам пропустить
задачу. Cookie, полученные через Chromium, тоже сохраняются вместе с
User-Agent Chromium. Cloudflare учитывает cf_clearance только при том
User-Agent, с которым он был получен, поэтому последующие HTTP-запросы к
этому хосту отправляют сохранённый User-Agent, если только его не
переопределяет --ua.
Используйте --no-cache, чтобы загружать без сохранённых cookie, или
удалите файл хоста, чтобы отбросить их. Просроченная или отклонённая cookie
требует новой задачи.
$ nix develop # Go, gopls, Chromium, treefmt
$ go test ./... # Go unit tests
$ nix build # Packaged CLI
$ nix flake check # Builds, tests, and formatting
$ nix fmt # Format Go and Nix