| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- # 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()
|