Desvendando Baileys — Funções JID e como usá-las em seu código
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.
s.whatsapp.net
— usuários de WhatsApp. Seu número, seu amigo, etc.g.us
— grupos de WhatsApp.broadcast
— Lista de transmissões salvas no seu celular.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, @lid
para 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!