Files
WechatHookBot/docs/架构设计.md
2025-12-03 15:48:44 +08:00

8.2 KiB
Raw Permalink Blame History

WechatHookBot 架构设计

技术架构

四层架构

┌─────────────────────────────────────────────────────────────┐
│  第四层WebUI 层(可选)                                     │
│  Flask + SocketIO + Bootstrap                                │
│  - 插件管理、消息监控、配置管理                               │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│  第三层:插件层(完全复用 XYBot                             │
│  PluginManager → PluginBase → 具体插件                       │
│  装饰器:@on_text_message, @on_image_message, @schedule     │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│  第二层Bot 核心层                                           │
│  HookBot - 消息预处理、路由、类型映射                         │
│  EventManager - 事件分发、优先级、阻塞机制                    │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│  第一层WechatHook 层                                        │
│  WechatHookClient - API 封装                                 │
│  NoveLoader - DLL 调用                                       │
│  回调处理器 - Socket 回调                                     │
└─────────────────────────────────────────────────────────────┘
                            ↕
┌─────────────────────────────────────────────────────────────┐
│  底层DLL 层                                                 │
│  Loader.dll ←→ Helper.dll (注入微信进程) ←→ 微信客户端       │
└─────────────────────────────────────────────────────────────┘

消息流转

接收消息流程

微信消息
  → Helper.dll (注入微信进程)
  → Socket 回调
  → on_recv_callback(client_id, msg_type, data)
  → HookBot.process_message()
  → 消息类型映射 (type → event)
  → EventManager.emit(event_type, client, message)
  → 插件事件处理器(按优先级执行)

发送消息流程

插件调用
  → client.send_text(wxid, content)
  → WechatHookClient 封装
  → 构造 JSON payload {"type": 11036, "data": {...}}
  → NoveLoader.SendWeChatData()
  → Loader.dll
  → Helper.dll
  → 微信发送

核心模块

1. WechatHook 层

NoveLoader - DLL 函数封装

class NoveLoader:
    - InitWeChatSocket()      # 初始化回调
    - InjectWeChat()          # 注入微信
    - SendWeChatData()        # 发送数据
    - DestroyWeChat()         # 销毁连接

WechatHookClient - API 封装

class WechatHookClient:
    - send_text()             # 发送文本
    - send_image()            # 发送图片
    - send_file()             # 发送文件
    - get_friend_list()       # 获取好友列表
    - get_chatroom_list()     # 获取群聊列表
    - add_friend()            # 添加好友
    # ... 更多 API

2. Bot 核心层

HookBot - 消息处理核心

class HookBot:
    - process_message()       # 处理消息
    - _normalize_message()    # 统一消息格式
    - _filter_message()       # 白名单/黑名单过滤

EventManager - 事件管理(复用 XYBot

class EventManager:
    - bind_instance()         # 绑定插件实例
    - emit()                  # 触发事件
    - unbind_instance()       # 解绑实例

3. 插件层

PluginBase - 插件基类(复用 XYBot

class PluginBase:
    description: str
    author: str
    version: str

    async def on_enable()     # 启用时调用
    async def on_disable()    # 禁用时调用
    async def async_init()    # 异步初始化

装饰器系统(复用 XYBot

  • @on_text_message - 文本消息
  • @on_image_message - 图片消息
  • @on_voice_message - 语音消息
  • @on_at_message - @消息
  • @schedule - 定时任务

消息类型映射

从个微 API 的 type 值映射到内部事件类型:

MESSAGE_TYPE_MAP = {
    # 需要根据实际 API 文档补充
    10001: "text_message",
    10002: "image_message",
    10003: "voice_message",
    10004: "video_message",
    10005: "file_message",
    10006: "card_message",
    10007: "location_message",
    10008: "link_message",
    10009: "miniapp_message",
    10010: "emoji_message",
    10011: "revoke_message",
    10012: "system_message",
    10013: "friend_request",
    # 群聊通知
    10020: "chatroom_member_add",
    10021: "chatroom_member_remove",
}

数据库设计

复用 XYBot 的数据库架构:

XYBotDB (SQLite)

  • 用户表 - 用户信息、积分
  • 签到表 - 签到记录
  • 其他业务表

MessageDB (SQLite + aiosqlite)

  • 消息记录表(可选)

KeyvalDB (SQLite + aiosqlite)

  • 键值存储表
  • 用于配置、状态管理

配置系统

main_config.toml

[WechatHook]
loader-dll = "libs/Loader.dll"
helper-dll = "libs/Helper.dll"

[Bot]
version = "v1.0.0"
admins = ["admin_wxid"]
disabled-plugins = []
timezone = "Asia/Shanghai"

# 消息过滤
ignore-mode = "None"  # None/Whitelist/Blacklist
whitelist = []
blacklist = []

[Database]
xybot-db = "sqlite:///database/hookbot.db"
message-db = "sqlite+aiosqlite:///database/message.db"
keyval-db = "sqlite+aiosqlite:///database/keyval.db"

[WebUI]
admin-username = "admin"
admin-password = "admin123"
session-timeout = 30

与 XYBot 的对比

特性 XYBot WechatHookBot
底层技术 协议实现 DLL Hook
登录方式 二维码/唤醒 无需登录
依赖 Redis
消息接收 sync_message 轮询 Socket 回调
插件系统 完全兼容
风控风险
多开支持 需多实例 原生支持
Python 版本 3.11 3.x (32位)

优势

  1. 架构更简单:无需 Redis减少依赖
  2. 无需登录Hook 已登录微信,省去登录流程
  3. 实时性更好Socket 回调,无需轮询
  4. 代码复用80% 代码可复用 XYBot

注意事项

  1. 32位限制DLL 是 32位必须使用 32位 Python
  2. 风控风险Hook 方式风控风险较高
  3. 依赖微信:必须有微信客户端在运行
  4. 杀软拦截DLL 可能被杀毒软件拦截

开发路线

第一阶段:基础框架

  • WechatHook 层实现
  • HookBot 核心类
  • 消息类型映射
  • 基础 API 封装

第二阶段:插件系统

  • 复用 XYBot 插件系统
  • 适配消息格式
  • 测试插件兼容性

第三阶段:完善功能

  • 数据库集成
  • 配置系统
  • 日志系统
  • 错误处理

第四阶段WebUI可选

  • 复用 XYBot WebUI
  • 适配 Hook API
  • 实时监控界面