Go 进阶:发送文件/图片消息的流程与实现

发送非文本类消息,如图片 (msgtype: image) 或文件 (msgtype: file),不能直接将文件数据包含在 POST 请求体中。企业微信要求开发者首先将素材上传到服务器,获取一个临时的唯一标识符:media_id ,然后再将此 media_id 用于构建最终的消息体。

1. 两步走的核心流程

  1. 上传素材: 调用 /cgi-bin/media/upload 接口,将本地文件以 multipart/form-data 的形式上传到企业微信服务器。服务器返回一个临时的 media_id

  2. 发送消息: 调用 /cgi-bin/appchat/send 接口,在请求体中用获取到的 media_id 替换掉原有的文本内容。

2. 第一步:Go 实现素材上传

素材上传需要使用 multipart/form-data 格式,这是 Go 语言中一个相对复杂的网络操作,需要用到 mime/multipart 包。

2.1 上传 API 接口
  • 请求方式: POST

  • 请求 URL: https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

    • TYPE:素材类型,如 imagefilevoice 等。
2.2 Go 上传实现思路
  1. 创建 Pipeline: 使用 bytes.Buffer 配合 mime/multipart.Writer 来构造 multipart/form-data 的请求体。

  2. 写入文件字段:

    • 使用 writer.CreateFormFile(fieldname, filename) 创建一个文件字段,并返回一个 io.Writer

    • 将本地文件的内容通过 io.Copy() 写入到这个 io.Writer 中。

  3. 设置 Content-Type: 关键在于,HTTP 请求头中的 Content-Type 必须设置为 multipart/form-data,并且其边界(Boundary)值必须与 multipart.Writer 自动生成的边界值保持一致。

  4. 执行 POST 请求: 发送包含文件内容的 HTTP POST 请求。

  5. 解析响应: 接收响应 JSON,解析到对应的 Struct 中,获取 media_id

2.3 核心返回 Struct
Go 复制代码
type UploadResponse struct {
    ErrCode int    `json:"errcode"`
    ErrMsg  string `json:"errmsg"`
    Type    string `json:"type"`
    MediaID string `json:"media_id"` // 核心字段
}

3. 第二步:Go 实现消息发送

获取 media_id 后,发送消息就回归到 帖子 17 中的 JSON 构造和 POST 流程。

3.1 消息 Struct 定义

只需要将 msgtype 设置为 imagefile,并替换内容字段。

Go 复制代码
// 以图片消息为例
type ImageContent struct {
    MediaID string `json:"media_id"` // 使用上传获取到的 ID
}

type SendImageMessageRequest struct {
    ChatID  string       `json:"chatid"`
    MsgType string       `json:"msgtype"` // "image"
    Image   ImageContent `json:"image"`
}
3.2 发送流程
  1. 实例化 SendImageMessageRequest,将上一步获得的 media_id 填入。

  2. 使用 json.Marshal 序列化为 JSON 字节流。

  3. 构造 POST 请求,发送到 /cgi-bin/appchat/send 接口。

4. 关键注意事项

  • 素材有效期: 上传的临时素材 media_id 仅在三天内有效,且只能被用于一次消息发送。因此,每次发送非文本消息前,几乎都需要执行一次上传操作。

  • 文件大小限制: 不同类型的素材有严格的大小限制(例如,图片最大 2\\text{MB},文件最大 20\\text{MB})。超限会导致上传失败。

  • 权限: 确保应用具有发送文件/图片消息的权限。


QiWe开放平台提供了后台直登功能,登录成功后获取相关参数,快速Apifox在线测试,所有登录功能都是基于QiWe平台API自定义开发。

相关推荐
魔力女仆2 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915533 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋3 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
颜酱4 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
Larcher4 小时前
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo
javascript·后端
FellAveal5 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
Larcher5 小时前
从状态快照到惰性初始化:读懂 React useState 的三个关键场景
javascript·人工智能·后端
lazy H5 小时前
Git clone 怎么用?克隆项目及常见问题完整教程
大数据·git·后端·学习·搜索引擎·github
wang09075 小时前
自己动手写一个spring之aop_1
java·后端·spring
神奇小汤圆5 小时前
IDEA 运行报 Command line is too long?别慌,两招搞定(附原理)
后端