bot

package module
v0.0.14 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 19, 2026 License: Apache-2.0 Imports: 13 Imported by: 2

README

Better-Bot-Go

由原来的 Go-QQ-SDK 迁移过来。

可以基于快速开发包快速开发机器人。

快速开发包下载 GoSDK

已支持正向 WebSocket ,正向 WebSocket 地址为 wss://你的域名:端口/websocket , 程序启动默认启用。

示例 wss://fw1009zb5979.vicp.fun:443/websocket

对应的 WebSocket 客户端地址 Bot-Client-Go ,欢迎大家使用。

QQ机器人,官方 GOLANG SDK。

Go Reference

QQ交流群 677742758

已完成功能/开发计划列表
登录
  • 登录
消息类型
  • 文本
  • 图片
  • 语音
  • MarkDown
  • 表情
  • At
  • 回复
  • 长消息(仅群聊/私聊)
  • 链接分享
  • 小程序(暂只支持RAW)
  • 短视频
  • 合并转发
  • 群文件(上传与接收信息)
群聊
  • 收发群消息
  • 机器人加群通知
  • 机器人离群通知
  • 群接收机器人主动消息通知
  • 群拒绝机器人主动消息通知
  • 机器人撤回自己在2分钟内的消息
  • 机器人获取群成员列表【需要申请权限】
C2C
  • 收发C2C消息
  • 机器人加好友通知
  • 机器人删好友通知
  • 接收机器人消息通知
  • 拒绝机器人消息通知
  • 机器人撤回自己在2分钟内的消息

一、如何使用

1.回调地址配置
is_open 为 true 时, 服务端只需要关注 port, cert_file 和 cert_key

https://你的域名:端口/qqbot/你的应用appid/你的应用app_secret

示例 https://fw1009zb5979.vicp.fun:443/qqbot/101981675/hjksdfhi3jkslfjlksdfjksejkdjk

is_open 为 false 时

https://你的域名:端口/qqbot/你的应用appid

示例 https://fw1009zb5979.vicp.fun:443/qqbot/101981675

2.配置文件填写(支持多账号)

默认配置文件为

{
	"apps": {
		"123456": {
			"qq": 123456,
			"app_id": 123456,
			"token": "你的AppToken",
			"app_secret": "你的AppSecret"
			"is_sandbox": true,
			"wss_addr": "你的wss地址,服务端不用管"
		}
	},
	"port": 8443,
	"cert_file": "ssl证书文件路径",
	"cert_key": "ssl证书密钥"
	"is_open": true
}

多账号

{
	"apps": {
		"5123456": {
			"qq": 123456,
			"app_id": 5123456,
			"token": "你的AppToken",
			"app_secret": "你的AppSecret"
			"is_sandbox": true,
			"wss_addr": "你的wss地址,服务端不用管"
		},
		"7234567": {
			"qq": 234567,
			"app_id": 7234567,
			"token": "你的AppToken",
			"app_secret": "你的AppSecret"
			"is_sandbox": true,
			"wss_addr": "你的wss地址,服务端不用管"
		}
	},
	"port": 8443,
	"cert_file": "ssl证书文件路径",
	"cert_key": "ssl证书密钥"
	"is_open": true
}
3.请求 openapi 接口,操作资源
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"strconv"
	"strings"
	"time"

	bot1 "github.com/2mf8/Better-Bot-Go"
	"github.com/2mf8/Better-Bot-Go/dto"
	v1 "github.com/2mf8/Better-Bot-Go/openapi/v1"
	"github.com/2mf8/Better-Bot-Go/token"
	"github.com/2mf8/Better-Bot-Go/webhook"
	log "github.com/sirupsen/logrus"
)

