captcha_deal.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # import base64
  2. # import random
  3. # import time
  4. #
  5. # import requests
  6. # from DrissionPage import ChromiumPage, ChromiumOptions
  7. # from PIL import Image
  8. #
  9. # token = "zPzmt1mG1ouCU6GTzsZN2Lmm8pdZypapPcLJTBRETco"
  10. #
  11. # proxyUrl = "117.26.226.31:40030"
  12. # proxies = {
  13. # "http": "http://" + proxyUrl,
  14. # "https": "http://" + proxyUrl,
  15. # }
  16. #
  17. #
  18. # class CaptchaDeal(object):
  19. # def __int__(self,driver=None):
  20. # self.
  21. #
  22. # def get_page(self):
  23. # """解析验证码界面"""
  24. # self.page.get(
  25. # f'https://sh.fang.anjuke.com/xinfang/captchaxf-verify/?callback=shield&from=antispam&serialID=cf63d17fe46723260e58ad3ef8319a4a_ded9facd89c34826b15f349ca06a22f9&history=aHR0cDovL2NzLmZhbmcuYW5qdWtlLmNvbS9sb3VwYW4vYWxsL3AzLw%3D%3D')
  26. # self.page.wait.doc_loaded()
  27. # time.sleep(1.5)
  28. # self.page.ele("xpath://div[contains(@class,'geetest_content')]").click()
  29. # self.page.wait.doc_loaded()
  30. # time.sleep(3)
  31. # # 截图
  32. #
  33. # # 获取判断验证码元素
  34. # captcha_type = self.page.ele("xpath://div[@id='ISDCaptcha']//div[contains(@class,'geetest_submit_tips')]")
  35. #
  36. # # 滑块验证处理
  37. # print("为滑块验证码")
  38. # capt_ele = self.page.ele(
  39. # "xpath://div[@id='ISDCaptcha']//div[contains(@class,'geetest_box_wrap')]//div[@role='dialog']")
  40. # capt_ele.get_screenshot('./element_screenshot.png')
  41. #
  42. # distance = self.verify(2)
  43. # print(f"滑块距离:{distance}")
  44. #
  45. # slider_element = self.page.ele(
  46. # "xpath://div[contains(@class,'geetest_slider')]//div[contains(@class,'geetest_btn')]")
  47. # self.simulate_slider_drag(slider_element, float(distance))
  48. #
  49. # time.sleep(5)
  50. # print(self.page.url, self.page.title)
  51. #
  52. # def verify(self, type_num):
  53. # """调用云码平台服务"""
  54. # with open('element_screenshot.png', 'rb') as f:
  55. # b = base64.b64encode(f.read()).decode()
  56. #
  57. # url = "http://api.jfbym.com/api/YmServer/customApi"
  58. #
  59. # if type_num == 1:
  60. # # 坐标类型
  61. # data = {
  62. # "token": token,
  63. # "type": "30332",
  64. # "direction": "top",
  65. # "click_num": 3,
  66. # "image": b,
  67. # }
  68. # else:
  69. # # 滑块类型
  70. # data = {
  71. # "token": token,
  72. # "type": "22222",
  73. # "image": b,
  74. # }
  75. #
  76. # _headers = {
  77. # "Content-Type": "application/json"
  78. # }
  79. #
  80. # response = requests.request("POST", url, headers=_headers, json=data).json()
  81. # print(response)
  82. # return response["data"]["data"]
  83. #
  84. # def generate_human_track(self, distance):
  85. # """
  86. # 生成人类拖动的轨迹
  87. # :param distance: 需要拖动的距离(像素)
  88. # :return: 轨迹点列表,每个点包含(x偏移, y偏移, 延迟时间)
  89. # """
  90. # tracks = []
  91. # current = 0
  92. # mid = distance * 0.7 # 70%处开始减速
  93. # t = 0.2
  94. # v = 0
  95. # move_points = []
  96. #
  97. # # 第一阶段:加速
  98. # while current < mid:
  99. # a = random.uniform(2, 4)
  100. # v0 = v
  101. # v = v0 + a * t
  102. # move = v0 * t + 0.5 * a * t * t
  103. # current += move
  104. # move_points.append(move)
  105. #
  106. # # 第二阶段:减速
  107. # while current < distance:
  108. # a = -random.uniform(0.5, 1.5)
  109. # v0 = v
  110. # v = v0 + a * t
  111. # if v < 0.5: # 防止速度过小
  112. # v = 0.5
  113. # move = v0 * t + 0.5 * a * t * t
  114. # current += move
  115. # move_points.append(move)
  116. #
  117. # # 添加随机性并生成最终轨迹
  118. # total_points = len(move_points)
  119. # for i, move in enumerate(move_points):
  120. # x_offset = move
  121. #
  122. # # 添加垂直抖动(模拟手抖)
  123. # if i % random.randint(2, 4) == 0:
  124. # y_offset = random.randint(-2, 2)
  125. # else:
  126. # y_offset = 0
  127. #
  128. # # 时间间隔(模拟人类反应)
  129. # if i < total_points * 0.3: # 开始阶段较快
  130. # duration = random.uniform(0.01, 0.03)
  131. # elif i > total_points * 0.7: # 结束阶段较慢
  132. # duration = random.uniform(0.03, 0.08)
  133. # else: # 中间阶段
  134. # duration = random.uniform(0.02, 0.05)
  135. #
  136. # # 随机添加微小停顿
  137. # if random.random() < 0.05:
  138. # duration += random.uniform(0.05, 0.1)
  139. #
  140. # tracks.append((x_offset, y_offset, duration))
  141. #
  142. # # 最终微调:到达终点后轻微回拉
  143. # if random.random() < 0.7:
  144. # tracks.append((-random.randint(1, 3), 0, 0.05))
  145. #
  146. # return tracks
  147. #
  148. # def simulate_slider_drag(self, slider_element, target_distance):
  149. # """
  150. # 模拟人类拖动滑块
  151. # """
  152. # # 移动到滑块并按住
  153. # self.page.actions.move_to(slider_element).hold()
  154. # # 生成轨迹
  155. # tracks = self.generate_human_track(target_distance)
  156. # # 按轨迹拖动
  157. # for track in tracks:
  158. # offset_x, offset_y, duration = track
  159. # self.page.actions.move(offset_x, offset_y, duration=duration / 1000)
  160. # # 释放鼠标
  161. # self.page.actions.release()
  162. #
  163. #
  164. # if __name__ == '__main__':
  165. # captcga_deal = CaptchaDeal()
  166. # captcga_deal.run()