创建QQ群聊机器人教程


参考

参考B站视频群聊机器人
以及nonebot官方文档

创建运行环境

升级python

  1. 需要升级python到python3.10以上(ubuntu20默认python3.8)

    如果您的python版本本身就大于3.10,可以进入第二步

    请参照此网页进行

    
    1. 添加源
    sudo apt install software-properties-common
    sudo add-apt-repository ppa:deadsnakes/ppa
    sudo apt update
    
    2. 安装 
    sudo apt install python3.10
    
    3. 设置默认版本为 Python3.10
    
    查看系统已存在的所有python版本
    ls -l /usr/bin/python*
    
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
    
    4. 选择默认版本,提示信息中回车即可.
    sudo update-alternatives --config python3
    
    5. 修复 pip
    sudo apt install python3.10-distutils
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python3 get-pip.py
    
    6. 权限问题
    sudo python3 get-pip.py --user
    
    7. pip升级
    pip install --upgrade pip
    
    
    8. 检查配置文件
    sudo vi /usr/local/bin/pip3
    第一行是 #!/usr/bin/python3 即可.
    
    输入python3,回车,看输出信息是否是python3.10
    输入pip --version,看输出是否是链接到python3.10
    
    9.清除pip缓存
    sudo rm -r ~/.cache/pip
    
    10. 安装python虚拟环境
    sudo apt install python3.10-venv

创建独立的screen会话

sudo apt-get install screen
screen -S nonebot
#nonebot是我取的名字,你可以不一样

关于screen的使用

  1. 先按Crtl+a,然后按d,就可以退出当前会话(会在后台运行)
  2. 如果重新登陆服务器后想要恢复会话,就输入
    screen -r nonebot
  3. 如果提示没有可恢复的会话,如下

    There is a screen on:
            54100.nonebot   (11/21/2022 01:15:17 AM)        (Attached)
    There is no screen to be resumed matching nonebot.

    说明上次没有规范退出,那就先
    screen -d nonebot

    screen -r nonebot

创建python虚拟环境

mkdir ~/qqbot
cd ~/qqbot

python3 -m venv nonebot
source ./nonebot/bin/activate

使用参考一个简单教程python虚拟环境管理工具venv教程

go-cqhttp安装及使用

安装go-cqhttp

参考快速使用说明

#使用wget下载安装包
wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc3/go-cqhttp_1.0.0-rc3_linux_amd64.deb

#使用gdebi安装go-cqhttp
sudo apt install gdebi
sudo gdebi go-cqhttp_1.0.0-rc3_linux_amd64.deb

也可以不使用deb包安装,使用压缩包安装运行,但只是每次运行都需要cd到文件夹运行

使用cqhttp

初始化

参考快速使用说明

go-cqhttp

#在弹出选项中输入 3 回车选择
3: 反向 Websocket 通信

编辑生成的config.yml

关于config.yml的设置说明

vim config.yml

#1.修改qq账号,密码(不填即为扫码登陆)
#2.设置`universal: ws://127.0.0.1:11451/onebot/v11/ws/`
#11451为随意设置的端口,只要和nonebot中的设置保持一致就可以

设置完成后理论上再运行go-cqhttp,按照提示拖动验证框就可以正常运行了,但事实上很多人的账号都不行,尤其是我之前就设置过且触发过风控的。
(如果你成功登陆就跳过下一步)

关于go-cqhttp无法顺利登陆

参考使用滑动验证码通过后报密码错误或被冻结

  1. 在win电脑上下载,go-cqhttp免安装的压缩包就可以了
  2. 在win命令行运行.\go-http,然后编辑设置config.yml
  3. 在同一个wifi网下扫码登陆
  4. 把生成的device.jsonsession.token使用FTP工具上传到服务器对应文件夹中
  5. 在服务器上再次运行go-cqhttp应该就可以登陆成功了
  6. 登陆成功时会出现登录成功 欢迎使用: XXXX的字样,
    至于后面的连接到反向WebSocket Universal服务器 ws://127.0.0.1:11451/onebot/v11/ws/ 时出现错误: dial tcp 127.0.0.1:11451: connect: connection refused,可以不用管,那是因为还没有启动nonebot

