配置文件

GoroBot 采用模块化的配置管理方案。核心框架与各个适配器、插件独立管理各自的配置文件。配置管理基于 conic 库,支持 JSON / YAML 等格式、结构体动态绑定与配置热重载(WatchConfig)。

首次运行机器人时,各模块会在 conf/ 目录下自动生成默认配置文件。

目录结构

典型的 conf/ 配置目录结构如下:

conf/
├── config.json            # 框架核心主配置文件
├── qbot/                  # QQ 官方机器人适配器配置
│   └── config.yaml
├── onebot/                # OneBot 适配器配置
│   └── config.json
├── lagrange/              # Lagrange 适配器配置
│   └── config.json
└── telegram/              # Telegram 适配器配置
    └── config.json

框架核心配置文件 (conf/config.json)

主配置文件控制框架的全局行为,如日志输出级别、机器人所有者(管理员)映射以及资源文件路径等。

示例配置

{
  "log_level": 1,
  "owner": {
    "qq": "100000000",
    "qbot:<your_bot_appid>": "qbot:user&<your_user_openid>",
    "telegram:<your_bot_id>": "telegram:user&<your_user_id>"
  },
  "admin": {
    "qq": ["100000001", "100000002"],
    "telegram:<your_bot_id>": ["telegram:user&<admin_user_id>"]
  },
  "resource_path": "./data/resources"
}

字段说明

字段类型默认值说明
log_levelint1全局日志输出级别,数值越大输出越详细(见下表)
ownerobject{}机器人最高所有者(等级 5)映射,键为机器人上下文 ID 或平台标识,值为 Universal ID 或用户 ID
adminobject{}机器人管理员(等级 4)映射,键为上下文 ID 或平台标识,值为用户 ID(支持单字符串或字符串列表)
resource_pathstring""资源文件保存根路径(可选)

日志级别 (log_level) 说明

数值等级名称说明
-3Fatal仅输出致命错误
-2Error输出错误信息及以上
-1Announcement / Success输出成功与公告信息及以上
0Warning输出警告信息及以上
1Info默认级别,输出常规运行信息及以上
2Debug输出详细调试日志及以上(包含接收/发送数据调试)

适配器配置文件

1. QQ 官方机器人 (conf/qbot/config.yaml)

QBot 适配器用于接入 QQ 开放平台官方机器人。默认使用 WebSocket Gateway 长连接,也支持 Webhook 回调或双向并存模式。

示例配置

debug: false
mode: "websocket" # 连接模式: "websocket" (默认), "webhook", 或 "both"
intents: 0        # 订阅事件掩码,留空或 0 则使用框架内置默认值

api:
  appid: "your_app_id"
  secret: "your_secret_key"

# 可选:仅在 mode 为 "webhook" 或 "both",或者需要对外提供图片等静态资源服务时配置
webhook:
  host: "0.0.0.0"
  port: 8443
  path: "/bot"
  base_url: "https://your.domain.net:8443"
  tls:
    cert_path: "/path/to/server.crt"
    key_path: "/path/to/server.key"

字段说明

字段类型说明
debugbool是否启用 QBot 详细调试日志
modestring连接模式:"websocket"(推荐)、"webhook" 或 "both"
intentsint事件订阅 Intents 掩码,传 0 默认订阅群聊、频道和私聊常用事件
api.appidstringQQ 开放平台的机器人 AppID
api.secretstringQQ 开放平台的机器人 AppSecret。注:若留空且在终端运行,QBot 会在终端展示登录二维码,手机 QQ 扫码后自动获取凭证并加密写回配置文件
webhook.hoststringWebhook 监听地址(默认 0.0.0.0)
webhook.portuintWebhook 监听端口(如 8443)
webhook.pathstringWebhook 回调 URL 路径(如 /bot)
webhook.base_urlstring机器人的公网访问基础地址,用于回调校验及静态媒体回源
webhook.tls.cert_pathstringTLS/SSL 证书文件路径(可选,若配置则开启 HTTPS)
webhook.tls.key_pathstringTLS/SSL 私钥文件路径

2. OneBot 适配器 (conf/onebot/config.json)

OneBot 适配器支持 OneBot v11 协议标准。支持 HTTP、WebSocket 客户端(正向 WS)以及反向 WebSocket(ws_reverse)三种通信模式。

示例配置(正向 WebSocket 模式)

{
  "mode": "ws",
  "ws": {
    "host": "127.0.0.1",
    "port": 3001,
    "access_token": "your_token"
  },
  "message_format": "array",
  "heartbeat": {
    "enable": true,
    "interval": 30000
  },
  "ignore_self": true,
  "command_prefix": "/",
  "debug": false
}

示例配置(反向 WebSocket 模式)

{
  "mode": "ws_reverse",
  "ws_reverse": {
    "host": "0.0.0.0",
    "port": 8080,
    "path": "/onebot/v11/ws",
    "access_token": "",
    "reconnect_interval": 300
  },
  "message_format": "array",
  "ignore_self": true,
  "command_prefix": "/"
}

示例配置(HTTP 模式)

{
  "mode": "http",
  "http": {
    "host": "127.0.0.1",
    "port": 5700,
    "post_url": "http://127.0.0.1:5701",
    "access_token": "",
    "secret": "",
    "timeout": 30
  },
  "message_format": "array",
  "ignore_self": true,
  "command_prefix": "/"
}

