
مثل curl، لكنه يتجاوز جدران الحماية من البوتات الخاصة بـ Anubis وCloudflare.
$ nix run github:fzakaria/anubis-fetch -- https://lore.kernel.org/linux-mm/some-thread/T/
أداة سطر أوامر سريعة (مكتوبة بلغة Go) لجلب عناوين URL من خلف جدران إثبات العمل في Anubis وفحوصات بصمة Cloudflare — إذ تحل التحدي داخل العملية، ولا تلجأ إلى متصفح حقيقي إلا عند الضرورة.
عدد متزايد من المواقع — 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، فإننا نبحث عن الـ nonce بالقوة الغاشمة ونرسله. دون متصفح، ~0.6 ثانية.chromedp، الذي يشغّل أي JavaScript يقدّمه الموقع.[!NOTE] يحدث التراجع في: طرق تحدّي Anubis
preact/metarefresh، أو طريقة غير معروفة/مستقبلية، أو صعوبة أعلى من أن تُحل بالقوة الغاشمة، أو حل مرفوض، أو تحدي JavaScript النشط من Cloudflare (Managed Challenge / Turnstile / "I'm Under Attack"). المحاكاة تجتاز السلبي من Cloudflare؛ ولا يجتاز المستويات النشطة من JavaScript إلا المتصفح. لذا يتدهورanubis-fetchإلى "أبطأ"، وليس "معطّل".
لأنه أبطأ بمقدار ~4× ويجرّ ~200 MB من Chromium مع كل جلب. الحل داخل العملية هو الحالة الشائعة؛ والمتصفح هو شبكة الأمان.
| المسار | الزمن الفعلي | يتطلب Chromium |
|---|---|---|
| الحل (إثبات عمل Anubis) | ~0.6s | لا |
| التراجع إلى المتصفح | ~2.0s | نعم |
يضمّن Anubis تحديًا بصيغة JSON في الصفحة:
{"rules":{"algorithm":"fast","difficulty":4},
"challenge":{"id":"…","method":"fast","randomData":"6214bd88…","difficulty":4}}
حلّ التحدي يعني إيجاد nonce بحيث يبدأ hex(sha256(randomData ‖ nonce)) بعدد من الأصفار يساوي difficulty (الـ nonce هو تمثيله العشري). ثم نعيد الإجابة:
GET /.within.website/x/cmd/anubis/api/pass-challenge?id=…&response=<hash>&nonce=<n>&redir=<url>&elapsedTime=<ms>
…وهو ما يضبط ملف تعريف ارتباط المصادقة ويعيد التوجيه إلى الصفحة الحقيقية. الصعوبة 4 (الافتراضية على lore/kernel.org/GNOME) تعادل ~65 ألف تجزئة — أي أقل من ميلي ثانية في Go.
شغّله مباشرة:
$ nix run github:fzakaria/anubis-fetch -- <url>
ثبّته في ملفك الشخصي:
$ nix profile install github:fzakaria/anubis-fetch
أو أضفه إلى الـ flake الخاص بك:
{
inputs.anubis-fetch.url = "github:fzakaria/anubis-fetch";
# then, e.g. in home.packages / environment.systemPackages:
# inputs.anubis-fetch.packages.${system}.default
}
$ anubis-fetch [flags] URL
# HTML to stdout
$ anubis-fetch https://lore.kernel.org/linux-mm/some-thread/T/
# readable plain text
$ anubis-fetch --text https://lore.kernel.org/linux-mm/some-thread/T/
# lean/fast only — useful in scripts; exits 3 if it would need a browser
$ 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 # dev shell: go, gopls, chromium, treefmt
$ go test ./... # unit tests (hermetic — no network)
$ nix build # build the wrapped binary
$ nix flake check # build + tests + formatting
$ nix fmt # format Go + Nix via treefmt (gofmt + alejandra)
تنفيذ إثبات العمل مربوط بناقل الاختبار المنشور من Anubis نفسه (sha256("hunter" + "0")) بحيث يؤدي أي انحراف في بناء التجزئة إلى فشل اختبار وحدة بدلاً من إرجاع بيانات تالفة بصمت.
| الخيار | المعنى |
|---|
--text | عرض نص عادي قابل للقراءة بدلاً من HTML |
--timeout MS | مهلة زمنية لكل خطوة بالميلي ثانية (الافتراضي 30000) |
--ua STRING | تجاوز User-Agent |
--browser | تخطَّ الحل؛ انتقل مباشرة إلى المتصفح بدون واجهة |
--no-browser | لا تستخدم المتصفح أبدًا؛ اخرج بالرمز 3 إذا تعذّر تطبيق الحل |
--no-cache | لا تقرأ أو تكتب مخزن ملفات تعريف الارتباط الدائم |