Sistema de ponte (bridge) em Node.js que conecta o WhatsApp ao backend TH-brain (Spring Boot), permitindo que a assistente TH converse com usuários em tempo real via WhatsApp, com debounce, indicador de digitação e API HTTP para integração externa.
- Visão geral
- Funcionalidades
- Arquitetura
- Pré-requisitos
- Instalação
- Configuração
- Uso
- API HTTP
- Integração TH-brain
- Estrutura do projeto
- Segurança e privacidade
- Solução de problemas
- Referências
O TH Bridge é o componente que fica entre o WhatsApp (via biblioteca Baileys) e o backend TH-brain. Ele:
- Mantém uma sessão WhatsApp vinculada como dispositivo (ex.: "Assistente th").
- Recebe mensagens em tempo real, acumula em buffer por usuário (debounce de 6 s) e envia um único lote ao TH-brain para evitar respostas fragmentadas.
- Envia ao usuário apenas a resposta quando o TH-brain retorna conteúdo (200); em 204 ou erro, não envia mensagem (ou fallback em caso de indisponibilidade).
- Oferece API HTTP para health check e envio programático de mensagens.
- Exibe indicador de “digitando…” antes de enviar a resposta da TH, para experiência mais natural.
O repositório contém apenas o bridge; credenciais de WhatsApp (auth_th) e módulos sensíveis não são versionados.
| Funcionalidade | Descrição |
|---|---|
| Conexão WhatsApp | Sessão persistente via Baileys; reconexão automática. |
| Integração TH-brain | POST para TH_BRAIN_URL/api/v1/brain/process com payload no formato User (text ou messages). |
| Debounce | Buffer de 6 s por remetente; envio único com text (1 msg) ou messages (várias). |
| Resposta condicional | Só envia mensagem ao usuário se o brain retornar 200 com response; 204 = sem resposta. |
| Indicador de digitação | Presença “digitando” antes de enviar a resposta; tempo proporcional ao tamanho do texto. |
| API HTTP | GET /health, POST /send-message para integração externa. |
| Filtro de mensagens | Ignora mensagens próprias (fromMe), sem texto (mídia/figurinha) e append antiga (>5 min). |
| Estado de conversa | conversationActivate por remetente; “tchau th” / “exit” desativam. |
┌─────────────────┐ mensagens ┌──────────────┐ POST /api/v1/brain/process ┌─────────────┐
│ WhatsApp │ ◄────────────────► │ TH Bridge │ ◄─────────────────────────────────► │ TH-brain │
│ (usuários) │ respostas │ (Node.js) │ text / messages + User │ (Spring) │
└─────────────────┘ └──────────────┘ └─────────────┘
│
│ GET /health
│ POST /send-message
▼
┌─────────────────┐
│ Clientes HTTP │
│ (monitoração) │
└─────────────────┘
- Fluxo de mensagem: WhatsApp → Bridge (buffer por usuário) → após 6 s sem nova mensagem → uma requisição ao TH-brain com
textoumessages→ se 200 comresponse, bridge envia “digitando” e depois o texto ao usuário. - Variáveis de ambiente:
PORT(API),TH_BRAIN_URL(base do backend).
- Node.js 18.x ou superior.
- npm (ou yarn/pnpm).
- TH-brain rodando e acessível (ex.:
http://localhost:8080) para processar mensagens. - Conta WhatsApp para vincular como dispositivo (QR Code na primeira execução).
-
Clone o repositório (ou baixe o código):
git clone https://github.com/DevHerbertt/TH-assistent-Bridge.git cd TH-assistent-Bridge -
Instale as dependências:
npm install
-
(Opcional) Configure variáveis de ambiente (veja Configuração).
-
Inicie o bridge:
npm start
Ou diretamente:
node th-bridge.js
-
Primeira execução: um QR Code será exibido no terminal. Abra o WhatsApp no celular → Dispositivos vinculados → Vincular dispositivo e escaneie o QR. A sessão fica salva em
auth_th(não versionada).
| Variável | Descrição | Padrão |
|---|---|---|
PORT |
Porta do servidor HTTP (API) | 3000 |
TH_BRAIN_URL |
URL base do backend TH-brain | http://localhost:8080 |
Exemplo em ambiente Unix (bash):
export PORT=3000
export TH_BRAIN_URL=http://localhost:8080
npm startNo Windows (PowerShell):
$env:PORT=3000
$env:TH_BRAIN_URL="http://localhost:8080"
npm startO endpoint usado pelo bridge é: {TH_BRAIN_URL}/api/v1/brain/process.
npm startVerifique no terminal: ✅ th ONLINE! e a URL da API (ex.: http://localhost:3000). No celular, o dispositivo vinculado aparecerá como "Assistente th".
Para evitar histórico antigo ao reconectar ou trocar de conta:
- Pelo computador: apague a pasta
auth_thna raiz do projeto e rodenpm startnovamente; um novo QR Code será exibido. - Pelo celular: WhatsApp → Dispositivos vinculados → "Assistente th" → Desvincular. Na próxima execução do bridge, escaneie o QR novamente.
- Mensagens com texto são acumuladas por remetente; após 6 segundos sem nova mensagem, o lote é enviado ao TH-brain em uma única requisição (
textoumessages). - O bridge só envia resposta ao usuário quando o TH-brain retorna 200 com campo
response. Em 204 (sem resposta) nada é enviado; em erro de rede/5xx pode ser enviada mensagem de fallback. - Mensagens sem texto (figurinha, áudio sem legenda, etc.) são ignoradas e não são enviadas ao brain.
A API roda na porta configurada por PORT (padrão 3000).
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/health |
Status do serviço e da conexão WhatsApp (whatsappConnected: true/false). |
POST |
/send-message |
Envia uma mensagem via WhatsApp. Body: { "to": "5511999999999", "message": "Texto" }. |
POST |
/webhook/message |
Webhook de notificações (resposta fixa de confirmação). |
Exemplo de health check:
curl http://localhost:3000/healthResposta esperada (exemplo):
{
"status": "ok",
"whatsappConnected": true,
"timestamp": "2026-02-21T12:00:00.000Z"
}Documentação detalhada da API está em API_DOCUMENTATION.md.
- URL:
POST {TH_BRAIN_URL}/api/v1/brain/process - Content-Type:
application/json - Corpo (modelo User):
text(uma mensagem) oumessages(array de strings).- Obrigatórios:
from,timeStamp,conversationActivate,name,menssageId,isgroup,messageType,deviceType.
- 200 OK com JSON
AiResponse: camporesponsecontém o texto a ser enviado ao usuário; o bridge envia esse texto no WhatsApp (com indicador de digitação). - 204 No Content: o bridge não envia nenhuma mensagem ao usuário.
- Erro (rede / 5xx): o bridge pode enviar mensagem de fallback (ex.: "TH temporariamente indisponível") e registra o erro em log.
Detalhes do payload e exemplos estão em JSON_ENVIADO_TH_BRAIN.md (ajuste a URL/endpoint para /api/v1/brain/process conforme seu backend).
TH-assistent-Bridge/
├── th-bridge.js # Aplicação principal (WhatsApp + API + TH-brain)
├── package.json # Dependências e scripts
├── README.md # Este arquivo
├── API_DOCUMENTATION.md # Documentação da API HTTP
├── ESTRUTURA.md # Documentação da estrutura (se existir)
├── JSON_ENVIADO_TH_BRAIN.md # Exemplo de payload para o TH-brain
├── EXEMPLO_JSON_RETORNO.md # Exemplo de resposta do TH-brain
├── .gitignore # Exclusões (auth_th, Th-cobrador, .env, etc.)
└── auth_th/ # Sessão WhatsApp (local, NUNCA versionar)
auth_th/é gerada na primeira execução e não deve ser commitada.- Módulos como Th-cobrador não fazem parte deste repositório; o
.gitignoregarante que não sejam incluídos.
- Credenciais WhatsApp: armazenadas apenas na pasta
auth_thno ambiente local. Nunca incluaauth_them repositórios ou backups públicos. - Variáveis sensíveis: use
.envpara URLs ou tokens se necessário;.envestá no.gitignore. - API: os endpoints atuais não exigem autenticação; em produção, considere rede privada, proxy reverso ou middleware de autenticação.
- Dados de mensagens: trafegam entre o bridge e o TH-brain; garanta que o TH-brain e a rede estejam adequados às suas políticas de privacidade e LGPD.
| Situação | Ação sugerida |
|---|---|
| QR Code não aparece | Verifique se a pasta auth_th existe e se não está corrompida; tente removê-la e rodar de novo. |
| Bridge não envia resposta ao usuário | Confirme se o TH-brain está acessível em TH_BRAIN_URL e se retorna 200 com response. Veja os logs do bridge. |
| Muitas mensagens antigas ao conectar | Faça desvinculação pelo celular ou apague auth_th e vincule de novo para reduzir histórico. |
| “TH temporariamente indisponível” | Indica falha de comunicação com o TH-brain (timeout, 5xx, rede). Verifique URL, firewall e logs do backend. |
Logs no terminal indicam: evento de mensagem (NOTIFY), buffer por usuário, envio ao brain e resposta enviada ou 204.
TH Bridge — Sistema principal de conexão WhatsApp para a assistente TH.
Mantido no repositório TH-assistent-Bridge.