Widget
Todos los atributos, los tres modos y la API JavaScript para formularios cargados después.
Opciones del widget
El widget se configura mediante atributos data-. Van en el contenedor con data-captchacore-widget y algunos además en el formulario. Cada valor aquí sustituye al predeterminado que fijó para el sitio en el panel de administración.
| Atributo | Valores | Estándar | Descripción |
|---|---|---|---|
| data-theme | auto | light | dark | auto | Esquema de color. auto sigue la configuración del sistema del visitante. |
| data-color | Color hexadecimal | #34d399 | Color de acento para la casilla y el borde |
| data-label | Texto | según el idioma | Etiqueta junto a la casilla |
| data-brand | Texto o vacío | CaptchaCore | Marca a la derecha, vacío = oculto |
| data-size | normal | compact | normal | normal mide 360 px de ancho, compact 300 px |
| data-lang | de en fr es it nl pl pt tr ja zh ko ar ru | idioma de la página | Idioma de los textos del widget. Sin valor cuenta lang en el formulario y, en su defecto, el del elemento <html>. |
| data-start | auto | focus | none | auto | Cuándo empieza la comprobación: de inmediato, al primer foco en el formulario o solo al hacer clic. |
| data-mode | interactive | visible | invisible | interactive | Sustituye el modo fijado en la administración para este formulario concreto. |
| data-form-type | login register contact comment checkout password_reset newsletter custom | — | Determina qué política de formulario se aplica. Va en el formulario o en el contenedor. |
Atributos en la etiqueta script
Estos valores van en el propio elemento <script> y se aplican a todos los widgets de la página.
| Atributo | Obligatorio | Descripción |
|---|---|---|
| data-site-key | sí | Clave pública del sitio (cc_pub_…). |
| data-service-url | sí | https://api.captchacore.eu |
| data-worker-url | no | Ruta propia al worker de prueba de trabajo, solo necesaria con un alojamiento distinto. |
| data-fail-open | no | Solo false: el formulario espera en lugar de enviar el marcador cc-unavailable tras un error de conexión persistente. |
Modos del widget
El modo se define con data-mode="..." en el elemento del widget <div data-captchacore-widget>; si no se indica, se aplica la configuración del sitio en el área de cliente.
interactive
Recomendado Widget siempre visible. El PoW se resuelve automáticamente. La casilla se marca sola cuando se detecta suficiente interacción humana (2+ caracteres escritos, movimiento del ratón, 2+ segundos). Los usuarios reales no necesitan hacer clic. Alternativa: clic manual.
visible
Widget visible. El usuario debe hacer clic en la casilla para iniciar la verificación. Similar a reCAPTCHA v2.
invisible
Sin interfaz visible. El PoW se resuelve por completo en segundo plano. El token se inserta automáticamente al enviar. Ideal cuando no se desea una protección visible.
API JavaScript del widget
El script crea el objeto global CaptchaCoreV2. En páginas estáticas no necesita nada de esto: el widget se vincula solo a todos los formularios adecuados al cargar. La API resulta relevante en cuanto los formularios se cargan por JavaScript, es decir, en sistemas de tienda, aplicaciones de una sola página y diálogos modales.
| Método | Finalidad |
|---|---|
| CaptchaCoreV2.init(config) | Inicialización manual cuando el script se incluyó sin atributos data. Espera al menos siteKey y serviceUrl. |
| CaptchaCoreV2.attach() | Vuelve a buscar formularios y vincula los nuevos. Llámelo tras cada sustitución del DOM. |
| CaptchaCoreV2.destroy() | Desvincula todos los widgets, detiene el observador y limpia. Útil antes de un cambio de página en una SPA. |
| CaptchaCoreV2.getWidgets() | Devuelve las instancias de widget vinculadas actualmente. |
| CaptchaCoreV2.getWidget(form) | El widget de un formulario concreto (elemento o selector CSS); si no, null. |
| widget.getToken() | Token para exactamente una llamada a /verify, con los datos de comportamiento recopilados desde la carga. A continuación carga de inmediato el siguiente desafío — para formularios AJAX con varios envíos por visita. |
| CaptchaCoreV2.getLanguages() | Lista de los 14 códigos de idioma admitidos. |
| CaptchaCoreV2.on(event, fn) | Suscribirse a un evento. |
| CaptchaCoreV2.off(event, fn) | Cancelar la suscripción. |
Eventos
CaptchaCoreV2.on('ready', function (data) { // Widget ist gebunden und einsatzbereit }); CaptchaCoreV2.on('error', function (err) { // Netzwerkfehler, abgelaufener Nonce, ungültiger Schlüssel console.warn('CaptchaCore:', err); });
Formularios cargados después
El widget observa el contenido de la página y detecta por sí mismo los nuevos formularios con data-captchacore. Eso cubre la mayoría de los casos. Sin embargo, si un formulario se sustituye y se envía de inmediato, el observador puede llegar tarde: en ese caso llame explícitamente a attach() tras insertarlo.
// Beispiel: Formular per fetch nachgeladen const html = await (await fetch(url)).text(); container.innerHTML = html; CaptchaCoreV2.attach(); // bindet das neue Formular an
Enviar formularios con fetch()
Si su formulario se envía con fetch() o XHR y permite varios envíos por visita (búsqueda, comprobación de dominios, carrito), solicite antes de cada petición un token propio con widget.getToken(). Cada token vale para exactamente una verificación; el widget resuelve el siguiente desafío en segundo plano mientras el visitante sigue trabajando. Las llamadas simultáneas se atienden una tras otra y nunca reciben el mismo token.
const form = document.querySelector('#domaincheck'); form.addEventListener('submit', async (e) => { e.preventDefault(); const body = new FormData(form); try { body.set('captchacore_token', await CaptchaCoreV2.getWidget(form).getToken()); } catch { // Dienst nicht erreichbar: Platzhalter senden, Ihr Server entscheidet (Fail-Open) body.set('captchacore_token', 'cc-unavailable'); } const res = await fetch('/domaincheck', { method: 'POST', body, headers: { Accept: 'application/json' }, // Fehler als JSON statt Weiterleitung }); });
Para sistemas de tienda y foros
Sistemas como Shopware, WooCommerce o phpBB sustituyen con frecuencia el registro, los formularios de dirección y los campos de comentario mediante AJAX. Enganche attach() al evento correspondiente del sistema, una vez que el nuevo contenido esté en el DOM. Una segunda llamada no hace daño: los formularios ya vinculados se omiten.