字段说明

字段类型说明
modestring必填。连接模式:"ws"、"ws_reverse" 或 "http"
wsobject正向 WebSocket 客户端配置(当 mode 为 "ws" 时必填)
ws.hoststringOneBot 服务端的主机地址
ws.portintOneBot 服务端的 WebSocket 端口
ws.access_tokenstring鉴权令牌(可选)
ws_reverseobject反向 WebSocket 服务端配置(当 mode 为 "ws_reverse" 时必填)
ws_reverse.hoststring本地监听地址
ws_reverse.portint本地监听端口
ws_reverse.pathstringWebSocket 路径(如 "/onebot/v11/ws")
ws_reverse.access_tokenstring客户端连接时的鉴权 Token
ws_reverse.reconnect_intervalint重连超时时间(毫秒,默认 300)
httpobjectHTTP 交互模式配置(当 mode 为 "http" 时必填)
http.hoststringHTTP 服务端地址
http.portintHTTP 服务端端口
http.post_urlstring事件上报地址
http.access_tokenstring鉴权 Token
http.secretstringHTTP 上报事件签名密钥
http.timeoutintHTTP 请求超时时间(秒,默认 30)
message_formatstring消息格式:"array"(推荐,CQ 码数组)或 "string"(纯字符串)
heartbeat.enablebool是否启用心跳保活机制(默认 true)
heartbeat.intervalint心跳上报间隔(毫秒,默认 30000)
rate_limit.enablebool是否开启 API 频率限制(默认 false)
rate_limit.intervalint限速间隔(毫秒)
ignore_selfbool是否忽略自身发送的消息(默认 true)
command_prefixstring命令前缀(默认 "/")
debugbool是否输出 OneBot 调试日志

3. Lagrange 适配器 (conf/lagrange/config.json)

Lagrange 适配器基于 LagrangeGo 实现 QQ 客户端协议支持。

示例配置

{
  "app_info": "linux 9.0.90",
  "sign_server_url": "https://sign.example.com",
  "music_sign_server_url": "",
  "command_prefix": "/",
  "account": {
    "uin": 100000000,
    "password": "",
    "sig_path": "keystore.json"
  },
  "ignore_self": true
}

字段说明

字段类型说明
app_infostring模拟客户端协议版本信息(如 "linux 9.0.90")
sign_server_urlstringLagrange 签名服务器地址
music_sign_server_urlstring音乐卡片签名服务地址(可选)
command_prefixstring命令前缀(默认 "/")
account.uinuint32QQ 账号
account.passwordstringQQ 密码(支持留空并通过扫码验证登录)
account.sig_pathstring登录凭证保存相对路径(保存在 conf/lagrange/ 目录下)
ignore_selfbool是否忽略自身消息

4. Telegram 适配器 (conf/telegram/config.json)

Telegram 适配器用于接入 Telegram Bot API。

示例配置

{
  "token": "your_bot_token_from_botfather",
  "server_url": ""
}

字段说明

字段类型说明
tokenstring必填。Telegram Bot Token,可向 @BotFather 创建获取
server_urlstring自定义 Telegram API 地址(留空则使用官方默认 https://api.telegram.org,适合配置本地代理或反代加速)

Universal ID (统一实体标识) 说明

为了统一跨平台的用户、群组与消息寻址,GoroBot 采用了 Universal ID 机制。

格式定义为:

protocol:type&arg1&arg2...

常见格式示例

平台实体类型Universal ID 示例
QBot用户qbot:user&<openid>
QBot群聊qbot:group&<group_openid>
QBot频道qbot:guild&<guild_id>
Lagrange / OneBot用户lagrange:user&<uin> / onebot:user&<uin>
Lagrange / OneBot群聊lagrange:group&<group_id> / onebot:group&<group_id>
Telegram用户 / 群聊telegram:user&<chat_id> / telegram:group&<chat_id>

在 conf/config.json 的 owner 配置中,可通过配置该 ID 赋予特定用户管理员权限。


在自定义插件中管理配置

开发者编写插件时,也可以方便地利用 conic 库为自己的插件提供独立的配置文件:

package myplugin

import (
	"path"
	"github.com/Jel1ySpot/conic"
	GoroBot "github.com/Jel1ySpot/GoroBot/pkg/core"
	"github.com/Jel1ySpot/GoroBot/pkg/util"
)

type Config struct {
	Greeting string `json:"greeting"`
	Limit    int    `json:"limit"`
}

type Service struct {
	conic  *conic.Conic
	config Config
}

func (s *Service) Init(grb *GoroBot.Instant) error {
	configDir := "conf/myplugin/"
	configFile := path.Join(configDir, "config.json")

	s.conic = conic.New()
	s.conic.SetConfigFile(configFile)
	s.conic.WatchConfig()
	s.conic.BindRef("", &s.config)

	if !util.FileExists(configFile) {
		_ = util.MkdirIfNotExists(configDir)
		s.config = Config{Greeting: "你好", Limit: 10}
		_ = s.conic.WriteConfig() // 自动写出默认配置
	}

	return s.conic.ReadConfig()
}