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/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搭建

下一篇:没有了


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目实践---贪吃蛇游戏的实现

上一章,我们已经分析了贪吃蛇的具体内容,包括它是如何实现的,怎样完成这个项目的,其中就提到了 贪吃蛇有三个代码:一个是测试代码,一个是头文件代码,还有一个是主函数代码。那么今天我们就来讲一…

【大数据】TiDB: A Raft-based HTAP Database

文章目录 数据库知识介绍数据库系统的ACID特性分布式系统和CAP理论关系型数据库与非关系型数据库关系型数据库非关系型数据库 OldSQL、NoSQL、NewSQLOldSQLNoSQLNewSQL OLTP、OLAP、HTAP 前言:为什么选择TiDB学习?pingCAP介绍TiDB介绍TiDB的影响力TiDB概…

什么是大语言模型以及如何构建自己的大型语言模型?

一、关于大语言模型 LLM 对于无数的应用程序非常有用,如果我们自己从头开始构建一个,那我们可以了解底层的ML技术,并可以根据特定需求定制LLM,但是对资源的需求巨大。大型语言模型是一种 ML 模型,可以执行各种自然语言…

《QT实用小工具·二十八》基于qt开发的各种曲线

1、概述 源码放在文章末尾 该项目实现了各种曲线的绘制,下面是项目的demo演示: 项目部分代码如下: #include "frmsmoothcurve.h" #include "ui_frmsmoothcurve.h" #include "smoothcurve.h" #include "…

【ThinkPHP框架教程·Part-01】ThinkPHP6.x框架安装教程

文章目录 一、框架介绍1、框架简介和版本选择2、主要新特性 二、安装步骤1、下载并运行Composer-Setup.exe2、安装TP前切换镜像3、安装稳定版4、测试运行 一、框架介绍 1、框架简介和版本选择 Thinkphp是一种基于php的开源web应用程序开发框架ThinkPHP框架,是免费开…

Axure设计原型图工具 Windows11安装步骤详解

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Axure 是一个流行的原型设计工具,它被用来创建交互式原型、线框图和用户界面设计。Axure 可以帮助用户在项目早期阶段快速制作出可交互的原型,以便进行用户测试、验证设计概念和与…

jetcache fastjson 泛型复杂对象JSON序列 ,反序列化

Jetcache fastjson 泛型复杂对象JSON序列 ,反序列化 默认的FastJson2 序列化存在问题增强FastJson 支持Encode 编码器Decode 解码器 默认的FastJson2 序列化存在问题 默认的序列化不能转换List 中的泛型数据类型, 从缓存拿取的list集合对象数据全部都转换成了JSONObject 增强F…

UE5 把蓝图内的变量和事件暴露给序列使用

在蓝图变量内勾选Expose to Cinematics 事件: 在角色内添加自定义事件 在序列内对着角色的号添加Event,选择Trigger 添加关键帧,然后在关键帧右键添加class,在class下绑定事件

fdisk使用的MBR分区

MBR和GPT分区 MBR分区 MBR分区一般在分区的时候 ,MBR分区格式只能支持2TB以下的硬盘容量。 分区最多为4个主分区 或 3个主分区和1个扩展分区,而创建扩展分区后可以分无数个逻辑分区,当然跟磁盘容量有关, 逻辑分区在扩展分区上…

K210基础实验——独立按键中断

前言 学习K210开发板的独立按键和中断功能 一、涉及到的外设资源是K210开发板上的BOOT按键和RGB灯 二、BOOT按键按下,MCU上连接BOOT的IO口变为低电平,松开后为高电平 三、引脚对应关系 BOOT : IO16 RGB灯: R:IO6 G:IO7 B:IO8 四、在…

A-1:树状数组

A-1:树状数组 1.介绍Q1:树状数组解决什么问题?Q2:树状数组的使用1.前置知识:lowbit(x)2.单点修改3.求[1,n]的和4.区间查询5.hh Q3:树状数组是否优化了Q4:上图上例子解释上面说的东西(Important) 2.习题练习 1.介绍 树状数组是一个比较难以理解的高级数据…

Oracle体系结构初探:聊聊REDO

上一篇文章写了undo(文章链接:聊聊UNDO),这篇和大家一起聊聊redo。redo如果按照我的傻瓜翻译,意为再次去做、重新去做。Oracle官方对于redo的描述是:记录对数据所做的所有更改,包括未提交和已提…

Electron+Vue3整合 - 开发时状态整合

说明 本文介绍一下 Electron Vue3 的整合的基本操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时 Electron 加载的是开发的vue项目;步骤一:创建vue3项目 常规操作,不再赘…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

yolov5-6.0调测记录

直接运行yolov5-6.0/detect.py,输出如下: image 1/2 C:\Users\dun\Downloads\yolov5-6.0\data\images\bus.jpg: 640x480 4 persons, 1 bus, Done. (0.216s) image 2/2 C:\Users\dun\Downloads\yolov5-6.0\data\images\zidane.jpg: 384x640 2 persons, 2…

单链表的简单应用

目录 一、顺序表的问题及思考 二、链表的概念及结构 三、单链表的实现 3.1 增 3.1.1 尾插 3.1.2 头插 3.1.3 指定位置前插入 3.1.4 指定位置后插入 3.2 删 3.2.1 尾删 3.2.2 头删 3.2.3 指定位置删除 3.2.4 指定位置后删除 3.2.5 链表的销毁 3.3 查 3.4 改 四…

【Godot4自学手册】第三十九节利用shader(着色器)给游戏添加一层雾气效果

今天,主要是利用shader给游戏给地宫场景添加一层雾气效果,增加一下气氛,先看一下效果: 一、新建ParallaxBackground根节点 新建场景,根节点选择ParallaxBackground,命名为Fog,然后将该场景保…

什么是AIoT?

什么是AIoT? AIoT,即人工智能物联网,是一种将人工智能(AI)技术与物联网(IoT)相结合的新型应用形态。它不仅实现了设备之间的互联互通,还赋予了它们更智能化的特性。AIoT的核心在于通过AI的数据…

prometheus+grafana可视化监控

prometheus监控 一、用二进制安装 1、安装Prometheus 打开官方网址:https://prometheus.io/download/ wget https://github.com/prometheus/prometheus/releases/download/v2.45.4/prometheus-2.45.4.linux-amd64.tar.gz下载完成后解压一下安装包 tar vxf prometheus-2.45.…

解锁棋盘之谜:探索N皇后问题的全方位解决策略【python 力扣51题】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…