com.snow.auto_monitor/app/services/dingding/dingding.go

177 lines
4.1 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 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")
}