Serviço HTTP para enfileirar e enviar mensagens pelo WhatsApp. As mensagens são armazenadas em um banco SQLite com Prisma e processadas pelo cliente do WhatsApp baseado em Baileys.
Antes de começar, instale:
- Node.js 20 ou superior;
- npm;
- uma conta de WhatsApp que possa ser vinculada pelo QR Code.
O SQLite é usado por meio de uma biblioteca Node.js, portanto não é necessário instalar um servidor de banco de dados separado.
cd notification-servicenpm installCrie um arquivo chamado .env na raiz do projeto:
DATABASE_URL="file:./data.db"
SECRET_KEY="troque-por-uma-chave-com-pelo-menos-32-caracteres"
PORT=3012
# Opcionais: usados na transcrição de áudios recebidos
OPENAI_KEY=""
MAX_AUDIO_BYTES=26214400Observações:
DATABASE_URLé obrigatória e aponta para o arquivo SQLite;SECRET_KEYé obrigatória, precisa ter pelo menos 32 caracteres e será usada como token de acesso à API;PORTé opcional; quando omitida, a aplicação usa3012;OPENAI_KEYsó é necessária para recursos que transcrevem áudio;- não compartilhe nem versione o arquivo
.envcom credenciais reais.
O código também aceita as variáveis opcionais EMAIL_HOST, EMAIL_PORT,
EMAIL_USER, EMAIL_WARNING, EMAIL_PASS, EMAIL_REMETENTE, ROOT_USER,
ROOT_PASSWORD e ROOT_EMAIL. Elas não são necessárias para iniciar o fluxo
atual de WhatsApp.
npx prisma generateO client será criado em generated/prisma, na raiz do projeto.
Para aplicar as migrations que já estão versionadas:
npx prisma migrate deployEsse comando cria o arquivo SQLite definido em DATABASE_URL, caso ele ainda
não exista, e aplica as migrations pendentes.
npm run devA API ficará disponível, por padrão, em:
http://localhost:3012
Na primeira execução, um QR Code do WhatsApp deve aparecer no terminal. No
celular, abra WhatsApp > Aparelhos conectados > Conectar um aparelho e
escaneie o código. A sessão é persistida na pasta sessions/, então normalmente
não será necessário escanear novamente nas próximas execuções.
Mantenha esse terminal aberto enquanto estiver usando o serviço. Para encerrar,
pressione Ctrl+C.
Todas as rotas, inclusive as de verificação, exigem o token definido em
SECRET_KEY no cabeçalho Authorization.
curl http://localhost:3012/ping \
-H "Authorization: Bearer troque-por-uma-chave-com-pelo-menos-32-caracteres"Resposta esperada:
Pong
curl -X POST http://localhost:3012/whatsapp \
-H "Authorization: Bearer troque-por-uma-chave-com-pelo-menos-32-caracteres" \
-H "Content-Type: application/json" \
-d '{"text":"Olá!","phone":"5511999999999"}'Campos usados nesse endpoint:
text: texto da mensagem, de 1 a 500 caracteres;phone: telefone com DDI e DDD, contendo de 10 a 15 dígitos;webhook: URL opcional que receberá mensagens de retorno relacionadas ao número.
A requisição registra a mensagem no banco. O serviço verifica periodicamente a fila e faz o envio quando a sessão do WhatsApp está conectada.
| Comando | Finalidade |
|---|---|
npm run dev |
Inicia a API em desenvolvimento com tsx. |
npm run test:run |
Executa os testes uma vez. |
npm test |
Executa o Vitest em modo interativo. |
npm run build |
Compila o TypeScript e prepara arquivos para dist/. |
npm start |
Executa a versão compilada em dist/server.js. |
npm run whatsapp:connect |
Compila e abre o fluxo de conexão do WhatsApp. |
npm run whatsapp:delete-session |
Compila e remove a sessão salva do WhatsApp. |
npm run clear-messages |
Compila e apaga todas as mensagens do banco. |
Para forçar um novo vínculo do WhatsApp enquanto o build não estiver disponível,
pare a aplicação e remova manualmente a pasta sessions/whatsapp-baileys; faça
isso apenas se quiser invalidar a sessão local atual.
O fluxo validado para uso local é:
npm install
npx prisma generate
npx prisma migrate deploy
npm run devNo estado atual do repositório, npm run build ainda falha por erros de tipagem
TypeScript no código do WhatsApp e por declarações de tipos ausentes. Por isso,
npm start e os scripts que começam executando o build não ficam disponíveis
até esses erros serem corrigidos.
Além disso, a suíte possui um teste de controller com uma mensagem de erro antiga:
o comportamento atual retorna os detalhes de validação do Zod. Assim,
npm run test:run executa quatro testes, mas um deles falha por divergência na
resposta esperada.