138 lines
3.0 KiB
Go
138 lines
3.0 KiB
Go
//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
|
|
}
|