encrypt_stream / decrypt_stream), /2/chat/media/upload 경로(사이드바 API 참조 → 미디어)로 업로드한 다음, encrypt_message에 **media_hash_key**를 첨부합니다.
업로드 시 DM 스코프와 함께 **media.write**를 포함하세요. 경로에는 하이픈으로 연결된 대화 ID를 사용하세요(: → -). MIME/치수는 복호화된 바이트에서 가져오는 것이 좋습니다.
이 경로는 Posts 미디어 모델(expansions=attachments.media_keys, media.fields=variants 등)이 아닙니다. 이러한 매개변수는 Posts에 적용됩니다; E2EE X Chat blob은 **media_hash_key**와 X Chat 미디어 다운로드로 지정됩니다.
암호화
- Python
- TypeScript
- Rust
- Go
- C#
- Java
encrypt_stream / decrypt_stream은 전체 페이로드를 메모리에서 처리합니다. 큰 파일의 경우 stream_encryptor() / stream_decryptor()가 증분 객체(StreamEncryptor / StreamDecryptor)를 반환합니다: push로 청크를 공급한 다음 finish를 한 번 호출하세요—finish는 스트림이 잘렸으면 오류를 냅니다.
업로드
API 참조 → 미디어 아래의 OpenAPI 페이지에 있는 요청 본문을 사용하세요. 크기가 필요한 곳에는 암호화된 blob 크기를 사용하는 것이 좋습니다. 완료는 첨부 및 다운로드용 **
media_hash_key**를 반환합니다. 일시적인 5xx는 백오프로 재시도하세요. Python/TypeScript는 미디어 헬퍼가 존재할 때 XDK를 사용할 수 있습니다; 그렇지 않으면 어떤 언어에서든 Bearer 토큰과 함께 POST하세요.
첨부 파일과 함께 전송
미디어 첨부와 함께 암호화한 다음, 메시지 전송 본문을 POST합니다(시작하기와 동일한 필드 매핑).- Python
- TypeScript
- Rust
- Go
- C#
- Java
다운로드 및 복호화
경로:GET /2/chat/media/{conversation_id}/{media_hash_key}. 응답 본문은 암호문입니다. 수신 메시지에서는 복호화된 첨부 파일 / media_hashes에서 media_hash_key를 읽습니다.
이벤트의 키 버전으로 키를 선택하세요. 각 복호화된 메시지 이벤트에는 콘텐츠가 암호화된 keyVersion(JS; 다른 바인딩은 key_version)이 포함됩니다. 최신이 아닌 해당 버전의 대화 키—conversationKeys.keys[event.keyVersion]—로 첨부 파일을 복호화하세요. 키 교체 이후(예: 멤버 추가)에는 최신 키가 오래된 메시지에 첨부된 미디어를 복호화할 수 없습니다.
- Python
- TypeScript
- Python
- TypeScript
- Rust
- Go
- C#
- Java
팁
- 미디어가 암호화된 시점과 동일한 대화 키 버전을 사용하세요
- 평문 미디어나 원시 키를 로그에 남기지 마세요
- MIME은 복호화 후에 감지하세요
- 웹 클라이언트: 가능하면 클라이언트에서 암호화/복호화; OAuth 토큰은 서버에 유지하세요