WaWeb canonical pipeline
Do socket à mensagem
Como o WhatsApp Web sai do nada e chega a mandar e receber uma mensagem: abre um canal seguro, pede autorização ao celular principal, autentica a sessão, baixa o estado da conta e troca mensagens.
Glossário
Termos técnicos do protocolo explicados em linguagem direta.
Glossário dos termos do mapa
Tradução curta dos nomes mais técnicos que aparecem no fluxo. Os termos ficam no idioma do protocolo para facilitar o diff com os logs, mas a explicação mostra o papel de cada um.
- WebSocket
- Canal que fica aberto entre cliente e servidor, permitindo troca de dados nos dois sentidos sem abrir uma conexão nova a cada mensagem.
- HTTP 101
- Resposta do servidor que aceita trocar o HTTP comum por WebSocket. É o sim oficial para abrir o canal persistente.
- frame
- Pacote bruto que viaja pelo WebSocket. Antes de virar uma stanza legível, tudo aparece como frames binários.
- Noise
- Protocolo que cria o canal seguro. Depois do handshake Noise, o tráfego passa cifrado entre cliente e servidor.
- client_hello
- Primeira mensagem do handshake Noise. O cliente envia uma chave temporária para começar a negociação segura.
- server_hello
- Resposta do servidor no handshake Noise. Ela devolve dados temporários para o cliente continuar a negociação.
- client_finish
- Mensagem final do handshake Noise. O cliente fecha a negociação e deixa o canal pronto para tráfego cifrado.
- stanza
- Mensagem estruturada do protocolo, parecida com uma árvore: tem tag, atributos, conteúdo e filhos.
- WAP
- Formato binário usado pelo WhatsApp para transformar stanzas em bytes compactos antes de enviar pelo socket.
- iq
- Tipo de stanza usado para pedidos que esperam resposta, como consultar dados, configurar estado ou registrar algo.
- PairCode
- Código curto digitado no celular para autorizar o novo aparelho sem usar QR code.
- pair-device
- Pedido inicial do servidor para começar o pareamento. Ele carrega referências usadas pelo celular e pelo cliente.
- companion
- Nome do protocolo para o aparelho secundário, ou seja, o cliente que será vinculado ao celular principal.
- ref
- Identificador temporário do pareamento. Ele amarra a tentativa do companion com o celular principal.
- primary hello
- Mensagem do celular principal para o companion durante o pareamento. Ela confirma o pedido e envia chaves.
- ack
- Confirmação curta de recebimento. Diz que uma stanza chegou, sem carregar uma resposta de negócio.
- pair-success
- Stanza que marca o pareamento como concluído. Depois dela, o companion já pode operar como autorizado.
- stream:error
- Erro de stream usado aqui como fechamento controlado. O servidor encerra o canal antigo para forçar reconexão.
- success
- Confirmação de login depois da reconexão. A partir dela, a sessão foi aceita e pode sincronizar dados.
- lid
- Identificador interno da conta no modelo multi-device. Em muitos pontos ele substitui o telefone.
- props
- Conjunto de configurações e flags que o servidor entrega para ajustar o comportamento da sessão.
- edge_routing
- Informação de rota que ajuda o cliente a escolher por onde trafegar com os servidores do WhatsApp.
- dirty
- Sinal de que algum conjunto de dados precisa ser limpo, confirmado ou sincronizado de novo.
- Signal
- Protocolo de criptografia ponta a ponta. Ele protege o conteúdo para que só remetente e destino leiam.
- skey
- Bloco de chave assinada usado no material de criptografia do dispositivo. O relatório mostra só a presença, nunca o valor.
- usync
- Consulta de sincronização de usuários. Serve para descobrir dispositivos, identidades, status e chaves.
- offline
- Lote de mensagens e eventos que chegaram enquanto o cliente estava fora e precisam ser entregues ao reconectar.
- histórico pendente
- Nome didático para mensagens e eventos que ficaram acumulados enquanto o Web não estava conectado. A captura mostra a estrutura desses pacotes, mas não publica o conteúdo cifrado.
- app-state
- Estado local do aplicativo: perfil, foto, dispositivos, identidade, listas, privacidade e outros dados que precisam ficar iguais entre celular, Web e servidor.
- unified_session
- Marcador de sessão enviado durante o bootstrap para alinhar estado entre a sessão Web e o servidor.
- device-identity
- Bloco assinado que prova quais dispositivos pertencem a uma conta e ajuda a validar o envio cifrado.
- receipt
- Recibo de estado da mensagem. Pode indicar entrega, recebimento, leitura ou outro avanço do fluxo.
- fanout
- Envio da mesma mensagem para vários dispositivos do destinatário, cada um com seu envelope cifrado.
- phash
- Hash estrutural que aparece em confirmação de envio. Ajuda a correlacionar o ack sem expor o conteúdo da mensagem.
- my_addons
- Consulta de recursos adicionais da conta. No fluxo, aparece como checagem auxiliar antes de concluir o fanout.
- enc
- Filho da stanza que carrega o conteúdo cifrado pelo Signal. O texto real só aparece depois de decifrar.
- pipeline
- Linha do tempo completa da captura. Inclui eventos de transporte, frames, handshake, stanzas e fechamento.
- seq
- Número sequencial de um evento no pipeline. Ele permite dizer exatamente o que veio antes e depois.
- sent
- Direção cliente para servidor. No mapa aparece como C → S.
- recv
- Direção servidor para cliente. No mapa aparece como S → C.
- attrs
- Atributos de uma stanza, como nomes de campos. O relatório publica nomes, não valores sensíveis.
- children
- Filhos de uma stanza. Eles formam a árvore interna, por exemplo
messagecontendoenc.
- payload
- Conteúdo carregado por um frame ou stanza. Pode ser bytes cifrados, árvore WAP ou dados redigidos.
- opcode
- Tipo técnico do frame WebSocket. Aqui o importante é saber quando ele carrega bytes binários.
- ping
- Checagem curta de conexão. Nos frames capturados pelo recorder, não apareceu ping nativo do WebSocket; tratamos o
sent iqvazio comxmlns=w:pcomo ping de aplicação.
- keepalive
- Função de manter a conexão viva. Nos frames capturados, o keepalive visível é interpretado como ping de aplicação do WhatsApp, não como opcode WebSocket de ping/pong.
- batimento de aplicação
- Forma didática de falar dos pares curtos e repetidos de
iqvistos na janela passiva. Como o envio usaxmlns=w:p, o relatório também chama isso de ping de aplicação.
- redigido
- Valor ocultado de propósito. A estrutura fica visível, mas telefone, token, chave, JID e payload bruto ficam fora.
- captura canônica
- Execução do WhatsApp Web oficial observada em detalhe. Ela vira a referência para comparar o cliente C#.
- baseline
- Registro de referência usado no diff. Se o C# divergir dele, a diferença aponta onde investigar.
- fresh
- Execução começando sem sessão salva. Por isso inclui pareamento novo, autenticação e primeiro bootstrap.
- observe
- Execução de observação passiva. Ela usa uma sessão já pareada, não envia mensagem e fica olhando o que o WhatsApp Web faz sozinho depois do ready, quando o cliente oficial declara que está pronto.
- contrato
- Forma esperada do evento: ordem, tag, attrs, filhos, direção e contagens. Valores variáveis não entram no contrato.
- JSONL
- Arquivo de dados com um JSON por linha. Foi usado como insumo local, mas não é publicado neste HTML.
- cliente oficial
- O WhatsApp Web real rodando no navegador. Ele é a fonte de verdade do projeto.
- cliente C#
- A implementação WaWeb que deve reproduzir a mesma estrutura do fluxo observado no cliente oficial.
- celular principal
- Aparelho dono da conta WhatsApp Business. Ele autoriza o PairCode e mantém a identidade principal.
- celular auxiliar
- Aparelho usado no teste para enviar a mensagem que aparece como recebida no fim da captura.