给群整个妈:HoshinoBot 安装及插件编写

给群整个妈:HoshinoBot 安装及插件编写

Fooliam mob

作为一名公主连结玩家,尤其作为是摸鱼会长,为了更好的组织成员打公会战和交♂流感情,给群里加入一个机器人(妈)将是不二的选择!说实话,当初配置(调教)妈也用了好几天,各种奇怪的bug和环境问题老难受,老折磨了≧ ﹏ ≦。为了新人避坑,就写个简单的教程吧,有空就写下怎么编一个简单的插件。

一. 准备

需要的东西主要有三样如下:服务器go-cqhttp或者miraiHoshinoBot

【12.17更新】更新mirai的食用方法。因为go-cqhttp使用中有大量的风险管控,会吞掉许多消息,所以如果真的想搞事建议使用mirai而不是go-cqhttp(当然go-cqhttp也不是绝对安全的)。

演示用版本:

服务器:CentOS 7.8,64位

Java:java 8/11

框架:go-cqhttp-v0.9.31 /mirai

HoshinoBot:最新即可

二. 结构说明

实际上,HoshinoBot是有一键安装脚本 的,但是这个脚本为了兼容环境用到了docker,虽然docker是有很多好处,但是要频繁更改机器人的配置和调试,稍微有点不方便(其实是不怎么会docker),所以就直接选择了screen挂起就好。为了后续开发,我觉得有必要讲下go-cqhttp和HoshinoBot的各自任务和交互方式。

20201125211355.png

如图,go-cqhttp相当于一个QQ客户端,负责接收群里(或者用户)的消息以及发送消息,在在基层。HoshinoBot为真正的机器人,与go-cqhttp通过反向ws建立连接(也可以ws或者http),go-cqhttp会转发一切收到的合法的消息给HoshinoBot,而HoshinoBot可以检测关键词产生回复。回复还是要先发给go-cqhttp,然后才能发到群里。除了被动发送消息,HoshinoBot本身可以设置定时任务等,主动发出消息。

emmm,还是挺清晰的结构,只要确保环回反向ws的时候两者的端口一致就可以进行通信。

三. 安装本体

1. 安装go-cqhttp

github上的releases库:https://github.com/Mrs4s/go-cqhttp/releases

用uname指令查看系统架构

1
uname -a 

如果显示x86_64则为64位系统,对应amd64

根据自己的系统版本选择相应的包下载,最新版本我不是很推荐,因为用go-cqhttp-v0.9.31-fix2的时候,出现了大量“账号被风控”的情况,导致图片发不出去(才,才不是因为发的是涩图),后面测试发现go-cqhttp-v0.9.31就没这个奇怪的bug了。 这里我选择的包为go-cqhttp-v0.9.31-linux-amd64(https://github.com/Mrs4s/go-cqhttp/releases/download/v0.9.31/go-cqhttp-v0.9.31-linux-amd64)。

打开linux终端,依次输入如下指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#新建一个screen窗口并进入
#如果没有该命令则yum install screen安装,可以学下screen的简单用法
screen -S gocqhttp

#创建文件夹
sudo mkdir /home/qqbot/gocqhttp
cd /home/qqbot/gocqhttp

#下载包,也可以本地上传
#如果慢可以试下,还是本地挂代理下载比较快
#sudo wget https://hub.fastgit.org/Mrs4s/go-cqhttp/releases/download/v0.9.31/go-cqhttp-v0.9.31-linux-amd64
sudo wget https://github.com/Mrs4s/go-cqhttp/releases/download/v0.9.31/go-cqhttp-v0.9.31-linux-amd64

#第一次试运行
sudo chmod 755 ./go-cqhttp-v0.9.31-linux-amd64
sudo ./go-cqhttp-v0.9.31-linux-amd64

#运行后提示[INFO]: 默认配置文件已生成, 请编辑 config.json 后重启程序.
#这时候ls查看当前目录下会发现多了许多文件,我们需要配置config.json

config.json文件里需要配置QQ账号和密码,反向ws的路径尤其是端口号。go-cqhttp支持三种协议,可以根据需求开启。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
"uin": 你的QQ账号,
"password": "你的QQ密码",
"encrypt_password": false,
"password_encrypted": "",
"enable_db": true,
"access_token": "#建议设置token提高安全性",
"relogin": {
"enabled": true,
"relogin_delay": 3,
"max_relogin_times": 0
},
"_rate_limit": {
"enabled": false,
"frequency": 1,
"bucket_size": 1
},
"ignore_invalid_cqcode": false,
"force_fragmented": false,
"heartbeat_interval": 0,
#http协议配置
"http_config": {
#不用就关了吧,防止端口占用冲突
"enabled": false,
"host": "0.0.0.0",
"port": 5700,
"timeout": 0,
"post_urls": {}
},
#正向ws配置
"ws_config": {
#不用就关了吧,防止端口占用冲突
"enabled": false,
"host": "0.0.0.0",
"port": 6700
},
#反向ws配置
"ws_reverse_servers": [
{
#默认关闭,要打开
"enabled": true,
#设置url,8080端口和'/ws/'这个部分路径与HoshinoBot的配置相关联,设置了url下面的就不用管了
"reverse_url": "ws://127.0.0.1:8080/ws/",
"reverse_api_url": "ws://you_websocket_api.server",
"reverse_event_url": "ws://you_websocket_event.server",
"reverse_reconnect_interval": 3000
}
],
"post_message_format": "string",
"use_sso_address": false,
"debug": false,
"log_level": "",
"web_ui": {
"enabled": true,
"host": "127.0.0.1",
"web_ui_port": 9999,
"web_input": false
}
}

