Dukou(渡口)上手指南,在微信转发菜单里把聊天记录发给 Codex 和 Claude
macOS 微信从 4.1.13 开始支持把多选的聊天记录「合并转发」给第三方应用,微信自己会把文字、图片和视频打成一个 ZIP,再附一份按时间排好的 TXT。Dukou(渡口)接住这份文件,把它送进 Codex、Claude、终端这类在转发菜单里找不到的 App。装好之后,「转发到其他应用」菜单里会多出五条入口,点哪条,聊天记录就去哪。
![]()

微信 4.1.13 的转发菜单,Dukou 的五条入口和系统共享服务排在同一列

Dukou 总览界面,入口开关、快捷微信转发、暂存架与记录都在这里
微信已经把最难的一步做完了,Dukou 补的是最后一段路
以前想拿到一段完整的微信聊天记录,要么碰数据库,要么跟加密较劲。4.1.13 的合并转发绕开了这两条险路,导出的 ZIP 和 TXT 是微信亲手打好的包,格式正好适合喂给 AI agent 读一段完整的信息流。
Dukou 在这条链路里只做搬运。ZIP 从头到尾是一个不透明文件,它不解压、不读内容、不做预览和索引,聊天内容只走微信自己导出的那份文件。
真正缺的是最后一段路。「转发到其他应用」的列表只认装了共享扩展的 App,Finder、终端、Codex、Claude 都没有这类扩展,所以你多选完聊天记录,在菜单里找不到它们。Dukou 注册了五个系统共享扩展,把这五条路补进菜单。
| 入口 | 做什么 |
|---|---|
| 暂存到渡口 | 放到屏幕角落的暂存架,从图标拖进任何 App |
| 发给 Codex | 激活 ChatGPT 并粘贴到输入框 |
| 发给 Claude | 激活 Claude 并粘贴到输入框 |
| 复制到剪贴板 | 只放进剪贴板,⌘V 由你决定 |
| 发送到自定义 | 你自己的应用清单,一个直接发过去,多个才在鼠标旁边弹一张小卡片让你选 |
再往前还有一步自动化。「快捷微信转发」按群名和条数把指定群最近的消息自动导出、校验并粘贴给 agent,省掉自己进微信多选的操作,500 条消息全程约 20 秒,后面单独讲。
安装 Dukou 的三种方式
先确认系统要求。macOS 14 或更高版本;「发给 Codex」「发给 Claude」两条入口要求机器上装有 ChatGPT.app 或 Claude.app;只有从源码构建才需要 Xcode 26(Swift 6.2),mise 装不装都行。
最省事的是 Homebrew。
brew install --cask qzz0518/tap/dukou
之后的更新走 brew upgrade --cask dukou,或者等 App 自己通过 Sparkle 提示。
不想用 Homebrew 就去 Releases 下载最新的 Dukou-*.dmg,打开后把 Dukou 拖进 Applications。两条渠道拿到的是同一份包,Developer ID 签名加 Apple 公证的 Universal 2 DMG,Intel 和 Apple Silicon 机器都能跑。
从源码构建适合想改代码或者不放心预编译包的人。
git clone https://github.com/qzz0518/Dukou.git
cd Dukou
mise run reinstall # 组装并签名 dist/Dukou.app,安装到 ~/Applications
不用 mise 的等价命令是下面这两行。
CONFIG=release Scripts/make-app.sh
Scripts/install-dev-build.sh
这里有一个容易踩的坑。构建脚本会自动选用钥匙串里稳定的 Developer ID / Apple Development 身份来签名,别嫌这一步多事。macOS 的 TCC 按代码签名记忆辅助功能授权,ad-hoc 签名的包每次重建签名都会变,重建一次授权就掉一次,你得反复去系统设置里点允许。如果你绕开脚本自己打包,跑出来的辅助功能权限老是失效,原因多半就在 ad-hoc 签名上。
第一次打开,先过两道关
装完启动 Dukou,四步向导会带你打开需要的入口。新装用户几乎都会在这里疑惑一下,共享扩展默认是未启用状态,你不去 Dukou 的「设置 → 入口」里逐条打开,它们就不会出现在微信的转发菜单里。装完发现菜单里什么都没有,先查这里,开关就在 Dukou 自己的设置里,不用绕去系统设置。
第二道关是辅助功能授权,自动粘贴靠它。跳过也行,其他入口照常用,第一次转发失败时 Dukou 会再引导一次。
两道都过完,链路就通了。微信里多选聊天记录 → 合并转发 → 转发到其他应用 → 选一条 Dukou 的入口。界面、五条菜单项和错误提示都有简体中文和 English 两个版本。
五条入口的实际用法
暂存到渡口,先停在屏幕角落
点完入口不会弹出任何面板,文件直接落到暂存架上。暂存架是一个不抢焦点的浮动方块,常驻你选定的屏幕角落,正在打字也不会被它打断。把文件从架子上拖进任何 App,对方接受了这一批就算消化掉,全部拖完方块自己消失。文件本身不会被删,转进「记录」页。记录里每一批都记着走的哪个入口、结果如何、占了多少空间,不在架子上的记录超过保留时长(默认 7 天)会自动移到废纸篓,需要时随时放回暂存架。
发给 Codex 或 Claude,自动激活并粘贴
前提是装了 ChatGPT.app 或 Claude.app。点入口后 Dukou 把目标 App 激活到前台,把文件连同附加的 Prompt 一起粘贴进输入框,目标在后台甚至最小化也送得到。实现上走 NSWorkspace 激活加 CGEvent 代按 ⌘V,都属于系统能力,没有碰私有 API,前面那道辅助功能授权就是给代按 ⌘V 用的。
复制到剪贴板
最朴素的一条,文件 URL 放进剪贴板就结束,粘到哪、什么时候粘,由你自己决定。目标 App 不在支持列表里、或者你想自己控制粘贴时机的时候,这条最稳。
发送到自定义,接上你自己的工具链
在设置里维护一份你自己的应用清单。清单里只有一个目标时点完直接发,多个目标才会在鼠标旁边弹一张小卡片让你挑。这份清单同时被暂存架右键和记录页的「发给 ▸」使用,改一处全局生效。终端类应用有个专门的处理,可以只粘贴带引号的文件路径,在命令行里直接引用这批文件。
附加 Prompt,先粘指令再粘文件
发给 Codex、Claude、自定义应用或走快捷微信转发时,Dukou 会先粘贴一条你写好的 Prompt,再粘文件;终端类应用的文件是路径形式,Prompt 就拼在路径前面。自带一条总结用的 Prompt,最多保存 3 条,随时切换。agent 拿到记录时已经知道该干什么,这步省掉每次手动敲指令。
转发失败时文件去了哪里
三种典型的失败场景,目标 App 没装、没给权限、目标没到前台。Dukou 的兜底规则很明确,无论哪种失败,文件一定已经写进剪贴板,同时弹出的提示里给一个「放到暂存架」的按钮,你可以就地把它架起来再拖。反过来的规则也成立,转发成功时不弹任何提示,安静完成。
快捷微信转发,连多选都省了
这个功能目前标着「实验」。你填群名和条数,Dukou 通过辅助功能自己在微信里完成多选和合并转发,校验导出的 ZIP 完整后粘贴到你正在用的 App,目标在后台或最小化都送得到。
性能上,500 条消息全程约 20 秒,超过 100 条自动分批。执行期间屏幕角落有一枚状态条报进度,随时可以取消。
有一个要有心理准备的地方,执行期间鼠标和键盘归 Dukou,你在旁边抢不过它,挑一段不需要操作电脑的时间跑。
聊天数据在 Dukou 里的完整路径
接入前最关心的问题,拆开看答案。
微信导出的 ZIP 被原样复制进 App Group 容器保存,全程不解压、不读取内容。剪贴板里只会出现三种东西,文件 URL、附加的 Prompt 文本,或者终端类应用要的路径。
网络方面只有软件更新这一件事。五个共享扩展全部在沙盒里且没有网络权限,仓库里的 Scripts/check-release-config.sh 持续断言这一点,配置被改坏时校验会直接失败。主 App 唯一的网络请求是 Sparkle 读取 GitHub Pages 上签名的 appcast,下载也只从 GitHub Release 拿你确认过的那一个版本,更新包带 EdDSA 签名校验。
实现层面没有用私有 API,激活目标走 NSWorkspace,代按 ⌘V 走 CGEvent 加系统授权。有一处设计上的取舍要说清楚,主 App 没有开沙盒,因为入口开关需要调用 pluginkit,而系统的 pkd 服务拒绝沙盒进程。真正接触聊天文件的五个扩展全部在沙盒里,主 App 只负责界面和调度。
从源码改代码要看的几个地方
工程分三个 target。DukouCore 放收件箱协议、manifest、转发意图、批次状态,以及微信自动化里可以单独测试的纯逻辑;DukouShare 是共享扩展本体,只有导入与落盘,没有界面;DukouApp 是常驻 App,管暂存架、自动粘贴、权限引导、设置窗口、微信自动化和 Sparkle 更新。Tests 里覆盖收件箱、批次状态、转发目标和微信记录解析。
五个 .appex 共用一份可执行文件,靠 DKShareAction 区分身份,五条入口的体积开销是共享的。文件交接走了一套两段式的收件箱设计,扩展把文件复制进 App Group 的 Inbox/Staging,写完 manifest 与 intent 后把整个目录一次 rename 到 Inbox/Ready,主 App 监听目录变化后消费 intent。rename 的原子性保证了整批文件要么完整出现,要么完全不出现,这也解释了为什么没有界面的扩展要赶在系统回收临时文件前完成复制。intent 是读即删的,每批文件只执行一次,不会重复投递。
日常开发命令集中注册在 mise 里。
| 命令 | 用途 |
|---|---|
mise run build |
构建三个 target |
mise run test |
运行测试 |
mise run i18n |
校验中英资源与源码引用是否一致 |
mise run release-config |
校验 bundle id、App Group、entitlement 与五条入口 |
mise run bundle |
组装并签名本机架构的 dist/Dukou.app |
mise run bundle-universal |
同上,Universal 2 |
mise run install / reinstall |
安装到 ~/Applications;reinstall 先重建 |
mise run icon |
从 Resources/AppIcon-artwork.png 生成 PNG、ICNS 与 README 图标 |
mise run dmg-background |
画 DMG 打开时的 Finder 背景 |
mise run release-dry-run |
用 Developer ID 生成未公证的 Universal 2 候选 DMG |
mise run release |
从干净 tag 构建、签名、公证、staple 并生成签名 appcast |
mise run verify |
构建、测试、校验、打包,一步全做 |
发版流程可以直接看 mise run release 的定义,从干净 tag 构建、签名、公证、staple 到生成签名 appcast 一条命令完成,想先看产物就跑 release-dry-run。
目前的边界
README 里如实标注了这是早期版本。五条入口、暂存架、自动粘贴与 Sparkle 更新已经在本机端到端跑通,大文件、多显示器、全新机器上的权限引导这三块还没逐项验收。你正好在这些场景里用,遇到问题去 GitHub Issues 报告是最有用的反馈方式。
操作清单速览
-
[ ] brew install --cask qzz0518/tap/dukou,或从 Releases 下载 DMG 拖进 Applications -
[ ] 启动 Dukou 跟随四步向导,在「设置 → 入口」打开要用的入口(默认全关,不开不出现) -
[ ] 需要自动粘贴就授权辅助功能,跳过后首次失败会再次引导 -
[ ] 微信里多选聊天记录 → 合并转发 → 转发到其他应用 → 选 Dukou 入口 -
[ ] 在设置里保存最多 3 条附加 Prompt,发给 agent 前自动先粘指令 -
[ ] 常用 App 加入「发送到自定义」清单,终端类应用可选只粘路径 -
[ ] 记录默认保留 7 天,过期自动进废纸篓,可随时放回暂存架 -
[ ] 更新走 brew upgrade --cask dukou,或等 Sparkle 提示
FAQ
Q:Dukou 需要读微信的聊天数据库或者解密吗?
A:不需要。聊天内容由微信自己导出成 ZIP 加 TXT,Dukou 把它当不透明文件原样搬运,不解压也不读内容。
Q:装完之后转发菜单里为什么没有 Dukou?
A:新装的共享扩展默认未启用。打开 Dukou 的「设置 → 入口」,把要用的入口逐条打开才会出现在菜单里。
Q:自动粘贴为什么要辅助功能权限?
A:粘贴是 Dukou 替你按了一次 ⌘V,走 CGEvent 需要系统授权。跳过授权只影响自动粘贴,其他入口照常。
Q:自己从源码构建后,辅助功能授权为什么老是失效?
A:ad-hoc 签名每次重建都会变,而 TCC 按签名记忆授权。用仓库自带的构建脚本,它会选钥匙串里稳定的 Developer ID / Apple Development 身份。
Q:Dukou 会把聊天记录传到网上吗?
A:不会。五个扩展在沙盒里且没有网络权限,主 App 唯一的联网行为是 Sparkle 检查并下载你确认过的签名更新。
Q:500 条消息的快捷转发要跑多久?
A:全程约 20 秒,超过 100 条自动分批。执行期间鼠标键盘由 Dukou 接管,角落的状态条可随时取消。
Q:目标 App 没开或者没到前台,转发会丢吗?
A:不会丢。文件一定已写进剪贴板,提示里还给一个「放到暂存架」的按钮。
Q:暂存架和记录会一直占着磁盘空间吗?
A:不会。不在架上的记录超过默认 7 天保留期自动移到废纸篓,需要时能放回暂存架。

