show_widget y el controlador del botón de apertura solo cuando channels.discord.activities está presente y se puede resolver un secreto de cliente. El alias obsoleto discord_widget seguirá disponible durante una versión.
Requisitos previos
- un bot de Discord de OpenClaw existente
- un nombre de host HTTPS público que llegue al Gateway de OpenClaw
- permiso para configurar Actividades y OAuth2 para la aplicación de Discord del bot
Configuración
1
Exponer el Gateway mediante HTTPS
Inicie el túnel o proxy inverso y compruebe que
https://openclaw.example.com/discord/activity/ llega al Gateway después de añadir la configuración de Actividades. Sustituya el nombre de host de ejemplo por el suyo.2
Habilitar Actividades en Discord
Abra la aplicación del bot existente en el Portal para desarrolladores de Discord. Abra Activities, habilite las Actividades y cree una asignación de URL:
- prefijo:
ROOT(/) - destino:
openclaw.example.com/discord/activity
/discord/activity, sin una barra final.3
Copiar el secreto de cliente de OAuth2
Abra OAuth2 en el Portal para desarrolladores. Discord requiere al menos un URI de redirección, por lo que debe añadir un marcador de posición local, como la dirección de bucle invertido, si la aplicación aún no tiene ninguno; el SDK de aplicaciones integradas gestiona el flujo de retorno de la Actividad. Copie o restablezca el secreto de cliente de la aplicación. Trátelo como una credencial: no lo pegue en chats, registros ni archivos de configuración confirmados en el repositorio.
4
Configurar OpenClaw
Añada un bloque a la cuenta de Discord que deba ofrecer widgets:Puede omitir
clientSecret del bloque cuando DISCORD_CLIENT_SECRET esté configurado. El bloque debe seguir presente para habilitar la función.La configuración normal de acceso de Discord permanece separada. Por ejemplo, allowFrom sigue controlando quién puede enviar mensajes directos al agente; no controla quién puede abrir un widget ya publicado en un canal.5
Reiniciar y probar
Reinicie el Gateway. En una conversación de Discord, pida al agente que muestre un widget interactivo. El agente llama a
show_widget; haga clic en Open widget en el mensaje publicado.Modelo de seguridad
- OAuth identifica al usuario de Discord antes de devolver los metadatos del widget.
- La API Get Activity Instance de Discord debe confirmar que el usuario de OAuth está presente en la instancia actual de la Actividad. El canal de la instancia debe coincidir con el canal donde se publicó el widget.
- Todas las personas a las que Discord permita acceder a ese canal pueden abrir sus widgets. Para limitar la audiencia, utilice los permisos de canal de Discord. Las listas de permitidos de comandos y mensajes directos de OpenClaw no conceden ni revocan el acceso al contenido ya publicado en el canal.
- Las sesiones de OAuth caducan después de 15 minutos. Las capacidades de documento del widget caducan después de 60 segundos y funcionan una sola vez.
- Los widgets caducan después de siete días y se conservan como máximo 64 por instancia del plugin de Discord.
- El HTML del widget lo crea el agente y debe tratarse como contenido de confianza. No incluya secretos que no querría que un widget defectuoso expusiera.
- El widget puede navegar dentro de su propio marco anidado. El iframe
sandbox="allow-scripts"bloquea la navegación de nivel superior, las ventanas emergentes y el acceso al mismo origen, mientras que su Política de seguridad de contenido bloquea las conexiones de red y los recursos externos. Estos controles constituyen una defensa en profundidad, no un límite de seguridad frente al agente que creó el widget. - Cuando las Actividades están deshabilitadas,
/discord/activityno se registra en absoluto.
Solución de problemas
La Actividad indica “Gateway offline”
- confirme que el túnel está en ejecución y dirige el tráfico al puerto de enlace real del Gateway
- confirme que el destino del Portal para desarrolladores incluye
/discord/activity - reinicie el Gateway después de cambiar la configuración de Discord u OpenClaw
- revise los registros del Gateway para detectar la advertencia de una línea sobre la ausencia del secreto de cliente de Actividades
Discord abre una página en blanco o informa de blocked:csp
- compruebe que la asignación de URL utiliza
ROOTy no añade un segundo segmento/discord/activity - confirme que el contenedor,
shell.jsy el módulo del SDK se devuelven correctamente a través del proxy de Discord - inspeccione los registros del Gateway para buscar solicitudes bajo
/discord/activity/