配置完成后就可以尝试第二次运行go-cqhttp。

请一定留意以上两条:

  1. 最好使用新账号
  2. 登录帐号成功后至少一个星期内请不要在手机或者其他设备登录QQ,否则会引起异地登录导致封号
1
2
3
4
5
6
7
8
#再次运行
sudo ./go-cqhttp-v0.9.31-linux-amd64
#最后进入go-cqhttp的控制台就是成功了
#可以尝试给机器人qq发消息,理论上go-cqhttp的控制台会显示出来

#挂起这一个screen
ctrl + a + d
#再次进入这个screen可以screen -r gocqhttp

20201126085628.png

到这里go-cqhttp就安装完成了。比较可能出现的问题是运行go-cqhttp-v0.9.31-linux-amd64 失败,请确保给足权限。还有就是启动失败,结合控制台的信息查看是不是端口占用了,再去解决。

1.1 安装mirai

此点作为补充,个人是建议使用mirai而不是go-cqhttp,如果需要考虑发送消息的安全性,则可直接跳过本点,直接安装HoshinoBot

mirai的下载和启动方法十分复杂,直接使用方便快捷的启动器MCL(mirai-console-loader)

进入服务器终端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#新建screen
screen -S mirai

#新建目录
sudo mkdir /home/qqbot/mirai
cd /home/qqbot/mirai

#从Release中下载最新版的zip:https://github.com/iTXTech/mirai-console-loader/releases,这里我选择v1.0.3
#url为https://github.com/iTXTech/mirai-console-loader/releases/download/v1.0.3/mcl-1.0.3.zip
sudo wget https://github.com/iTXTech/mirai-console-loader/releases/download/v1.0.3/mcl-1.0.3.zip
#解压到当前目录
sudo unzip -o -d ./ ./mcl-1.0.3.zip

#第一次运行mcl
sudo java -jar mcl.jar
#此时会自动下载控制台和核心的jar,下载成功会提示'mirai-console started successfully'并进入交互控制台

#输入exit退出控制台
> exit

#ls查看当前目录确保有plugins,config等文件夹

#然后下载配置NoneBot插件
#从Release中下载最新版的mirai-jar:https://github.com/yyuueexxiinngg/onebot-kotlin/releases
#这里我选择onebot-mirai-0.3.3-all.jar
#url为https://github.com/yyuueexxiinngg/onebot-kotlin/releases/download/0.3.3/onebot-mirai-0.3.3-all.jar
cd /home/qqbot/mirai/plugins
sudo wget https://github.com/yyuueexxiinngg/onebot-kotlin/releases/download/0.3.3/onebot-mirai-0.3.3-all.jar

cd ..
#再次运行mcl
sudo java -jar mcl.jar
#最后提示'1 plugin(s) enabled'即成功加载插件

#输入exit退出控制台,一定要先退出才能编辑配置,否则修改配置无效
> exit

然后我们需要编辑配置文件,进入/home/qqbot/mcl/config/OneBot,修改settings.yml,主要修改ws_reverse部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
proxy: ''
bots:
#12345654321改成qq号码
12345654321:
cacheImage: false
cacheRecord: false
heartbeat:
enable: false
interval: 1500
http:
enable: false
host: 0.0.0.0
port: 5700
accessToken: ''
postUrl: ''
postMessageFormat: string
secret: ''
# 上报超时时间, 单位毫秒, 须大于0才会生效
timeout: 0
ws_reverse:
#enable改成true,开启反向ws
- enable: true
postMessageFormat: string
reverseHost: 127.0.0.1
#reversePort为8080,与HoshinoBot相同
reversePort: 8080
accessToken: ''
#reversePath为/ws,与HoshinoBot相同
reversePath: /ws
reverseApiPath: /api
reverseEventPath: /event
useUniversal: true
useTLS: false
reconnectInterval: 3000
ws:
enable: false
postMessageFormat: string
wsHost: 0.0.0.0
wsPort: 6700
accessToken: ''

