滑动验证码自动化实现(1)

验证码分类

图1
验证码,主要是用于区分 人 与 机器人(robot)的行为而采取的防范自动化的产物,其类型可以分为 识别型行为类验证码
在这里插入图片描述

识别类验证码包括:若干个单一种类的字符,如大小写字母数字中文,有可能是以上一种以上的组合形式出现,为了增加识别的难度,往往采用变形字符、干扰线、点、模糊背景等策略,早期验证码的背景为单一的白色,且字符分布在一行,而现在的验证码图片中随机分布若干字符,字符颜色可能与背景图很接近,导致识别成功率较低。
在这里插入图片描述
如今的验证码往往采取多种类元素识别:即同时包括字符识别和图形识别,如上图所示的12306登录页面的验证码,其中字符变形且具有干扰线,采用传统的OCR识别技术已经不可能完成,只能通过机器学习或者人工打码平台实现识别。

滑动验证码1

在这里插入图片描述
下面说下行为验证码,主要包括 滑动型验证码(见上图)和点触验证码(见下图,其要求为依次点击图片中的文字 “背“、”磊”)。
在这里插入图片描述
对于点触验证码来说,点击操作仅仅是发送了字符坐标到服务器,则其自动化的关键在于识别(字符或圆点图形等),所以实现的方法也是机器学习或人工打码平台,也可以使用selenium操作浏览器实现。

而对于滑动验证码来说,主要分为两类:
(1)将包含缺口的图片还原完整;
(2)将滑块滑动到另一端。

从服务器对滑动行为的验证来看,滑动验证码才是真正的行为验证码,服务器往往结合前端JS脚本结合浏览器指纹判断滑动行为是人类还是机器人,所以实现其自动化必须用到浏览器(或者selenium、appium等),同时采取措施隐藏模拟浏览器的指纹,例如下面的python脚本可以隐藏selenium操控的chrome浏览器的指纹。

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=options)

滑动验证码自动化

通过上面的方法,隐藏了模拟浏览器的指纹,后面要做的就是通过模拟人的行为操作滑块了,本文主要说明 还原包含缺口的图片的方法,另一类滑动验证码下次再写文章分析说明。
先说下自动化实现过程:
(1)图片获取
需要的4张图片包括:完整图片,包含缺口的图片,缺口图片及背景图,(如下图)。
图片获取方法,可以参考我的文章:爬虫实践之非静态图片获取
在这里插入图片描述
下面解释下滑动原理,参照上图,自己画的简化图,大家凑合看吧。主要是把缺口填充,即通过滑动块,使缺口从位置1到达位置2,其中位置2的最左端距离图片最左端的距离是d3,起始位置1的最左端距离图片最左端的距离是d2,那么需要滑动的距离就是二者的插值 d1 = d3 - d2
其中 d3 通过对比 完整图片和包含缺口(目标位置)的图片来识别和计算距离;
d2 通过对比缺口图片及背景图来识别和计算距离,也就是一张与原图片尺寸一样的空白背景图以及包含缺口起始位置的空白背景图之间的位置差。

(2)距离计算
这部分主要是通过对比两张图片在相同位置的像素差实现,当像素差值大于自定义的阈值(例如Threshold=50)时,就认为找到了分界点。
代码如下:

def get_distance(image1, image2):
    threshold = Threshold
    for i in range(0, image1.size[0]):
        for j in range(0,image1.size[1]):
            pixel1 = image1.getpixel((i,j))
            pixel2 = image2.getpixel((i,j))
            res_R = abs(pixel1[0] - pixel2[0])
            res_G = abs(pixel1[1] - pixel2[1])
            res_B = abs(pixel1[2] - pixel2[2])
            if res_R > threshold and res_G > threshold and res_B > threshold:
                return i

(3)轨迹生成
目前,都是采用先加速、再减速的方法模拟人手拖动滑块的,代码如下:

def get_track(distance):
    v0 = 0
    t = 0.2
    tracks = []
    current = 0
    mid = distance * 4/5
    while current < distance:
        if current < mid:
            a = 2
        else:
            a = -3
        v = v0
        s = v*t+0.5*a*(t**2)
        current += s
        tracks.append(round(s))
        v0 = v+a*t
    jj=0
    for i in tracks:
        jj += i
    ext = distance - jj
    print(ext)
    if ext == 0:
        pass
    elif ext > 0:
        for i in range(ext):
            tracks.append(1)
    else:
        for i in range(-ext):
            tracks.append(-1)
    return tracks


其中函数的参数 distance 为计算得到的距离 d1。加速和减速的分界点 mid 为总距离的4/5,通过改变 t 或者 a 的值,可以调节滑动速度,如果滑块超过位置2(ext < 0),则需要后退,轨迹列表track需要添加负值距离,同理,滑块未达位置2时,需要继续滑动,轨迹列表track需要添加正值距离。

(4)滑块拖动
本文主要通过 selenium 实现滑块拖动,对于移动端,可能需要借助 appnium 或者网易的 airtest 软件实现,代码如下:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

def slides(url):
    driver = webdriver.Firefox()
    driver.get(url)
    img1 = get_image(driver, 'gt_cut_bg_slice')
    img2 = get_image(driver, 'gt_cut_fullbg_slice')
    cts = driver.find_element_by_class_name('gt_slice.gt_show').get_attribute('style')
    img3, img4 = get_pic(cts)
    l0 = get_distance(img1, img2)
    ll = get_distance(img3, img4)
    l = l0-ll
    track_list, ext = get_track(l)
    print('step 1')
    ActionChains(driver).click_and_hold(on_element = element).perform()
    print('step 2')
    for track in track_list:
        ActionChains(driver).move_by_offset(xoffset = track, yoffset = 0).perform()
        time.sleep(0.001)
    time.sleep(0.5)
    ActionChains(driver).release(on_element = element).perform()
    time.sleep(1)

由于各个网站的滑动验证码可能采用不同版本的极验验证码,其图片获取可能需要获取无序图片片段后,根据页面样式css文件重组为页面实际显示的图片,需要具体问题具体分析。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值