0


使用Selenium破解滑动验证码的原理及解决思路_selenium滑动验证码

:param driver: webdriver
:return: 返回验证码背景图片Image对象
“”"

webdriver.ActionChains(driver).move_to_element(slider).perform()
time.sleep(0.2)
img = driver.find_element_by_xpath(‘//*[@id=“captcha”]/div/div[1]/div[2]/div[1]/a[2]’)
if ‘show’ in img.get_attribute(‘class’):
res = img.screenshot_as_png
return Image.open(BytesIO(res))
else:
raise ValueError(‘获取验证码背景图片失败’)

有缺口图片:

def get_cut_image(driver):
“”"
点击滑动按钮获取有缺口图片
:param driver: webdriver
:return: 返回验证码有缺口图片的Image对象
“”"

slider = driver.find_element_by_xpath(‘//[@id=“captcha”]/div/div[3]/div[2]‘)
webdriver.ActionChains(driver).click_and_hold(slider).perform()
time.sleep(0.1)
img = driver.find_element_by_xpath(’//
[@id=“captcha”]/div/div[1]/div[2]/div[1]/a[1]’)
res = img.screenshot_as_png

cut_img = Image.open(BytesIO(res))
return Image.open(BytesIO(res))

计算移动距离

找出缺口位置,计算移动距离。算法有很多,大家可以自由发挥。这里我们讲一种最简单的方法。我们要算出的距离是滑块要滑动的距离。

通过比较没有缺口的图片,和这张有缺口的图片,找出滑块的位置和缺口的位置即可。

经过观察,发现滑块出现的位置固定在x轴的0-100像素范围内,所以循环比较两张图片的x轴0-100像素范围内的每一行像素点,直到找到第一行出现两个图片像素点颜色完全不同的点,即找到了滑块的最左边最上的第一个像素点。

但是在实际操作中发现,虽然肉眼看起来两张图片公共部分一模一样,但是程序处理后的像素的具体rgb值也是不相同的,所以需要设置一个阈值来判断,具体需要进行测试。

按照相同的思路,比较两张图片x轴100-end像素的部分,找到缺口的最左最上那个点。

用找到的缺口像素点的x坐标减去找到的滑块的点的x坐标得到近似移动距离。这种算法,经过测试准确率还不错,大家如果在实际工作过程中发现有问题,需要根据具体情况去设计不同算法。

代码如下:

def get_distance(full_image, cut_image):
full_pixies = full_image.load()
cut_pixies = cut_image.load()

w, h = full_image.size

full_image.save(‘full.png’)
cut_image.save(‘cut.png’)

先找最左边不同的点

left = []

for j in range(h):

for i in range(100):

if abs(full_pixies[i, j][0] - cut_pixies[i, j][0]) + abs(full_pixies[i, j][1] - cut_pixies[i, j][1]) + abs(
full_pixies[i, j][2] - cut_pixies[i, j][2]) > 150:
left.append((i, j))

if left:
break

再找最右边不同的点

right = []

for j in range(h):

for i in range(100, w):

if abs(fu

标签: selenium python java

本文转载自: https://blog.csdn.net/2401_84264583/article/details/137699122
版权归原作者 2401_84264583 所有, 如有侵权,请联系我们删除。

“使用Selenium破解滑动验证码的原理及解决思路_selenium滑动验证码”的评论:

还没有评论