Files
WechatHookBot/docs/MemoryBank/02-开发日志.md
2025-12-03 15:48:44 +08:00

3.6 KiB

开发日志

2025-11-12

项目初始化

  • 创建 WechatHookBot 项目结构
  • 从 XYBot 复制 utils 和 database 模块
  • 设计技术架构文档

Hook API 集成

  • 封装 NoveLoader (Loader.dll)
  • 封装 WechatHookClient (API 客户端)
  • 实现消息类型映射和格式转换
  • 实现回调处理机制

启动调试

问题: 回调未触发,无法接收消息

  • 尝试1: 调整回调注册顺序 - 失败
  • 尝试2: 修改事件循环处理 - 失败
  • 解决: 添加共享内存创建 (create_shared_memory)
    • 关键发现: DLL 需要共享内存进行通信
    • 参考官方 Demo 第 357-365 行

问题: Socket 客户端 ID 混淆

  • 使用进程 ID 发送消息 - 失败
  • 解决: 区分进程 ID 和 Socket 客户端 ID
    • InjectWeChat 返回进程 ID
    • 回调中的 client_id 是 Socket ID (通常为 1)

问题: 登录信息获取失败

  • 使用 type=11028 - 错误
  • 解决: 实际类型是 type=11025
    • 登录信息在注入后自动推送
    • 包含 wxid, nickname, account, avatar 等字段

问题: 消息类型映射错误

  • 使用 10001-10013 - 错误
  • 解决: 实际类型是 11046-11061
    • 文本消息: 11046
    • 图片消息: 11047
    • 其他类型依次递增

问题: 群聊消息处理失败

  • 使用 from_wxid 判断群聊 - 错误
  • 解决: 使用 room_wxid 字段判断
    • 群聊消息: room_wxid 不为空
    • 私聊消息: room_wxid 为空
    • 消息内容字段: msg (不是 content)

插件开发

AIChat 插件

  • 支持自定义 API 配置
  • 支持人设切换 (txt 文件)
  • 三种触发模式: all/mention/keyword
  • 群聊/私聊分别控制

问题: 插件配置未加载

  • 使用 on_load 方法 - 失败
  • 解决: 使用 async_init 方法
    • 插件基类只支持 async_init
    • on_enable 用于定时任务注册

ManagePlugin 插件

  • 插件列表查看
  • 热重载功能
  • 启用/禁用插件
  • 权限控制(管理员)

命令列表:

  • /插件列表 - 查看所有插件状态
  • /重载插件 <名称> - 热重载指定插件
  • /启用插件 <名称> - 启用插件
  • /禁用插件 <名称> - 禁用插件

依赖管理

最终依赖:

loguru==0.7.3
APScheduler==3.11.0
aiohttp==3.9.1

移除的依赖:

  • SQLAlchemy (需要 C++ 编译)
  • eventlet (msgspec 不支持 32 位)
  • Flask (不需要 WebUI)

关键技术点

  1. 共享内存创建
def create_shared_memory():
    kernel32 = ctypes.WinDLL('kernel32')
    file_handle = kernel32.CreateFileMappingA(-1, None, 4, 0, 33,
                                               "windows_shell_global__".encode('utf-8'))
    data_address = kernel32.MapViewOfFile(file_handle, 983071, 0, 0, 0)
    key = "3101b223dca7715b0154924f0eeeee20".encode('utf-8')
    kernel32.RtlMoveMemory(data_address, key, len(key))
  1. 异步回调处理
# 在回调线程中使用事件循环
asyncio.run_coroutine_threadsafe(
    self.hookbot.process_message(msg_type, data),
    self.event_loop
)
  1. 消息格式转换
# 群聊判断
room_wxid = data.get("room_wxid", "")
if room_wxid:
    message["IsGroup"] = True
    message["FromWxid"] = room_wxid
    message["SenderWxid"] = data.get("from_wxid", "")

测试结果

成功测试:

  • 机器人启动和注入
  • 登录信息获取
  • 私聊消息接收
  • 群聊消息接收
  • ping-pong 测试
  • 插件管理命令
  • AI 聊天功能

下一步计划

  1. 完善插件功能
  2. 添加更多消息类型支持
  3. 优化错误处理
  4. 编写使用文档