这二者文档较全,但是入门难度较大。 所谓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 然后依次选择src,echo,onebot V12 然后就创建完了 进入机器人目录(就是有bot.py那个)运行
配置go-cqhttp 下载对应的go-cqhttp,并解压 在cq文件夹
然后选择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后
由于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 botpython 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=$(pgrep -f "bot.py" ) } check_pid_cqhttp () { 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 } 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_commandfrom nonebot.rule import to_mefrom nonebot.matcher import Matcherfrom nonebot.adapters import Messagefrom nonebot.params import Arg, CommandArg, ArgPlainTextweather = 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分的话,这篇文章你给几分,您的支持将鼓励我继续创作!
本文作者: 聆听·彼岸本文链接: https://ltba.github.io/20221115053452.html 版权声明: 本站未注明转载的文章均为原创,所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议.转载请注明出处!