Files
workphone-sdk/verify_all_v7.py

264 lines
9.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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