DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

le0522 /

le0522/dsh-wechat-transfer

Verified

Send local files to WeChat 文件传输助手 from DeepSeek Harness (Windows)

★ 1 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@760c5c17

dsh-wechat-transfer

左侧栏 DSH 插件:把文件发送到微信聊天(默认「文件传输助手」)。

特别适合远程 / 手机使用:在手机上远程连 DSH 时,跑出来的报告、截图、导出文件都还在电脑里。用这个插件把它们发到「文件传输助手」,手机微信里立刻就能收到,点开就能存进手机相册或文件,不用再回到电脑前复制。手机浏览器打开的面板一样能用(会自动走 DSH 的 /remote 网关)。

安装

从 npm(推荐):

dsh plugin --profile desktop add dsh-wechat-transfer

或直接从源码仓库装(想跟最新提交时用):

dsh plugin --profile desktop add github:<GITHUB_OWNER>/dsh-wechat-transfer

装完重启 DSH,左侧栏出现「微信传输」。只能装在 Windows(依赖 Windows PowerShell 5.1 与中文 OCR 语言包)。

也可以从 Releases 分发包 拿 zip/tgz 离线安装,或 npm install dsh-wechat-transfer 装进任何 DSH profile。

它做什么

  • 左侧栏出现一个 微信传输 图标,点开是面板:填写文件路径、目标聊天、是否自动发送,还有一个 登录微信 按钮。
  • 在手机上取文件:手机上远程用 DSH 跑出的产物,点一下「发微信」(或让模型调工具),文件就出现在手机微信的「文件传输助手」里,下载即可存进手机——这是它最实用的场景之一。
  • 产物一键发送:聊天里每个 present 交付文件卡片旁边多出一个「发微信」按钮,点一下就把该文件发到「文件传输助手」,成功/失败直接显示在按钮上。
  • 关闭微信:面板上的「关闭微信」按钮会先给微信发关闭请求(它只会缩到托盘),确认还在跑就直接结束 Weixin.exe 进程,返回 closed-wechat;微信本来就没开也算成功。
  • 登录:微信停在登录窗口(头像 + 「进入微信」)时,插件会用 OCR 找到这个按钮并点击,等主窗口出现后再继续;需要手机扫码时明确返回「需要扫码」,不会瞎点。
  • 微信没运行也能发:先启动微信、自动登录,再走完整发送流程(实测从 0 个微信进程到文件进聊天约 20 秒)。
  • 同时注册模型可调用的工具 wechat_send_file,你可以直接说「把这个文件发到微信文件传输助手」。
  • 每次执行都会:
    1. 找到微信主窗口并置前(从不 按 Esc、从不 关闭窗口、从不 启停微信进程);
    2. 用 Windows OCR 读取窗口标题栏,只有确认当前聊天就是目标聊天才会继续;不在目标聊天时先尝试在会话列表里点开(点列表只切聊天,不会发消息),还不对就中止;
      • 如果会话列表里有多个同名聊天(比如两个都叫「工作群」),OCR 分不出是哪一个,插件会直接返回 chat-ambiguous 并中止,让你自己点开正确的那一个;
    3. 点击输入栏左侧的 📁,等微信弹出的原生「选择文件」对话框;
    4. 点对话框里的「文件名」框,把 "路径1" "路径2" 粘贴进去,回车确认,等对话框关闭;
    5. 用 OCR 复核文件卡片是否出现在输入框;
    6. 可选:采样「发送」按钮像素确认为绿色后点击,再 OCR 确认消息已出现在聊天里;
    7. 保存一张窗口截图,面板里可以直接看到。

为什么不用剪贴板直接粘贴文件:微信 4.1.15.13 的输入框不接受 CF_HDROP 粘贴(文字可以), 必须走它自己的 📁 → 「选择文件」这条路。剪贴板粘文件只作为弹不出对话框时的兜底。

默认 autoSend = false:文件只放进输入框,由你确认后再点发送。

为什么是「安全模式」

微信 4.x 使用 Qt Quick 自绘,没有 UI Automation 元素树,PrintWindow 抓到的是黑图,只能靠截屏 + OCR 校验。 早期调试发现:在微信主窗口按 Esc 会把它缩到托盘,之后所有按键都会跑到别的窗口;关闭「搜索聊天记录」窗口会把整个微信进程带走。 因此本插件刻意只做最小动作(置前、点击列表行、点击输入框、粘贴、点击发送),并且每一步都有校验,任何一步对不上就中止并截图,不会盲发。

边界(必读):校验用的是聊天显示名(OCR 读出来的标题),不是微信内部的稳定会话 ID——微信 4.x 没有可用的自动化接口,拿不到 ID。所以:

  • 会话列表里有多个同名聊天时,插件会拒绝执行(chat-ambiguous);
  • OCR 本身有极小概率识别错误,理论上仍存在发错的可能;
  • 结论:这是大幅降低误发风险,不是绝对保证。要绝对稳妥,请把 autoSend 留空(默认 false)——文件只会放进输入框,由你亲眼看一眼再点发送;或敏感文件先用普通方式发。