为了能发送语音,安装ffmpeg

sudo apt install -y ffmpeg

Nonebot安装及使用

安装nonebot

pip install nb-cli

#如果提示缺少pip,就尝试pip3,如果依旧没有,就先安装python3-pip

创建nonebot

nb create

然后根据提示选择(上下移动,空格选择,回车确认)

[?] Project Name: lucy #这是我给机器人取的名字,你自己随便取一个
[?] Where to store the plugin? 2) In a "src" folder #选择在本文件夹存放插件,你也可以选'lucy',后续某些命令需要自己改下位置
[?] Which builtin plugin(s) would you like to use? echo #请保持一致
[?] Which adapter(s) would you like to use? OneBot V11  #请保持一致

修改配置

  1. 查看全部文件

    cd lucy
    ls -a
    #可以看到很多隐藏文件,如.env,.env.dev
  2. 修改编辑
    关于如何编辑配置,参考官方文档

    vim .env
    然后将dev改为prod
    #.env.dev意思是测试环境,.env.prod意思是生产环境,当然不改也完全可以
    
    vim .env.prod 
    将HOST改为之前设置的127.0.0.1
    将PORT端口改为之前设置的11451
  3. 进阶配置
    这里附一份官方文档中的示例配置,供参考,目前看不懂的项可以先不配置,日后再写
    更详细的解释参考详细配置

    HOST=0.0.0.0  # 配置 NoneBot2 监听的 IP/主机名
    PORT=8080  # 配置 NoneBot2 监听的端口
    SUPERUSERS=["123456789", "987654321"]  # 配置 NoneBot 超级用户
    NICKNAME=["awesome", "bot"]  # 配置机器人的昵称
    COMMAND_START=["/", ""]  # 配置命令起始字符
    COMMAND_SEP=["."]  # 配置命令分割字符
    
    #Custom Configs
    CUSTOM_CONFIG1="config in env file"
    CUSTOM_CONFIG2=  # 留空则从系统环境变量读取,如不存在则为空字符串

运行机器人

  1. 试运行

    nb run
    #或者
    python ./bot.py
    如果没有报错就先Ctrl+C退出,因为还要同时运行go-cqhttp
  2. 后台运行go-cqhttp

    #退回到qqbot所在文件夹(放有device.json的文件夹)
    cd ..  
    
    #后台运行
    nohup go-cqhttp &
    
    #查看进程
    ps
    
    #如果不想运行或者出错了,可以用 kill 命令杀死后台进程
  3. 运行nonebot

    #回到第一步文件夹
    cd lucy
    
    #运行nonebot
    nb run
    #或者
    python ./bot.py
  4. 验证
    如果没有报错,就在手机上对你设置为机器人的那个账号发送/echo 1234,如果回复你1234,机器人就设置完成了

安装第三方插件

前往商店挑选你要安装的插件,复制命令到服务器运行
建议每安装一个插件,就运行一次nonebot测试调整功能,防止插件报错也不知道是哪个引起的,安装前只需要结束nonebot进程就可以,go-cqhttp进程可以一直在后台运行不结束

服务器状态查看

  • [x] 完美运行

作用:通过戳一戳获取服务器状态

nb plugin install nonebot-plugin-status

修改返回状态的样式,参考github文档

  1. 在 NoneBot 全局配置中编辑修改
    vim .env.prod
    我的模版如下

    #服务器状态查看配置
    server_status_only_superusers=True #是否仅允许超级用户使用
    #配置文件示例
    SERVER_STATUS_TEMPLATE='
    CPU: {{ "%2d" % cpu_usage }}.{{"%-2d" % (cpu_usage%1*100)}}%
    Memory: {{ "%2d" % memory_usage.percent }}.{{"%-2d" % (memory_usage.percent%1*100)}}%
    Memory_Used: {{"%d" % (memory_usage.used//1000000)}}MB
    Memory_Available: {{"%d" % (memory_usage.available//1000000)}}MB
    Runtime: {{ uptime | relative_time | humanize_delta  }}
    NonebotTime: {{ runtime | relative_time | humanize_delta  }}
    {% if swap_usage.total %}Swap: {{ "%02d" % swap_usage.percent }}%{% endif %}
    Disk:
    {% for name, usage in disk_usage.items() %}
        Total: {{"%d" % (usage.total//2**30)}}GB
        Used : {{"%d" % (usage.used//2**30)}}GB
        Details:
        {{ name }} : {{ "%2d" % usage.percent }}%
    {% endfor %}
    '
  2. 待完成

    • [ ] 发送ps,top cpu,top mem命令,返回当前进程列表,或是占CPU/内存最高的10个进程
      (使用python里的psutil模块,如psutil.Process(),psutil.

Bison

  • [x] 完美运行

作用:通用订阅推送插件

安装命令:(先不要执行)

nb plugin install nonebot-bison

通过阅读FAQ可知

FAQ
1. 报错TypeError: 'type' object is not subscriptable
    本项目使用了 Python 3.10 的语法,请将 Python 版本升级到 3.10 及以上,推荐使用 docker 部署
2. bot 不理我
    请确认自己是群主或者管理员,并且检查COMMAND_START环境变量是否设为[""] 或者按照COMMAND_START中的设置添加命令前缀,例: COMMAND_START=["/"]则应发送/添加订阅
3.微博漏订阅了 微博更新了新的风控措施,某些含有某些关键词的微博会获取不到。
4. 无法使用后台管理页面
    确认自己正确配置了 nonebot 的端口,如果在远程或容器外访问网页请确保HOST=0.0.0.0
       确认自己的云服务器的防火墙配置正确
       确认自己使用了正确的方法安装插件
       参与开发

1. 修复python版本问题

  1. 需要升级python到python3.10以上(ubuntu20默认python3.8)(一开始进行过这一步的可以跳过了)
    请参照此网页进行

    
    1. 添加源
    sudo apt install software-properties-common
    sudo add-apt-repository ppa:deadsnakes/ppa
    sudo apt update
    
    2. 安装 
    sudo apt install python3.10
    
    3. 设置默认版本为 Python3.10
    
    查看系统已存在的所有python版本
    ls -l /usr/bin/python*
    
    update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
    update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
    
    4. 选择默认版本,提示信息中回车即可.
    update-alternatives --config python3
    
    5. 修复 pip
    sudo apt install python3.10-distutils
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python3 get-pip.py
    
    6. 权限问题
    sudo python3 get-pip.py --user
    
    7. 检查配置文件
    sudo vi /usr/local/bin/pip3
    第一行是 #!/usr/bin/python3 即可.
    
    输入python3,回车,看输出是否是3.10
  2. 重新安装原有的python包(同上,仅仅给刚刚才升级的用)
sudo apt install python3.10-venv

pip install nb-cli

nb plugin install nonebot-plugin-status
  1. 重新运行nb run,测试功能有无报错。

2. 安装bison

安装命令:

nb plugin install nonebot-bison

安装执行过程中,捕获到一个warning

Using legacy 'setup.py install' for bs4, since package 'wheel' is not installed.
Using legacy 'setup.py install' for sgmllib3k, since package 'wheel' is not installed.

由于缺少wheel包导致的报错

所以安装wheel

pip install wheel

重新执行

nb plugin install nonebot-bison

无报错,完成

3. 配置文件

具体配置文件请参考官方说明

更改方式为

vim .env.prod

  1. 配置外网访问端口

    默认是8080端口,更改为你实际使用的端口,而且要在服务器防火墙端放行。

    文档原文:

    BISON_OUTER_URL: 从外部访问服务器的地址,默认为http://localhost:8080/bison,如果你的插件部署 在服务器上,建议配置为http://<你的服务器ip>:8080/bison

    注意:不应该是8080,而是你自己设定的端口,比如我就应该是http://<你的服务器ip>:11451/bison

    .end.prod中添加

    BISON_OUTER_URL = "http://xxxxxxxx:11451/bison/"

  2. 确保HOST设置为0.0.0.0,检查.env.prod中的设置

    如果需要从外网或者 Docker 容器外访问后台页面,请确保HOST=0.0.0.0

4. 启动bison

  1. 启动后会安装chromium 核心和ffmpeg等,请确保有足够权限及网络条件,观察输出无报错

3. 如何使用

参见官方说明

此处做一个转载备份

命令
#在本群中进行配置
所有命令都需要@bot 触发

添加订阅(仅管理员和群主和 SUPERUSER):添加订阅
关于中止订阅

对于v0.5.1及以上的版本中,已经为添加订阅命令添加了中止订阅的功能。
在添加订阅命令的几乎各个阶段,都可以向 Bot 发送取消消息来中止订阅过程(需要订阅发起者本人发送)

查询订阅:查询订阅
删除订阅(仅管理员和群主和 SUPERUSER):删除订阅
#私聊机器人获取后台地址
后台管理,之后点击返回的链接
如果你是 superuser,那么你可以管理所有群的订阅;
如果你是 bot 所在的群的其中部分群的管理,你可以管理你管理的群里的订阅;
如果你不是任意一个群的管理,那么 bot 将会报错。

TIP

可以和 bot 通过临时聊天触发

WARNING

网页的身份鉴别机制全部由 bot 返回的链接确定,所以这个链接并不能透露给别人。
并且链接会过期,所以一段时间后需要重新私聊 bot 获取新的链接。

#私聊机器人进行配置(需要 SUPERUER 权限)
请私聊 bot群管理

关于中止订阅

与普通的添加订阅命令一样,在群管理命令中使用的添加订阅命令也可以使用取消来中止订阅过程

#所支持平台的 uid
#Weibo
对于一般用户主页https://weibo.com/u/6441489862?xxxxxxxxxxxxxxx,/u/后面的数字即为 uid
对于有个性域名的用户如:https://weibo.com/arknights,需要点击左侧信息标签下“更多”,链接为https://weibo.com/6279793937/about,其中中间数字即为 uid
#Bilibili
主页链接一般为https://space.bilibili.com/161775300?xxxxxxxxxx,数字即为 uid

#RSS
RSS 链接即为 uid

#网易云音乐-歌手
在网易云网页上歌手的链接一般为https://music.163.com/#/artist?id=32540734,id= 后面的数字即为 uid

#网易云音乐-电台
在网易云网页上电台的链接一般为https://music.163.com/#/djradio?id=793745436,id= 后面的数字即为 uid

疫情提醒推送

  • [x] 完美运行
  1. 安装

    nb plugin install nonebot_plugin_covid19_news

    基本无需设置,开箱即用

  2. 用法

    github说明

epic限免资讯

  • [x] 完美运行
  1. 安装

    nb plugin install nonebot_plugin_epicfree
  2. 设置

    提醒时间,在.env.prod中添加

    EPIC_SCHEDULER="5 8 8 8"

    限免游戏资讯订阅默认每周六 08:08:08 发送,定义 EPIC_SCHEDULER 环境变量即可指定推送时间,该配置的四个数字依次代表 day_of_week hour minute second

  3. 使用

    • 发送「喜加一」查找限免游戏
    • 发送「喜加一订阅」订阅游戏资讯
    • 发送「喜加一订阅删除」取消订阅游戏资讯

    插件响应基于正则匹配,所以,甚至「EpIc喜+1」这样的指令都可用!

Apex Legends API 查询插件

  • [x] 完美运行
  1. 安装

    nb plugin install nonebot-plugin-apex-api-query
  2. 此处申请api密钥

    0cf4f7985811fbe8455f263f61abc10c

  3. 配置文件

    github

    使用方法
    在 __init__.py 中第 9 行 api_key = '' 里填入您的 API 密钥。

    这个写的很烂,因为必须找到__init__.py而不能在总设置里直接添加。因为我使用了venv虚拟环境,所以包都安装在了

    ~/qqbot/nonebot/lib/python3.10/site-packages

    具体要修改

    cd ~/qqbot/nonebot/lib/python3.10/site-packages
    vim ./nonebot_plugin_apex_api_query/__init__.py
  4. 运行

    nb run
  5. 使用,详见文档

    查询玩家信息

    /bridge [玩家名称]` 、 `/玩家 [玩家名称]`、 `/uid [玩家UID]`、 `/UID [玩家UID]

    暂不支持除 PC 外的平台查询。

    查询大逃杀地图轮换

    /maprotation` 、 `/地图

    查询猎杀者信息

    /predator` 、 `/猎杀

    查询复制器轮换

    /crafting` 、 `/制造

    每日60s读世界

  6. [x] 完美运行

github

  1. 安装

    nb plugin install nonebot-plugin-read-60s
  2. 配置

    在nonebot的.env.prod中输入以下内容

    #定时发送配置
    read_qq_friends=[12345678910] #设定要发送的QQ好友
    read_qq_groups=[123456789,123456789,123456789] #设定要发送的群
    read_inform_time=[{"HOUR":9,"MINUTE":1}] #在输入时间的时候 不要 以0开头如{"HOUR":06,"MINUTE":08}是错误的
  3. 设置好时间,运行

提取B站视频封面

  • [x] 完美运行
  1. 安装

    nb plugin install nonebot-plugin-bilicover
  2. 使用

    指令说明
    提取封面 + 视频链接/av号/bv号提取对应视频的封面图片

动漫资源获取插件

  • [x] 完美运行

github地址

  1. 安装

    nb plugin install nonebot-plugin-animeres
  2. 配置参数

    CARTOON_PROXY=                        # 设置代理端口
    CARTOON_FORWARD=false                 # 合并转发的形式发送消息
    CARTOON_LENGTH=3                      # 每次发送的数量,用-1表示全部取出
    CARTOON_FORMANT="{title}\n{magnet}"   # 发送的消息格式化
    CARTOON_ONESKIP=true                  # 当只有一个选项时跳过

    CARTOON_PROXY

    通过CARTOON_PROXY参数可以设置代理来加速资源的获取或者获取不到的情况

    CARTOON_FORWARD

    用来发送合并消息

    CARTOON_FORMANT

    格式化字符串

    标签说明
    title资源名称
    tag资源标签类型
    size资源大小
    magnet种子链接
  3. 使用

    • 命令

      • 资源动漫资源
    • 参数

      • 资源名称
    • 资源 孤独摇滚

青年大学习推送(有冲突)

github主页

  1. 安装

    nb plugin install nonebot-plugin-youthstudy
  2. 解决冲突

    青年大学习与疫情推送冲突

    1. 安装后nonebot-plugin-apschedulernonebot_plugin_covid19_news中要求冲突,nonebot-plugin-apscheduler版本被强行降低至0.1.4,重新安装nonebot-plugin-apscheduler0.2.0

      pip install nonebot-plugin-apscheduler==0.2.0
    2. 试运行,无报错
  3. 添加配置

    • 运行一遍bot,然后关闭
    • 在bot目录的data目录下修改生成的study_config.json文件,添加如下配置:

      • "SUPER_USERS": ["超级用户qq号"]
  4. 用法

    命令举例说明
    青年大学习/大学习青年大学习获取大学习答案
    开启/关闭大学习推送开启大学习推送在群聊中仅有超级用户能开启推送,私聊任何人都能开启推送,但需要加好友
    开启/关闭大学习全局推送关闭大学习全局推送关闭全局推送后,所有的群聊、私聊推送任务都会关闭,仅超级用户使用
    同意/拒绝+qq号同意1234567处理好友请求,仅超级用户使用
    同意/拒绝所有好友请求拒绝所有好友请求拒绝所有的好友请求,仅超级用户使用
    大学习截图大学习截图获取主页截图
    完成截图完成截图获取大学习完成截图
    大学习帮助大学习帮助获取命令列表

和风天气(X)

  1. 安装

    nb plugin install nonebot-plugin-heweather
  2. 获取和风天气API

    访问官网,注册账号,创建免费项目,获取API

  3. 编辑配置

    1. vim .env.prod
    2. apikey 必须配置 环境配置

      QWEATHER_APIKEY = xxx

      api类型 可选配置 环境配置

      0 = 普通版(3天天气预报) 1 = 个人开发版(7天天气预报) 2 = 商业版 (7天天气预报)

  4. 运行

    nb run

    无报错

  5. 指令

    天气+地区 或 地区+天气

    涩图插件(X)

  6. 安装

    nb plugin install nonebot_plugin_setu
  7. 解决冲突

    青年大学习与色图插件冲突

    报错如下:

    Installing collected packages: python-socks, tqdm, h11, httpcore, httpx-socks, nonebot-plugin-setu
      Attempting uninstall: h11
        Found existing installation: h11 0.14.0
        Uninstalling h11-0.14.0:
          Successfully uninstalled h11-0.14.0
      Attempting uninstall: httpcore
        Found existing installation: httpcore 0.16.1
        Uninstalling httpcore-0.16.1:
          Successfully uninstalled httpcore-0.16.1
    ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
    nonebot-plugin-youthstudy 1.1.6 requires nonebot-plugin-apscheduler<0.2.0,>=0.1.2, but you have nonebot-plugin-apscheduler 0.2.0 which is incompatible.

    两次冲突都是由于青年大学习插件,如果不是必要,可以考虑卸载了。

    如果能使用,那就暂时不动。

  8. 配置

    1. 首先运行一遍robot,然后在robot目录的data目录下修改setu_config.json配置文件,然后重启robot
    2. 添加配置

      • 在你的setu_config.json文件中修改如下配置:

        SUPERUSERS = ["主人的qq号"],可添加多个

        PROXIES_HTTP = 'HTTP魔法地址(例如http://127.0.0.1:7890),这与你使用的魔法有关'

        PROXIES_SOCKS = 'SOCKS5魔法地址(例如socks5://127.0.0.1:10808),这与你使用的魔法有关'

        :若没有魔法或者不会设置可不填

    另一个色图插件

    github地址

  9. 安装


2. env 配置项

> 以下配置项均可不填,插件会按照默认值读取

| config              | type | default     | example                                                      | usage                                                  |
| ------------------- | ---- | ----------- | ------------------------------------------------------------ | ------------------------------------------------------ |
| setu_disable_wlist  | bool | False       | setu_disable_wlist = True                                    | 是否禁用白名单检查(极度不推荐禁用)(详见权限控制系统)   |
| setu_enable_private | bool | False       | setu_enable_private = True                                   | 是否允许未在白名单的私聊会话使用(详见权限控制系统)     |
| setu_perm_cfg_path  | str  | see example | setu_perm_cfg_path = './data/setu4'                          | 会话(群号或QQ号)启用、r18及其他独立配置项              |
| setu_save           | str  | None        | setu_save = './data/setu4/img'                               | setu保存到本地的路径, 留空则不保存至本地               |
| setu_regex          | str  | see example | setu_save = see description[1](https://github.com/Special-Week/nonebot_plugin_setu4#user-content-fn-1-9ac6dd8b7b7add059f61300a936301fa) | setu插件的正则表达式匹配                               |
| setu_database_path  | str  | see example | setu_database_path = see description[2](https://github.com/Special-Week/nonebot_plugin_setu4#user-content-fn-2-9ac6dd8b7b7add059f61300a936301fa) | 更新使用的数据库的地址, 默认为此项目的resource文件夹下 |
| setu_cd*            | int  | 20          | setu_cd = 30                                                 | setu默认cd[0,+∞], 为0时无cd                            |
| setu_withdraw_time* | int  | 100         | setu_withdraw_time = 30                                      | setu默认撤回时间[0,100], 为0时不撤回                   |
| setu_max_num*       | int  | 10          | setu_max_num = 20                                            | setu默认一次性最大数量[1,25]                           |
| setu_proxy          | str  | i.pixiv.re  | setu_proxy = "i.pixiv.re"                                    | 下载图片的代理(一般我会把可用的代理设置成默认          |

> 带有*标识的设置项可在指定群聊被setu_perm_cfg.json中的内容覆盖

声明:Beyondlogic|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 创建QQ群聊机器人教程


我们最终会在没有黑暗的地方相遇