要解决滑块验证码,首选我们得梳理一下思路。首先我们要想到的就是怎么把滑块拉过去,这就涉及到拉动的距离问题,也就是要首先要解决滑块和缺口之间的距离的计算;然后就是解决模拟拉动的过程,要考虑怎么模拟才能绕过验证,从而获得验证通过。看到站内有些朋友使用加速度和减速度以及模拟鼠标抖动等一系列动作,或许有些网站确实可以通过验证,但是在我模拟浦发登陆时是没有用的。所以需要使用自定义的滑动曲线来设计滑动轨迹。
一般来说计算offset有两个方法:1. 通过背景图和带有缺口图之间比对像素来确定,但是这种由于背景底色的原因我们不能保证offset计算很准确。但是通过手动调整,我这里登陆浦发银行时准确率可以在75%以上。 2. 通过下载图片然后去训练,由于这方面我不擅长,故而这里只介绍一下第一种方法。
我们需要用到的库有:BytesIO、Image。
这里直接上代码,由于注释写的比较详细,不再做介绍。
import time
import random
from io import BytesIO
from PIL import Image
from selenium.webdriver.common.action_chains import ActionChains
from fund_transactions.sliding_track import drag_and_drop
class SliderVerification(object):
def __init__(self, driver):
self.driver = driver
def get_screenshot(self):
"""
获取屏幕截图
"""
screenshot = self.driver.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def update_style(self):
"""
修改图片的style属性,显示无缺口的图片
"""
# js = 'document.querySelectorAll("canvas")[3].style="display:block"'
# 这里使用js去缺口,获得背景图
js = 'document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].setAtt