# import base64 # import random # import time # # import requests # from DrissionPage import ChromiumPage, ChromiumOptions # from PIL import Image # # token = "zPzmt1mG1ouCU6GTzsZN2Lmm8pdZypapPcLJTBRETco" # # proxyUrl = "117.26.226.31:40030" # proxies = { # "http": "http://" + proxyUrl, # "https": "http://" + proxyUrl, # } # # # class CaptchaDeal(object): # def __int__(self,driver=None): # self. # # def get_page(self): # """解析验证码界面""" # self.page.get( # f'https://sh.fang.anjuke.com/xinfang/captchaxf-verify/?callback=shield&from=antispam&serialID=cf63d17fe46723260e58ad3ef8319a4a_ded9facd89c34826b15f349ca06a22f9&history=aHR0cDovL2NzLmZhbmcuYW5qdWtlLmNvbS9sb3VwYW4vYWxsL3AzLw%3D%3D') # self.page.wait.doc_loaded() # time.sleep(1.5) # self.page.ele("xpath://div[contains(@class,'geetest_content')]").click() # self.page.wait.doc_loaded() # time.sleep(3) # # 截图 # # # 获取判断验证码元素 # captcha_type = self.page.ele("xpath://div[@id='ISDCaptcha']//div[contains(@class,'geetest_submit_tips')]") # # # 滑块验证处理 # print("为滑块验证码") # capt_ele = self.page.ele( # "xpath://div[@id='ISDCaptcha']//div[contains(@class,'geetest_box_wrap')]//div[@role='dialog']") # capt_ele.get_screenshot('./element_screenshot.png') # # distance = self.verify(2) # print(f"滑块距离:{distance}") # # slider_element = self.page.ele( # "xpath://div[contains(@class,'geetest_slider')]//div[contains(@class,'geetest_btn')]") # self.simulate_slider_drag(slider_element, float(distance)) # # time.sleep(5) # print(self.page.url, self.page.title) # # def verify(self, type_num): # """调用云码平台服务""" # with open('element_screenshot.png', 'rb') as f: # b = base64.b64encode(f.read()).decode() # # url = "http://api.jfbym.com/api/YmServer/customApi" # # if type_num == 1: # # 坐标类型 # data = { # "token": token, # "type": "30332", # "direction": "top", # "click_num": 3, # "image": b, # } # else: # # 滑块类型 # data = { # "token": token, # "type": "22222", # "image": b, # } # # _headers = { # "Content-Type": "application/json" # } # # response = requests.request("POST", url, headers=_headers, json=data).json() # print(response) # return response["data"]["data"] # # def generate_human_track(self, distance): # """ # 生成人类拖动的轨迹 # :param distance: 需要拖动的距离(像素) # :return: 轨迹点列表,每个点包含(x偏移, y偏移, 延迟时间) # """ # tracks = [] # current = 0 # mid = distance * 0.7 # 70%处开始减速 # t = 0.2 # v = 0 # move_points = [] # # # 第一阶段:加速 # while current < mid: # a = random.uniform(2, 4) # v0 = v # v = v0 + a * t # move = v0 * t + 0.5 * a * t * t # current += move # move_points.append(move) # # # 第二阶段:减速 # while current < distance: # a = -random.uniform(0.5, 1.5) # v0 = v # v = v0 + a * t # if v < 0.5: # 防止速度过小 # v = 0.5 # move = v0 * t + 0.5 * a * t * t # current += move # move_points.append(move) # # # 添加随机性并生成最终轨迹 # total_points = len(move_points) # for i, move in enumerate(move_points): # x_offset = move # # # 添加垂直抖动(模拟手抖) # if i % random.randint(2, 4) == 0: # y_offset = random.randint(-2, 2) # else: # y_offset = 0 # # # 时间间隔(模拟人类反应) # if i < total_points * 0.3: # 开始阶段较快 # duration = random.uniform(0.01, 0.03) # elif i > total_points * 0.7: # 结束阶段较慢 # duration = random.uniform(0.03, 0.08) # else: # 中间阶段 # duration = random.uniform(0.02, 0.05) # # # 随机添加微小停顿 # if random.random() < 0.05: # duration += random.uniform(0.05, 0.1) # # tracks.append((x_offset, y_offset, duration)) # # # 最终微调:到达终点后轻微回拉 # if random.random() < 0.7: # tracks.append((-random.randint(1, 3), 0, 0.05)) # # return tracks # # def simulate_slider_drag(self, slider_element, target_distance): # """ # 模拟人类拖动滑块 # """ # # 移动到滑块并按住 # self.page.actions.move_to(slider_element).hold() # # 生成轨迹 # tracks = self.generate_human_track(target_distance) # # 按轨迹拖动 # for track in tracks: # offset_x, offset_y, duration = track # self.page.actions.move(offset_x, offset_y, duration=duration / 1000) # # 释放鼠标 # self.page.actions.release() # # # if __name__ == '__main__': # captcga_deal = CaptchaDeal() # captcga_deal.run()