كل المقالات

نظرة داخل علامة Unblocker: ما تفعله `unblocker: true` فعليا

علامة واحدة تفعل ثلاثة مفاتيح: ترويسات متصفح حقيقية، وبصمة اتصال مطابقة، وفك ضغط تلقائي لكل من gzip و brotli. إليك ما تفعله ولماذا.

تفشل معظم برامج الاستخراج قبل قراءة ترويسة واحدة.

يفحص الخادم بصمة مستوى الاتصال التي يرسلها عميلك عبر الشبكة ويقرر ما إذا كنت متصفحا أم مكتبة عميل تتظاهر بذلك. سواء استخدمت مكتبة requests في Python، أو net/http في Go، أو curl العادي: كلها تقدم بصمة مميزة في لحظة بدء الاتصال. تقوم المواقع التي تهتم (مثل Datadome و Akamai و Imperva والجانب المدار من Cloudflare) بإسقاط الاتصال أو تقديم صفحة تحد قبل أن يكون لسلسلة User-Agent أي أهمية.

هذا ما تحله unblocker: true في FourA. في الشهر الماضي، قمنا بتثبيت الأجزاء التي تجعلها تعمل بشكل موثوق.

ما الجديد

تعد unblocker: true علامة واحدة في أي استدعاء /api/single. عند تفعيلها نقوم بثلاثة أشياء: حقن مجموعة ترويسات المتصفح، وإرسال الطلب عبر طبقة نقل تطابق ما يرسله متصفح حقيقي عبر الشبكة، وفك ضغط ما يرجعه الخادم (gzip أو brotli أو deflate). يتوفر أول أمرين منذ الإصدار التجريبي. تم إطلاق الأمر الثالث (فك الضغط التلقائي لصيغة brotli) في 25 مارس، وتم إضافة عمل تثبيت الإصدارات في اليوم التالي للحفاظ على تزامن الترويسات وطبقة النقل.

كيف تعمل

إليك كيف يبدو الطلب:

curl -X POST "https://api.foura.ai/api/single" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "url": "https://example.com/products",
    "method": "GET",
    "unblocker": true
  }'

تعمل ثلاث طبقات في الخلفية.

حقن الترويسات. نقوم بتعيين حزمة ترويسات المتصفح الكاملة: User-Agent و Sec-Ch-Ua و Sec-Ch-Ua-Platform و Sec-Fetch-Site و Sec-Fetch-Mode و Sec-Fetch-Dest و Accept و Accept-Language و Accept-Encoding. الترتيب مهم. ترسل المتصفحات الحقيقية هذه الترويسات بتسلسل محدد، وتتحقق مكتبات الكشف من ذلك.

بصمة الاتصال. تطابق طبقة النقل لدينا شكل الجلسة لمتصفح حديث على مستوى البايت: نفس ترتيب الإضافات، ونفس تفضيلات التشفير، ونفس تفاصيل المصافحة. تنتج أدوات مثل curl القياسي و requests في Python و net/http في Go بصمات يتم تمييزها آليا في غضون أجزاء من الثانية على البنية التحتية المحمية.

فك الضغط التلقائي. عندما تكون unblocker مفعلة، نقوم بتعيين Accept-Encoding إلى gzip, deflate, br وتقوم طبقة النقل بفك تغليف جسم الطلب. ستحصل على سلسلة مفككة التشفير (أو Buffer إذا قمت بتمرير returnBuffer: true). لا توجد معالجة يدوية لصيغة brotli، ولا يوجد عدم تطابق بين الترويسات وجسم الطلب عندما يختار الموقع صيغة deflate بدلا من gzip.

لماذا يهم تثبيت الإصدارات

بصمات الاتصال مقفلة بإصدار محدد. تفاصيل المتصفح على مستوى الشبكة في هذا الشهر تختلف عن الشهر الماضي، وسيلاحظ الموقع الذي يبصم بعناية هذا الاختلاف. نحن نثبت الأجزاء المتحركة معا بحيث تبلغ الترويسات وكائنات navigator وبصمة الاتصال عن نفس إصدار المتصفح.

