docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建

news2024/11/17 3:52:19

go-cqhttp,基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现,只需简单的配置, 就可以基于 go-cqhttp 使用框架开发,具有轻量, 原生, 高并发, 低占用, 跨平台等特点。

1 go-cqhttp 官网及可执行文件下载链接

  • go-cqhttp 官网:https://go-cqhttp.org/
  • 开发文档:https://docs.go-cqhttp.org/
  • 下载页连接:https://github.com/Mrs4s/go-cqhttp/releases,目前版本为1.2.0,在下载页的底部 Assets 的位置,您可以根据需要选择对应的版本,docker 的 alpine 系统下安装,我选 linux_amd64.tar.gz 压缩版本 。

图1  下载合适的go-cqhttp执行文件

图1 下载合适的go-cqhttp执行文件

下载后解压缩,里面包含了 3 个文件,其中最关键的文件为: go-cqhttp 执行文件:
图2  解压后的文件构成

图2 解压后的文件构成

2 go-cqhttp 模块目录结构

图3  go-cqhttp 模块目录结构

图3 go-cqhttp 模块目录结构

  • copy_into_volume/1.2.0 目录
    此目录下面的内容为刚才从 go-cqhttp 官网下载解压后的 3 个文件,此文件会通过 Dockerfile 的编排,打包到镜像里,以后就不用再下载了
  • volumes/bs-cqhttp 目录
    此目录为容器运行时的映射目录,初始是空的,当容器生成时,会将目录 copy_into_volume/1.2.0 下面的 3 个文件拷到容器的工作目录里(容器工作目录为 /app/bs-cqhttp ,且此工作。目录映射到了宿主机的 volumes/bs-cqhttp 目录)
  • Dockerfile 文件和 sh 执行脚本文件
    此部分文件和前面模块里讲到的文件功能相似,只是内容略有变化。

3 关于 bs-cqhttp 的镜像配置

此模块镜像的功能相对简单,主要是实现模块功能的配置,没有什么业务逻辑,所以模块并不需要安装 python 环境。

代码说明:

  • 下面的文件里加入了时区,这样系统的时间就和我国的时间相同了,其他模块课参照此功能添加时区处理。
  • go-cqhttp 执行文件先拷贝到镜像的 /opt/app/bs-cqhttp/copy_into_volume/ 目录下,以备在生成容器时,将此几个文件拷到工作目录 /app/bs-cqhttp 下
COPY ./copy_into_volume /opt/app/bs-cqhttp/copy_into_volume/

Dockerfile 完整代码如下:

# 引用官方的轻量级基础镜像
FROM alpine:3.10

# 定义作者信息
LABEL MAINTAINER="tanbushi@qq.com"

# 设置国内源更新系统、安装 bash
RUN echo "https://mirrors.ustc.edu.cn/alpine/v3.13/main" > /etc/apk/repositories && \
    echo "https://mirrors.ustc.edu.cn/alpine/v3.13/community" >> /etc/apk/repositories && \
    apk update && apk upgrade && \
    apk add tzdata bash && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

# 设置环境变量
ENV WORK_DIR /app/bs-cqhttp

# 设置工作目录
WORKDIR $WORK_DIR

# 拷贝运行时文件(go-cqhttp v1.2.0 内核文件)
COPY ./copy_into_volume /opt/app/bs-cqhttp/copy_into_volume/

# entrypoint.sh 文件为容器启动时自执行文件,拷贝到镜像工作目录下备调用
COPY entrypoint.sh /root/bs-cqhttp/entrypoint.sh

# 镜像启动时调用 entrypoint.sh 文件
ENTRYPOINT [ "/bin/bash", "-c", "/root/bs-cqhttp/entrypoint.sh" ]

4 配置文件 config.sh

此配置文件内容如下,和前述模块的配置文件类似,不做解释:

#!/bin/bash

# 基本参数
appName="bs-cqhttp" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="$appName:$appVersion" # 镜像名称
containerName="$appName" # 容器名称

# 下面的路径用到了 pwd 命令,默认要求当前脚本文件和 volumes 目录同在项目目录下(本例项目目录为 bs-cahttp 目录)
volumes=("`pwd`/volumes/bs-cqhttp:/app/bs-cqhttp")

# 标记是否已经配置过
configured=true # 标记变量——此脚本已经被执行过

5 运行 build.sh 生成 Docker 镜像

脚本 build.sh 内容为:

#!/bin/bash

set -e # 遇到错误时退出脚本

