Vượt qua bảo vệ PerimeterX và Akamai: phương pháp thực tiễn chống phát hiện
PerimeterX và Akamai Bot Manager là hai giải pháp bảo vệ bot tiên tiến nhất, được sử dụng bởi các nền tảng thương mại điện tử lớn nhất, dịch vụ tài chính và các trang web doanh nghiệp. Những hệ thống này phân tích hàng trăm tham số của trình duyệt, hành vi người dùng và đặc điểm mạng, tạo ra một lớp bảo vệ đa tầng mà không thể vượt qua chỉ bằng cách thay đổi địa chỉ IP.
Trong hướng dẫn này, chúng tôi sẽ phân tích chi tiết kiến trúc của cả hai hệ thống, tìm hiểu các phương pháp phát hiện của chúng và xây dựng một chiến lược vượt qua toàn diện dựa trên các trường hợp thực tế và thí nghiệm kỹ thuật.
Kiến trúc PerimeterX và Akamai: cách hoạt động của phát hiện
PerimeterX (nay là HUMAN Security) và Akamai Bot Manager hoạt động như các hệ thống bảo vệ đa tầng, tích hợp vào các giai đoạn khác nhau của quá trình xử lý yêu cầu. Hiểu rõ kiến trúc của chúng là rất quan trọng để phát triển chiến lược vượt qua.
Kiến trúc PerimeterX
PerimeterX hoạt động qua ba giai đoạn. Ở giai đoạn đầu tiên, cảm biến JavaScript được nhúng vào trang HTML và thực thi trong trình duyệt của khách hàng, thu thập dữ liệu về môi trường thực thi: dấu vân tay WebGL, dấu vân tay Canvas, ngữ cảnh âm thanh, phông chữ có sẵn, plugin, độ phân giải màn hình và nhiều tham số khác. Cảm biến này được mã hóa và thường xuyên được cập nhật, làm cho việc phân tích trở nên khó khăn.
Ở giai đoạn thứ hai, thành phần máy chủ của PerimeterX phân tích các tiêu đề HTTP, dấu vân tay TLS, danh tiếng IP và các đặc điểm mạng trước khi yêu cầu đến ứng dụng chính. Hệ thống sử dụng cơ sở dữ liệu riêng về các bot đã biết và các địa chỉ IP đáng ngờ, được cập nhật theo thời gian thực.
Giai đoạn thứ ba là phân tích hành vi. PerimeterX theo dõi chuyển động chuột, tốc độ cuộn, mẫu nhấp chuột, thời gian giữa các hành động và xây dựng hồ sơ hành vi. Các mô hình học máy so sánh hồ sơ này với các mẫu của người dùng thực và các bot đã biết.
Kiến trúc Akamai Bot Manager
Akamai Bot Manager tích hợp ở cấp độ CDN, điều này mang lại cho nó lợi thế về tốc độ phân tích. Hệ thống sử dụng công nghệ BMP (Bot Manager Premier) riêng, phân tích các yêu cầu trên các máy chủ biên của Akamai trước khi chúng được chuyển đến máy chủ gốc.
Sự khác biệt chính của Akamai là việc sử dụng telemetry từ hàng triệu trang web được bảo vệ bởi CDN của họ. Điều này cho phép hệ thống nhanh chóng xác định các loại bot mới và cập nhật quy tắc phát hiện toàn cầu. Akamai cũng sử dụng công nghệ Web SDK, tương tự như cảm biến của PerimeterX, nhưng tập trung vào kiểm tra tính toàn vẹn của khách hàng bằng mã hóa.
Quan trọng: Cả hai hệ thống đều sử dụng cookie với dữ liệu được mã hóa về kết quả kiểm tra. Những cookie này không thể bị giả mạo mà không biết khóa máy chủ, vì vậy việc sao chép cookie giữa các phiên không hoạt động.
Phương pháp phát hiện: những gì mà các hệ thống bảo vệ phân tích
Các hệ thống chống bot hiện đại phân tích các yêu cầu dựa trên hàng trăm tham số, được nhóm thành vài danh mục. Hiểu rõ từng danh mục cho phép loại bỏ hệ thống các dấu hiệu tự động một cách có hệ thống.
Phân tích tiêu đề HTTP và TLS
Thứ tự của các tiêu đề HTTP là một trong những cách đơn giản nhất để phát hiện. Các trình duyệt gửi các tiêu đề theo một thứ tự nhất định, khác nhau giữa các phiên bản và nhà sản xuất. Các thư viện như requests trong Python hoặc axios trong Node.js sử dụng thứ tự riêng của chúng, ngay lập tức phát hiện ra tự động hóa.
Dấu vân tay TLS (dấu vân tay JA3) được tạo ra từ các tham số của quá trình bắt tay TLS: phiên bản TLS, danh sách các cipher hỗ trợ, các mở rộng và thứ tự của chúng. Mỗi sự kết hợp của trình duyệt và hệ điều hành tạo ra một dấu vân tay độc nhất. Ví dụ, Chrome 120 trên Windows 11 có dấu vân tay khác với Chrome 120 trên macOS hoặc Firefox trên cùng một hệ thống.
// Ví dụ về sự không phù hợp giữa User-Agent và dấu vân tay TLS
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
TLS Fingerprint: Dấu băm JA3 tương ứng với Python requests
// Kết quả: chặn ngay lập tức
Môi trường thực thi JavaScript
Các trình duyệt headless để lại hàng chục dấu vết trong môi trường JavaScript. Các thuộc tính navigator.webdriver, sự hiện diện của các đối tượng window.chrome, sự không phù hợp trong navigator.plugins, và các bất thường trong WebGL và Canvas rendering đều được kiểm tra.
PerimeterX và Akamai sử dụng các kỹ thuật kiểm tra tiên tiến: đo thời gian thực thi của các hàm JavaScript (trong các trình duyệt headless, thời gian này khác nhau), kiểm tra sự hiện diện của các dấu hiệu tự động hóa trong DOM, và phân tích ngăn xếp gọi hàm. Các hệ thống cũng kiểm tra tính nhất quán của dữ liệu — ví dụ, nếu User-Agent chỉ ra một thiết bị di động nhưng navigator.maxTouchPoints bằng 0, đây là một kích hoạt phát hiện.
Các đặc điểm mạng và danh tiếng IP
Các hệ thống bảo vệ kiểm tra địa chỉ IP dựa trên nhiều tham số: thuộc về các nhà cung cấp proxy nổi tiếng, có mặt trong danh sách đen, lịch sử hoạt động từ địa chỉ IP đó, tính nhất quán của vị trí địa lý với các tham số khác của yêu cầu (ngôn ngữ trình duyệt, múi giờ).
Sự chú ý đặc biệt được dành cho các mẫu sử dụng IP. Nếu từ một địa chỉ có các yêu cầu với các User-Agent hoặc dấu vân tay trình duyệt khác nhau, đó là một tín hiệu mạnh về tự động hóa. Tương tự, nếu IP thay đổi quá thường xuyên trong một phiên (xoay vòng proxy một cách quyết liệt), điều này sẽ kích hoạt việc chặn.
| Tham số phát hiện | PerimeterX | Akamai |
|---|---|---|
| Dấu vân tay TLS | Ưu tiên cao | Ưu tiên quan trọng |
| Dấu vân tay Canvas | Ưu tiên trung bình | Ưu tiên cao |
| Phân tích hành vi | Ưu tiên quan trọng | Ưu tiên cao |
| Danh tiếng IP | Ưu tiên cao | Ưu tiên cao |
| Dấu vân tay HTTP/2 | Ưu tiên trung bình | Ưu tiên quan trọng |
Dấu vân tay trình duyệt và dấu vân tay TLS
Dấu vân tay trình duyệt là một kỹ thuật tạo ra một định danh duy nhất cho trình duyệt dựa trên các đặc điểm của nó. Ngay cả khi không có cookie, các hệ thống bảo vệ vẫn có thể theo dõi người dùng và phát hiện các bất thường.
Dấu vân tay Canvas và WebGL
Dấu vân tay Canvas hoạt động bằng cách kết xuất một hình ảnh vô hình với văn bản và đồ họa. Do sự khác biệt trong các trình điều khiển đồ họa, phông chữ và cài đặt chống răng cưa, mỗi hệ thống tạo ra một hình ảnh hơi khác nhau. Băm của hình ảnh này trở thành một phần của dấu vân tay.
Dấu vân tay WebGL sử dụng kết xuất 3D để tạo ra một dấu vân tay độc nhất hơn nữa. Hệ thống yêu cầu thông tin về GPU, các mở rộng được hỗ trợ, kích thước tối đa của các texture và các tham số khác. Sự kết hợp của các dữ liệu này tạo ra một dấu vân tay có độ entropy đủ để xác định thiết bị.
// Ví dụ về việc lấy dấu vân tay WebGL
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// Kết quả có thể là: "Google Inc. (NVIDIA)" + "ANGLE (NVIDIA GeForce RTX 3080)"
// Sự kết hợp độc nhất cho mỗi thiết bị
Ngữ cảnh âm thanh và phông chữ
Audio Context API cho phép tạo ra một dấu vân tay độc nhất dựa trên xử lý âm thanh. Sự khác biệt trong ngăn xếp âm thanh của hệ điều hành dẫn đến những khác biệt vi mô trong xử lý tín hiệu âm thanh, có thể được đo và sử dụng để xác định.
Danh sách các phông chữ đã cài đặt cũng độc nhất cho mỗi hệ thống. Các hệ thống bảo vệ sử dụng kỹ thuật đo kích thước văn bản với các phông chữ khác nhau — nếu phông chữ không được cài đặt, trình duyệt sẽ sử dụng phông chữ thay thế, điều này thay đổi kích thước. Kiểm tra hàng trăm phông chữ tạo ra một chữ ký độc nhất.
Dấu vân tay TLS và HTTP/2
Dấu vân tay JA3 được tạo ra từ các tham số của TLS Client Hello: phiên bản SSL/TLS, danh sách cipher suites, danh sách các mở rộng, danh sách các nhóm đường cong elip được hỗ trợ, định dạng điểm của các đường cong elip. Những tham số này được nối lại và băm, tạo ra một chuỗi duy nhất.
Dấu vân tay HTTP/2 phân tích các tham số của frame SETTINGS, thứ tự và ưu tiên của các luồng, giá trị cập nhật cửa sổ. Mỗi trình duyệt sử dụng các cài đặt HTTP/2 độc nhất, điều này cho phép xác định khách hàng ngay cả khi dấu vân tay TLS đúng.
Mẹo thực tiễn: Để vượt qua dấu vân tay, cần đảm bảo tính nhất quán của tất cả các tham số. Việc sử dụng User-Agent của Chrome với dấu vân tay TLS của Firefox sẽ ngay lập tức bị phát hiện. Các công cụ như curl-impersonate hoặc thư viện tls-client giúp tạo ra một dấu vân tay hoàn toàn nhất quán.
Phân tích hành vi và học máy
Phân tích hành vi là khía cạnh khó vượt qua nhất của các hệ thống chống bot hiện đại. Ngay cả với dấu vân tay kỹ thuật hoàn hảo, hành vi không giống con người sẽ phát hiện ra tự động hóa.
Phân tích chuyển động chuột và tương tác
PerimeterX và Akamai theo dõi quỹ đạo chuyển động chuột, gia tốc và giảm tốc, các chuyển động vi mô đặc trưng cho bàn tay con người. Các bot thường di chuyển con trỏ theo các đường thẳng hoặc không tạo ra sự kiện chuột. Các hệ thống cũng phân tích thời gian phản ứng — nhấp chuột ngay sau khi tải trang mà không có chuyển động chuột trông rất đáng ngờ.
Các mẫu cuộn cũng độc nhất. Con người cuộn trang không đều: nhanh ở đầu, chậm lại để đọc, đôi khi cuộn trở lại. Các bot thường cuộn với tốc độ cố định hoặc sử dụng window.scrollTo() để cuộn ngay lập tức.
Các mẫu thời gian và tốc độ hành động
Thời gian giữa các hành động là một tham số quan trọng. Con người không thể điền một mẫu gồm 10 trường trong 0.5 giây hoặc nhấp vào 50 liên kết trong một phút. Các hệ thống bảo vệ xây dựng hồ sơ tốc độ cho mỗi loại hành động và so sánh nó với hành vi của người dùng.
Sự chú ý đặc biệt được dành cho tính nhất quán của độ trễ. Nếu giữa mỗi lần nhấp chuột có đúng 2 giây, đó là một dấu hiệu rõ ràng của sleep(2000) trong mã. Độ trễ của con người có sự biến đổi tự nhiên và tuân theo các phân phối thống kê nhất định.
Các mô hình học máy
Cả hai hệ thống đều sử dụng các mô hình ML được đào tạo trên hàng triệu phiên của người dùng thực và các bot đã biết. Các mô hình phân tích hàng trăm đặc điểm cùng một lúc: thứ tự hành động, độ sâu xem trang web, các mẫu điều hướng, tương tác với các phần tử.
PerimeterX sử dụng một tập hợp các mô hình với các trọng số khác nhau cho các loại trang web khác nhau. Mô hình cho thương mại điện tử tập trung vào các mẫu mua sắm, mô hình cho các trang web truyền thông — vào các mẫu đọc nội dung. Điều này làm cho việc vượt qua trở nên khó khăn hơn, vì nó yêu cầu thích ứng với đặc thù của từng trang web.
// Ví dụ về độ trễ giống con người với sự biến đổi
function humanDelay(baseMs) {
// Phân phối lognormal thay vì uniform
const variance = baseMs * 0.3;
const delay = baseMs + (Math.random() - 0.5) * variance;
// Thêm độ trễ vi mô đặc trưng cho việc xử lý sự kiện của trình duyệt
const microDelay = Math.random() * 50;
return Math.max(100, delay + microDelay);
}
// Sử dụng: await new Promise(r => setTimeout(r, humanDelay(2000)));
Chiến lược chọn lựa và xoay vòng proxy
Việc chọn loại proxy và chiến lược xoay vòng là rất quan trọng khi làm việc với PerimeterX và Akamai. Cấu hình proxy không đúng sẽ làm vô hiệu hóa mọi nỗ lực che giấu dấu vân tay trình duyệt.
Proxy cư trú vs di động vs datacenter
Proxy datacenter có chi phí thấp nhất nhưng cũng có nguy cơ phát hiện cao nhất. PerimeterX và Akamai hỗ trợ cơ sở dữ liệu địa chỉ IP của các datacenter và tự động nâng cao mức kiểm tra cho các yêu cầu như vậy. Việc sử dụng proxy datacenter chỉ khả thi cho các nhiệm vụ ưu tiên thấp hoặc kết hợp với dấu vân tay trình duyệt rất chất lượng.
Proxy cư trú sử dụng địa chỉ IP của các nhà cung cấp internet thực, điều này làm giảm đáng kể khả năng phát hiện. Tuy nhiên, chất lượng của các proxy cư trú rất khác nhau. Quan trọng là chọn các nhà cung cấp có các pool IP sạch, nơi các địa chỉ không được sử dụng trước đó cho spam hoặc các hoạt động đáng ngờ khác.
Proxy di động cung cấp mức độ tin cậy cao nhất, vì sử dụng địa chỉ IP của các nhà mạng di động. Những địa chỉ này thường được chia sẻ giữa nhiều người dùng (carrier-grade NAT), điều này làm cho việc chặn trở nên khó khăn. Proxy di động đặc biệt hiệu quả chống lại Akamai, vì nó cẩn thận hơn trong việc chặn lưu lượng di động.
Chiến lược xoay vòng
Xoay vòng quyết liệt (thay đổi IP cho mỗi yêu cầu) là một sai lầm phổ biến. Điều này tạo ra một mẫu đáng ngờ: một người dùng không thể thay đổi địa chỉ IP của mình mỗi vài giây. Xoay vòng theo phiên hiệu quả hơn, nơi một IP được sử dụng cho toàn bộ phiên người dùng (10-30 phút hoạt động).
Đối với các hoạt động dài hạn, khuyến nghị sử dụng các phiên sticky với thời gian 30-60 phút. Điều này mô phỏng hành vi của một người dùng thực, người sẽ ở lại trên một IP trong suốt phiên. Tuy nhiên, quan trọng là không sử dụng một IP quá lâu — các phiên kéo dài vài giờ cũng trông đáng ngờ.
Tính nhất quán địa lý
Việc đảm bảo sự phù hợp giữa vị trí địa lý của địa chỉ IP và các tham số khác là rất quan trọng: ngôn ngữ trình duyệt, múi giờ, cài đặt địa phương. Nếu địa chỉ IP từ Đức nhưng navigator.language trả về "en-US", và múi giờ là "America/New_York" — đây là một kích hoạt phát hiện ngay lập tức.
Khi làm việc với nhiều khu vực địa lý, hãy sử dụng các hồ sơ trình duyệt riêng cho mỗi khu vực. Việc chuyển đổi giữa các khu vực trong cùng một phiên (IP từ Pháp, sau đó từ Nhật Bản) là điều không thể đối với một người dùng thực và sẽ ngay lập tức bị phát hiện.
| Loại proxy | Hiệu quả chống PerimeterX | Hiệu quả chống Akamai | Khuyến nghị |
|---|---|---|---|
| Datacenter | Thấp (30-40%) | Rất thấp (20-30%) | Chỉ để thử nghiệm |
| Cư trú | Cao (75-85%) | Trung bình (65-75%) | Lựa chọn chính cho hầu hết các nhiệm vụ |
| Di động | Rất cao (85-95%) | Cao (80-90%) | Cho các nhiệm vụ quan trọng và các trang web được bảo vệ cao |
Cấu hình trình duyệt chống phát hiện và công cụ
Cấu hình đúng các công cụ tự động hóa là yếu tố then chốt cho việc vượt qua PerimeterX và Akamai thành công. Ngay cả các proxy tốt nhất cũng không giúp ích nếu dấu vân tay trình duyệt chứa các dấu hiệu tự động hóa rõ ràng.
Playwright và Puppeteer: cấu hình nâng cao
Cài đặt cơ bản của Playwright hoặc Puppeteer tạo ra một trình duyệt headless rõ ràng. Cần sử dụng các plugin stealth và cấu hình bổ sung để che giấu tự động hóa. Thư viện puppeteer-extra-plugin-stealth ẩn đi các dấu hiệu chính, nhưng cần cấu hình thêm.
// Cấu hình nâng cao Playwright với chống phát hiện
const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();
chromium.use(stealth);
const browser = await chromium.launch({
headless: false, // Chế độ headless dễ bị phát hiện
args: [
'--disable-blink-features=AutomationControlled',
'--disable-features=IsolateOrigins,site-per-process',
'--disable-site-isolation-trials',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--disable-gpu',
'--window-size=1920,1080',
'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
]
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
locale: 'en-US',
timezoneId: 'America/New_York',
permissions: ['geolocation', 'notifications'],
geolocation: { latitude: 40.7128, longitude: -74.0060 }
});
Selenium với undetected-chromedriver
Selenium WebDriver tiêu chuẩn dễ bị phát hiện qua thuộc tính navigator.webdriver. Thư viện undetected-chromedriver tự động vá ChromeDriver, loại bỏ các dấu hiệu tự động hóa chính và thường xuyên được cập nhật để vượt qua các phương pháp phát hiện mới.
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1920,1080')
# Sử dụng phiên bản Chrome cụ thể để đảm bảo tính nhất quán
driver = uc.Chrome(options=options, version_main=120)
# Che giấu thêm qua CDP
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
Trình duyệt chống phát hiện: AdsPower, Multilogin, GoLogin
Các trình duyệt chống phát hiện thương mại cung cấp các giải pháp sẵn có để quản lý dấu vân tay. AdsPower và Multilogin cho phép tạo các hồ sơ với các dấu vân tay Canvas, WebGL, âm thanh độc nhất và quản lý chúng qua API. Những công cụ này đặc biệt hữu ích khi làm việc với nhiều tài khoản.
Lợi thế chính là khả năng duy trì dấu vân tay nhất quán giữa các phiên. Mỗi hồ sơ có các tham số cố định cho Canvas, WebGL, fonts, điều này là rất quan trọng cho việc hoạt động lâu dài. Tuy nhiên, cần sử dụng các cấu hình thực tế — việc tạo ra các dấu vân tay ngẫu nhiên có thể tạo ra các sự kết hợp kỹ thuật không thể, dễ dàng bị phát hiện.
Các khách hàng HTTP với dấu vân tay chính xác
Đối với các nhiệm vụ không yêu cầu kết xuất JavaScript, các khách hàng HTTP với dấu vân tay TLS và HTTP/2 chính xác hiệu quả hơn. Các thư viện curl-impersonate (đối với Python — curl_cffi) và tls-client cho phép giả mạo các dấu vân tay TLS của các trình duyệt thực.
from curl_cffi import requests
# Giả mạo Chrome 120 với dấu vân tay TLS và HTTP/2 chính xác
response = requests.get(
'https://example.com',
impersonate="chrome120",
proxies={
"http": "http://user:pass@proxy:port",
"https": "http://user:pass@proxy:port"
},
headers={
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"'
}
)
# Dấu vân tay TLS tự động tương ứng với Chrome 120
Kỹ thuật tự động hóa không kích hoạt phát hiện
Ngay cả với dấu vân tay kỹ thuật hoàn hảo, các mẫu tự động hóa có thể phát hiện ra bot. Cần phải mô phỏng hành vi con người ở cấp độ tương tác với trang web.
Mô phỏng chuyển động chuột
Chuyển động chuột thẳng từ điểm A đến điểm B là một dấu hiệu rõ ràng của tự động hóa. Bàn tay con người tạo ra các đường cong mượt mà với các điều chỉnh vi mô. Các thư viện như pyautogui cho phép tạo ra các quỹ đạo thực tế bằng cách sử dụng các đường cong Bezier.
// Tạo quỹ đạo chuột giống con người
async function humanMouseMove(page, targetX, targetY) {
const current = await page.evaluate(() => ({
x: window.mouseX || 0,
y: window.mouseY || 0
}));
const steps = 25 + Math.floor(Math.random() * 15);
const points = generateBezierCurve(current.x, current.y, targetX, targetY, steps);
for (let point of points) {
await page.mouse.move(point.x, point.y);
await new Promise(r => setTimeout(r, 10 + Math.random() * 20));
}
// Điều chỉnh vi mô trước khi nhấp chuột
await page.mouse.move(targetX + (Math.random() - 0.5) * 2,
targetY + (Math.random() - 0.5) * 2);
}
function generateBezierCurve(x1, y1, x2, y2, steps) {
const cp1x = x1 + (x2 - x1) * (0.3 + Math.random() * 0.2);
const cp1y = y1 + (y2 - y1) * (0.3 + Math.random() * 0.2);
const points = [];
for (let i = 0; i <= steps; i++) {
const t = i / steps;
const x = Math.pow(1-t, 2) * x1 + 2 * (1-t) * t * cp1x + Math.pow(t, 2) * x2;
const y = Math.pow(1-t, 2) * y1 + 2 * (1-t) * t * cp1y + Math.pow(t, 2) * y2;
points.push({x: Math.round(x), y: Math.round(y)});
}
return points;
}
Cuộn và đọc nội dung thực tế
Con người cuộn trang để đọc nội dung, dừng lại ở các phần thú vị. Bot thường cuộn đến cuối trang hoặc đến phần tử cần thiết một cách nhanh nhất có thể. Việc mô phỏng đọc yêu cầu phân tích nội dung và tạo ra các khoảng dừng thực tế.
async function humanScroll(page, targetElement) {
const elementPosition = await page.evaluate(el => {
const rect = el.getBoundingClientRect();
return rect.top + window.pageYOffset;
}, targetElement);
const currentScroll = await page.evaluate(() => window.pageYOffset);
const distance = elementPosition - currentScroll;
const scrollSteps = Math.floor(Math.abs(distance) / 100);
for (let i = 0; i < scrollSteps; i++) {
const scrollAmount = (distance / scrollSteps) * (0.8 + Math.random() * 0.4);
await page.evaluate((amount) => {
window.scrollBy({top: amount, behavior: 'smooth'});
}, scrollAmount);
// Khoảng dừng ngẫu nhiên cho "đọc"
if (Math.random() > 0.7) {
await new Promise(r => setTimeout(r, 1000 + Math.random() * 2000));
} else {
await new Promise(r => setTimeout(r, 200 + Math.random() * 400));
}
}
}
Các mẫu điều hướng tự nhiên
Người dùng không chuyển trực tiếp đến trang mục tiêu — họ tương tác với trang web một cách tự nhiên. Bắt đầu từ trang chính, truy cập một vài phần, sử dụng tìm kiếm hoặc menu điều hướng. Điều này tạo ra một lịch sử tương tác, nâng cao độ tin cậy của các hệ thống bảo vệ.
Cũng cần mô phỏng các lỗi và sửa chữa — con người có thể nhấp vào liên kết sai và quay lại, mắc lỗi khi nhập vào ô tìm kiếm và sửa lỗi chính tả. Con đường thẳng đến mục tiêu trông rất đáng ngờ.
Quản lý cookie và storage
PerimeterX và Akamai sử dụng cookie và localStorage để theo dõi các phiên. Việc xóa hoàn toàn cookie giữa các yêu cầu trông rất đáng ngờ — trình duyệt thực lưu giữ một số cookie (phân tích, cài đặt). Hãy giữ cookie giữa các phiên cho một "người dùng", nhưng sử dụng các bộ cookie khác nhau cho các hồ sơ khác nhau.
Quan trọng: Các hệ thống bảo vệ phân tích tuổi của cookie. Nếu cookie bảo vệ (_px, _abck) vừa mới xuất hiện, nhưng người dùng thể hiện hành vi của một khách truy cập thường xuyên — đây là sự không phù hợp. Đối với các hoạt động lâu dài, hãy "làm nóng" các hồ sơ bằng cách tạo ra lịch sử truy cập.
Các trường hợp thực tiễn và giải quyết các vấn đề điển hình
Hãy xem xét các kịch bản cụ thể để vượt qua PerimeterX và Akamai với các giải pháp cho các vấn đề điển hình phát sinh trong quá trình.
Kịch bản 1: Phân tích e-commerce với PerimeterX
Nhiệm vụ: trích xuất dữ liệu sản phẩm từ một cửa hàng trực tuyến lớn, được bảo vệ bởi PerimeterX. Trang web chặn sau 3-5 yêu cầu ngay cả với các IP khác nhau.
Giải pháp: Sử dụng sự kết hợp của các proxy cư trú với các phiên sticky (30 phút) và Playwright với việc mô phỏng hoàn toàn hành vi. Các điểm chính: bắt đầu từ trang chính, sử dụng tìm kiếm hoặc danh mục để điều hướng, thêm các độ trễ ngẫu nhiên từ 3-7 giây giữa các yêu cầu, mô phỏng cuộn và chuyển động chuột. Quan trọng — giữ cookie _px giữa các yêu cầu trong cùng một phiên.
// Ví dụ về phiên với việc làm nóng
async function scrapeWithWarmup(page, targetUrls) {
// Làm nóng hồ sơ
await page.goto('https://example.com');
await humanScroll(page, await page.$('footer'));
await new Promise(r => setTimeout(r, 3000 + Math.random() * 2000));
// Điều hướng qua menu
await humanMouseMove(page, menuX, menuY);
await page.click('nav a.category');
await new Promise(r => setTimeout(r, 2000 + Math.random() * 1000));
// Chỉ sau khi làm nóng mới chuyển đến các trang mục tiêu
for (let url of targetUrls) {
await page.goto(url);
await humanScroll(page, await page.$('.product-info'));
// Trích xuất dữ liệu
const data = await page.evaluate(() => extractProductData());
await new Promise(r => setTimeout(r, 5000 + Math.random() * 3000));
}
}
Kịch bản 2: Vượt qua Akamai cho các yêu cầu API
Nhiệm vụ: truy cập API được bảo vệ bởi Akamai Bot Manager. API yêu cầu các tiêu đề và token cụ thể, được tạo ra bởi JavaScript trên trang.
Giải pháp: Akamai thường sử dụng sensor_data — một chuỗi được mã hóa với kết quả kiểm tra trình duyệt. Chuỗi này được tạo ra bởi JavaScript và cần được bao gồm trong yêu cầu. Sử dụng tự động hóa trình duyệt để lấy sensor_data hợp lệ, sau đó áp dụng nó trong khách hàng HTTP với dấu vân tay TLS chính xác.
// Lấy sensor_data qua trình duyệt
async function getSensorData(page) {
await page.goto('https://example.com');
// Chờ Akamai sensor thực thi
await page.waitForTimeout(5000);
// Trích xuất sensor_data từ cookie hoặc localStorage
const sensorData = await page.evaluate(() => {
const cookie = document.cookie.split(';')
.find(c => c.trim().startsWith('_abck='));
return cookie ? cookie.split('=')[1] : null;
});
return sensorData;
}
// Sử dụng trong khách hàng HTTP
const sensorData = await getSensorData(page);
const response = await fetch('https://example.com/api/data', {
headers: {
'Cookie': `_abck=${sensorData}`,
'User-Agent': 'Mozilla/5.0...',
// Các tiêu đề khác cần phải tương ứng với trình duyệt
}
});
Kịch bản 3: Giải quyết CAPTCHA và các trang thách thức
Vấn đề: ngay cả khi cấu hình đúng, PerimeterX hoặc Akamai đôi khi hiển thị các trang thách thức hoặc CAPTCHA để kiểm tra thêm.
Giải pháp: Các trang thách thức của PerimeterX thường thực hiện kiểm tra bổ sung...