多媒体处理不是"能发能收"就结束了。按处理深度分三层,每一层解决的问题不同,开发难度和业务价值也逐层递进。
一、传输层——解决"发得出去、收得进来"
最浅层是传输:发送侧调 sendImage、sendFile、视频接口把素材发出去;接收侧通过 Webhook 回调感知多媒体消息,回调里带消息类型和素材引用。
这一层的关键认知:回调给的是素材引用(临时地址或标识),不是文件本体。要拿内容必须再调下载接口。发送侧则要注意素材格式和大小限制,返回码 1000 才是真发成功。
二、存储层——解决"素材留得住、找得到"
下载下来的素材要落库存储:文件存对象存储或本地目录,元数据(发送人、时间、消息 ID、文件类型、存储路径)存数据库。
存储层做好了,素材从"看完就过期的聊天附件"变成可检索的资产。消息 ID 和素材路径的对应关系要记牢,后续按人、按群、按时间查素材全靠它。还要注意临时地址有时效,收到回调后要尽快下载。
三、识别层——解决"内容用得上"
最深的一层是内容处理:图片 OCR 提取文字、图片内容审核(涉政涉黄检测)、文件内容解析(PDF 报表提数据、Excel 导入系统)、视频抽帧或转码、语音转文字。
识别层才是多媒体真正产生业务价值的地方。比如客户发来合同照片 → OCR 提取关键条款 → 存进 CRM;群里发来 Excel 订单 → 解析后直接入库。
三层处理对照
处理层 | 解决什么 | 关键技术点 |
|---|---|---|
传输层 | 发送和接收素材 | 发送接口、回调类型、素材引用下载 |
存储层 | 素材持久化和检索 | 文件存储 + 元数据落库、时效处理 |
识别层 | 内容提取和利用 | OCR、内容解析、转码、语音识别 |
接收图片完整处理链路
@app.post("/webhook") def webhook(): d = request.json if d.get("messageType") == 3: # 图片消息 job_q.put({ "msg_id": d["msgId"], "ref": d["content"], # 素材临时引用 "from": d["fromUser"], "time": d["createTime"] }) return {"code": "1000"} def media_worker(): # 异步:下载→存储→识别 while True: job = job_q.get() raw = download_media(job["ref"]) # 传输层:下载 path = save_to_oss(raw, job["msg_id"]) # 存储层:落库 db.save_media(job["msg_id"], job["from"], path) text = ocr(path) # 识别层:OCR db.save_text(job["msg_id"], text)落地建议
多媒体接口和素材下载说明见 Eyun 开发文档。按层推进:先跑通传输层(发一张图、收一张图),再做存储层(素材落库不丢失),最后接识别层(OCR、解析按需选)。回调 5 秒超时,所以下载和识别全部丢异步队列,回调里只收不处理。大文件和视频还涉及分片和超时,文档里有说明,平台见 Eyun 官网。