Hi,聆听·彼岸



听说,你是我最遥不可及的梦。
What should I do?
What should I do?
I think I'm going to fall in love with myself.

nonebot-go-cqhttp

发表于 2022-11-15| 分类于 笔记 | | 评论数

这二者文档较全,但是入门难度较大。
所谓QQ机器人,其实就是用一个程序模拟QQ登录并获取和发送信息,而这个过程由go-cqhttp负责,
获取到消息后就交由另一个程序分析消息并做出反应,而这个程序就是我们要用nonebot写的。

pip install后加个点应该是说从当前目录下进行安装,安装包下载到本地,进入安装包目录,使用pip install .进行安装。

把python项目可安装化以后,执行pip install .或者pip install -e .安装。
二者区别如下:

  • pip install . :安装后的模块freeze在pip/conda依赖下,换句话说,再修改本地的原项目文件,不会导致对应模块发生变化。
  • pip install -e .:-e 理解为 editable,修改本地文件,调用的模块以最新文件为准。

安装

安装anaconda

文档中的poetry是另一种依赖管理工具,我用熟悉的anaconda
直接bash ./Anaconda3-2019.07-Linux-x86_64.sh
一路默认不管,最后会有个问你conda init,yes就完事儿了。
然后百度换源

创建bot环境,我这里用python3.10.4

conda create -n bot python==3.10.4

安装go-cqhttp和nonebot2

conda activate bot
pip install nb-cli

进入bot文件夹(自己创建),查看适配器

# 列出所有的适配器
nb adapter list
# 列出所有的插件
nb plugin list
# 搜索插件
nb plugin search <plugin-name>
# 安装插件
nb plugin install <plugin-name>

官方插件

  • NoneBot-Plugin-Docs (opens new window)离线文档插件
  • NoneBot-Plugin-Test (opens new window)本地机器人测试前端插件
  • NoneBot-Plugin-APScheduler (opens new window)定时任务插件
  • NoneBot-Plugin-LocalStore (opens new window)本地数据文件存储插件
  • NoneBot-Plugin-Sentry (opens new window)Sentry 在线日志分析插件
  • NoneBot-Plugin-Status (opens new window)服务器状态查看插件

开发环境我选择可道云(一个记事本就可以)

开始使用

运行nonebot

nb create

然后依次选择src,echo,onebot V12
然后就创建完了
进入机器人目录(就是有bot.py那个)运行

nb run

配置go-cqhttp

下载对应的go-cqhttp,并解压
在cq文件夹

./go-cqhttp

然后选择http通信
然后修改一下配置文件,照着文档来。

account:
uin: 机器人QQ号
password: "机器人密码"

message:
post-format: array

servers:
- http:
post:
- url: "http://127.0.0.1:8080/onebot/v11/http"
secret: ""

其中 ws://127.0.0.1:8080/cqhttp/http 中的 127.0.0.1 和 8080 应分别对应 nonebot 配置的 HOST 和 PORT。

cqhttp 是前述 register_adapter 时传入的第一个参数,代表设置的 CQHTTPBot 适配器的路径,你可以对不同的适配器设置不同路径以作区别。

保存之后再次运行cq,登录

不出意外的话扫码登录会被qq拒绝,因为你和你的机器人不在同一网络下。
要解决也简单,这里就不再说了。

经过一番挣扎之后终于登上了QQ

下面开始配置nonebot

原生的果然一堆麻烦
我直接一键真寻

再三思考,我决定还是从零开始

然后我发现了miniconda,anaconda的简化版。


从头开始,安装完宝塔,可道云,miniconda后

pip install nonebot2

由于nb2自带fastapi服务端所以够用了

安装adapter

pip install nonebot-adapter-onebot
pip install nonebot-adapter-cqhttp

这样就安装得差不多了。

搞了半天终于连上了,无力吐槽无力吐槽无力吐槽无力吐槽无力吐槽无力吐槽无力吐槽无力吐槽无力吐槽


最后成功那次我选了反向websocket
重新cq配置

account:
uin: 机器人QQ号
password: "机器人密码"

message:
post-format: array

servers:
- ws-reverse:
universal: ws://127.0.0.1:8080/onebot/v11/ws

机器人配置

# 服务器和端口
HOST = 127.0.0.1
PORT = 8080

COMMAND_START=["/", ""] # 配置命令起始字符
COMMAND_SEP=["."] # 配置命令分割字符

既然连上了,那么剩下的就只剩下插件开发了。

然后我们再做个启动脚本,类似这样

cd cq
./go-cqhttp &
cd ..
cd bot
python bot.py &

当然,这并不能满足我的需求,所以我稍微修改了真寻的。

# python bot/bot.py & ./go-cqhttp
# cd cq
# ./go-cqhttp &
# cd ..
# cd bot
# python bot.py &
workdir=/www/wwwroot/kod/s/qqbot/
python_v="python"
Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
Info="${Green_font_prefix}[信息]${Font_color_suffix}"
Error="${Red_font_prefix}[错误]${Font_color_suffix}"
Tip="${Green_font_prefix}[注意]${Font_color_suffix}"

