feat: v7 full API - verify_all_v7.py

This commit is contained in:
2026-05-18 21:38:07 +08:00
parent ca22160000
commit 10a2217baf

263
verify_all_v7.py Normal file
View File

@@ -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()