1.4.5.2
This commit is contained in:
137
EdgeAPI/internal/senders/mediasenders/media_qy_weixin.go
Normal file
137
EdgeAPI/internal/senders/mediasenders/media_qy_weixin.go
Normal file
@@ -0,0 +1,137 @@
|
||||
//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
|
||||
}
|
||||
Reference in New Issue
Block a user