news 2026/6/22 15:47:26

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
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,并替换内容字段。

// 以图片消息为例 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自定义开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 13:29:09

SQL语句执行很慢,如何分析呢?

一条SQL执行很慢,我们通常会使用MySQL的EXPLAIN命令来分析这条SQL的执行情况。通过key和key_len可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。通过type字段可以查看SQL是否有优化空间,比如是否存在全索引扫…

作者头像 李华
网站建设 2026/6/22 5:39:50

iOS In-App Purchase 自动续订订阅完整实现指南

前言 自动续订订阅(Auto-Renewable Subscriptions)是 iOS 应用最常见的变现模式之一,适用于流媒体服务、云存储、会员权益等场景。相比一次性购买,订阅模式能够为开发者提供稳定的现金流,同时也为用户提供持续更新的服务体验。 本文将从零开始,全面讲解自动续订订阅的实…

作者头像 李华
网站建设 2026/6/15 4:27:28

【专题01】Linux系统面试题(50题)

一、文件系统(10题) 1. Linux目录结构中,/etc、/var、/proc、/sys分别存放什么? /etc - 系统配置文件 /var - 可变数据文件(日志、缓存、邮件等) /proc - 虚拟文件系统,存放进程和内核信息 /sys - 虚拟文件系统,存放设备和驱动信息 2. 软链接和硬链接的区别? 硬…

作者头像 李华
网站建设 2026/6/21 12:45:55

AI在缺陷预测中的潜力:赋能软件测试的智能新纪元

在当今快速迭代的软件开发环境中,缺陷预测的准确性与效率直接关系到产品交付质量与团队成本控制。传统的缺陷预测方法多依赖于专家经验与静态代码指标,存在响应迟缓、误报率高等局限性。人工智能技术通过从海量项目数据中学习复杂模式,为缺陷…

作者头像 李华
网站建设 2026/6/22 12:50:21

数据驱动测试:从缺陷探测到质量预见

测试数据的隐性价值 在敏捷开发与DevOps普及的当下,软件测试已从单纯的缺陷探测转向质量风险评估与预防。现代测试过程中产生的海量数据——包括用例执行记录、缺陷分布矩阵、性能基线对比、环境配置信息等——构成了评估产品质量态势的宝贵资产。据统计&#xff0…

作者头像 李华
网站建设 2026/6/19 18:33:53

告别“消失的小目标”:航拍图像检测新框架,精度飙升25.7%的秘诀

在人工智能迅猛发展的今天,目标检测作为机器视觉的核心任务,已经在自动驾驶、安防监控、工业质检等领域发挥着关键作用。然而,当我们把目光投向广阔的天空,面对航拍图像中密密麻麻的小目标时,传统检测方法却显得力不从…

作者头像 李华