WhatsApp (canal Web)
Status: pronto para produção via WhatsApp Web (Baileys). O Gateway gerencia a(s) sessão(ões) vinculada(s).Instalação (sob demanda)
- O onboarding (
openclaw onboard) eopenclaw channels add --channel whatsappsolicitam a instalação do plugin WhatsApp na primeira vez que você o seleciona. openclaw channels login --channel whatsapptambém oferece o fluxo de instalação quando o plugin ainda não está presente.- Canal dev + checkout git: usa por padrão o caminho do plugin local.
- Stable/Beta: usa por padrão o pacote npm
@openclaw/whatsapp.
Pairing
A política padrão de DM é pareamento para remetentes desconhecidos.
Channel troubleshooting
Diagnósticos entre canais e guias de reparo.
Gateway configuration
Padrões e exemplos completos de configuração de canal.
Configuração rápida
O OpenClaw recomenda executar o WhatsApp em um número separado sempre que possível. (Os metadados do canal e o fluxo de configuração são otimizados para essa configuração, mas configurações com número pessoal também são compatíveis.)
Padrões de implantação
Número dedicado (recomendado)
Número dedicado (recomendado)
Este é o modo operacional mais limpo:
- identidade do WhatsApp separada para o OpenClaw
- allowlists de DM e limites de roteamento mais claros
- menor chance de confusão com chat consigo mesmo
Fallback com número pessoal
Fallback com número pessoal
O onboarding oferece suporte ao modo com número pessoal e grava uma linha de base compatível com chat consigo mesmo:
dmPolicy: "allowlist"allowFrominclui seu número pessoalselfChatMode: true
allowFrom.Escopo do canal somente WhatsApp Web
Escopo do canal somente WhatsApp Web
O canal da plataforma de mensagens é baseado em WhatsApp Web (
Baileys) na arquitetura atual de canais do OpenClaw.Não há um canal separado de mensagens WhatsApp via Twilio no registro integrado de canais de chat.Modelo de runtime
- O Gateway gerencia o socket do WhatsApp e o loop de reconexão.
- Envios de saída exigem um listener ativo do WhatsApp para a conta de destino.
- Chats de status e broadcast são ignorados (
@status,@broadcast). - Chats diretos usam regras de sessão de DM (
session.dmScope; o padrãomainrecolhe DMs na sessão principal do agente). - Sessões de grupo são isoladas (
agent:<agentId>:whatsapp:group:<jid>).
Controle de acesso e ativação
- Política de DM
- Política de grupo + allowlists
- Menções + /activation
channels.whatsapp.dmPolicy controla o acesso a chats diretos:pairing(padrão)allowlistopen(requer queallowFrominclua"*")disabled
allowFrom aceita números no estilo E.164 (normalizados internamente).Substituição para múltiplas contas: channels.whatsapp.accounts.<id>.dmPolicy (e allowFrom) têm precedência sobre os padrões no nível do canal para essa conta.Detalhes do comportamento em runtime:- os pareamentos são persistidos no armazenamento de allowlist do canal e mesclados com
allowFromconfigurado - se nenhuma allowlist for configurada, o número próprio vinculado é permitido por padrão
- DMs de saída
fromMenunca são pareadas automaticamente
Comportamento com número pessoal e chat consigo mesmo
Quando o número próprio vinculado também está presente emallowFrom, as proteções de chat consigo mesmo do WhatsApp são ativadas:
- ignora confirmações de leitura em interações de chat consigo mesmo
- ignora o comportamento de acionamento automático por mention-JID que, de outra forma, faria você receber ping
- se
messages.responsePrefixnão estiver definido, as respostas de chat consigo mesmo usam por padrão[{identity.name}]ou[openclaw]
Normalização de mensagens e contexto
Envelope de entrada + contexto de resposta
Envelope de entrada + contexto de resposta
As mensagens recebidas do WhatsApp são encapsuladas no envelope compartilhado de entrada.Se houver uma resposta citada, o contexto será acrescentado nesta forma:Campos de metadados de resposta também são preenchidos quando disponíveis (
ReplyToId, ReplyToBody, ReplyToSender, sender JID/E.164).Placeholders de mídia e extração de localização/contato
Placeholders de mídia e extração de localização/contato
Mensagens de entrada somente com mídia são normalizadas com placeholders como:
<media:image><media:video><media:audio><media:document><media:sticker>
Injeção de histórico de grupo pendente
Injeção de histórico de grupo pendente
Para grupos, mensagens não processadas podem ser armazenadas em buffer e injetadas como contexto quando o bot finalmente é acionado.
- limite padrão:
50 - configuração:
channels.whatsapp.historyLimit - fallback:
messages.groupChat.historyLimit 0desabilita
[Chat messages since your last reply - for context][Current message - respond to this]
Confirmações de leitura
Confirmações de leitura
As confirmações de leitura são habilitadas por padrão para mensagens de entrada do WhatsApp aceitas.Desabilite globalmente:Substituição por conta:Interações de chat consigo mesmo ignoram confirmações de leitura mesmo quando habilitadas globalmente.
Entrega, divisão em blocos e mídia
Divisão de texto em blocos
Divisão de texto em blocos
- limite padrão de bloco:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"- o modo
newlineprefere limites de parágrafo (linhas em branco) e depois usa divisão segura por comprimento como fallback
Comportamento de mídia de saída
Comportamento de mídia de saída
- oferece suporte a cargas de imagem, vídeo, áudio (nota de voz PTT) e documento
audio/oggé reescrito paraaudio/ogg; codecs=opuspara compatibilidade com notas de voz- a reprodução de GIF animado é compatível por meio de
gifPlayback: trueem envios de vídeo - legendas são aplicadas ao primeiro item de mídia ao enviar cargas de resposta com múltiplas mídias
- a origem da mídia pode ser HTTP(S),
file://ou caminhos locais
Limites de tamanho de mídia e comportamento de fallback
Limites de tamanho de mídia e comportamento de fallback
- limite de salvamento de mídia de entrada:
channels.whatsapp.mediaMaxMb(padrão50) - limite de envio de mídia de saída:
channels.whatsapp.mediaMaxMb(padrão50) - substituições por conta usam
channels.whatsapp.accounts.<accountId>.mediaMaxMb - imagens são otimizadas automaticamente (varredura de redimensionamento/qualidade) para caber nos limites
- em falha de envio de mídia, o fallback do primeiro item envia um aviso em texto em vez de descartar a resposta silenciosamente
Nível de reação
channels.whatsapp.reactionLevel controla com que amplitude o agente usa reações com emoji no WhatsApp:
| Nível | Reações de ack | Reações iniciadas pelo agente | Descrição |
|---|---|---|---|
"off" | Não | Não | Nenhuma reação |
"ack" | Sim | Não | Apenas reações de ack (confirmação pré-resposta) |
"minimal" | Sim | Sim (conservadoras) | Ack + reações do agente com orientação conservadora |
"extensive" | Sim | Sim (incentivadas) | Ack + reações do agente com orientação incentivada |
"minimal".
Substituições por conta usam channels.whatsapp.accounts.<id>.reactionLevel.
Reações de confirmação
O WhatsApp oferece suporte a reações imediatas de ack no recebimento de entrada viachannels.whatsapp.ackReaction.
As reações de ack são controladas por reactionLevel — elas são suprimidas quando reactionLevel é "off".
- enviadas imediatamente após a entrada ser aceita (antes da resposta)
- falhas são registradas em log, mas não bloqueiam a entrega normal da resposta
- no modo de grupo
mentions, reage em interações acionadas por menção; a ativação de grupoalwaysfunciona como bypass para essa verificação - o WhatsApp usa
channels.whatsapp.ackReaction(o legadomessages.ackReactionnão é usado aqui)
Múltiplas contas e credenciais
Seleção de conta e padrões
Seleção de conta e padrões
- ids de conta vêm de
channels.whatsapp.accounts - seleção da conta padrão:
defaultse estiver presente; caso contrário, o primeiro id de conta configurado (ordenado) - ids de conta são normalizados internamente para consulta
Caminhos de credenciais e compatibilidade legada
Caminhos de credenciais e compatibilidade legada
- caminho de autenticação atual:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - arquivo de backup:
creds.json.bak - a autenticação legada padrão em
~/.openclaw/credentials/ainda é reconhecida/migrada para fluxos de conta padrão
Comportamento de logout
Comportamento de logout
openclaw channels logout --channel whatsapp [--account <id>] limpa o estado de autenticação do WhatsApp para essa conta.Em diretórios de autenticação legados, oauth.json é preservado enquanto arquivos de autenticação do Baileys são removidos.Ferramentas, ações e escritas de configuração
- O suporte a ferramentas do agente inclui a ação de reação do WhatsApp (
react). - Portas de ação:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- Escritas de configuração iniciadas pelo canal são habilitadas por padrão (desabilite com
channels.whatsapp.configWrites=false).
Solução de problemas
Não vinculado (QR necessário)
Não vinculado (QR necessário)
Sintoma: o status do canal informa que não está vinculado.Correção:
Vinculado, mas desconectado / loop de reconexão
Vinculado, mas desconectado / loop de reconexão
Sintoma: conta vinculada com desconexões repetidas ou tentativas de reconexão.Correção:Se necessário, vincule novamente com
channels login.Nenhum listener ativo ao enviar
Nenhum listener ativo ao enviar
Envios de saída falham rapidamente quando não existe um listener ativo do gateway para a conta de destino.Certifique-se de que o gateway está em execução e a conta está vinculada.
Mensagens de grupo ignoradas inesperadamente
Mensagens de grupo ignoradas inesperadamente
Verifique nesta ordem:
groupPolicygroupAllowFrom/allowFrom- entradas da allowlist
groups - controle por menção (
requireMention+ padrões de menção) - chaves duplicadas em
openclaw.json(JSON5): entradas posteriores sobrescrevem as anteriores, então mantenha um únicogroupPolicypor escopo
Aviso de runtime do Bun
Aviso de runtime do Bun
O runtime do gateway do WhatsApp deve usar Node. Bun é marcado como incompatível para operação estável do gateway WhatsApp/Telegram.
Ponteiros para referência de configuração
Referência principal: Campos importantes do WhatsApp:- acesso:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - entrega:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - múltiplas contas:
accounts.<id>.enabled,accounts.<id>.authDir, substituições no nível da conta - operações:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - comportamento de sessão:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit