Yes酱是一个会发s图的群管理机器人,基于 go-cqhttp,使用OneBot标准的插件开发的一个机器人,支持以下功能:
- 发送setu/猫猫图返回一张涩图/猫猫图
- 检测关键字禁言
- 私聊调教对话
本文主要参考了其官方博客,结合Yes酱的github和go-cqhttp的github的官方教程
最终实现的效果如下:
环境
- 系统:Windows 10 or Ubuntu 18.04
- 编辑器:Sublime Text 3(记事本也可)
- 浏览器:这里用的Chrome
- 框架:go-cqhttp
- Yes酱:Go-CQHTTP-YesBot
准备工作
注:由于该程序依赖的框架go-cqhttp有多处更新,因此在原版基础上进行了改良,详见Python开发QQ聊天机器人——进阶的yes酱部署与调教一文,本文仅留作纪念,不再维护
QQ号注册
一个手机号能够绑定十个QQ号,所以直接在官方网站注册QQ即可,注册完之后记得马上登陆并记下QQ号,最好保持活跃,否则会被收回
程序下载
在github下载go-cqhttp,windows 64位选择go-cqhttp_windows_amd64.exe
,linux选择go-cqhttp_0.9.40-fix5_linux_amd64.deb
:
在github下载Yes酱源码,可以使用Git下载,也可以直接网页下载解压即可:
程序配置
go-cqhttp配置
Windows的话直接双击运行下载好的EXE程序,会出现如图所示界面:
然后会自动在同级目录下生成一个config.hjson
的文件:
Linux的话直接sudo dpkg -i go-cqhttp_0.9.40-fix5_linux_amd64.deb
安装框架,然后在任意处使用命令go-cqhttp
启动程序,即会在当前目录下生成config文件
编辑该文件,编辑内容如下:
/*
go-cqhttp 默认配置文件
*/
{
// QQ号
uin: 123456789
// QQ密码
password: "XXXXX"
// 是否启用密码加密
encrypt_password: false
// 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
password_encrypted: ""
// 是否启用内置数据库
// 启用将会增加10-20MB的内存占用和一定的磁盘空间
// 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
enable_db: true
// 访问密钥, 强烈推荐在公网的服务器设置
access_token: ""
// 重连设置
relogin: {
// 是否启用自动重连
// 如不启用掉线后将不会自动重连
enabled: true
// 重连延迟, 单位秒
relogin_delay: 3
// 最大重连次数, 0为无限制
max_relogin_times: 0
}
// API限速设置
// 该设置为全局生效
// 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
// 目前该限速设置为令牌桶算法, 请参考:
// https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
_rate_limit: {
// 是否启用限速
enabled: false
// 令牌回复频率, 单位秒
frequency: 1
// 令牌桶大小
bucket_size: 1
}
// 是否忽略无效的CQ码
// 如果为假将原样发送
ignore_invalid_cqcode: false
// 是否强制分片发送消息
// 分片发送将会带来更快的速度
// 但是兼容性会有些问题
force_fragmented: false
// 心跳频率, 单位秒
// -1 为关闭心跳
heartbeat_interval: 0
// HTTP设置
http_config: {
// 是否启用正向HTTP服务器
enabled: true
// 服务端监听地址
host: 0.0.0.0
// 服务端监听端口
port: 5700
// 反向HTTP超时时间, 单位秒
// 最小值为5,小于5将会忽略本项设置
timeout: 0
// 反向HTTP POST地址列表
// 格式:
// {
// 地址: secret
// }
post_urls: {
"127.0.0.1:5701": secret
}
}
// 正向WS设置
ws_config: {
// 是否启用正向WS服务器
enabled: true
// 正向WS服务器监听地址
host: 0.0.0.0
// 正向WS服务器监听端口
port: 6700
}
// 反向WS设置
ws_reverse_servers: [
// 可以添加多个反向WS推送
{
// 是否启用该推送
enabled: false
// 反向WS Universal 地址
// 注意 设置了此项地址后下面两项将会被忽略
// 留空请使用 ""
reverse_url: ws://127.0.0.1:5701
// 反向WS API 地址
reverse_api_url: ws://127.0.0.1:5701
// 反向WS Event 地址
reverse_event_url: ws://127.0.0.1:5701
// 重连间隔 单位毫秒
reverse_reconnect_interval: 3000
}
]
// 上报数据类型
// 可选: string array
post_message_format: string
// 是否使用服务器下发的新地址进行重连
// 注意, 此设置可能导致在海外服务器上连接情况更差
use_sso_address: false
// 是否启用 DEBUG
debug: false
// 日志等级 trace,debug,info,warn,error
log_level: ""
// WebUi 设置
web_ui: {
// 是否启用 WebUi
enabled: true
// 监听地址
host: 127.0.0.1
// 监听端口
web_ui_port: 9999
// 是否接收来自web的输入
web_input: false
}
}
主要改动的有这么几处:
- 开头的QQ号和密码
- http设置里的
post_urls
- 反向ws设置中的三个url
linux版本配置
还没试过,配了再写
Yes酱配置
打开yes酱所在的文件夹,找到config.json
文件,配置如下:
{
"path":"E:\\test\\QQbot\\Go-CQHTTP-YesBot-master\\pic\\mao\\",
"ban_words":["科学上网","黑产","翻墙","huangse"],
"apikey":"",
"group":[987654321],
"self_qq":"123456789"
}
其中:
path
为项目文件夹下的pic
文件夹下的mao
文件夹地址,注意使用双反斜杠,末尾也有一个双反斜杠ban_words
为想要yes酱禁言的关键词-
apikey
为yes酱调用的setuAPI,可以去申请一个,也可以不填,申请方式如图所示:
group
为想要yes酱管理的群号,可以填写多个,用英文逗号分隔即可self_qq
为之前注册申请想要用来当机器人的QQ号
找到send_message
文件夹下的word_detect.py
文件,修改其第106行代码为:
local_img_url = "[CQ:image,file=file:///"+path+choice(setu_list)+"]"
程序运行
go-cqhttp运行
windows的话直接右键,以管理员权限运行即可:
Linux的话,使用命令nohup go-cqhttp &
后台运行:
初次运行会自动创建设备:
然后需要验证新设备以登录:
这里输入1
按下回车:
鼠标选中->
和<-
之间的网址,按下ctri+shift+C
复制链接,然后打开浏览器,在地址栏粘贴链接进入验证页面,在页面空白处右键单击检查
:
选择network
等候抓包:
然后手动拖动滑块,完成验证,查看右边抓到的包:
其中的ticket
即为需要在命令行输入的字符串。双击该字符串选中复制,随便找个地方粘贴出来看看再复制一遍,然后在命令行窗口单击鼠标右键即可粘贴进去,然后回车,即可看到登陆成功:
yes酱启动
windows的话在yes酱根目录下启动cmd命令行窗口,输入命令启动:
python main.py
linux的话使用命令nohup python main.py &
启动,可后台运行
yes酱启动:
程序效果
在群聊里艾特yes酱即可:
在群里艾特yes酱发送help即可获得菜单:
添加yes酱为好友之后,即可私聊开始调教(这里diy了一下yes酱回答的话语,原句是添加成功!
):
bug解决
注:由于该程序依赖的框架go-cqhttp有多处更新,因此在原版基础上进行了改良,详见Python开发QQ聊天机器人——进阶的yes酱部署与调教一文,本文仅留作纪念,不再维护
因为是第一次接触QQ机器人的开发,其中遇到了不少bug,这里记录下:
P1. 两边程序都没报错,yes酱也显示start
,但是在群里艾特她却没有回复
S1. 首先看看是不是自己的网络问题,网速如果太慢的话会需要等一会。这里我自己是因为go-cqhttp的config
配置不对,忘了配置反向ws配置
选项中的url为本地地址的5701端口,配置好了之后就解决了问题
P2. 猫猫图发送报错,显示路径不对
S2. 按照上述配置仔细检查修改即可
P3. 猫猫图发送内容为一串字符[CQ:image,file=file://E:NPC_Gocqhttppicmao0DEE3C4C2AE7A02C39C86F1E0F618B6A.png]
,而不是一张图片
S3. 修改路径为上述配置中的样子,并且找到send_message
文件夹下的word_detect.py
文件,修改其第106行代码为:
local_img_url = "[CQ:image,file=file:///"+path+choice(setu_list)+"]"
主要原因是因为file这个路径会吞掉一个字符,而按照原博主的设置又会报P2的错,因此直接修改源程序,在代码中加入这个字符即可
P4. 其他都ok,但是setu这个api几次之后就没有反应了
S4. 这是因为apikey为空的话每天可以调用的次数有限,按照setuAPI的申请方式申请一个apikey即可获得300次/天的调用次数