ai_scheduler/internal/biz/handle/qywx/group.go

110 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package qywx
import (
"ai_scheduler/internal/data/impl"
"ai_scheduler/internal/pkg/l_request"
"ai_scheduler/internal/pkg/util"
"context"
"encoding/json"
"fmt"
"net/http"
)
type Group struct {
groupImpl *impl.BotGroupQywxImpl
auth *Auth
}
func NewGroup(groupImpl *impl.BotGroupQywxImpl, auth *Auth) *Group {
return &Group{
groupImpl: groupImpl,
auth: auth,
}
}
// Create 方法用于创建群聊
// 参数:
// - ctx: context.Context上下文用于控制请求的超时和取消
// - req: GroupCreateReq创建群聊的请求参数结构体
// - corpid: string企业的CorpID
// - corpsecret: string应用的Secret
//
// 返回值:
// - GroupCreateResp: 创建群聊的响应结果
// - error: 错误信息,如果请求失败则返回错误
func (g *Group) Create(ctx context.Context, req GroupCreateReq, corpid string, corpsecret string) (GroupCreateResp, error) {
// 声明一个GroupCreateResp结构体变量res用于存储响应结果
var res GroupCreateResp
// 将请求结构体req转换为map类型的参数param
// 如果转换失败,忽略错误
param, _ := util.StructToMap(req)
// 发送HTTP请求到企业微信API创建群聊
// 参数依次为上下文、请求参数、请求URL、响应结果存储指针、企业ID、应用密钥
_, err := g.request(ctx, param, "https://qyapi.weixin.qq.com/cgi-bin/appchat/create", &res, corpid, corpsecret)
// 如果请求过程中发生错误,返回响应结果和错误
if err != nil {
return res, err
}
// 请求成功返回响应结果和nil错误
return res, nil
}
// SendMarkDown 方法用于发送Markdown格式的消息到群聊
// 参数:
// - ctx: 上下文信息,用于控制请求的超时和取消
// - req: 群聊发送Markdown消息的请求参数结构体
// - corpid: 企业微信corp ID
// - corpsecret: 企业微信应用的secret
//
// 返回值:
// - error: 操作过程中发生的错误如果成功则为nil
func (g *Group) SendMarkDown(ctx context.Context, req GroupSendMarkDownReq, corpid string, corpsecret string) error {
// 设置消息类型为Markdown
req.Msgtype = "markdown"
// 将请求结构体转换为map类型便于后续的HTTP请求参数处理
param, _ := util.StructToMap(req)
// 调用request方法发送HTTP请求到企业微信API
// 参数依次为:上下文、请求参数、API URL、额外请求头、corpid、corpsecret
_, err := g.request(ctx, param, " https://qyapi.weixin.qq.com/cgi-bin/appchat/send", nil, corpid, corpsecret)
// 如果请求过程中发生错误,直接返回错误
if err != nil {
return err
}
// 请求成功返回nil
return nil
}
func (g *Group) request(ctx context.Context, param map[string]interface{}, url string, resData interface{}, corpid string, corpsecret string) ([]byte, error) {
auth, err := g.auth.GetAccessToken(ctx, corpid, corpsecret)
if err != nil {
return nil, err
}
req := l_request.Request{
Method: http.MethodPost,
Url: url + "?access_token=" + auth.AccessToken,
Json: param,
}
res, err := req.Send()
if err != nil {
return nil, err
}
if res.StatusCode != http.StatusOK {
return nil, fmt.Errorf("request failed, status code: %d,reason: %s", res.StatusCode, res.Reason)
}
var code commonResp
if err = json.Unmarshal(res.Content, &code); err != nil {
return nil, fmt.Errorf("返回结构异常:%s", string(res.Content))
}
if code.Errcode != 0 {
return nil, fmt.Errorf("返回状态异常:%s", string(code.Errmsg))
}
if resData != nil {
if err = json.Unmarshal(res.Content, resData); err != nil {
return nil, fmt.Errorf("返回数据异常:%s", string(res.Content))
}
}
return res.Content, nil
}