264 lines
9.9 KiB
Python
264 lines
9.9 KiB
Python
#!/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()
|