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

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/bashset -e # 遇到错误时退出脚本# 判断是否运行过配置文件 config.sh,如果未运行过,则运行配置文件
if [ -z "$configured" ]; then. ./config.sh
#   configured=true # 设置一个标志,表示已经运行过配置文件
fi# 检查Docker命令是否可用
if ! command -v docker &> /dev/null; thenecho "Docker 命令不可用,请确保已经安装并启动了Docker。"exit 1
fi# 检查 Docker 是否在运行
if ! docker info > /dev/null 2>&1; thenecho "Docker 没用运行。请启动 Docker 再试!"exit 2
fi# 判断 Dockerfile 文件是否存在
if [ ! -f "Dockerfile" ]; thenecho "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.shecho ""
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/bashif [ -d "/opt/app/bs-cqhttp/copy_into_volume/1.2.0" ]; thencp -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" ]; doecho "目前在循环等待状态,如果需要退出循环,启动 cqhttp,请创建 /root/bs-cqhttp/willbreak 文件"sleep 5if [ -f "./willbreak" ]; thenbreakfi
doneecho "开始执行 ./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" ]; doecho "目前在循环等待状态,如果需要退出循环,启动 cqhttp,请创建 /root/bs-cqhttp/willbreak 文件"sleep 5if [ -f "./willbreak" ]; thenbreakfi
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.mzph.cn/diannao/1077.shtml

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

相关文章

【Linux】详解进程通信中信号量的本质同步和互斥的概念临界资源和临界区的概念

一、同步和互斥的概念 1.1、同步 访问资源在安全的前提下,具有一定的顺序性,就叫做同步。在多道程序系统中,由于资源有限,进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突,保证进程或线程之间能够按照既定…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

优思学院|ISO45001职业健康安全管理体系是什么?

ISO45001:2018是新公布的国际标准规范,全球备受期待的职业健康与安全国际标准(OH&S)于2018年公布,并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001,成为全球工作场所健康与安全的参考。 ISO45001:201…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址:API平台源码 这套源码是使用thinkphp3.1.3开发的,可以在PHP5.3-5.6下运行,程序是有一点老了,但是思路仍在!然后,这套源码我已经成功搭建起来了,后台、个人(用户&#xff0…

在瑞芯微RV1126 Linux系统上调试WiFi的详细指南

目录标题 1. **系统和环境准备**2. **检查WiFi设备状态**3. **启用和禁用WiFi接口**4. **扫描可用的WiFi网络**5. **连接到WiFi网络**6. **查看当前的WiFi连接状态**7. **断开和重新连接WiFi**8. **管理WiFi网络配置**9. **使用iw工具进行高级WiFi调试**10. **故障排除和日志获…

算法训练营day16

一、二叉树的最大深度 递归解法 后序遍历(DFS) class Solution {public int maxDepth(TreeNode root) {if (root null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) 1;} }算法解析: 终止条件: 当 root 为空,…

力扣---填充每个节点的下一个右侧节点指针 II

给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。 初始状态下,所有 next 指针都…

牛x之路 - Day1

Day1 微积分之屠龙宝刀(武林秘籍) 之前的一些东西都在pdf上记得笔记, 没有在这个上面展示一遍,只好学到相关内容的时候再提叙啦;所以其实再写这个小记的时候,我已经看了一半的书,但是不要紧&am…

IntelliJ IDEA运行发布传统Java Web Application项目

接 重温8年前项目部署 要求,如何改用IntelliJ IDEA运行发布传统 Java Web Application项目呢,简述步骤如下: 一、下载源码 源码:https://github.com/wysheng/kindergarten 下载后的本地项目路径:/Users/songjianyon…

《Python源码剖析》之对象的基石---PyObject

前言 在python的源代码中,PyObject的结构体定义如下,它的内容看起来很简单,只有3项,分别是:_PyObject_HEAD_EXTRA,ob_refcnt和ob_type,其中_PyObject_HEAD_EXTRA是用于指向活动堆的指针&#x…

学习大数据,所需要的linux基础(1)

文章目录 linux入门概述Linux和Windows的区别CentOS下载地址 Linux文件与目录结构Linux文件Linux目录结构 VI/VIM编辑器vi/vim是什么测试数据集准备一般模式编辑模式指令模式模式间转换 网络配置和系统管理操作查看网络IP和网关配置网络和ip地址ifconfig配置网络接口修改ip地址…

使用Python进行自动化测试

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 如何使用Python进行自动化测试:测试框架的选择与应用 自动化测试是软件开发过程…

curlftpfs和fusermount

curlftpfs 是一种 Linux 系统下用来将 FTP 服务器挂载为文件系统的工具,这意味着可以通过本地目录来访问和操作 FTP 服务器上的文件。 挂载FTP服务器到本地系统 为了挂载FTP服务器到本地系统中,使用curlftpfs工具,可以按照以下格式书写命令…

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

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

进程间通信IPC(二)

一、存储映射I/O(Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是从缓冲区中取数据,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区,则相应的字节就自动写入文件。这样,就可在不使用read和write…

由于找不到msvcp110d.dll,无法继续执行代码

在计算机软件开发和运行环境中,动态链接库(DLL)文件扮演着至关重要的角色。它们封装了特定功能的代码,使得多个应用程序能够共享这些功能而无需重复编译或加载相同的代码,从而显著提升了系统资源利用率和软件开发效率。…

024——驱动、server、client、GUI全功能联调

目录 一、本次修改 二、GUI和Client之间联调 2.1 工程结构修改 2.2 将TCP程序修改为可被其它程序调用 2.3 优化显示界面 2.4 解决GUI通过tcp send的问题 2.5 处理服务器数据 时间不是很多了,我想压缩一下快点把属于毕设的这部分搞完,俺要出去旅游…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处: 对于浏览器来说,标签不够语义化对于搜索引擎来说,不利于SEO的优化 语义化标签: header:头部元素nav:导航section:定义文档某个区域的元素article:内容元素aside…

解锁多智能体路径规划新境界:结合启发式搜索提升ML本地策略

引言:多智能体路径寻找(MAPF)问题的重要性与挑战 在现代自动化和机器人技术迅速发展的背景下,多智能体路径寻找(Multi-agent path finding,简称MAPF)问题的研究变得日益重要。MAPF问题涉及为一…

【NTN 卫星通信】NTN的SSB波束探讨

1 概述 SSB是同步广播信道,用于小区搜索,主系统消息的发送。NR协议中定义了多种SSB波束格式,简述如下。   小区搜索是终端获取与小区的时间和频率同步并检测小区的物理层小区ID的过程。   为了进行小区搜索,UE接收以下同步信号…