//go:build plus package mediasenders import ( "bytes" "encoding/json" "errors" "fmt" "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/iwind/TeaGo/maps" "io" "net/http" "net/url" "time" ) // QyWeixinMedia 企业微信媒介 type QyWeixinMedia struct { CorporateId string `yaml:"corporateId" json:"corporateId"` AgentId string `yaml:"agentId" json:"agentId"` AppSecret string `yaml:"appSecret" json:"appSecret"` TextFormat TextFormat `yaml:"textFormat" json:"textFormat"` } // NewQyWeixinMedia 获取新对象 func NewQyWeixinMedia() *QyWeixinMedia { return &QyWeixinMedia{} } func (this *QyWeixinMedia) Send(user string, subject string, body string, productName string, datetime string) (respData []byte, err error) { // 获取Token u := "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + url.QueryEscape(this.CorporateId) + "&corpsecret=" + url.QueryEscape(this.AppSecret) req1, err := http.NewRequest(http.MethodGet, u, nil) if err != nil { return nil, err } client := utils.SharedHttpClient(5 * time.Second) resp1, err := client.Do(req1) if err != nil { return nil, err } defer resp1.Body.Close() if resp1.StatusCode != http.StatusOK { return nil, errors.New("status code not 200") } data, err := io.ReadAll(resp1.Body) if err != nil { return nil, err } m := maps.Map{} err = json.Unmarshal(data, &m) if err != nil { return data, err } errCode := m.GetInt("errcode") if errCode > 0 { return data, errors.New("error code:" + fmt.Sprintf("%d", errCode)) } accessToken := m.GetString("access_token") if len(user) == 0 { user = "@all" } // 发送消息 u = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + url.QueryEscape(accessToken) msg := maps.Map{ "touser": user, "toparty": "", "totag": "", "toall": 0, "agentid": this.AgentId, "safe": 0, } if this.TextFormat == FormatMarkdown { msg["msgtype"] = "markdown" msg["markdown"] = maps.Map{ "content": subject + "\n" + body, } } else { msg["msgtype"] = "text" msg["text"] = maps.Map{ "content": subject + "\n" + body, } } data, err = json.Marshal(msg) if err != nil { return nil, err } req, err := http.NewRequest(http.MethodPost, u, bytes.NewBuffer(data)) if err != nil { return nil, err } resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, errors.New("status not 200") } data, err = io.ReadAll(resp.Body) if err != nil { return nil, err } m = maps.Map{} err = json.Unmarshal(data, &m) if err != nil { return nil, err } errCode = m.GetInt("errcode") if errCode != 0 { return data, errors.New("errcode " + fmt.Sprintf("%d", errCode)) } invalidUser := m.GetString("invaliduser") if len(invalidUser) > 0 { return data, errors.New("invalid users:" + invalidUser) } return data, nil } // RequireUser 是否需要用户标识 func (this *QyWeixinMedia) RequireUser() bool { return false }