feat: v7 full API - verify_all_v7.py
This commit is contained in:
263
verify_all_v7.py
Normal file
263
verify_all_v7.py
Normal 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()
|
||||
Reference in New Issue
Block a user