763e06c127
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.4 KiB
4.4 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params_schema, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params_schema | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| find_consent_controls_llm | function | py | browser | 1.0.0 | impure | def find_consent_controls_llm(*, port: int = 9222, max_candidates: int = 40, model: str = 'claude-haiku-4-5-20251001') -> dict | Identifica los botones de un banner de cookies/consentimiento usando un LLM en vez de selectores hardcodeados por CMP. Recolecta los controles clicables visibles de la pagina via CDP, los marca con un atributo estable data-fnllm='N' en el DOM, y pregunta a haiku (ask_llm) cual es ACEPTAR TODO, cual RECHAZAR y cual el enlace VER SOCIOS/configurar/mas opciones/finalidades. Resuelve los CMP cuyos botones no encajan con selectores fijos (casos no-button del scanner de databrokers). |
|
|
false | error_go_core |
|
|
false | python/functions/browser/find_consent_controls_llm.py |
Ejemplo
import sys, os, time
sys.path.insert(0, os.path.join("python", "functions"))
from browser.cdp_eval import cdp_eval
from browser.find_consent_controls_llm import find_consent_controls_llm
# Requiere un Chrome con --remote-debugging-port=9335 y una pestana abierta.
# Navega primero al sitio con banner y espera a que cargue el CMP.
cdp_eval("location.href='https://www.elpuntavui.cat'", port=9335)
time.sleep(6)
res = find_consent_controls_llm(port=9335)
print(res["accept_idx"], res["accept_selector"], res["reason"])
# Clicar el boton de aceptar elegido por el LLM:
sel = res["accept_selector"]
if sel:
cdp_eval(f"document.querySelector('{sel}').click()", port=9335)
O directo por CLI: python3 python/functions/browser/find_consent_controls_llm.py 9335.
Cuando usarla
Cuando un banner de cookies/consentimiento NO se resuelve con selectores fijos por
CMP (los casos "no-button" del scanner de databrokers): textos en otro idioma,
marcas TCF poco comunes, botones renderizados con clases dinamicas. La funcion deja
que un LLM lea los controles visibles y decida cual es aceptar/rechazar/ver-socios,
devolviendo selectores [data-fnllm="N"] estables que persisten en el DOM para que
el caller clique con cdp_eval. Usala como fallback despues de que los selectores
hardcodeados fallen, no como primer intento (cuesta una llamada al LLM).
Gotchas
- El banner debe estar YA en el DOM: navega al sitio y espera unos segundos
(
time.sleep(~6)) ANTES de llamar. Si el CMP aun no se ha renderizado, la lista de candidatos no lo incluira y el LLM no podra elegir. - El LLM puede equivocarse: haiku es rapido pero falible. Verifica el
textdel candidato enaccept_idxantes de clicar acciones irreversibles. Sube de modelo (model="claude-opus-4-8") si la precision importa mas que el coste. - Rate limits de ask_llm: cada llamada consume cuota de la API directa de Anthropic. No la invoques en bucle cerrado sobre muchas pestanas sin throttling.
- Marca el DOM: pone
data-fnllm="N"en hastamax_candidateselementos. Si re-llamas tras cambiar la pagina, los atributos viejos pueden quedar; los selectores solo son fiables sobre el mismo render donde se recolectaron. - Requiere remote debugging: sin un Chrome con
--remote-debugging-port,cdp_evalfalla y devuelve{status: "error", error: "cdp_eval: ..."}. - Solo recolecta controles visibles (
getClientRects().length>0) y con texto corto (<=60 chars). Controles dentro de shadow DOM o iframes cross-origin no se ven.