BlueBubbles
Estado: plugin incluido que se comunica con el servidor BlueBubbles de macOS a través de HTTP. Recomendado para integración con iMessage debido a su API más rica y configuración más fácil en comparación con el canal heredado imsg.
Descripción general
- Se ejecuta en macOS a través de la aplicación auxiliar BlueBubbles (bluebubbles.app).
- Recomendado/probado: macOS Sequoia (15). macOS Tahoe (26) funciona; la edición actualmente está rota en Tahoe, y las actualizaciones de iconos de grupo pueden reportar éxito pero no sincronizarse.
- OpenClaw se comunica con él a través de su API REST (
GET /api/v1/ping,POST /message/text,POST /chat/:id/*). - Los mensajes entrantes llegan a través de webhooks; las respuestas salientes, indicadores de escritura, confirmaciones de lectura y tapbacks son llamadas REST.
- Los archivos adjuntos y pegatinas se ingieren como medios entrantes (y se muestran al agente cuando es posible).
- El emparejamiento/lista de permitidos funciona de la misma manera que otros canales (
/channels/pairingetc) conchannels.bluebubbles.allowFrom+ códigos de emparejamiento. - Las reacciones se muestran como eventos del sistema al igual que en Slack/Telegram para que los agentes puedan "mencionarlas" antes de responder.
- Funciones avanzadas: editar, eliminar, respuesta en hilo, efectos de mensaje, gestión de grupos.
Inicio rápido
-
Instala el servidor BlueBubbles en tu Mac (sigue las instrucciones en bluebubbles.app/install).
-
En la configuración de BlueBubbles, habilita la API web y establece una contraseña.
-
Ejecuta
openclaw onboardy selecciona BlueBubbles, o configura manualmente:Copiar
{ channels: { bluebubbles: { enabled: true, serverUrl: "http://192.168.1.100:1234", password: "example-password", webhookPath: "/bluebubbles-webhook", }, }, } -
Dirige los webhooks de BlueBubbles a tu puerta de enlace (ejemplo:
https://your-gateway-host:3000/bluebubbles-webhook?password=<password>). -
Inicia la puerta de enlace; registrará el manejador del webhook y comenzará el emparejamiento.
Nota de seguridad:
- Siempre establece una contraseña para el webhook.
- La autenticación del webhook siempre es requerida. OpenClaw rechaza las solicitudes de webhook de BlueBubbles a menos que incluyan una contraseña/guid que coincida con
channels.bluebubbles.password(por ejemplo?password=<password>ox-password), independientemente de la topología de bucle local/proxy. - La autenticación por contraseña se verifica antes de leer/analizar los cuerpos completos de los webhooks.
Mantener Messages.app activo (configuraciones VM / sin cabeza)
Algunas configuraciones de VM de macOS / siempre activas pueden terminar con Messages.app en estado "inactivo" (los eventos entrantes se detienen hasta que la aplicación se abre/se pone en primer plano). Una solución simple es activar Messages cada 5 minutos usando un AppleScript + LaunchAgent.
1) Guarda el AppleScript
Guarda esto como:
~/Scripts/poke-messages.scpt
Script de ejemplo (no interactivo; no roba el foco):
try
tell application "Messages"
if not running then
launch
end if
-- Toca la interfaz de scripting para mantener el proceso receptivo.
set _chatCount to (count of chats)
end tell
on error
-- Ignora fallos transitorios (avisos de primera ejecución, sesión bloqueada, etc.).
end try
2) Instala un LaunchAgent
Guarda esto como:
~/Library/LaunchAgents/com.user.poke-messages.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.poke-messages</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-lc</string>
<string>/usr/bin/osascript "$HOME/Scripts/poke-messages.scpt"</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>300</integer>
<key>StandardOutPath</key>
<string>/tmp/poke-messages.log</string>
<key>StandardErrorPath</key>
<string>/tmp/poke-messages.err</string>
</dict>
</plist>
Notas:
- Esto se ejecuta cada 300 segundos y al iniciar sesión.
- La primera ejecución puede activar avisos de Automatización de macOS (
osascript→ Messages). Aprueba en la misma sesión de usuario que ejecuta el LaunchAgent.
Cárgalo:
launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true
launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist
Incorporación
BlueBubbles está disponible en el asistente de configuración interactivo:
openclaw onboard
El asistente solicita:
- URL del servidor (requerido): Dirección del servidor BlueBubbles (ej.,
http://192.168.1.100:1234) - Contraseña (requerido): Contraseña de la API desde la configuración del Servidor BlueBubbles
- Ruta del webhook (opcional): Por defecto
/bluebubbles-webhook - Política de MD: emparejamiento, lista de permitidos, abierto o deshabilitado
- Lista de permitidos: Números de teléfono, correos electrónicos o destinos de chat
También puedes añadir BlueBubbles vía CLI:
openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password <password>
Control de acceso (MD + grupos)
MDs:
- Por defecto:
channels.bluebubbles.dmPolicy = "pairing". - Los remitentes desconocidos reciben un código de emparejamiento; los mensajes se ignoran hasta ser aprobados (los códigos expiran después de 1 hora).
- Aprueba mediante:
openclaw pairing list bluebubblesopenclaw pairing approve bluebubbles <CODE>
- El emparejamiento es el intercambio de tokens por defecto. Detalles: Emparejamiento
Grupos:
channels.bluebubbles.groupPolicy = open | allowlist | disabled(por defecto:allowlist).channels.bluebubbles.groupAllowFromcontrola quién puede activar en grupos cuandoallowlistestá establecido.
Control por mención (grupos)
BlueBubbles soporta control por mención para chats grupales, coincidiendo con el comportamiento de iMessage/WhatsApp:
- Usa
agents.list[].groupChat.mentionPatterns(omessages.groupChat.mentionPatterns) para detectar menciones. - Cuando
requireMentionestá habilitado para un grupo, el agente solo responde cuando es mencionado. - Los comandos de control de remitentes autorizados omiten el control por mención.
Configuración por grupo:
{
channels: {
bluebubbles: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15555550123"],
groups: {
"*": { requireMention: true }, // valor por defecto para todos los grupos
"iMessage;-;chat123": { requireMention: false }, // anulación para un grupo específico
},
},
},
}
Control de comandos
- Los comandos de control (ej.,
/config,/model) requieren autorización. - Usa
allowFromygroupAllowFrompara determinar la autorización de comandos. - Los remitentes autorizados pueden ejecutar comandos de control incluso sin mencionar en grupos.
Indicadores de escritura + confirmaciones de lectura
- Indicadores de escritura: Enviados automáticamente antes y durante la generación de la respuesta.
- Confirmaciones de lectura: Controladas por
channels.bluebubbles.sendReadReceipts(por defecto:true). - Indicadores de escritura: OpenClaw envía eventos de inicio de escritura; BlueBubbles limpia la escritura automáticamente al enviar o por tiempo de espera (la parada manual vía DELETE no es confiable).
{
channels: {
bluebubbles: {
sendReadReceipts: false, // deshabilitar confirmaciones de lectura
},
},
}
Acciones avanzadas
BlueBubbles soporta acciones de mensaje avanzadas cuando están habilitadas en la configuración:
{
channels: {
bluebubbles: {
actions: {
reactions: true, // tapbacks (por defecto: true)
edit: true, // editar mensajes enviados (macOS 13+, roto en macOS 26 Tahoe)
unsend: true, // eliminar mensajes (macOS 13+)
reply: true, // respuesta en hilo por GUID de mensaje
sendWithEffect: true, // efectos de mensaje (slam, loud, etc.)
renameGroup: true, // renombrar chats grupales
setGroupIcon: true, // establecer icono/foto del chat grupal (inestable en macOS 26 Tahoe)
addParticipant: true, // añadir participantes a grupos
removeParticipant: true, // eliminar participantes de grupos
leaveGroup: true, // abandonar chats grupales
sendAttachment: true, // enviar archivos adjuntos/media
},
},
},
}
Acciones disponibles:
- react: Añadir/eliminar reacciones tapback (
messageId,emoji,remove) - edit: Editar un mensaje enviado (
messageId,text) - unsend: Eliminar un mensaje (
messageId) - reply: Responder a un mensaje específico (
messageId,text,to) - sendWithEffect: Enviar con efecto de iMessage (
text,to,effectId) - renameGroup: Renombrar un chat grupal (
chatGuid,displayName) - setGroupIcon: Establecer el icono/foto de un chat grupal (
chatGuid,media) — inestable en macOS 26 (Tahoe) (la API puede devolver éxito pero el icono no se sincroniza). - addParticipant: Añadir alguien a un grupo (
chatGuid,address) - removeParticipant: Eliminar a alguien de un grupo (
chatGuid,address) - leaveGroup: Abandonar un chat grupal (
chatGuid) - sendAttachment: Enviar medios/archivos (
to,buffer,filename,asVoice)- Notas de voz: establece
asVoice: truecon audio MP3 o CAF para enviar como mensaje de voz de iMessage. BlueBubbles convierte MP3 → CAF al enviar notas de voz.
- Notas de voz: establece
IDs de mensaje (cortos vs completos)
OpenClaw puede mostrar IDs de mensaje cortos (ej., 1, 2) para ahorrar tokens.
MessageSid/ReplyToIdpueden ser IDs cortos.MessageSidFull/ReplyToIdFullcontienen los IDs completos del proveedor.- Los IDs cortos están en memoria; pueden expirar al reiniciar o por expulsión de la caché.
- Las acciones aceptan
messageIdcorto o completo, pero los IDs cortos darán error si ya no están disponibles.
Usa IDs completos para automatizaciones y almacenamiento duraderos:
- Plantillas:
{{MessageSidFull}},{{ReplyToIdFull}} - Contexto:
MessageSidFull/ReplyToIdFullen las cargas útiles entrantes
Ver Configuración para variables de plantilla.
Transmisión por bloques
Controla si las respuestas se envían como un solo mensaje o se transmiten en bloques:
{
channels: {
bluebubbles: {
blockStreaming: true, // habilitar transmisión por bloques (deshabilitado por defecto)
},
},
}
Medios + límites
- Los archivos adjuntos entrantes se descargan y almacenan en la caché de medios.
- Límite de medios vía
channels.bluebubbles.mediaMaxMbpara medios entrantes y salientes (por defecto: 8 MB). - El texto saliente se divide en fragmentos de
channels.bluebubbles.textChunkLimit(por defecto: 4000 caracteres).
Referencia de configuración
Configuración completa: Configuración Opciones del proveedor:
channels.bluebubbles.enabled: Habilitar/deshabilitar el canal.channels.bluebubbles.serverUrl: URL base de la API REST de BlueBubbles.channels.bluebubbles.password: Contraseña de la API.channels.bluebubbles.webhookPath: Ruta del endpoint del webhook (por defecto:/bluebubbles-webhook).channels.bluebubbles.dmPolicy:pairing | allowlist | open | disabled(por defecto:pairing).channels.bluebubbles.allowFrom: Lista de permitidos para MD (identificadores, correos, números E.164,chat_id:*,chat_guid:*).channels.bluebubbles.groupPolicy:open | allowlist | disabled(por defecto:allowlist).channels.bluebubbles.groupAllowFrom: Lista de permitidos de remitentes de grupo.channels.bluebubbles.groups: Configuración por grupo (requireMention, etc.).channels.bluebubbles.sendReadReceipts: Enviar confirmaciones de lectura (por defecto:true).channels.bluebubbles.blockStreaming: Habilitar transmisión por bloques (por defecto:false; requerido para respuestas en transmisión).channels.bluebubbles.textChunkLimit: Tamaño del fragmento saliente en caracteres (por defecto: 4000).channels.bluebubbles.chunkMode:length(por defecto) divide solo cuando excedetextChunkLimit;newlinedivide en líneas en blanco (límites de párrafo) antes de la división por longitud.channels.bluebubbles.mediaMaxMb: Límite de medios entrantes/salientes en MB (por defecto: 8).channels.bluebubbles.mediaLocalRoots: Lista de permitidos explícita de directorios locales absolutos permitidos para rutas de medios locales salientes. Los envíos de rutas locales se deniegan por defecto a menos que esto esté configurado. Anulación por cuenta:channels.bluebubbles.accounts.<accountId>.mediaLocalRoots.channels.bluebubbles.historyLimit: Máximo de mensajes de grupo para contexto (0 deshabilita).channels.bluebubbles.dmHistoryLimit: Límite de historial de MD.channels.bluebubbles.actions: Habilitar/deshabilitar acciones específicas.channels.bluebubbles.accounts: Configuración multi-cuenta.
Opciones globales relacionadas:
agents.list[].groupChat.mentionPatterns(omessages.groupChat.mentionPatterns).messages.responsePrefix.
Direccionamiento / destinos de entrega
Prefiere chat_guid para enrutamiento estable:
chat_guid:iMessage;-;+15555550123(preferido para grupos)chat_id:123chat_identifier:...- Identificadores directos:
+15555550123,user@example.com- Si un identificador directo no tiene un chat de MD existente, OpenClaw creará uno vía
POST /api/v1/chat/new. Esto requiere que la API Privada de BlueBubbles esté habilitada.
- Si un identificador directo no tiene un chat de MD existente, OpenClaw creará uno vía
Seguridad
- Las solicitudes de webhook se autentican comparando los parámetros de consulta o encabezados
guid/passwordconchannels.bluebubbles.password. Las solicitudes desdelocalhosttambién se aceptan. - Mantén la contraseña de la API y el endpoint del webhook en secreto (trátalos como credenciales).
- La confianza en localhost significa que un proxy inverso en el mismo host puede omitir la contraseña involuntariamente. Si usas proxy para la puerta de enlace, requiere autenticación en el proxy y configura
gateway.trustedProxies. Ver Seguridad de la puerta de enlace. - Habilita HTTPS + reglas de firewall en el servidor BlueBubbles si lo expones fuera de tu LAN.
Resolución de problemas
- Si los eventos de escritura/lectura dejan de funcionar, revisa los registros de webhook de BlueBubbles y verifica que la ruta de la puerta de enlace coincida con
channels.bluebubbles.webhookPath. - Los códigos de emparejamiento expiran después de una hora; usa
openclaw pairing list bluebubblesyopenclaw pairing approve bluebubbles <code>. - Las reacciones requieren la API privada de BlueBubbles (
POST /api/v1/message/react); asegúrate de que la versión del servidor la exponga. - Editar/eliminar requieren macOS 13+ y una versión compatible del servidor BlueBubbles. En macOS 26 (Tahoe), editar está actualmente roto debido a cambios en la API privada.
- Las actualizaciones de iconos de grupo pueden ser inestables en macOS 26 (Tahoe): la API puede devolver éxito pero el nuevo icono no se sincroniza.
- OpenClaw oculta automáticamente las acciones conocidas como rotas según la versión de macOS del servidor BlueBubbles. Si editar aún aparece en macOS 26 (Tahoe), deshabilítalo manualmente con
channels.bluebubbles.actions.edit=false. - Para información de estado/salud:
openclaw status --alloopenclaw status --deep.
Para referencia general del flujo de trabajo de canales, ver Canales y la guía de Plugins.