
curl की तरह, लेकिन यह Anubis और Cloudflare bot-walls को पार कर जाता है।
$ nix run github:fzakaria/anubis-fetch -- https://lore.kernel.org/linux-mm/some-thread/T/
एक तेज़ (Go) CLI जो Anubis प्रूफ-ऑफ-वर्क दीवारों और Cloudflare फ़िंगरप्रिंट जाँचों के पीछे से URL प्राप्त करता है — चुनौती को इन-प्रोसेस हल करता है, और केवल तभी वास्तविक ब्राउज़र का उपयोग करता है जब आवश्यक हो।
बढ़ती संख्या में साइटें — lore.kernel.org, GNOME, kernel.org, और कई अन्य — Anubis के पीछे बैठी हैं, जो एक बॉट-दीवार है जो आपके ब्राउज़र को कोई सामग्री प्रस्तुत करने से पहले SHA-256 प्रूफ-ऑफ-वर्क हल करने के लिए मजबूर करती है। यह स्क्रैपर्स को रोकने में बहुत अच्छा है। यह आपको भी रोकने में बहुत अच्छा है जब आप बस एक मेलिंग-लिस्ट थ्रेड को करना चाहते हैं:
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> # 🥳
बॉट-दीवारें दो अलग-अलग स्तरों पर रहती हैं, और anubis-fetch दोनों को संभालता है, सबसे सस्ता कदम पहले:
techaro.lol-anubis-auth) प्रदान करता है; ब्राउज़र को अगली यात्रा पर फिर से चुनौती नहीं दी जाती, और न ही हमें दी जाती है। कुकीज़ प्रति होस्ट संग्रहीत की जाती हैं (देखें कुकी स्थिरता).req के माध्यम से एक वास्तविक Chrome का प्रतिरूपण करके बाहर जाता है — समान TLS/JA3 + HTTP/2 फ़िंगरप्रिंट — जो Cloudflare की निष्क्रिय फ़िंगरप्रिंटिंग को भी साफ़ करता है। यदि प्रतिक्रिया एक Anubis चुनौती है, तो हम नॉन्स को ब्रूट-फोर्स करते हैं और इसे सबमिट करते हैं। कोई ब्राउज़र नहीं, ~0.6 सेकंड।chromedp के माध्यम से हेडलेस Chromium चलाते हैं, जो साइट द्वारा दिए गए किसी भी JavaScript को चलाता है।[!NOTE] फ़ॉलबैक इनके लिए सक्रिय होता है: Anubis की
preact/metarefreshचुनौती विधियाँ, एक अज्ञात/भविष्य की विधि, ब्रूट-फोर्स करने के लिए बहुत अधिक कठिनाई, एक अस्वीकृत समाधान, या एक Cloudflare सक्रिय JS चुनौती (Managed Challenge / Turnstile / "I'm Under Attack")। प्रतिरूपण निष्क्रिय Cloudflare को साफ़ करता है; केवल एक ब्राउज़र सक्रिय JS स्तरों को साफ़ करता है। इसलिएanubis-fetch"धीमा" हो जाता है, कभी "टूटा हुआ" नहीं।
क्योंकि यह ~4× धीमा है और प्रत्येक फ़ेच में ~200 MB के Chromium को खींचता है। इन-प्रोसेस सॉल्वर सामान्य मामला है; ब्राउज़र सुरक्षा जाल है।
| पथ | समय | Chromium की आवश्यकता |
|---|---|---|
| हल (Anubis प्रूफ-ऑफ-वर्क) | ~0.6 सेकंड | नहीं |
| ब्राउज़र फ़ॉलबैक | ~2.0 सेकंड | हाँ |
Anubis पृष्ठ में JSON के रूप में एक चुनौती एम्बेड करता है:
{"rules":{"algorithm":"fast","difficulty":4},
"challenge":{"id":"…","method":"fast","randomData":"6214bd88…","difficulty":4}}
इसे हल करने का अर्थ है एक नॉन्स ढूँढना जैसे कि hex(sha256(randomData ‖ nonce)) difficulty शून्य वर्णों से शुरू होता है (nonce इसके आधार-10 स्ट्रिंग है)। फिर हम उत्तर वापस भेजते हैं:
GET /.within.website/x/cmd/anubis/api/pass-challenge?id=…&response=<hash>&nonce=<n>&redir=<url>&elapsedTime=<ms>
…जो प्रमाणीकरण कुकी सेट करता है और वास्तविक पृष्ठ पर रीडायरेक्ट करता है। कठिनाई 4 (lore/kernel.org/GNOME पर डिफ़ॉल्ट) ~65k हैश है — Go में उप-मिलीसेकंड।
सीधे चलाएँ:
$ 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
| फ़्लैग | अर्थ |
|---|---|
--text | HTML के बजाय पढ़ने योग्य सादा पाठ प्रस्तुत करें |
--timeout MS | प्रति-चरण टाइमआउट मिलीसेकंड में (डिफ़ॉल्ट 30000) |
--ua STRING | User-Agent को ओवरराइड करें |
--browser | सॉल्वर छोड़ें; सीधे हेडलेस ब्राउज़र पर जाएँ |
--no-browser | कभी ब्राउज़र का उपयोग न करें; यदि हल लागू नहीं हो सकता तो 3 निकास कोड दें |
--no-cache | स्थायी कुकी जार को पढ़ें या लिखें नहीं |
# HTML से stdout
$ 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"
सफल फ़ेच के बाद, प्रमाणीकरण कुकी को
$XDG_CACHE_HOME/anubis-fetch/cookies/<host>.json पर लिखा जाता है (वापस
~/.cache/… पर आते हुए)। उस होस्ट के लिए अगली रन सीधे अंदर जाती है — कोई
प्रूफ-ऑफ-वर्क नहीं, कोई ब्राउज़र नहीं — बिल्कुल ब्राउज़र पुनरीक्षण की तरह।
ब्राउज़र फ़ॉलबैक के माध्यम से प्राप्त कुकीज़ भी सहेजी जाती हैं, ताकि बाद की
रन तेज़ HTTP पथ ले सके। अक्षम करने के लिए --no-cache का उपयोग करें, या पुन:
समाधान के लिए बस फ़ाइल हटा दें।
सब कुछ flake के माध्यम से जुड़ा है:
$ nix develop # डेव शेल: go, gopls, chromium, treefmt
$ go test ./... # यूनिट परीक्षण (हर्मेटिक — कोई नेटवर्क नहीं)
$ nix build # लिपटे बाइनरी का निर्माण
$ nix flake check # निर्माण + परीक्षण + फ़ॉर्मेटिंग
$ nix fmt # treefmt के माध्यम से Go + Nix को फ़ॉर्मेट करें (gofmt + alejandra)
प्रूफ-ऑफ-वर्क का कार्यान्वयन Anubis के अपने प्रकाशित परीक्षण वेक्टर
(sha256("hunter" + "0")) के विरुद्ध पिन किया गया है, ताकि हैश निर्माण में किसी भी
बदलाव से मूक रूप से गलत आउटपुट देने के बजाय एक यूनिट परीक्षण विफल हो जाए।