geeked.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from uuid import uuid4
  2. from curl_cffi import requests
  3. import random, time, json
  4. from geeked.sign import Signer
  5. class Geeked:
  6. def __init__(self, captcha_id: str, risk_type: str, **kwargs):
  7. self.pass_token = None
  8. self.lot_number = None
  9. self.captcha_id = captcha_id
  10. self.challenge = str(uuid4())
  11. self.risk_type = risk_type
  12. self.callback = Geeked.random()
  13. self.session = requests.Session(impersonate="chrome124", verify=False, **kwargs)
  14. self.session.headers = {
  15. "connection": "keep-alive",
  16. "sec-ch-ua-platform": "\"Windows\"",
  17. "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
  18. "sec-ch-ua-mobile": "?0",
  19. "accept": "*/*",
  20. "sec-fetch-site": "same-origin",
  21. "sec-fetch-mode": "no-cors",
  22. "sec-fetch-dest": "script",
  23. "accept-encoding": "gzip, deflate, br, zstd",
  24. "accept-language": "en-US,en;q=0.9"
  25. }
  26. self.session.base_url = "https://gcaptcha4.geevisit.com"
  27. @staticmethod
  28. def random() -> str:
  29. return f"geetest_{int(random.random() * 10000) + int(time.time() * 1000)}"
  30. def format_response(self, response: str) -> dict:
  31. # print(json.loads(response.split(f"{self.callback}(")[1][:-1]))
  32. return json.loads(response.split(f"{self.callback}(")[1][:-1])["data"]
  33. def load_captcha(self):
  34. params = {
  35. "captcha_id": self.captcha_id,
  36. "challenge": self.challenge,
  37. "client_type": "web",
  38. "risk_type": self.risk_type,
  39. "lang": "eng",
  40. "callback": self.callback,
  41. }
  42. res = self.session.get("/load", params=params)
  43. return self.format_response(res.text)
  44. def submit_captcha(self, data: dict) -> dict:
  45. self.callback = Geeked.random()
  46. params = {
  47. "callback": self.callback,
  48. "captcha_id": self.captcha_id,
  49. "client_type": "web",
  50. "lot_number": self.lot_number,
  51. "risk_type": self.risk_type,
  52. "payload": data["payload"],
  53. "process_token": data["process_token"],
  54. "payload_protocol": "1",
  55. "pt": "1",
  56. "w": Signer.generate_w(data, self.captcha_id, self.risk_type),
  57. }
  58. res = self.session.get("/verify", params=params).text
  59. res = self.format_response(res)
  60. if res.get("seccode") is None:
  61. raise Exception(f"Failed to submit captcha: {res}")
  62. return res["seccode"]
  63. def solve(self) -> dict:
  64. data = self.load_captcha()
  65. self.lot_number = data["lot_number"]
  66. seccode = self.submit_captcha(data)
  67. return seccode