आपका scraper परफ़ेक्ट Chrome headers भेजता है, एक साफ़ residential IP के पीछे चलता है, और फिर भी पहली ही request पर 403 पाता है। कोई captcha नहीं, कोई challenge page नहीं, हल करने को कुछ नहीं। साइट ने आपकी पहचान HTTP के एक भी byte के आदान-प्रदान से पहले कर ली — TLS handshake के दौरान।
यह लेख समझाता है कि JA3 और JA4 fingerprinting असल में कैसे काम करती है, ये 2026 में हर बड़े anti-bot सिस्टम के ख़ामोश workhorse क्यों हैं, और दस सेकंड में अपना fingerprint कैसे देखें। अगर आप पहले bypass tooling चाहते हैं, तो हमने उसे curl_cffi & tls-client से TLS Fingerprinting को Bypass करें में कवर किया है — यह उसका साथी लेख है कि detection पक्ष कैसे काम करता है।
सिद्धांत से पहले, अपना handshake देखें। हमारा मुफ़्त JA3/JA4 checker खोलें — यह आपके client द्वारा अभी प्रस्तुत किए गए 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 पूरी तरह अलग fingerprints पैदा करते हैं, चाहे आप कोई भी User-Agent header सेट करें।
हर HTTPS connection एक ClientHello संदेश से शुरू होता है, जो किसी encryption के शुरू होने से पहले cleartext में भेजा जाता है। इसमें आपका client घोषणा करता है:
यहाँ detection की अंतर्दृष्टि है: ये सूचियाँ और उनका सटीक क्रम उस TLS library में पकाया जाता है जिसके विरुद्ध आपका client कंपाइल किया गया था। Chrome का BoringSSL एक विशिष्ट संयोजन की घोषणा करता है। Python का OpenSSL एक अलग की घोषणा करता है। Go का crypto/tls एक तीसरा। आप इसे headers से नहीं बदल सकते — यह HTTP परत के नीचे, library द्वारा ही negotiate किया जाता है।
JA3 (Salesforce, 2017) पाँच ClientHello फ़ील्ड्स — TLS संस्करण, ciphers, extensions, curves, point formats — को एक string में जोड़ता है और उसे MD5-hash करता है:
771,4865-4866-4867-49195-49199,0-23-65281-10-11-35-16,29-23-24,0
|
v MD5
cd08e31494f9531f560d64c695473da9
प्रति TLS stack एक hash। Windows पर Chrome 137 की हर copy (लगभग) वही JA3 पैदा करती है; OpenSSL 3.x पर हर python-requests वही अलग JA3 पैदा करती है। डिफ़ेंडर्स lookup tables बनाए रखते हैं: hash X = Chrome, hash Y = requests, hash Z = Go bot। अगर आपका User-Agent Chrome कहता है पर आपका JA3 OpenSSL कहता है, तो आप ब्लॉक हैं — तुरंत, खामोशी से, सस्ते में।
JA3 में समस्याएँ थीं: Chrome ने 2023 में extension क्रम को randomize करना शुरू किया (naive JA3 को तोड़ते हुए), और MD5 असंरचित है — एक hash आपको कुछ नहीं बताता कि दो clients क्यों अलग हैं। JA4 (FoxIO, 2023) ने दोनों को ठीक किया और गंभीर vendors आज यही चलाते हैं:
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 इसे अपनी network-परत scoring में डालते हैं (देखें हमारी DataDome/PerimeterX गाइड); Akamai ने किसी से भी ज़्यादा समय तक TLS fingerprinting चलाई है। यह लोकप्रिय है क्योंकि यह गणना करने में मुफ़्त है, HTTP परत से नक़ली बनाना असंभव है, और 90% naive automation को पकड़ लेता है — अब तक लिखी गई हर requests/httpx/axios/Go-http script — किसी JavaScript के चलने की ज़रूरत से पहले।
यह लोगों को चौंकाता है: एक proxy आपकी IP बदलता है, लेकिन आपका TLS handshake बिना बदले गुज़रता है। CONNECT tunnel (या SOCKS5 stream) आपके ClientHello bytes को हूबहू टारगेट तक ले जाता है। Residential IP + requests-library JA3 = "एक residential IP पर चलता एक bot"। datacenter IP से बेहतर, फिर भी एक bot।
IP और TLS fingerprint स्वतंत्र signals हैं और आपको दोनों साफ़ चाहिए:
| IP | TLS fingerprint | 2026 में फ़ैसला |
|---|---|---|
| Datacenter | Library (requests/Go) | जहाँ कहीं परवाह है, हर जगह ब्लॉक |
| Residential | Library | JA4-जाँचने वाली साइटों पर ब्लॉक |
| Datacenter | Browser-impersonated | IP reputation पर ब्लॉक |
| Residential | Browser-impersonated | network-परत जाँचें पास |
दो रास्ते, tooling के अनुसार:
HTTP clients — एक impersonation library इस्तेमाल करें जो किसी browser के सटीक 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"},
)
असली browsers (Playwright, browser agents, anti-detect browsers) — TLS परत पर कुछ नहीं करना है; fingerprint सचमुच Chrome का है। आपका जोखिम कहीं और है: IP reputation और CDP detection।
फिर सत्यापित करें, मान न लें। संस्करण खिसकते हैं — Chrome 120 के handshake पर पिन की गई एक impersonation library 2026 में "संदिग्ध रूप से पुराना browser" के रूप में पढ़ी जाती है। हर dependency update के बाद फिर से परखें:
अपने impersonated TLS को residential IPs के साथ जोड़ें — 500MB मुफ़्त ट्रैफ़िक क्रेडिट, कार्ड की ज़रूरत नहीं।
Start Free Trialनए यूज़र्स को साइन अप पर 500MB मिलते हैं, साथ ही पहली रिचार्ज पर बोनस। सीमित समय की पेशकश।