ZapBot¶
Bot para WhatsApp escrito em Node.js que roda em cima de uma sessão real do WhatsApp Web. Ele
recupera mensagens (e status) apagadas e editadas, baixa vídeos de redes sociais, cria figurinhas,
vigia mensagens por texto/regex e te avisa no privado, traz notícias, tempo e CVEs, conversa com o
ChatGPT e mais algumas brincadeiras,
tudo por comandos digitados no próprio chat (/help, /get, /show, /news, /gpt...).
Atalhos persistentes guardam comandos com argumentos e descrição opcional: cadastre com
/alias dimdim -desc "Exibe o preço do dólar" /cotacao USD, execute /dimdim e consulte
/help alias. O bot mostra o comando chamado antes do resultado. Um atalho também pode juntar
vários comandos num texto, como no /cron:
/alias carteira Orca {/defi orca}\n Prjx {/defi prjx}.
A ideia vem dos velhos tempos do IRC: o ZapBot é inspirado nas antigas
eggdrops, os bots que ficavam de plantão nos canais, respondendo a
comandos, guardando o que rolava e cuidando da casa. Aqui o canal é o grupo do WhatsApp, e os
comandos começam com /.
Principais funções:
- Recupera mensagens e status apagados ou editados, e reações removidas:
/show - 👀 Monitora até 5 contatos, com intervalo configurável e histórico limitado dos horários
de visto por último observados e alertas online:
/monitor - Baixa vídeos com yt-dlp e ffmpeg:
/get - Cria figurinhas:
/sticker - Vigia mensagens por texto ou regex:
/watch - Agenda mensagens:
/cron - Mostra cotações e alertas de preço:
/cotacao,/crypto - Acompanha posições DeFi (Orca, Project X, Liquidswap, Morpho, Aave V3):
/defi - Integra o ChatGPT:
/gpt,/tldr - Consulta CVEs, notícias e o tempo:
/cve,/news,/tempo - Faz backup do banco:
/backup - Controla permissões por usuário e grupo, com proteção contra flood:
/bot
Por onde começar:
- Instalação: requisitos, instalação pela última release e atualização.
- Configuração: o
config/.env, as chaves de API e o e-mail. - Comandos: todos os comandos, com opções e exemplos.
- Operação: o dia a dia, a saúde do container e a solução de problemas.
Como funciona¶
┌────────────── container zapbot (node:24-trixie-slim) ──────────────┐
│ │
│ app.js ──► whatsapp-web.js ──► Puppeteer ──► Chromium │──► WhatsApp Web
│ │ (headless) │
│ ├──► SQLite (cache/bot_database.db) mensagens, settings │
│ ├──► cache/media mídias p/ recuperar mensagens apagadas │
│ ├──► yt-dlp + ffmpeg comando /get │
│ ├──► APIs HTTP (axios) /gpt /tempo /cve /news /giphy... │
│ └──► SMTP (nodemailer) QR Code e alertas por e-mail │
│ │
│ volumes: wwebjs_auth → sessão do WhatsApp (.wwebjs_auth) │
│ app_cache → banco SQLite + mídias (cache/) │
└────────────────────────────────────────────────────────────────────┘
- Sessão WhatsApp: o
whatsapp-web.jsabre o WhatsApp Web num Chromium headless e pareia com o seu celular como um aparelho conectado. A sessão fica salva no volumewwebjs_auth, então o QR Code só precisa ser lido na primeira vez (ou quando a sessão for revogada). A versão da biblioteca é fixada nopackage-lock.jsonpara instalações reproduzíveis. Os ajustes locais ficam empatches/e são aplicados peloscripts/aplicar-patches.jsdurante a instalação, usandogit apply. Para instalar fora do Docker:PUPPETEER_SKIP_DOWNLOAD=true npm install. - Número do bot = seu número: o bot age como a conta que leu o QR Code. As mensagens que você envia (de qualquer aparelho) também passam pelo bot.
- Persistência: toda mensagem recebida é gravada no SQLite (mídias vão para
cache/media). Quando alguém apaga uma mensagem "para todos", o bot encontra a cópia no banco e a reenvia no seu privado (chat consigo mesmo; desative o aviso com/set show.alert.deleted off, a mensagem continua guardada). Mensagens apagadas ficam guardadas por 30 dias (settingcache.revokedRetentionDays) e podem ser reexibidas com/show. Status (textos/fotos/vídeos) apagados também são recuperados, com o título📸 STATUS APAGADO DETECTADOe reexibidos com/show -s. Com/set show.alert.status off, novas exclusões de status são ignoradas: não geram aviso nem entram na lista de apagados. - Editadas: quando alguém edita uma mensagem, o bot grava o texto de antes e o de depois (tabela
message_edits) e te avisa no seu privado com o título✏️ MENSAGEM EDITADA DETECTADA(desative o aviso com/set show.alert.edited off; a edição continua guardada). As edições ficam 30 dias (settingcache.editedRetentionDays) e podem ser reexibidas com/show -e. As suas próprias edições são ignoradas. - Reações: quando alguém remove uma reação (ou troca por outra), o bot te avisa no seu
privado com o título
😶 REAÇÃO REMOVIDA DETECTADA(ou🔄 REAÇÃO TROCADA DETECTADA), com a reação de antes e o texto da mensagem reagida (desative o aviso com/set show.alert.reaction off; a reação continua guardada). Elas ficam 30 dias (settingcache.reactionRetentionDays) e podem ser reexibidas com/show -r. - Silenciar: o
/mutecorta os avisos de apagadas, editadas, status e reações de uma pessoa, de um grupo ou de uma comunidade (a mensagem continua guardada); respondendo um aviso, silencia de onde ele veio. Quem está silenciado também não gera aviso do/watchno seu privado. O/unmutedesfaz. - Limpeza automática: a cada 10 minutos o bot remove do banco/disco as mensagens comuns com mais
de 68 h (janela máxima que o WhatsApp permite apagar), as apagadas, as editadas e as reações com
mais de 30 dias, as ocorrências do
/watchcom mais de 30 dias (settingwatch.hitsRetentionDays), os contadores do/statscom mais de 90 dias (settingstats.retentionDays), as enquetes com mais de 90 dias (settingenquete.retentionDays) e os avisos ignorados pelo/mutecom mais de 30 dias. - Monitor de contatos: o
/monitorconsulta até cinco pessoas, uma por vez, em ordem aleatória e com espera de 1 a 15 segundos entre consultas. O intervalo mínimo por pessoa é de cinco minutos por padrão (monitor.pool). Guarda até 30 horários distintos por pessoa (monitor.maxRecords) nas tabelasmonitor_contactsemonitor_history./monitore/monitor -lmostram o histórico observado;/monitor -l /Maria/filtra uma pessoa./monitor -add /Maria/ -alertaou/monitor -alerta /Maria/ativa avisos online no privado do dono do bot, uma vez por transição observada./monitor -rem alllimpa os cadastros e históricos locais./set monitor.enabled falsepausa as consultas sem apagar dados. Horários podem vir do cache e não são confirmados; não há garantia de registrar todos os acessos nem de evitar bloqueio da conta pelo WhatsApp. - Estatísticas: cada mensagem nova (e cada apagada/editada) soma 1 num contador por chat, dia,
hora e remetente (tabela
stats), usado pelo/stats. Só números, sem o texto; ficam 90 dias (settingstats.retentionDays). As respostas do bot, o seu privado e os status não entram. Desligue com/set stats.enable off. - Alertas de preço:
/cotacao -alerta USD > 5.30e/crypto -alerta BTC < 90000guardam a regra na tabelaprice_alerts; a cada 5 minutos (settingalerta.intervalMin) o bot consulta os preços e avisa no seu privado (ou, com um ou vários-to, em contatos, grupos, números ou por e-mail) quando a regra é cumprida; com o-msg, um texto seu vai no início do aviso. Veja Alertas de preço. - DeFi: o
/defilê on-chain as posições de liquidez da Orca, do Project X e da Liquidswap (pela carteira) cadastradas (tabeladefi_positions) e, com o-alerta, confere a cada 10 minutos (settingdefi.alerta.intervalMin) e avisa (no seu privado ou nos destinos do-to) quando uma posição sai da faixa, quando volta e, com o-taxas, quando as taxas a coletar passam de um valor. O/defi morphoe o/defi aavemostram a posição, os empréstimos e o risco de uma carteira no Morpho (pela API oficial) e no Aave V3 (nos contratos, on-chain). - Enquetes: os votos das enquetes da sua conta (evento
vote_update) vão para as tabelaspollsepoll_votes, e o/enquete -rmostra o placar. Ficam 90 dias (settingenquete.retentionDays). - Agenda: os lembretes e as mensagens do
/cron(também/agendae/lembrete) ficam na tabelaschedules; a cada 30 s o bot envia o que venceu (os repetidos seguem para o próximo horário). Um{/comando}no texto roda na hora do envio e a resposta entra no lugar. - Status diário: com
/bot -status 06h, um relatório das últimas 24 h (no ar, cache, watch, apagadas, editadas,/mute) chega todo dia no seu privado. - Backup: todo dia, às 3h (setting
backup.hour), o bot guarda uma cópia compactada do banco emcache/backups; o/backuptambém envia o backup diário ao destino debackup.to, quando preenchido. O comando lista, restaura e envia os arquivos (no seu privado, por e-mail ou, com um ou vários-to, noutros chats). - Watch: mensagens recebidas de outras contas, fora dos comandos reconhecidos, são testadas
contra as regras do
/watch(settingwatch.rules); quando casa, a ocorrência é gravada na tabelawatch_hitse você é avisado no seu privado (ou nos destinos do-toda regra: outros chats ou e-mails). Quem está silenciado no/mutenão gera o aviso no privado; a ocorrência é gravada do mesmo jeito. - Configurações (
settings): configurações gerais que podem mudar em tempo de execução (debug, moedas do/crypto, limites...) ficam na tabela genéricasettingsdo SQLite (key→valueem JSON) e são alteradas pelo/set. No boot os valores padrão são gravados, se ainda não existirem, e tudo é carregado em memória. Veja Settings. - Comandos: definidos em
src/comandos/comandos.json(nome, aliases, opções, ajuda, permissão) e implementados emsrc/comandos/(um arquivo por comando; veja Estrutura do código). Os que consultam a internet (/gpt,/tempo,/cve,/news...) usam os serviços da tabela Serviços externos. - Controle: o
/botmostra o status (o relatório de 24 h e os usuários), liga/desliga todos os comandos (-on/-off) e diz quem usa: você, os admins extras (+o/-o) e os usuários (+v/-v: pessoas e grupos, com os comandos de cada um limitados pelo+cmd/-cmd, se quiser); o-resetvolta ao padrão, o-status 06hmanda o relatório todo dia (no seu privado, noutros chats ou por e-mail) e o-infomostra as versões do que o bot usa. Quem não é admin tem uma proteção contra flood. O/whoisdiz o nível de cada um no chat. - Reconexão: em caso de queda o cliente é reiniciado sozinho, exceto quando o motivo exige ação
manual (
LOGOUT,CONFLICT,UNPAIRED...). Sem internet, ele tenta de novo, com espera crescente, até conectar (Queda da internet). - Saúde (heartbeat): a cada 30 s o bot confere se o WhatsApp Web responde e grava
/tmp/zapbot-heartbeat.json; oHEALTHCHECKdo Docker marca o container comounhealthyse o arquivo parar de ser atualizado. Veja Saúde do container. - Aviso de início: quando fica pronto, o bot manda
🤖 ZapBot <versão> (git+<commit>/<tag ou HEAD>) inicializado.para oPHONE_NUMBER(o commit é o do código que está rodando; veja o/version). - Alertas por e-mail: crash, queda, reconexão, falha de autenticação e outros eventos também vão
por e-mail, pelo mesmo SMTP do QR Code (veja Alertas por e-mail).
Ligado por padrão (setting
email.alerts).