Tất cả bài viết

Bên trong Web Unblocker: Flag Unblocker thực sự làm gì

Một flag kích hoạt ba thay đổi: header trình duyệt thực tế, TLS fingerprint khớp hoàn toàn, và tự động giải nén cho gzip và brotli. Dưới đây là những gì đã thay đổi và lý do tại sao.

Hầu hết các scraper đều thất bại trước khi một header đơn lẻ được đọc.

Máy chủ xem xét TLS handshake (thứ tự cipher suite, thứ tự extension, tùy chọn curve) và quyết định xem bạn là một trình duyệt hay một thư viện client đang giả dạng. Python requests, net/http của Go, curl thông thường: tất cả chúng đều gửi một fingerprint đặc trưng ngay khi bắt đầu kết nối. Các trang web chú trọng bảo mật (Datadome, Akamai, Imperva, phân hệ được quản lý của Cloudflare) sẽ ngắt kết nối hoặc hiển thị trang thử thách trước khi chuỗi User-Agent của bạn kịp có tác dụng.

Đó là những gì unblocker: true giải quyết trên FourA. Trong tháng qua, chúng tôi đã hoàn thiện các thành phần giúp tính năng này hoạt động ổn định.

Có gì mới

unblocker: true là một flag duy nhất trên bất kỳ lệnh gọi /api/single nào. Khi kích hoạt, chúng tôi sẽ thực hiện ba việc: chèn tập hợp header của trình duyệt, gửi request qua curl-impersonate với một TLS fingerprint của trình duyệt thực, và giải nén bất kỳ dữ liệu nào máy chủ trả về (gzip, brotli, deflate). Hai tính năng đầu tiên đã có sẵn từ bản beta. Tính năng thứ ba (tự động giải nén brotli) đã được phát hành vào ngày 25 tháng 3, và việc cố định phiên bản trình duyệt đã được triển khai vào ngày hôm sau để giữ cho các header và TLS luôn đồng bộ.

Cách hoạt động

Dưới đây là cấu trúc của một request:

curl -X POST "https://api.foura.ai/api/single" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "url": "https://example.com/products",
    "method": "GET",
    "unblocker": true
  }'

Ba lớp xử lý chạy bên dưới.

Header injection. Chúng tôi thiết lập toàn bộ gói header của trình duyệt: User-Agent, Sec-Ch-Ua, Sec-Ch-Ua-Platform, Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest, Accept, Accept-Language, và Accept-Encoding. Thứ tự rất quan trọng. Các trình duyệt thực tế gửi các header này theo một trình tự cụ thể, và các thư viện phát hiện sẽ kiểm tra điều đó.

TLS fingerprint. curl-impersonate 0.8.2 biên dịch libcurl với BoringSSL và sắp xếp lại các TLS extension để khớp với những gì phiên bản trình duyệt mục tiêu thực sự gửi qua đường truyền. Các hash JA3 và JA4 của bạn sẽ hoàn toàn trùng khớp với một phiên bản trình duyệt thực tế. curl tiêu chuẩn, Python requests, và net/http của Go tạo ra các fingerprint bị hệ thống tự động gắn cờ chỉ trong vòng vài mili giây trên các hạ tầng được bảo vệ.

Auto-decompression. Khi unblocker được bật, chúng tôi đặt Accept-Encoding thành gzip, deflate, br và để libcurl giải nén body. Bạn sẽ nhận lại một chuỗi đã được giải mã (hoặc một Buffer nếu bạn truyền returnBuffer: true). Không cần xử lý brotli thủ công, không còn tình trạng không khớp giữa header và body khi một trang web chọn deflate thay vì gzip.

Tại sao việc cố định phiên bản lại quan trọng

Các TLS fingerprint được khóa theo phiên bản. Thứ tự cipher của trình duyệt tháng này không giống tháng trước, và một trang web thực hiện fingerprint kỹ lưỡng sẽ nhận ra sự thay đổi này. curl-impersonate cung cấp các profile cho các bản build trình duyệt cụ thể, và chúng tôi cố định binary trình duyệt thực tế của mình theo bất kỳ bản build nào mà curl-impersonate hiện đang nhắm tới. Các header, đối tượng navigator, và TLS đều báo cáo cùng một phiên bản.

