Bot de WhatsApp escrito em TypeScript utilizando Baileys, com arquitetura modular e persistência local em SQLite.
O projeto é desenvolvido principalmente no Termux (Android), mas pode ser executado em qualquer ambiente compatível com Node.js.
- Arquitetura baseada em eventos
- Sistema modular de comandos
- Persistência de autenticação utilizando SQLite
- Conversão e manipulação de mídia (
!s,!toimg,!tovideo,!tovideo2via Pillow — fallback para WebP corrompido) - Comandos de administração de grupos (
!ban,!promover,!rebaixar,!abrir,!fechar) - Logger centralizado com
pinoe métricas de conversão - Compatível com Termux (Android ARM64)
- Escrito em TypeScript utilizando ES Modules
- Node.js 24+
- TypeScript 6.x
- Baileys 7.x RC (7.0.0-rc14)
- better-sqlite3 + SQLite
- ffmpeg + webpmux + Pillow via
python3(conversão de mídia; Pillow isolado em!tovideo2) - pino (logs estruturados)
- Biome 2.5 (lint + format)
Variáveis de ambiente:
| Variável | Descrição | Exemplo |
|---|---|---|
WHATSAPP_PHONE_NUMBER |
Número para pareamento via código | 5511999999999 |
LOG_LEVEL |
Nível do logger pino |
info (padrão) |
FORCE_RESET |
Se true, limpa data/auth ao iniciar |
false |
Exemplo:
export WHATSAPP_PHONE_NUMBER="5511999999999"
npm start| Comando | Descrição |
|---|---|
!ping |
Responde Pong |
!menu [admin | ai | dono] |
Mostra o menu geral ou de uma seção |
!boton / !botoff |
Ativa/desativa o bot no grupo (persiste em SQLite) |
| Comando | Descrição | Uso |
|---|---|---|
!s / !sticker |
Imagem/vídeo → sticker | Responda ou marque mídia |
!toimg |
Sticker → imagem PNG | Responda um sticker |
!tovideo |
Sticker animado → vídeo MP4 | Responda um sticker animado |
!tovideo2 |
Sticker animado → vídeo MP4 (Pillow fallback) | Responda um sticker animado (quando !tovideo falha) |
Vídeos para sticker devem ter no máximo 10s.
| Comando | Aliases | Descrição | Uso |
|---|---|---|---|
!ban |
!banir, !kick |
Remove do grupo | !ban @usuario ou responda |
!promote |
!promover, !up |
Promove a admin | !promote @usuario |
!demote |
!rebaixar, !down |
Rebaixa admin | !demote @usuario |
!abrir |
!open |
Abre o grupo (todos falam) | !abrir |
!fechar |
!close |
Fecha o grupo (só admin fala) | !fechar |
Todos os comandos de admin verificam
LID/s.whatsapp.nete exigem que o bot também seja admin.
Instale as dependências:
npm installCompile o projeto:
npm run buildnpm startPareamento: na primeira execução, se WHATSAPP_PHONE_NUMBER estiver definido, o código de 8 dígitos será exibido no terminal (Vá em Aparelhos Conectados > Conectar com número).
.
├── biome.json # Config Biome (formatter/linter)
├── tsconfig.json
└── src/
├── auth/ # Persistência SQLite (Baileys creds)
├── commands/ # Controller + DB de grupos ativos
├── events/ # Dispatcher e logger
├── messages/ # Parser, tipos e reações
├── utils/ # jid, logger, admin, sticker, metadataWebp
└── index.ts # Entrypoint + pareamento
Logger centralizado em src/utils/logger.ts com pino (saída em stdout JSON):
module: command→command_event(comando, jid, sender, runtime)module: db→db_event(READ_GROUP, SET_GROUP_ACTIVE)module: webp→webp_conversion_event(start, inspection, frames_extracted, concat_written, encode_start/done, success/failure com tamanhos e duração)module: sticker→sticker_event(image/video_start/success)module: command+admin_event→ban/promote/demote/open/close
Para salvar em arquivo durante debug, redirecione a saída (arquivo é ignorado no git):
npm start 2>&1 | tee bot.log
# depois filtre:
grep 'module.*webp' bot.log
grep 'admin_event' bot.logNote
bot.log e *.log estão no .gitignore — é só artefato local de debug.
| Script | Descrição |
|---|---|
npm run build |
Compila o projeto |
npm start |
Executa o bot |
npm run dev |
Executa em modo watch |
npm run typecheck |
Verifica os tipos sem gerar arquivos |
npm run clean |
Remove o diretório dist |
npm test |
Placeholder para futuros testes |
npx biome check ./src |
Checa formatação + lint (Biome) |
npx biome check --write ./src |
Formata e organiza imports |
O projeto é desenvolvido e testado utilizando:
- Termux
- Node.js 24.x
- TypeScript 6.x
- Baileys 7.x RC (7.0.0-rc14, 0 vulnerabilities)
- Biome 2.5
Este projeto utiliza better-sqlite3, que possui código nativo compilado durante a instalação.
Important
Antes de executar npm install no Termux, defina a seguinte variável de ambiente:
export GYP_DEFINES="android_ndk_path=''"Essa configuração evita que o node-gyp tente localizar um Android NDK e faz com que a compilação utilize o toolchain fornecido pelo próprio Termux.
Instalação completa:
export GYP_DEFINES="android_ndk_path=''"
npm install
npm run buildTip
Caso a instalação falhe, remova as dependências e tente novamente.
rm -rf node_modules package-lock.json
export GYP_DEFINES="android_ndk_path=''"
npm installCaution
Atualizações do Node.js podem exigir a recompilação das dependências nativas.
ISC