العودة إلى المدونة

كيفية تجاوز بصمة TLS/JA4 في 2026: curl_cffi وتقليد المتصفح في الممارسة العملية

اشترينا بروكسي مقيم، لكن الموقع لا يزال يعطي 403 في الطلب الأول؟ يتم تحديد موقعك من خلال مصافحة TLS قبل حتى رؤوس HTTP. نحلل تقنية JA3/JA4 لتحديد الهوية وكيفية تجاوزها في خمس دقائق باستخدام curl_cffi وتقليد المتصفح - مع الكود، والتحقق من البصمة، واختيار البروكسي.

📅٧ صفر ١٤٤٨ هـ
كيفية تجاوز بصمة TLS/JA4 في 2026: curl_cffi وتقليد المتصفح في الممارسة العملية

لقد اشتريت بروكسي سكني، وضعت وكيل مستخدم جديد من Chrome، ومع ذلك لا يزال الموقع يعطي 403 في أول طلب. هل يبدو مألوفًا؟ المشكلة ليست في IP ولا في الرؤوس. لقد تم التعرف عليك قبل أن يقرأ الخادم أي رأس HTTP — من خلال مصافحة TLS. في عام 2026، هذه هي نقطة الكشف رقم 1، و requests العادي يفشل فيها تلقائيًا. دعونا نفهم كيف يعمل هذا وكيف يمكن إصلاحه في بضع أسطر من الكود عبر curl_cffi.

ما يحدث: يتم التعرف عليك من خلال مصافحة TLS

عندما يقوم العميل بإنشاء اتصال HTTPS، فإنه يرسل أولاً حزمة ClientHello — حتى قبل أي HTTP. في هذه الحزمة، يتم سرد: إصدار TLS، قائمة مجموعات التشفير المدعومة (cipher suites)، امتدادات TLS (SNI، ALPN، supported_groups)، المنحنيات البيانية والأشكال النقطية. ترتيب ومحتوى هذه الحقول يختلف بين العملاء مختلف — ومن خلالها يمكن التعرف على العميل قبل أن ينطق بكلمة واحدة.

يتم حساب بصمة من هذه الحقول. JA3 (معيار عام 2017) يأخذ سلسلة من الشكل TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats ويقوم بتجزئتها باستخدام MD5، مما ينتج عنه توقيع مكون من 32 حرفًا. المشكلة في JA3 هي أنه منذ يناير 2023، يقوم Chrome بتغيير ترتيب الامتدادات بشكل عشوائي — 16 امتدادًا تعطي 16! (أكثر من 20 تريليون) من الخيارات، ونفس المتصفح يعطي JA3 مختلفة.

لذلك، انتقلت الصناعة إلى JA4 (FoxIO، تطبيق واسع في 2024–2025). JA4 يقوم بفرز رموز الامتدادات حسب القيمة السداسية قبل التجزئة — عشوائية Chrome لم تعد تكسره. التجزئة — هي SHA-256 مقطوعة، بتنسيق مقروء بشري وثلاثي الأجزاء (a_b_c)، ويشمل ALPN ودعم QUIC/HTTP3. مثال: Chrome 124 يعطي t13d1516h2 (15 تشفير، 16 امتداد، ALPN h2)، بينما Python العادي requests يعطي t13d1715h2. بالنسبة لمكافحة الروبوتات، التوقيع الثاني هو علامة مباشرة "هذا سكربت".

لماذا في 2026 لا يمكنك الاستغناء عن هذا

كشف JA4 مدمج في جميع البائعين الرئيسيين: Cloudflare تتحقق من البصمة ضد قوائم السماح، Akamai تضيف تجزئة منفصلة لإطارات HTTP/2 SETTINGS، DataDome تقارن مع قاعدة بيانات الروبوتات المعروفة. المنطق بسيط وفتاك: إذا كنت ترسل User-Agent: Chrome 131، بينما بصمة TLS تصرخ "urllib3/OpenSSL" — فهذا عدم تزامن، ويتم حظرك على الفور. لا تنقذك أي بروكسي: IP سكني مثالي مع بصمة Python requests لا يزال يخسر.