func main() {
	ctx := context.WithValue(context.Background(), "key", "value")
	webhook.InitLog()
	as := webhook.ReadSetting()
	for _, v := range as.Apps {
		atr := v1.GetAccessToken(fmt.Sprintf("%v", v.AppId), v.AppSecret)
		iat, err := strconv.Atoi(atr.ExpiresIn)
		if err == nil && atr.AccessToken != "" {
			aei := time.Now().Unix() + int64(iat)
			token := token.BotToken(v.AppId, atr.AccessToken, string(token.TypeQQBot))
			if v.IsSandBox {
				api := bot1.NewSandboxOpenAPI(token).WithTimeout(3 * time.Second)
				go bot1.AuthAcessAdd(fmt.Sprintf("%v", v.AppId), &bot1.AccessToken{AccessToken: atr.AccessToken, ExpiresIn: aei, Api: api, AppSecret: v.AppSecret, IsSandBox: v.IsSandBox, Appid: v.AppId})
			} else {
				api := bot1.NewOpenAPI(token).WithTimeout(3 * time.Second)
				go bot1.AuthAcessAdd(fmt.Sprintf("%v", v.AppId), &bot1.AccessToken{AccessToken: atr.AccessToken, ExpiresIn: aei, Api: api, AppSecret: v.AppSecret, IsSandBox: v.IsSandBox, Appid: v.AppId})
			}
		}
		time.Sleep(time.Millisecond * 100)
	}
	b, _ := json.Marshal(as)
	fmt.Println("配置", string(b))
	webhook.GroupAtMessageEventHandler = func(bot *webhook.BotHeaderInfo, event *dto.WSPayload, data *dto.WSGroupATMessageData) error {
		fmt.Println(bot.XBotAppid, data.GroupId, data.Content)
		if len(data.Attachments) > 0 {
			log.Infof(`BotId(%s) GroupId(%s) UserId(%s) <- %s <image id="%s">`, bot.XBotAppid[0], data.GroupId, data.Author.UserId, data.Content, data.Attachments[0].URL)
		} else {
			log.Infof("BotId(%s) GroupId(%s) UserId(%s) <- %s", bot.XBotAppid[0], data.GroupId, data.Author.UserId, data.Content)
		}
		if strings.TrimSpace(data.Content) == "测试" {
			bot1.SendApi(bot.XBotAppid[0]).PostGroupMessage(ctx, data.GroupId, &dto.GroupMessageToCreate{
				Content: "成功",
				MsgID:   data.MsgId,
				MsgType: 0,
			})
		}
		return nil
	}
	webhook.C2CMessageEventHandler = func(bot *webhook.BotHeaderInfo, event *dto.WSPayload, data *dto.WSC2CMessageData) error {
		b, _ := json.Marshal(event)
		fmt.Println(bot.XBotAppid, string(b), data.Content)
		return nil
	}
	webhook.MessageEventHandler = func(bot *webhook.BotHeaderInfo, event *dto.WSPayload, data *dto.WSMessageData) error {
		b, _ := json.Marshal(event)
		fmt.Println(bot.XBotAppid, string(b), data.Content)
		return nil
	}
	webhook.InitGin(as.IsOpen)
	select {}
}

Documentation

Overview

Package botgo 是一个QQ频道机器人 sdk 的 golang 实现

Index

Constants

This section is empty.

Variables

View Source
var AuthAcess = &AccessConfig{
	Config: make(map[string]*AccessToken, 0),
}

Functions

func NewOpenAPI

func NewOpenAPI(token *token.Token) openapi.OpenAPI

NewOpenAPI 创建新的 openapi 实例,会返回当前的 openapi 实现的实例 如果需要使用其他版本的实现,需要在调用这个方法之前调用 SelectOpenAPIVersion 方法

func NewSandboxOpenAPI

func NewSandboxOpenAPI(token *token.Token) openapi.OpenAPI

NewSandboxOpenAPI 创建测试环境的 openapi 实例

func SelectOpenAPIVersion

func SelectOpenAPIVersion(version openapi.APIVersion) error

SelectOpenAPIVersion 指定使用哪个版本的 api 实现,如果不指定,sdk将默认使用第一个 setup 的 api 实现

