要使用Golang发送钉钉个人消息,您可以使用钉钉的开放接口来实现。以下是一个示例代码,可以帮助您发送个人消息。

首先,您需要在钉钉开放平台创建一个应用,并获取到应用的AppKeyAppSecret

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_KEYYOUR_APP_SECRET为您创建的应用的实际值。您还需要将dingtalk_user_id替换为您要发送消息的钉钉用户的实际用户ID。

此示例代码使用了钉钉开放平台的gettoken接口获取访问令牌,并使用topapi/message/corpconversation/asyncsend_v2接口发送消息。它使用了HMACSHA256算法对请求进行签名,并使用HTTP POST方法发送JSON格式的消息内容。

请注意,您需要确保您的应用具有发送个人消息的权限

golang发送钉钉个人消息

原文地址: http://www.cveoy.top/t/topic/h1zs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录