Skip to main content

No project description provided

Project description

arielBot

基于 NoneBot2 + Clean Architecture 的 B站 动态/直播 推送 QQ 机器人。

Python Tests Score

学习 Python? 这个项目是很好的学习材料。阅读 项目学习笔记 了解 Clean Architecture、异步编程、设计模式等核心概念。

功能

  • 订阅 B站 UP 主的动态和直播
  • 自动推送新动态(Skia 渲染卡片)和开播通知到 QQ 群
  • 扫码登录 B站,自动刷新 Cookie
  • 每 8 秒检查新动态,每 10 秒检查直播状态
  • 按群开关推送、按订阅开关动态/直播推送
  • 按动态 ID 查询动态卡片或提取原始图片
  • 动态自动归档(7 天后从 Dynamic 表迁移至 DynamicArchive,查询兼容两表)

架构

arielbot/
├── __init__.py                   # CLI 入口 (click)
├── bot.py                        # NoneBot 初始化
├── domain/                       # 领域层
│   ├── entities.py               # SubTarget, SubChannel, BotStatus
│   ├── events.py                 # DynamicDetected, LiveStatusChanged, ...
│   └── interfaces/               # ABC 抽象接口
│       ├── api.py                # BiliAuthAPI, BiliContentAPI
│       ├── bot_client.py         # BotClient
│       ├── event_bus.py          # EventBus
│       ├── renderer.py           # DynRenderer, SubListRenderer, HelpRenderer
│       └── repository.py         # 5 个 Repository 接口
├── application/                  # 应用层 (业务逻辑)
│   ├── auth_service.py           # 扫码登录 + Cookie 管理
│   ├── bot_status_service.py     # Bot 状态管理
│   ├── query_service.py          # 查询服务 (动态/图片/列表)
│   ├── subscription_service.py   # 订阅管理
│   └── push/
│       ├── check_jobs.py         # DynCheckJob (8s), LiveCheckJob (10s)
│       └── handlers.py           # DynPushHandler, LivePushHandler, ...
├── infrastructure/               # 基础设施层
│   ├── container.py              # DI 容器 (所有依赖注入)
│   ├── database.py               # SQLite + WAL 模式 + 索引 + 迁移
│   ├── event_bus.py              # asyncio.Queue 事件总线
│   ├── repositories/             # 仓储实现
│   │   ├── bot_repository.py
│   │   ├── cookie_repository.py
│   │   ├── dyn_repository.py     # 含 DynamicArchive 归档逻辑
│   │   ├── sub_repository.py     # SqlSubChannelRepository
│   │   └── target_repository.py  # SqlSubTargetRepository
│   └── adapters/                 # 外部适配器
│       ├── bili_api.py           # B站 API (WBI 签名)
│       ├── bili_auth.py          # 登录 + CookieManager
│       ├── bili_cookie_utils.py  # Cookie 序列化/解析
│       ├── bot_client.py         # NoneBot 消息发送
│       └── renderer.py           # Skia 渲染 (线程池) + SkiaHelpRenderer
├── presentation/                 # 表现层
│   ├── message_utils.py          # MessageSegment 封装
│   ├── commands/                 # 命令注册 + 处理器工厂
│   │   ├── registry.py           # 12 个命令注册器
│   │   ├── auth_commands.py
│   │   ├── sub_commands.py
│   │   └── query_commands.py
│   ├── scheduler/__init__.py     # APScheduler 定时任务 (含动态归档)
│   └── middleware/__init__.py    # 权限规则 + 生命周期钩子
└── plugins/Core/__init__.py      # 组合根 (插件入口)

设计原则

原则 实现方式
SRP 单一职责 每层独立,每个 Service/Repository 单一职责
OCP 开闭原则 新增推送类型只需添加 CheckJob + Handler,无需改现有代码
LSP 里氏替换 全 ABC 接口定义契约,实现可任意替换
ISP 接口隔离 5 个 Repository 接口,各自只暴露相关方法
DIP 依赖反转 服务依赖接口,Container 注入具体实现
LoD 迪米特法则 Service 只调用 Repository/API 接口