func SendApi added in v0.0.9

func SendApi(appid string) openapi.OpenAPI

func SetLogger added in v0.0.14

func SetLogger(logger log.Logger)

SetLogger 设置 logger,需要实现 sdk 的 log.Logger 接口

func SetOpenAPIClient added in v0.0.14

func SetOpenAPIClient(v openapi.APIVersion, c openapi.OpenAPI)

SetOpenAPIClient 注册 openapi 的不同实现,需要设置版本

func SetSessionManager added in v0.0.14

func SetSessionManager(m SessionManager)

SetSessionManager 注册自己实现的 session manager

func SetWebsocketClient added in v0.0.14

func SetWebsocketClient(c websocket2.WebSocket)

SetWebsocketClient 替换 websocket 实现

Types

type AccessConfig added in v0.0.9

type AccessConfig struct {
	Config map[string]*AccessToken
	// contains filtered or unexported fields
}

func AuthAcessAdd added in v0.0.9

func AuthAcessAdd(appid string, accessConfig *AccessToken) *AccessConfig

type AccessToken added in v0.0.9

type AccessToken struct {
	Appid       uint64
	Api         openapi.OpenAPI
	AppSecret   string
	AccessToken string
	ExpiresIn   int64
	IsSandBox   bool
}

type SessionManager added in v0.0.14

type SessionManager interface {
	// Start 启动连接,默认使用 apInfo 中的 shards 作为 shard 数量,如果有需要自己指定 shard 数,请修 apInfo 中的信息
	Start(apInfo *dto.WebsocketAP, token *token.Token, intents *dto.Intent) error
}

SessionManager 接口,管理session

func NewSessionManager added in v0.0.14

func NewSessionManager() SessionManager

Directories

Path Synopsis
dto
Package dto 维护了用于与机器人接口通信的数据结构对象。
Package dto 维护了用于与机器人接口通信的数据结构对象。
message
Package message 内提供了用于支撑处理消息对象的工具和方法。
Package message 内提供了用于支撑处理消息对象的工具和方法。
Package errs 是 SDK 里面的错误类型的集合,同时封装了 SDK 专用的错误类型。
Package errs 是 SDK 里面的错误类型的集合,同时封装了 SDK 专用的错误类型。
interaction
signature
Package signature 用于处理平台和机器人开发者之间的互动请求中的签名验证
Package signature 用于处理平台和机器人开发者之间的互动请求中的签名验证
internal
Package log 是 SDK 的 logger 接口定义与内置的 logger。
Package log 是 SDK 的 logger 接口定义与内置的 logger。
Package openapi 声明了 sdk 所使用的 openapi 接口。
Package openapi 声明了 sdk 所使用的 openapi 接口。
v1
Package v1 是 openapi v1 版本的实现。
Package v1 是 openapi v1 版本的实现。
Package sessions 提供了用于处理 websocket 的多实例会话的相关功能。
Package sessions 提供了用于处理 websocket 的多实例会话的相关功能。
local
Package local 基于 golang chan 实现的单机 manager。
Package local 基于 golang chan 实现的单机 manager。
manager
Package manager 实现 session manager 所需要的公共方法。
Package manager 实现 session manager 所需要的公共方法。
remote
Package remote 基于 redis list 实现的分布式 session manager。
Package remote 基于 redis list 实现的分布式 session manager。
remote/lock
Package lock 一个基于 redis 的分布式锁实现。
Package lock 一个基于 redis 的分布式锁实现。
Package token 用于调用 openapi,websocket 的 token 对象。
Package token 用于调用 openapi,websocket 的 token 对象。
Package version sdk 版本声明。
Package version sdk 版本声明。
Package websocket SDK 需要实现的 websocket 定义。
Package websocket SDK 需要实现的 websocket 定义。
client
Package client 默认的 websocket client 实现。
Package client 默认的 websocket client 实现。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL