Skip to main content
T

dsh-wechat-bridge

thawline/dsh-wechat-bridge

Two-way WeChat bridge: reads incoming messages from the local WeChat database and sends replies through Windows UI automation, so you can talk to a local DSH session from your own WeChat. Outsiders who can message this WeChat account can chat with the local session by default (they cannot run commands or touch files); set an inbound allowlist to restrict who may talk to it.

Install

dsh plugin --profile web add github:thawline/dsh-wechat-bridge

README

通到微信(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,打开 设置 → 通到微信。

第一次用(三步)

  1. 装依赖:点「装依赖」。有现成的 Python 环境(装好 wechatauto-replica 的)就直接填「解释器」路径,不用建虚拟环境;没有就让它用系统 Python(3.10+)建一个。
  2. 启动:点「启动」,下面会滚日志,看到「桥接已就绪」就成了。
  3. 选会话:挑一间「默认会话」,打开「总开关」。先留着「试运行」看它记的「该发什么」对不对,再把试运行关掉。

之后在微信里跟文件传输助手说话,就等于跟伙伴说话;别人的私聊、群里的话也会转进来——但外人只能聊天,动不了电脑(见下面「权限」)。不想让某个人进来,填「入站白名单」(留空 = 谁都能进)。

不想装 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 / 关键词找那张图,当图片消息发到微信,那串描述本身不会出现在正文里。

找不到对应图片时保持原样(发出去的就是文字),不会丢内容。

「文件传输助手」

自己发给自己的消息本来会被跳过(防自问自答),但文件传输助手放行 —— 那是你留给自己的对话窗。两道防回环:

  1. 自己刚发出去的几条,按文本比对跳过(比对前先规整空格换行)
  2. 往外发完的 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 把设置页渲染一遍:加标签、点绑定、轮询不冲掉

致谢

License

MIT

Related plugins