Challenges
Gehostete Browser erledigen Slider- und Checkbox-Challenges von selbst. Der Challenge-Service übernimmt die, die sie nicht lösen können; er ist aus, solange Sie ihn nicht einschalten.
Slider-Challenges
Manche Sites antworten mit einer Slide-to-verify-Challenge: einem Griff, der ans Ende einer Leiste gezogen wird, oder einem Puzzleteil, das in seine Lücke gehört. Ein gehosteter Browser erledigt das für Sie, in jedem Tab und auch in Frames. Das ist standardmäßig aktiv; übergeben Sie solveSliders: false, wenn Ihr Skript sich selbst darum kümmert.
- Was passiert. Ein einfacher Slider wird bis ans Ende gezogen. Ein Puzzle wird gezogen, bis das Teil in seiner Lücke sitzt: Der Browser findet die Lücke im Puzzlebild, prüft dann, wo das Teil tatsächlich gelandet ist, und korrigiert. Gezogen wird mit gedrückter Maustaste in menschlichem Tempo, nicht in einem Sprung.
- Wann er sich zurückhält. Findet er die Lücke nicht sicher, lässt er das Puzzle in Ruhe, statt zu raten, denn ein falscher Zug kann gegen die Session zählen. Er versucht es höchstens dreimal pro Seite und wartet, solange jemand die Session über die Live-Ansicht steuert oder eine Übergabe läuft.
- Was Sie sehen. Jeder Versuch ist ein
slider-Ereignis in der Ereignis-Timeline der Session, mit dem Ergebnis: Die Challenge war danach weg (passed) oder nicht (failed), oder warum ein Puzzle nicht angefasst wurde (skipped). - Angefasst werden nur Challenges: Ein Slider zählt als solche, wenn die Seite oder das Widget drumherum es sagt (ein Captcha oder eine Verifizierung). Range-Inputs, Karussells und Preisfilter bleiben unberührt. Mauseingaben Ihres Skripts und ein laufender Zug können sich überschneiden; pausieren Sie also Klicks, solange eine Challenge zu sehen ist, oder schalten Sie die Option ab.
Checkbox-Challenges
Manche Sites verlangen zuerst ein Häkchen bei „Bestätigen Sie, dass Sie ein Mensch sind“. Ein gehosteter Browser klickt es für Sie an, in jedem Tab und auch in Frames, einschließlich Widgets, die das Kästchen vor Seitenskripten verbergen. Das ist eine eigene Option, getrennt von den Slidern, ebenfalls standardmäßig aktiv; übergeben Sie solveCheckboxes: false, wenn Sie diese Kästchen selbst behandeln.
- Welche Kästchen. Nur eine Checkbox, deren eigene Beschriftung sie als Mensch-Prüfung ausweist (Mensch, Roboter, Captcha, bestätigen Sie, dass Sie …). Ein Kästchen wie „Angemeldet bleiben“ oder „Ich stimme den Bedingungen zu“ wird nie angeklickt, egal was sonst auf der Seite steht.
- Der Klick. Eine Zeigerbewegung in menschlichem Tempo zum Kästchen, eine kurze Pause und ein Druck, so lange gehalten wie bei einem Menschen. Öffnet das Kästchen danach einen Slider, wird dieser wie ein Slider behandelt.
- Was Sie sehen. Jeder Versuch ist ein
checkbox-Ereignis in der Ereignis-Timeline der Session:passed, wenn das Kästchen verschwunden ist oder angehakt wurde,failed, wenn es noch wartete. Höchstens drei Versuche pro Seite und keiner, solange jemand die Session über die Live-Ansicht steuert oder eine Übergabe läuft.
Challenge-Service
Für Sites, die auch nach den kostenlosen Slider- und Checkbox-Aktionen weiter Challenges stellen, kann ein gehosteter Browser die schwierigeren Challenges an einen Lösungsdienst übergeben. Das ist aus, solange Sie es nicht anfordern: Übergeben Sie challengeService: true, damit er selbst auswählt, oder ein Objekt, um festzulegen, was er tun darf. Verwendet wird Ihr eigener Key für den Lösungsdienst oder unserer (abgerechnet pro gelöster Challenge).
Festlegen, welche Challenges er übernimmt
Sie sagen ihm nie, welches Widget oder welchen Anbieter eine Site verwendet. Der gehostete Browser erkennt jede Challenge auf der Seite selbst, anhand ihres Markups, ihrer Frames und ihres Verhaltens, und ordnet sie einer von fünf Kategorien zu. Sie wählen Kategorien, nicht Widgets.
| Kategorie | Was dazu zählt | Teil von auto |
|---|---|---|
token | Ein Widget, das der Seite ein Token übergibt: ein Kästchen „Ich bin kein Roboter“, aus dem ein Bilderrätsel wird, ein unsichtbares Widget, dessen Rätsel erscheint, eine interaktive Prüfung „Bestätigen Sie, dass Sie ein Mensch sind“, die unbeantwortet bleibt. | Ja |
clearance | Eine ganzseitige Warteseite („Ihr Browser wird überprüft“), die sich nicht von selbst auflöst. | Ja |
block-page | Die Sperrseite einer Site mit einem Rätsel oder einer Geräteprüfung. | Ja |
image | Ein Code aus verzerrtem Text neben einem Textfeld sowie ein Puzzle, bei dem der Browser die Lücke nicht selbst finden konnte. | Ja |
score | Eine unsichtbare Score-Prüfung, die die Seite selbst ausführt. | Nein: selbst aufführen |
- Automatische Auswahl.
challengeService: trueoder ein Objekt ohnecategories(oder mitcategories: "auto"): Jede Challenge, die er intoken,clearance,block-pageundimageerkennt, wird übernommen, auf jeder Site.scorebleibt außen vor, weil der Browser sein eigenes Score-Token bereits selbst erzielt: Die Prüfung anderweitig beantworten zu lassen, kostet bei jedem Aufruf eine Lösung und lohnt sich daher nur für eine Site, die die Scores Ihrer Sessions ablehnt. - Kategorien wählen.
categories: ["token", "image"]übernimmt nur diese. Eine Challenge einer anderen Kategorie wird trotzdem in der Timeline gemeldet (alscategory_off), aber nie berechnet. - Sites wählen.
sites: ["shop.example"]beschränkt ihn auf diese Hosts und ihre Subdomains; anderswo wird nichts gemeldet oder angefragt. Kombinieren Sie das mitcategoriesfür „diese Art Challenge auf jener Site“. - Unsicher, was eine Site einsetzt? Starten Sie einen Durchlauf mit
mode: "report": Nichts wird angefragt oder bezahlt, und die Timeline listet jede Challenge, die die Seiten gezeigt haben, alschallenge.detectedmit ihrercategoryund der Angabe, ob sie gelöst werden kann. Schalten Sie dann genau diese Kategorien für diese Site ein.
// 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" }Alle Felder
| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
categories | "auto" oder eine Liste aus token, score, clearance, block-page, image | "auto" | Welche Arten von Challenges beantwortet werden dürfen. auto umfasst alle außer score. |
sites | Liste von Hostnamen | jede Site | Nur auf diesen Hosts und ihren Subdomains (höchstens 50). |
key | "own" oder "managed" | Ihr hinterlegter Key, falls vorhanden, sonst unserer | Wessen Key für den Lösungsdienst: Ihrer oder unserer (abgerechnet pro gelöster Challenge). |
apiKey | String | keiner | Ihr Key für den Lösungsdienst, nur für diese Session (verschlüsselt gespeichert, nie wieder angezeigt). Impliziert key: "own". |
mode | "solve" oder "report" | "solve" | report erkennt und meldet nur; nichts wird angefragt oder bezahlt, und es ist kein Key nötig. |
maxSolves | Ganzzahl, 1 bis 100 | 10 | Anfragen pro Session; bei dieser Anzahl enden die Anfragen. |
maxSpendEur | Zahl, 0.01 bis 100 | 0.50 | Was eine Session für Lösungen ausgeben darf (mit unserem Key: was Sie bezahlen); dort enden die Anfragen. |
So funktioniert es
- Kostenlos zuerst. Die Slider- und Checkbox-Aktionen kommen immer zuerst. Der Dienst wird erst gefragt, wenn eine Challenge auch nach einer fairen Chance noch da ist: Ein Bilderrätsel ist erschienen, ein unsichtbares Widget hat sein Rätsel geöffnet, ein Widget blieb etwa 15 bis 25 Sekunden unbeantwortet, eine ganzseitige Warteseite hat sich nach etwa 20 Sekunden nicht aufgelöst, oder die Seite ist eine Sperrseite oder ein Text-Code.
- Wie die Antwort eingesetzt wird. So, wie die Seite sie erwartet: ein Token in das Antwortfeld des Widgets und dessen Callback, ein Cookie für die Site und ein Neuladen, ein Code, der in sein Feld getippt wird, ein Puzzleteil, das an seinen Platz gezogen wird. Danach wird geprüft, ob die Challenge weg ist – wie bei den kostenlosen Aktionen.
- Dieselbe IP. Ganzseitige Warteseiten und Sperrseiten müssen von der IP aus gelöst werden, die die Antwort verwendet: Der Dienst löst sie über die eigene Exit-IP Ihrer Session, über eine kurzlebige Verbindung zur einmaligen Nutzung. Ein Token, das eine Site ablehnt, wird auf dieselbe Weise noch einmal angefordert.
- Ihr Key oder unserer.
key: "own"verwendet Ihren Key für den Lösungsdienst: Hinterlegen Sie ihn einmal im Dashboard (Settings), oder übergeben SieapiKeymit der Anfrage. Er wird verschlüsselt gespeichert, nie wieder angezeigt und erreicht nie den Browser; Sie bezahlen den Dienst direkt.key: "managed"verwendet unseren: Jede gelöste Challenge wird von Ihrem Guthaben für gehostete Browser abgebucht, zum eigenen Preis des Dienstes × 1.5; fehlgeschlagene Versuche sind kostenlos. Lassen Siekeyweg, wird Ihr hinterlegter Key verwendet, falls Sie einen haben, sonst unserer. - Limits. Höchstens 2 Anfragen pro Challenge und Seite. Pro Session gelten
maxSolves(Standard 10, höchstens 100) undmaxSpendEur(Standard €0.50): Die Anfragen enden, sobald eines davon erreicht ist. Mit unserem Key gilt außerdem ein monatliches Limit pro Konto (im Dashboard einstellbar, höchstens €25). Ein falscher Key oder ein leeres Guthaben beim Dienst beendet die Anfragen für diese Session. - Was Sie sehen.
challenge.detectedeinmal pro Challenge und Seite undchallenge.servicefür jede Anfrage (solved,failedoderskipped, mit dem Grund und den Kosten beim Dienst) in der Ereignis-Timeline;challenges(wessen Key, wie viele Anfragen, was die Lösungen mit unserem Key gekostet haben) an der Session. In einem Agent-Run wartet der Agent, während der Dienst an einer Seite arbeitet. - Manche Widgets werden erkannt, aber nicht gelöst: Ihre Antwort lässt sich nicht allgemein in eine Seite zurückschreiben. Sie werden mit
solvable: falsegemeldet und nie berechnet. Die Adresse der Seite und die Details der Challenge gehen an den Lösungsdienst.
Was bei jeder Art passiert
| Auf der Seite | Kategorie | Vom Dienst angefordert | Wie die Antwort eingesetzt wird |
|---|---|---|---|
| Ein Kästchen „Ich bin kein Roboter“, dessen Klick ein Bilderrätsel geöffnet hat | token | Ein Token für dieses Widget | In das Antwortfeld des Widgets, und der Callback der Seite wird damit aufgerufen |
| Ein unsichtbares Widget, dessen Bilderrätsel erschienen ist | token | Ein Token für dieses Widget | Ebenso |
| Eine interaktive Prüfung „Bestätigen Sie, dass Sie ein Mensch sind“, die unbeantwortet bleibt | token | Ein Token für dieses Widget | Ebenso |
| Ein Code aus verzerrtem Text neben einem Textfeld | image | Der Text im Bild | Nach einem Klick in das Feld Taste für Taste eingetippt |
| Ein Puzzle-Slider, den der Browser nicht selbst platzieren kann (zum Beispiel einer mit einer falschen Lücke als Köder) | image | Wo die Lücke ist | Der Browser zieht das Teil dorthin und prüft, wo es tatsächlich gelandet ist |
| Eine ganzseitige Warteseite („Ihr Browser wird überprüft“), die sich nicht auflöst | clearance | Ein Clearance-Cookie, gelöst über die Exit-IP Ihrer Session | Wird für die Site gesetzt, danach lädt die Seite neu |
| Eine Sperrseite mit einem Rätsel oder einer Geräteprüfung | block-page | Ein Cookie, gelöst über die Exit-IP Ihrer Session | Wird für die Site gesetzt, danach lädt die Seite neu |
Eine unsichtbare Score-Prüfung, die die Seite selbst ausführt (nur wenn score aufgeführt ist) | score | Ein Score-Token für die eigene Aktion der Seite | An den eigenen Token-Aufruf der Seite übergeben |
Die kostenlosen Aktionen kommen weiterhin zuerst: Ein einfacher Slider wird gezogen, ein Puzzle, dessen Lücke der Browser finden kann, wird eingesetzt, und ein Kästchen, das sich per Klick abhaken lässt, wird angeklickt – alles, ohne den Dienst zu fragen. Im Widget kann das Kästchen selbst ohne Häkchen bleiben, nachdem ein Token eingesetzt wurde: Die Seite liest das Antwortfeld und den Callback, nicht das Kästchen.
Mit den SDKs
Ab SDK 0.38.0 lässt sich die Option beim Cloud-Start übergeben (Python: challenge_service, das außerdem max_solves, max_spend_eur und api_key akzeptiert). Die Timeline zeigt, was passiert ist; ihre letzten Ereignisse kommen einige Sekunden nach dem Ende der Session an.
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"])