- Início
- Plugins
- Integrações e acesso remoto
- dsh-wechat-bridge
dsh-wechat-bridge
thawline/dsh-wechat-bridge
Ponte bidirecional do WeChat: lê mensagens recebidas do banco de dados local do WeChat e envia respostas por automação da interface do Windows, permitindo conversar com uma sessão DSH local pelo seu WeChat. Por padrão, pessoas externas que possam enviar mensagens para essa conta podem conversar com a sessão local (sem executar comandos nem acessar arquivos). Uma allowlist de entrada restringe quem pode falar com ela.
Instalar
dsh plugin --profile web add github:thawline/dsh-wechat-bridgeREADME
通到微信(dsh-wechat-bridge)
这是修改版:上游是 Yuuyuko-uu/dsh-wechat-bridge(作者 Yuuyuko-uu,MIT)。本仓库(thawline/dsh-wechat-bridge)在原版基础上补了一批「实际用起来会疼」的地方,具体见文末「相对原版的改动」。
让 DSH 里的 AI 伙伴和微信双向聊天:你在微信里发的话转进 DSH,伙伴说完一整轮,最后一句(和表情包图片)发回微信。
不注入、不 hook、不改微信。
- 收消息:读微信 4.x 的本地 SQLite 数据库(只读,要求微信处于登录状态)
- 发消息:Windows UI Automation + 剪贴板,驱动微信窗口真的去打字、真的去粘贴图片
所以它用的是你自己的微信号,不是机器人。朋友收到的,就是你本人在说话。
它长什么样
微信 ──读本地库──> 插件里的 Python 桥接 ──POST /dsh-wechat-bridge/receive──> DSH 会话
<──UIA 发送── 插件里的 Python 桥接 <──GET /dsh-wechat-bridge/outbox── DSH 会话
宿主半边管会话绑定、权限、队列;Python 半边管读库、发送、日记。中间走本机 HTTP。
装
dsh plugin --profile desktop add github:thawline/dsh-wechat-bridge
或 设置 → 插件 → 安装,填 github:thawline/dsh-wechat-bridge。
装完重启一次 DSH,打开 设置 → 通到微信。
第一次用(三步)
- 装依赖:点「装依赖」。有现成的 Python 环境(装好
wechatauto-replica的)就直接填「解释器」路径,不用建虚拟环境;没有就让它用系统 Python(3.10+)建一个。 - 启动:点「启动」,下面会滚日志,看到「桥接已就绪」就成了。
- 选会话:挑一间「默认会话」,打开「总开关」。先留着「试运行」看它记的「该发什么」对不对,再把试运行关掉。
之后在微信里跟文件传输助手说话,就等于跟伙伴说话;别人的私聊、群里的话也会转进来——但外人只能聊天,动不了电脑(见下面「权限」)。不想让某个人进来,填「入站白名单」(留空 = 谁都能进)。
不想装 Python?用自带的运行环境
本仓库的 Release 里有一份打好的 Python 3.12 运行环境(Windows x64,已经装好 wechatauto-replica、uiautomation、numpy、Pillow、pywin32、comtypes 等,不需要再联网装东西)。
解压 wechat-bridge-runtime-win64-py312.zip
把里面的 python 文件夹放到 ~/.dsh/wechat-bridge-runtime/python
(也就是 C:\Users\<你>\.dsh\wechat-bridge-runtime\python\python.exe 存在)
插件启动桥接时会自己找这个位置,不用填「解释器」、也不用点「装依赖」。想放别处也行,把那个 python.exe 的路径填进设置里的「解释器」就行。
这份环境是绿色版:整个文件夹搬到哪都能跑,删掉就等于卸载。装依赖时如果发现它是好的,会直接用,不会建 venv。
权限:只有主人能动电脑
| 谁 | 能干什么 |
|---|---|
主人(主人 里填的 wxid / 昵称) | 什么都能 —— 聊天、读文件、跑命令、改设置 |
| 别人 | 只能聊天。这一轮所有工具都会被硬拦(不是靠嘴劝,是在工具执行前直接拒掉) |
实现方式:外部消息进来时,插件给那间会话的 agent 挂一道 tools.guard。这一轮如果是外人叫醒的,任何工具调用都会被拒绝,只放行文字回复。这一轮结束闸就抬起来。
所以外人就算在微信里说「帮我删掉 D 盘」,工具层直接拒绝,模型只能回一句「这个我做不了」。
⚠️ 前提是宿主要提供 tools.guard(本版本 DSH 有)。没有的话日志会警告一句「这层宿主没有 tools.guard」,那就只剩嘴上约束了。
谁能进来(入站白名单)
默认谁都能发进来:任何能给这个微信号发消息的联系人,都能让本机模型跑一轮——动不了电脑(上面那道闸),但会花你的额度。
想在「谁能触发」这一层就收口,去设置里填入站白名单:填了之后只有名单里的 wxid / 昵称能发进来,其他人连一轮都不会起,日志里记一句就丢掉。主人永远放行,不用写进来。留空 = 恢复成谁都能进。
两层的关系:
| 层 | 挡什么 | 怎么配 |
|---|---|---|
| 入站白名单 | 谁的消息能触发一轮(花额度) | 留空 = 谁都能进;填了只放行名单 |
| 外人只能聊天 | 触发之后能不能动电脑 | 默认开;主人才放行工具 |
群聊
| 设置 | 作用 |
|---|---|
| 群上下文条数 | 被叫到时,往前读几条群聊天一起给模型看。默认 6,填 0 = 不带 |
| 群回复间隔秒 | 同一个群,两条回复之间至少隔几秒。默认 30,填 0 = 不限 |
| 群每小时上限 | 同一个群一小时最多接几次。默认 6,填 0 = 不限 |
| 群聊日记 | 群里所有消息(不点名的也记)按天写成 markdown |
| 不回谁(屏蔽) | 一条一个标签,命中的会话 / 人不回复也不记日记(默认:微信运动、微信团队、微信支付、服务通知、订阅号消息、折叠的群聊) |
群里默认只有被点名才进来(正文里有:大肥鱼 / 鲸鲸 / 鲸鱼娘 / 鲸鱼 / 肥鱼),或者主人说话。点名规则写死在 bridge/wechat_bridge.py 的 DEFAULT_ALIASES,想改就改那行。
日记存在 ~/.dsh/wechat-diary/<YYYY-MM-DD>/<群名>.md,一天一个文件,当天追加:
# 组队叫战狗 单排叫野狗 · 2026-10-26
- 15:07 饮茶:现在有比赛?
- 15:08 Zierk:昨晚一点
表情包
伙伴在回复里写 [表情: 描述],插件会去 dsh-meme 的表情库里按 caption / 关键词找那张图,当图片消息发到微信,那串描述本身不会出现在正文里。
找不到对应图片时保持原样(发出去的就是文字),不会丢内容。
「文件传输助手」
自己发给自己的消息本来会被跳过(防自问自答),但文件传输助手放行 —— 那是你留给自己的对话窗。两道防回环:
- 自己刚发出去的几条,按文本比对跳过(比对前先规整空格换行)
- 往外发完的 12 秒内,文件传输助手里冒出来的消息一律不读
配置项
| 项 | 默认 | 说明 |
|---|---|---|
| 总开关 | 关 | 关着 = 一句都不发 |
| 试运行 | 开 | 开着 = 只在日志里记「该发什么」,不真发 |
| 默认会话 | 空 | 微信来的消息进哪一间 |
| 单独绑定 | 空 | 一个微信聊天 → 一间会话。聊天那边可填显示名,也可填 wxid / xxx@chatroom;「最近来找过的」里点一下就绑上默认会话 |
| 接口令牌 | 空 | Python 侧请求要带的口令,留空不校验 |
| 解释器 | 空 | 一个装好 wechatauto-replica 的 python.exe,填了就不用建 venv |
| 主人 | 空 | wxid 或昵称,逗号分隔 |
| 外人只能聊天 | 开 | 见上面「权限」 |
| 群上下文条数 | 6 | |
| 群回复间隔秒 | 30 | |
| 群每小时上限 | 6 | |
| 群聊日记 | 开 | |
| 日记目录 | 空 | 留空 = ~/.dsh/wechat-diary |
| 屏蔽 | 见上 | 一行一个 |
配置在 ~/.dsh/wechat-bridge-config.json,venv 在 ~/.dsh/wechat-bridge-venv。改完点保存,桥接 30 秒内自动生效,不用重启。
也可以直接说
不想点设置页的话,跟伙伴说一句就行 —— 插件挂了两个工具:
| 工具 | 参数 | 干什么 |
|---|---|---|
wechat_block | {who, action: add / remove / list} | 加/删/看「不回谁」名单 |
wechat_bind | {chat, session, action} | 把某个微信聊天接到某间会话;session 可以只报标题(如「主要聊天记忆」),它自己去找那一间 |
例:「以后别理「拼多多」」「把「组队叫战狗」这个群接到主要聊天记忆那间」。
HTTP 接口
| 方法 | 路径 | 干什么 |
|---|---|---|
| POST | /dsh-wechat-bridge/receive | 收:{text, 图片?, 图片类型?, chat, chatId, chatType, sender, senderId} → 转进会话 |
| GET | /dsh-wechat-bridge/outbox | 发:取走待发队列 |
| POST | /dsh-wechat-bridge/outbox/ack | 发完回报 |
| GET | /dsh-wechat-bridge/state | 状态、配置、会话、日志 |
| POST | /dsh-wechat-bridge/save | 存配置 |
| POST | /dsh-wechat-bridge/test-send | 真发一条测试句 |
| POST | /dsh-wechat-bridge/vision-test | 试看一张本地图片:{图片, 类型?} |
| POST | /dsh-wechat-bridge/bridge/install | 装依赖 |
| POST | /dsh-wechat-bridge/bridge/start / stop | 起停桥接 |
边界与风险
- 图片和表情包会先“看”一眼:收到图片 / 表情包时,桥接先把文件落盘,宿主用视觉模型写成一句中文描述再转进会话;没配视觉密钥时会标「没看清」,不会挡消息。语音、视频仍然跳过。
- 发送会抢微信窗口焦点。正常情况不抢前台,只有发送失败重试时才把微信拉到前面。
- 同一个微信号别同时开两个桥(比如鲸鲸的桥接),会抢窗口、发送会乱。
- 微信个人号自动化不是官方接口,有封号风险,建议先用小号 / 测试号。
- 微信升级可能让它失效:
wechatauto靠一张按版本号硬编码的地址表找控件树。升级后发不出去先看设置页下面的日志。 - 只在 Windows 上能用(UI Automation 是 Windows 独有的)。
相对原版的改动
原版能跑通,但真天天用就会疼。这一版补的都是那种「用着用着才炸」的地方:
- 同会话发消息不再抢前台:微信最小化着也能发,不把窗口拉出来、不动鼠标。切会话(私聊↔群)时窗口会短暂露一下,发完自动收回。
- 输入框防残留:以前发送失败时字会留在输入框里,下一条回车就把它带出去,同一条消息发两遍。现在发送前先清空,失败时也不再靠真实鼠标点「发送」按钮(那会让鼠标满屏乱飞)。
- 发图以数据库为准:以前接口说成功、其实没发出去(或者反过来)。现在发完去微信库里查有没有新图片,查到才算成功,避免重复发。
- 群聊查名修正:群的昵称查不到时用
group_name_to_id兜底,否则群消息永远查不到(会导致重复发送判断失效)。 - 一轮里多条回复会拼起来发:以前同一轮的第二句会覆盖第一句,微信只能收到最后一句。
- 临时目录兜底:某些嵌入式 Python 探测不到可写的
TEMP(安全软件拦着时会这样),桥会退到自己的tmp/目录,不然连微信数据库都打不开。
开发自测
改了 lib/host.js 或 lib/client.js 之后,两个脚本可以直接跑(不用开 DSH,也不碰真实配置 —— 记得把 DSH_HOME 指到临时目录):
$env:DSH_HOME="$PWD\.testhome"; node _selftest.mjs # 假 ctx 跑一遍宿主:保存 / 绑定 / 屏蔽 / 两个工具
$env:DSH_HOME="$PWD\.testhome"; node _selftest_client.mjs # 假 React 把设置页渲染一遍:加标签、点绑定、轮询不冲掉
致谢
wechatauto-replica—— 读库解密 + UIA 发送的底座
License
MIT
Plugins relacionados
dsh-web (dsh-ssh)
zhu1090093659/dsh-web
dsh-web (dsh-remote-web-ui)
zhu1090093659/dsh-web
dsh-web-ui (dsh-ssh)
zhu1090093659/dsh-web-ui
dsh-web-ui (dsh-remote-web-ui)
zhu1090093659/dsh-web-ui