
مثل curl، لكنه يتجاوز جدران الحماية من البوتات الخاصة بـ Anubis وCloudflare.
$ nix run github:fzakaria/anubis-fetch -- --text https://lore.kernel.org/
أداة CLI مكتوبة بلغة Go لجلب عناوين URL المحمية بتحديات إثبات العمل (proof-of-work) الخاصة بـ Anubis. تحل تحديات SHA-256 القديمة وتحديات WASM داخل العملية نفسها، مع استخدام Chromium بدون واجهة رسومية كخيار احتياطي.
تستخدم مواقع مثل lore.kernel.org و kernel.org نظام Anubis لفرض إثبات العمل قبل تقديم الصفحة. قد يتلقى عميل 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>
تؤدي الاستجابة الناجحة إلى تعيين ملف تعريف ارتباط للمصادقة وإعادة التوجيه إلى الصفحة المطلوبة. تتطلب الصعوبة 4 حوالي 65,536 عملية تجزئة في المتوسط.
بالنسبة لـ sha256 و argon2id و hashx، يقدم Anubis وحدة WebAssembly تنفذ إثبات العمل. تقوم anubis-fetch بتنزيل الوحدة، وفك ترميز بيانات التحدي السداسية عشرية إلى بايتات، وتمرير البيانات والصعوبة إلى الوحدة. تبحث الوحدة عن قيمة nonce وتعيد قيمة nonce والتجزئة لإرسالهما إلى نفس نقطة النهاية أعلاه.
تعمل الوحدة داخل عملية Go باستخدام wazero، لذا تعمل هذه الطرق مع --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 | الخروج بالرمز 3 إذا احتاج حل HTTP إلى الخيار الاحتياطي للمتصفح |
--no-cache | تعطيل قراءة وكتابة ملفات تعريف الارتباط المحفوظة |
--help, -h | طباعة الاستخدام والخروج |
# HTML to stdout
anubis-fetch https://lore.kernel.org/
# Plain text
anubis-fetch --text https://lore.kernel.org/
# Require the HTTP path; check for exit status 3
anubis-fetch --no-browser https://lore.kernel.org/
تُحفظ ملفات تعريف الارتباط لكل مضيف في
$XDG_CACHE_HOME/anubis-fetch/cookies/<host>.json، أو
~/.cache/anubis-fetch/cookies/<host>.json عندما لا يكون XDG_CACHE_HOME معينًا.
قد يسمح ملف تعريف ارتباط مصادقة صالح للطلبات اللاحقة بتخطي التحدي.
تُحفظ أيضاً ملفات تعريف الارتباط التي تم الحصول عليها عبر Chromium، إلى جانب
User-Agent الخاص بـ Chromium. لا تحترم Cloudflare cf_clearance إلا تحت
User-Agent الذي حصل عليها، لذا ترسل طلبات HTTP اللاحقة إلى ذلك المضيف
User-Agent المحفوظ ما لم يتجاوزه --ua.
استخدم --no-cache للجلب دون ملفات تعريف ارتباط محفوظة، أو احذف ملف المضيف
للتخلص منها. يتطلب ملف تعريف الارتباط المنتهي أو المرفوض تحديًا جديدًا.
$ 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