QiWe开放平台 · 个人名片
API驱动企微 外部群 自动化,让开发更高效
对接通道:进入官方站点联系客服
团队定位:企微生态深度服务,专注 API+RPA 融合技术方案
在自动化业务中,仅发送文本往往不够。如何通过 Go 语言高效地向外部群发送图片、视频或 PDF 文件?本文将深入解析 qiweapi 协议中的多媒体参数结构,分享如何利用 Go 的结构体嵌套实现多种消息类型的统一封装。
1. 结构体设计:支持多种消息类型
为了兼容文本、图片、文件等多种格式,我们可以利用 Go 的 omitempty 标签来定义一个通用的请求模型。
Go
// CommonMessage 定义通用消息参数结构
type CommonMessage struct {
ChatID string `json:"chatId"` // 目标外部群
MsgType int `json:"msgType"` // 1:文本, 2:图片, 5:文件, 6:视频
Content string `json:"content,omitempty"` // 文本内容
Image string `json:"image,omitempty"` // 图片URL或Base64
File string `json:"file,omitempty"` // 文件URL
Video string `json:"video,omitempty"` // 视频URL
}
2. 构建发送参数示例
在 Go 中,我们通过初始化不同的字段来匹配 msgType。
A. 发送外部群图片
Go
// 构造图片参数
imgMsg := CommonMessage{
ChatID: "external_chat_id_001",
MsgType: 2,
Image: "https://your-oss-path.com/invoice.jpg",
}
B. 发送外部群文件 (PDF/Word)
Go
// 构造文件参数
fileMsg := CommonMessage{
ChatID: "external_chat_id_001",
MsgType: 5,
File: "https://your-oss-path.com/contract.pdf",
}
3. 高效参数转换与提交
利用 json.Marshal 转换后,直接通过 http.Post 提交。
Go
func PostMessage(msg CommonMessage) {
payload, _ := json.Marshal(msg)
// 这里的 url 对应 doc.qiweapi.com 中的具体接口路径
resp, err := http.Post(apiURL, "application/json", bytes.NewBuffer(payload))
if err != nil {
log.Printf("请求失败: %v", err)
return
}
defer resp.Body.Close()
// 处理返回码...
}
4. 技术关键点解析
-
omitempty 的妙用: 在 Go 结构体中使用
omitempty标签,可以确保在发送文本消息时,image或file字段不会出现在生成的 JSON 中,从而严格符合协议文档对参数纯净度的要求。 -
编码转换: 如果发送的是 Base64 图片,确保字符串不包含 Data URI 前缀(如
data:image/png;base64,),除非文档明确要求。 -
流式上传建议: 对于较大的文件,虽然协议支持 URL 发送,但建议先通过 Go 的
io.Copy预检文件服务器的可访问性,确保企微服务端能顺利拉取到附件。
