Python selenium 破解腾讯滑块举动验证码

打印 上一主题 下一主题

主题 1777|帖子 1777|积分 5331

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
直接上代码:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.action_chains import ActionChains
  3. import time,re,requests
  4. from selenium.webdriver.common.by import By
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. from selenium.webdriver.support import expected_conditions as EC
  7. from PIL import Image
  8. import os,cv2
  9. import sys
  10. path = os.path.dirname(os.path.dirname(__file__))
  11. sys.path.append(path)
  12. class main():
  13.     def __init__(self):
  14.         self.url = 'https://static-mp-dc3bab1b-06be-41ca-9070-ab7368c17ae5.next.bspapp.com/'
  15.         self.distance = 0
  16.         self.left = 0
  17.         self.track = []
  18.     # 启动浏览器
  19.     def Launch_browser(self):
  20.         options = webdriver.ChromeOptions()
  21.         options.add_argument('--headless')
  22.         # self.driver = webdriver.Chrome(options=options)
  23.         self.driver = webdriver.Chrome()
  24.         self.wait = WebDriverWait(self.driver, 10, 0.5)
  25.         self.driver.get(self.url)
  26.         self.driver.find_element(By.XPATH,'/html/body/button').click()
  27.         # 等待className为geetest_slider_button的元素在元素表中出现
  28.         time.sleep(5)
  29.         element = WebDriverWait(self.driver, 10).until(
  30.             EC.visibility_of_element_located((By.CLASS_NAME, 'tcaptcha-transform'))
  31.         )
  32.         time.sleep(5)
  33.         # 切换到iframe
  34.         # 假设iframe有id或者其他属性,可以通过这些属性定位
  35.         self.iframe = self.driver.find_element(By.ID,'tcaptcha_iframe_dy')
  36.         self.driver.switch_to.frame(self.iframe)
  37.         self.slider = self.driver.find_element(By.XPATH, '/html/body/div/div[3]/div[2]/div[7]')
  38.         self.sliderImg = self.driver.find_element(By.XPATH, '/html/body/div/div[3]/div[2]/div[1]/div[2]/div')
  39.         sliderImg_background_image_url = self.sliderImg.value_of_css_property('background-image')
  40.         sliderImg_background_image_url = sliderImg_background_image_url[5:len(sliderImg_background_image_url) - 3]
  41.         resp = requests.get(sliderImg_background_image_url)
  42.         with open('./sliderImg.png', 'wb') as f:
  43.             f.write(resp.content)
  44.         slider_background_image_url = self.slider.value_of_css_property('background-image')
  45.         slider_background_image_url = slider_background_image_url[5:len(slider_background_image_url) - 3]
  46.         resp = requests.get(slider_background_image_url)
  47.         with open('./slider.png', 'wb') as f:
  48.             f.write(resp.content)
  49.         # 150,270
  50.         # 500,600
  51.         image = Image.open('./slider.png')
  52.         bg = image.crop([130, 479, 272, 622])
  53.         bg.save('slider.png')
  54.         import ddddocr
  55.         det = ddddocr.DdddOcr(det=False, ocr=True, show_ad=False)
  56.         with open('slider.png', 'rb') as f:
  57.             target_bytes = f.read()
  58.         with open('sliderImg.png', 'rb') as f:
  59.             background_bytes = f.read()
  60.         res = det.slide_match(target_bytes, background_bytes, simple_target=True)
  61.         print(res)
  62.         self.distance = res['target'][0]
  63.         self.left = self.slider.value_of_css_property('left').split('px')[0]
  64.         self.left = eval(self.left)
  65.         xoffset = int(self.distance * 0.51)
  66.         print(xoffset)
  67.         verify_img = cv2.imread('sliderImg.png')
  68.         # 调用函数,得到x坐标
  69.         x = get_pos(verify_img)
  70.         x = int(x * 0.51) - 30
  71.         # 实现拖拽滑动
  72.         ActionChains(self.driver).click_and_hold(self.slider).perform()
  73.         ActionChains(self.driver).move_by_offset(x, 0).perform()
  74.         ActionChains(self.driver).release().perform()
  75.         self.quit()
  76.     # 关闭浏览器
  77.     def quit(self):
  78.         time.sleep(10)
  79.         self.driver.quit()
  80.     # main方法
  81.     def main(self):
  82.         self.Launch_browser()
  83.         # self.cjy()
  84.         # self.move()
  85.         # self.quit()
  86. # 定义一个处理图片缺口的函数,最后是返回x坐标,滑块移动不需要y坐标
  87. def get_pos(image):
  88.     # 首先使用高斯模糊去噪,噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉
  89.     blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)
  90.     # 边缘检测,得到图片轮廓
  91.     canny = cv2.Canny(blurred, 200, 400)  # 200为最小阈值,400为最大阈值,可以修改阈值达到不同的效果
  92.     # 轮廓检测
  93.     # cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,此处canny已经是二值图
  94.     # contours:所有的轮廓像素坐标数组,hierarchy 轮廓之间的层次关系
  95.     contours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  96.     # print(contours, hierarchy)
  97.     for i, contour in enumerate(contours):  # 对所有轮廓进行遍历
  98.         M = cv2.moments(contour)  # 并计算每一个轮廓的力矩(Moment),就可以得出物体的质心位置
  99.         # print(M)
  100.         if M['m00'] == 0:
  101.             cx = cy = 0
  102.         else:
  103.             # 得到质心位置,打印这个轮廓的面积和周长,用于过滤
  104.             cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
  105.             print(cv2.contourArea(contour), cv2.arcLength(contour, True))
  106.         # 判断这个轮廓是否在这个面积和周长的范围内
  107.         if 5000 < cv2.contourArea(contour) < 8000 and 300 < cv2.arcLength(contour, True) < 500:
  108.             print(cx)
  109.             if cx < 300:
  110.                 continue
  111.             print(cv2.contourArea(contour))
  112.             print(cv2.arcLength(contour, True))
  113.             # 外接矩形,x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
  114.             x, y, w, h = cv2.boundingRect(contour)
  115.             cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 画出矩行
  116.             # cv2.imshow('image', image)
  117.             cv2.imwrite('111.jpg', image)  # 保存
  118.             return x
  119.     return 0
  120. if __name__ == '__main__':
  121.     ma = main()
  122.     ma.main()
复制代码
结果展示:

 
Tip:用的是腾讯提供的web端接入示例

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表