finalizado3 min read

CaloteBot

Bot de cobrança via WhatsApp com agendamento de mensagens, templates dinâmicos e suporte a anexos. Começou como script pessoal e virou uma operação modular.

Node.jsvenom-botdayjsinquirernode-schedule

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-bot
2Controle de browser → WebSocket nativo
3Frágil a updates de UI → Integração de protocolo
4Sem agendamento real → node-schedule (estilo cron)
5Script monolítico → Módulos separados por responsabilidade

Arquitetura

1calote-bot/
2├── calote.js # Ponto de entrada (CLI com inquirer)
3├── data/
4│ ├── contacts.json # Contatos com templates e horários
5│ └── contacts-example.json
6├── messages/
7│ └── generateMessage.js # Interpolação de variáveis no template
8├── scheduler/
9│ └── schedule.js # Agendamento com node-schedule
10├── sender/
11│ └── sendMessage.js # Envio via venom-bot
12└── images/ # Anexos opcionais

Templates 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.js
2const schedule = require("node-schedule");
3const dayjs = require("dayjs");
4
5function 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:

BibliotecaMaturidadeConfiabilidadeManutenção
whatsapp-web.jsAltaAltaAtiva
venom-botMédia-AltaAltaAtiva
baileysAltaMédiaAtiva

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 install
2cp data/contacts-example.json data/contacts.json
3# editar contacts.json com seus dados
4npm start
5# escanear QR Code no terminal com WhatsApp > Dispositivos Conectados
6# escolher: enviar agora ou agendar