-
图片 CDN 上传打通后,把 MCP 发图工具从旧的 share-intent UI 模拟切到内部 API: - wechat_hook_send.py: 新增 send_image_via_hook(wxid, image_path) — 先 stage 到 /sdcard 保证 WeChat 进程可读,再广播 SEND_IMAGE_INTERNAL;hook 内部走 b80.u.oj(插库+建描述符) + v70.w.oj(提交 CDN 上传),接收方收全分辨率原图。 新增常量 SEND_IMAGE_ACTION。旧 send_image_via_intent 保留作参考/UI 兜底。 - android_mcp.py: send_wechat_image 工具改调 send_image_via_hook,更新 docstring (无 UI 模拟、无选联系人、无发错人风险;nickname 不解析,须传 wxid)。 真机验证(off-device 走 wechat_hook_send.send_image_via_hook 直调): status=sent + hook oj() DONE + CDN submit DONE items=1。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-
skills/wechat-voice-sender/SKILL.md: - when to use、核心工具调用示例、已知联系人 wxid 表 - 明确告知 Hermes:不要自己实现 edge-tts/silk-wasm,调工具即可 - 错误处理表、安全约束 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
- 去掉 send_voice_tts_via_hook 里多余的 staging 步骤: 生成 SILK 后直接把临时路径传给 send_voice_via_hook, 由它统一做 cp → wechat_cache + broadcast(避免 cp A→A 报错) - _tts_to_silk: ffmpeg/node 路径检测增加 Termux 全路径候选, root su shell 下 PATH 不含 Termux bin 时也能找到 验证:device 侧 Python 直调 send_voice_tts_via_hook → filehelper 5620ms 语音 OK Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
silk-wasm 搜索顺序调整为 Termux 全局路径优先, 与 node.js 在 Termux 下 NODE_PATH 行为一致。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
wechat_hook_send.py: - 新增 _tts_to_silk(): edge-tts → ffmpeg → silk-wasm 完整 TTS 管线 支持 on-device (Termux) 和 off-device (Mac adb push) 两种运行模式 - 新增 send_voice_tts_via_hook(): 文字 → 语音一步到位, 自动处理 TTS/SILK 编码+WeChat cache 暂存+broadcast 发送 android_mcp.py: - 新增 send_wechat_voice_tts MCP 工具(Hermes 直接传文字即可发语音) docstring 明确写明:不要自己实现 SILK,调这个工具就行 docs/wechat-voice-send-guide.md (新): - Hermes 调用说明:正确姿势 / 声音选项 / 依赖安装 / 常见错误 / 技术背景 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
Hook.java v3.1 (315 行): - body 捕获:okio.Buffer 读取 POST/PUT body(截断 2000 字符) - Proxy poller(后台线程,1s 轮询 /xhs_proxy/pending): executeOkHttp() 在 XHS 进程内用 OkHttpClient 执行代理请求, 自动经过 XHS 拦截器签名,结果 POST /xhs_proxy/result - 手写 JSON 解析器(无外部依赖) - 保留 /xhs_params 转发(每条 edith 请求实时上报) event_server.py(Hermes 编写): - proxy_requests 表(pending→ok/error 状态机) - POST /xhs_proxy — Hermes 下发代理请求 - GET /xhs_proxy/pending — Hook 轮询取下一个任务 - POST /xhs_proxy/result — Hook 上报执行结果 - GET /xhs_proxy/result/{id} — Hermes 轮询取结果 - DELETE /xhs_proxy/{id} — 清理完成的任务 架构:Hermes → event_server → Hook(XHS进程内OkHttp签名) → event_server → Hermes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> -
- event_server.py: POST /xhs_params receives forwarded XHS edith requests from xhshook v3 (Hook.java background thread), stores as type='xhs_request' in events DB; GET /xhs_params returns latest N captures for Hermes to query - Pushed to device ~/.hermes/event_bus/event_server.py - STATUS.md: reflect v3 state (mid=4, DEX=6328B, HTTP forwarding live), mark task C done, add Hermes startup instructions for event_server + xhs_params query Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
涵盖系统自动 OTA 升级静默清掉 Magisk root 的恢复流程、hermes gateway 才是真正监听消息平台的常驻进程(chat -q 测试不代表能收发消息)、 gateway stop 杀不干净手动 nohup 进程的坑、用 state.db 排查卡死 cron 任务的方法、tool_loop_guardrails.hard_stop_enabled 默认关闭导致无限 重试、以及 Kimi Coding Plan 模型标识符和 Thinking 模式的验证方法。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
涵盖 macOS tar AppleDouble 文件污染、psutil Android sys.platform 不兼容、 jiter/maturin cargo 编译竞态与镜像缺口、ffmpeg libc++ 版本不一致、 以及 Kimi Coding Plan key 的非交互配置方法。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
frida_call 此前完全不可达(TASKS.md S3-03):Mac 端没装 frida/frida-tools pip 包。新建 phoneuse/.venv,锁定 frida==17.9.10 + frida-tools==14.8.0 (与设备上跑的 frida-server 17.9.10 匹配,更新版本的 frida-tools 对 frida 有严格 range 依赖会直接报错),新增 start_frida_bridge.sh 一键 adb reverse + 起桥。 新增 frida_inspect_tools.py:inspect_foreground_intent(package) / dump_live_bitmaps(package, max_export) 两个通用 MCP 工具,分别用 Java.choose 枚举目标进程里存活的 Activity(按 hasWindowFocus 识别前台) 和 Bitmap(按 allocationByteCount 排序导出最大的 N 张为 base64 PNG)。 不需要逆向任何具体 App,跟 per-app hook(如微信 sendMessage,已被证实 重度混淆卡死过)明确区分开。 已知限制:frida_bridge.py 现有的进程名子串匹配按 frida 报告的人类可读 标签匹配,不是包名,微信类多进程 App 会匹配到无 UI 的子进程导致静默空 结果——两个新工具已对空结果加诊断提示,根因不在本次改动范围。真机端到 端验证因设备从 adb devices 掉线未完成,TASKS.md 按既有审计格式如实标 记为 [!] 阻塞,未来设备在线后用 Settings/Calculator 之类无隐私 App 补测。 CLAUDE.md 补上 phoneuse 子项目说明——2026-06-23 拍平合并进本仓库后一直 没同步进根文档。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
之前 mitm_proxy.py 一直是手动 nohup 起的,不在任何自启脚本里,进程被杀 或手机重启后需要手动重新启动。现跟 EventServer 一样接入 start_service/ stop_service 框架,用 pid 文件跟踪。 mitm_proxy 必须以 root 跑(~/.hermes/mitm_ca 历史上由 root 创建, 普通 Termux 用户没有写权限,新域名首次访问会因建证书失败退化成不拦截 的透传),stop_all.sh 原来的 stop_service 直接 kill 在非 root 进程上 会因 EPERM 失败,加了 as_root 参数走 su -c kill。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
全局 http_proxy 指向此代理后,Chrome 等遵守系统代理的 app 的 HTTPS 请求 全部失败,而不读系统代理的 Termux 工具表现正常。 - TLS 握手改用 asyncio 原生 loop.start_tls(),去掉手动 dup socket 同步 握手的旧实现:cert 生成 await 让出控制权时,asyncio 事件循环会把刚到的 ClientHello 字节读进自己的缓冲区,导致握手线程永远等不到数据。 - 证书生成加 _cert_lock,避免同一域名并发首次访问时生成的 cert/key 文件 互相踩踏导致 KEY_VALUES_MISMATCH,此后该域名永久失败。 已在设备上实测验证:单域名 + 5 并发首次访问全部通过。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-
phoneuse 原是独立 git 仓库(origin: gitlab phoneuse.git),现移除其 内部 .git 元数据,把代码拍平为本仓库的普通文件纳入历史。phoneuse 自身 3 条 commit 历史仍完整保留在 gitlab 远端,未受影响。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>