Files
hello_js_reverse_skill/tcaptcha/benchmark_verify.py
T

84 lines
3.1 KiB
Python

"""
腾讯天御点选验证码纯协议端到端实战压测基准脚本
连续发起 N 轮真实线上验证请求,统计:
1. 首检通过率 (Success Rate)
2. 端到端耗时分布 (Min / Mean / Max Latency)
3. 异常与失败分类
"""
import argparse
import sys
import time
from pathlib import Path
from typing import List
PROJECT_ROOT = Path(__file__).resolve().parent.parent
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
from tcaptcha.client import TencentCaptchaClient
from tcaptcha.solver import CaptchaSolver
def run_benchmark(rounds: int = 10, aid: str = "2039519451", interval: float = 3.0):
print("=" * 65)
print(f" 🚀 开始腾讯天御验证码纯协议线上压力基准测试 (AppID: {aid})")
print(f" 测试轮数: {rounds}, 请求间隔: {interval}s")
print("=" * 65)
# 预加载模型,避免把模型初始化耗时算入单次请求
print("[*] 正在预加载 YOLO 目标检测器与 ResNet18 分类器模型...")
solver = CaptchaSolver()
client = TencentCaptchaClient(aid=aid, solver=solver)
print("[*] 模型就绪,开始线上请求...\n")
results: List[dict] = []
latencies: List[float] = []
successes = 0
for i in range(1, rounds + 1):
print(f"--- [Round {i}/{rounds}] ---")
res = client.solve()
results.append(res)
latencies.append(res["elapsed_ms"])
if res["success"]:
successes += 1
print(f" ✅ 成功! 耗时: {res['elapsed_ms']}ms | randstr: {res['randstr']} | ticket: {res['ticket'][:24]}...")
else:
print(f" ❌ 失败! 耗时: {res['elapsed_ms']}ms | 原因: {res['error']}")
# 间隔停顿模拟真实请求,避免瞬间高频触发频控
if i < rounds and interval > 0:
time.sleep(interval)
# 汇总报表
success_rate = (successes / rounds) * 100
avg_latency = sum(latencies) / len(latencies) if latencies else 0
min_latency = min(latencies) if latencies else 0
max_latency = max(latencies) if latencies else 0
print("\n" + "=" * 65)
print(" 📊 纯协议实战基准测试统计汇总")
print("=" * 65)
print(f"总测试轮数: {rounds}")
print(f"成功次数: {successes}")
print(f"失败次数: {rounds - successes}")
print(f"综合首检通过率: {success_rate:.2f}%")
print(f"平均单次耗时: {avg_latency:.1f} ms")
print(f"最短单次耗时: {min_latency} ms")
print(f"最长单次耗时: {max_latency} ms")
print("=" * 65)
return success_rate, avg_latency
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Tencent Captcha Benchmark Tool")
parser.add_argument("--rounds", type=int, default=10, help="Number of test rounds (default: 10)")
parser.add_argument("--interval", type=float, default=3.0, help="Interval between rounds in seconds (default: 3.0)")
parser.add_argument("--aid", type=str, default="2039519451", help="AppID (default: 2039519451)")
args = parser.parse_args()
run_benchmark(rounds=args.rounds, aid=args.aid, interval=args.interval)