QiWe开放平台 · 个人名片
API驱动企微 外部群 自动化,让开发更高效
对接通道:进入官方站点联系客服
团队定位:企微生态深度服务,专注 API+RPA 融合技术方案
在 Go 中对接 qiweapi,建议先根据文档字段定义好标准的结构体(Struct),这样可以利用 json 标签实现完美的序列化。
1. 结构体定义
根据文档中 SendTextMsg 接口的要求,我们需要定义请求载体:
Go
type SendTextMsgRequest struct {
WID string `json:"w_id"` // 机器人唯一标识
RoomID string `json:"room_id"` // 外部群ID
Content string `json:"content"` // 消息内容
AtList []string `json:"at_list"` // @成员列表,无则传空数组
}
type CommonResponse struct {
Code int `json:"code"` // 状态码
Message string `json:"message"` // 返回信息
Data interface{} `json:"data"`
}
2. 主动发送函数的实现
Go 的 net/http 是处理此类请求的标准方式。注意设置 Content-Type 为 application/json。
Go
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
func SendGroupMessage(baseURL string, token string, payload SendTextMsgRequest) (*CommonResponse, error) {
// 1. 拼接接口路径
apiUrl := fmt.Sprintf("%s/api/SendTextMsg", baseURL)
// 2. 序列化数据
jsonData, err := json.Marshal(payload)
if err != nil {
return nil, err
}
// 3. 创建请求
req, err := http.NewRequest("POST", apiUrl, bytes.NewBuffer(jsonData))
if err != nil {
return nil, err
}
// 4. 设置文档要求的 Header
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+token)
// 5. 执行请求
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// 6. 解析返回结果
var result CommonResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return nil, err
}
return &result, nil
}
3. 在 Go 中处理外部群能力的优势
-
并发安全 :当你有多个
w_id(机器人账号)需要同时向不同的room_id发送消息时,可以使用Goroutine配合channel轻松实现高并发推送。 -
严谨性 :Go 的强制类型要求你必须显式处理
at_list这种数组字段,避免了动态语言中常见的null导致的接口报错。
4. 调用示例
Go
func main() {
config := struct {
BaseURL string
Token string
}{
BaseURL: "http://your-server-ip:port",
Token: "your_access_token",
}
// 严格匹配文档字段的传参
msg := SendTextMsgRequest{
WID: "wxid_123456",
RoomID: "230948203@chatroom",
Content: "Go 语言自动化指令测试:你好,外部群!",
AtList: []string{}, // 即使为空也需初始化
}
res, err := SendGroupMessage(config.BaseURL, config.Token, msg)
if err != nil {
fmt.Printf("请求异常: %v\n", err)
return
}
if res.Code == 200 {
fmt.Println("消息下发成功")
} else {
fmt.Printf("下发失败: %s\n", res.Message)
}
}
5. 进阶:如何处理文档中的二进制发送?
如果你需要调用 SendImageMsg 或 SendFileMsg,文档通常要求提供文件的 URL 或 Base64 字符串。在 Go 中,你可以方便地使用 os 库读取文件并使用 base64 包进行转换,再填入对应的字段即可。
总结
Go 语言的高性能特性非常适合作为企业微信 RPA 接口的中控网关 。通过结构化字段映射,可以确保业务逻辑与 doc.qiweapi.com 文档保持高度一致,降低维护成本。