Pular para o conteúdo principal

Documentation Index

Fetch the complete documentation index at: https://whiskeysockets-docs-jids-socket-config-ptbr.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Toda conexão Baileys começa chamando makeWASocket com um objeto SocketConfig. A maioria das opções tem valores padrão sensatos definidos em DEFAULT_CONNECTION_CONFIG.

Opções obrigatórias

auth

O único campo verdadeiramente obrigatório. Você deve passar um objeto AuthenticationState.
import makeWASocket, { useMultiFileAuthState, makeCacheableSignalKeyStore } from '@whiskeysockets/baileys'
import P from 'pino'

const { state, saveCreds } = await useMultiFileAuthState('baileys_auth_info')

const sock = makeWASocket({
  auth: {
    creds: state.creds,
    keys: makeCacheableSignalKeyStore(state.keys, logger),
  },
})

sock.ev.on('creds.update', saveCreds)
Quando uma mensagem é enviada ou recebida, sessões do Signal são atualizadas e authState.keys.set() é chamado. Se você não persistir essas atualizações imediatamente, mensagens vão falhar ao decifrar.

Identidade e navegador

browser

Controla como o Baileys se identifica para o WhatsApp. Use a constante Browsers em vez de escrever a tupla manualmente — é também o nome que aparece em Aparelhos conectados.
import makeWASocket, { Browsers } from '@whiskeysockets/baileys'

const sock = makeWASocket({
  auth: state,
  browser: Browsers.macOS('Chrome'),

  // Outras opções:
  // browser: Browsers.ubuntu('My App')
  // browser: Browsers.windows('Firefox')
  // browser: Browsers.appropriate('Safari')
})
PresetExemplo
Browsers.ubuntu('My App')Ubuntu — My App
Browsers.macOS('Desktop')macOS — Desktop
Browsers.windows('My App')Windows — My App
O navegador escolhido também afeta quanto histórico o WhatsApp envia na primeira sincronização. Identidades desktop recebem significativamente mais histórico que mobile.

Receber histórico completo de mensagens

Por padrão, o Baileys conecta com um perfil Chrome, o que limita quanto histórico o WhatsApp entrega. Para histórico completo, defina syncFullHistory: true e use Browsers.macOS('Desktop').
import makeWASocket, { Browsers } from '@whiskeysockets/baileys'

const sock = makeWASocket({
  auth: state,
  browser: Browsers.macOS('Desktop'),
  syncFullHistory: true,
})
As mensagens de histórico chegam de forma assíncrona pelo evento messaging-history.set. Veja Sincronizar histórico de conversa.
Pedir histórico completo aumenta significativamente o tempo de inicialização e o uso de memória.

logger

Aceita qualquer logger compatível com pino. Passe level: 'debug' para ver cada frame binário.
import P from 'pino'

const logger = P({ level: 'silent' })
const devLogger = P({ level: 'debug' })

Comportamento da conexão

markOnlineOnConnect

Padrão: true. Quando true, o Baileys se marca como online ao conectar. Defina false se quiser que o celular continue recebendo notificações.

syncFullHistory

Padrão: true. Pede ao celular para entregar o histórico completo. Se você só precisa de mensagens recentes, defina false.

printQRInTerminal

Esta opção está obsoleta. Use o evento connection.update para ler o campo qr e renderize você mesmo.

Confiabilidade de mensagens

getMessage

Callback que recebe um WAMessageKey e retorna a proto.IMessage. Necessário para reentregas e decifrar votos de enquete.
const messageStore = new Map<string, proto.IMessage>()

const sock = makeWASocket({
  auth: state,
  getMessage: async (key) => {
    const id = `${key.remoteJid}:${key.id}`
    return messageStore.get(id)
  },
})

sock.ev.on('messages.upsert', ({ messages }) => {
  for (const msg of messages) {
    if (msg.key.id && msg.message) {
      const id = `${msg.key.remoteJid}:${msg.key.id}`
      messageStore.set(id, msg.message)
    }
  }
})

msgRetryCounterCache