لهذا السبب بالضبط، أصبحت مجموعة "بروكسي + تزوير البصمة" في عام 2026 هي النظافة الأساسية للتخزين، وليست خيارًا للمستخدمين المتقدمين.

الحل: curl_cffi في 5 دقائق

curl_cffi هو غلاف Python فوق curl-impersonate (curl معدّل، تم تجميعه باستخدام BoringSSL من Chrome أو NSS من Firefox بدلاً من OpenSSL). إنه يعيد إنتاج مصافحة المتصفح الحقيقية وفي نفس الوقت لديه واجهة برمجة تطبيقات مشابهة تقريبًا لـ requests.

الخطوة 1. التثبيت. يتم سحب ثنائيات curl-impersonate تلقائيًا على Windows/macOS/Linux:

pip install curl-cffi

الخطوة 2. الطلب الأساسي. قم بتغيير الاستيراد وأضف معلمة واحدة:

from curl_cffi import requests

resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version)  # HTTP/2 — كما في المتصفح الحقيقي

سطر واحد impersonate="chrome" يقوم بتزوير أربعة طبقات على الفور: بصمة TLS (JA3/JA4)، إصدار HTTP (HTTP/2 بدلاً من HTTP/1.1)، ترتيب الرؤوس ومفاوضات ALPN.

الخطوة 3. استخدم دائمًا الاسم العام، وليس رقم الإصدار. اكتب impersonate="chrome" (أو "safari"، "safari_ios") — الاسم العام يتم حله تلقائيًا إلى أحدث ملف تعريف. impersonate="chrome124" سيصبح قديمًا: يتم تحديث Chrome كل ~4 أسابيع، وسيتحول الملف الشخصي القديم إلى شذوذ. الأهداف الموثوقة هي Chrome وEdge وSafari/iOS (ملفات تعريف من chrome99 إلى chrome131، safari15–18).

الخطوة 4. البروكسي والجلسات. للتخزين الحقيقي، احتفظ بالحالة في جلسة واربط البروكسي. IP سكني أو موبايل هنا إلزامي — مركز البيانات يتم التعرف عليه من خلال ASN بشكل منفصل عن TLS:

from curl_cffi import requests

session = requests.Session(impersonate="chrome")

headers = {
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.google.com/",
}
proxies = {
    "http": "http://user:pass@proxy-host:port",
    "https": "http://user:pass@proxy-host:port",
}

resp = session.get("https://target.com", headers=headers, proxies=proxies)

الخطوة 5. التزامن للكمية. على عكس requests، يحتوي curl_cffi على التزامن وHTTP/2 من الصندوق:

import asyncio
from curl_cffi.requests import AsyncSession

async def fetch(session, url):
    r = await session.get(url, impersonate="chrome")
    return r.status_code

async def main(urls):
    async with AsyncSession() as session:
        return await asyncio.gather(*[fetch(session, u) for u in urls])

asyncio.run(main(["https://target.com"] * 20))

تحقق من بصمتك — لا تخمن

قبل أن تبدأ في إرسال حركة المرور القتالية، تأكد من أن التزوير يعمل بالفعل. أرسل طلبًا إلى خدمات التحقق العامة وقارن JA4 مع المتصفح القياسي:

  • tls.peet.ws — يعيد JA3، JA4، بصمة Akamai وإطارات HTTP/2 في JSON. اطلب ذلك عبر curl_cffi ومن خلال Chrome الحقيقي، وقارن التجزئات.
  • ja4db.com — قاعدة بيانات JA4 المعروفة، تساعدك على فهم من تشبه.
  • browserleaks.com/tls وأداة JA3/JA4 من Scrapfly — تحليل تفصيلي للحقول.

في مرحلة الاختبار، من السهل وضع mitmproxy بين الخادم والهدف ومراقبة التجزئة الفعلية لكل طلب.

التشخيص: لا تزال تحصل على 403/429