# 判断是否运行过配置文件 config.sh,如果未运行过,则运行配置文件
if [ -z "$configured" ]; then
  . ./config.sh
#   configured=true # 设置一个标志,表示已经运行过配置文件
fi

# 检查Docker命令是否可用
if ! command -v docker &> /dev/null; then
    echo "Docker 命令不可用,请确保已经安装并启动了Docker。"
    exit 1
fi

# 检查 Docker 是否在运行
if ! docker info > /dev/null 2>&1; then
  echo "Docker 没用运行。请启动 Docker 再试!"
  exit 2
fi

# 判断 Dockerfile 文件是否存在
if [ ! -f "Dockerfile" ]; then
  echo "Dockerfile 文件不存在。请检查!"
  exit 3
fi

# 构建镜像,注意此处用到了
docker build -t $imageName .
echo ""
echo "*********************************************************"
echo "成功生成 Docker 镜像:【 $imageName 】!"
echo "*********************************************************"
echo ""

6 运行 run.sh 创建容器

脚本 run.sh 的内容为:

#!/bin/bash

# 运行初始化脚本
. ../../shell-scripts/run_init.sh

# 创建并执行临时文件——实现 docker run 命令(临时文件不是在容器里哦!)
. ../../shell-scripts/run_in_tmp.sh

echo ""
echo "*********************************************************"
echo "成功创建容器:【 $containerName 】!"
echo "*********************************************************"
echo ""

此处调用的 run_init.sh 和 run_in_tmp.sh 是公共脚本,内容可参照:《docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建》里的对应代码。

7 一次性构建脚本和创建容器脚本 all.sh

脚本 all.sh 内容为:

#!/bin/bash

# 构建镜像
. ./build.sh

# 运行容器
. ./run.sh

8 运行模块

8.1 先运行 bs-qsign

cd bs-qsign
./run.sh

8.2 再运行 bs-nonebot

cd bs-nonebt
./all.sh

启动后,进入 bs-nonebot 容器,运行 bot.py

模块,最后再运行 bs-cqhttp 模块。
用终端,cd 到 bs-cqhttp 目录下,运行下面的命令:
图4  运行 bot.py

图4 运行 bot.py

8.3 最后运行 bs-cqhttp

cd bs-cqhttp
./all.sh

即可生成镜像、启动容器。
bs-cqhttp 容器启动后,会立即执行 entrypoint.sh 文件,代码如下:

#!/bin/bash

if [ -d "/opt/app/bs-cqhttp/copy_into_volume/1.2.0" ]; then
    cp -u -r /opt/app/bs-cqhttp/copy_into_volume/1.2.0/. /app/bs-cqhttp/
    rm -fr /opt/app/bs-cqhttp/copy_into_volume/1.2.0
fi
echo "haha..."
# tail -f /dev/null

# 死循环
while [ ! -f "./willbreak" ]; do
    echo "目前在循环等待状态,如果需要退出循环,启动 cqhttp,请创建 /root/bs-cqhttp/willbreak 文件"
    sleep 5
    if [ -f "./willbreak" ]; then
        break
    fi
done

echo "开始执行 ./go-cqhttp"
./go-cqhttp

9 配置 bs-cqhttp

9.1 查看初始执行文件

检查宿主机的映射目录:volumes/bs-cqhttp,里面只有三个初始目录,见下图:
图5  宿主机上的映射目录

图5 宿主机上的映射目录

9.2 执行 go-cqhttp 文件

图6  第一次执行 go-cqhttp

图6 第一次执行 go-cqhttp

选择反向代理,生成 config.yml 文件

9.3 修改 config.yml 文件

1)填写 QQ 账号、密码
因为手表协议功能有限,所以采用账号密码登录(不用手表协议2),部分 QQ 能通过,但部分 QQ 始终通不过,可能和 QQ 号是否长期未使用有关,我在慢慢挂(“洗”)小号,不知是否有效。建议不要使用重要的 QQ 号,怕万一被封造成损失。
图7  配置 QQ 账号和密码

图7 配置 QQ 账号和密码

2)配置签名服务器
主机不要写“localhost”、“127.0.0.1”,因为在 bs-cqhttp 容器内部是没办法通过此种主机名找到签名服务器 bs-qsign 的,主机名请写死“host.docker.internal”,端口根据前面服务器容器映射的端口:18080。
图8  配置签名服务器主机和端口在这里插入图片描述
3)配置反向代理服务器
连接到 bs-nonebot 容器的映射端口 15703,主机名也同样为:“host.docker.internal”,注意最后有个 /ws
图9  配置反向websocker服务器
图9 配置反向websocker服务器

