Repository navigation
Releases: CheserEri/wechat-mcp
Release list
灵语 v0.8.7
让抖音链接真正能解析、能下载:改走「浏览器桥」,不再依赖会被服务端轮换的签名算法。
修复
-
抖音链接现在能解析了。抖音 Web 接口要求一个
a_bogus签名参数,由页面里混淆的webmssdk实时生成,缺了或不对就是一连串 403:- 不带签名 →
403 Blocked by ArgusSecurityPlugin Uifid Not Found - 补上
Uifid请求头 →403 ... Signature Not Found - 签名格式对但内容错 →
403 ... Signature Invalid
内置 yt-dlp(2026.08.19)的
DouyinIE只有一行TODO,根本没实现签名。而 Cookie 解决不了这个问题 —— 实测带上一份完整的抖音登录 Cookie,依旧是Signature Not Found。0.8.6 声称「配 cookies.txt 即可解析抖音」是不准确的,已更正。 - 不带签名 →
新增
- 浏览器桥(
bot/browser.py):起一个无头的 Chrome / Edge,通过 CDP(Chrome DevTools Protocol)打开作品页,让页面自己把签名算好,再在页面里用 XHR 取回aweme/v1/web/aweme/detail的结果。- 只依赖标准库:自己实现了 RFC 6455 的 WebSocket 客户端(CDP 只用到文本帧、分片、ping/pong),不引入 websocket-client 等新依赖,打包时无需额外收集。
- 不碰用户的浏览器:用独立临时用户目录启动,退出时杀掉整个进程树并删掉该目录;读不到用户的配置、书签与登录态。清理本身要十几秒,所以放到后台线程做,不挡住解析结果的返回;目录名带创建者 PID,下次启动会扫掉此前异常退出遗留的目录。
- 无需登录:取公开作品的信息不需要账号,也就不再需要导出 cookies.txt。
- 为何用 XHR 而不是 fetch:站点的安全 SDK 是 hook
XMLHttpRequest来补签名的,直接fetch绕过了它(实测被风控直接拒绝)。 - 为何要轮询:
Uifid是页面首个请求由服务器下发后才写进 Cookie 的,所以头一两次必然 403,会一直重试到 200 为止。
- 抖音直链下载:解析出的
play_addr(按码率取最高档)用urllib带Referer直接下载,同样不经过 yt-dlp;仍受「单文件体积上限」约束(超限会中止并删掉半成品)。 - 解析结果缓存 5 分钟:解析与下载是两次独立调用,缓存让下载复用解析结果,不必为同一条作品启动两次浏览器(
play_addr直链有时效,故 TTL 不长)。
变更
- 抖音的解析结果标签为
[抖音],摘要里标注「类型:视频 / 图文(N 张)」。 - 抖音图文作品能正常解析(标题、作者、图片数),但暂不支持下载(日志里会说明)。
- 更正文档里「抖音靠 cookies.txt 解析」的说法:README、界面提示、
docs/TROUBLESHOOTING.md、config.py注释均已改为「抖音走浏览器桥,微博/小红书等仍需 cookies.txt」。 bot/douyin.py里那份纯 Pythona_bogus实现(移植自 f2,曾逐字节验证正确)作为参考保留但不再使用 —— 抖音已轮换 SDK,256 字节置换表藏在 JSVMP 里,离线复现要重做一遍逆向,且随时可能再变。
说明
- 解析一条抖音链接约 3 秒(启动无头浏览器 + 轮询到签名就绪);同一作品的后续解析命中缓存,几乎瞬时。
- 解析需要系统装有 Edge 或 Chrome(Windows 10/11 自带 Edge,一般不必额外安装);两者都没有时会明确提示「未找到 Chrome/Edge」,不会静默失败。
产物
| 文件 | 说明 |
|---|---|
wechat-mcp-setup-x64.exe |
Windows 安装包(约 60.9 MB),双击按向导安装 |
wechat-mcp-win32-x64.zip |
免安装绿色版(约 82.6 MB),解压即用 |
测试
315 项单元测试全部通过(0.8.6 为 296 项,本次新增 19 项)。
灵语 v0.8.6
新增
- 「链接解析」页新增「cookies.txt 路径」(
link_cookies_file,留空即不使用)。
抖音这类站点的网页是空壳(没有<title>、没有og:title,正文靠混淆 JS 渲染),
接口对未带 Cookie 的请求一律返回403,yt-dlp 的原话是
Fresh cookies (not necessarily logged in) are needed。填上一份 Netscape 格式的
cookies.txt 后,解析与下载都会带上它。- 路径会自动规整:剥掉首尾空白与引号、展开
~与%VAR%;文件不存在、
指向目录、或内容是空文件时一律按「未设置」处理。 - 改了路径立刻生效:热更新会清掉失败的解析缓存(成功的不动),
刚配好 Cookie 的链接马上重试,不必等 TTL 过期或重启程序。
- 路径会自动规整:剥掉首尾空白与引号、展开
修复
- yt-dlp 的失败原因不再被吞掉。此前 yt-dlp 提取失败后会改走「抓网页标题」兜底,
兜底也失败时只报兜底的原因——抖音这种空壳页面的兜底原因永远是「未能提取标题」,
yt-dlp 那句关键的Fresh cookies ... are needed就这样丢了。现在两条路都失败时以
yt-dlp 的原因为主,网页兜底的原因不同则附在其后。
变更
- 失败原因说人话:命中「缺 Cookie」类错误(
fresh cookies/cookies are required/
sign in to confirm/DPAPI解密失败)时,错误信息后面直接追加「该站点需要浏览器
Cookie 才能解析(抖音/微博/小红书等常见);请在「链接解析」页设置 cookies.txt 路径」。 - 界面说明里同步标注:不必登录也能解析的站点留空即可。
产物
wechat-mcp-setup-x64.exe(60.9 MB)——安装包,推荐:按用户安装、不弹 UAC,
且不带「网络来源」标记(绕开解压后黑屏)。wechat-mcp-win32-x64.zip(82.6 MB)——免安装版,解压即用。
全套 296 项单元测试通过。
灵语 v0.8.5
修掉「群里 @ 了机器人、模型也答了,但群里就是不出现回复」的根因:群没有设置群名称。
修复
- 没有群名称的群,现在也能回复了。群聊如果没设群名称,
contact.db里的nick_name/remark都是空的,而微信搜索框只认名字、不认xxx@chatroom这种 ID,发送前定位不到会话就直接被拒绝——现象是日志里有入站消息、有模型调用成功的记录,群里却始终没有回复。现在_chat_display_name按微信自己的显示习惯兜底:用群成员昵称拼出可搜索名(A、B、C,最多 3 个)。- 只在能拼出两个以上昵称时才用:只有一个名字时,微信搜索会先命中同名的联系人,可能把群消息发进私聊——宁可不猜,退回会话 ID 并提醒用户去设置群名称。
- 拼出来的名字带
、,几乎不可能与私聊联系人的显示名混淆;真要命不中会话,仍然走「拒绝发送」这条安全底线,不会误发。
变更
- 发送失败的原因写清楚了:会话 ID 反查不到显示名时,如果目标是群聊(
xxx@chatroom),错误信息里直接给出原因和做法——「该群还没有群名称,微信搜索框无法定位它;请在微信里给这个群设置一个群名称后再试」,不再只丢一句「无法解析会话名」让用户去猜。私聊的错误信息保持原样,不出现误导性提示。 - 检测到无名群时,桥接会在「运行日志」里提前打一条 warning(每个群只打一次),不用等到发送失败才发现。
- 全套 284 项单元测试通过(新增 11 项:无名群兜底名 9 项、错误提示 2 项)。
产物
wechat-mcp-setup-x64.exe— Windows 安装包(推荐,按用户安装、不弹 UAC、不含「解压锁定」问题)wechat-mcp-win32-x64.zip— 免安装压缩包(解压后请先对目录执行「解除锁定」,否则可能黑屏)
提示:请确保只运行一个实例,多个实例会互相争抢微信窗口,导致「发送超时 / 回复重复 / 回复发送失败」。群聊建议设置一个群名称,回复定位最可靠。
灵语 v0.8.4
群聊「@ 机器人」的可诊断性与健壮性:改了微信昵称不必再重启程序。
新增
- 群消息没被触发时给出可读原因(
BotEngine._explain_no_reply):群聊里没 @ 到机器人时打一行日志,并把机器人当前识别到的昵称一并打出来,例如群消息未 @ 机器人,已忽略 [某群] 张三:@某某 在吗|机器人昵称:Viollete。此前这条路径一行日志都不打,用户只看到入站消息、看不到任何解释,很容易误以为程序坏了。
修复
- 修复改了微信昵称必须重启程序才生效:昵称只在连接微信时读取一次,改完昵称后旧名字仍在缓存里,群里 @ 新名字不会触发。现在
_is_at_me遇到「消息文本里有 @ 但没匹配上任何已知昵称」时,按 60 秒冷却重读一次昵称再判——改完昵称最慢在下一条 @ 消息上自动生效。 - 修复
_load_bot_identity在读不到昵称时把已识别的名字清空的问题:一旦某次读取失败(微信未就绪、DB 暂时读不到),@ 识别会被整个抹掉,之后群里 @ 机器人永远不会触发。现在读不到就保留上一次的结果。
变更
_is_at_me抽出_matches_bot_name,并去掉「昵称集合为空就直接返回 False」的早退,让空昵称也能通过刷新自愈。- 全套 273 项单元测试通过(新增 12 项)。
产物
wechat-mcp-setup-x64.exe— Windows 安装包(推荐,按用户安装、不弹 UAC、不含「解压锁定」问题)wechat-mcp-win32-x64.zip— 免安装压缩包(解压后请先对目录执行「解除锁定」,否则可能黑屏)
提示:安装或解压后请确保只运行一个实例,多个实例会互相争抢微信窗口,导致「发送超时 / 回复发送失败」。
灵语 v0.8.3
新增
- 下载目录占用上限(
link_download_quota_mb,默认 1024 MB,0 = 不限制):在「链接解析 → 下载并回发」页可设定下载目录的总占用上限。每次下载完成后统计目录大小,超出上限就按修改时间从旧到新删除文件,直到降到上限以内。新增src/wechat_mcp/bot/storage.py(dir_usage/total_size/enforce_quota):只删下载目录内的普通文件、跳过符号链接,protect里的路径(正在下载/发送的文件)永不删除;删除失败只记日志,不影响已完成的回发。
修复
- X 推文卡片多图变形:多图网格原先把每张图直接
resize到固定格子大小,竖图会被横向拉宽、横图被压扁。现在改为等比「覆盖裁切」(_fit_cover:按较大的一边缩放再居中裁切,宽高比始终不变);单图限高时也同步收窄宽度,不再只截高度。 - 配图落位逻辑抽成
_media_boxes(单图按原比例、多图两列等格),便于单测覆盖。
产物
- wechat-mcp-setup-x64.exe:Windows 安装包(按用户安装,不弹 UAC)
- wechat-mcp-win32-x64.zip:免安装压缩包
全套 261 项单元测试通过。
灵语 v0.8.2
修复
- 桌面端不再附带黑色命令行窗口:打包出的 exe 是控制台程序(MCP stdio 模式要靠 stdout 通信),双击启动时系统会额外分配一个命令行窗口。现在启动时自动隐藏它(仅打包产物、且控制台只属于本进程时才隐藏),原本打在控制台的内容——loguru 日志、print、异常回溯——改为转投到界面「运行日志」页。
- 窗口与任务栏图标改用项目鲸鱼标志:pywebview 未收到 icon 时从 sys.executable 提取图标,源码方式运行会显示 python.exe 的图标;现在显式传入打包内置的 .ico。
- 界面「运行日志」补齐 warning 级别配色(此前只定义了 .log-warn,而引擎发的是 warning)。
变更
- 引擎日志读写加锁(BotEngine._log_lock):日志现在还会来自 loguru sink、下载线程等任意线程,而 get_logs 会整体遍历日志缓冲,并发追加会抛「deque mutated during iteration」。
产物
- wechat-mcp-setup-x64.exe:Windows 安装包(按用户安装,不弹 UAC)
- wechat-mcp-win32-x64.zip:免安装压缩包
全套 250 项单元测试通过。
灵语 v0.8.1
打包与品牌化版本:新增 Windows 安装包,修复解压即黑屏,桌面端显示名统一为「灵语」。
下载
- wechat-mcp-setup-x64.exe — Windows 安装包(按用户安装、免 UAC、中文向导、含卸载项,约 60.8 MB)。
- wechat-mcp-win32-x64.zip — 免安装绿色版(解压即用,约 82.5 MB)。
本次变更
- 新增 Inno Setup 6 安装包流水线,build.py 在 onedir/zip 之后自动编译安装包。
- 修复解压即黑屏:启动时自动清除内置程序集的「Internet 区域」标记(unblock.py)。
- 桌面端显示名统一为「灵语」,应用图标改用项目所用的鲸鱼标志。
- 技术标识(wechat-mcp 包名/exe 名、AppId、MCP 工具前缀)保持不变,便于后续适配 QQ 等其他聊天软件。
- 全套 250 项单元测试通过。
运行时需微信 PC 客户端已登录且主窗口可见;详见 README。
WeChat MCP Server v0.8.0
WeChat MCP Server v0.8.0
面向通用 AI Agent 的 Windows 微信桌面自动化工具服务,同时内置一个实时自动回复桌面助手。
本版本为链接解析(内置 yt-dlp),并汇总自 v0.3.0 以来累积的桌面助手能力。
亮点
0.8.0 — 链接解析(内置 yt-dlp)
- 上下文出现的链接自动解析,结果以
[链接] …注入,供模型就链接内容回应;普通网页回退抓<title>/meta description,媒体站点走 yt-dlp。 - 短链展开:
b23.tv/v.douyin.com/xhslink.com/t.cn等先跟随重定向拿真实地址。 - 下载并回发(默认关闭):把音视频下载后作为文件发回当前聊天。
- X(Twitter)推文卡片(默认开启):免登录抓取 syndication 数据,本地 PIL 渲染成卡片图发回,含视频时再发视频。
- 链接处理独立于触发判定:群聊里不必 @ 机器人也会处理;固定提示「正在解析链接」不经过大模型。
- 诊断命令:
wechat-mcp --resolve <url> [--download]、wechat-mcp --tweet <推文链接>。
0.7.0 — 图像识别(多模态)
- 图片消息解密微信
.dat(v1/v2/WXAM)后以image_url形式随上下文送入多模态模型;开关vision_enabled,默认关闭。
0.6.0 — 静默与水群
- 静默时段(支持跨零点)、群级节流(默认 30 分钟 5 条)、偶发主动参与(默认关闭,
[SILENT]哨兵保持安静)。
0.5.0 — 拟人化
- 按概率回复、长回复按句末标点分条发送并带随机间隔、口语化行为约束。
0.4.0 — 实时自动回复桌面助手
- pywebview 桌面端(运行状态 / 群聊设置 / 拟人化 / 静默与水群 / 链接解析 / 模型设置 / 人设 / 运行日志)。
- 群聊 @我或引用回复、私聊消息实时触发;OpenAI 兼容模型客户端(默认 DeepSeek);同一发送者冷却与会话延续。
下载与运行
wechat-mcp-win32-x64.zip:Windows x64 独立运行时(onedir)。- 解压后
wechat-mcp.exe默认以 stdio 模式运行(供 MCP 客户端调用);wechat-mcp.exe --gui启动桌面助手。 - 运行前请确保微信 PC 客户端已登录且主窗口可见。
已知限制
- 读取能力基于服务运行期间的被动监听缓冲,仅包含来自其他账号的入站消息,无法获取启动前的历史。
send_file默认拒绝发送任何文件,需通过WECHAT_SEND_DIRS显式放宽。- 发送结果无法确认时返回
failed,不自动重试。 - 内置
vendor/yt_dlp为上游 yt-dlp2026.08.19(Unlicense);收录的上游wechat_bridge.py未声明许可证,再分发前请自行确认授权(见THIRD_PARTY_NOTICES.md)。
验证
- 238 项单元测试全部通过。
- 冻结包
--selfcheck通过:version: 0.8.0、yt_dlp_version: 2026.08.19、ffmpeg / bridge / webui 均已内置。
完整变更见 CHANGELOG.md。
v0.4.0
实时自动回复桌面助手
同一个 exe 加 --gui 启动原生窗口:消息到达即处理,无需 Agent 轮询。
新增
- 桌面助手界面(DeepSeek Harness 风格):状态 / 群聊触发 / 模型 / 人设 / 运行日志
- 触发条件:群聊中 @我 或引用回复我;刚被回复过的人在该窗口内(默认 120 秒)继续发言也接着回复;私聊可选
- 人设默认为空,可在界面编辑、保存与清空
- 模型走 OpenAI 兼容接口(默认 DeepSeek
deepseek-chat),API Key 仅存本地
修复
- 会话识别改为以会话 ID 为稳定标识:不再把
xxx@chatroom当作关键词搜进微信搜索框;解析不到可搜索名时明确失败而非误发 - 触发消息在上下文中标记为
[待回复],避免回答更早的其他人的话题 - 上下文条数 10 → 20,最大回复 100 → 300 tokens
- 强制纯文本回复,禁用 Markdown 标记(微信不渲染)
使用
下载 wechat-mcp-win32-x64.zip 解压后:
- MCP 服务:直接把
wechat-mcp.exe配到 MCP 客户端 - 桌面助手:
.\wechat-mcp.exe --gui
前置:微信 PC 客户端已登录,且主窗口可见。
v0.3.0 - 打包分发(独立运行时 + DSH 插件)
独立运行时 + DeepSeek Harness 插件
- 新增 Windows onedir 独立运行时
wechat-mcp-win32-x64.zip(约 32.7 MB),已内置wechat_bridge.py,无需安装 Python,也不依赖外部DEEPSEEKGIRL_PATH。 - 新增 DSH 插件包
dsh-wechat-mcp:通过官方 MCP 客户端桥接,以 stdio 启动随包运行时,微信工具以mcp__wechat__*暴露给模型。 - 打包剔除
cv2/numpy/winsdk等惰性重依赖,体积从约 341 MB 降至约 71 MB(zip 32.7 MB)。 - 完整变更见仓库 CHANGELOG.md 的
[0.3.0]段落。
安装(DeepSeek Harness)
dsh plugin --profile web add dsh-wechat-mcp
前置条件
- Windows 10/11 64 位
- 微信 PC 客户端已登录且主窗口可见
注意
packaging/wechat_bridge.py 收录自上游 deepseekgirl(该上游未声明开源许可证);来源与授权说明见仓库 THIRD_PARTY_NOTICES.md,再分发前请自行确认授权情况。