当前位置:   article > 正文

selenium解决web页面缺口验证码滑动问题_selenium移动滑块到指定缺口

selenium移动滑块到指定缺口

 

话不多说,直接上图上代码:

  1. import base64
  2. import os
  3. from time import sleep
  4. import requests
  5. from selenium.webdriver import Chrome
  6. from selenium.webdriver.common.action_chains import ActionChains
  7. try:
  8. import cv2
  9. except:
  10. os.system("pip install opencv-python")
  11. import cv2
  12. """
  13. 破解思路为:
  14. 1、先获取到背景图片和缺口图片,我这里是一张网络图片和一张base64的图片,请自行根据图片来源选择保存方式;
  15. 2、得到图片后,用cv2库,进行图片比对,自动找出最合适的位置,无需手动调整;
  16. 3、得到比对后的坐标后,拿到x轴的坐标,就是需要滑动的距离;
  17. 4、开始执行鼠标操作,按住元素,移动距离。完事。
  18. 5、如果验证码还有加速度验证等机制,给我留言或者自行找资料。
  19. """
  20. b = Chrome()
  21. # -------------------------------------------------------
  22. # 打开的网址
  23. # 网址隐藏下,防止你们干坏事。
  24. url = "https://***********/register"
  25. # 验证码背景图名称
  26. code_background = "code_background.jpg"
  27. # 验证码缺口图名称
  28. code_gap = "code_gap.jpg"
  29. # -------------------------------------------------------
  30. b.implicitly_wait(20)
  31. b.get(url)
  32. def identify_gap(bg, tp):
  33. """ bg: 背景图片 tp: 缺口图片 out:输出图片 """
  34. # 读取背景图片和缺口图片
  35. bg_img = cv2.imread(bg) # 背景图片
  36. tp_img = cv2.imread(tp) # 缺口图片
  37. # 识别图片边缘
  38. bg_edge = cv2.Canny(bg_img, 100, 200)
  39. tp_edge = cv2.Canny(tp_img, 100, 200)
  40. # 转换图片格式
  41. bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
  42. tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
  43. # 缺口匹配
  44. res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
  45. # 寻找最优匹配
  46. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  47. # 左上角点的坐标
  48. tl = max_loc
  49. return tl[0]
  50. while 1:
  51. # 尝试删除历史图片
  52. try:
  53. os.remove(code_background)
  54. os.remove(code_gap)
  55. except:
  56. pass
  57. # 需要重新生成动作,否则会导致操作累计执行
  58. Action = ActionChains(b)
  59. while 1:
  60. try:
  61. sleep(0.2)
  62. # 下拉一下,方便滑动
  63. target = b.find_element_by_xpath('// a[text() = "《用户服务协议》"]')
  64. b.execute_script("arguments[0].scrollIntoView();", target)
  65. # 获取背景图url
  66. code_url = b.find_element_by_xpath('//div[@class="drag-section"]//img').get_attribute("src")
  67. # print(code_url)
  68. # 如果验证码没加载,则会获取到空的值,则跳过,再来一遍
  69. if len(code_url) > 5:
  70. # 保存图片
  71. img = requests.get(code_url)
  72. f = open(code_background, 'ab')
  73. f.write(img.content)
  74. f.close()
  75. # 保存缺口图片
  76. code2_base64 = b.find_element_by_xpath('//div[@class="drag-section"]/div/img[2]').get_attribute("src")
  77. with open(code_gap, 'wb') as f:
  78. # 图片数据前部是“data:image/png;base64,iVBORSGJKGJDK”,需要去掉前面非图片数据部分
  79. f.write(base64.b64decode(code2_base64[22:]))
  80. break
  81. except:
  82. pass
  83. # 开始计算缺口位置
  84. a = identify_gap(code_background, code_gap)
  85. print("缺口位置:", a)
  86. ele = b.find_element_by_xpath('//div[@class="drag-bar"]/div[2]')
  87. print("开始拖拽")
  88. Action.move_to_element(ele)
  89. # 拖拽位置+1是为了防止当识别出来的位置为0时,则不执行拖拽,则会卡在这里。亲测必须加上。
  90. Action.drag_and_drop_by_offset(ele, a+1, 0).perform()
  91. sleep(0.2)
  92. # 获取滑块在滑动后的位置,看下滑块有没有回去,没回去,则破解成功
  93. left = b.find_element_by_xpath('//div[@id="drag-btn"]').get_attribute('style')
  94. # print("---", left)
  95. # 判断下时候验证成功,你们断言可能不同,都是聪明人,自己修改下。
  96. if "not-allowed" in left:
  97. print("验证成功")
  98. break
  99. else:
  100. pass

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/411682
推荐阅读
相关标签
  

闽ICP备14008679号