encrypt_stream / decrypt_stream), envie via rotas /2/chat/media/upload (barra lateral Referência da API → Mídia) e depois anexe media_hash_key em encrypt_message.
Inclua media.write entre seus escopos de DM ao fazer upload. Use IDs de conversa com hífen nos paths (: → -). Prefira MIME/dimensões dos bytes descriptografados.
Este caminho não é o modelo de mídia de Posts (expansions=attachments.media_keys, media.fields=variants, etc.). Esses parâmetros se aplicam a Posts; blobs E2EE do X Chat são endereçados por media_hash_key e o download de mídia do X Chat.
Criptografar
- Python
- TypeScript
- Rust
- Go
- C#
- Java
encrypt_stream / decrypt_stream processam o payload inteiro em memória. Para arquivos grandes, stream_encryptor() / stream_decryptor() retornam objetos incrementais (StreamEncryptor / StreamDecryptor): alimente chunks com push e depois chame finish uma vez — finish retorna erro se o stream foi truncado.
Upload
Use os corpos de requisição nas páginas OpenAPI em Referência da API → Mídia. Prefira o tamanho do blob criptografado onde o tamanho é requerido. A finalização retorna
media_hash_key para anexos e download. Repita 5xx transitórios com backoff. Python/TypeScript podem usar o XDK quando existirem helpers de mídia; caso contrário, faça POST com um token Bearer em qualquer linguagem.
Enviar com um anexo
Criptografe com um anexo de mídia e depois faça POST do corpo de envio de mensagem (mesmo mapeamento de campos do Guia de introdução).- Python
- TypeScript
- Rust
- Go
- C#
- Java
Baixar e descriptografar
Path:GET /2/chat/media/{conversation_id}/{media_hash_key}. O corpo da resposta é texto cifrado. Em mensagens de entrada, leia media_hash_key dos anexos descriptografados / media_hashes.
Escolha a chave pela versão de chave do evento. Cada evento de mensagem descriptografado carrega o keyVersion (JS; key_version nos outros bindings) sob o qual seu conteúdo foi criptografado. Descriptografe um anexo com a chave de conversa para essa versão — conversationKeys.keys[event.keyVersion] — e não com a mais recente. Após uma rotação de chave (por exemplo, uma adição de membro), a chave mais recente não consegue descriptografar mídia anexada a mensagens mais antigas.
- Python
- TypeScript
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Dicas
- Use a mesma versão da chave de conversa que foi usada quando a mídia foi criptografada
- Não registre mídia em texto simples nem chaves em bruto
- Detecte MIME após descriptografar
- Clientes web: criptografe/descriptografe no cliente quando possível; mantenha tokens OAuth no seu servidor