前置条件

  • Windows,装有微信 4.x 桌面版。
  • 微信没开也没关系:插件会自己启动 Weixin.exe(HKCU\Software\Tencent\Weixin\InstallPath,否则 C:\Program Files\Tencent\Weixin\Weixin.exe),然后点登录窗上的「进入微信」;只有出现二维码时才需要你拿手机扫一次(会明确返回 login-qr)。
  • 目标聊天能出现在左侧会话列表里(插件会自动滚动列表去找,最多 6 次;找不到再用微信全局搜索)。
  • 系统有中文 OCR(Windows 自带 zh-Hans 识别器)。
  • 窗口大小随意,不再改你的窗口:微信左侧图标栏 + 会话列表是固定像素宽(约 455px@150%),右侧对话区才随窗口缩放;插件按 DPI 把这套固定偏移换算成裁剪区和点击点(日志 layout scale=1.5 left=…),所以 1000×800 到 2500×1550 都能直接用。只有两种情况会动窗口:窗口小于 880×620 时临时放大(发完还原),或者窗口处于最大化状态时先还原(发完再最大化回去),因为最大化窗口的底边被任务栏挡住会吞掉点击。日志关键词 normalize-window / window put back to …。
  • 会话列表没滚到的聊天也能找:先按名字点会话列表、上下各滚一遍(最多 6 次);还找不到就用微信自己的全局搜索(Ctrl+F → 输入名字 → 回车)定位,两个办法都失败才会报 chat-not-open。

插件只会启动微信,永远不会杀掉或关闭它。

校验是怎么做的

微信把长文件名截断成 季度报告_终稿...版.docx 这种样子,所以不能拿完整文件名去比对。现在按信号强弱依次判断:

  1. 大小标签:卡片下面那行 340K / 1.2M,直接和本地文件大小比对(最稳);
  2. 首 6 字 + 扩展名(或文件名末尾 4 字),忽略中间的省略号;
  3. 文件名短到能完整显示时,才做整名匹配;
  4. 图片走结构判定:图片在输入框里只显示缩略图,没有文件名也没有大小标签,OCR 读不到。这时比较「输入框区域」在这次粘贴前后的像素网格(16×8 格,任一格亮度差 ≥14 记为变化,≥6% 才判定为真的加了东西)——只有卡片真的出现才会触发,光标闪烁不会。

发送成功的判定同理:先看聊天区是否出现文件名/大小;图片则要求聊天区出现新气泡且输入框里的卡片消失(只变一个不算,避免把占位提示文字的变化误判成发送成功)。

失败时的状态

stage 含义
chat-not-open 当前打开的聊天不是目标聊天,已中止(没有粘贴任何东西)
login-required 微信停在登录窗口,且没能自动点掉「进入微信」
login-qr 微信要求手机扫码登录,需要你手动扫一次
not-logged-in 微信还停在登录界面(旧代码路径,保留兼容)
wechat-missing 找不到 Weixin.exe(没装微信?)
wechat-not-starting 微信启动了但一直没有窗口
input-blocked 微信对模拟鼠标完全没反应(📁 与粘贴都无效),退出微信重新登录后再试
paste-not-verified 对话框走通了,但文件没有出现在输入框
send-not-verified 文件已放进输入框,但没能确认发送
ocr-unavailable 系统 OCR 不可用,为安全起见中止

成功相关:logged-in(登录检查通过)、staged(只放进输入框)、sent(已确认发送)。

路由

方法 路径 用途
GET /dsh-wechat-transfer/status 引擎是否就绪、上次结果、截图年龄
POST /dsh-wechat-transfer/send {paths, chat?, autoSend?} 发送文件
POST /dsh-wechat-transfer/login 处理登录窗口,返回 logged-in / login-qr
POST /dsh-wechat-transfer/close 关闭微信,返回 closed-wechat / close-failed
POST /dsh-wechat-transfer/resolve {sessionId, seq, index} → 交付卡片的绝对路径
GET /dsh-wechat-transfer/screenshot 最近一次校验截图(PNG)

手机 / 远程访问

用手机或另一台电脑访问时,DSH 走的是 remote 网关(/remote/...):harness 的 Host 围栏对非 loopback 的「非 /remote 路径」直接返回 403,所以面板会先按 /dsh-wechat-transfer/... 请求,收到 403/404 后自动改成 /remote/dsh-wechat-transfer/... 重试,并在本机切换后一直沿用。

另外两处也照顾了弱网/代理:

  • 所有 GET 都带 ?_=<时间戳> 且 cache: 'no-store',避免手机浏览器/代理返回缓存里的旧状态;
  • 发送过程中每 1.5 秒轮询 /status,状态行还会显示这次结果的时间戳,一眼能看出是不是最新。

结构

index.js             宿主侧:HTTP 路由(含 resolve/login/close)+ wechat_send_file 工具
client.js            Web 侧:左侧栏图标 + 面板 + 交付卡片上的「发微信」按钮
scripts/wechat-send.ps1   PowerShell 引擎(截屏、OCR、输入注入、剪贴板、登录)
cordis.patch.yml     把宿主插件插入 profile
locale/zh.json       文案

安装

dsh plugin --profile desktop add link:<这个目录的绝对路径>

宿主侧改动需要重启 DSH 生效;面板属于客户端 bundle。

—/ 5

No ratings yet

Verified DSH bundle

Commit 760c5c170344

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout