test_capsolver.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import requests
  2. import time
  3. import json
  4. from urllib.parse import urlencode
  5. class CaptchaTester:
  6. def __init__(self, api_key):
  7. self.config = {
  8. 'capsolver_key': api_key
  9. }
  10. def _log(self, message):
  11. print(f"[{time.strftime('%H:%M:%S')}] {message}")
  12. def solve_captcha(self, page_url: str, task_type: str, site_key: str, action: str = None) -> str:
  13. """调用 Capsolver 获取 ReCaptcha V3 Token"""
  14. capsolver_key = self.config.get('capsolver_key')
  15. if not capsolver_key:
  16. raise ValueError("Capsolver API key missing")
  17. task = {
  18. "type": task_type,
  19. "websiteURL": page_url,
  20. "websiteKey": site_key,
  21. "pageAction": action
  22. }
  23. payload = {"clientKey": capsolver_key, "task": task}
  24. # 创建任务
  25. res = requests.post("https://api.capsolver.com/createTask", json=payload, timeout=20)
  26. resp_json = res.json()
  27. if resp_json.get("errorId") != 0:
  28. raise Exception(f"创建任务失败: {res.text}")
  29. task_id = resp_json.get("taskId")
  30. self._log(f"任务已创建: {task_id}. 正在等待高分 Token...")
  31. # 轮询结果
  32. for i in range(20):
  33. r = requests.post(
  34. "https://api.capsolver.com/getTaskResult",
  35. json={"clientKey": capsolver_key, "taskId": task_id},
  36. timeout=20
  37. )
  38. data = r.json()
  39. if data.get("status") == "ready":
  40. self._log("验证码解决成功!")
  41. return data["solution"].get("gRecaptchaResponse") or data["solution"].get("token")
  42. time.sleep(3)
  43. raise Exception("Capsolver 任务超时")
  44. def test_score(self):
  45. # 1. 目标网站配置 (基于你提供的 curl 信息)
  46. test_page = "https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php"
  47. # 这是该演示页面的公钥
  48. site_key = "6LdKlZEpAAAAAAOQjzC2v_d36tWxCl6dWsozdSy9"
  49. action = "examples/v3scores"
  50. try:
  51. # 2. 从 Capsolver 获取 Token
  52. token = self.solve_captcha(
  53. page_url=test_page,
  54. task_type="ReCaptchaV3TaskProxyLess",
  55. site_key=site_key,
  56. action=action
  57. )
  58. # 3. 构造 GET 请求 (按照你提供的 curl 格式)
  59. self._log("正在提交 Token 到谷歌演示服务器进行评分...")
  60. verify_base_url = "https://recaptcha-demo.appspot.com/recaptcha-v3-verify.php"
  61. params = {
  62. "action": action,
  63. "token": token
  64. }
  65. # 拼接成最终的 URL: verify.php?action=...&token=...
  66. full_verify_url = f"{verify_base_url}?{urlencode(params)}"
  67. headers = {
  68. 'accept': '*/*',
  69. 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
  70. 'referer': 'https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php',
  71. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
  72. 'sec-ch-ua-platform': '"macOS"'
  73. }
  74. # 发起 GET 请求
  75. response = requests.get(full_verify_url, headers=headers)
  76. if response.status_code == 200:
  77. result = response.json()
  78. print("\n" + "="*40)
  79. print("🚀 【谷歌官方 V3 评分结果】")
  80. print(f"状态: {'成功' if result.get('success') else '失败'}")
  81. print(f"分数 (Score): {result.get('score')}")
  82. print(f"动作 (Action): {result.get('action')}")
  83. if 'hostname' in result:
  84. print(f"域名 (Hostname): {result.get('hostname')}")
  85. print("="*40)
  86. if result.get('score', 0) < 0.7:
  87. print("⚠️ 警告: 分数过低,可能会被目标网站拦截。")
  88. else:
  89. print("✅ 分数理想,可以用于预约。")
  90. else:
  91. print(f"验证请求失败: {response.status_code}, {response.text}")
  92. except Exception as e:
  93. print(f"发生错误: {e}")
  94. # --- 运行测试 ---
  95. if __name__ == "__main__":
  96. # 请确保你的 API Key 正确
  97. MY_CAPSOLVER_KEY = "CAP-5441DD341DD3CC2FAEF0BE6FE493EE9A"
  98. tester = CaptchaTester(MY_CAPSOLVER_KEY)
  99. tester.test_score()