Thử thách
Trình duyệt hosted tự xử lý các thử thách thanh trượt và ô đánh dấu. Dịch vụ giải thử thách, tắt trừ khi bạn bật, sẽ nhận những thử thách mà chúng không xử lý được.
Thử thách thanh trượt
Một số trang trả về thử thách kiểu "trượt để xác minh": một tay nắm cần kéo tới cuối thanh, hoặc một mảnh ghép cần kéo vào đúng chỗ trống. Trình duyệt hosted tự xử lý những thử thách này cho bạn, ở bất kỳ tab nào và cả bên trong frame. Tính năng bật sẵn; truyền solveSliders: false khi script của bạn tự xử lý chúng.
- Nó làm gì. Thanh trượt thường được kéo tới cuối. Câu đố ghép hình được kéo cho tới khi mảnh ghép nằm đúng chỗ trống: trình duyệt tìm chỗ trống trong ảnh, kiểm tra mảnh ghép thực sự đã tới đâu rồi chỉnh lại. Thao tác kéo là chuyển động chuột giữ nút, theo nhịp của người thật, không phải nhảy cóc.
- Khi nào nó dừng tay. Nếu không tìm thấy chỗ trống một cách chắc chắn, nó để nguyên câu đố thay vì đoán, vì một lần kéo sai có thể bất lợi cho phiên. Nó thử tối đa ba lần mỗi trang, và chờ trong lúc có người điều khiển phiên từ màn hình xem trực tiếp hoặc trong lúc bàn giao.
- Bạn thấy gì. Mỗi lần thử là một sự kiện
slidertrong dòng thời gian sự kiện của phiên, cho biết thử thách sau đó đã biến mất (passed) hay chưa (failed), hoặc vì sao một câu đố được để nguyên (skipped). - Chỉ thử thách mới bị động tới: một thanh trượt được tính là thử thách khi trang hoặc widget bao quanh nó cho biết như vậy (captcha hoặc bước xác minh). Ô chọn khoảng giá trị, carousel và bộ lọc giá được giữ nguyên. Thao tác chuột của chính script của bạn và một lần kéo đang diễn ra có thể xen lẫn nhau, nên hãy tạm dừng click khi có thử thách trên màn hình, hoặc tắt tùy chọn này.
Thử thách ô đánh dấu
Một số trang yêu cầu đánh dấu ô "xác minh bạn là người thật" trước. Trình duyệt hosted tự nhấp vào ô đó cho bạn, ở bất kỳ tab nào và cả bên trong frame, kể cả những widget giấu ô này khỏi script của trang. Đây là một tùy chọn riêng, tách khỏi thanh trượt, cũng bật sẵn; truyền solveCheckboxes: false để tự xử lý các ô này.
- Những ô nào. Chỉ ô đánh dấu mà chính nội dung của nó cho biết đây là bước kiểm tra người thật (người thật, robot, captcha, xác minh bạn…). Ô "ghi nhớ đăng nhập" hay "tôi đồng ý với điều khoản" không bao giờ bị nhấp, dù phần còn lại của trang ghi gì.
- Cách nhấp. Di chuyển con trỏ tới ô theo nhịp của người thật, dừng một chút, rồi nhấn giữ lâu như một cú nhấp của người. Nếu sau đó ô mở ra một thanh trượt, thanh trượt sẽ được xử lý như thanh trượt.
- Bạn thấy gì. Mỗi lần thử là một sự kiện
checkboxtrong dòng thời gian sự kiện của phiên:passedkhi ô biến mất hoặc đã được đánh dấu,failedkhi ô vẫn đang chờ. Tối đa ba lần thử mỗi trang, và không thử khi có người đang điều khiển phiên từ màn hình xem trực tiếp hoặc trong lúc bàn giao.
Dịch vụ giải thử thách
Với những trang vẫn tiếp tục đưa ra thử thách sau các thao tác thanh trượt và ô đánh dấu miễn phí, trình duyệt hosted có thể chuyển những thử thách khó hơn cho một dịch vụ giải (solving service). Tính năng này tắt trừ khi bạn yêu cầu: truyền challengeService: true để nó tự chọn, hoặc một object để chọn những gì nó được phép làm. Nó dùng key dịch vụ giải của chính bạn, hoặc key của chúng tôi (tính phí theo từng thử thách được giải).
Chọn những thử thách mà nó xử lý
Bạn không bao giờ phải cho nó biết một site dùng widget nào hay của nhà cung cấp nào. Trình duyệt hosted tự nhận diện từng thử thách trên trang, dựa vào markup, các frame và cách thử thách đó hoạt động, rồi xếp nó vào một trong năm nhóm (category). Bạn chọn nhóm, không chọn widget.
| Nhóm | Những gì thuộc nhóm này | Có trong auto |
|---|---|---|
token | Một widget trao cho trang một token: một ô "Tôi không phải là robot" biến thành câu đố hình ảnh, một widget ẩn hiện ra câu đố của nó, một bước kiểm tra tương tác kiểu "xác minh bạn là con người" vẫn chưa được trả lời. | Có |
clearance | Một màn hình chờ toàn trang kiểu "đang kiểm tra trình duyệt của bạn" không tự biến mất. | Có |
block-page | Trang chặn của một website kèm câu đố hoặc bước kiểm tra thiết bị. | Có |
image | Mã chữ bị bóp méo đặt cạnh một ô nhập văn bản, và câu đố ghép hình mà trình duyệt không tự tìm được chỗ trống. | Có |
score | Một bước chấm điểm ẩn do chính trang chạy. | Không: bạn tự thêm vào danh sách |
- Tự chọn.
challengeService: true, hoặc một object không cócategories(hoặc cócategories: "auto"): mọi thử thách nó nhận diện được thuộctoken,clearance,block-pagevàimageđều được xử lý, trên mọi site.scorebị loại ra vì trình duyệt đã tự có token điểm của nó: lấy câu trả lời từ bên ngoài sẽ tốn một lần giải cho mỗi lần gọi, nên chỉ đáng dùng cho site nào từ chối điểm của các phiên của bạn. - Chọn nhóm.
categories: ["token", "image"]chỉ xử lý các nhóm đó. Thử thách thuộc nhóm khác vẫn được báo cáo trong dòng thời gian (dưới dạngcategory_off), nhưng không bao giờ bị tính phí. - Chọn site.
sites: ["shop.example"]giới hạn nó trong các host đó và subdomain của chúng; ở nơi khác thì không báo cáo hay gọi gì. Kết hợp vớicategoriesđể có "loại thử thách này trên site kia". - Không chắc một site dùng gì? Chạy một lần với
mode: "report": không gọi gì và không trả gì, và dòng thời gian liệt kê mọi thử thách các trang đã hiển thị dưới dạngchallenge.detectedkèmcategorycủa nó và liệu nó có giải được không. Sau đó bật đúng những nhóm đó cho site đó.
// In the body of POST /api/v1/browsers, or in the SDK's launch options (cloud: true)
// Auto-select: every challenge it recognises (all categories but score), on every site
challengeService: true
// Only widgets that hand out a token, only on one site, at most EUR 0.20 per session
challengeService: { categories: ["token"], sites: ["shop.example"], maxSpendEur: 0.2 }
// Only full-page waits and block pages, with your own solving-service key
challengeService: { categories: ["clearance", "block-page"], key: "own" }
// Auto-select plus the score check, on one site
challengeService: { categories: ["token", "clearance", "block-page", "image", "score"], sites: ["shop.example"] }
// First find out what a site uses: report only, nothing asked or paid for
challengeService: { mode: "report" }Tất cả các trường
| Trường | Kiểu | Mặc định | Ý nghĩa |
|---|---|---|---|
categories | "auto" hoặc danh sách gồm token, score, clearance, block-page, image | "auto" | Những loại thử thách nào được phép trả lời. auto là tất cả trừ score. |
sites | danh sách hostname | mọi site | Chỉ trên các host này và subdomain của chúng (tối đa 50). |
key | "own" hoặc "managed" | key đã lưu của bạn nếu có, nếu không thì key của chúng tôi | Dùng key dịch vụ giải của ai: của bạn, hoặc của chúng tôi (tính phí theo từng thử thách được giải). |
apiKey | chuỗi | không có | Key dịch vụ giải của bạn, chỉ cho phiên này (lưu dạng mã hóa, không bao giờ hiển thị lại). Ngầm định key: "own". |
mode | "solve" hoặc "report" | "solve" | report chỉ nhận diện và báo cáo; không gọi gì, không trả gì và không cần key. |
maxSolves | số nguyên, từ 1 đến 100 | 10 | Số lần gọi mỗi phiên; việc gọi dừng khi đạt đến số này. |
maxSpendEur | số, từ 0.01 đến 100 | 0.50 | Số tiền một phiên được chi cho việc giải (với key của chúng tôi, đó là số bạn trả); việc gọi dừng ở mức đó. |
Cách hoạt động
- Miễn phí trước. Các thao tác thanh trượt và ô đánh dấu luôn chạy trước. Dịch vụ chỉ được gọi khi thử thách vẫn còn sau khi đã có cơ hội hợp lý: câu đố hình ảnh hiện ra, widget ẩn mở câu đố của nó, widget không được trả lời trong khoảng 15 đến 25 giây, màn hình chờ toàn trang không biến mất sau khoảng 20 giây, hoặc trang là trang chặn hay mã chữ.
- Câu trả lời được đưa vào thế nào. Theo đúng cách trang mong đợi: token vào trường phản hồi của widget và callback của nó, cookie cho trang rồi tải lại, mã được gõ vào ô của nó, mảnh ghép được kéo vào đúng chỗ. Sau đó nó kiểm tra xem thử thách đã biến mất chưa, giống các thao tác miễn phí.
- Cùng một IP. Màn hình chờ toàn trang và trang chặn phải được giải từ chính IP sẽ dùng câu trả lời: dịch vụ giải chúng qua IP đầu ra của chính phiên của bạn, bằng một kết nối ngắn hạn, chỉ dùng một lần. Token bị trang từ chối sẽ được yêu cầu thêm một lần nữa theo cùng cách.
- Key của bạn hoặc của chúng tôi.
key: "own"dùng key dịch vụ giải của bạn: lưu một lần trong dashboard (Settings), hoặc truyềnapiKeycùng request. Key được lưu dạng mã hóa, không bao giờ hiển thị lại và không bao giờ tới trình duyệt; bạn trả tiền trực tiếp cho dịch vụ.key: "managed"dùng key của chúng tôi: mỗi thử thách được giải sẽ trừ vào số dư hosted của bạn theo giá gốc của dịch vụ × 1.5, lần thử thất bại thì miễn phí. Bỏkeyđể dùng key đã lưu nếu bạn có, nếu không thì dùng key của chúng tôi. - Giới hạn. Tối đa 2 lần gọi cho mỗi thử thách trên mỗi trang. Mỗi phiên có
maxSolves(mặc định 10, tối đa 100) vàmaxSpendEur(mặc định €0.50): việc gọi dừng khi chạm một trong hai. Với key của chúng tôi, còn có hạn mức hằng tháng cho mỗi tài khoản (đặt trong dashboard, tối đa €25). Key sai hoặc số dư đã hết ở phía dịch vụ sẽ dừng việc gọi cho phiên đó. - Bạn thấy gì.
challenge.detectedmột lần cho mỗi thử thách trên mỗi trang, vàchallenge.servicecho mỗi lần gọi (solved,failedhoặcskipped, kèm lý do và chi phí của dịch vụ) trong dòng thời gian sự kiện;challenges(key của ai, bao nhiêu lần gọi, các lần giải bằng key của chúng tôi tốn bao nhiêu) trên phiên. Trong một lượt chạy agent, agent sẽ chờ trong lúc dịch vụ xử lý một trang. - Một số widget được phát hiện nhưng không được giải: câu trả lời của chúng không thể đưa ngược vào trang theo một cách chung. Chúng được báo cáo với
solvable: falsevà không bao giờ bị tính phí. Địa chỉ trang và chi tiết của thử thách được gửi tới dịch vụ giải.
Điều gì xảy ra với từng loại
| Trên trang | Nhóm | Yêu cầu gửi tới dịch vụ | Câu trả lời được đưa vào thế nào |
|---|---|---|---|
| Ô "Tôi không phải là robot" mà khi nhấp vào đã mở ra câu đố hình ảnh | token | Một token cho widget đó | Vào trường phản hồi của widget, và callback của trang được gọi với token đó |
| Một widget ẩn đã hiện ra câu đố hình ảnh | token | Một token cho widget đó | Như trên |
| Một bước kiểm tra tương tác kiểu "xác minh bạn là con người" vẫn chưa được trả lời | token | Một token cho widget đó | Như trên |
| Mã chữ bị bóp méo đặt cạnh một ô nhập văn bản | image | Chữ trong hình | Được gõ vào ô, từng phím một, sau khi nhấp vào ô |
| Thanh trượt ghép hình mà trình duyệt không tự đặt đúng chỗ được (ví dụ loại có một chỗ trống giả để đánh lừa) | image | Chỗ trống nằm ở đâu | Trình duyệt kéo mảnh ghép tới đó, đồng thời kiểm tra xem nó thực sự đã nằm ở đâu |
| Màn hình chờ toàn trang kiểu "đang kiểm tra trình duyệt của bạn" không biến mất | clearance | Một cookie clearance, được giải qua IP đầu ra của phiên của bạn | Được đặt cho trang, rồi trang tải lại |
| Trang chặn kèm câu đố hoặc bước kiểm tra thiết bị | block-page | Một cookie, được giải qua IP đầu ra của phiên của bạn | Được đặt cho trang, rồi trang tải lại |
Bước chấm điểm ẩn do chính trang chạy (chỉ khi có score trong danh sách) | score | Một token điểm cho hành động riêng của trang | Được trao cho lời gọi xin token của chính trang |
Các thao tác miễn phí vẫn chạy trước: thanh trượt thường được kéo, câu đố ghép hình mà trình duyệt tìm được chỗ trống thì được đặt vào, và ô tự đánh dấu khi nhấp thì được nhấp, tất cả đều không cần gọi dịch vụ. Trong widget, bản thân ô có thể vẫn chưa được đánh dấu sau khi token đã được đưa vào: trang đọc trường phản hồi và callback, không phải ô.
Từ các SDK
SDK 0.38.0 trở lên nhận tùy chọn này khi khởi chạy trên cloud (Python: challenge_service, vốn cũng nhận max_solves, max_spend_eur và api_key). Dòng thời gian cho biết điều gì đã xảy ra; các sự kiện cuối cùng của nó đến vài giây sau khi phiên kết thúc.
import { Cloud, launch } from "clearcote";
const browser = await launch({
cloud: true,
challengeService: { categories: ["token", "image"], sites: ["shop.example"], maxSpendEur: 0.2 },
});
const page = await browser.newPage();
await page.goto("https://shop.example/signup");
// ... your script: challenges the free actions cannot clear are answered for you
const id = browser.cloudSession.id;
await browser.close();
const { events } = await new Cloud().browsers.events(id);
for (const e of events) if (e.type.startsWith("challenge.")) console.log(e.type, e.data);
// challenge.detected { category: "token", solvable: true }
// challenge.service { category: "token", outcome: "solved", applied: "callback", attempt: 1, ms: 12725, costUsd: 0.00013 }from clearcote import Cloud, launch
browser = launch(cloud=True, challenge_service={"categories": ["token", "image"], "sites": ["shop.example"], "max_spend_eur": 0.2})
page = browser.new_page()
page.goto("https://shop.example/signup")
session_id = browser.cloud_session["id"]
browser.close()
for e in Cloud().browsers.events(session_id)["events"]:
if e["type"].startswith("challenge."):
print(e["type"], e["data"])