然后修改自动登录的信息,进入/home/qqbot/mcl/config/Console,修改AutoLogin.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
accounts: 
- # 账号, 现只支持 QQ 数字账号,修改123456为qq号码
account: 123456
password:
# 密码种类, 选择默认的PLAIN
kind: PLAIN
# 密码内容,输入对应的qq密码
value: pwd
# 账号配置. 可用配置列表 (注意大小写):
# "protocol": "ANDROID_PHONE" / "ANDROID_PAD" / "ANDROID_WATCH"
configuration:
#第一次自动登录选择ANDROID_PAD,否则会无法登录,之后建议改为ANDROID_PHONE
protocol: ANDROID_PAD

然后再次运行 mcl:

1
2
3
4
5
6
cd /home/qqbot/mirai
#第三次启动mcl
sudo java -jar mcl.jar
#最后提示'Login successful'表示登录成功

#最后ctrl + a + d 挂起screen

当然挂起screen前你可以输入exit退出mcl控制台,回到配置AutoLogin.yml的一步,修改configurationprotocolANDROID_PHONE,以便接收类似戳一戳等只有在手机端才能接收的消息类型,然后再启动mcl。

至此,mirai安装完成。

2. 安装HoshinoBot

HoshinoBot的安装非常简单,最难受的估计就是python的环境和模块下载了。

请确保python版本 >= 3.8

怎么安装python3.8和配置环境变量不多说了,虽然很烦,但是教程挺多的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#新建另一个screen
screen -S hoshino

#下载
cd /home/qqbot
git clone https://github.com/Ice-Cirno/HoshinoBot.git
cd HoshinoBot

#安装依赖
#注意用sudo pip安装的话也要用sudo python运行,不然会找不到包
sudo pip3 install -r requirements.txt

cd hoshino
#重命名下文件夹
mv config_example config

我们观察下hoshino文件夹下的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
config #配置文件夹
modules #模组存放文件夹

#以下消息操作的函和基本操作的封装
util
aiorequests.py
__init__.py
log.py
msghandler.py
priv.py R.py
service.py
trigger.py
typing.py

然后我们要配置HoshinoBot,需要修改hsohino目录下的__bot__.py,原来的备注就说明得很清楚了,我们主要是修改端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""这是一份实例配置文件

