当前位置: 首页 > news >正文

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

http://www.cnnetsun.cn/news/69491.html

相关文章:

  • 最近在搞风光储联合发电系统的仿真,发现直驱风机和光伏逆变器的配合特别有意思。今天就跟大伙儿唠唠这个模型搭建时遇到的坑,顺便分享几个关键模块的调参心得
  • 【保姆级教程】手把手带你读懂AI落地架构图!AI产品经理必备,每个节点都给你讲透!
  • 最小化门控记忆网络在风速条件分位数预测中的实践与应用
  • 先给大伙儿拆解下五层电梯PLC程序的实现逻辑。这玩意儿核心是状态转移和信号竞争,咱们直接上硬核部分。(文末附IO表与接线说明)
  • 「码同学」2025VIP性能测试课程
  • 零基础转行AI产品经理:大模型学习路线与面试题库全攻略
  • iOS 组件化:模块拆分、依赖反转、解耦实践
  • 不容错过!2026中东【沙特】工程机械展览会,震撼来袭
  • 测试数据生成的AI解决方案
  • PyWebview浅谈
  • HUB扩展:数字世界的隐形枢纽与生态重构者
  • 基于能量分配的光伏混合储能系统仿真模型:MPPT控制光伏最大功率跟踪,电池与超级电容协同工作实...
  • 【WebSocket稳定性提升秘诀】:如何在生产环境中规避7类典型错误
  • 为什么你的协程系统响应迟缓?优先级调度设计缺陷可能是罪魁祸首
  • 构造函数返回对象时的陷阱:为什么 `return {}` 会覆盖 new 操作符的默认行为
  • 宏任务与微任务的边界:为什么在不同浏览器环境下 Promise 的执行时序可能不一致
  • 智能工牌如何帮房企智能盘客,提升销售转化?
  • LP3713CH_5W/SOP7隔离适配器和充电器自供电PSR控制芯片 典型应用电路
  • FT8393MB1(5V/2.4A)12W线式电源控制芯片 典型应用电路
  • [吾爱大神原创工具] Python脚本打包为“EXE”工具(史上最高颜值)
  • 当电机遇上滑移:四轮驱动车能耗与稳定性的双线作战
  • AI视频工具普及,为何内容团队工时反增20%?
  • SQL多表查询实战:7种JOIN详解
  • 变量传递总是出错?掌握这3个核心原理,轻松打通R与Python壁垒
  • jmeter基础使用方法
  • 直接打开MATLAB,先来点刺激的——搞个巴特沃斯低通滤波器。别被名字吓到,其实就是个能让低频信号通过,高频滚犊子的电路模型。看这段
  • 大模型应用开发核心:构建高效准确的提示词指南
  • OpenAI发布GPT-5.2:是王者归来还是强弩之末?
  • HTTPS DDoS 排查 异常流量到抓包分析
  • 12、Docker与Kubernetes使用指南