客服机器人收到客户发来的图片、合同文件、语音,如果不归档,纠纷来了就拿不出凭证;做智能客服的,这些多媒体也是训练语料的来源。

这篇讲消息资源的下载归档设计,重点是视频下载的异步模式和转存策略。方案基于 Eyun 个人微信 API 的资源下载接口落地,代码需按文档校验。

归档链路

Webhook 收到消息 → 判断消息类型 → 同步下载(图片/文件/语音)
                              → 异步下载(视频:提交+轮询)
        → 转存对象存储(OSS) → 消息表更新 resource_url

设计原则:平台侧的下载通道只当搬运工具,归档的最终归宿必须是自己对象存储里的副本。

同步与异步两类接口

资源类型

接口

模式

图片

getMsgImg

同步

文件

getMsgFile

同步

语音

getMsgVoice

同步

动图表情

getMsgEmoji

同步

视频

asynGetMsgVideo + getMsgVideoRes

异步,提交后轮询

图片、文件、语音一个请求拿结果;视频要两步:先提交下载任务,再用查询接口轮询结果。另外平台还有一组 CDN 接口(cdnDownFile),处理的是 CDN 协议的资源,场景不同别混用。

视频归档的 Go 实现

// 示例代码,需按官方文档校验
func archiveVideo(baseURL, token, wId string, msgID string) (string, error) {
    // 第一步:提交异步下载任务
    submit(body, wId, map[string]string{"wId": wId, "msgId": msgID}, "/asynGetMsgVideo")
    if resp.Code != "1000" { return "", fmt.Errorf("submit: %s", resp.Message) }

    // 第二步:轮询下载结果,注意 int64 大整数消息ID要用专门字段承接
    for i := 0; i < 12; i++ {
        time.Sleep(5 * time.Second)
        res := postJSON(baseURL+token, "/getMsgVideoRes", body)
        if res.Code == "1000" && res.Data.Status == "done" {
            return downloadAndSave(res.Data.URL) // 拿到地址立即转存OSS
        }
    }
    return "", errors.New("video archive timeout")
}

消息 ID 这类字段在 Go 里要定义成 int64 或字符串承接,不要用 interface{} 接 JSON——大整数精度问题在归档场景同样存在,归档对不上消息 ID,凭证链就断了。

踩坑一:视频下载忘记轮询

和发朋友圈的视频一样,下载视频也是异步任务。我们早期版本提交完任务就当下载完成,归档表里全是空资源链接。两个异步接口(发圈视频、收消息视频)都栽过跟头,后来统一了规范:接口文档里出现「异步」「查询结果」字样的,必须实现轮询加超时告警。

踩坑二:把平台下载地址直接存库当长期链接

有一版实现图省事,把下载接口返回的资源地址直接写进消息表。后来做历史工单回溯,部分老消息的资源已经取不回来。规范改成:拿到资源立即转存自己的对象存储,库里只存自有副本地址。多一步搬运,换来的是归档数据的自主可控。

权衡:收到即归档还是按需归档

维度

收到即归档

按需下载

存储成本

全量存储,持续增长

只存高频回看的

完整性

有纠纷随时可查

时过境迁可能取不到

实现复杂度

一条队列

需要回溯查询逻辑

客服留痕场景没有悬念,收到即归档。存储成本用生命周期规则控制:归档资源 90 天后转低频存储,一年后归档冷存,成本能压到忽略不计。只有明确不需要留痕的场景才考虑按需下载。

收尾

归档这条链路里,同步异步的区分和「立即转存」两条纪律最重要。双11 前客服量上来,正好把归档补齐——纠纷凭证、复盘语料,都是那时候用得上的东西。资源下载和 CDN 接口的参数细节见Eyun 文档站的媒体与文件分类,联调时拿自己账号给机器人发一张图一个文件各走一遍。你做的消息归档是什么策略,评论区聊聊。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