- Document content extraction fix (JSON deserialization) - Document list streaming fix (single message vs chunks) - Update status to reflect working integration - Add debug commands and next steps for production 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
5.8 KiB
5.8 KiB
Configuração WhatsApp - Bot Salesianos
Status Atual
| Campo | Valor | Status |
|---|---|---|
| Phone Number | +15558293147 | ✅ |
| Phone Number ID | 323250907549153 | ✅ Configurado |
| Business Account ID | 1261667644771701 | ✅ Configurado |
| APP ID | 948641861003702 | ✅ |
| Client Token | 84ba0c232681678376c7693ad2252763 | ⚠️ Temporário |
| API Key (Permanent Token) | EAAQdlso6aM8B... (configured) | ✅ Configurado |
| Verify Token | webhook_verify_salesianos_2024 | ✅ Configurado |
✅ Problemas Resolvidos (2026-03-06)
Problema 1: Mensagens ignoradas pelo bot (RESOLVIDO)
Sintoma: Mensagens eram recebidas mas ignoradas pelo bot (query vazia no KB)
Causa raiz: JSON deserialization estava falhando - array messages aparecia vazio
Solução aplicada:
- ✅ Adicionado debug logging em
handle_webhook()eprocess_incoming_message() - ✅ Verificado estrutura do payload JSON
- ✅ Testado com script de simulação
Resultado: Mensagens agora são processadas corretamente
Problema 2: Listas duplicadas/multipartes (RESOLVIDO)
Sintoma: Listas (li/ul) eram enviadas em chunks separados, causando duplicação
Causa raiz: Lógica de streaming enviava mensagens em pedaços durante a geração
Solução aplicada:
- ✅ Simplificado streaming em
botserver/src/whatsapp/mod.rs:597-623 - ✅ Removido chunking - agora acumula todo conteúdo antes de enviar
- ✅ Mensagem só é enviada quando
is_final = true
Resultado: Listas e todo conteúdo enviado como uma mensagem completa
Código Modificado
Arquivo: botserver/src/whatsapp/mod.rs
Função: route_to_bot() - Streaming simplificado
tokio::spawn(async move {
let mut buffer = String::new();
while let Some(response) = rx.recv().await {
let is_final = response.is_complete;
if !response.content.is_empty() {
buffer.push_str(&response.content);
}
// Only send when the complete message is ready
// This ensures lists and all content are sent as one complete message
if is_final && !buffer.is_empty() {
let mut wa_response = response;
wa_response.user_id.clone_from(&phone);
wa_response.channel = "whatsapp".to_string();
wa_response.content = buffer.clone();
wa_response.is_complete = true;
if let Err(e) = adapter_for_send.send_message(wa_response).await {
error!("Failed to send WhatsApp response: {}", e);
}
buffer.clear();
}
}
});
Mudanças principais:
- ❌ Removido:
MIN_CHUNKS_TO_SEND,chunk_count,in_list,list_indentation - ✅ Adicionado: Buffer simples, envio único quando
is_final
Fase 1: Configuração Básica ✅
- Obter Permanent Access Token - ✅ CONFIGURADO
- Verificar config.csv atual - ✅ TODOS OS CAMPOS CONFIGURADOS
- Arquivo:
/opt/gbo/data/salesianos.gbai/salesianos.gbot/config.csv - Campos:
whatsapp-phone-number-id,whatsapp-business-account-id,whatsapp-api-key,whatsapp-verify-token
- Arquivo:
Fase 2: Configuração do Webhook (PENDENTE PRODUÇÃO)
-
Configurar webhook na Meta Business Suite
- URL de produção:
https://<seu-dominio>/webhook/whatsapp/<bot_id> - Verify Token:
webhook_verify_salesianos_2024 - Subscrever eventos:
messages,messaging_postbacks
- URL de produção:
-
Verificar se webhook está acessível externamente
- Configurar reverse proxy (nginx/traefik)
- Configurar SSL/TLS (obrigatório para produção)
-
Testar verificação do webhook
curl "https://<seu-dominio>/webhook/whatsapp/<bot_id>?hub.mode=subscribe&hub.challenge=test&hub.verify_token=webhook_verify_salesianos_2024"
Fase 3: Testes
Teste Local ✅
- Script de teste:
/tmp/test_whatsapp_webhook.sh - Webhook local funcionando:
http://localhost:8080/webhook/whatsapp/<bot_id> - Extração de conteúdo: Funcionando
- Streaming de listas: Corrigido
Teste Produção (PENDENTE)
- Testar com mensagem real do WhatsApp
- Enviar mensagem para +15558293147
- Verificar se resposta vem completa (sem duplicação)
Comandos de Debug
# Ver mensagens WhatsApp em tempo real
tail -f botserver.log | grep -iE "(whatsapp|Extracted|content)"
# Testar webhook localmente
/tmp/test_whatsapp_webhook.sh
# Verificar configuração do bot
cat /opt/gbo/data/salesianos.gbai/salesianos.gbot/config.csv | grep whatsapp
# Verificar saúde do servidor
curl http://localhost:8080/health
Fase 4: Produção
-
Configurar SSL/TLS
- Certificado válido para o domínio
- HTTPS obrigatório para webhooks
-
Rate Limiting
- Verificar limites da API do WhatsApp
- Implementar throttling se necessário
-
Monitoramento
- Alertas para falhas de webhook
- Logs estruturados
-
Backup do config.csv
- Salvar configurações em local seguro
- Documentar credenciais (exceto secrets)
Referências
- WhatsApp Business API Docs
- Meta Business Suite
- Arquivo de config:
/opt/gbo/data/salesianos.gbai/salesianos.gbot/config.csv - Webhook handler:
botserver/src/whatsapp/mod.rs - Test script:
/tmp/test_whatsapp_webhook.sh
Notas
- Client Token fornecido é temporário - necessário Permanent Access Token ✅ OBTIDO
- Token permanente armazenado no config.csv
- Webhook local funcionando - pendente configuração de produção
Próximos Passos
- Testar com mensagens reais do WhatsApp
- Configurar webhook na Meta Business Suite para produção
- Configurar SSL/TLS no servidor de produção
- Monitorar logs em produção
- Documentar processo de deploy