golang发送钉钉个人消息
要使用Golang发送钉钉个人消息,您可以使用钉钉的开放接口来实现。以下是一个示例代码,可以帮助您发送个人消息。
首先,您需要在钉钉开放平台创建一个应用,并获取到应用的AppKey和AppSecret。
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
const (
appKey = "YOUR_APP_KEY"
appSecret = "YOUR_APP_SECRET"
)
type DingTalkResponse struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
}
func main() {
accessToken, err := getAccessToken()
if err != nil {
fmt.Println("Failed to get access token:", err)
return
}
err = sendTextMessage(accessToken, "dingtalk_user_id", "Hello, DingTalk!")
if err != nil {
fmt.Println("Failed to send text message:", err)
return
}
fmt.Println("Text message sent successfully!")
}
func getAccessToken() (string, error) {
timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10)
sign := sign(timestamp)
apiURL := "https://oapi.dingtalk.com/gettoken"
query := url.Values{}
query.Set("appkey", appKey)
query.Set("timestamp", timestamp)
query.Set("sign", sign)
resp, err := http.Get(apiURL + "?" + query.Encode())
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
var dingTalkResponse DingTalkResponse
err = json.Unmarshal(body, &dingTalkResponse)
if err != nil {
return "", err
}
if dingTalkResponse.Errcode != 0 {
return "", fmt.Errorf("error: %s", dingTalkResponse.Errmsg)
}
return dingTalkResponse.Errmsg, nil
}
func sendTextMessage(accessToken, userID, content string) error {
apiURL := "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"
type Message struct {
AgentID int `json:"agent_id"`
UserID string `json:"userid"`
Msg map[string]interface{} `json:"msg"`
}
msg := make(map[string]interface{})
msg["msgtype"] = "text"
msg["text"] = map[string]string{"content": content}
message := Message{
AgentID: 0, // 设置为0表示使用应用的默认配置
UserID: userID,
Msg: msg,
}
body, err := json.Marshal(message)
if err != nil {
return err
}
req, err := http.NewRequest("POST", apiURL+"?access_token="+accessToken, bytes.NewReader(body))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
var dingTalkResponse DingTalkResponse
err = json.Unmarshal(respBody, &dingTalkResponse)
if err != nil {
return err
}
if dingTalkResponse.Errcode != 0 {
return fmt.Errorf("error: %s", dingTalkResponse.Errmsg)
}
return nil
}
func sign(timestamp string) string {
stringToSign := fmt.Sprintf("%s\n%s", timestamp, appSecret)
hmac256 := hmac.New(sha256.New, []byte(appSecret))
hmac256.Write([]byte(stringToSign))
signature := base64.StdEncoding.EncodeToString(hmac256.Sum(nil))
return url.QueryEscape(signature)
}
请替换YOUR_APP_KEY和YOUR_APP_SECRET为您创建的应用的实际值。您还需要将dingtalk_user_id替换为您要发送消息的钉钉用户的实际用户ID。
此示例代码使用了钉钉开放平台的gettoken接口获取访问令牌,并使用topapi/message/corpconversation/asyncsend_v2接口发送消息。它使用了HMACSHA256算法对请求进行签名,并使用HTTP POST方法发送JSON格式的消息内容。
请注意,您需要确保您的应用具有发送个人消息的权限
原文地址: http://www.cveoy.top/t/topic/h1zs 著作权归作者所有。请勿转载和采集!