Browser-Plugin: Menschliches Verhalten simulieren (Verhaltens-Bot-Schutz) #202
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/iris-plugins#202
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
iris-browser 0.5.0 — menschlicher Benutzer simulieren
Motivation
Folge auf #123 (Build des Browser-Plugins, abgeschlossen). Statisches Stealth sitzt
bereits (patchright 1.61.0:
navigator.webdriver, Headless-Chrome-UA, Plugins,window.chrome).Nachweis aus dem Chat vom 2026-10-22 („Öffne den Webbrowser und suche auf ebay.de …“,
Export auf dem Desktop, Chat
786261CC): Die Akamai-splashui-Challenge wird imPlugin-Chromium bestanden, Startseite und
/itm/liefern 200 — aber die Trefferliste/sch/i.htmlliefert hart 403 (Referenznummer wechselt pro Request). Ursache:Akamai-Bot-Manager bewertet pro Endpoint unterschiedliche Vertrauenslevel. Das
Challenge-Basislevel reicht für Startseite/Einzelangebote, nicht für die am stärksten
geschützte Suchseite. Die Lücke ist die Verhaltens-Schicht: CDP-gesteuertes
Headless-Chromium erzeugt sprungartige Mauspositionen, Mousedown/Up im Millisekunden-Takt,
fill()in einem Event und Einzel-Wheel-Events — ohne die Telemetrie, die AkamaisSensor-Skript von einer menschlichen Session erwartet (Mausbewegung, Tipp-Rhythmus,
Scrollmuster, Dwell).
Anwendungsfälle
im Seitenpanel (bestehende Skill-Regel), danach agiert der Agent in der Session.
Nicht im Scope: Checkout-/Kauf-Automatisierung, Account-Flows.
Design-Entscheidungen (geklart am 2026-10-22)
commands.mjs; betrifft auch--click-at(Panel-Klicks des Nutzers)--fast on/--fast offpro Chat, persistiert im Chat-Zustand (store.mjs), gilt für alle Folgebefehle; Fast ≈ heutiges Timing (Zielmitte, ohne Kurvenflug)lib/human.mjs, benannte Konstanten mit Verteilungsfunktion (randauscrypto.random, nie deterministisch); kein Config-File/Settings-UI in v1--fast-Switch für offensichtlich ungeschützte Sites bei ausgiebigen Aufgaben; geschützte Sites: Startseite → Formular (nicht Direkt-URL), bei Wiederholung Suchbegriff variierenSimulierte Signale (v1)
fill/type: char-für-char 30–120 ms/Zeichen mit Wortpausen; Bestandsinhalt per Ctrl+A, nichtfill()-Clearscroll: Delta in 100–150 px-Notschritte zerlegt, 60–200 ms Takt, Bursts mit PausenExplizit nicht in v1
Abnahme (drei Stufen)
Startseite → Dwell → Suchbegriff tippen → Finden klicken→ finale URL/sch/, HTTP 200, DOM ≥ 5 Item-Karten. Als--canary-Opt-in intests/smoke.sh(nicht automatisch — externe Abhängigkeit, kann sich ändern). Vorher/Nachher reproduzierbar auf derselben IP.--fast); Panel wirkt dezent, nicht bug-artig.Risiko
CDP-Input erzeugt
isTrusted=true-Events, die echten Maus-/Tastaturevents prinzipiellähnlich sind — aber Akamai kann die Lücke über Nicht-JS-Schichten schließen (CDP-Protokoll-
Spuren, Headless-Traces, die patchright 1.61 nicht deckt). Dann schlägt der Canary auch
nach dem Release fehl. In dem Fall ist das Feature nicht defekt: Der Befund (welche
Schicht detektiert) gehört in das Issue, es bleibt offen, nächste Schicht folgt. Dokumentierter
Alltags-Fallback für geschützte Daten:
web_search(Suchmaschinen-Index statt Live-Scrape),wie bereits im Chat vom 22.10. genutzt.
Umsetzung
lib/human.mjs: Verteilungsfunktionen +humanMove,humanClick(loc|x,y),humanType,humanScroll,dwell(Parameter als benannte Konstanten)commands.mjs: click/fill/type/scroll/click-at überhuman.mjsrouten,--fast-Switch lesen/ persistierenstore.mjs:fastim Chat-ZustandSKILL.md:--fast-Zeile + Navigation-Regeln für geschützte Sitestests/smoke.sh:--canary(eBay) + Timing-Sanity-Test (human > 50 ms, fast < 20 ms)PLAN.md: neue Etappe + Lessons Learned; Changelog; Version 0.5.0 inplugin.jsonRelease
Registry-Veröffentlichung erst nach ausdrücklicher Freigabe und grüner Canary
(Updates erreichen die Nutzer sofort).
Referenzen
2026-10-22_Öffne-den-Webbrowser-und-suche-auf-ebayd.irischat.irischat(Desktop), Chat786261CC-9F3B-41C4-A3AE-1A608FF3A5C4PR #209 gemergt: feat(browser): Menschliches Benutzerverhalten: Rhythmus, Lese-Pausen, --fast, --eval in Hauptwelt; 0.5.0 (#202)
#209
Commits:
Stand (0.5.0)
Befund: Ausgelöst durch den Chat vom 22.10.: Das Plugin-Chromium besteht die statischen
Schichten (Akamai-Challenge, Startseite,
/itm/), aber die Trefferliste/sch/i.htmlliefertehart 403 — die offene Schicht war die Verhaltens-Telemetrie (Maus, Tipp-Rhythmus, Scroll, Dwell).
Geändert:
lib/human.mjs(neu): Rhythmus-Mensch — Bézier-Mausflug (500–1400 px/s, ease in/out, ±1,5 pxTremor), Hover 60–420 ms, Drückphase 50–160 ms, Klick versetzt zur Elementmitte,
fillmitFokus-Klick + Strg/Cmd-A + char-für-char (30–120 ms, Wortpausen, gelegentliche Zögerung),
Scroll in 100–150 px-Notschritten in Bursts, Dwell 1,2–4,2 s nach echten Seiten
(Loopback/
about:ohne Pause), Mausposition je Seite gemerkt. Entropie auscrypto.lib/commands.mjs: alle Aktionen (click, click-at, fill, type, key, scroll) überhuman.mjs;--fast on/offje Chat (persistiert instate.json, in der Ausgabe alsfast ansichtbar);Dwell nach Navigation und zurück/vorwärts.
--evalläuft mitisolatedContext: falsein der Hauptwelt der Seite — patchright 1.61evaluate sonst standardmäßig in einer isolierten Welt (Fork-Änderung gegen playwright-core
1.61.0), dort sind Fenster-Globalen unsichtbar; mit
falsegelten wieder diePlaywright-Standard-Semantik.
tests/smoke.sh: Tempo-Check über eine Testseite, die Mausereignisse loggt (Mensch ≥ 5Bewegungen, Drückphase ≥ 50 ms; Fast ≤ 2, < 20 ms) +
--canarygegen ebay.de (Opt-in).--fast-Zeile, Regeln für geschützte Sites), system_prompt.md, plugin.json0.5.0 + Changelog, store/changelog.md, PLAN.md (Entscheidungen, Canary-Befund, Lessons Learned).
Geprüft (gemessen, lokal, temporäres
IRIS_APP_SUPPORT):bash tests/smoke.sh.t = steps²schickte den Klick TausendePixel aus dem Viewport; danach landet der Klick im Element, Fokus + Eingabe verifiziert).
--eval-Welt: rohes CDP + Instrumentierung des patchright-Bundles belegt die Weltzuordnung(Hauptwelt
name=""/isDefault, patchright-Isolatename="utility");page.evaluate(…, null, false)liest die Hauptwelt (Probe: Inline-Skript-Variable sichtbar).--fast on/offpro Chat: persistiert und in der Ausgabe sichtbar; Tempo-Unterschied gemessen.commands.mjs(TDZ-Fehler beifastgefangen und repariert).Nicht geprüft:
(„Error Page | eBay") — Edge-Block auf IP-Reputation, vor der Verhaltens-Schicht.
Die Suchseiten-Prüfung (
/sch/200, ≥ 5 Treffer) ist damit heute nicht erreichbar;der Canary meldet diesen Fall eigenständig. Reputations-Blockade kann sich mit Tagen
auflösen; ein warmes Profil (Session-Cookies) verhält sich evtl. anders.
Grenzen: CDP-Input erzeugt
isTrusted-Events, die echten Eingaben prinzipiel ähnlich sind,aber Akamai kann die Lücke über Nicht-JS-Schichten schließen (CDP-Traces, Headless-Fingerabdrücke
unterhalb der JS-Ebene). Ob die Verhaltens-Schicht ausreicht, entscheidet der Canary/Alltag.
Offen: Canary erneut nach IP-Reputations-Ruhe oder von anderer IP; Registry-Publikation
0.5.0 erst nach ausdrücklicher Freigabe.