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).- Python
- TypeScript
- Rust
- Go
- C#
- Java
Descargar y descifrar
Ruta:GET /2/chat/media/{conversation_id}/{media_hash_key}. El cuerpo de la respuesta es texto cifrado. En los mensajes entrantes, lee media_hash_key desde los adjuntos descifrados / media_hashes.
Elige la clave por la versión de clave del evento. Cada evento de mensaje descifrado lleva la keyVersion (JS; key_version en los demás bindings) con la 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 al agregar un miembro), la clave más reciente 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 que cuando se cifró la multimedia
- No registres 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 de OAuth en tu servidor