O Problema
Começou simples: um amigo me devia e eu precisava cobrar. Criei um script em Python + Selenium para enviar a mensagem automaticamente.
Até mais uma pessoa começar a dever. Aí virou outra coisa.
A pergunta passou a ser: como transformar uma cobrança pontual em um sistema modular e reutilizável?
Visão Geral
O CaloteBot é um bot de cobrança via WhatsApp que funciona via terminal. Ele:
- Envia mensagens personalizadas com variáveis dinâmicas
- Agenda o envio por horários definidos por contato
- Suporta anexos de imagem (prints, comprovantes, memes)
- Roda com menu interativo no terminal
Por Que Migrei para Node.js
O script original em Python com Selenium era frágil: dependia do estado do browser, quebrava com updates do WhatsApp Web e não tinha como agendar de forma confiável.
A migração para Node.js + venom-bot resolveu:
1Python + Selenium → Node.js + venom-bot2Controle de browser → WebSocket nativo3Frágil a updates de UI → Integração de protocolo4Sem agendamento real → node-schedule (estilo cron)5Script monolítico → Módulos separados por responsabilidadeArquitetura
1calote-bot/2├── calote.js # Ponto de entrada (CLI com inquirer)3├── data/4│ ├── contacts.json # Contatos com templates e horários5│ └── contacts-example.json6├── messages/7│ └── generateMessage.js # Interpolação de variáveis no template8├── scheduler/9│ └── schedule.js # Agendamento com node-schedule10├── sender/11│ └── sendMessage.js # Envio via venom-bot12└── images/ # Anexos opcionaisTemplates com Variáveis Dinâmicas
Cada contato define seu próprio template com variáveis interpoladas em runtime:
1{2 "name": "Fulano",3 "number": "559999999999",4 "amount": 170.0,5 "dueDate": "2025-04-25",6 "schedules": ["08:00", "11:00"],7 "template": "Oi {{name}}, já se passaram {{days}} dias. Valor: R${{amount}}."8}O módulo generateMessage.js resolve as variáveis calculando daysLate a partir de dueDate via dayjs.
Agendamento
O node-schedule agenda o envio nos horários definidos por contato:
1// schedule.js2const schedule = require("node-schedule");3const dayjs = require("dayjs");45function scheduleMessages(contacts, sendFn) {6 contacts.forEach((contact) => {7 contact.schedules.forEach((time) => {8 const [hour, minute] = time.split(":").map(Number);9 schedule.scheduleJob({ hour, minute }, () => sendFn(contact));10 });11 });12}Decisão Técnica
A escolha do venom-bot foi feita após comparar três opções:
| Biblioteca | Maturidade | Confiabilidade | Manutenção |
|---|---|---|---|
| whatsapp-web.js | Alta | Alta | Ativa |
| venom-bot | Média-Alta | Alta | Ativa |
| baileys | Alta | Média | Ativa |
O venom-bot venceu pela simplicidade da API para o caso de uso (envio + anexos) sem precisar de configurações avançadas de multi-device.
Uso
1npm install2cp data/contacts-example.json data/contacts.json3# editar contacts.json com seus dados4npm start5# escanear QR Code no terminal com WhatsApp > Dispositivos Conectados6# escolher: enviar agora ou agendar