Cách phát hiện các tham số Turnstile của Cloudflare: sitekey, cData, action
Advanced Bot Mitigation Engineer
Tóm tắt:
- Cloudflare Turnstile được cấu hình bởi một vài tham số, và có thể đọc từ trang.
sitekeyluôn có mặt;action,cData, và callback được thiết lập bởi trang khi sử dụng chúng. - Các widget chế độ ngầm mang các tham số dưới dạng thuộc tính
data-*. Đọcdata-sitekey,data-action,data-cdata, vàdata-callbackngay từ phần tử.cf-turnstile. - Các widget chế độ rõ ràng truyền các tham số vào
turnstile.render(). Kết nối cuộc gọi đó trước khi trang chạy và bạn sẽ nắm được toàn bộ đối tượng tùy chọn —sitekey,action,cData, vàchlPageData. - Trong một lần chạy thực tế, widget tiết lộ
sitekey0x4AAAAAAAW9zqSPAlyOSMfOvà mộtcallback. Kết nối render vẫn rỗng vì trang đó sử dụng chế độ ngầm — các tham số nằm trong DOM thay vào đó. - Thực hiện điều này trên một trình duyệt thực. Các tham số chỉ tồn tại khi script widget chạy, vì vậy đọc chúng từ một trang đã được render, không phải HTML thô.
- Miễn phí để bắt đầu. Các tài khoản Scraping không mất phí mới bao gồm runtime Scraping Browser miễn phí — đăng ký tại app.scrapeless.com.
Giới thiệu: các tham số cấu hình một widget Turnstile
Cloudflare Turnstile là widget mà một trang nhúng để xác minh một visitor là người — người kế nhiệm cho CAPTCHA checkbox. Khi nó tải, nó được cấu hình bởi một bộ tham số nhỏ: một site key công khai xác định widget, một nhãn action tùy chọn đặt tên cho sự kiện bảo vệ, một payload cData tùy chọn mà trang đính kèm, và một callback nhận token khi widget vượt qua. Biết cách đọc các tham số đó từ một trang là bước đầu tiên để hiểu, kiểm tra, hoặc tự động hóa bất kỳ luồng nào được bảo vệ bởi Turnstile.
Có hai cách mà một trang kết nối Turnstile, và mỗi cách phơi bày các tham số khác nhau. Hướng dẫn này bao gồm cả hai — đọc chúng từ DOM trong chế độ ngầm, và thu thập chúng từ cuộc gọi turnstile.render() trong chế độ rõ ràng — với một lần chạy trực tiếp trên một widget Turnstile thực tế.
Các tham số, và từng cái là gì
| Tham số | Thuộc tính / tùy chọn | Thao tác của nó |
|---|---|---|
| Site key | data-sitekey / sitekey |
Khóa công khai xác định widget; luôn có mặt (định dạng 0x…). |
| Action | data-action / action |
Nhãn tùy chọn đặt tên cho sự kiện bảo vệ (ví dụ: login). |
| cData | data-cdata / cData |
Xâu dữ liệu khách hàng tùy chọn mà trang đính kèm vào thách thức. |
| Callback | data-callback / callback |
Hàm nhận token khi widget vượt qua. |
| chlPageData | chlPageData |
Dữ liệu trang được truyền trong các render rõ ràng trên một số luồng được quản lý. |
Site key là công khai theo thiết kế — điều đó có nghĩa là nó có mặt trên trang. Các giá trị action và cData chỉ tồn tại khi trang chọn thiết lập chúng.
Tại sao chọn Scrapeless Scraping Browser
Scrapeless Scraping Browser là một trình duyệt đám mây tùy chỉnh, chống phát hiện được thiết kế cho các công cụ thu thập dữ liệu web và các đại lý AI. Để đọc các tham số widget cụ thể, nó mang lại:
- Render thực sự bên đám mây — script widget thực sự chạy, vì vậy các tham số tồn tại để đọc.
- Kết nối Puppeteer tiêu chuẩn —
puppeteer.connect()trả về mộtBrowserthông thường; bạn kiểm tra trang một cách bình thường. - Hỗ trợ
evaluateOnNewDocument— tiêm một hook trước khi các script của trang chạy, đó là điều mà việc thu thập chế độ rõ cần. - Proxy dân cư tại hơn 195 quốc gia — tiếp cận các trang chỉ phục vụ widget thực của chúng để đảm bảo egress sạch.
Nhận khóa API của bạn ở kế hoạch miễn phí tại app.scrapeless.com.
Yêu cầu
- Node.js 18 trở lên
- Tài khoản và khóa API Scrapeless — đăng ký tại app.scrapeless.com
- Sự quen thuộc cơ bản với Puppeteer và DOM
Cài đặt
bash
npm install puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
Chế độ ngầm: đọc các tham số từ DOM
Trường hợp phổ biến là một widget ngầm: một phần tử <div class="cf-turnstile" data-sitekey="…"> mà Turnstile tự động render. Các tham số là các thuộc tính tùy chỉnh data-* của phần tử, vì vậy hãy đọc chúng khi widget đã được gắn:
javascript
import puppeteer from 'puppeteer-core';
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: '180',
proxyCountry: 'US',
});
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://browser.scrapeless.com/api/v2/browser?${params}`,
});
const page = await browser.newPage();
await page.goto('https://www.scrapingcourse.com/login/cf-turnstile', {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
await new Promise((r) => setTimeout(r, 6000)); // cho phép script widget gắn kết
const widget = await page.evaluate(() => {
const el = document.querySelector('.cf-turnstile, [data-sitekey]');
Nếu (!el) trả về null;
const attrs = {};
for (const a of el.attributes) attrs[a.name] = a.value;
return attrs;
});
console.log(widget);
// {
// id: "waf",
// class: "cf-turnstile",
// "data-sitekey": "0x4AAAAAAAW9zqSPAlyOSMfO",
// "data-callback": "javascriptCallback"
// }
await browser.close();
Trong một lần chạy thực tế, điều này đã trả về data-sitekey của widget (0x4AAAAAAAW9zqSPAlyOSMfO) và data-callback của nó. Trang cụ thể này không thiết lập data-action hoặc data-cdata — những khóa đó đơn giản là không xuất hiện, điều này là bình thường: chúng chỉ xuất hiện khi trang web cấu hình chúng, và bạn đọc chúng theo cách tương tự khi chúng có.
Nhận khóa API của bạn trên kế hoạch miễn phí: app.scrapeless.com
Chế độ rõ ràng: bắt các tham số từ turnstile.render()
Khi một trang web hiển thị Turnstile một cách rõ ràng, nó gọi turnstile.render(container, options) trong JavaScript, và các tham số nằm trong đối tượng options đó — không phải trong DOM. Để đọc chúng, hãy móc turnstile.render trước khi script của trang chạy, sử dụng evaluateOnNewDocument và một trình thiết lập thuộc tính qua Object.defineProperty:
javascript
await page.evaluateOnNewDocument(() => {
window.__tsParams = [];
Object.defineProperty(window, 'turnstile', {
configurable: true,
get() { return this.__ts; },
set(v) {
this.__ts = v;
if (v && v.render && !v.__wrapped) {
const orig = v.render.bind(v);
v.render = (el, opts) => { window.__tsParams.push(opts || {}); return orig(el, opts); };
v.__wrapped = true;
}
},
});
});
await page.goto('https://example.com/turnstile-page', { waitUntil: 'domcontentloaded' });
await new Promise((r) => setTimeout(r, 7000));
const captured = await page.evaluate(() => window.__tsParams);
console.log(captured);
// hiển thị rõ ràng → [{ sitekey: "0x…", action: "login", cData: "…", callback: [Function] }]
Móc này sẽ bao bọc render ngay khi trang gán window.turnstile, vì vậy mọi lần hiển thị rõ ràng đều được ghi lại với tất cả các tùy chọn của nó — sitekey, action, cData và chlPageData khi có. Trên một trang ở chế độ ngầm định, mảng này sẽ vẫn trống, vì trang web không bao giờ gọi render() tự nó — đây là dấu hiệu đáng tin cậy rằng bạn nên đọc các tham số từ các thuộc tính DOM thay vì. Chạy cả hai và sử dụng cái nào có dữ liệu.
Ghi chú
- Khóa trang web là công khai; coi
actionvàcDatalà tùy chọn. Cảnh giác với sự vắng mặt của chúng thay vì giả định rằng mỗi widget đều thiết lập chúng. - Đọc từ một trang đã được hiển thị, không phải HTML thô. Trong chế độ rõ ràng, các tham số không bao giờ xuất hiện trong markup được phục vụ — chúng chỉ tồn tại sau khi script widget chạy, đó là lý do tại sao cần một trình duyệt thực.
- Ưu tiên một bộ chọn bền vững.
.cf-turnstilevà[data-sitekey]là các mốc ổn định; markup xung quanh thì không. - Mã thông báo là một bước riêng biệt. Đọc các tham số không giống như việc truyền widget — mã thông báo
cf-turnstile-responseđược tạo ra bởi callback sau khi widget xác thực, và được xác minh ở phía máy chủ theo tài liệu xác minh phía máy chủ của Cloudflare's Turnstile.
Kết luận: cấu hình của widget, đọc từ trang
Các tham số của Turnstile không bị ẩn — khóa trang web được thiết kế để công khai, và các giá trị action và cData có thể đọc ở bất cứ đâu khi trang web thiết lập chúng. Đọc chúng từ các thuộc tính data-* trong chế độ ngầm định, hoặc móc turnstile.render() để ghi lại đối tượng tùy chọn trong chế độ rõ ràng, và chạy cả hai để bất cứ điều gì mà trang sử dụng đều được bao phủ. Đối với cơ chế điều khiển trình duyệt đám mây, tài liệu Scraping Browser đề cập đến toàn bộ quy trình, và khía cạnh chống bot được giải thích trong hướng dẫn về xóa thách thức Cloudflare; các tài liệu đề cập đến phần còn lại.
Đã sẵn sàng để xây dựng quy trình dữ liệu AI của bạn?
Tham gia cộng đồng của chúng tôi để nhận kế hoạch miễn phí và kết nối với các nhà phát triển làm việc trên các luồng chống bot: Discord · Telegram.
Đăng ký tại app.scrapeless.com để nhận miễn phí thời gian chạy Trình duyệt Scraping, và xem giá cả để mở rộng quy mô.
Câu hỏi thường gặp
Q: Các tham số của widget Turnstile có gì?
Một sitekey công cộng (luôn có, định dạng 0x…), một nhãn action tùy chọn, một chuỗi cData tùy chọn, và một callback nhận token. Các bản vẽ rõ ràng cũng có thể truyền chlPageData.
Q: Tôi tìm thấy site key ở đâu?
Trên phần tử widget dưới dạng data-sitekey trong chế độ ngầm định, hoặc trong các tùy chọn truyền vào turnstile.render() trong chế độ rõ ràng. Trong một lần chạy thực tế, nó đọc 0x4AAAAAAAW9zqSPAlyOSMfO.
Q: Tại sao data-action hoặc data-cdata lại thiếu?
Bởi vì trang web không thiết lập chúng - cả hai đều là tùy chọn. Khi một trang sử dụng chúng, chúng xuất hiện dưới dạng data-action / data-cdata (ngầm định) hoặc action / cData (rõ ràng), đọc cùng một cách.
Q: Tại sao tôi cần một trình duyệt thực thay vì lấy HTML?
Trong chế độ rõ ràng, các tham số được truyền vào JavaScript và không bao giờ xuất hiện trong mã được phục vụ; chúng chỉ tồn tại sau khi tập lệnh widget chạy. Một trình duyệt đám mây sẽ hiển thị trang web để các giá trị có mặt.
Q: Đọc các tham số có vượt qua thử thách không?
Không. Các tham số cấu hình widget; token cf-turnstile-response được sản xuất riêng biệt bởi callback sau khi widget xác thực, và được kiểm tra trên máy chủ.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.



