虽然本站域名叫sagiri,本文标题提到的的QQ机器人也叫sagiri,但是实际上这个机器人并不是笔者开发的,出现这种巧合单纯只是因为笔者与这个机器人的作者都喜欢sagiri为什么有一种被NTR的感觉

在另一篇博文关于我想拥有自己的QQ机器人,及我的失败经历中,我展现了我从兴致高昂地试图跟着云游的教程搭建机器人、到屡败屡战顽强不屈、最终心态大崩决定放弃的失败经历。

雄关漫道真如铁,而今迈步从头越。笔者并不是一个轻言放弃的人主要还是放假太闲了!在遭受了这样惨痛的失败后,依然痛定思痛,继续探索搭建QQ机器人的方法。

很幸运的是,我在GitHub上找到了这样一个利用python开发的mirai机器人:

sagiri-bot

虽然我运行el-bot失败了,但是我能够成功使用mcl启动mirai-console,这让我更换机器人框架的成本大大降低。

开始

sagiri是一个完善的、可以直接运行的QQ机器人,和el-bot一样,都是基于mirai框架;只不过el-bot用js/ts开发,而sagiri用python开发。

故事的开始,起源于我失败的el-bot搭建经历(见上文链接)。彼时的笔者心灰意冷,并觉得云游的项目实在是太坑了,进而决定放弃通过javascrip开发mirai机器人,转而投向更热门的python方向。于是我在GitHub上搜索mirai python,很快发现了本文要讲述的项目。

部署于本地

处于方便管理等因素,我选择的项目文件夹结构为

luka-sagiri-mirai
├── mcl
├── sagiri-bot

其中luka-sagiri-mirai为整个项目的目录,mcl为mirai框架启动目录,sagiri-bot为我克隆sagiri机器人的目录。

跟随着官方文档

启动mcl

在mcl目录中,配置好mirai-api-http-v2

配置mcl\config\net.mamoe.mirai-api-http\setting.yml文件如下:

adapters:
- http
- ws
debug: false
enableVerify: true
verifyKey: liuyan # 可以自己设定, 后续会用到
singleMode: false
cacheSize: 4096 # 可选, 缓存大小, 默认4096. 缓存过小会导致引用回复与撤回消息失败
adapterSettings:
## 详情看 http adapter 使用说明 配置
http:
    host: localhost
    port: 8080 # 端口可选,后续会用到
    cors: [*]

## 详情看 websocket adapter 使用说明 配置
ws:
    host: localhost
    port: 8080 # 端口同上
    reservedSyncId: -1 # 确保为 -1, 否则 WebsocketAdapt

启动mcl。

启动bot

在主目录中

git clone https://github.com/SAGIRI-kawaii/sagiri-bot.git sagiri-bot

cd sagiri-bot

配置python环境pip install -i https://pypi.doubanio.com/simple/ -r .\requirements.txt

PS. 原指令为pip install -r requirements.txt,而上面的指令是我在QQ群中问问题时一位群友告诉我的,这里感谢群友。

PSS. 我在这一步遇到了不大不小的麻烦。我之前试图跑过python-mirai项目,安装了graia-application-mirai包(虽然最后并没有跑起来),所以在这一步,这个包让我配置的环境出了问题。后来我删除了graia-application-mirai包,解决问题。

在sagiri-bot文件夹下找到configdemo.yaml并修改如下:

# 必要数据及设置
bot_qq: 2775446955 #bot QQ
host_qq: 2937818202 #主人QQ
mirai_host: http://localhost:8080 
#本地端口,可任意选择,但要与mcl\config\net.mamoe.mirai-api-http\setting.yml中的保持一致

verify_key: liuyan
db_link: sqlite+aiosqlite:///sagiribot.db 
#数据库链接,见项目README。

web_manager_api: true
web_manager_auto_boot: true
proxy: proxy

# 路径相关
image_path:
setu: setu
setu18: setu18 #R18
real: real #三次元
real_highq: real_highq #高质量三次元
wallpaper: wallpaper #壁纸
sketch: sketch #线稿

# 功能相关
functions:
tencent:
    secret_id: secret_id
    secret_key: secret_key
saucenao_api_key: saucenao_api_key
wolfram_alpha_key: wolfram_alpha_key
shadiao_app_name: shadiao_app_name

# 日志相关
log_related:
error_retention: 14
common_retention: 7

# 数据相关
data_related:
lolicon_image_cache: true #缓存lolicon api获得图片
network_data_cache: true #缓存lolicon api获取json
automatic_update: false #自动更新
data_retention: true #退群后数据处理

# 数据库相关
database_related:
mysql:
    pool_size: 40
    max_overflow: 60

configdemo.yaml文件更名为config.yaml

注:需自行安装数据库。SQLite快速入门教程

在sagiri-bot目录下运行一次bot:python main.py。bot应会自动退出。

寻找alembic.ini文件,打开,将sqlalchemy.url项更换为configdemo.yaml中的db_link项。以我为例:

sqlalchemy.url = sqlite:///sagiribot.db

再次启动,成功。

9.png

以上。

sagiri机器人使用文档

bot的events代码位置:sagiri_bot\handler\required_module\mirai_event\mirai_events.py

部署至云端

作为一个机器人,需要全天候24小时为群友服务,那么只部署在本地自然是不行的,如果我关了电脑,那机器人也将随之下线。所以我决定将机器人部署至云端。

在云端部署机器人,需要在云端复刻本地端的环境、代码、操作过程。写到这里感慨还好我记录了在本地部署机器人的步骤,否则在云端部署机器人又要麻烦半天。即使如此,由于云服务器的控制台没有图形界面,我在部署过程中依然遭遇了许多困难。

向云服务器传输文件

我使用WinScp来传输文件。参考文章

Windows 系统通过 WinSCP 上传文件到 Linux 轻量应用服务器

省流:
默认用户名root
ubuntu实例默认ubuntu
密码忘了直接重置

WinScp远程下载报错:无法创建文件夹 系统错误。代码:5。 拒绝访问。问题解决(亲测有效)

省流:
高级-环境-STFP-STFP服务器:sudo usr/lib/openssh/sftp-server
高级-环境-shell-Shell:sudo -i

winscp:无法初始化SFTP协议。主机是SFTP服务器吗?

省流:
登录界面把文件协议改为SCP

使用VNC viewer对云服务器进行远程操作

参考文章:

本地Windows远程连接阿里云服务器图形界面(使用vnc viewer)

阿里云服务器Ubuntu 18.04安装图形界面(ubuntu-desktop)(以及解决困扰我多天的vnc viewer界面灰屏的问题!震惊我自己)

省流:
这个过程有点繁琐,省不了流


关于VNC viewer无法粘贴的问题:
命令行上没有好的解决方法;文件方面可以用WinScp配合VNC viewer,在远程服务器上和本地“共享”某个文件,来回粘贴代码。

注意:魔法上网的时候无法连接VNC!


部署

部署过程在文档中写得很详细:sagiri-bot在Linux环境中的部署

按照文档一步一步做就可以了!

部署成功截图:

部署成功.png

云服务器状态.png

我觉得很不错嘛!