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 scopes de DM al subir. Usa ids de conversación con guión en las rutas (: → -). Prefiere el MIME/dimensiones desde los bytes descifrados.
Este camino no es el modelo de multimedia de Posts (expansions=attachments.media_keys, media.fields=variants, etc.). Esos parámetros aplican a Posts; los blobs E2EE de X Chat se direccionan por media_hash_key y por la descarga de multimedia de X Chat.
Cifrar
- Python
- TypeScript
- Rust
- Go
- C#
- Java
encrypt_stream / decrypt_stream procesan la carga completa en memoria. Para archivos grandes, stream_encryptor() / stream_decryptor() devuelven objetos incrementales (StreamEncryptor / StreamDecryptor): aliméntalos por fragmentos con push y luego llama a finish una vez—finish arroja error si el stream se truncó.
Subir
Usa los cuerpos de solicitud en las páginas de OpenAPI bajo API reference → Media. Prefiere el tamaño del blob cifrado donde se requiera el tamaño. Finalizar produce
media_hash_key para adjuntos y descarga. Reintenta 5xx transitorios con backoff. Python/TypeScript pueden usar el XDK cuando existan helpers de multimedia; en caso contrario, haz POST con un Bearer token en cualquier lenguaje.
Enviar con un adjunto
Cifra con un adjunto de multimedia y luego haz POST del cuerpo send-message (mismo mapeo de campos que en 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, así nunca se acuña un id dos veces.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
set_cache_keys(true) habilitado, encrypt_message resuelve la clave y la versión a partir del cambio de clave verificado más reciente 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 desde los adjuntos descifrados / media_hashes.
Elige la clave según la versión de clave del evento. Cada evento de mensaje descifrado lleva el keyVersion (JS; key_version en los demás bindings) bajo el cual 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. Tras una rotación de clave (por ejemplo, al agregar un miembro), la clave más reciente no puede descifrar los medios adjuntos a mensajes anteriores.
- Python
- TypeScript
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Consejos
- Usa la misma versión de la clave de conversación con la que se cifró el multimedia
- No registres en logs 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; conserva los tokens OAuth en tu servidor