Como ligamos o Claude ao WhatsApp

Desenho que roda hoje na Gota Consciência e as correções que fizemos no caminho. Uma pessoa manda mensagem, o Claude trabalha no computador dela e responde de volta.

O caminho de uma mensagem

1. WhatsAppA pessoa manda a mensagem para o número oficial (API Cloud da Meta).
2. WorkerUm Cloudflare Worker com banco D1 recebe e guarda tudo.
3. AtendenteUm script no Mac, acionado a cada 30 s, busca o que está sem resposta.
4. ClaudeRoda em modo claude -p na pasta do projeto, faz o trabalho e escreve a resposta.
5. RespostaO script envia pelo Worker e marca como respondida.

As peças

Correções que fizemos

  1. Canal MCP abandonado. A primeira versão ligava uma sessão do Claude por um canal de desenvolvimento. Ele exige confirmação manual a cada abertura, o app desktop não o carrega e a flag comum ignora o canal sem avisar. Mensagens eram consumidas e ninguém via. Hoje o atendente roda sozinho, sem canal e sem sessão aberta.
  2. "Entregue" não é "respondida". Passamos a guardar as duas coisas separadas: oferecer a uma sessão não conta como responder.
  3. Recibo automático. Se ninguém responde em 5 minutos, o próprio Worker avisa a pessoa de que a mensagem ficou registrada. Funciona mesmo com o computador desligado.
  4. Resposta gravada antes de enviar. Montar o envio no shell quebrou com texto de várias linhas e a resposta se perdeu. Agora a resposta vai para um arquivo e o envio é feito por um script próprio.
  5. Cabeçalho de navegador. A Cloudflare recusa clientes sem identificação (erro 1010); o script de envio manda um User-Agent comum.
  6. Trava com dono. O atendente roda um lote por vez. Se a trava ficar sem dono vivo (Mac dormiu, app reiniciou), a próxima execução assume. Antes, uma trava velha bloqueou o atendimento por horas, em silêncio.
  7. Teto por lote e disjuntor. Cada lote tem 50 minutos no máximo. Três falhas seguidas avisam o dono e desistem daquele lote.
  8. Janela de 24 horas. Fora dela a Meta recusa texto livre; usamos um modelo (template) aprovado.
  9. Um poller só. Vários processos consultando o Worker estouraram a cota diária; hoje há uma instância por vez e o plano pago dos Workers é recomendado.
  10. Conferir no disco. Não basta a resposta dizer que fez: conferimos os arquivos criados, como provado ao corrigir 20 slides por mensagem.

Para reproduzir

  1. Criar o app na Meta com WhatsApp Business e um usuário do sistema com token permanente.
  2. Criar o Worker com D1, receber o webhook, guardar mensagens com os campos entregue e respondida, e as rotas de pendências e resposta.
  3. Escrever o atendente: busca, aviso de recebimento, claude -p, gravação em disco, envio e marcação.
  4. Agendar o atendente no launchd a cada 30 segundos, com trava por PID.
  5. Cadastrar os números permitidos e os modelos de mensagem aprovados.

Limite conhecido: o Mac precisa estar ligado e logado para o atendente responder; sem ele, só o recibo automático do Worker sai.