数据流

定时任务 → CheckJob.run()
  → API 获取数据 → 缓存去重 → 查推送目标 → 渲染
  → event_bus.publish(事件)
       ↓
  Handler.handle(事件) → bot_client.send_group_msg()

事件驱动架构

┌────────────────────────────────────────────────────┐
│              EventBus (asyncio.Queue)               │
│                                                     │
│  DynCheckJob ──→ DynamicDetected    ──→ DynPush     │
│  LiveCheckJob ─→ LiveStatusChanged  ──→ LivePush    │
│  driver.on_connect ─→ BotConnected  ──→ Lifecycle   │
│  driver.on_disconnect → BotDisconnected             │
│  driver.on_shutdown   → BotShutdown                 │
└────────────────────────────────────────────────────┘

安装

git clone https://github.com/Polyisoprene/ariel.git
cd ariel
poetry install

运行

poetry run ariel run

首次运行会自动在项目根目录创建 .env.prod 配置文件和 plugins/ 目录。

命令列表

命令 别名 权限 说明
/login 登录 SUPERUSER 扫码登录 B站
/sub <uid> 订阅 管理员 订阅 UP 主
/unsub <uid> 删除 管理员 取消订阅
/live_on <uid> 管理员 开启直播推送
/live_off <uid> 管理员 关闭直播推送
/dyn_on <uid> 管理员 开启动态推送
/dyn_off <uid> 管理员 关闭动态推送
/bot_on 管理员 开启群内推送
/bot_off 管理员 关闭群内推送
/list 列表 查看订阅列表
/help 帮助信息
/sd <dyn_id> 查看动态渲染卡片
/img <dyn_id> 提取动态原始图片

测试

poetry run pytest tests/ -v

87 个测试覆盖 domain / application / infrastructure / presentation 四层。

tests/
├── test_domain/          # 7 tests
├── test_application/     # 42 tests
├── test_infrastructure/  # 25 tests
└── test_presentation/    # 2 tests

代码质量

维度 评分
架构 29/30
健壮性 26/30
可扩展性 12/15
设计原则 17/18
性能 8/7
总计 92/100

技术栈

组件 技术
框架 NoneBot2 + OneBot V11
驱动 FastAPI
数据库 SQLite (aiosqlite + WAL)
渲染 Skia-python (dynrender-skia)
调度 APScheduler
HTTP httpx.AsyncClient
加密 pycryptodome (RSA-OAEP)
QR qrcode + PyPNG
包管理 Poetry
测试 pytest + pytest-asyncio

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arielbot-0.7.3.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arielbot-0.7.3-py3-none-any.whl (37.7 kB view details)

Uploaded Python 3

File details

Details for the file arielbot-0.7.3.tar.gz.

File metadata

  • Download URL: arielbot-0.7.3.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.12.8 Windows/10

File hashes

Hashes for arielbot-0.7.3.tar.gz
Algorithm Hash digest
SHA256 766e0524fa2007405d79d5573acf80943bcf676e01bcac4b479bbf1aca89047f
MD5 eadf5a6b26c4f8ff0defcd158e7afc10
BLAKE2b-256 418a7b4a2b39fcdf12ae21bd9722be9b503681daf61a5049bf55a882930d20e7

See more details on using hashes here.

File details

Details for the file arielbot-0.7.3-py3-none-any.whl.

File metadata

  • Download URL: arielbot-0.7.3-py3-none-any.whl
  • Upload date:
  • Size: 37.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.12.8 Windows/10

File hashes

Hashes for arielbot-0.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c3910250bfc3aba504f3a14ea0d093b0424a3397436c1fe599694ed8d8ee20ee
MD5 96bc265a2ebe9d4520af31d6c3f9f541
BLAKE2b-256 c2901cb51fccf1e0312ae23b49a054be60d75f7e6d781ab36ed2a329febd511d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page