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.043 分钟前
【java入门到放弃】Dubbo
java·开发语言·dubbo
pe7er3 小时前
window管理开发环境篇 - 持续更新
前端·后端
JAVA面经实录9177 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
陈随易7 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
周杰伦fans8 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
陈随易9 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
Bat U10 小时前
JavaEE|多线程初阶(七)
java·开发语言
大鱼七成饱10 小时前
VMware NAT模式下固定内网IP(附详细图文)
后端
谭欣辰10 小时前
C++ 排列组合完整指南
开发语言·c++·算法