Cache que conta quantas vezes o Baileys tentou reenviar.
import NodeCache from '@cacheable/node-cache'
import { CacheStore } from '@whiskeysockets/baileys'

const msgRetryCounterCache = new NodeCache() as CacheStore

const sock = makeWASocket({
  auth: state,
  msgRetryCounterCache,
})

maxMsgRetryCount

Padrão: 5.

Performance em grupos

cachedGroupMetadata

import NodeCache from '@cacheable/node-cache'

const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })

const sock = makeWASocket({
  auth: state,
  cachedGroupMetadata: async (jid) => groupCache.get(jid),
})

sock.ev.on('groups.update', async ([event]) => {
  const metadata = await sock.groupMetadata(event.id)
  groupCache.set(event.id, metadata)
})

sock.ev.on('group-participants.update', async (event) => {
  const metadata = await sock.groupMetadata(event.id)
  groupCache.set(event.id, metadata)
})

Filtragem de eventos

shouldIgnoreJid

import { isJidBroadcast, isJidNewsletter } from '@whiskeysockets/baileys'

const sock = makeWASocket({
  auth: state,
  shouldIgnoreJid: (jid) => isJidBroadcast(jid) || isJidNewsletter(jid),
})

Timeouts e keep-alive

OpçãoPadrãoDescrição
connectTimeoutMs20_000Falha a conexão se o WebSocket não abrir dentro deste período.
defaultQueryTimeoutMs60_000Tempo máximo para esperar uma resposta de query IQ.
keepAliveIntervalMs30_000Intervalo entre frames ping do WebSocket.
retryRequestDelayMs250Delay entre requisições sucessivas de reentrega.

generateHighQualityLinkPreview

Padrão: false. Quando true, o Baileys faz upload da miniatura para os servidores de mídia. Requer link-preview-js.
const sock = makeWASocket({
  auth: state,
  generateHighQualityLinkPreview: true,
})

Exemplo pronto para produção

import makeWASocket, {
  Browsers,
  CacheStore,
  makeCacheableSignalKeyStore,
  useMultiFileAuthState,
  isJidBroadcast,
  fetchLatestBaileysVersion,
  proto,
} from '@whiskeysockets/baileys'
import NodeCache from '@cacheable/node-cache'
import P from 'pino'

const logger = P({ level: 'silent' })

const msgRetryCounterCache = new NodeCache() as CacheStore
const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })
const messageStore = new Map<string, proto.IMessage>()

async function startSock() {
  const { state, saveCreds } = await useMultiFileAuthState('baileys_auth_info')
  const { version } = await fetchLatestBaileysVersion()

  const sock = makeWASocket({
    version,
    logger,
    auth: {
      creds: state.creds,
      keys: makeCacheableSignalKeyStore(state.keys, logger),
    },
    browser: Browsers.macOS('Chrome'),
    markOnlineOnConnect: false,
    syncFullHistory: false,
    generateHighQualityLinkPreview: true,
    msgRetryCounterCache,
    maxMsgRetryCount: 5,
    connectTimeoutMs: 20_000,
    defaultQueryTimeoutMs: 60_000,
    keepAliveIntervalMs: 30_000,
    shouldIgnoreJid: (jid) => isJidBroadcast(jid),
    getMessage: async (key) => {
      const id = `${key.remoteJid}:${key.id}`
      return messageStore.get(id)
    },
    cachedGroupMetadata: async (jid) => groupCache.get(jid),
  })

  sock.ev.on('creds.update', saveCreds)

  sock.ev.on('messages.upsert', ({ messages }) => {
    for (const msg of messages) {
      if (msg.key.id && msg.message) {
        messageStore.set(`${msg.key.remoteJid}:${msg.key.id}`, msg.message)
      }
    }
  })

  sock.ev.on('groups.update', async ([event]) => {
    groupCache.set(event.id, await sock.groupMetadata(event.id))
  })

  sock.ev.on('group-participants.update', async (event) => {
    groupCache.set(event.id, await sock.groupMetadata(event.id))
  })

  return sock
}