🗂️

加载中...

📝 编辑备注

🚀 新建 launcher

🖥️ 机器设置

配置本机的 code-server / VS Code 端口项目根目录。 每个项目卡片右上角会出现 VS Code 图标,点击在新窗口打开。

backend 机器(实际跑 Chrome 命令的那台,通常就是你坐的 Mac)在主 ⚙️ 的「本地 Chrome 控制」里设置。

terminal

connecting… 点遮罩关闭 · Esc 关闭

⚙️ 同步设置

配置 GitHub Personal Access Token(fine-grained,限定 dev-dashboard repo,Contents: Read+Write)后,名字 / 备注 / launchers 的改动会自动 commit 到 git,跨设备同步。
→ 生成 PAT(一次设置长期有效)

未配置(改动仅保存本机)


🔔 PWA 通知

对话完成时,dashboard 在后台就用系统通知提示你(前台还是 toast,避免重复打扰)。 装到桌面后即使浏览器关掉也能收到(iOS 需要先「添加到主屏幕」)。


🖥️ 本地 Chrome 控制

点 VS Code 图标 → 浏览器 fetch 这个 URL → 你本机跑的 chrome-opener 服务 spawn Chrome。 profile 是 per-machine 的(在每台机器的 ⚙️ 里设),这里只配 chrome-opener 的访问地址。
装 chrome-opener:见 server/example/chrome-opener.plist

` 段 2. 同时改 `~/project/tools/crawlers/wechat/docs/research/res-downloader-mechanism.md`(保持 source of truth) 3. 在 §0 metadata 写"最后大改"日期 4. 在 §13 末尾加一行变更日志:日期 + 简短描述 5. commit 两个 repo(dashboard + wechat-crawler) 6. dashboard push 前按全局规则 ask 用户 **变更日志**: - 2026-05-25 — 首版(Claude 大改原 res-downloader-mechanism.md 升级为 master guide,加 mac spike 实测发现 / cb_bundle dump 机制 / 拓展路径分析) - 2026-05-25 晚 — Win 端 spike 重大突破 + 新坑: - ✅ Win 上 fork channelbreak 部署成功(wails build 53s + RD listen 8899 + CA + 系统代理 HKCU + schtasks 跑 session 1) - ✅ **mac/Win 都 type=2 不触发 cross-validation 确认** — `finderGetCommentDetail` UI 不调用 = hook 设计本身有缺陷,不是 mac 平台 issue - ✅ **Win 上 dump 出真 SPA bundle 435KB** — 杀 WeChatAppEx 后 `Rename-Item` web_shell\Code Cache / DawnCache(mac 弹窗做不到 → Win 直接搞)→ webview 重启重 fetch → RD 拦截 + dump 到 `C:\tmp\cb_bundle\` - ✅ Bundle grep 验证所有缺失字段都在:nickname×10 / likeCount×9 / commentCount×4 / forwardCount×4 / objectId×5 / feedId×11 / username×22 / author×3 - ✅ 找到 **20 个 `async finderGet*` 函数**作为新 hook 候选(finderGetUser / finderGetRecommend / finderGetCommentList / finderGetFavList / finderGetFollowList / finderGetLikedList / finderGetRelatedList 等) - ❌ 试加 type=3 (finderGetUser) + type=4 (finderGetCommentList) inject **break 了 SPA** — channels view 永远空白 - 实测注入 syntax valid(curl modified bundle 找 `wechat?type=3` 命中) - 推测:`JSON.stringify(res.data)` 在 SPA boot 早期 finderGetUser 调用时抛异常(res.data 可能含 protobuf binary / 大对象 / circular ref)→ SPA crash → view 空白 - **未来 hook 改造方向**:payload 只 stringify 选定字段(`{nickname:res.data?.contact?.nickname, ...}`),不是整 `res.data`;或者 try/catch wrap stringify;或者 setTimeout 0 异步化让 fetch 不在 critical render path - 当前代码状态:type=3/4 inject 已 disable(保留 regex declaration + 注释 + `_ = qqGetUserRegex`) - Pitfalls 新增:(1) Win schtasks /Run /TR 不接受 redirect → 改 .ps1 内部写 log 文件;(2) PC 微信 mini program 是独立 sub-window,sidebar click 自动化容易触发它而非视频号;(3) cliclick 系列在 ssh 自动化下坐标不稳(需 cv2 template match 才稳);(4) PowerShell Out-File UTF8 默认带 BOM,影响后续 grep(改用 `-Encoding UTF8NoBOM` 或直接 in-memory regex) - 2026-05-25 收尾 — **核心发现:dedup + 缩略图问题已解,不需要扩展 hook**: - 用户问"封面图能不能下载" → 实测 `curl -sL "" -o x.jpg` 直接拿 540×720 JPEG 130KB,无 cookie/referer/RD 代理 - 用 `encfilekey` (strip coverUrl 的 `&token=...`) 作 dedup key:1619 dumps → 202 unique videos(精确,远比 description 准) - **重大决策**:业务核心需求(dedup + 缩略图)100% 解,不要继续 spike type=3/4 hook 拿 author/likeCount。详见 §5.2.1 - 2026-05-25 更晚 — 用户改 type=1 hook 试 stringify outer scope + GUI 自动化突破: - 🔑 **GUI 自动化突破**:PowerShell `mouse_event` 在 PC 微信 Win 4.x 上不 work(不被主进程识别)→ 改用 **win-worker (FastAPI) 的 `/poc/find-and-click` endpoint,pyautogui 真 SendInput → click 100% 工作**。cv2 template match W icon confidence 1.0 → win-worker click → SPA 真 trigger - ✅ 用户改了 `qqMediaRegex` 的 injection:从 `JSON.stringify(this.objectDesc)` 改为 `JSON.stringify(this, replacer)`,replacer 跳过 function / `_` prefix / Vue framework fields (`$parent` / `$root` / `$el` / `$options` / `$vnode` / `$children` / `$refs`) + try/catch 降级 - ✅ **SPA 不再 crash**(验证 251 个新 feed dump 累积,证明 .media getter 被 invoke) - ❌ **payload 全 0 bytes** — `JSON.stringify(this, replacer)` 在 Vue 3 reactive proxy 下,所有 enumerable own properties 都被 filter 掉(多数是 `_` / `$` 前缀),stringify 返回 undefined → fetch 发空 body → 文件 0 字节 - **catch 兜底失效原因**:stringify 没 throw 只是返回 undefined,try 没失败,catch 不 fire - **下一步修法选项**(待后续 spike): - (a) 检测 `__cb_payload === undefined || === ""` 后退到老 fallback - (b) 改用 `Object.keys(this).filter(k => !k.startsWith("_") && !k.startsWith("$"))` 先看 `this` 究竟有哪些 enumerable props - (c) hardcode 选定字段路径:`{nickname: this.contact?.nickname, likeCount: this.likeCount, ...}` 然后 stringify - Pitfalls 补充:(5) win-worker /poc/find-and-click 是 ssh 自动化驱动 PC 微信 GUI 的真正可靠路径(pyautogui SendInput),不要再尝试 PowerShell mouse_event;(6) Vue 3 reactive proxy 下 enumerable own props 不在 JSON.stringify 默认枚举范围,需 specific path access