Nếu điều đó nghe có vẻ phức tạp, thì đúng là như vậy. Chúng tôi đã gặp sự cố không khớp trong đợt di chuyển monorepo vào tháng 3 khi trình duyệt tự động cập nhật và các header bị lệch nhịp với curl-impersonate. Cách khắc phục là hai commit: cố định binary của trình duyệt, và không bao giờ tin tưởng trình quản lý gói sẽ tự động đồng bộ chúng cho bạn.

Tác động

Trong các thử nghiệm nội bộ đối với các mục tiêu bị fingerprint nghiêm ngặt (tài chính, du lịch, thương mại điện tử được bảo vệ), sự khác biệt giữa unblocker: falseunblocker: true là sự khác biệt giữa một trang thử thách và mã phản hồi 200. curl thông thường khi truy cập Cloudflare được quản lý sẽ nhận ngay mã 403 trong lần thử đầu tiên. Cùng một URL đó với unblocker: true sẽ vượt qua thành công vì TLS hello trông giống như một handshake của trình duyệt thực tế.

Nhưng đối với các trang web không kiểm tra fingerprint (hầu hết các API công khai, các template CMS cũ hơn, bất kỳ thứ gì chỉ bị giới hạn bởi IP rate limit), việc tắt unblocker là hoàn toàn ổn và tiết kiệm được vài mili giây thương lượng TLS. Hãy sử dụng nó khi bạn thực sự cần.

Dành cho Power User

Một vài pattern đáng lưu ý.

Kết hợp unblocker với một residential proxy khi mục tiêu cũng kiểm tra danh tiếng của IP. Các IP datacenter kết hợp với một TLS handshake hoàn hảo vẫn sẽ bị gắn cờ trên các ASN mà trang web đã đưa vào danh sách đen. proxy endpoint của chúng tôi (/api/proxy) xoay vòng theo tên miền mục tiêu, vì vậy việc thêm "proxy": "residential" vào request thường là đủ.

Bỏ qua unblocker khi gọi các JSON API không quan tâm đến trình duyệt. Các header bổ sung thực chất có thể trông đáng ngờ đối với một API vốn mong đợi một client dạng lập trình, ví dụ như một backend đang gọi microservice của chính nó.

Nếu trang web chạy các giải pháp anti-bot bằng JavaScript (thử thách tương tác Turnstile, Perimeter X ở mức nghiêm ngặt nhất, Akamai Bot Manager với các heuristic được bật tối đa), chỉ riêng unblocker sẽ không đủ. Bạn cần browser endpoint, vốn chạy Chromium thực tế và có thể thực thi thử thách. Đó là một sản phẩm khác với mức tính phí credit khác, và chúng tôi đã viết chi tiết về nó trong bài viết Browser Tasks: Cách cào các trang web nặng JavaScript.

And you can combine unblocker with the validate block to reject responses that technically return 200 but contain a challenge page:

{
  "url": "https://example.com/products",
  "method": "GET",
  "unblocker": true,
  "validate": {
    "data": { "fail": ["captcha", "Access Denied"] }
  }
}

Điều đó giúp chuyển đổi các thất bại thầm lặng thành các thất bại được phân loại rõ ràng, điều này rất quan trọng đối với việc theo dõi tỷ lệ thành công của bạn trong dashboard.

Bước tiếp theo

Các trình duyệt phát hành phiên bản ổn định mới sau mỗi bốn tuần. Người duy trì curl-impersonate thường cập nhật sau đó một tháng, và chúng tôi sẽ nâng cấp hệ thống của mình khi họ thực hiện việc đó. Bạn không cần phải thay đổi bất kỳ điều gì phía bạn: unblocker: true sẽ tiếp tục trỏ đến bất kỳ phiên bản trình duyệt nào mà chúng tôi đã xác minh toàn diện (end-to-end).

Những thử thách khó khăn hơn đang ở phía trước. HTTP/3 fingerprinting đã bắt đầu xuất hiện trên các hệ thống anti-bot được quản lý, giao thức truyền tải QUIC khó giả mạo hơn TLS 1.3, và quá trình chuyển dịch từ các gói header tĩnh sang giả lập thực sự động đang bắt đầu. Các trang web được bảo vệ đã chuyển sang kiểm tra thứ tự frame HTTP/2 và các biến thể JA4+, và khoảng cách giữa "curl trông giống trình duyệt" và "một trình duyệt thực sự" sẽ ngày càng thu hẹp từ cả hai phía. Chúng tôi sẽ viết về chủ đề này khi phát hành tính năng mới.