nonebot-plugin-cs2match
✨ CS2赛事查询 ✨
📖 介绍
实时追踪 Counter-Strike 2 职业赛事,进行开赛自动提醒与大比分异动推送。
💿 安装
使用 nb-cli 安装
在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装nb plugin install nonebot-plugin-cs2match
使用包管理器安装
在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令pip
pip install nonebot-plugin-cs2match
pdm
pdm add nonebot-plugin-cs2match
poetry
poetry add nonebot-plugin-cs2match
conda
conda install nonebot-plugin-cs2match
打开 nonebot2 项目根目录下的 pyproject.toml 文件, 在 [tool.nonebot] 部分追加写入
plugins = ["nonebot_plugin_cs2match"]
⚙️ 配置
下表中的配置可通过插件的config.py或 NoneBot 的.env提供
| 配置项 | 必配置 | 默认值 | 说明 |
|---|---|---|---|
| pandascore_token | 是 | 无 | PandaScore提供商获取的Token |
| serie_rules | 否 | 见文件 | 按照优先级给赛事系列排序(同时也是赛事系列白名单) |
| client_timeout | 否 | 10 | API调用客户端最大超时限制,单位为秒 |
| cache_ttl | 否 | 60 | api请求临时缓存存活时间及比赛监视检测间隔时间,单位为秒 |
| cache_max_size | 否 | 64 | API请求内存缓存中最多保留的条目数 |
| match_page_size | 否 | 100 | 比赛列表接口每页条数(PandaScore 上限为 100) |
| max_misses | 否 | 3 | 连续多少轮“确证比赛已不存在”后自动取消监视。仅统计单场比赛接口明确返回 404 的轮次 |
| render_cache_cleanup_interval | 否 | 60 | 渲染缓存的后台清理间隔,单位为分钟 |
| render_cache_renewal_duration | 否 | 30 | 渲染缓存命中后的续期时长,单位为分钟 |
| matches_per_image | 否 | 20 | /matches 每张图片最多渲染多少场比赛(决定图片字节数) |
| matches_max_images | 否 | 3 | /matches 最多发几张图;受 QQ“每个消息最多回复 5 次”限制 |
以上配置既可以在插件的config.py中修改,也可以通过 NoneBot 的.env提供(如CACHE_TTL=30)。
比赛列表分页说明
QQ 群聊发图片走的是“内联 base64 上传”,图片过大会被平台拒收
(40093011 上传文件大小超过限制;官方文档只承诺 URL 上传与分片上传,未公开内联上限)。
长图按场次增长很快(实测约 13.6KiB/场,ppi=144:20 场 ≈ 273KiB、100 场 ≈ 1.3MiB),因此 /matches 会分页:
- 每张图最多
matches_per_image场(默认 20),最多发matches_max_images张(默认 3); - 多页时逐张发送,不额外发文字消息(QQ 被动回复一条消息最多 5 次,已有一条“请稍候”占位);
- 超出上限的场次会在最后一张图里提示“已省略 N 场,可用 /matches past|running|upcoming 缩小范围”;
- 列表较短时仍然是一张图,且渲染内容与旧版逐字节一致(渲染缓存继续命中);
- 若仍然遇到上传超限,把
MATCHES_PER_IMAGE调小(例如 10 场 ≈ 144KiB)即可,无需改代码。
缓存机制说明
- API 请求有内存级 TTL 缓存(
cache_ttl秒)与并发合并(同一请求只发一次),容量由cache_max_size限制。 - 渲染出的图片以内容哈希为键落盘缓存,命中时直接复用,不必重复调用 Typst 渲染。
- 落盘缓存按
render_cache_renewal_duration(分钟)续期,并每render_cache_cleanup_interval(分钟) 清理一次过期与失去元信息的孤儿文件;缓存目录由nonebot_plugin_localstore决定,删除该目录即可强制重新渲染。
监视机制说明
- 监视目标的存活不依赖比赛列表的“第一页窗口”:列表里找不到时会按比赛 ID 直查单场比赛接口,
只有接口明确返回 404(比赛确实不存在)才计入
max_misses;接口报错、限流、窗口滑动都不会导致监视被取消。 - 若比赛列表接口调用失败,本轮不判定任何目标消失,也不会误取消监视。
- 监视任务按 Bot 实例(
self_id)隔离;单个 Bot 掉线只影响它自己,且任务异常退出后会记录原因并在下次/monitor时自动重启,不会再出现“监视静默停止”。 - 主动消息发送失败是意外错误,不重试:监视推送属于“主动消息”,遇到无权限、网络不可达、登录失效等情况时
只记录 ERROR 日志(含群的场景 ID 与 QQ 错误码
code/message/trace_id)并跳过该群, 不回滚比赛状态、不在下一轮重发,其他群不受影响。 /monitor会先检查主动推送权限:通过GET /v2/groups/{group_openid}/bot_state读取allow_proactive_msg,明确为 false 时直接拒绝订阅并提示群管理员开启(cancel不受影响)。 该接口目前仅白名单机器人可用,查不到时按“无法判定”放行,由发送侧兜底。/monitor默认略过已结束/已取消的比赛:比赛列表是past + running + upcoming拼接, 已结束的排在最前面,因此按战队名搜索时必须先过滤终态场次,否则会命中一场已经打完的比赛。 过滤后多场可监视时按running → not_started → postponed → 其他排序取第一场,并提示 “按战队名匹配到 N 场可监视的比赛(已略过已结束/已取消的)”;若只匹配到终态场次,会明确提示 “匹配到的「X vs Y」已结束或已取消,无法监视”。/match(比分查询)不受影响,仍可查已结束的比赛。
部分运行时配置(DynamicConfig)仅开放运行时修改,详情查阅指令表
QQ 指令面板(命令帮助的 API 化)
QQ 官方机器人可以在单聊与群聊里展示「指令面板」:用户点选面板里的元素即可把命令填进输入框, 相当于把插件的命令帮助直接交给 QQ 客户端展示。插件无需任何开关或指令,行为完全固定:
- 面板内容写死在
panel.py的COMMAND_SPECS里(单聊 4 条:cs2help、比赛列表、比分、我的id; 群聊 6 条,额外包含仅管理员可点的监视、白名单),没有运行时修改入口; - QQ 机器人每次连接时自动同步一次:
GET /v2/panels按remark=cs2match-cmd-panel查找已有面板, 有则PUT /v2/panels/{panel_id}覆盖、没有则POST /v2/panels创建,不会堆积重复面板; - 非 QQ 适配器(如 OneBot)或适配器未提供该能力时直接跳过,且同步失败只记日志,不影响机器人运行。
接口限制与排查:
- 接口频率限制 10 QPM,一个机器人最多 20 个指令面板,一个面板最多 20 个元素;
- 元素名 ≤ 14 字符(约 7 个中文汉字),描述 ≤ 30 字符(约 15 个中文汉字),插件会按此预算自动裁剪并记 warning;
- 错误码含义:
40030013超出数量限制、40030020内容存在安全风险、40030009面板操作进行中(插件会退避重试一次);11253/11254表示该机器人未获得指令面板接口权限或接口被封禁,需要在 QQ 开放平台申请; - 若接口返回 404,说明适配器默认的 API base(
https://api.sgroup.qq.com)不提供该接口, 可把适配器已有的配置QQ_API_BASE指向https://api.bot.qq.com。
🎉 使用
命令前缀跟随 NoneBot 的 COMMAND_START 配置:插件已对每个 alconna 命令声明 use_cmd_start=True
(nonebot_plugin_alconna 默认不会把 COMMAND_START 当作 alconna 命令前缀,不声明的话
/cs2help 不会被识别)。因此:
- 宿主配置
COMMAND_START含空串(如{"", "/"})时,/cs2help与cs2help都可以用; - 宿主只配
{"/"}时,只能写/cs2help;宿主只配{""}时,只能写cs2help。
下表按"无前缀"写法列出(表内命令在 {"", "/"} 配置下同样可以加 / 使用)。
指令表
| 指令 | 权限 | 需要@ | 范围 | 说明 |
|---|---|---|---|---|
cs2help / cs2帮助 |
所有人 | 否 | 任何 | 获取插件命令用法 |
matches [past/running/upcoming] |
所有人 | 否 | 任何 | 比赛列表获取。matches可用比赛列表代替。 |
match <slug/队名> |
所有人 | 否 | 任何 | 比赛大比分获取,支持直接输入战队名(同名多场时展示第一个并提示)。match可用比分代替。 |
monitor <slug/队名> |
群管/SUPERUSER | 否 | 群聊 | 追加监视比赛开始、大比分变动、结束,参数为“cancel”时取消本群全部监听。按战队名搜索时默认略过已结束/已取消的比赛。monitor可用监视代替。 |
cs2whitelist <on/off> |
群管/SUPERUSER | 否 | 任何 | 设置比赛列表是否仅显示白名单赛事系列。cs2whitelist可用白名单代替。 |
cs2uid |
所有人 | 否 | 任何 | 查看自己的用户ID与当前场景ID。 |
Metadata
Release files for nonebot-plugin-cs2match 1.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nonebot_plugin_cs2match-1.2.2.tar.gz | 35.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nonebot_plugin_cs2match-1.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.4 kB
Release files / nonebot_plugin_cs2match-1.2.2.tar.gz
| Download URL | nonebot_plugin_cs2match-1.2.2.tar.gz |
|---|---|
| Size | 35.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
86967db1aaa2835e9381597a290a92f7dda2b127c3070b34a17d0fb5a6c44c98
|
|
BLAKE2b-256 checksum How to use checksums |
dc9f7249ced899414cb9a1c1baace06a13ad7faaeb6cac005815a59b41b70edb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nonebot_plugin_cs2match-1.2.2-py3-none-any.whl
| Download URL | nonebot_plugin_cs2match-1.2.2-py3-none-any.whl |
|---|---|
| Size | 44.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
295390186161434eace43b915f0b1442e022058805a6de57f45ed726e51eb0d2
|
|
BLAKE2b-256 checksum How to use checksums |
e05cd32c62fb4b61a245ee783b5d982823e8a6633483c1b653ed77a407c3c925
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|