""" 腾讯天御点选验证码纯协议端到端实战压测基准脚本 连续发起 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)