Files
chatgpt-dingtalk/pkg/dingbot/dingbot.go

124 lines
3.3 KiB
Go

package dingbot
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
// 接收的消息体
type ReceiveMsg struct {
ConversationID string `json:"conversationId"`
AtUsers []struct {
DingtalkID string `json:"dingtalkId"`
} `json:"atUsers"`
ChatbotUserID string `json:"chatbotUserId"`
MsgID string `json:"msgId"`
SenderNick string `json:"senderNick"`
IsAdmin bool `json:"isAdmin"`
SenderStaffId string `json:"senderStaffId"`
SessionWebhookExpiredTime int64 `json:"sessionWebhookExpiredTime"`
CreateAt int64 `json:"createAt"`
ConversationType string `json:"conversationType"`
SenderID string `json:"senderId"`
ConversationTitle string `json:"conversationTitle"`
IsInAtList bool `json:"isInAtList"`
SessionWebhook string `json:"sessionWebhook"`
Text Text `json:"text"`
RobotCode string `json:"robotCode"`
Msgtype MsgType `json:"msgtype"`
}
// 消息类型
type MsgType string
const TEXT MsgType = "text"
const MARKDOWN MsgType = "markdown"
// Text 消息
type TextMessage struct {
MsgType MsgType `json:"msgtype"`
At *At `json:"at"`
Text *Text `json:"text"`
}
// Text 消息内容
type Text struct {
Content string `json:"content"`
}
// MarkDown 消息
type MarkDownMessage struct {
MsgType MsgType `json:"msgtype"`
At *At `json:"at"`
MarkDown *MarkDown `json:"markdown"`
}
// MarkDown 消息内容
type MarkDown struct {
Title string `json:"title"`
Text string `json:"text"`
}
// at 内容
type At struct {
AtUserIds []string `json:"atUserIds"`
AtMobiles []string `json:"atMobiles"`
IsAtAll bool `json:"isAtAll"`
}
// 获取用户标识,兼容当 SenderStaffId 字段为空的场景,此处提供给发送消息是艾特使用
func (r ReceiveMsg) GetSenderIdentifier() (uid string) {
uid = r.SenderStaffId
if uid == "" {
uid = r.SenderNick
}
return
}
// GetChatTitle 获取聊天的群名字,如果是私聊,则命名为 昵称_私聊
func (r ReceiveMsg) GetChatTitle() (chatType string) {
chatType = r.ConversationTitle
if chatType == "" {
chatType = r.SenderNick + "_私聊"
}
return
}
// 发消息给钉钉
func (r ReceiveMsg) ReplyToDingtalk(msgType, msg string) (statuscode int, err error) {
atUser := r.SenderStaffId
if atUser == "" {
msg = fmt.Sprintf("%s\n\n@%s", msg, r.SenderNick)
}
var msgtmp interface{}
switch msgType {
case string(TEXT):
msgtmp = &TextMessage{Text: &Text{Content: msg}, MsgType: TEXT, At: &At{AtUserIds: []string{atUser}}}
case string(MARKDOWN):
msgtmp = &MarkDownMessage{MsgType: MARKDOWN, At: &At{AtUserIds: []string{atUser}}, MarkDown: &MarkDown{Title: "Markdown Type", Text: msg}}
default:
msgtmp = &TextMessage{Text: &Text{Content: msg}, MsgType: TEXT, At: &At{AtUserIds: []string{atUser}}}
}
data, err := json.Marshal(msgtmp)
if err != nil {
return 0, err
}
req, err := http.NewRequest("POST", r.SessionWebhook, bytes.NewBuffer(data))
if err != nil {
return 0, err
}
req.Header.Add("Accept", "*/*")
req.Header.Add("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return 0, err
}
defer resp.Body.Close()
return resp.StatusCode, nil
}