Documentation Index Fetch the complete documentation index at: https://zapo.to/llms.txt
Use this file to discover all available pages before exploring further.
Este guia constrói um bot mínimo de “ping → pong”. Ele se conecta, imprime um QR code para parear e responde pong sempre que recebe ping.
Instale os pacotes
npm install zapo-js @zapo-js/store-sqlite better-sqlite3 pino pino-pretty
Crie a store e o client
A store persiste o estado de auth e do Signal. Aqui usamos SQLite, gravando em .auth/state.sqlite. import { createPinoLogger , createStore , WaClient } from 'zapo-js'
import { createSqliteStore } from '@zapo-js/store-sqlite'
const logger = await createPinoLogger ({ level: 'info' , pretty: true })
const store = createStore ({
backends: {
sqlite: createSqliteStore ({ path: '.auth/state.sqlite' , driver: 'auto' })
},
providers: {
auth: 'sqlite' ,
signal: 'sqlite' ,
senderKey: 'sqlite' ,
appState: 'sqlite' ,
messages: 'sqlite' ,
threads: 'sqlite' ,
contacts: 'sqlite' ,
privacyToken: 'sqlite'
}
})
const client = new WaClient (
{
store ,
sessionId: 'default' ,
connectTimeoutMs: 15_000 ,
nodeQueryTimeoutMs: 30_000 ,
history: { enabled: true , requireFullSync: true }
},
logger
)
Trate o pareamento
Em uma sessão nova, o client emite auth_qr. Renderize o valor como um QR code (por exemplo, com o pacote qrcode-terminal ) e escaneie a partir de WhatsApp → Aparelhos conectados . client . on ( 'auth_qr' , ({ qr , ttlMs }) => {
console . log ( 'Scan this QR within' , ttlMs , 'ms:' )
console . log ( qr )
})
client . on ( 'auth_paired' , ({ credentials }) => {
console . log ( 'Paired as' , credentials . meJid )
})
Prefere um código de pareamento de 8 dígitos em vez de um QR? Veja Autenticação .
Responda mensagens recebidas
Escute o evento message e envie uma resposta com client.message.send. function extractText ( message ) {
return (
message ?. conversation ??
message ?. extendedTextMessage ?. text ??
undefined
)
}
client . on ( 'message' , async ( event ) => {
const text = extractText ( event . message )
if ( text ?. trim (). toLowerCase () !== 'ping' ) return
const to = event . chatJid ?? event . senderJid
if ( ! to ) return
await client . message . send ( to , 'pong' )
})
Conecte
O connect() resolve assim que o socket está aberto. A primeira conexão conduz o pareamento; conexões subsequentes reutilizam as credenciais armazenadas.
Exemplo completo
import { createPinoLogger , createStore , WaClient } from 'zapo-js'
import { createSqliteStore } from '@zapo-js/store-sqlite'
const logger = await createPinoLogger ({ level: 'info' , pretty: true })
const store = createStore ({
backends: {
sqlite: createSqliteStore ({ path: '.auth/state.sqlite' , driver: 'auto' })
},
providers: {
auth: 'sqlite' ,
signal: 'sqlite' ,
senderKey: 'sqlite' ,
appState: 'sqlite' ,
messages: 'sqlite' ,
threads: 'sqlite' ,
contacts: 'sqlite' ,
privacyToken: 'sqlite'
}
})
const client = new WaClient ({ store , sessionId: 'default' }, logger )
client . on ( 'auth_qr' , ({ qr }) => console . log ( qr ))
client . on ( 'connection' , ( event ) => console . log ( 'connection:' , event . status , event . reason ))
client . on ( 'message' , async ( event ) => {
const text =
event . message ?. conversation ?? event . message ?. extendedTextMessage ?. text
if ( text ?. trim (). toLowerCase () !== 'ping' ) return
const to = event . chatJid ?? event . senderJid
if ( to ) await client . message . send ( to , 'pong' )
})
await client . connect ()
Próximos passos
Enviando mensagens Respostas, menções, prévias de link e a union de conteúdo completa.
Recebendo mensagens Faça o parse dos eventos recebidos, envie recibos e descriptografe addons.
Reconexão O zapo não reconecta automaticamente — aqui está o padrão para lidar com isso.
Configuração Sessões, sincronização de histórico, timeouts, proxy e muito mais.