Skip to main content

No project description provided

Project description

arielBot

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

Python Tests Score

功能

  • 订阅 B站 UP 主的动态和直播
  • 自动推送新动态(Skia 渲染卡片)和开播通知到 QQ 群
  • 扫码登录 B站,自动刷新 Cookie
  • 每 8 秒检查新动态,每 10 秒检查直播状态
  • 按群开关推送、按订阅开关动态/直播推送
  • 按动态 ID 查询动态卡片或提取原始图片

架构

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
│       └── 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
│   │   ├── 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 渲染 (线程池)
├── 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.5.1.tar.gz (20.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.5.1-py3-none-any.whl (35.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for arielbot-0.5.1.tar.gz
Algorithm Hash digest
SHA256 eaf54a5f90de237205db580a1348ec498adfd2a8fe08fc24bbab97487f717c12
MD5 3536a60f41d24180b23d7ff76d54eb28
BLAKE2b-256 7bd780b5a526f5b250914b29081f0aba3068d61a0c64f71e5b2075b731eae571

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for arielbot-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 79333586f047fe7c82b4c9456f7a9ea066bc755ce400a8c953641bcef677c0a6
MD5 83f53b882f1bc4bdc2e3ca88925e9779
BLAKE2b-256 6808bf362f5c4c2801ce388298cf9cd9b1c6095ec1eb41b5351b0acf9d93658d

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