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

相关推荐
GetcharZp21 小时前
告别 Selenium!这款 Go 语言神器,让网页自动化与爬虫快到飞起!
后端
天下无贼21 小时前
【Python】2026版——FastAPI 框架快速搭建后端服务
后端·python·aigc
橙序员小站21 小时前
当所有人都在做 Agent,我想聊聊被遗忘的基础设施
后端·开源·aigc
小蚂蚁i21 小时前
LangChain 完全学习手册:看完就能上手
后端·python·ai编程
Memory_荒年21 小时前
TiDB:当 MySQL 遇上分布式,生了个“超级混血儿”
java·数据库·后端
asom2221 小时前
DDD(领域驱动设计) 核心概念详解
java·开发语言·数据库·spring boot
一步一个脚印一个坑21 小时前
用 APM 全链路追踪,29ms 内定位到 Docker 部署的 SSL 配置错误
javascript·后端·监控
oem11021 小时前
C++中的访问者模式变体
开发语言·c++·算法
aircrushin21 小时前
端到端AI决策架构如何重塑实时协作体验?
前端·javascript·后端
苦瓜小生21 小时前
【黑马点评学习笔记 | 实战篇 】| 6-Redis消息队列
redis·笔记·后端