از HTTP خام به یک مرورگر واقعی کوچ کردید. فینگرپرینت TLS: واقعاً مال Chrome. IP: مسکونی. و سایت باز هم میداند. در سال 2026، تشخیص مرورگر headless بسیار فراتر از navigator.webdriver رفته است — نسل فعلی بررسیها خودِ پروتکل اتوماسیون را تشخیص میدهد، و اکثر افزونههای «stealth» سیگنالهای دیروز را وصله میکنند در حالی که با صدای بلند سیگنالهای امروز را به نمایش میگذارند.
این مقاله نقشهٔ آن چیزی را میکشد که سایتها واقعاً الان بررسی میکنند، تقریباً به همان ترتیبی که بررسیشان میکنند، و اینکه در هر لایه چه چیزی واقعاً کمک میکند. این مقاله سهگانهٔ تشخیص را با فینگرپرینت TLS با JA3/JA4 (لایهٔ شبکه) و اعتبار IP و ASN (لایهٔ آدرس) کامل میکند — این لایهٔ مرورگر است.
navigator.webdriver — طبق استاندارد باید زیر اتوماسیون true باشد. راهاندازیهای stealth در Playwright/Puppeteer آن را پنهان میکنند؛ فلگ --disable-blink-features=AutomationControlled در Chrome آن را بهصورت بومی مدیریت میکند. سایتها هنوز بررسیاش میکنند چون رایگان است و باتهای ساده را میگیرد.HeadlessChrome/ در User-Agent. با حالت headless جدید (headless=new) که از مسیر باینری واقعی Chrome استفاده میکند رفع میشود.navigator.plugins، نبود chrome.runtime، outerWidth برابر 0×0. حالت headless قدیمی در همهٔ اینها مردود میشد؛ headless جدید عمدتاً قبول میشود.اگر یک هدف فقط ردهٔ ۱ را بررسی کند، Playwright مدرن با headless=new از آن عبور میکند. اهداف جدی سالها پیش از این مرحله گذشتند.
Playwright و Puppeteer مرورگر Chrome را روی Chrome DevTools Protocol هدایت میکنند، و CDP عوارض جانبی زمان اجرا به جا میگذارد که جاوااسکریپت صفحه میتواند مشاهده کند:
// نشت کلاسیک CDP: کالبکهای سریالایز شدن
const err = new Error();
Object.defineProperty(err, "stack", {
get() {
// این getter حین سریالایز شدن console فعال میشود -
// که فقط زمانی رخ میدهد که DevTools/CDP متصل باشد
window.__cdp_detected = true;
},
});
console.debug(err);
گونههای مختلف این — عوارض جانبی getter حین سریالایز شدن console، ناهنجاریهای زمانی در Runtime.evaluate، رفتار toString() روی توابع بومی وصلهشده — در هر بستهٔ تجاری ضدبات وجود دارند. نکتهٔ حیاتی: این پروتکل را تشخیص میدهد، نه حالت headless را. یک Chrome سردار (headed)، stealth-وصلهشده و کاملاً شبیه انسان هم اگر روی CDP هدایت شود مردود میشود.
چه چیزی کمک میکند:
فراتر از آرتیفکتها، سیستمهای مدرن بررسی میکنند که آیا روایت مرورگر شما از درون سازگار است یا نه:
| بررسی | نشانهٔ بات |
|---|---|
| هش رندر Canvas / WebGL | رندر نرمافزاری SwiftShader/llvmpipe = GPU سرور؛ یا هشی که میان ۱۰٬۰۰۰ «کاربر متفاوت» مشترک است |
| فونتها و کدکها | مجموعهٔ فونت سرور Linux زیر یک User-Agent ویندوزی |
| منطقهٔ زمانی × لوکیل × جغرافیای IP | Intl میگوید UTC، IP میگوید Texas، Accept-Language میگوید de-DE |
| متریکهای صفحه | 1920×1080 بدون هیچ نوار وظیفه، devicePixelRatio دقیقاً 1، پنجرهای که هیچوقت تغییر اندازه نداده |
| تعداد هستههای پردازنده / حافظه | ۹۶ هسته گزارششده به صفحهای که ادعا میکند یک تلفن است |
| میکروسیگنالهای رفتاری | بدون آنتروپی ماوس، پر شدن آنی فرمها، اسکرول در گامهای یکسان ۱۰۰ پیکسلی |
اینجاست که stealth خانگی میمیرد: هر وصلهای که اعمال میکنید باید با هر سیگنال دیگری توافق داشته باشد. یک UA ویندوز جعلی روی یک کانتینر Linux همزمان با فونتها، رشتههای GPU و فینگرپرینتهای TCP تناقض دارد. انسجام بر کمال برتری دارد — یک Chrome سردار Linux صادق بهتر از یک «ویندوز» بدجعلشده امتیاز میگیرد.
هیچکدام از اینها اهمیتی ندارد اگر لایهٔ آدرس سوخته باشد: یک مرورگر بینقص روی یک ASN دیتاسنتر باز هم «یک مرورگر بینقص در یک دیتاسنتر» است — و آستانههای تشخیص headless با اعتبار IP تطبیقپذیرند. همان مرورگر از یک IP علامتخورده چالشهای جاوااسکریپت بیشتری میگیرد. خروجیهای مسکونی عملاً سطح موشکافیای را که لایهٔ مرورگر باید از آن جان سالم به در ببرد پایین میآورند:
browser = p.chromium.launch(
headless=False, # حالت سردار (headed) از بررسیهای بیشتری جان سالم به در میبرد
args=["--disable-blink-features=AutomationControlled"],
proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
},
)
toString() وصلهنشده خودش یک سیگنال است. وصلههای کمتر و منسجم برنده میشوند.IPهای مسکونی که با روایتی که فینگرپرینت شما میگوید مطابقت دارند — ۵ دلار اعتبار رایگان، بدون نیاز به کارت.
شروع تست رایگانکاربران جدید با ثبتنام 500MB هدیه میگیرند، بهعلاوه بونوس اولین شارژ. پیشنهاد محدود.