WhatsApp Bot · 100% Open Source · PT / EN / ID
Assista o passo a passo da instalação: https://youtu.be/cIY0vtFt1LM
Precisa do Node 22.13+.
git clone https://github.com/Blackhzx/OpenBot
cd OpenBot
npm startNa primeira vez o npm start pergunta onde o bot vai rodar e instala tudo sozinho:
| opção | o que faz |
|---|---|
1) Termux |
pkg install ffmpeg git (se faltar) e npm install --no-bin-links |
2) VPS / hospedagem |
npm install e avisa se faltar o ffmpeg |
O Termux já vem sugerido quando detectado (é só dar Enter). Se as dependências já estiverem instaladas, ele pula essa parte.
npm startusa código de pareamento. Para QR code:npm run qr
Na primeira vez que liga, o bot pergunta no terminal:
- nome do dono
- número do dono (aceita
+55 (11) 99999-9999,11999999999e outros formatos) - apikey da Zone (opcional, Enter pula)
- número para parear com o bot
Fica tudo salvo no config.json. Para refazer: npm run setup.
Funciona no Termux, VPS e Pterodactyl (digite as respostas no console do painel). Se o host não tiver terminal, edite o config.json à mão e coloque "configurado": true.
Números sem + e com 10 ou 11 dígitos são tratados como brasileiros (o 55 é adicionado). Para outros países, digite com + (ex: +1 415 555 2671).
O npm start já ativa o termux-wake-lock, que impede o Android de pausar o bot. Desative também a otimização de bateria do Termux (Configurações > Apps > Termux > Bateria > Sem restrições), senão a conexão cai com código 408 quando a tela apaga.
A conexão fica salva em um único arquivo, database/sessao.db (SQLite com WAL), em vez de centenas de arquivos JSON. Abre mais rápido, grava as chaves em transação e não corrompe em queda de energia.
Para desconectar e parear de novo, apague database/sessao.db*.
| campo | descrição |
|---|---|
nome |
nome do bot |
nomeDono |
nome do dono (aparece nas figurinhas) |
prefixo |
prefixo dos comandos |
dono |
números do dono (só dígitos) |
idioma |
pt, en ou id |
botoes |
menu com botão (native flow) on/off |
pairCode |
código de pareamento personalizado (8 caracteres) ou vazio |
foto |
foto do menu |
zone.url / zone.apikey |
URL e chave da System Zone API |
configurado |
false faz o bot perguntar a configuração de novo |
| geral | admin | dono |
|---|---|---|
| menu | ban | idioma |
| s / f | promover | botoes |
| toimg / togif / tovideo | rebaixar | prefixo |
| removebg / rbg | ||
| sfundo | ||
| rename pack / autor | ||
| gpt / ia / chatgpt | ||
| play / playvideo | ||
| pinterest / pin | ||
| tiktok / ttk / tt | ||
| instagram / insta / ig | ||
| facebook / face / fb | ||
| kwai | ||
| twitter / tw / x | ||
| ping | marcar | setmenu |
| dono | grupo abrir/fechar | setfoto |
| ola | autofigu |
| comando | resultado |
|---|---|
!s / !sticker / !figurinha |
o WhatsApp estica a figurinha para 512x512 |
!f / !figu |
a figurinha fica no tamanho original |
!toimg |
figurinha vira imagem, ou GIF se for animada |
!togif / !tovideo |
figurinha animada vira GIF / vídeo |
!sfundo |
tira o fundo de uma figurinha estática (API) |
!autofigu (admin) |
toda imagem ou vídeo de até 20s vira figurinha |
O arquivo da figurinha nunca é deformado: o !s só avisa o WhatsApp para mostrar em 512x512. Por isso o !toimg devolve a imagem no formato original.
Responder uma figurinha com !s ou !f troca a descrição dela (roubar).
!rename pack / autor (ou !take) respondendo uma figurinha troca a descrição dela.
| comando | resultado |
|---|---|
!play nome ou link |
capa com título, canal, duração e tamanho, depois o áudio |
!playvideo nome ou link (!playvid) |
vídeo em 360p com título, duração e tamanho |
Precisa da apikey da Zone no config.json.
!gpt pergunta (ou !ia / !chatgpt). Cada pessoa tem a própria conversa em cada grupo, então ele lembra do que foi dito antes.
Para analisar uma imagem ou figurinha, mande a imagem com !gpt pergunta na legenda ou responda uma imagem ou figurinha com !gpt (figurinha animada: ele lê o primeiro quadro). A imagem sobe temporariamente no cdn.zone.api.br (apaga sozinha em 10 minutos).
!tiktok link (ou !ttk / !tt) baixa o vídeo com título, autor, curtidas, comentários, compartilhamentos e música na legenda. Post de fotos vem em álbum. Precisa da apikey da Zone.
| comando | rede |
|---|---|
!instagram link (!insta / !ig) |
|
!facebook link (!face / !fb) |
|
!kwai link |
Kwai |
!twitter link (!tw / !x) |
Twitter / X |
A mídia vem com autor, duração, curtidas, visualizações, comentários, compartilhamentos e legenda (o que a API mandar), e um botão para abrir o post. Carrossel: o resto vem em álbum. Precisa da apikey da Zone.
!pinterest termo | quantidade | tipo (ou !pin) manda as mídias em álbum.
!pin paisagem 6 resultados (padrão)
!pin paisagem | 10 10 resultados (máximo 50)
!pin paisagem | 4 | imagem só imagens
!pin paisagem | 4 | video só vídeos
Coloque a chave no config.json:
"zone": { "url": "https://zone.api.br", "cdn": "https://cdn.zone.api.br", "apikey": "SUA_KEY" }Uso dentro dos cases e plugins:
const zone = require('./lib/zone')
await zone.toMp4(buffer) // pronto
await zone.get('api/rota', { q: 'oi' }) // qualquer rota GET
await zone.post('api/rota', buffer) // qualquer rota com arquivo
await zone.sse('api/rota', { q: 'oi' }) // rota em stream (data: {...})
await zone.cdn(buffer, 10) // upload temporário, devolve o link
await zone.gpt('oi', 'sessao', urlImagem) // chatgptO !toimg de figurinha animada, o !removebg e o !sfundo usam a API. Figurinha normal converte local, sem API.
Cada menu é separado e usa os mesmos enfeites:
| comando | menu |
|---|---|
!menu |
menu principal |
!menuadm / !menuadmin / !menu adm |
menu de admin |
!menudono / !menuowner / !menu dono |
menu do dono |
{
"topo": "┌──「 *{bot}* 」\n│ {usuario}: {nome}\n│ {prefixoTxt}: {p}\n└────────────",
"secao": "┌──「 *{titulo}* 」",
"item": "│ › {p}{cmd}",
"fim": "└────────────",
"rodape": "_{bot} · open source_",
"menu": ["menuadm", "menudono", "ping", "dono", "ola"],
"menuadm": ["ban", "promover", "rebaixar", "marcar", "grupo abrir/fechar"],
"menudono": ["idioma pt/en/id", "botoes on/off", "prefixo", "setmenu", "setfoto"]
}Com !botoes on, o !menu mostra a foto e um botão só com os nomes dos menus (Comandos, Menu Admin, Menu Dono e os que você criar). Escolhendo um, o bot manda aquele menu em texto normal.
Qualquer lista nova no menu.json vira um menu com o próprio nome (ex: "menujogos": [...] cria o !menujogos).
Variáveis: {bot} {nome} {p} {grupo} {idioma} {titulo} {cmd}, e qualquer chave do lang/ (ex: {usuario}).
Também dá para editar pelo WhatsApp (dono):
!setmenu mostra a ajuda
!setmenu item │ ✦ {p}{cmd} muda o enfeite dos itens
!setmenu topo ╔══ {bot} ══╗ muda o cabeçalho
!setmenu menujogos dado, quiz cria/edita um menu
!setmenu menujogos apaga o menu
!setfoto responda uma imagem para trocar a foto do menu
As edições valem na hora, sem reiniciar.
Crie um arquivo em plugins/ e adicione o comando no menu.json:
module.exports = {
cmd: ['oi', 'hi'],
tag: 'admin', // permissão: admin | dono (opcional)
run: async ({ god, m, from, reply, args, q, isAdm, isDono }) => {
reply('oi!')
}
}Botões em plugins (native flow single_select):
run: ({ lista, p }) => lista({
texto: 'Escolha:',
foto: fs.readFileSync('./media/openBot.jpg'), // opcional
secoes: [{ title: 'Opções', rows: [{ title: 'Ping', id: p + 'ping' }] }]
})O cliente pode ser chamado como god, conn, sock, Socket ou systemZR.
Adicione um .json em lang/ e ele já aparece no !idioma.
Feito com @systemzero/baileys · Licença MIT