إذا كان هذا يبدو معقدا، فهو كذلك. لقد واجهنا مشكلة عدم التطابق أثناء ترحيل monorepo في مارس عندما تم التحديث التلقائي لجزء واحد وفقد الباقي التزامن. كان الإصلاح عبارة عن عمليتي commit: تثبيت الجزء المتحرك، وعدم الوثوق بمدير الحزم للحفاظ على توافق الأشياء نيابة عنك.

التأثير

في الاختبارات الداخلية ضد الأهداف شديدة التبصيم (التمويل، السفر، التجارة الإلكترونية المحمية)، الفرق بين unblocker: false و unblocker: true هو الفرق بين صفحة تحد واستجابة 200. عند استخدام curl العادي للوصول إلى Cloudflare المدار، ستحصل على خطأ 403 من المرة الأولى. يمر نفس عنوان URL مع unblocker: true لأن الاتصال يبدو كجلسة متصفح على مستوى الشبكة.

أما بالنسبة للمواقع التي لا تقوم بالتبصيم (معظم واجهات API العامة، قوالب CMS القديمة، أي شيء يعتمد فقط على حدود معدل IP)، فإن ترك unblocker معطلة أمر جيد ويوفر بضعة أجزاء من الثانية من التفاوض. استخدمها عندما تحتاج إليها.

للمستخدمين المتقدمين

بعض الأنماط التي تستحق المعرفة.

اربط unblocker ببروكسي سكني عندما يتحقق الهدف أيضا من سمعة IP. لا تزال عناوين IP لمراكز البيانات مع بصمة اتصال مثالية تثير الإنذار في أرقام ASN التي حظرها الموقع. تتناوب نقطة نهاية proxy لدينا (/api/proxy) حسب النطاق المستهدف، لذا فإن إضافة "proxy": "residential" إلى الطلب تكفي عادة.

تخط unblocker عند استدعاء واجهات API بتنسيق JSON التي لا تهتم بالمتصفحات. يمكن أن تبدو الترويسات الإضافية مريبة حقا لواجهة API تتوقع عميلا برمجيا، على سبيل المثال واجهة خلفية تستدعي خدمة مصغرة خاصة بها.

إذا كان الموقع يقوم بتشغيل برامج حماية ضد الروبوتات تعتمد على JavaScript (تحديات Turnstile التفاعلية، أو PerimeterX في أكثر حالاته صرامة، أو Akamai Bot Manager مع تفعيل الاستدلال)، فلن تكون unblocker وحدها كافية. أنت بحاجة إلى نقطة نهاية المتصفح، والتي تنفذ التحدي في متصفح كامل. هذا منتج مختلف بتسعير رصيد مختلف، وقد كتبنا عنه في Browser Tasks: How to Scrape JavaScript-Heavy Sites.

ويمكنك دمج unblocker مع كتلة validate لرفض الاستجابات التي ترجع تقنيا 200 ولكنها تحتوي على صفحة تحد:

{
  "url": "https://example.com/products",
  "method": "GET",
  "unblocker": true,
  "validate": {
    "data": { "fail": ["captcha", "Access Denied"] }
  }
}

يحول ذلك حالات الفشل الصامتة إلى حالات فشل مصنفة، وهو أمر مهم لتتبع معدل النجاح الخاص بك في dashboard.

ما التالي

تصدر المتصفحات إصدارا مستقرا جديدا كل 4 أسابيع. نقوم بترقية حزمتنا لمطابقة ذلك. لا تحتاج إلى تغيير أي شيء من جانبك: تستمر unblocker: true في الإشارة إلى أي إصدار متصفح تحققنا منه من البداية إلى النهاية.

العمل الأصعب لا يزال أمامنا. بدأت بصمة HTTP/3 تظهر بالفعل في الحماية المدارة ضد الروبوتات، وتعد مطابقة طبقة النقل QUIC أصعب من طبقة النقل الأقدم، وبدأ الانتقال بعيدا عن حزم الترويسات الثابتة نحو المحاكاة الديناميكية الحقيقية. انتقلت المواقع المحمية إلى التحقق من ترتيب إطارات HTTP/2، وستتقلص الفجوة بين "مكتبة تبدو كمتصفح" و"متصفح" من كلا الطرفين. سنكتب عن ذلك عندما نطلقه.