如何部署

How to deploy

部署 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 rm dicerobot

然后重新创建容器(和之前创建容器的命令不同):

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

然后运行初始化脚本:

bash init.sh

根据提示输入机器人的 QQ 号及密码(仅用于配置 Mirai Console 的自动登录),等待脚本执行完毕即可。

接下来需要根据 初次运行 的说明完成登录验证,然后根据 启动/结束 DiceRobot 的说明启动 DiceRobot 和 Mirai,最后退出容器即可:

exit

退出容器后,如果需要启动/结束 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

根据提示输入机器人的 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

然后安装 Swoole 所需的 cURL 库:

sudo dnf -y install curl-devel

接下来安装 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

接下来下载并解压 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 文件,将其中的 10000yourpassword 分别替换为机器人的 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/

然后使用 Composer 创建 DiceRobot Skeleton 项目,其中已经包含了 DiceRobot 完整运行所需要的设置项及引用文件:

composer --no-interaction create-project drsanwujiang/dicerobot-skeleton:3.1.0 dicerobot --no-dev

最后修改 DiceRobot 的配置文件,打开 dicerobot/config/custom_config.php 文件,其中:

  • 10000 修改为机器人的 QQ

  • 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。

最后更新于