GO语言实现机器人发送图片消息并且@群成员

GO语言实现如流机器人发送图片消息并且@群成员

package chatbot

import (
"bytes"
"encoding/json"
"net/http"
)

type ChatMessageType string

const (
MessageTypeText  ChatMessageType = "TEXT"
MessageTypeImage ChatMessageType = "IMAGE"
MessageTypeLink  ChatMessageType = "LINK"
MessageTypeAt    ChatMessageType = "AT"
)
const (
DefaultURL     = "webhook链接"
DefaultGroupID = "群id"
)

var DefaultAtUsers = []string{"要@的群成员名"}

type ChatMessage struct {
Type      ChatMessageType `json:"type,omitempty"`
Content   string          `json:"content,omitempty"`
Href      string          `json:"href,omitempty"`
AtAll     bool            `json:"atall,omitempty"`
AtUserIds []string        `json:"atuserids,omitempty"`
}
type ChatBot struct {
URL     string         `json:"url,omitempty"`
GroupID string         `json:"group_id,omitempty"`
Body    []*ChatMessage `json:"msg,omitempty"`
}

// NewChatBot 函数返回 ChatBot 的指针
func NewChatBot(url, groupID string) *ChatBot {
return &ChatBot{URL: url, GroupID: groupID}
}

// AddMsg 将指定消息添加到聊天机器人实例的消息体中。
func (bot *ChatBot) AddMsg(msg ...*ChatMessage) *ChatBot {
bot.Body = append(bot.Body, msg...)
return bot
}

// NewTextChatMessage 创建一个带有内容的文本聊天消息
// 参数:
//
//  content: 字符串类型的聊天消息内容
//
// 返回值:
//
//  *ChatMessage: 指向新创建的聊天消息的指针
func NewTextChatMessage(content string) *ChatMessage {
return &ChatMessage{Type: MessageTypeText, Content: content}
}

// NewImageChatMessage 函数返回一个新的图像聊天消息
func NewImageChatMessage(content string) *ChatMessage {
return &ChatMessage{Type: MessageTypeImage, Content: content}
}

// NewLinkChatMessage 函数创建一个 LinkChatMessage 对象,包含一个指向 href 的链接。
// 参数 content 是消息内容,参数 href 是链接地址。
func NewLinkChatMessage(content, href string) *ChatMessage {
return &ChatMessage{Type: MessageTypeLink, Href: href}
}

// NewAtChatMessage @群里成员名称的切片,函数接受一个字符串切片和一个布尔值(是否@全体)作为输入,并返回一个新的 ChatMessage 结构体指针。
func NewAtChatMessage(AtUserIds []string, atAll bool) *ChatMessage {
return &ChatMessage{Type: MessageTypeAt, AtAll: atAll, AtUserIds: AtUserIds}
}

// SendMsg 通过发送消息到指定群组
// 参数:
//
//  bot: 聊天机器人实例,包含需要发送的消息和群组ID信息
//
// 返回值:
//
//  如果发送消息成功则返回nil,否则返回相应错误
func (bot *ChatBot) SendMsg() error {
msgBody, err := json.Marshal(bot.Body)
if err != nil {
return err
}

jsonStr := []byte(`{
    "message": {
        "header": {
            "toid": [` + bot.GroupID + `]
        },
        "body": ` + string(msgBody) + `
    }
}`)

req, err := http.NewRequest("POST", bot.URL, bytes.NewBuffer(jsonStr))
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()

return nil
}

使用方式:

var msgList []*chatbot.ChatMessage



msgList = append(msgList, chatbot.NewImageChatMessage(base64图片数据))

if len(msg) > 0 {
msgList = append(msgList, chatbot.NewTextChatMessage(msg))
}
msgList = append(msgList, chatbot.NewAtChatMessage(chatbot.DefaultAtUsers, false))

robot := chatbot.NewChatBot(chatbot.DefaultURL, chatbot.DefaultGroupID)

_ = robot.AddMsg(msgList...).SendMsg()


最后编辑于:2024/01/04作者: 牛逼PHP

发表评论