RabBot是基于openwechat实现的微信机器人框架
框架包含
- 通过logrus库,实现全局日志管理
- 支持日记级别热更新(Info->Debug)
- 统一消息处理接口
- 配置化,可以通过仅修改配置达到部分自定义效果 4.1 群聊黑名单 4.2 功能是否启用(最小粒度为群聊)
很早之前就想做个微信机器人玩玩,当时只看到了主流的wechaty,但是登陆限制太多,又完全联系不上开源激励计划,所以一直没有机会
偶然间看到openwechat的打破登录限制,于是就上头了,Go是边做边学的,代码问题可能会有不少,欢迎提建议
Warning
- 采用的openwechat提供的SDK,桌面微信协议
- 使用机器人需要一个微信号,扫码登录且手机不可退出登录(有需要的话可以断网退出,具体操作可以在网上搜到)
- 作为机器人的微信号需要实名认证,在实名认证是会让绑银行卡
- 会有概率被封号
通过git clone
$ git clone https://github.com/Drew233/Rabbot.git或者 Download ZIP下载源码
或者前往Releases下载源码或可执行文件(推荐源码)
通过go mod tidy添加缺失的模块以及移除不需要的模块
$ go mod tidy配置文件默认路径为./rabbot/config/rabbot.config,启动之前一定要把配置文件中需要自己修改的部分完成,否则会导致功能失效
这里必须要修改的只有:botName和groupWhiteList,其他字段可以根据自己需要修改
整体为一个json格式的字符串,下面会解释每个字段的含义
{
"botName": "小兔子",
// botName 机器人微信昵称,因为现在暂时取不到登陆账号自己在群聊中的备注,所以直接采用微信昵称。主要用于判断是否是@自己的消息。注意:如果在群聊中改了自己的昵称,会导致功能失效
"datadir": "./rabdata",
// datadir 数据存放目录,主要用于存放日志以及一些临时文件
"defaultMsg": {
"dullMsg": "我只是一只小兔子,小兔子怎么会想到现在该说什么呢",
// dullMsg 收到未知指令时的回复
"errorMsg": "谁把我做成麻辣兔头了?!"
// errorMsg 出现内部错误时候的回复
},
// defaultMsg 默认回复消息
"tyqwToken": "{Personal_token}",
// 通义千问token,可自行前往官网获取。不填的话除指令外默认只回复默认回复
"groupWhiteList" : [
"一群单身狗",
"OW灌水群"
],
// groupWhiteList 群聊白名单,机器人只会响应群聊白名单里面的消息
"rablog": {
"maxsize": 5,
// maxsize 日志文件的最大大小,单位为MB。当日志文件大小达到这个值时,会触发日志切割。
"maxbackups": 3,
// maxbackups 最多保留的旧日志文件数量,超过这个数量的旧日志文件会被删除。
"maxage": 30,
// maxage 旧日志文件的最大保留天数,超过这个天数的旧日志文件会被删除。
"compress": true
// compress 是否压缩旧日志文件,设置为 true 表示会对旧日志文件进行压缩。
},
// rablog 日志相关参数设置,日志路径固定为 ${datadir}/log/rabbot.log
"cron": {
"tmpCleanCron": "0 0 * * *"
// tmpCleanCron 每天凌晨执行一次,这里主要是定时清理tmp目录下的文件
},
// 定时任务的cron表达式
"feature": {
"摸鱼日历": {
// 摸鱼日历 功能名称,这里是直接匹配的指令名
"enable": true,
// enable 功能是否开启
"entry": "GetFishCal",
// entry 调用插件接口
"groupBlackList": {
"一群单身狗": true,
"洋佬带下俺8": true
}
// groupBlackList 功能开启的情况下群聊黑名单,如果群聊名在黑名单中为true,那么此功能即使开启也不会在此群聊生效
},
"抽签": {
"enable": true,
"entry": "DrawLots",
"groupBlackList": {
"OW灌水群": true
}
}
},
// feature 任务开关,这里两个任务是当前内置的,后续扩展需要把功能添加进来,不在列表内的不会生效
"mysql": {
"username": "root",
// username 用户名
"password": "root",
// password 密码
"ip": "127.0.0.1",
// ip 数据库ip地址
"port": 3306,
// ip 数据库端口
"dbname": "chouqian",
// dbname 数据库名
"charset": "utf8"
// charset 内容编码格式
}
// mysql 数据库配置,如果不需要数据库相关的功能,可以不配
}配置文件处理好之后就可以运行了,有两种方式
直接通过go run执行main.go,在linux上面可以通过screen来放在后台执行
go run ./robbot/cmd/main.go也可以通过go build构造可执行程序执行
go build ./robbot/cmd/main.go -o rabbot
chmod +x rabbot
./rabbot通过build执行时有两个可选参数
Usage of rabbot.exe:
-cfg-path string
config file path (default "./config/rabbot.config")
-data-path string
program data file path (default "./data")Note
运行起来之后会给出一个链接扫码登陆即可,但是手机上的微信退出的话机器人会一起退出。 解决方法:
- 两个手机
- 手机断网后退出登录,然后登陆其他账号再联网(退出登录时候需要多等一会)
在./rabdata/tmp/目录下新建一个文件RabDbg,源码中Debug级别的日志就会输出
本框架下的插件业务代码统一放在rabmod包中(当前仅支持全匹配)
在本框架下添加插件需要以下操作(以抽签插件为例)
- 将业务代码放到/rabbot/internal/rabmod/下(新增一个drlots.go)
- 业务代码中添加init,将函数入口信息放在全局的map中(这里map的key要能和配置文件中的entry对应上)
func init() {
common.FuncNameMap["DrawLots"] = DrawLots
}- 业务代码coding...
Important
插件入口函数的参数和返回值需和框架中保持一致
func DrawLots(uname, uuid string) (*common.ReplyStruct, error)- 修改配置文件,在features下添加对应插件的信息即可
"抽签": {
"enable": true,
"entry": "DrawLots",
"groupBlackList": {
"OW灌水群": true
}
}- Openwechat - golang微信SDK
- Wechatbot — 为个人微信接入ChatGPT
- Standard-readme - A standard style for README files
非常欢迎你的加入!提一个 Issue 或者提交一个 Pull Request。
标准 Readme 遵循 Contributor Covenant 行为规范。
MIT © Richard Littauer