encrypt_stream / decrypt_stream), sube mediante las rutas /2/chat/media/upload (barra lateral API reference → Media) y luego adjunta media_hash_key en encrypt_message.
Incluye media.write con tus alcances de DM al subir. Usa IDs de conversación con guiones en las rutas (: → -). Prefiere el MIME/dimensiones a partir de los bytes descifrados.
Esta ruta no es el modelo de multimedia de Posts (expansions=attachments.media_keys, media.fields=variants, etc.). Esos parámetros aplican a Posts; los blobs de X Chat E2EE se direccionan por media_hash_key y la descarga de multimedia de X Chat.
Cifrar
- Python
- TypeScript
- Rust
- Go
- C#
- Java
encrypt_stream / decrypt_stream procesan todo el payload en memoria. Para archivos grandes, stream_encryptor() / stream_decryptor() devuelven objetos incrementales (StreamEncryptor / StreamDecryptor): alimenta trozos con push, luego llama a finish una vez—finish falla si el stream se truncó.
Subir
Usa los cuerpos de solicitud en las páginas OpenAPI bajo API reference → Media. Prefiere el tamaño del blob cifrado donde se requiera el tamaño. Finalize entrega
media_hash_key para los adjuntos y la descarga. Reintenta los 5xx transitorios con backoff. Python/TypeScript pueden usar el XDK cuando existan helpers de multimedia; de lo contrario, haz POST con un token Bearer en cualquier lenguaje.
Enviar con un adjunto
Cifra con un adjunto multimedia, luego haz POST del cuerpo send-message (mismo mapeo de campos que Primeros pasos). El SDK genera elmessage_id y lo devuelve en el payload—envía ese valor, y reutiliza el mismo payload en los reintentos para que nunca se genere un ID dos veces.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
set_cache_keys(true) habilitado, encrypt_message resuelve la clave y la versión desde el último cambio de clave verificado de la conversación (consulta Primeros pasos).
Descargar y descifrar
Ruta:GET /2/chat/media/{conversation_id}/{media_hash_key}. El cuerpo de la respuesta es texto cifrado. En mensajes entrantes, lee media_hash_key de los adjuntos descifrados / media_hashes.
Elige la clave por la versión de clave del evento. Cada evento de mensaje descifrado lleva el keyVersion (JS; key_version en los otros bindings) con el que se cifró su contenido. Descifra un adjunto con la clave de conversación de esa versión—conversationKeys.keys[event.keyVersion]—no la más reciente. Después de una rotación de clave (por ejemplo la incorporación de un miembro), la última clave no puede descifrar multimedia adjunta a mensajes anteriores.
- Python
- TypeScript
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Consejos
- Usa la misma versión de clave de conversación con la que se cifró el contenido multimedia
- No registres en logs contenido multimedia en texto plano ni claves en bruto
- Detecta el MIME después de descifrar
- Clientes web: cifra/descifra en el cliente cuando sea posible; mantén los tokens OAuth en tu servidor