将其修改为你需要的配置,并将文件夹config_example重命名为config
"""

# hoshino监听的端口与ip
#原本是8080,我们改为8080,与go-cqhttp对应
PORT = 8080
HOST = '127.0.0.1' # 本地部署使用此条配置(QQ客户端和bot端运行在同一台计算机)
# HOST = '0.0.0.0' # 开放公网访问使用此条配置(不安全)

DEBUG = False # 调试模式

#此条和下面一条要改,超级qq号可以写自己qq,昵称我写了'妈'
SUPERUSERS = [10000] # 填写超级用户的QQ号,可填多个用半角逗号","隔开
NICKNAME = '' # 机器人的昵称。呼叫昵称等同于@bot,可用元组配置多个昵称

COMMAND_START = {''} # 命令前缀(空字符串匹配任何消息)
COMMAND_SEP = set() # 命令分隔符(hoshino不需要该特性,保持为set()即可)

# 发送图片的协议
# 可选 http, file, base64
# 当QQ客户端与bot端不在同一台计算机时,可用http协议
RES_PROTOCOL = 'file'
# 资源库文件夹,需可读可写,windows下注意反斜杠转义
RES_DIR = r'./res/'
# 使用http协议时需填写,原则上该url应指向RES_DIR目录
RES_URL = 'http://127.0.0.1:5000/static/'


# 启用的模块
# 初次尝试部署时请先保持默认
# 如欲启用新模块,请认真阅读部署说明,逐个启用逐个配置
# 切忌一次性开启多个
MODULES_ON = {
'botmanage',
'dice',
'groupmaster',
# 'hourcall',
# 'kancolle',
# 'mikan',
'pcrclanbattle',
'priconne',
# 'setu',
# 'translate',
# 'twitter',
}
1
2
3
4
5
6
cd /home/qqbot/HoshinoBot
sudo python3 ./run.py
#运行成功即可进入HoshinoBot得控制台
#为了验证可以对机器人发送消息'在?',如果有回复则成功

ctrl + a + d #挂起screen

20201126093453.png

具体的使用手册请查看https://github.com/Ice-Cirno/HoshinoBot

如果加了群之后机器人对该群的消息不回应,可以尝试重启go-cqhttp和HoshinoBot。

四. 安装插件

机器人的选择其实很多,可以去https://www.pcrbot.com/看看,但是个人觉得功能目前最强大还是HoshinoBot,因为有大量的插件可以使用,甚至yobot也能成为他的一个挂件。下面讲下怎么安装插件。

github项目:https://github.com/pcrbot

很多插件都可以在上面找到,HoshinoBot刚下载下来的时候也有很多插件。

HoshinoBot安装插件的方式大同小异,基本上是把插件拉进/hoshino/modules文件夹,然后在上面说过的__bot__.py的MODULES_ON选项添加模组的名字。部分插件安装方式可能有差别,具体看插件的README.md。

pcr模拟抽卡

HoshinoBot本身就带有pcr的抽卡,但是很抱歉的是没有包含各种静态资源(比如角色头像和卡池json),导致各种bug。为此,开发者编写了新的抽卡插件,不妨按照教程安装一波:https://github.com/pcrbot/gacha

1
2
3
4
5
6
7
8
9
cd /home/qqbot/HoshinoBot/hoshino/modules/priconne
#清除原来的目录
sudo rm gacha/ -rf
git clone https://github.com/pcrbot/gacha.git
cd gacha
#移动文件
sudo mv _pcr_data.py ../_pcr_data.py
sudo mv CHARA_NAME.json ../CHARA_NAME.json
sudo mv CHARA_PROFILE.json ../CHARA_PROFILE.json

使用更新卡池可以更新卡池,但是还抽不了卡,虽然新的角色头像在查询文件缺失的时候会自动下载,但网络真的不稳定…而且它只下载头像…各种静态资源还是需要预先下载。

我们之前在__bot__.py里我们设置了

1
RES_DIR = r'./res/'

表示静态资源存储在/home/qqbot/HoshinoBot/res/下,我们需要把静态资源扔到里面。所以静态资源哪里找?加开发者的群1044540742就能找到,为了偷懒就扔个链接:(我真的不想要百度云,但是暂时还没找到好的方式

1
2
链接:https://pan.baidu.com/s/1HQsCuOw3IsdKD-6uHJXRuA 
提取码:jpij

下载完解压得到的img文件夹扔到/home/qqbot/HoshinoBot/res/下即可

12.3 更新* 贴一波官方的下载地址

1
2
#https://drive.di.he.cn/res.tar.gz (暂时挂了) 
https://download.yobot.win/hoshinobot/res.tar.gz

然后重启HoshinoBot,再重启go-cqhttp,安装完成!

20201126111234.png

原神抽卡/娱乐

极其简单的安装方式,因为静态文件都已经集成在插件了,不用额外下载到res里。

项目地址:https://github.com/pcrbot/Genshin_Impact_bot

1
2
3
4
5
cd /home/qqbot/HoshinoBot/hoshino/modules/
git clone https://github.com/pcrbot/Genshin_Impact_bot.git
#如果下载速度是真滴慢,可以在本地下载完了再上传,但是要注意里面用了中文文件名,要注意文件名乱码问题
#乱码了用convmv改码
#convmv -f GBK -t UTF-8 --notest -r dict #dict表示目录

然后修改__bot__.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#...上面的略,只要在下面添加插件名即可
MODULES_ON = {
'botmanage',
'dice',
'groupmaster',
# 'hourcall',
# 'kancolle',
# 'mikan',
'pcrclanbattle',
'priconne',
# 'setu',
# 'translate',
# 'twitter',
'Genshin_Impact_bot'
}

理论上按照插件的教程做就好了,插件名字也会提示你怎么写,一般插件名字和插件文件夹名字相同(实际上插件名字是另外定义的)。

最后重启HoshinoBot(如果发现消息发不出去且go-cqhttp提示风控,那还要把go-cqhttp在HoshinoBot重启后重启一次)。

20201126113443.png

具体的玩法和指令看项目的README.md

先写到这,改天有空了再继续写怎么自定义插件和写插件

无聊的可以去摸一波官方的开发者文档:https://github.com/pcrbot/hoshinobot-development-documentation

12.3 更新:

HoshinoBot的开发团队更新了安装教程 ,写得比我的要详细和全面得多,特别是有把yobot当作HoshinoBot插件使用的部分。

那天开发者的qq群解散了,想找原因才就去上官网,结果发现了这份教程。,刚好是写完这篇东西不久。解散和发教程的原因,emmm,一言难尽,总之这种行为也太打击开发者的热情了。

 评论