config.yml配置完毕,需要再运行一次 ./go-cqhttp,这次要创建 device.json 配置文件。
图10  再次运行 go-cqhttp,自动创建 device.json 文件
图10 再次运行 go-cqhttp,自动创建 device.json 文件

上图信息:

  • 生成了新的 device.json 文件
  • 连接前面服务器成功
  • QQ 登录成功
  • 连接反向 websocker 服务器成功

启动 QQ 给机器人发指令 /echo,测试自动回复功能:
图11  测试 QQ 机器人自动回复功能

图11 测试 QQ 机器人自动回复功能

自动回复成功,说明 bs-nonebot 运行正常!

9.4 修改 device.json 文件

  • “protocol” 默认为6,保持原值,不要修改
    图12  设备协议 protocol
    图12 设备协议 protocol
  • 修改 device.json 里的 android_id
    在 bs-nonebot 模块的 config.sh 文件里,设置了 ANDROID 环境变量
    图13  ANDROID_ID 配置
    图13 ANDROID_ID 配置

    device.json 文件里并没有进行相应修改,他们目前是不一致的,但没有影响 QQ 消息收发,至于是否需要一致,我也不清楚。为了避免有什么影响,建议还是将二者改为一致。修改后:
    图14  device.json 里的 android_id 配置
    图14 device.json 里的 android_id 配置

9.5 启动 go-cqhttp 的自动运行

bs-cqhttp 容器启动后,先执行 entrypoint.sh 文件,此文件中有这样的一段代码:

# 死循环
while [ ! -f "./willbreak" ]; do
    echo "目前在循环等待状态,如果需要退出循环,启动 cqhttp,请创建 /root/bs-cqhttp/willbreak 文件"
    sleep 5
    if [ -f "./willbreak" ]; then
        break
    fi
done
echo 开始执行 ./go-cqhttp"
./go-cqhttp

启动后会进入死循环,无法执行 ./go-cqhttp。此死循环的循环条件是:当在当前目录下找不到 willbreak 文件时(可以是空文件),就一直循环,当找到 willbreak 文件时,就退出循环,所以在 go-cqhttp 所在的工作目录下创建一个 willbreak 文件即可。

在 Docker 管理器的 Exec 页面,Ctrl+C停止go-cqhttp的运行,使用touch 命令创建文件 willbreak

图15  停止entryoint.sh 里的死循环center>图15 停止entryoint.sh 里的死循环

以后 bs-cqhttp 容器启动时,go-cqhttp 就可以正常运行了。当下次重启容器时,不让go-cqhttp运行,删掉这个 willbreak 文件即可。

至此,基于 Docker 的 QQ 机器人框架就搭建完成了(注意,测试代码bot.py并没有自动加载运行,请自行完善,避免测试时“入坑”)。

下一步的工作就是玩转 nonebot 就可以了,通过开发或使用第三方 nonebot 插件实现 QQ 机器人的智能,也就是对接大模型或自建的知识库以后,就可以让 QQ 机器人上线了。


上一篇:docker安装并跑通QQ机器人实践(3)-bs-nonebot搭建

下一篇:没有了


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过MSTSC连接Ubuntu的远程桌面?

正文共:666 字 12 图,预估阅读时间:1 分钟 前面我们介绍了如何通过VNC连接Ubuntu 18.04的远程桌面(Ubuntu 18.04开启远程桌面连接),非常简单。但是有小伙伴咨询如何使用微软的远程桌面连接MSTSC&#xff08…

二维码门楼牌管理应用平台建设:取保候审的智能化监管

文章目录 前言一、取保候审的传统监管困境二、二维码门楼牌管理应用平台的优势三、取保候审备案信息的智能化处理四、保障居民合法权益五、展望未来 前言 随着信息技术的飞速发展,二维码门楼牌管理应用平台已成为现代社区治理的重要工具。本文重点探讨如何借助该平…

保姆级教程!QRCNN-BiLSTM一键实现多变量回归区间预测!区间预测全家桶再更新!

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天对我们之前推出的区间预测全家桶进行…

最邻近插值和线性插值

