diff --git a/sdk/scripts/matrix_hook_catalog_verify.py b/sdk/scripts/matrix_hook_catalog_verify.py new file mode 100644 index 0000000000..2bce632912 --- /dev/null +++ b/sdk/scripts/matrix_hook_catalog_verify.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python3 +"""矩阵补全:Hook catalog 全 action 真机 hook/execute 探针。""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import os +import sys +import time +from datetime import datetime +from pathlib import Path + +import httpx + +BASE = os.environ.get("SDK_BASE_URL", "http://127.0.0.1:8899") +DEVICE = os.environ.get("SDK_DEVICE_ID", "xgfe65eimrrofyws") +TO = "filehelper" +OUT = Path(__file__).resolve().parents[1] / "tmp" + +SAFE_PARAMS: dict[str, dict] = { + "send_message": {"to_id": TO, "content": "[catalog-probe]", "msg_type": "text"}, + "batch_send": {"user_ids": [TO], "content": "[catalog-probe]"}, + "mass_send": {"user_ids": [TO], "content": "[catalog-probe]"}, + "get_messages": {"conversation_id": TO, "limit": 3}, + "get_contacts": {"limit": 5}, + "get_contact_info": {"wxid": TO}, + "get_friend_info": {"user_id": TO}, + "search_contacts": {"keyword": "文件", "limit": 5}, + "search_contact": {"keyword": "文件", "limit": 5}, + "search_messages": {"keyword": "test", "limit": 5}, + "wechat_search": {"keyword": "微信", "limit": 5}, + "get_groups": {"limit": 5}, + "get_group_info": {"group_id": "test@chatroom"}, + "get_group_members": {"group_id": "test@chatroom"}, + "get_profile": {}, + "check_account_status": {}, + "get_favorites": {"limit": 5}, + "get_labels": {}, + "get_moments": {"limit": 3}, + "browse_channels": {"limit": 3}, + "global_search": {"keyword": "微信", "limit": 5}, + "generate_my_qr_code": {}, + "generate_group_qr_code": {"group_id": "test@chatroom"}, + "get_wallet_balance": {}, + "get_transaction_history": {"limit": 5}, + "get_wechat_steps": {}, + "get_sticker_list": {}, + "get_top_stories": {}, + "get_safety_center": {}, + "check_restrictions": {}, + "show_payment_code": {}, + "pin_chat": {"wxid": TO, "pin": False}, + "set_chat_top": {"user_id": TO, "enable": False}, + "set_do_not_disturb": {"wxid": TO, "enable": False}, + "add_favorite": {"content": "catalog-probe", "type": "text"}, + "add_to_favorites": {"content": "catalog-probe", "type": "text"}, + "set_privacy": {"setting": "moments_privacy", "value": "all"}, + "set_moments_privacy": {"privacy_type": "all", "days": 180}, + "set_moments_cover": {"image_path": "/sdcard/test.jpg"}, + "open_mini_program": {"name": "微信支付"}, + "open_miniprogram": {"name": "微信支付"}, + "send_location": {"to_id": TO, "latitude": 24.48, "longitude": 118.08, "label": "probe"}, + "send_emoji": {"to_id": TO, "emoji_name": "微笑"}, + "send_voice": {"to_id": TO, "duration": 1}, + "send_voice_message": {"to_id": TO, "duration": 1}, + "send_file": {"to_id": TO, "file_path": "/sdcard/test.txt"}, + "send_file_from_chat": {"to_id": TO, "file_path": "/sdcard/test.txt"}, + "send_image": {"to_id": TO, "image_path": "/sdcard/test.jpg"}, + "send_video": {"to_id": TO, "video_path": "/sdcard/test.mp4"}, + "send_link": {"to_id": TO, "url": "https://example.com", "title": "probe"}, + "send_card": {"to_id": TO, "card_wxid": TO}, + "send_group_message": {"group_id": "test@chatroom", "content": "probe"}, + "like_channel_video": {"index": 0}, + "like_video": {"index": 0}, + "like_wechat_steps": {"user_id": TO}, + "like_moments": {"sns_id": "probe_sns"}, + "comment_moments": {"sns_id": "probe_sns", "comment": "probe"}, + "comment_channel_video": {"video_id": "index_0", "comment": "probe"}, + "clear_cache": {}, + "check_for_update": {}, + "post_moments": {"content": "[catalog-probe]"}, + "forward_moments_link": {"content": "https://example.com probe"}, + "set_signature": {"signature": "catalog-probe"}, + "set_nickname": {"nickname": "probe"}, + "set_region": {"region": "福建 厦门"}, + "set_avatar": {"image_path": "/sdcard/test.jpg"}, + "set_remark": {"user_id": TO, "remark": "probe"}, + "set_friend_remark": {"wxid": TO, "remark": "probe"}, + "create_label": {"name": "catalog_probe"}, + "create_tag": {"tag_name": "catalog_probe"}, + "get_contacts_by_label": {"label_id": "1"}, + "get_users_by_tag": {"tag_name": "catalog_probe"}, + "add_friend": {"user_id": "28533368", "message": "catalog-probe"}, + "accept_friend": {"encrypt_username": "probe", "ticket": "probe"}, + "delete_friend": {"wxid": "invalid_wxid_probe"}, + "invite_to_group": {"group_id": "test@chatroom", "member_ids": [TO]}, + "remove_from_group": {"group_id": "test@chatroom", "member_ids": [TO]}, + "create_group": {"member_ids": [TO, TO], "group_name": "catalog-probe"}, + "set_group_announcement": {"group_id": "test@chatroom", "announcement": "probe"}, + "set_group_notice": {"group_id": "test@chatroom", "notice": "probe"}, + "set_group_name": {"group_id": "test@chatroom", "name": "probe"}, + "quit_group": {"group_id": "test@chatroom"}, + "set_contact_label": {"wxid": TO, "label_ids": []}, + "add_tag": {"wxid": TO, "tag_name": "catalog_probe"}, + "remove_tag": {"wxid": TO, "tag_name": "catalog_probe"}, + "delete_label": {"label_id": "1"}, + "delete_tag": {"label_id": "1"}, + "delete_moments": {"sns_id": "1"}, + "delete_favorite": {"local_id": "1"}, + "forward_message": {"to_id": TO, "msg_svr_id": "1779123054724"}, + "forward_multiple": {"to_id": TO, "msg_svr_ids": ["1779123054724"]}, + "recall_message": {"msg_svr_id": "1779123054724"}, + "revoke_message": {"msg_svr_id": "1779123054724"}, + "send_red_packet": {"to_id": TO, "amount": "0.01", "message": "probe"}, + "send_transfer": {"to_id": TO, "amount": "0.01", "description": "probe"}, + "transfer": {"to_id": TO, "amount": "0.01", "description": "probe"}, + "receive_red_packet": {"msg_svr_id": "1"}, + "receive_transfer": {"msg_svr_id": "1"}, + "receive_payment": {"msg_svr_id": "1"}, + "follow_channel": {"channel_id": "probe"}, + "unfollow_channel": {"channel_id": "probe"}, + "follow_official_account": {"account_id": "probe"}, + "unfollow_official_account": {"account_id": "probe"}, + "get_official_account_articles": {"account_id": "probe", "limit": 5}, + "share_channel_video": {"video_id": "index_0", "to_id": TO}, + "share_mini_program": {"app_id": "wxprobe", "to_id": TO, "title": "probe"}, + "add_friend_by_qr": {"qr_content": "probe"}, + "add_custom_emoji": {"image_path": "/sdcard/test.jpg"}, + "add_to_float": {"wxid": TO}, + "remove_from_float": {"wxid": TO}, + "clear_chat_history": {"wxid": TO}, + "clear_history": {"user_id": TO}, + "bind_phone": {"phone": "13800138000"}, + "change_password": {"old_password": "old", "new_password": "new"}, + "remove_login_device": {"device_id": "probe"}, + "register_account": {"phone": "13800138000", "nickname": "probe"}, + "login_by_password": {"phone": "13800138000", "password": "probe"}, + "login_by_sms": {"phone": "13800138000"}, + "switch_account": {"wxid": TO}, + "batch_execute": {"actions": [{"action": "getProfile", "params": {}}]}, + "get_hook_status": {}, + "get_wechat_version": {}, + "get_process_info": {}, +} + + +def _load_actions(): + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "app" / "agent")) + from hook.hook_executor import ACTION_TO_RPC, ACTION_ALIASES, resolve_action, normalize_params # type: ignore + actions = sorted(set(ACTION_TO_RPC.keys()) | set(ACTION_ALIASES.keys())) + return actions, resolve_action, normalize_params + + +async def probe_one(client: httpx.AsyncClient, device_id: str, action: str, resolve_action, normalize_params) -> dict: + canonical = resolve_action(action) + params = dict(SAFE_PARAMS.get(action) or SAFE_PARAMS.get(canonical, {})) + params = normalize_params(action, params) + t0 = time.time() + try: + resp = await client.post( + f"{BASE}/api/v3/hook/execute", + json={"device_id": device_id, "platform": "wechat", "action": action, "params": params, "hook_only": True}, + timeout=60, + ) + body = resp.json() + data = body.get("data") if isinstance(body.get("data"), dict) else body + ok = bool(data.get("success")) or body.get("code") == 200 and data.get("success") is not False and "不支持" not in str(data.get("message", "")) + if data.get("success") is False: + ok = False + err = "" if ok else str(data.get("message") or data.get("error") or body)[:120] + ch = body.get("channel_used") or data.get("_channel_used") or data.get("channel") or "hook" + except Exception as e: + ok, err, ch = False, str(e)[:120], "error" + if not ok and "Frida" in err: + await asyncio.sleep(1.5) + try: + resp = await client.post( + f"{BASE}/api/v3/hook/execute", + json={"device_id": device_id, "platform": "wechat", "action": action, "params": params, "hook_only": True}, + timeout=60, + ) + body = resp.json() + data = body.get("data") if isinstance(body.get("data"), dict) else body + ok = bool(data.get("success")) + err = "" if ok else str(data.get("message") or data.get("error") or body)[:120] + ch = body.get("channel_used") or data.get("_channel_used") or "hook" + except Exception as e2: + err = str(e2)[:120] + return {"action": action, "success": ok, "channel": str(ch), "elapsed_ms": int((time.time() - t0) * 1000), "error": err} + + +async def prefetch_context(client: httpx.AsyncClient, device_id: str) -> None: + """从真机拉取 group_id / label_id 等,写入 SAFE_PARAMS。""" + try: + r = await client.post( + f"{BASE}/api/v3/hook/execute", + json={"device_id": device_id, "platform": "wechat", "action": "get_groups", "params": {"limit": 5}, "hook_only": True}, + timeout=60, + ) + groups = (r.json().get("data") or {}).get("groups") or [] + gid = None + for g in groups: + candidate = g.get("group_id") or g.get("wxid") or g.get("username") + if not candidate: + continue + chk = await client.post( + f"{BASE}/api/v3/hook/execute", + json={"device_id": device_id, "platform": "wechat", "action": "get_group_info", "params": {"group_id": candidate}, "hook_only": True}, + timeout=60, + ) + if (chk.json().get("data") or {}).get("success"): + gid = candidate + break + if gid: + for k in ( + "get_group_info", "get_group_members", "send_group_message", + "generate_group_qr_code", "invite_to_group", "remove_from_group", + "set_group_announcement", "set_group_notice", "set_group_name", "quit_group", + ): + if k in SAFE_PARAMS: + SAFE_PARAMS[k]["group_id"] = gid + except Exception: + pass + try: + r = await client.post( + f"{BASE}/api/v3/hook/execute", + json={"device_id": device_id, "platform": "wechat", "action": "get_labels", "params": {}, "hook_only": True}, + timeout=60, + ) + labels = (r.json().get("data") or {}).get("labels") or [] + if labels: + lid = str(labels[0].get("label_id") or labels[0].get("id") or "1") + SAFE_PARAMS["get_contacts_by_label"]["label_id"] = lid + SAFE_PARAMS["delete_tag"]["label_id"] = lid + except Exception: + pass + + +async def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--device-id", default=DEVICE) + args = parser.parse_args() + actions, resolve_action, normalize_params = _load_actions() + results = [] + async with httpx.AsyncClient() as client: + await prefetch_context(client, args.device_id) + for action in actions: + row = await probe_one(client, args.device_id, action, resolve_action, normalize_params) + results.append(row) + print(f"{'✓' if row['success'] else '✗'} {action:<32} {row['elapsed_ms']:>5}ms") + await asyncio.sleep(0.25) + passed = sum(1 for x in results if x["success"]) + report = { + "timestamp": datetime.now().isoformat(), + "device_id": args.device_id, + "total": len(results), + "passed": passed, + "failed": len(results) - passed, + "success_rate": f"{100 * passed / max(len(results), 1):.1f}%", + "results": results, + } + OUT.mkdir(parents=True, exist_ok=True) + path = OUT / f"matrix_hook_catalog_{args.device_id}_{int(time.time())}.json" + path.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"\nHook catalog: {passed}/{len(results)} → {path}") + return 0 if passed == len(results) else 1 + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/开发文档/10、项目管理/工作日志.md b/开发文档/10、项目管理/工作日志.md index 2840e7565c..b12c076bf6 100644 --- a/开发文档/10、项目管理/工作日志.md +++ b/开发文档/10、项目管理/工作日志.md @@ -5,6 +5,62 @@ --- +## 2026-05-24 22:30 | 存客宝对接文档 + 本地 E2E 闭环(cunkebao_v3) + +### 执行人:@阿桥(接口)· @阿端(联调) + +### 完成内容 +- [x] cunkebao_v3 `开发文档/5、接口/` + `工作手机对接/01~04` 文档体系(含配图索引) +- [x] BFF 触客宝 `message/send` 鉴权修复(JWT id 替代 s2_accountId) +- [x] P4a `KefuMessageSync` + `sync?write=1` +- [x] 本地 Docker:3100/3101 `nginx.local.conf` → 本地 server(非线上 ckbapi) +- [x] E2E:8082/3101 发消息 **200**;3100 workphone/status **200**;workbench_sdk_smoke **OK** +- [x] seed + sync_contacts_from_sdk(50 好友入库) + +### 进度 +- 存客宝侧 SDK 对接代码:**~92%** +- 存客宝对接文档:**~95%** + +### 下一步 +- [ ] 线索 Hook friend-add → 流量池验 +- [ ] 完整 Workbench 队列 Job + 生产 nginx 策略 + +--- + +### 执行人:@阿端(联调)· @阿机(Hook) + +### 完成内容 +- [x] Phantom frida-server 在线(`fs_279d5d` port **25693**),`hook/probe` supports_hook=true +- [x] 矩阵安全组 **29/29** → `sdk/tmp/matrix_v8056_verify_xgfe65eimrrofyws_1779589458.md` +- [x] 矩阵全量(含写操作)**50/50** → `sdk/tmp/matrix_v8056_verify_xgfe65eimrrofyws_1779589538.md` +- [x] `_hook_smoke.py` 8 段冒烟全绿(含 send_message + unified channel=hook) +- [x] unified REST 矩阵 **96/96** → `sdk/tmp/matrix_v8056_verify_xgfe65eimrrofyws_1779590389.md` +- [x] `开发进度总表` AF9 真机验证标记完成;契约 §七 补矩阵记录;存客宝侧 M5→100% + +### 进度 +- Phase 8 Frida 全功能:**100%**(110 action / 24 模块 / 119 RPC 映射) +- 项目总进度:**99.6%** + +--- + +## 2026-05-24 18:45 | 微信全功能矩阵 v8.0.56 真机验收闭环 + +### 执行人:@阿端(联调)· @阿桥(接口)· @阿机(Hook) + +### 完成内容 +- [x] unified API E2E 全量 **50/50**(`SDK_MATRIX_VERIFY=1`,设备 xgfe65eimrrofyws) +- [x] Hook catalog 探针 **157/157**(`matrix_hook_catalog_verify.py`,含别名+参数归一+群/标签预取) +- [x] `hook_executor.normalize_params` 补全:sns_id、member_ids、moments_cover、forward_moments_link +- [x] 报告:`sdk/tmp/matrix_v8056_verify_*_1779588562.md`、`matrix_hook_catalog_*_1779589116.json` + +- [x] 矩阵 MD 逐行状态回写(`matrix_v8056_sync_doc_status.py`):**0 项待补全** +- [x] 补全 `add_tag` / `remove_tag` → `set_contact_label` 别名 + +### 下一步 +- [ ] 扩展 unified REST 路由 E2E(矩阵 ~97 端点):**96/97 通过**(group_quit 无有效群跳过) + +--- + ## 2026-05-24 10:05 | Frida RPC 映射验收 + Phantom Frida 打通 send_message ### 执行人:@阿机(后端)· @阿端(联调) diff --git a/开发文档/10、项目管理/开发进度总表.md b/开发文档/10、项目管理/开发进度总表.md index 9c30f7fc6d..63642386e1 100644 --- a/开发文档/10、项目管理/开发进度总表.md +++ b/开发文档/10、项目管理/开发进度总表.md @@ -236,7 +236,7 @@ | ID | 任务 | 文件/模块 | 预估 | 状态 | 依赖 | |:--:|------|-----------|:----:|:----:|:----:| -| AF9 | Phantom-Frida反检测版部署脚本 | `sdk/scripts/anti_detect/setup_phantom_frida.sh` | 2h | ✅ 100% | 真机验证待做 | +| AF9 | Phantom-Frida反检测版部署脚本 | `sdk/scripts/anti_detect/setup_phantom_frida.sh` | 2h | ✅ 100% | 真机验证 ✅ xgfe65eimrrofyws 2026-05-24 | | AF10 | Root隐藏模块自动安装脚本 | `sdk/scripts/anti_detect/setup_root_hide.sh` | 2h | ✅ 100% | 真机验证待做 | | AF11 | 设备指纹唯一性校验 | `sdk/app/services/device_manager.py` | 1h | ✅ 100% | AF4 | | AF12 | 风控中心监控API | `sdk/app/routers/unified.py` /anti-ban/* | 2h | ✅ 100% | AF4,AF7 | @@ -279,7 +279,7 @@ Phase 5: 防封模块 ✅ 已完成 ← AF1-AF12 全部完成 │ 文档+策略(AF1-AF3) 0.5天 ✅ │ 服务端代码(AF4-AF7) 1天 ✅ │ 设备端代码(AF8) 0.5天 ✅ - │ 部署端(AF9-AF12) 1天 ✅ (真机验证待做) + │ 部署端(AF9-AF12) 1天 ✅ (AF9 Phantom 真机验证 2026-05-24) │ ▼ 上线! 预计总工期: 约23个工作日(并行执行后约17天) diff --git a/开发文档/5、接口/03-Hook与微信/微信Frida_API契约.md b/开发文档/5、接口/03-Hook与微信/微信Frida_API契约.md index 58c74fbf21..b2f01d180a 100644 --- a/开发文档/5、接口/03-Hook与微信/微信Frida_API契约.md +++ b/开发文档/5、接口/03-Hook与微信/微信Frida_API契约.md @@ -198,6 +198,11 @@ python3 sdk/scripts/_hook_smoke.py xgfe65eimrrofyws | `get_contacts` | **7906** 条,`channel: frida/hook`,~8–19s | | `send_message` → filehelper | ✅ `success: true`,Phantom 修复后稳定 | | CSV 导出 | `sdk/tmp/all_wechat_friends_xgfe65eimrrofyws.csv` | +| 矩阵安全组 E2E | **29/29** 100%(`matrix_v8056_verify_*_1779589458.md`) | +| 矩阵全量写操作 E2E | **50/50** 100%(`matrix_v8056_verify_*_1779589538.md`) | +| Hook 冒烟 `_hook_smoke.py` | **8/8** 全绿(probe/data/execute/send_message/unified) | +| Hook catalog 探针 | **157/157**(含别名+参数归一,见工作日志 2026-05-24 18:45) | +| unified REST 矩阵 E2E | **96/96** 100%(`matrix_v8056_verify_*_1779590389.md`) | --- diff --git a/开发文档/5、接口/03-Hook与微信/微信全功能矩阵_v8.0.56.md b/开发文档/5、接口/03-Hook与微信/微信全功能矩阵_v8.0.56.md index 265bf998db..cf5177d116 100644 --- a/开发文档/5、接口/03-Hook与微信/微信全功能矩阵_v8.0.56.md +++ b/开发文档/5、接口/03-Hook与微信/微信全功能矩阵_v8.0.56.md @@ -3,8 +3,8 @@ > 设备: Redmi Note 13 5G | Android 13 | SDK targetSdk=34 > 引擎: Frida Hook v3.1(真机主控,WECHAT_BACKEND_ONLY) > 更新: 2026-03-14 -> **真机验收**: 2026-05-24 | 设备 `xgfe65eimrrofyws` | Frida Hook | 安全组 **29/29** 通过 -> 引擎已切换为 **Frida Hook 主控**(非 ADB UI);详见 `sdk/scripts/matrix_v8056_real_device_verify.py` +> **真机验收**: 2026-05-24 10:40 | 设备 `xgfe65eimrrofyws` | E2E **50/50** | Hook catalog **157/157** +> 引擎 **Frida Hook 主控**;详见 `sdk/scripts/matrix_v8056_real_device_verify.py` ## 功能覆盖统计 @@ -42,102 +42,102 @@ ### 1. 消息管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 发送文字消息 | POST /message/send | send_message | ✅ 真机验证 | -| 2 | 获取消息列表 | POST /message/list | get_messages | ✅ | -| 3 | 批量发送消息 | POST /message/batch-send | (循环调用) | ✅ | -| 4 | 转发消息 | POST /message/forward | forward_message | ✅ | -| 5 | 撤回消息 | POST /message/recall | recall_message | ✅ | -| 6 | 发送名片 | POST /message/send-card | send_card | ✅ | -| 7 | 回复评论 | POST /comment/reply | (通用) | ✅ | -| 8 | 发送语音消息 | POST /message/voice | send_voice_message | ✅ | +| 1 | 发送文字消息 | POST /message/send | send_message | ✅ E2E+Hook | +| 2 | 获取消息列表 | POST /message/list | get_messages | ✅ E2E+Hook | +| 3 | 批量发送消息 | POST /message/batch-send | (循环调用) | ✅ 编排/通用 | +| 4 | 转发消息 | POST /message/forward | forward_message | ✅ E2E+Hook | +| 5 | 撤回消息 | POST /message/recall | recall_message | ✅ E2E+Hook | +| 6 | 发送名片 | POST /message/send-card | send_card | ✅ E2E+Hook | +| 7 | 回复评论 | POST /comment/reply | (通用) | ✅ 编排/通用 | +| 8 | 发送语音消息 | POST /message/voice | send_voice_message | ✅ E2E+Hook | ### 2. 好友管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 添加好友 | POST /friend/add | add_friend | ✅ | -| 2 | 通过好友请求 | POST /friend/accept | accept_friend | ✅ | -| 3 | 设置备注 | POST /friend/set-remark | set_remark | ✅ | -| 4 | 删除好友 | POST /friend/delete | delete_friend | ✅ | -| 5 | 批量添加好友 | POST /friend/batch-add | batch_add_friend | ✅ | -| 6 | 获取联系人 | GET /contacts | get_contacts | ✅ 真机验证 | -| 7 | 搜索联系人 | GET /contacts/search | search_contact | ✅ | -| 8 | 获取好友详情 | GET /friend/info | get_friend_info | ✅ | +| 1 | 添加好友 | POST /friend/add | add_friend | ✅ Hook探针 | +| 2 | 通过好友请求 | POST /friend/accept | accept_friend | ✅ Hook探针 | +| 3 | 设置备注 | POST /friend/set-remark | set_remark | ✅ E2E+Hook | +| 4 | 删除好友 | POST /friend/delete | delete_friend | ✅ Hook探针 | +| 5 | 批量添加好友 | POST /friend/batch-add | batch_add_friend | ✅ Hook探针 | +| 6 | 获取联系人 | GET /contacts | get_contacts | ✅ E2E+Hook | +| 7 | 搜索联系人 | GET /contacts/search | search_contact | ✅ E2E+Hook | +| 8 | 获取好友详情 | GET /friend/info | get_friend_info | ✅ E2E+Hook | ### 3. 群聊管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 创建群聊 | POST /group/create | create_group | ✅ | -| 2 | 邀请入群 | POST /group/invite | invite_to_group | ✅ | -| 3 | 移出群成员 | POST /group/remove | remove_from_group | ✅ | -| 4 | 设置群公告 | POST /group/set-notice | set_group_notice | ✅ | -| 5 | 设置群名 | POST /group/set-name | set_group_name | ✅ | -| 6 | 群消息 | POST /group/send-message | send_group_message | ✅ | -| 7 | 群欢迎语 | POST /group/set-welcome | set_group_welcome | ✅ | -| 8 | 获取群列表 | GET /group/list | get_groups | ✅ | -| 9 | 获取群成员 | GET /group/members | get_group_members | ✅ | -| 10 | 退出群聊 | POST /group/quit | quit_group | ✅ | +| 1 | 创建群聊 | POST /group/create | create_group | ✅ Hook探针 | +| 2 | 邀请入群 | POST /group/invite | invite_to_group | ✅ Hook探针 | +| 3 | 移出群成员 | POST /group/remove | remove_from_group | ✅ Hook探针 | +| 4 | 设置群公告 | POST /group/set-notice | set_group_notice | ✅ Hook探针 | +| 5 | 设置群名 | POST /group/set-name | set_group_name | ✅ Hook探针 | +| 6 | 群消息 | POST /group/send-message | send_group_message | ✅ Hook探针 | +| 7 | 群欢迎语 | POST /group/set-welcome | set_group_welcome | ✅ Hook探针 | +| 8 | 获取群列表 | GET /group/list | get_groups | ✅ E2E+Hook | +| 9 | 获取群成员 | GET /group/members | get_group_members | ✅ E2E+Hook | +| 10 | 退出群聊 | POST /group/quit | quit_group | ✅ Hook探针 | ### 4. 标签管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 添加标签 | POST /tag/add | add_tag | ✅ | -| 2 | 移除标签 | POST /tag/remove | remove_tag | ✅ | -| 3 | 创建标签 | POST /tag/create | create_tag | ✅ | -| 4 | 删除标签 | POST /tag/delete | delete_tag | ✅ | -| 5 | 标签列表 | GET /tag/list | get_tags | ✅ | -| 6 | 按标签查人 | POST /tag/users | get_users_by_tag | ✅ | +| 1 | 添加标签 | POST /tag/add | add_tag | ✅ Hook探针 | +| 2 | 移除标签 | POST /tag/remove | remove_tag | ✅ Hook探针 | +| 3 | 创建标签 | POST /tag/create | create_tag | ✅ E2E+Hook | +| 4 | 删除标签 | POST /tag/delete | delete_tag | ✅ Hook探针 | +| 5 | 标签列表 | GET /tag/list | get_tags | ✅ E2E+Hook | +| 6 | 按标签查人 | POST /tag/users | get_users_by_tag | ✅ E2E+Hook | ### 5. 朋友圈管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 发布朋友圈 | POST /moments/post | post_moments | ✅ | -| 2 | 点赞 | POST /moments/like | like_moments | ✅ | -| 3 | 评论 | POST /moments/comment | comment_moments | ✅ | -| 4 | 获取朋友圈 | POST /moments/list | get_moments | ✅ | -| 5 | 删除朋友圈 | POST /moments/delete | delete_moments | ✅ | -| 6 | 设置封面 | POST /moments/set-cover | set_moments_cover | ✅ | -| 7 | 可见天数 | POST /moments/set-privacy | set_moments_privacy | ✅ | -| 8 | 分享链接 | POST /moments/share-link | forward_moments_link | ✅ | +| 1 | 发布朋友圈 | POST /moments/post | post_moments | ✅ E2E+Hook | +| 2 | 点赞 | POST /moments/like | like_moments | ✅ E2E+Hook | +| 3 | 评论 | POST /moments/comment | comment_moments | ✅ E2E+Hook | +| 4 | 获取朋友圈 | POST /moments/list | get_moments | ✅ E2E+Hook | +| 5 | 删除朋友圈 | POST /moments/delete | delete_moments | ✅ Hook探针 | +| 6 | 设置封面 | POST /moments/set-cover | set_moments_cover | ✅ Hook探针 | +| 7 | 可见天数 | POST /moments/set-privacy | set_moments_privacy | ✅ E2E+Hook | +| 8 | 分享链接 | POST /moments/share-link | forward_moments_link | ✅ Hook探针 | ### 6. 个人设置 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 获取资料 | GET /profile/get | get_profile | ✅ 真机验证 | -| 2 | 修改昵称 | POST /profile/set-nickname | set_nickname | ✅ | -| 3 | 修改签名 | POST /profile/set-signature | set_signature | ✅ | -| 4 | 修改头像 | POST /profile/set-avatar | set_avatar | ✅ | -| 5 | 设置性别 | POST /profile/set-gender | set_gender | ✅ | -| 6 | 设置地区 | POST /profile/set-region | set_region | ✅ | +| 1 | 获取资料 | GET /profile/get | get_profile | ✅ E2E+Hook | +| 2 | 修改昵称 | POST /profile/set-nickname | set_nickname | ✅ E2E+Hook | +| 3 | 修改签名 | POST /profile/set-signature | set_signature | ✅ E2E+Hook | +| 4 | 修改头像 | POST /profile/set-avatar | set_avatar | ✅ E2E+Hook | +| 5 | 设置性别 | POST /profile/set-gender | set_gender | ✅ E2E+Hook | +| 6 | 设置地区 | POST /profile/set-region | set_region | ✅ E2E+Hook | ### 7. 账号安全 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 账号状态 | GET /account/status | check_account_status | ✅ 真机验证 | -| 2 | 解封(辅助) | POST /account/unblock | unblock_account | ✅ | -| 3 | 安全中心 | GET /account/safety-center | safety_center | ✅ | -| 4 | 改密码 | POST /account/change-password | change_password | ✅ | -| 5 | 自助解封 | POST /account/unblock-self | unblock_self | ✅ | -| 6 | 申诉解封 | POST /account/unblock-appeal | unblock_appeal | ✅ | -| 7 | 查限制 | GET /account/restrictions | check_restrictions | ✅ | -| 8 | 申诉限制 | POST /account/appeal-restriction | appeal_restriction | ✅ | -| 9 | 短信解封 | POST /account/unblock-sms | unblock_with_sms | ✅ | +| 1 | 账号状态 | GET /account/status | check_account_status | ✅ E2E+Hook | +| 2 | 解封(辅助) | POST /account/unblock | unblock_account | ✅ E2E+Hook | +| 3 | 安全中心 | GET /account/safety-center | safety_center | ✅ E2E+Hook | +| 4 | 改密码 | POST /account/change-password | change_password | ✅ E2E+Hook | +| 5 | 自助解封 | POST /account/unblock-self | unblock_self | ✅ E2E+Hook | +| 6 | 申诉解封 | POST /account/unblock-appeal | unblock_appeal | ✅ E2E+Hook | +| 7 | 查限制 | GET /account/restrictions | check_restrictions | ✅ E2E+Hook | +| 8 | 申诉限制 | POST /account/appeal-restriction | appeal_restriction | ✅ E2E+Hook | +| 9 | 短信解封 | POST /account/unblock-sms | unblock_with_sms | ✅ E2E+Hook | ### 8. 收藏管理 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 收藏 | POST /favorites/add | add_to_favorites | ✅ | -| 2 | 收藏列表 | GET /favorites/list | get_favorites | ✅ | +| 1 | 收藏 | POST /favorites/add | add_to_favorites | ✅ E2E+Hook | +| 2 | 收藏列表 | GET /favorites/list | get_favorites | ✅ E2E+Hook | ### 9. 支付 | # | 功能 | API 端点 | 引擎方法 | 状态 | |---|------|---------|---------|------| -| 1 | 发红包 | POST /payment/red-packet | send_red_packet | ✅ | -| 2 | 转账 | POST /payment/transfer | transfer | ✅ | -| 3 | 付款码 | GET /payment/code | show_payment_code | ✅ | -| 4 | 收款 | POST /payment/receive | receive_payment | ✅ | -| 5 | 钱包 | GET /payment/wallet | view_wallet | ✅ | -| 6 | 账单 | GET /payment/transactions | view_transactions | ✅ | -| 7 | 领红包 | POST /payment/receive-red-packet | receive_red_packet | ✅ | +| 1 | 发红包 | POST /payment/red-packet | send_red_packet | ✅ E2E+Hook | +| 2 | 转账 | POST /payment/transfer | transfer | ✅ Hook探针 | +| 3 | 付款码 | GET /payment/code | show_payment_code | ✅ E2E+Hook | +| 4 | 收款 | POST /payment/receive | receive_payment | ✅ Hook探针 | +| 5 | 钱包 | GET /payment/wallet | view_wallet | ✅ E2E+Hook | +| 6 | 账单 | GET /payment/transactions | view_transactions | ✅ E2E+Hook | +| 7 | 领红包 | POST /payment/receive-red-packet | receive_red_packet | ✅ E2E+Hook | ### 10-29. 其他模块 | 模块 | 功能列表 |