177 lines
4.1 KiB
Go
177 lines
4.1 KiB
Go
package dingding
|
||
|
||
import (
|
||
"bytes"
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io/ioutil"
|
||
"net/http"
|
||
|
||
dingMod "com.snow.auto_monitor/app/models/dinglist"
|
||
"github.com/qit-team/snow-core/log/logger"
|
||
)
|
||
|
||
var token string = ""
|
||
|
||
func AccessToken(client_key string, client_secret string) {
|
||
targetUrl := "http://121.199.38.107:8000/oauth/v1/accesstoken"
|
||
data := map[string]interface{}{
|
||
"client_key": client_key,
|
||
"client_secret": client_secret,
|
||
}
|
||
jsonData, err := json.Marshal(data)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
req, err := http.NewRequest("POST", targetUrl, bytes.NewBuffer(jsonData))
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
// 设置请求头,指定内容类型为JSON
|
||
req.Header.Set("Content-Type", "application/json")
|
||
|
||
// 发送请求并获取响应
|
||
client := &http.Client{}
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
|
||
// fmt.Println("响应状态码:", resp.StatusCode)
|
||
// fmt.Println("响应内容:", string(body))
|
||
|
||
if resp.StatusCode != 200 {
|
||
logger.Error(context.TODO(), "dingding", "钉钉发送公告失败")
|
||
logger.Error(context.TODO(), "dingding", string(body))
|
||
return
|
||
}
|
||
|
||
// 定义结构体用于解析JSON数据
|
||
type Data struct {
|
||
AccessToken string `json:"accessToken"`
|
||
AccessExpire int64 `json:"accessExpire"`
|
||
}
|
||
|
||
type Response struct {
|
||
Code int `json:"code"`
|
||
Msg string `json:"msg"`
|
||
Data Data `json:"data"`
|
||
}
|
||
// 解析JSON数据
|
||
var res Response
|
||
err = json.Unmarshal([]byte(body), &res)
|
||
if err != nil {
|
||
fmt.Println("解析JSON失败:", err)
|
||
return
|
||
}
|
||
|
||
// 获取并打印accessToken
|
||
accessToken := res.Data.AccessToken
|
||
// fmt.Println("accessToken:", accessToken)
|
||
token = accessToken
|
||
}
|
||
|
||
func DingSend(title string, content string, retry bool) (err error) {
|
||
dlist, err := dingMod.GetInstance().Search(0, 0, "", "", "", 999, 0)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
|
||
deptid_list := []int64{}
|
||
userid_list := []string{}
|
||
for _, v := range dlist {
|
||
deptid_list = append(deptid_list, v.DepartmentId)
|
||
userid_list = append(userid_list, v.UserId)
|
||
}
|
||
|
||
targetUrl := "http://121.199.38.107:8000/msg/v1/dingtalk/blackboard/send"
|
||
data := map[string]interface{}{
|
||
"base": map[string]string{
|
||
"server_index": "transfer_msg",
|
||
"temp_index": "transferding",
|
||
},
|
||
"blackboard_receiver": map[string]interface{}{
|
||
"deptid_list": deptid_list,
|
||
"userid_list": userid_list,
|
||
},
|
||
"title": title,
|
||
"content": content,
|
||
}
|
||
jsonData, err := json.Marshal(data)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
req, err := http.NewRequest("POST", targetUrl, bytes.NewBuffer(jsonData))
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
// 设置请求头,指定内容类型为JSON
|
||
req.Header.Set("Content-Type", "application/json")
|
||
req.Header.Set("Authorization", token)
|
||
|
||
// 发送请求并获取响应
|
||
client := &http.Client{}
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, err := ioutil.ReadAll(resp.Body)
|
||
if err != nil {
|
||
logger.Error(context.TODO(), "dingding", err)
|
||
return
|
||
}
|
||
// fmt.Println("响应状态码:", resp.StatusCode)
|
||
// fmt.Println("响应内容:", string(body))
|
||
|
||
// fmt.Println("参数:", data)
|
||
if resp.StatusCode != 200 {
|
||
logger.Error(context.TODO(), "dingding", "钉钉发送公告失败")
|
||
logger.Error(context.TODO(), "dingding", string(body))
|
||
return
|
||
}
|
||
|
||
// 定义结构体用于解析JSON数据
|
||
type Data struct {
|
||
Code int64 `json:"code"`
|
||
Msg string `json:"msg"`
|
||
}
|
||
|
||
// 解析JSON数据
|
||
var res Data
|
||
err = json.Unmarshal([]byte(body), &res)
|
||
if err != nil {
|
||
fmt.Println("解析JSON失败:", err)
|
||
return
|
||
}
|
||
|
||
if res.Code == 2 {
|
||
AccessToken("transfer123", "transfer321")
|
||
if retry {
|
||
DingSend(title, content, false)
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
func init() {
|
||
fmt.Println("初始化钉钉接口")
|
||
AccessToken("transfer123", "transfer321")
|
||
}
|