Skip to content

个人微信(wechat_db) ​

直读微信 4.x 桌面版的加密 SQLite 数据库,实时接收消息;通过模拟键鼠实现发送消息。无需 Hook、无需注入,兼容性好。

适配器类型:"wechat_db" 源码:src/adapter/wechat_db/ 协议:微信 4.x 本地数据库(WCDB 魔改版 SQLCipher)+ Windows 模拟键鼠发送。

说明 ​

特点 ​

  • 直读数据库,不注入、不 Hook,不影响微信正常运行
  • 支持私聊、群聊消息接收
  • 支持文本、图片、语音、视频、文件发送(模拟键鼠)
  • 自动获取数据库密钥(运行中扫描微信进程内存,无需手动填写)
  • 自动解密数据库(内置 SQLCipher 解密逻辑)
  • 自动加载联系人映射(群名、昵称)

原理 ​

  1. 获取密钥:默认扫描运行中的微信进程内存,结合 Weixin.dll 还原并校验数据库密钥(失败则回退配置中的 key)
  2. 数据库解密:用密钥逐页 AES-256-CBC 解密微信数据库
  3. 监听新消息:监听 WAL 文件变化并重新解密,查询比上次更新的消息
  4. 联系人映射:从 contact.db、session.db 加载联系人,建立 hash → 昵称映射
  5. 发送消息:模拟键鼠操作 —— 激活微信窗口 → Ctrl+F 搜索聊天对象 → 粘贴消息 → 回车发送

前提 ​

  • Windows 系统(模拟键鼠 + 内存扫描仅支持 Windows)
  • 微信 4.x 桌面版已安装并登录
  • 微信数据目录可访问(Documents/xwechat_files/wxid_xxx_xxxx)

自动获取密钥 ​

适配器默认会自动获取数据库密钥:启动时若微信桌面版正在运行且已登录,会扫描微信进程内存并结合 Weixin.dll 还原出 64 位密钥,再用数据库首页 HMAC 校验,全程约数秒。

  • 自动获取为默认行为,配置里的 key 仅作为备用(自动获取失败时兜底)
  • 原理:内存中存放的是 raw_key = passphrase XOR internal_db_key,internal_db_key 从 Weixin.dll 代码段特征提取,二者异或还原后做 PBKDF2/HMAC 校验
  • 自动获取依赖可选原生 FFI 库 koffi,仅 Windows 可用
  • 如不希望自动获取,可设置 "autoGetKey": false,此时必须手动填写 key

安装 ​

适配器安装 ​

bash
van adapter install wechat_db

依赖库 ​

bash
npm install @nut-tree/nut-js better-sqlite3 chokidar fzstd koffi

配置 ​

jsonc
{
  "botId": "WeChatDB",
  "type": "wechat_db",
  "selfWxid": "wxid_xxxxxxxxxxxxxxxx",
  "selfWxname": "你的微信昵称",
  "dataDir": "C:/Users/你的用户名/Documents/xwechat_files/wxid_xxxxxxxxxxxxxxxx_xxxx",
  "pollInterval": 1000,
  "ignoreSelf": true
}
配置项必填说明
selfWxid✅你的微信 wxid(如 wxid_xxx)
selfWxname推荐你的微信昵称(窗口标题),用于准确激活微信窗口
dataDir✅微信数据目录(xwechat_files/wxid_xxx_xxxx)
key可选数据库解密密钥(64 位 hex);默认自动获取,此项仅在自动获取失败时作为备用
autoGetKey可选是否自动扫描微信进程内存获取密钥,默认 true;设为 false 时必须填写 key
wechatInstallPath可选微信安装目录/Weixin.exe/Weixin.dll 路径,默认自动探测
pollInterval可选轮询间隔,默认 1000ms
ignoreSelf可选忽略自己发的消息,默认 true

接收事件 ​

消息类型框架事件说明
私聊文本private_messageuserId=对方 wxid
群聊文本group_messagegroupId=群号,userId=发送者 wxid
图片/语音/视频/表情同上显示为 [图片]、[语音] 等占位符

API 调用 ​

发送消息 ​

ts
// 私聊
await bot.sendPrivateMsg("wxid_xxx", "你好")

// 群聊
await bot.sendGroupMsg("xxx@chatroom", "大家好")

发送图片 ​

ts
// 本地文件
await bot.sendPrivateMsg("wxid_xxx", [
  MessageSegment.text("这是一张图片:"),
  MessageSegment.image("C:/path/to/image.png")
])

// Base64
await bot.sendPrivateMsg("wxid_xxx", [
  MessageSegment.image("base64://iVBORw0KGgoAAAANSUhEUgAA...")
])

发送文件/语音/视频 ​

ts
await bot.sendPrivateMsg("wxid_xxx", [MessageSegment.record("C:/path/to/audio.mp3")])
await bot.sendPrivateMsg("wxid_xxx", [MessageSegment.video("C:/path/to/video.mp4")])
await bot.sendPrivateMsg("wxid_xxx", [MessageSegment.file("C:/path/to/document.pdf")])

查询 API(bot.callApi) ​

action说明关键参数
get_contacts获取联系人列表—
get_group_members获取群成员列表group_id
get_history获取聊天历史talker, limit(默认50)
get_favorites获取收藏列表limit
get_moments获取朋友圈limit
get_group_announcement获取群公告group_id
get_emoticons获取表情列表limit
get_biz_contacts获取公众号列表—
get_contact_labels获取联系人标签—
ts
const contacts = await bot.callApi("get_contacts")
const members = await bot.callApi("get_group_members", { group_id: "xxx@chatroom" })
const messages = await bot.callApi("get_history", { talker: "wxid_xxx", limit: 50 })

常见问题 ​

  • 自动获取密钥失败:确认微信桌面版已启动并登录;安装依赖 npm install koffi;若微信装在非默认目录,配置 wechatInstallPath;仍失败可手动获取后填入 key。
  • 收不到消息:检查密钥是否正确、dataDir 路径是否正确。
  • 发送消息打开企业微信:配置 selfWxname 为你的微信昵称,按窗口标题激活。
  • 接收消息延迟:微信攒批写入 WAL,纯磁盘直读约有数秒延迟(文件变化是实时的,但消息内容需等微信提交事务)。
  • 图片/语音显示为二进制:正常,目前只显示类型占位符,不解析内容。
  • 多数据库:微信按时间段分库(message_0.db, message_1.db...),目前只轮询 message_0.db。

相关项目 ​

Just run の Bot · 一套插件,全平台机器人