Chuyển đến nội dung

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 slider trong 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 checkbox trong dòng thời gian sự kiện của phiên: passed khi ô biến mất hoặc đã được đánh dấu, failed khi ô 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ómNhững gì thuộc nhóm nàyCó trong auto
tokenMộ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ó
clearanceMộ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-pageTrang chặn của một website kèm câu đố hoặc bước kiểm tra thiết bị.Có
imageMã 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ó
scoreMộ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ộc token, clearance, block-page và image đều được xử lý, trên mọi site. score bị 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ạng category_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ới categories để 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ạng challenge.detected kèm category của nó và liệu nó có giải được không. Sau đó bật đúng những nhóm đó cho site đó.
javascript
// 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ườngKiểuMặ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.
sitesdanh sách hostnamemọi siteChỉ 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ôiDù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).
apiKeychuỗikhô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.
maxSolvessố nguyên, từ 1 đến 10010Số lần gọi mỗi phiên; việc gọi dừng khi đạt đến số này.
maxSpendEursố, từ 0.01 đến 1000.50Số 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ền apiKey cù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.detected một lần cho mỗi thử thách trên mỗi trang, và challenge.service cho mỗi lần gọi (solved, failed hoặc skipped, 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: false và 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 trangNhómYê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 ảnhtokenMộ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 ảnhtokenMộ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ờitokenMột token cho widget đóNhư trên
Mã chữ bị bóp méo đặt cạnh một ô nhập văn bảnimageChữ 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)imageChỗ trống nằm ở đâuTrì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ấtclearanceMộ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-pageMộ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)scoreMộ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.

typescript
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 }
python
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"])