
curl की तरह, लेकिन यह Anubis और Cloudflare bot-walls को पार कर जाता है।
$ nix run github:fzakaria/anubis-fetch -- --text https://lore.kernel.org/
Anubis प्रूफ-ऑफ-वर्क चुनौतियों के पीछे URL प्राप्त करने के लिए एक Go CLI। यह लीगेसी SHA-256 और WASM चुनौतियों को इन-प्रोसेस हल करता है, और फ़ॉलबैक के रूप में हेडलेस Chromium का उपयोग करता है।
lore.kernel.org और kernel.org जैसी साइटें पेज परोसने से पहले प्रूफ ऑफ वर्क की आवश्यकता के लिए Anubis का उपयोग करती हैं। एक साधारण HTTP क्लाइंट को अनुरोधित सामग्री के बजाय चुनौती पेज प्राप्त हो सकता है। anubis-fetch चुनौती को हल करता है, उत्तर सबमिट करता है, और परिणामी पेज को stdout पर लिखता है।
req का उपयोग करता है। यह निष्क्रिय बॉट जाँचों में मदद कर सकता है, जिसमें Cloudflare की भी शामिल है।
Anubis की fast और slow विधियों के लिए, टूल एक nonce की गणना करता है और सीधे उत्तर सबमिट करता है। WASM विधियों sha256, argon2id, और hashx के लिए,
यह साइट का मॉड्यूल डाउनलोड करता है और इसे Go में
wazero के साथ चलाता है।chromedp द्वारा नियंत्रित किया जाता है, साइट द्वारा परोसी गई चुनौती कोड चलाता है।ब्राउज़र फ़ॉलबैक Anubis की preact और metarefresh विधियों, और Cloudflare चुनौती पेजों (cf-mitigated: challenge वाली प्रतिक्रियाएँ) को संभालता है।
टूल तब भी फ़ॉलबैक करता है जब लीगेसी SHA-256 कठिनाई अपनी सीमा से अधिक हो जाती है,
WASM निष्पादन विफल हो जाता है या टाइमआउट हो जाता है, या Anubis किसी समाधान को अस्वीकार कर देता है।
Chromium से शुरू करने के लिए --browser का उपयोग करें, या HTTP पथ की आवश्यकता के लिए --no-browser का उपयोग करें। सभी तीन WASM विधियाँ --no-browser के साथ काम करती हैं।
नेटिव सॉल्वर प्रत्येक फ़ेच के लिए ब्राउज़र प्रक्रिया शुरू करने से बचता है। जिन चुनौतियों को फ़ॉलबैक की आवश्यकता होती है, उनके लिए Chromium अभी भी Nix पैकेज में शामिल है।
मूल SHA-256 पथ के लिए अनुमानित फ़ेच समय:
| पथ | वॉल टाइम | Chromium चाहिए |
|---|---|---|
| इन-प्रोसेस SHA-256 सॉल्वर | ~0.6s | नहीं |
| ब्राउज़र फ़ॉलबैक | ~2.0s | हाँ |
कठिनाई 2 पर स्थानीय Anubis सर्वर के विरुद्ध WASM फ़ेच समय:
| 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 कुकी सेट करती है और अनुरोधित पेज पर रीडायरेक्ट करती है। कठिनाई 4 के लिए औसतन लगभग 65,536 हैश की आवश्यकता होती है।
sha256, argon2id, और hashx के लिए, Anubis एक WebAssembly मॉड्यूल परोसता है
जो प्रूफ ऑफ वर्क को लागू करता है। anubis-fetch मॉड्यूल डाउनलोड करता है,
चुनौती के hex डेटा को बाइट्स में डिकोड करता है, और डेटा और
कठिनाई को मॉड्यूल को पास करता है। मॉड्यूल एक nonce खोजता है और
ऊपर दिए गए उसी एंडपॉइंट पर सबमिशन के लिए nonce और हैश लौटाता है।
मॉड्यूल wazero का उपयोग करके Go प्रक्रिया के अंदर चलता है, इसलिए ये विधियाँ
--no-browser के साथ काम करती हैं। निष्पादन की मेमोरी और समय सीमाएँ हैं। मॉड्यूल
कठिनाई नियमों को परिभाषित करता है; WASM कठिनाई संख्याएँ लीगेसी SHA-256 विधि से सीधे तुलनीय नहीं हैं।
सीधे चलाएँ:
$ nix run github:fzakaria/anubis-fetch -- <url>
या अपने 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 | यदि HTTP सॉल्वर को ब्राउज़र फ़ॉलबैक की आवश्यकता हो तो 3 के साथ बाहर निकलें |
--no-cache | सहेजी गई कुकीज़ को पढ़ना और लिखना अक्षम करें |
--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/
कुकीज़ प्रति होस्ट
$XDG_CACHE_HOME/anubis-fetch/cookies/<host>.json में सहेजी जाती हैं, या
XDG_CACHE_HOME सेट न होने पर
~/.cache/anubis-fetch/cookies/<host>.json में। एक वैध auth कुकी बाद के अनुरोधों को चुनौती छोड़ने दे सकती है।
Chromium के माध्यम से प्राप्त कुकीज़ भी सहेजी जाती हैं, साथ में Chromium का
User-Agent भी। Cloudflare केवल उस User-Agent के अंतर्गत cf_clearance का सम्मान करता है जिसने इसे अर्जित किया, इसलिए उस होस्ट को बाद के HTTP अनुरोध सहेजा गया User-Agent भेजते हैं
जब तक कि --ua इसे ओवरराइड न करे।
सहेजी गई कुकीज़ के बिना फ़ेच करने के लिए --no-cache का उपयोग करें, या उन्हें त्यागने के लिए होस्ट की फ़ाइल हटा दें। समाप्त या अस्वीकृत कुकी के लिए नई चुनौती की आवश्यकता होती है।
$ nix develop # Go, gopls, Chromium, treefmt
$ go test ./... # Go यूनिट टेस्ट
$ nix build # पैकेज्ड CLI
$ nix flake check # बिल्ड, टेस्ट, और फ़ॉर्मेटिंग
$ nix fmt # Go और Nix फ़ॉर्मेट करें