check_root(){
[[ $EUID != 0 ]] && echo -e "${Error} 当前非ROOT账号(或没有ROOT权限),无法继续操作,请更换ROOT账号或使用 ${Green_background_prefix}sudo -i${Font_color_suffix} 命令获取临时ROOT权限(执行后可能会提示输入当前账号的密码)。" && exit 1
}

check_pid_bot() {
#PID=$(ps -ef | grep "sergate" | grep -v grep | grep -v ".sh" | grep -v "init.d" | grep -v "service" | awk '{print $2}')
PID=$(pgrep -f "bot.py")
}

check_pid_cqhttp() {
#PID=$(ps -ef | grep "sergate" | grep -v grep | grep -v ".sh" | grep -v "init.d" | grep -v "service" | awk '{print $2}')
PID=$(pgrep -f "go-cqhttp")
}

Start_bot() {
check_pid_bot
[[ -n ${PID} ]] && echo -e "${Error} bot 正在运行,请检查 !" && exit 1
cd ${workdir}/bot
nohup ${python_v} bot.py >> bot.log 2>&1 &
echo -e "${Info} bot 开始运行..."
}

Stop_bot() {
check_pid_bot
[[ -z ${PID} ]] && echo -e "${Error} bot 没有运行,请检查 !" && exit 1
kill -9 ${PID}
echo -e "${Info} bot 已停止运行..."
}

Restart_bot() {
Stop_bot
Start_bot
}

View_bot_log() {
tail -f -n 100 ${workdir}/bot/bot.log
}

Start_cqhttp() {
check_pid_cqhttp
[[ -n ${PID} ]] && echo -e "${Error} go-cqhttp 正在运行,请检查 !" && exit 1
cd ${workdir}/cq
nohup ./go-cqhttp -faststart >> go-cqhttp.log 2>&1 &
echo -e "${Info} go-cqhttp 开始运行..."
echo -e "${info} 请扫描二维码登录 bot,bot 账号登录完成后,使用Ctrl + C退出 !"
sleep 2
}

Stop_cqhttp() {
check_pid_cqhttp
[[ -z ${PID} ]] && echo -e "${Error} cqhttp 没有运行,请检查 !" && exit 1
kill -9 ${PID}
echo -e "${Info} go-cqhttp 停止运行..."
}

Restart_cqhttp() {
Stop_cqhttp
Start_cqhttp
}

View_cqhttp_log() {
tail -f -n 100 ${workdir}/cq/go-cqhttp.log
}

# Exit_cqhttp() {
# cd cq
# rm -f session.token
# echo -e "${Info} go-cqhttp 账号已退出..."
# Stop_cqhttp
# sleep 3
# menu_cqhttp
# }

menu(){
echo && echo -e " bot 一装管理脚本 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}
-- Sakura | github.com/AkashiCoin --
${Green_font_prefix} 0.${Font_color_suffix} 启动bot并启动cq
————————————
${Green_font_prefix} 1.${Font_color_suffix} 停止bot并停止cq
————————————
${Green_font_prefix} 2.${Font_color_suffix} 启动 go-cqhttp
${Green_font_prefix} 3.${Font_color_suffix} 停止 go-cqhttp
${Green_font_prefix} 4.${Font_color_suffix} 重启 go-cqhttp
————————————
${Green_font_prefix} 5.${Font_color_suffix} 启动 bot
${Green_font_prefix} 6.${Font_color_suffix} 停止 bot
${Green_font_prefix} 7.${Font_color_suffix} 重启 bot
————————————
${Green_font_prefix} 8.${Font_color_suffix} 查看cq log
${Green_font_prefix}10.${Font_color_suffix} 查看bot log" && echo

read -erp " 请输入数字 [0-10]:" num
case "$num" in
0)
Start_bot
Start_cqhttp
;;
1)
Stop_bot
Stop_cqhttp
;;
2)
Start_cqhttp
;;
3)
Stop_cqhttp
;;
4)
Restart_cqhttp
;;
5)
Start_bot
;;
6)
Stop_bot
;;
7)
Restart_bot
;;
8)
View_cqhttp_log
;;
10)
View_bot_log
;;
*)
echo "请输入正确数字 [0-10]"
;;
esac

}


menu

编写插件

此处官方文档比较详细,不再赘述。
根据代码示例,我们先简单模仿一下

from nonebot import on_command
from nonebot.rule import to_me
from nonebot.matcher import Matcher
from nonebot.adapters import Message
from nonebot.params import Arg, CommandArg, ArgPlainText


weather = on_command("你好", rule=to_me(), aliases={"你好"}, priority=5)




@weather.handle()
async def handle_first_receive(matcher: Matcher, args: Message = CommandArg()):
await weather.finish("你好呀!")

重启机器人,测试成功!!! nice!

下一次,我将会学习python装饰器,并完全由自己写出一个插件,爬meizi图好了。


满分是10分的话,这篇文章你给几分,您的支持将鼓励我继续创作!