#!/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()