إذا كانت البصمة صحيحة، ولكن الحظر لا يزال موجودًا — اتبع قائمة التحقق من الشائع إلى النادر:

  1. IP مركز البيانات. السبب رقم 1. انتقل إلى بروكسي سكني أو موبايل — لماذا بصمة واحدة غير كافية، تم تفصيله في المادة حول كشف البروكسي السكني عبر IP Intelligence.
  2. ملف تعريف قديم. pip install -U curl-cffi واسم عام "chrome".
  3. معدل مرتفع جدًا. أضف فترات توقف عشوائية من 1–3 ثوانٍ بين الطلبات.
  4. رؤوس عارية. تأكد من إرسال Accept-Language، Accept-Encoding، Referer — غيابها أيضًا شذوذ.
  5. عدم تزامن الجلسة وIP. القاعدة: جلسة واحدة — IP واحد طوال عمرها.
  6. الحالة 200 ≠ النجاح. تحقق من جسم الاستجابة: تحت الرمز 200 قد تكون هناك صفحة تحتوي على CAPTCHA.

أين يتوقف curl_cffi

curl_cffi يغلق الطبقة الشبكية — ونقطة. إنه لا ينفذ JavaScript. لذلك، ضد تحديات JS، هو عاجز: Cloudflare Turnstile، صفحة "Checking your browser…" (IUAM)، الكوكي cf_clearance، التي يضعها السكربت بعد التحقق — كل ذلك يتطلب بيئة متصفح حقيقية. لماذا في عام 2026 توقفت حلول CAPTCHA تقريبًا عن العمل ضد مثل هذه الأنظمة الوقائية، ناقشنا ذلك في تحليل منفصل حول تجاوز CAPTCHA.

ماذا تفعل عندما تصطدم بجدار JS:

  • هجين. Playwright أو Nodriver يتجاوز التحدي ويحصل على cf_clearance، ثم يتم تمرير الكوكي إلى curl_cffi السريع للجزء الأكبر من الطلبات — هكذا تدفع ثمن متصفح ثقيل مرة واحدة.
  • خدمات الحلول (CapSolver، 2Captcha) لإصدار الرموز تلقائيًا.
  • API للتخزين المُدار، إذا كنت لا تريد الاحتفاظ بالبنية التحتية.

وتذكر عن أمان الخيوط: كل خيط — جلسته الخاصة. قم بتثبيت إصدار curl-cffi في requirements.txt وراجع الملفات الشخصية كل 6–12 أسبوعًا، عندما يتم تحديث المتصفحات.

بدائل curl_cffi

  • tls-client — غلاف فوق مكتبة Go تعتمد على uTLS، مع ملفات تعريف (chrome_124، safari_ios_17) وعلم random_tls_extension_order=True. إعداد مرن ودقيق للبصمة.
  • primp — عميل على Rust، يسمح بتعيين impersonate_os بشكل مستقل ويعطي عرض نطاق ترددي أعلى؛ العيب — واجهة برمجة التطبيقات لا تتطابق تمامًا مع requests والمكتبة أصغر سناً.

ما هو البروكسي المطلوب ولماذا

تزوير البصمة والبروكسي يحلان نصفين مختلفين من نفس المشكلة: curl_cffi يغلق سؤال "كيف يبدو الاتصال"، البروكسي — "من أين يأتي". مكافحة الروبوتات تتحقق من كلا الإشارتين بشكل مستقل، لذلك JA4 المثالي مع ASN مركز بيانات أسود غير مفيد. للأغراض المحمية (أسواق، شبكات اجتماعية، مجمعات سفر) استخدم بروكسي سكني أو بروكسي موبايل: لديهم أصل تشغيلي نظيف، والموبايل يختبئ أيضًا وراء تأثير CGNAT "تأثير الحشد". اترك مركز البيانات للأغراض غير الحساسة وحجم كبير.

الاستنتاج

في عام 2026، التخزين هو لعبة الهويات، وليس فقط IP. requests العادي يظهر كسكربت على مستوى مصافحة TLS ويخسر حتى قبل أول رأس. استبدال الاستيراد بـ curl_cffi مع impersonate="chrome" يزيل هذه الفجوة في خمس دقائق، لكنه يعمل فقط مع IP سكني أو موبايل نظيف وفهم للحدود: الطبقة الشبكية — نعم، تحديات JavaScript — لا. اجمع الحزمة بصدق: بصمة صحيحة، بروكسي صحيح، هجين مع المتصفح حيث توجد جدار JS — و403 في أول طلب ستبقى في الماضي.