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 OpenClaw para Discord existente
- un nombre de host HTTPS público que permita acceder al Gateway de OpenClaw
- permiso para configurar Activities 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 verifique que
https://openclaw.example.com/discord/activity/ permita acceder al Gateway después de añadir la configuración de Activities. Sustituya el nombre de host de ejemplo por el suyo.2
Habilitar Activities en Discord
Abra la aplicación existente del bot en el Portal para desarrolladores de Discord. Abra Activities, habilite Activities y cree una asignación de URL:
- prefijo:
ROOT(/) - destino:
openclaw.example.com/discord/activity
/discord/activity, sin una barra diagonal al 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, así que añada un marcador de posición local, como la dirección de bucle invertido, si la aplicación todavía no tiene ninguno; el SDK de aplicaciones integradas gestiona el flujo de retorno de Activity. 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 incluidos 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 se haya definido DISCORD_CLIENT_SECRET. El bloque debe seguir presente para habilitar la función.La configuración normal de acceso a Discord permanece separada. Por ejemplo, allowFrom sigue controlando quién puede enviar mensajes directos al agente; no controla quién puede abrir un widget que ya se haya publicado en un canal.5
Reiniciar y probar
Reinicie el Gateway. En una conversación de Discord, solicite 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 Activity. 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 restringir el público, utilice los permisos del canal de Discord. Las listas de permitidos de comandos y mensajes directos de OpenClaw no conceden ni eliminan 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 con errores 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 una barrera de seguridad frente al agente que creó el widget. - Cuando Activities está deshabilitado,
/discord/activityno se registra en absoluto.
Solución de problemas
Activity indica “Gateway offline”
- confirme que el túnel esté en ejecución y se dirija al puerto de enlace real del Gateway
- confirme que el destino del Portal para desarrolladores incluya
/discord/activity - reinicie el Gateway después de cambiar la configuración de Discord u OpenClaw
- revise los registros del Gateway para buscar la advertencia de una línea sobre la ausencia del secreto de cliente de Activities
Discord abre una página en blanco o muestra blocked:csp
- verifique que la asignación de URL use
ROOTy no añada un segundo segmento/discord/activity - confirme que el contenedor,
shell.jsy el módulo del SDK se devuelvan correctamente a través del proxy de Discord - examine los registros del Gateway para buscar solicitudes bajo
/discord/activity/