部署 DiceRobot 十分简单!
Docker 部署(推荐)
使用 Docker 部署可以免去安装各种环境可能出现的问题,同时适合在现有服务器上部署,非常推荐!
创建容器
首先拉取 DiceRobor 的 Docker 镜像:
docker pull drsanwujiang/dicerobot:3.1.0
然后创建容器:
docker run -d \
--name dicerobot \
--publish 9500:9500 \
--volume /root/dicerobot:/root/dicerobot \
--volume /root/mirai:/root/mirai \
--volume /sys/fs/cgroup:/sys/fs/cgroup:ro \
--privileged drsanwujiang/dicerobot:3.1.0
其中,冒号左侧的9500
为 DiceRobot 实际使用的端口,冒号左侧的/root/dicerobot
为 DiceRobot 文件实际所在目录,冒号左侧的/root/mirai
为 Mirai 文件实际所在目录,可根据需要修改。
之后查看容器的运行状态:
docker inspect --format="{{.State.Status}}" dicerobot
正常情况下应该显示running
:
如果显示exited
,则表示容器创建失败,那么先使用以下命令删除容器:
然后重新创建容器(和之前创建容器的命令不同):
docker run -d \
--name dicerobot \
--publish 9500:9500 \
--volume /root/dicerobot:/root/dicerobot \
--volume /root/mirai:/root/mirai \
--privileged drsanwujiang/dicerobot:3.1.0
初始化
创建完容器后,需要对环境进行初始化才能运行 DiceRobot。
首先进入刚才创建的容器:
docker exec -it dicerobot /bin/bash
然后运行初始化脚本:
根据提示输入机器人的 QQ 号及密码(仅用于配置 Mirai Console 的自动登录),等待脚本执行完毕即可。
接下来需要根据 初次运行 的说明完成登录验证,然后根据 启动/结束 DiceRobot 的说明启动 DiceRobot 和 Mirai,最后退出容器即可:
退出容器后,如果需要启动/结束 DiceRobot,必须先使用docker exec -it dicerobot /bin/bash
命令进入容器。
停止/删除容器
退出后,容器会在后台保持运行,即使 DiceRobot 和 Mirai 退出也不会停止。所以如果需要结束、删除容器,请使用以下命令:
docker stop dicerobot
docker rm dicerobot
删除容器时不会删除 DiceRobot 和 Mirai 目录,无需担心数据丢失,同时方便迁移数据。
一键部署
一键部署脚本已在 Debian 9/10、Ubuntu 16.04/18.04/20.04、CentOS 8 系统中完成测试。我们建议在全新安装的系统中运行此脚本,在现有的系统中运行脚本可能带来未知的影响。
运行脚本
只需要两行命令,就可以一键部署 DiceRobot。
wget https://cdn.jsdelivr.net/gh/drsanwujiang/dicerobot-fast-deployment@3.1/dicerobot-deployment-centos.sh
sudo bash dicerobot-deployment-centos.sh
wget https://cdn.jsdelivr.net/gh/drsanwujiang/dicerobot-fast-deployment@3.1/dicerobot-deployment-debian.sh
sudo bash dicerobot-deployment-debian.sh
wget https://cdn.jsdelivr.net/gh/drsanwujiang/dicerobot-fast-deployment@3.1/dicerobot-deployment-ubuntu.sh
sudo bash dicerobot-deployment-ubuntu.sh
根据提示输入机器人的 QQ 号及密码(仅用于配置 Mirai Console 的自动登录),等待脚本执行完毕即可。
其他 Linux 系统请使用 Docker 部署,或参考手动部署的教程进行部署。
接下来根据 初次运行 的说明完成登录验证,然后根据 启动/结束 DiceRobot 的说明启动 DiceRobot 和 Mirai 即可。
手动部署
手动部署需要了解基本的 Linux 指令及操作。
安装 PHP 及 Swoole
首先添加存储库并安装 PHP:
sudo dnf install -y epel-release
sed -e 's!^metalink=!#metalink=!g' -e 's!^#baseurl=!baseurl=!g' -e 's!//download.fedoraproject.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' -e 's!http://mirrors.tuna!https://mirrors.tuna!g' -i /etc/yum.repos.d/epel*
sudo dnf install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-8.rpm
sed -e 's!^mirrorlist=!#mirrorlist=!g' -e 's!^#baseurl=!baseurl=!g' -e 's!http://rpms.remirepo.net!https://mirrors.tuna.tsinghua.edu.cn/remi!g' -i /etc/yum.repos.d/remi*
sudo dnf makecache
sudo dnf module enable -y php:remi-7.4
sudo dnf install -y php-cli php-curl php-json php-mbstring php-zip php-devel php-pear
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common lsb-release
wget -q -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://mirror.sjtu.edu.cn/sury/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/PHP.list
sudo apt update
sudo apt install -y php7.4-cli php7.4-curl php7.4-json php7.4-mbstring php7.4-zip php7.4-dev php-pear
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common lsb-release
add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y php7.4-cli php7.4-curl php7.4-json php7.4-mbstring php7.4-zip php7.4-dev php-pear
然后安装 Swoole 所需的 cURL 库:
sudo dnf -y install curl-devel
sudo apt install -y libcurl4-openssl-dev
接下来安装 Swoole,这一步会在编译时启用 Sockets 支持、启用 OpenSSL 支持、启用 HTTP/2 支持、关闭 MySQL ND 支持、启用 JSON 支持、启用 cURL 支持:
printf "yes\nyes\nyes\nno\nyes\nyes\n" | pecl install https://dl.drsanwujiang.com/dicerobot/swoole/swoole-4.7.0.tgz
然后在 PHP 中启用 Swoole 扩展:
echo "extension=swoole.so" > /etc/php/7.4/mods-available/20-swoole.ini
ln -s /etc/php/7.4/mods-available/20-swoole.ini /etc/php/7.4/cli/conf.d/20-swoole.ini
部署 Mirai
首先安装 UnZIP 及运行 Mirai 所需的 Java 11 环境:
cat > /etc/yum.repos.d/AdoptOpenJDK.repo << EOF
[AdoptOpenJDK]
name=AdoptOpenJDK
baseurl=https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/rpm/centos\$releasever-\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public
EOF
dnf makecache
dnf install -y adoptopenjdk-11-hotspot unzip
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
echo "deb https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/deb $(lsb_release -sc) main" > /etc/apt/sources.list.d/AdoptOpenJDK.list
sudo apt update
sudo apt install -y adoptopenjdk-11-hotspot unzip
接下来下载并解压 Mirai 环境:
wget -qO mirai.zip https://dl.drsanwujiang.com/dicerobot/mirai/mirai-mcl-2.3.1.zip
mkdir -p mirai
unzip -qq -o mirai.zip -d mirai
rm -f mirai.zip
然后配置自动登录,打开 mirai/config/Console/AutoLogin.yml
文件,将其中的 10000
和 yourpassword
分别替换为机器人的 QQ 及密码即可:
accounts:
-
account: 10000
password:
kind: PLAIN
value: yourpassword
configuration:
protocol: ANDROID_PHONE
最后配置 Mirai API HTTP 插件,打开 mirai/config/net.mamoe.mirai-api-http/setting.yml
文件,写入以下内容:
adapters:
- http
- webhook
enableVerify: false
verifyKey: 12345678
singleMode: true
cacheSize: 4096
adapterSettings:
http:
host: 127.0.0.1
port: 8080
cors:
- *
webhook:
destinations:
- "http://127.0.0.1:9500/report"
其中,8080
为 Mirai API HTTP 插件的端口,9500
为 DiceRobot 的端口,如有需要可以修改这两个端口,其他配置一般不需要更改。
DiceRobot 3 需要 Mirai 工作在“单 Session 模式(Single Mode)”,同时关闭认证流程,所以不建议在现有环境部署,也不能开启 Mirai 多账号登录。
部署 DiceRobot
首先安装 Composer 包管理器:
wget -qO composer-setup.php https://install.phpcomposer.com/installer
php composer-setup.php
rm -f composer-setup.php
mv -f composer.phar /usr/bin/composer
composer --no-interaction config -g repo.packagist composer https://mirrors.aliyun.com/composer/
wget -qO composer-setup.php https://install.phpcomposer.com/installer
php composer-setup.php
rm -f composer-setup.php
mv -f composer.phar /usr/local/bin/composer
composer --no-interaction config -g repo.packagist composer https://mirrors.aliyun.com/composer/
然后使用 Composer 创建 DiceRobot Skeleton 项目,其中已经包含了 DiceRobot 完整运行所需要的设置项及引用文件:
composer --no-interaction create-project drsanwujiang/dicerobot-skeleton:3.1.0 dicerobot --no-dev
最后修改 DiceRobot 的配置文件,打开 dicerobot/config/custom_config.php
文件,其中:
DiceRobot 的端口 9500
、Mirai API HTTP 插件的端口 8080
以及 Auth Key 12345678
需要和 Mirai API HTTP 插件的配置文件保持一致
日志等级可以根据需要修改(INFO 将包括详细的工作流程,DEBUG 将包括数据包信息),日志文件将保存在 dicerobot/logs
目录中
<?php
use Monolog\Logger;
/**
* 自定义配置
*/
/******************************************************************************
* 必填项 *
******************************************************************************/
/**
* 在这里填写机器人的 QQ 号,以及 Mirai API HTTP 插件中的 Auth Key
*/
$settings["mirai"]["robot"] = [
"id" => 10000,
"authKey" => "12345678"
];
/******************************************************************************
* 常用项 *
******************************************************************************/
/**
* 在这里填写 Mirai API HTTP 插件监听的端口
*/
$settings["mirai"]["server"]["port"] = 8080;
/**
* 在这里填写 DiceRobot 监听的端口
*/
$settings["dicerobot"]["server"]["port"] = 9500;
/**
* 在这里设置日志等级,file 表示日志文件的等级,console 表示控制台日志的等级
*/
$settings["log"]["level"] = [
"file" => Logger::NOTICE,
"console" => Logger::CRITICAL
];
设置服务
在 Linux 系统中,可以像管理 Apache、Nginx 一样使用 systemctl 命令管理 DiceRobot 和 Mirai。
创建 /etc/systemd/system/dicerobot.service
文件,写入以下内容:
[Unit]
Description=A TRPG dice robot based on Swoole
After=network.target
After=syslog.target
Before=mirai.service
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/bin/php /root/dicerobot/dicerobot.php
ExecReload=/bin/kill -12 $MAINPID
RestartSec=1s
RestartForceExitStatus=99
[Install]
WantedBy=multi-user.target
创建 /etc/systemd/system/mirai.service
文件,写入以下内容:
[Unit]
Description=Mirai Console
After=network.target
After=syslog.target
After=dicerobot.service
[Service]
Type=simple
WorkingDirectory=/root/mirai
ExecStart=/bin/bash /root/mirai/start-mirai.sh
ExecStop=/bin/bash /root/mirai/stop-mirai.sh
[Install]
WantedBy=multi-user.target
如果将 DiceRobot、Mirai 部署在了其他文件夹,那么记得修改 /root/dicerobot
和 /root/mirai
这两个路径。
最后重启系统服务管理器:
systemctl daemon-reload
部署完成
到这里,DiceRobot 就部署完毕了。
接下来根据 初次运行 的说明完成登录验证,然后根据 启动/结束 DiceRobot 的说明启动 DiceRobot 和 Mirai 即可。
初次运行
部署完毕后需要先手动运行一次 Mirai,从而完成 QQ 登录所需的一系列验证。一般情况下会出现滑块验证、安全验证这两项验证。
执行下面的命令,启动 Mirai:
cd mirai
sudo bash first-start-mirai.sh
滑块验证
Mirai 自动登录后,会出现如图所示的提示。选中红圈所示的滑块验证码地址,按鼠标左键复制(千万不要 Ctrl + C):
之后,我们需要准备一下 QQ 滑块验证码所需的验证环境。准备一台拥有桌面系统的电脑,并且安装了支持 DevTools 的任意浏览器(例如 Google Chrome,Microsoft Edge,Firefox),打开新的无痕窗口,按 F12 打开开发者工具,点击图中红圈所示的小按钮切换为移动设备模式:
在无痕窗口中打开刚才复制的滑块验证码地址:
然后点击 Console 选项卡,输入以下代码然后按回车,如下方红圈所示:
(()=>{let c=window.prompt;function r(e){var r="jsbridge://CAPTCHA/onVerifyCAPTCHA?p=";if(e.startsWith(r)){let t=e.substring(r.length);for(let e=t.length;e--;e){var o=t.substr(0,e);console.log(o);try{var n=decodeURIComponent(o),i=JSON.parse(n);console.log(i),window.miraiSeleniumComplete=n,c("MiraiSelenium - ticket",i.ticket);break}catch(e){}}return 1}}(()=>{let t=Object.getOwnPropertyDescriptor(Image.prototype,"src");Object.defineProperty(Image.prototype,"src",{get:t.get,set:function(e){r(e)||t.set.call(this,e)}})})(),(()=>{let t=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,"src");Object.defineProperty(HTMLIFrameElement.prototype,"src",{get:t.get,set:function(e){r(e)||t.set.call(this,e)}})})()})();
正常情况下会提示 undefined
,此时就可以拖动滑块完成验证了。完成之后会弹出一个对话框:
将其中的 Ticket 复制下来,回到 Mirai 的登录窗口,粘贴并回车,滑块验证就完成了。
安全验证
完成滑块验证后,还有可能出现安全验证:
安全验证需要你在电脑上打开红圈所示的验证地址,用登录了机器人 QQ 的手机去扫码。
如果验证界面中没有扫码验证的选项,将验证地址中的 “verify” 改成 “qrcode”(https://ti.qq.com/safe/verify?... -> https://ti.qq.com/safe/qrcode?...)再打开就可以看到扫码验证的选项了。
完成验证后按回车,出现以下提示就可以按 Ctrl + C 结束 Mirai 了。
启动/结束 DiceRobot
现在,就可以使用以下命令启动 DiceRobot 和 Mirai 了:
systemctl start dicerobot
systemctl start mirai
结束时,使用以下命令:
systemctl stop dicerobot
systemctl stop mirai
退出时,请先结束 DiceRobot 再结束 Mirai,以免 DiceRobot 产生警告。
当然,你也可以在启动 DiceRobot 后使用 控制面板 来启动/结束 Mirai 以及结束 DiceRobot。