最邻近插值 在图像分割任务中:原图的缩放一般采用双线性插值,用于上采样或下采样;而标注图像的缩放有特定的规则,需使用最临近插值,不用于上采样或下采样。 自定义函数 这个是通过输入原始图像和一个缩放因子来对图像…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为四个区域:方法区(也称 "…

力扣287. 寻找重复数

Problem: 287. 寻找重复数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 利用二分查找搜索1 ~ n中重复的元素,我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count: 若count > mid则说明重复的…

大数据学习的第三天

文章目录 学习大数据命令的方式查看文件拷贝文件的方式添加数据的方式 出现了问题移动文件 hadoop工作流程和工作机制的方式namenodedatanodesecondarynamenode(主节点) 学习大数据命令的方式 查看文件 hadoop fs -cat /test/2.txt下载文件 hadoop fs -get -f /test/2.txt-f …

通俗说字解词:什么是道理?常说讲道理,李秘书讲写作这节就给你讲“道理”!

通俗说字解词:什么是道理?常说讲道理,李秘书讲写作这节就给你讲“道理”! 说到“道理”,这可真是个有意思的词。它由“道”和“理”两个部分组成,就像一碗好吃的面,有汤有料,缺一不可…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议,连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议,如以太网等,CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的,两边不存在频差,并且内部延时…

ikigai极简3p模型:想、能、有

ikigai模型简化为3p模型: - passion 想要、想做 - professional 能要、能做 - profit 有益、有利 根据三角形不可能定律,三者满足两个就很不容易了。又想做又能做的未必有钱,又能做又有钱的未必想做,又想做又有钱的未必能做。 要实…

(C语言)sscanf 与 sprintf详解

目录 1.sprintf函数详解 2. sscanf函数详解 1.sprintf函数详解 头文件&#xff1a;stdio.h 作用&#xff1a;将格式化的数据写入字符串里&#xff0c;也就是将格式化的数据转变为字符串。 演示&#xff1a; #include <stdio.h> struct S {char name[10];int height;…

LeetCode---128双周赛

题目列表 3110. 字符串的分数 3111. 覆盖所有点的最少矩形数目 3112. 访问消失节点的最少时间 3113. 边界元素是最大值的子数组数目 一、字符串的分数 按照题目要求&#xff0c;直接模拟遍历即可&#xff0c;代码如下 class Solution { public:int scoreOfString(string …

如何通过通过钉钉发送信息????????

1、通过钉钉群添加一个机器人 2、代码实现 /*** 发钉钉审核.** param*/private void sendDingDing(String tableName) {String url "https://oapi.dingtalk.com/robot/send?access_token229c627d05a3157f79a5ef1942d29c4dfb4515bf5c0ad65e3c69423bc016f97c";JSONOb…

达梦数据库的AWR报告

达梦数据库的AWR报告 数据库快照是一个只读的静态的数据库。 DM 快照功能是基于数据库实现的&#xff0c;每个快照是基于数据库的只读镜像。通过检索快照&#xff0c;可以获取源数据库在快照创建时间点的相关数据信息。 为了方便管理自动工作集负载信息库 AWR&#xff08;Auto…

网络编程初步

协议&#xff1a; 一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物、数、网、传、会、表、应 TCP/IP 4层模型&#xff1a;网&#xff08;链路层/网络接口层)、网、传、应 应用层&#xff1a;http、 ftp、 nfs、 ssh、 telneto o .传输层:TCP、UDP 网络层&…

累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int n 5;int result 0;int sum 0;//运算&#…

笔试强训未触及题目(个人向)

NC398 腐烂的苹果 1.题目 2.解析 这是一个广度优先搜索问题&#xff0c;我们可以先找到所有的烂苹果&#xff0c;把它加入到队列中&#xff0c;然后再同时让这几个苹果向外面腐蚀&#xff0c;我们可以用一个boolean数组来表示是否被腐蚀&#xff0c;也可以直接在原数组中将这…

ThingsBoard通过规则链创建报警信息

什么是规则引擎? 典型实例 1、复制根规则链为报警规则链路 2、拖动Script Filter 规则节点放入链中并配置如下脚本: 3、配置名称为&#xff1a;高温报警&#xff0c;并执行下面的脚本 4、将Script于上一个节点进行关联 5、选择动作里面的create alarm节点信息并放入其中…

解决微信打开文件编辑显示只读状态

微信官网下载地址&#xff1a;微信&#xff0c;是一个生活方式 新版本解决方案&#xff1a; 微信打开文件只读问题终于得到彻底解决了&#xff01;请尽快升级微信 Windows3.9.6 或者微信 mac3.8.1 版本&#xff0c;均新增聊天文件取消只读开关. 旧版本解决方案&#xff1a; …

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…