
curlと似ていますが、AnubisやCloudflareのボット対策を回避します。
$ nix run github:fzakaria/anubis-fetch -- https://lore.kernel.org/linux-mm/some-thread/T/
高速な(Go製)CLIツール。Anubis のProof-of-Wall(PoW)と Cloudflare のフィンガープリントチェックをかいくぐってURLを取得します。チャレンジをプロセス内で解決し、本当に必要なときだけ実際のブラウザにフォールバックします。
lore.kernel.org、GNOME、kernel.org など、ますます多くのサイトが Anubis の背後にあります。Anubis は、コンテンツを提供する前にブラウザに SHA-256 の proof-of-work を解かせるボット対策壁です。スクレイパーを止めるには最適ですが、単にメーリングリストのスレッドを curl で取得したいだけの あなた を止めるのにも最適です。
$ curl -s https://lore.kernel.org/linux-mm/some-thread/T/ | grep -o '<title>.*</title>'
<title>Making sure you're not a bot!</title> # 🤢
anubis-fetch なら実際のページを取得できます:
$ anubis-fetch https://lore.kernel.org/linux-mm/some-thread/T/ | grep -o '<title>.*</title>'
<title>[PATCH 0/2] ...</title> # 🥳
ボット対策壁は2つの異なる層に存在し、anubis-fetch は両方を、最もコストの低い手順から順に処理します。
techaro.lol-anubis-auth)を発行します。ブラウザは次回訪問時に再チャレンジされません。私たちも同様です。Cookie はホストごとに永続化されます(Cookie の永続化 参照)。req を通して、実際のChromeになりすまして送信されます(同一の TLS/JA3 + HTTP/2 フィンガープリント)。これにより Cloudflare の受動的なフィンガープリント もクリアされます。応答が Anubis チャレンジだった場合、nonce を総当たりで見つけ出し、送信します。ブラウザ不要、約0.6秒。chromedp を使ってヘッドレス Chromium を操作し、サイトが提供する任意のJavaScriptを実行します。[!NOTE] フォールバックは以下の場合に発動します:Anubis の
preact/metarefreshチャレンジ方式、未知または将来の方式、総当たりが困難な難易度、解決策の拒否、または Cloudflare の アクティブ JS チャレンジ(Managed Challenge / Turnstile / "I'm Under Attack")。なりすましは 受動的 Cloudflare をクリアします。アクティブなJS層をクリアできるのはブラウザだけです。そのためanubis-fetchは「遅くなる」だけで「壊れる」ことはありません。
ブラウザを使うと約4倍遅くなり、毎回約200MBのChromiumを読み込む必要があるからです。プロセス内ソルバーが一般的なケースであり、ブラウザはセーフティネットです。
| パス | 実時間 | Chromium が必要 |
|---|---|---|
| ソルバー(Anubis proof-of-work) | ~0.6s | いいえ |
| ブラウザフォールバック | ~2.0s | はい |
Anubis はチャレンジをJSONとしてページに埋め込みます:
{"rules":{"algorithm":"fast","difficulty":4},
"challenge":{"id":"…","method":"fast","randomData":"6214bd88…","difficulty":4}}
解決するには、hex(sha256(randomData ‖ nonce)) の先頭が difficulty 個のゼロ文字で始まるような nonce を見つける必要があります(nonce は10進数の文字列です)。その後、答えを次のように送り返します:
GET /.within.website/x/cmd/anubis/api/pass-challenge?id=…&response=<hash>&nonce=<n>&redir=<url>&elapsedTime=<ms>
…これにより認証Cookieが設定され、実際のページにリダイレクトされます。難易度4(lore/kernel.org/GNOME のデフォルト)は約65,000ハッシュで、Goでは1ミリ秒未満です。
直接実行:
$ nix run github:fzakaria/anubis-fetch -- <url>
プロファイルにインストール:
$ nix profile install github:fzakaria/anubis-fetch
または自分のflakeに追加:
{
inputs.anubis-fetch.url = "github:fzakaria/anubis-fetch";
# その後、例えば home.packages / environment.systemPackages に:
# inputs.anubis-fetch.packages.${system}.default
}
$ anubis-fetch [flags] URL
# HTML を標準出力へ
$ anubis-fetch https://lore.kernel.org/linux-mm/some-thread/T/
# 読みやすいプレーンテキスト
$ anubis-fetch --text https://lore.kernel.org/linux-mm/some-thread/T/
# 軽量/高速のみ — スクリプト内で便利。ブラウザが必要になる場合、終了コード3で終了
$ anubis-fetch --no-browser https://example.com/ && echo "got it"
正常に取得した後、認証Cookieは
$XDG_CACHE_HOME/anubis-fetch/cookies/<host>.json に書き込まれます
(~/.cache/… にフォールバック)。
次回そのホストにアクセスするときは、proof-of-workもブラウザも不要で直接通過できます。
ちょうどブラウザの再訪問と同じです。
ブラウザフォールバック経由で得られたCookieも保存されるため、次回以降は高速なHTTPパスを使用できます。
無効にするには --no-cache を使用するか、ファイルを削除して再解決を強制します。
すべてはflakeを通じて配線されています:
$ nix develop # 開発シェル:go、gopls、chromium、treefmt
$ go test ./... # ユニットテスト(ネットワークなしの密閉環境)
$ nix build # ラップされたバイナリをビルド
$ nix flake check # ビルド + テスト + 書式チェック
$ nix fmt # treefmt を使って Go + Nix をフォーマット(gofmt + alejandra)
proof-of-workの実装は、Anubis自身が公開しているテストベクトル(sha256("hunter" + "0"))に対して固定されており、ハッシュ構築のずれがあれば、無言で不正な結果を返すのではなくユニットテストで失敗します。
| フラグ | 意味 |
|---|
--text | HTML ではなく読みやすいプレーンテキストを出力 |
--timeout MS | ステップごとのタイムアウト(ミリ秒、デフォルト 30000) |
--ua STRING | User-Agent を上書き |
--browser | ソルバーをスキップし、即座にヘッドレスブラウザを使用 |
--no-browser | ブラウザを使用しない。ソルバーが適用できない場合は終了コード 3 で終了 |
--no-cache | 永続的なCookie jarの読み書きを行わない |