Desvendando Baileys — Funções JID e como usá-las em seu código

Flávio Coutinho
4 min readOct 23, 2024

--

Funções utilitárias do Baileys para JIDs

Estou inaugurando este blog com uma postagem sobre as funções JIDs, da biblioteca Nodejs chamada Baileys.

Explicarei o que é JID, sua composição e falarei das funções mais abaixo.

O que é JID — Jabber ID?

Um JID (Jabber ID) é um identificador utilizado no protocolo XMPP, que é utilizado pelo WhatsApp para comunicação. Cada JID é composto por diferentes partes que ajudam a identificar quem é o destinatário/remetente da mensagem.

Os JIDs podem ser de usuários, grupos, transmissões, broadcast e outros elementos.

Qual a composição de um JID?

São compostos por usuário, dispositivo (opcional) e servidor. Exemplo de JID em TypeScript

const jid_user: string = "12345:2@s.whatsapp.net";
const jid_grupo: string = "12345@g.us";
const jid_broadcast: string = "status@broadcast";

Usuário: A parte identificadora do usuário, grupo, transmissão, etc. Por exemplo, no JID 12345:2@s.whatsapp.net, o número 12345 representa o usuário.

Dispositivo (opcional): número que identifica o dispositivo utilizado, usado quando você conecta o mesmo WhatsApp em vários locais (WhatsApp Web por exemplo). Se houver, o número da conexão com o dispositivo aparece após o símbolo de dois pontos (:), no caso do JID 12345:2@s.whatsapp.net seria a conexão número 2.

Observação: se você desconectar o dispositivo 2 e conectar novamente, ele receberá o número 3. Se repetir o processo, o mesmo dispositivo receberá número 4, assim sucessivamente. Ao ultrapassar o número 99, ele reinicia a contagem para o número 1.

Servidor: A parte do JID que define o “domínio” onde o usuário está registrado. No WhatsApp, isso pode ser s.whatsapp.net, g.us, broadcast, lid, entre outros. Nesta postagem vamos falar somente dos domínios relacionados a usuários e grupos.

  1. s.whatsapp.net— usuários de WhatsApp. Seu número, seu amigo, etc.
  2. g.us— grupos de WhatsApp.
  3. broadcast — Lista de transmissões salvas no seu celular.
  4. lid — servidor tipo “lid”. Ainda não achei a utilidade, mas sempre que você se conecta ao WhatsApp Web é gerado um “lid” para seu número.

Porque Existem JIDs “Codificados” e “Descodificados”?

No contexto da Baileys, existem dois formatos de JID:

JID codificado: É a string única, como 12345@s.whatsapp.net, podendo conter o número da conexão do dispositivo ou não.

const jid_user: string = "12345:2@s.whatsapp.net";

JID decodificado: É um objeto que separa as partes da string JID, como user, server e device (se houver). Isso facilita a manipulação e análise detalhada dessas partes no código.

const jid_decodificado: FullJid = {
user: '12345',
server: 's.whatsapp.net',
domainType: 0, // retorna 1 caso domínio seja @lid ou 0 nos demais casos
device: 2
}

// Obs: código dos tipo FullJid abaixo:
export type JidWithDevice = {
user: string;
device?: number;
};
export type FullJid = JidWithDevice & {
server: JidServer;
domainType?: number;
};

Funções Disponíveis na Baileys

A Baileys traz funções para tratar JIDs, objetivo do artigo. Você importa a função dessa forma:

import { isJidUser, jidNormalizedUser } from "baileys";

jidEncode

Cria um JID de string única, tendo como entrada “usuário”, “servidor”, “dispositivo” (opcional) e “agente” (opcional). Se for criar um JID de usuário com o dispositivo valor 2 e o agente valor 1, o resultado seria a string '12345_1:2@s.whatsapp.net'.

Observação: ainda não entendo a figura do “agente” ou sua utilidade.

jidDecode

Decodifica a string JID e retorna um objeto com as partes constituintes (user, server, etc.)

Se entrada for '12345_1:2@s.whatsapp.net' , a saída será um objeto:

const obj_jid: FullJid = {
user: '12345',
server: 's.whatsapp.net',
domainType: 0, // retorna 1 caso domínio seja @lid ou 0 nos demais casos
device: 2
}

Observação: Quando o domínio do JID é @lid, o domainType é definido como 1. Qualquer outro caso, será 0. A função retorna undefined para indicar que o JID não pôde ser decodificado (portanto, o JID é inválido).

areJidsSameUser

Compara os dois JIDs decodificando-os e verifica se os usuários (parte user) são os mesmos. A vantagem é que podem estar em vários formatos, por exemplo:

const jid1: string = '12345_1:2@s.whatsapp.net'; // agente + device
const jid2: string = '12345@s.whatsapp.net'; // Jid básico
areJidsSameUser(jid, jid2); //retorna True

No código acima, o valor será true. Caso algum dos JIDs fornecidos for inválido, a função retornará false, porque a função utiliza jidDecode, que retorna undefined para JIDs inválidos.

isJidUser, isLidUser, isJidBroadcast, isJidGroup

Verifica se o JID informado pertence ao domínio que você está testando, ou seja, se termina com @s.whatsapp.net para usuários, @lidpara lid, @broadcast para lista de transmissão, @g.us para grupos.

Nenhuma outra verificação é feita, nem se o jid é válido, etc…

isJidStatusBroadcast

Esta testa apenas se o JID é exatamente status@broadcast para status de WhatsApp. Qualquer outra string de entrada retornará false.

jidNormalizedUser

Troca o domínio do usuário. Se for um JID com domínio c.us, ele converte para o formato padrão de usuário (s.whatsapp.net). Usa a função jidDecode. Retorna uma string vazia se não fornecer um JID válido.

Exemplo: jidNormalizedUser('12345@c.us') retornaria 12345@s.whatsapp.net.

Observação: até o momento, não me deparei com o uso do domínio c.us nenhuma vez…

Conclusão

Creio que as funções relevantes são jidEncode, jidDecode e areJidsSameUser! As demais não são interessantes no momento.

Chego ao fim do artigo! Qualquer erros ou atualizações podem me contactar! Obrigado!

--

--