আপনার scraper নিখুঁত Chrome header পাঠায়, একটি পরিষ্কার residential IP-এর পিছনে চলে, এবং তবুও একদম প্রথম request-এই একটি 403 পায়। কোনো captcha নেই, কোনো চ্যালেঞ্জ পেজ নেই, সমাধান করার কিছু নেই। সাইটটি আপনাকে HTTP-এর একটি byte বিনিময় হওয়ার আগেই শনাক্ত করেছে — TLS handshake-এর সময়।
এই নিবন্ধটি ব্যাখ্যা করে JA3 এবং JA4 fingerprinting আসলে কীভাবে কাজ করে, কেন এগুলো ২০২৬ সালের প্রতিটি প্রধান anti-bot সিস্টেমের নীরব কর্মঘোড়া, এবং কীভাবে দশ সেকেন্ডে আপনার নিজের fingerprint দেখবেন। আপনি যদি প্রথমে bypass টুলিং চান, আমরা তা curl_cffi & tls-client দিয়ে TLS Fingerprinting Bypass করুন-এ কভার করেছি — এটি হলো শনাক্তকরণ পক্ষ কীভাবে কাজ করে তার সঙ্গী নিবন্ধ।
তত্ত্বের আগে, আপনার নিজের handshake দেখুন। আমাদের বিনামূল্যের JA3/JA4 checker খুলুন — এটি আপনার ক্লায়েন্ট সবেমাত্র যে TLS fingerprint উপস্থাপন করেছে তা ফেরত প্রতিধ্বনিত করে এবং বলে এটি কীসের সাথে মেলে:
# From a terminal - see what curl's TLS looks like:
curl https://www.jibaoproxy.com/tools/fingerprint.html
# Then open the same URL in Chrome and compare.
দুটোই চালান এবং আপনি এই পুরো নিবন্ধের মূল কথাটি দেখবেন: curl এবং Chrome সম্পূর্ণ ভিন্ন fingerprint তৈরি করে, আপনি যে User-Agent header-ই সেট করুন না কেন।
প্রতিটি HTTPS সংযোগ একটি ClientHello বার্তা দিয়ে শুরু হয়, যা যেকোনো encryption শুরু হওয়ার আগে cleartext-এ পাঠানো হয়। এতে, আপনার ক্লায়েন্ট ঘোষণা করে:
এখানে শনাক্তকরণের অন্তর্দৃষ্টি: এই তালিকাগুলো এবং তাদের সঠিক ক্রম আপনার ক্লায়েন্ট যে TLS লাইব্রেরির বিপরীতে compile করা হয়েছিল তাতে বেক করা থাকে। Chrome-এর BoringSSL একটি নির্দিষ্ট সমন্বয় ঘোষণা করে। Python-এর OpenSSL একটি ভিন্ন একটি ঘোষণা করে। Go-এর crypto/tls একটি তৃতীয়। আপনি header দিয়ে এটি পরিবর্তন করতে পারবেন না — এটি HTTP স্তরের নিচে, লাইব্রেরি নিজেই দ্বারা negotiate করা হয়।
JA3 (Salesforce, 2017) পাঁচটি ClientHello ক্ষেত্র — TLS সংস্করণ, cipher, extension, curve, point format — একটি স্ট্রিং-এ যুক্ত করে এবং এটিকে MD5-hash করে:
771,4865-4866-4867-49195-49199,0-23-65281-10-11-35-16,29-23-24,0
|
v MD5
cd08e31494f9531f560d64c695473da9
প্রতি TLS স্ট্যাকে একটি hash। Windows-এ Chrome 137-এর প্রতিটি কপি (প্রায়) একই JA3 তৈরি করে; OpenSSL 3.x-এ প্রতিটি python-requests একই ভিন্ন JA3 তৈরি করে। রক্ষাকর্তারা লুকআপ টেবিল রক্ষণাবেক্ষণ করে: hash X = Chrome, hash Y = requests, hash Z = Go bot। আপনার User-Agent যদি Chrome বলে কিন্তু আপনার JA3 যদি OpenSSL বলে, আপনি ব্লক হন — তাৎক্ষণিকভাবে, নীরবে, সস্তায়।
JA3-এর সমস্যা ছিল: Chrome ২০২৩ সালে extension order randomize করা শুরু করে (সরল JA3 ভেঙে দেয়), এবং MD5 unstructured — একটি hash আপনাকে দুটি ক্লায়েন্ট কেন আলাদা সে সম্পর্কে কিছুই বলে না। JA4 (FoxIO, 2023) উভয়ই ঠিক করেছে এবং আজ গুরুতর ভেন্ডররা এটিই চালায়:
JA4 = t13d1516h2_8daaf6152771_b0da82dd1658
| | |
a: protocol b: ciphers c: extensions
(TLS 1.3, 16 ciphers, (sorted, truncated
h2 ALPN, domain SNI) SHA256)
প্রতিটি সিস্টেম যা গুরুত্বপূর্ণ: Cloudflare তার bot-management নিয়মে JA3/JA4 সরাসরি প্রকাশ করে; DataDome এবং PerimeterX এটিকে তাদের নেটওয়ার্ক-স্তরের scoring-এ খাওয়ায় (আমাদের DataDome/PerimeterX গাইড দেখুন); Akamai সবার চেয়ে দীর্ঘতম সময় ধরে TLS fingerprinting চালিয়ে আসছে। এটি জনপ্রিয় কারণ এটি গণনা করা বিনামূল্যে, HTTP স্তর থেকে নকল করা অসম্ভব, এবং ৯০% সরল automation ধরে — এ পর্যন্ত লেখা প্রতিটি requests/httpx/axios/Go-http স্ক্রিপ্ট — কোনো JavaScript চালানোর প্রয়োজন হওয়ার আগেই।
এটি মানুষকে অবাক করে: একটি proxy আপনার IP পরিবর্তন করে, কিন্তু আপনার TLS handshake অপরিবর্তিতভাবে পার হয়ে যায়। CONNECT tunnel (বা SOCKS5 stream) আপনার ClientHello byte-গুলোকে হুবহু টার্গেটে বহন করে। Residential IP + requests-library JA3 = "একটি residential IP-তে চলমান একটি bot।" একটি datacenter IP-এর চেয়ে ভালো, তবুও একটি bot।
IP এবং TLS fingerprint হলো স্বাধীন সিগন্যাল এবং আপনার উভয়ই পরিষ্কার দরকার:
| IP | TLS fingerprint | ২০২৬-এ রায় |
|---|---|---|
| Datacenter | Library (requests/Go) | যেখানেই পরোয়া করে সেখানেই ব্লক |
| Residential | Library | JA4-পরীক্ষাকারী সাইটে ব্লক |
| Datacenter | Browser-impersonated | IP reputation-এ ব্লক |
| Residential | Browser-impersonated | নেটওয়ার্ক-স্তরের পরীক্ষা উত্তীর্ণ |
টুলিং অনুসারে দুটি পথ:
HTTP ক্লায়েন্ট — একটি impersonation লাইব্রেরি ব্যবহার করুন যা একটি ব্রাউজারের সঠিক ClientHello পুনঃবাস্তবায়ন করে: curl_cffi (Python), tls-client (Python/Go), got-scraping (Node)। curl_cffi গাইডে সম্পূর্ণ কার্যকর কোড:
from curl_cffi import requests
r = requests.get(
"https://target.example",
impersonate="chrome",
proxies={"https": "socks5h://USERNAME:[email protected]:913"},
)
আসল ব্রাউজার (Playwright, browser agent, anti-detect ব্রাউজার) — TLS স্তরে কিছুই করার নেই; fingerprint সত্যিকারের Chrome-এর। আপনার ঝুঁকি অন্য কোথাও থাকে: IP reputation এবং CDP detection।
তারপর যাচাই করুন, ধরে নেবেন না। সংস্করণ সরে যায় — Chrome 120-এর handshake-এ পিন করা একটি impersonation লাইব্রেরি ২০২৬ সালে "সন্দেহজনকভাবে পুরোনো ব্রাউজার" হিসেবে পড়া হয়। প্রতিটি নির্ভরতা আপডেটের পরে পুনরায় পরীক্ষা করুন:
আপনার impersonate করা TLS-কে residential IP-এর সাথে জুড়ুন — 500MB ফ্রি ট্রাফিক, কোনো কার্ড প্রয়োজন নেই।
বিনামূল্যে ট্রায়াল শুরু করুননতুন ব্যবহারকারীরা নিবন্ধনের সময় 500MB পান, সাথে প্রথম রিচার্জে বোনাস। সীমিত সময়ের অফার।