企业微信机器人怎么发图片和文件?先上传后发送的流程
发文本一条接口就够,发媒体就多了一层:图片、视频、文件、语音都要先上传拿凭证,再把凭证填进消息内容。这篇按"上传、填凭证、发送"的链路把媒体消息讲清楚,重点说说 8MB 分界线和几个容易翻车的凭证填法。
背景痛点
发图片消息最常见的翻车是两种:一种是把本地路径或外网图片链接直接塞进 content,接口返回失败;另一种是凭证拿到了但字段名填错,消息发出去对方收到的却是一段文本。媒体消息的凭证规则比文本消息严格得多,值得单独讲一遍。
原理
媒体消息之所以要两步走,是因为文件先被加密存到 CDN,消息里只传凭证:id 是文件标识,aesKey 是解密密钥,md5 和 size 用于完整性校验。发送时把凭证填进 content,接收方凭同一组凭证取回文件。
上传接口按媒体类型分开:图片用 uploadImage,视频用 uploadVideo(连封面一起传),文件和语音共用 uploadFile,语音必须是 silk 格式。单次请求体最大 8MB,按 base64 编码后计算。
核心实现
图片消息的完整链路(示例代码,需按官方文档校验):
import base64, requests
def send_image(appid, conversation_id, image_path):
# 示例代码,需按官方文档校验
b64 = base64.b64encode(open(image_path, "rb").read()).decode()
up = requests.post(f"{BASE_URL}/wx-api/api/cdn/uploadImage",
headers={"Authorization": f"Bearer {CREDENTIAL}"},
json={"appid": appid, "fileB64": b64},
timeout=30).json()
assert up["code"] == 0, up["message"]
return requests.post(f"{BASE_URL}/wx-api/api/message/sendImage",
headers={"Authorization": f"Bearer {CREDENTIAL}"},
json={"appid": appid, "conversationId": conversation_id,
"content": up["data"]}, # 上传返回的 data 原样填
timeout=10).json()
各类型发送时凭证怎么填,差异都在 content 上:图片和视频是上传返回的 data 原样填;文件要把上传返回的 fileId、fileMd5、fileSize 改名为 id、md5、size,再补文件名 name;语音同样改名后再填语音秒数 voiceTime。
超过 8MB 的大文件走另一条异步链路:uploadBigFile 传的是文件的公网 URL,调用后立即返回 requestId 和上传状态,上传完成后凭证通过推送下发,再用发送大文件接口发出。
踩坑
一、朋友圈的图片和视频必须走上传大文件。用普通上传接口拿到的凭证发朋友圈,接口照样返回成功,但内容会被当成纯文本发出去——这是媒体链路里最隐蔽的一个坑。
二、上传小文件时返回的字段名是 fileId 系,发送时要改成 id 系,两套名字长得很像。别用同一个 JSON 两边复用,改名的动作放在封装函数里固定下来。
三、下载和上传是对称的:收到的媒体消息带着 fileId、fileType、aesKey,调下载接口取回解密后的文件。fileType 要按消息类型对号入座,填错会下载失败;下载建议放进队列,同一条消息只下一次。
四、视频的封面就是上传返回里的 thumbUrl 字段,不用单独上传封面图,省一步。
总结
媒体消息的要点可以压缩成一句:按类型选上传接口、按类型填凭证字段、超过 8MB 换异步大文件链路。这篇的接口细节以Eyun 开发文档的 CDN 文件模块为准,动代码前先把上传接口页的请求示例跑一遍,比看十篇教程都管用。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)