Pular para o conteúdo principal

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.
1

Instale os pacotes

npm install zapo-js @zapo-js/store-sqlite better-sqlite3 pino pino-pretty
2

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
)
3

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.
4

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')
})
5

Conecte

await client.connect()
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.
Last modified on May 27, 2026