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自定义开发。

相关推荐
OpenAnolis小助手4 分钟前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界6 分钟前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
ForteScarlet24 分钟前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖27 分钟前
Java深入解析篇六十二之安全机制详解
java·开发语言
码士集团小青1 小时前
从对标 Java 到对标 Go:Native AOT 的“无痛化“之路,走到哪一站了?
golang
IT_陈寒1 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端
菜鸟~noob2331 小时前
【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】
开发语言·matlab
右耳朵猫AI1 小时前
Go周刊2026W36 | Go 1.27.1 发布、TinyGo 0.42、HTTP/2 原生迁入 net/http、quic-go 0.62
redis·http·golang
奇牙coding1231 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
小兵金林2 小时前
AI 生成代码的思考与实践
后端·ai编程