nonebot,cqhttp 机器人学习1

NoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。

除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。

目录

1.NoneBot部分
安装NoneBot
安装适配器
安装插件
开始使用
创建一个空项目
创建插件
加载插件
加载插件目录
注册事件响应器
2.cqhttp部分
配置协议端上报

文章中涉及到的cqhttp 官方文档,noneBot文档
noneBot模块

安装NoneBot

pip install nb-cli

安装适配器

pip install nonebot-adapter-<adapter-name>
	# 列出所有的适配器
	nb adapter list

安装插件

# 列出所有的插件
nb plugin list
# 搜索插件
nb plugin search xxx
# 安装插件
nb plugin install xxx

开始使用

创建一个空项目

nb create

创建完的项目结构如下

AweSome-Bot
├── awesome_bot (或是 src)
│   └── plugins
├── .env (可选的)
├── .env.dev (可选的)
├── .env.prod (可选的)
├── .gitignore
├── bot.py
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml
└── README.md

创建插件

nb plugin new

加载插件

在 bot.py 文件中添加以下行:

		import nonebot
		from nonebot.adapters.cqhttp import Bot
		
		nonebot.init()
		
		driver = nonebot.get_driver()
		driver.register_adapter("cqhttp", Bot) # 注册 CQHTTP 的 Adapter
		nonebot.load_builtin_plugins() # 加载 nonebot 内置插件
		
		app = nonebot.get_asgi()
		
		if __name__ == "__main__":
		    nonebot.run()

加载插件目录

import nonebot

nonebot.init()
# 加载插件目录,该目录下为各插件,以下划线开头的插件将不会被加载
nonebot.load_plugins("awesome_bot/plugins")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()

注册事件响应器

好了,现在插件已经创建完毕,我们可以开始编写实际代码了,下面将以一个简易单文件天气查询插件为例。

在插件目录下 weather.py 中添加如下代码:

from nonebot import on_command
from nonebot.rule import to_me
from nonebot.typing import T_State
from nonebot.adapters import Bot, Event

weather = on_command("天气", rule=to_me(), priority=5)


@weather.handle()
async def handle_first_receive(bot: Bot, event: Event, state: T_State):
    args = str(event.get_message()).strip()  # 首次发送命令时跟随的参数,例:/天气 上海,则args为上海
    if args:
        state["city"] = args  # 如果用户发送了参数则直接赋值


@weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: T_State):
    city = state["city"]
    if city not in ["上海", "北京"]:
        await weather.reject("你想查询的城市暂不支持,请重新输入!")
    city_weather = await get_weather(city)
    await weather.finish(city_weather)


async def get_weather(city: str):
    return f"{city}的天气是..."

配置协议端上报
配置 CQHTTP

安装 NoneBot CQHTTP 适配器

pip install nonebot-adapter-cqhttp

这里以 go-cqhttp为例

下载 go-cqhttp 对应平台的 release 文件,点此前往
运行 exe 文件或者使用 ./go-cqhttp 启动
生成默认配置文件并修改默认配置

	{
     
  uin: 机器人QQ号
  password: 机器人密码
  encrypt_password: false
  password_encrypted: ""
  enable_db: true
  access_token: ""
  relogin: {
     
    enabled: true
    relogin_delay: 3
    max_relogin_times: 0
  }
  _rate_limit: {
     
    enabled: false
    frequency: 1
    bucket_size: 1
  }
  ignore_invalid_cqcode: false
  force_fragmented: false
  heartbeat_interval: 0
  http_config: {
     
    enabled: false
    host: "0.0.0.0"
    port: 5700
    timeout: 0
    post_urls: {
     }
  }
  ws_config: {
     
    enabled: false
    host: "0.0.0.0"
    port: 6700
  }
  ws_reverse_servers: [
    {
     
      enabled: true
      reverse_url: ws://127.0.0.1:8080/cqhttp/ws
      reverse_api_url: ws://you_websocket_api.server
      reverse_event_url: ws://you_websocket_event.server
      reverse_reconnect_interval: 3000
    }
  ]
  post_message_format: array
  use_sso_address: false
  debug: false
  log_level: ""
  web_ui: {
     
    enabled: false
    host: 127.0.0.1
    web_ui_port: 9999
    web_input: false
  }
}

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

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

以下为下载的实际修改的go-cqhttp配置
在这里插入图片描述
nonebot,cqhttp 机器人学习1_第1张图片

# go-cqhttp 默认配置文件

account: # 账号相关
  uin: 1324667002 # QQ账号
  password: 'qq密码' # 密码为空时使用扫码登录
  encrypt: false  # 是否开启密码加密
  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
  relogin: # 重连设置
    delay: 3   # 首次重连延迟, 单位秒
    interval: 3   # 重连间隔
    max-times: 0  # 最大重连次数, 0为无限制

  # 是否使用服务器下发的新地址进行重连
  # 注意, 此设置可能导致在海外服务器上连接情况更差
  use-sso-address: true

heartbeat:
  # 心跳频率, 单位秒
  # -1 为关闭心跳
  interval: 5

message:
  # 上报数据类型
  # 可选: string,array
  post-format: string
  # 是否忽略无效的CQ码, 如果为假将原样发送
  ignore-invalid-cqcode: false
  # 是否强制分片发送消息
  # 分片发送将会带来更快的速度
  # 但是兼容性会有些问题
  force-fragment: false
  # 是否将url分片发送
  fix-url: false
  # 下载图片等请求网络代理
  proxy-rewrite: ''
  # 是否上报自身消息
  report-self-message: false
  # 移除服务端的Reply附带的At
  remove-reply-at: false
  # 为Reply附加更多信息
  extra-reply-data: false

output:
  # 日志等级 trace,debug,info,warn,error
  log-level: warn
  # 是否启用 DEBUG
  debug: false # 开启调试模式

# 默认中间件锚点
default-middlewares: &default
  # 访问密钥, 强烈推荐在公网的服务器设置
  access-token: ''
  # 事件过滤器文件目录
  filter: ''
  # API限速设置
  # 该设置为全局生效
  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
  # 目前该限速设置为令牌桶算法, 请参考:
  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
  rate-limit:
    enabled: false # 是否启用限速
    frequency: 1  # 令牌回复频率, 单位秒
    bucket: 1     # 令牌桶大小

database: # 数据库相关设置
  leveldb:
    # 是否启用内置leveldb数据库
    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
    enable: true

# 连接服务列表
servers:
  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
  #- http: # http 通信
  #- ws:   # 正向 Websocket
  #- ws-reverse: # 反向 Websocket
  #- pprof: #性能分析服务器
  # HTTP 通信设置
  - http:
      # 服务端监听地址
      host: 127.0.0.1
      # 服务端监听端口
      port: 5700
      # 反向HTTP超时时间, 单位秒
      # 最小值为5,小于5将会忽略本项设置
      timeout: 5
      middlewares:
        <<: *default # 引用默认中间件
      # 反向HTTP POST地址列表
      post:
      #- url: '' # 地址
      #  secret: ''           # 密钥
      #- url: 127.0.0.1:5701 # 地址
      #  secret: ''          # 密钥
  # 正向WS设置
  - ws:
      # 正向WS服务器监听地址
      host: 127.0.0.1
      # 正向WS服务器监听端口
      port: 6700
      middlewares:
        <<: *default # 引用默认中间件
  # 反向WS设置
  - ws-reverse:
      # 反向WS Universal 地址
      # 注意 设置了此项地址后下面两项将会被忽略
      universal: ws://127.0.0.1:8080/cqhttp/ws
      # 反向WS API 地址
      api: ws://your_websocket_api.server
      # 反向WS Event 地址
      event: ws://your_websocket_event.server
      # 重连间隔 单位毫秒
      reconnect-interval: 3000
      middlewares:
        <<: *default # 引用默认中间件
  # pprof 性能分析服务器, 一般情况下不需要启用.
  # 如果遇到性能问题请上传报告给开发者处理
  # 注意: pprof服务不支持中间件、不支持鉴权. 请不要开放到公网
  - pprof:
      # pprof服务器监听地址
      host: 127.0.0.1
      # pprof服务器监听端口
      port: 7700

你可能感兴趣的:(pyhon机器人)