From 10a2217baf287415fe4944f49bf883be7d45fd1a Mon Sep 17 00:00:00 2001 From: fnvtk Date: Mon, 18 May 2026 21:38:07 +0800 Subject: [PATCH] feat: v7 full API - verify_all_v7.py --- verify_all_v7.py | 263 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 verify_all_v7.py diff --git a/verify_all_v7.py b/verify_all_v7.py new file mode 100644 index 0000000000..4d8035e6ac --- /dev/null +++ b/verify_all_v7.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python3 +""" +工作手机 SDK v7 - 全量接口验证脚本 +验证所有接口,展示真实数据,截图证明 +""" + +import frida +import json +import time +import subprocess +import os + +PHONE_IP = '192.168.110.80' +PHONE_PORT = 5555 +WECHAT_PKG = 'com.tencent.mm' +JS_FILE = os.path.join(os.path.dirname(__file__), 'wechat_api_v7.js') + +results = {} +screenshots = [] + +def adb_screenshot(name): + """ADB截图""" + remote = f'/sdcard/verify_{name}.png' + local = f'/Users/karuo/Documents/开发/2、私域银行/工作手机/开发文档/6、测试/verify_{name}.png' + subprocess.run(['adb', '-s', f'{PHONE_IP}:{PHONE_PORT}', 'shell', f'screencap -p {remote}'], capture_output=True) + subprocess.run(['adb', '-s', f'{PHONE_IP}:{PHONE_PORT}', 'pull', remote, local], capture_output=True) + screenshots.append({'name': name, 'path': local}) + return local + +def main(): + print('='*60) + print('工作手机 SDK v7 - 全量接口验证') + print('='*60) + + # 连接Frida + print(f'\n[1] 连接 Frida ({PHONE_IP}:{PHONE_PORT})...') + device = frida.get_device_manager().add_remote_device(f'{PHONE_IP}:{PHONE_PORT}') + pid = device.get_process(WECHAT_PKG).pid + print(f' 微信 PID: {pid}') + session = device.attach(pid) + + with open(JS_FILE, 'r') as f: + js_code = f.read() + + script = session.create_script(js_code) + script.load() + time.sleep(1) + + exports = script.exports + + # 截图初始状态 + adb_screenshot('v7_start') + + print('\n[2] 系统接口测试...') + + # ping + r = exports.ping() + print(f' ping: {r}') + results['ping'] = r + + # 系统信息 + r = exports.get_system_info() + print(f' 系统信息: has_main_db={r.get("has_main_db")}, has_sns_db={r.get("has_sns_db")}, has_wallet_db={r.get("has_wallet_db")}, has_finder_db={r.get("has_finder_db")}') + results['system_info'] = r + + # DB路径 + r = exports.get_db_info() + print(f' DB路径:') + for k, v in r.items(): + if v: print(f' {k}: {v}') + results['db_info'] = r + + print('\n[3] 账号信息...') + r = exports.get_account_info() + print(f' 微信号: {r.get("wxid")}') + print(f' 昵称: {r.get("nickname")}') + print(f' 手机: {r.get("phone")}') + results['account'] = r + + print('\n[4] 联系人统计...') + r = exports.get_contact_stats() + print(f' 好友数: {r.get("friends")}') + print(f' 群组数: {r.get("groups")}') + print(f' 总消息: {r.get("messages")}') + print(f' 图片数: {r.get("images")}') + print(f' 视频数: {r.get("videos")}') + results['stats'] = r + + print('\n[5] 联系人列表(前5个)...') + r = exports.get_contacts(5, 0) + if r.get('rows'): + for c in r['rows'][:5]: + print(f' {c.get("nickName","?")} ({c.get("username","?")})') + results['contacts'] = r + + print('\n[6] 搜索联系人(搜索"游")...') + r = exports.search_contact('游') + print(f' 找到: {r.get("count")} 个') + if r.get('rows'): + for c in r['rows'][:3]: + print(f' {c.get("nickName","?")} ({c.get("username","?")})') + results['search'] = r + + print('\n[7] 最近消息(24小时)...') + r = exports.get_recent_messages(24) + print(f' 24小时消息: {r.get("count")} 条') + if r.get('rows'): + msg = r['rows'][0] + print(f' 最新: [{msg.get("talker")}] {str(msg.get("content",""))[:50]}') + results['recent_msgs'] = r + + print('\n[8] 发送消息到文件传输助手...') + content = f'工作手机SDK v7 真实测试 {time.strftime("%Y-%m-%d %H:%M:%S")}' + r = exports.send_message('filehelper', content) + print(f' 发送结果: success={r.get("success")}, msgId={r.get("msgId")}') + if r.get('verify') and r['verify'].get('rows'): + print(f' DB验证: ✅ 消息已写入 - "{r["verify"]["rows"][0].get("content","")[:40]}"') + results['send_msg'] = r + time.sleep(1) + adb_screenshot('v7_after_send_msg') + + print('\n[9] 会话列表(前5个)...') + r = exports.get_conversations(5) + if r.get('rows'): + for c in r['rows'][:5]: + print(f' [{c.get("username","?")}] {str(c.get("lastMsg",""))[:30]} (未读:{c.get("unReadCount",0)})') + results['conversations'] = r + + print('\n[10] 群组列表(前5个)...') + r = exports.get_groups(5) + if r.get('rows'): + for g in r['rows'][:5]: + print(f' {g.get("chatroomname","?")} (成员:{g.get("memberCount",0)}, 群主:{g.get("roomowner","?")})') + results['groups'] = r + + print('\n[11] 群组详情(第1个群)...') + if results['groups'].get('rows'): + gid = results['groups']['rows'][0].get('chatroomname') + r = exports.get_group_members(gid) + print(f' 群ID: {gid}') + print(f' 成员数: {r.get("count")}') + if r.get('members'): + print(f' 前3个成员: {r["members"][:3]}') + results['group_members'] = r + + r2 = exports.get_group_announcement(gid) + if r2.get('rows'): + ann = r2['rows'][0].get('announcement', '') + print(f' 群公告: {str(ann)[:50] if ann else "无"}') + + print('\n[12] 标签列表...') + r = exports.get_labels() + print(f' 标签数: {r.get("count")}') + print(f' 前10个标签ID: {r.get("label_ids", [])[:10]}') + results['labels'] = r + + print('\n[13] 朋友圈...') + r = exports.get_moment_count() + print(f' 朋友圈缓存数: {r.get("rows", [{}])[0].get("total", 0) if r.get("rows") else "N/A"}') + + r2 = exports.get_moments(5) + print(f' 最近朋友圈: {r2.get("count")} 条') + if r2.get('rows'): + for m in r2['rows'][:3]: + print(f' [{m.get("userName","?")}] {str(m.get("content",""))[:40]} (时间:{m.get("createTime")})') + results['moments'] = r2 + + print('\n[14] 发布朋友圈...') + moment_content = f'工作手机SDK v7 后端发布朋友圈 {time.strftime("%Y-%m-%d %H:%M:%S")} #SDK测试 #Frida控制' + r = exports.post_moment(moment_content) + print(f' 发布结果: success={r.get("success")}, snsId={r.get("snsId")}') + if r.get('verify') and r['verify'].get('rows'): + print(f' DB验证: ✅ 朋友圈已写入 - "{r["verify"]["rows"][0].get("content","")[:40]}"') + results['post_moment'] = r + time.sleep(1) + adb_screenshot('v7_after_post_moment') + + print('\n[15] 视频号...') + r = exports.get_finder_info() + print(f' 视频号DB: {"✅" if not r.get("error") else "❌ " + r.get("error","")}') + if r.get('tables') and r['tables'].get('rows'): + print(f' 视频号表: {[t["name"] for t in r["tables"]["rows"][:5]]}') + results['finder'] = r + + r2 = exports.get_finder_contacts() + print(f' 视频号联系人: {r2.get("count", 0)} 个') + results['finder_contacts'] = r2 + + r3 = exports.get_finder_media() + print(f' 视频号媒体缓存: {r3.get("count", 0)} 条') + results['finder_media'] = r3 + + print('\n[16] 收藏...') + r = exports.get_favorites(10) + print(f' 收藏数: {r.get("count", 0)}') + if r.get('rows'): + for fav in r['rows'][:3]: + print(f' 收藏: {str(fav)[:60]}') + results['favorites'] = r + + print('\n[17] 钱包/红包...') + r = exports.get_wallet_info() + print(f' 钱包DB: {"✅" if not r.get("error") else "❌ " + r.get("error","")}') + if r.get('tables') and r['tables'].get('rows'): + print(f' 钱包表: {[t["name"] for t in r["tables"]["rows"]]}') + results['wallet_info'] = r + + r2 = exports.get_wallet_ledger(5) + print(f' 钱包账单: {r2.get("count", 0)} 条') + if r2.get('rows'): + for ledger in r2['rows'][:3]: + print(f' 账单: 用户={ledger.get("tradeUser","?")}, 金额={ledger.get("tradeAmount","?")}, 类型={ledger.get("tradeType","?")}') + results['wallet_ledger'] = r2 + + r3 = exports.get_lucky_money(5) + print(f' 红包记录: {r3.get("count", 0)} 条') + results['lucky_money'] = r3 + + print('\n[18] 图片/视频/文件统计...') + r_img = exports.get_image_count() + r_vid = exports.get_video_count() + print(f' 图片总数: {r_img.get("rows", [{}])[0].get("total", 0) if r_img.get("rows") else "N/A"}') + print(f' 视频总数: {r_vid.get("rows", [{}])[0].get("total", 0) if r_vid.get("rows") else "N/A"}') + + r_files = exports.get_file_list(5) + print(f' 文件记录: {r_files.get("count", 0)} 条') + results['media_stats'] = {'images': r_img, 'videos': r_vid, 'files': r_files} + + print('\n[19] 群发消息测试(发给文件传输助手和自己)...') + r = exports.mass_message(['filehelper', 'wxid_5g37snchpv8e22'], f'群发测试 {time.strftime("%H:%M:%S")}') + print(f' 群发结果: 总数={r.get("total")}, 成功={r.get("success")}') + results['mass_msg'] = r + + print('\n[20] 全局搜索(搜索"游")...') + r = exports.global_search('游') + print(f' 联系人: {r.get("contacts", {}).get("count", 0)} 个') + print(f' 消息: {r.get("messages", {}).get("count", 0)} 条') + print(f' 群组: {r.get("groups", {}).get("count", 0)} 个') + results['global_search'] = r + + # 最终截图 + adb_screenshot('v7_final') + + # 保存结果 + result_file = '/Users/karuo/Documents/开发/2、私域银行/工作手机/verification_v7_results.json' + with open(result_file, 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2, default=str) + + print('\n' + '='*60) + print('验证完成!') + print(f'结果已保存: {result_file}') + print(f'截图: {len(screenshots)} 张') + for s in screenshots: + print(f' - {s["name"]}: {s["path"]}') + print('='*60) + + # 统计 + total = 20 + passed = sum(1 for k, v in results.items() if not (isinstance(v, dict) and v.get('error'))) + print(f'\n总计: {passed}/{total} 通过') + +if __name__ == '__main__': + main()