Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)

一、滑块验证码简述

有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通过 CAPTCHA 测试,该用户就可以被认为是人类。由此也可知道破解滑块验证码的关键即是让计算机更好的模拟人的行为,这也是破解的难点所在。

二、环境配置

1.安装

selenium 支持 python2.7 以及 python3.5 等主流 python 版本,其安装较为简单,有网的环境下,打开cmd输入即可自动安装:

pip install selenium

2.webdriver

selenium 安装完成后,下载所选浏览器的 webdriver,本文以 ChromeDriver为例,下载解压后切记将.exe文件放入对应Python应用程序的同级目录下,以确保将 webdriver 的路径添加至系统 PATH 变量中。同时还需将.exe文件放入Chrome应用程序的同级目录下,注意下载的ChromeDriver版本需与Chrome浏览器版本对应才可使用。ChromeDriver下载地址

3.相关库与模板

#图像处理标准库
from PIL import Image
#web测试
from selenium import webdriver
#鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
#等待时间 产生随机数
import time,random

三、破解步骤

本文以春秋官网为例:

  • 保存滑块验证码原图到本地。
  • 利用selenium进入滑块验证码页面,截取所需页面图片。
  • 通过图片像素对比分析获取缺口位置与滑块移动距离。
  • 机器模拟人工滑动轨迹。

四、代码实现

首先通过selenium对网页元素爬取进入滑块验证码页面

#打开页面至屏幕最大尺寸
driver = webdriver.Chrome()
driver.get('https://account.ch.com/NonRegistrations-Regist')
driver.maximize_window()
#获取输入手机号码的表单
input1 = driver.find_element_by_name('phoneNumberInput')
# 输入注册号码
input1.send_keys(phoneNumber)
time.sleep(0.2)
#获取打开滑块验证码页面的元素
getcheck=driver.find_element_by_id('getDynamicPwd')
#点击进入滑块验证码页面
getcheck.click()

上周国内最大的验证码平台极验(GEETEST)进行了滑块验证码更新,向反爬虫又迈进了一步,新浪、斗鱼等使用极验验证码的各大网站页也随之更新,当然春秋也不例外,此次更新显然是针对了破解滑块验证码的关键痛点,在此之前点击获取验证码,出现滑块验证码界面之后并不会直接出现滑块,此时可对屏幕进行截图,当点击滑动圆球之后才会出现滑块与缺口,此时再次进行截图,即可根据两次截图的像素RGB值逐一遍历,找到缺口位置。但更新之后点击获取验证码,直接会出现滑块与缺口,如图1所见。问题来了,现在没有原图作为参照,怎么找到缺口位置呢???仔细一想,其实这个问题并不难,无非就是需要一张原图作为参照,经过观察发现每个网站的验证码背景图片不过区区几张,那么我们可以考虑通过人工滑动滑块,在成功拼图后出现完整原图的那一瞬间进行屏幕截图,将原图逐一截图保存至本地,再通过缺口图片与本地保存的原图进行像素RGB值匹配,原图岂不速速现出原形,缺口图圆球需滑至最右再进行截图,下文详细解释。

# 获取拖拽的圆球
slideblock = driver.find_element_by_class_name('geetest_slider_button')
# 鼠标点击圆球不松开
ActionChains(driver).click_and_hold(slideblock).perform()
# 将圆球滑至相对起点位置的最右边
ActionChains(driver).move_by_offset(xoffset=250, yoffset=0).perform()
time.sleep(0.4)
# 保存包含滑块及缺口的页面截图
driver.save_screenshot('D:\quekou.png')
# 放开圆球
ActionChains(driver).release(slideblock).perform()
#打开保存至本地的缺口页面截图
quekouimg=Image.open('d://quekou.png')
# 匹配本地对应原图
sourceimg=match_source(quekouimg)
def match_source(image):
  imagea=Image.open('d://source1.png')
  imageb=Image.open('d://source2.png')
  imagec=Image.open('d://source3.png')
  imaged=Image.open('d://source4.png')
  list=[imagea,imageb,imagec,imaged]
  #通过像素差遍历匹配本地原图
  for i in list:
    #本人电脑原图与缺口图对应滑块图片横坐标相同,纵坐标原图比缺口图大88px,可根据实际情况修改
    pixel1=image.getpixel((868,340))
    pixel2=i.getpixel((868,428))
    #pixel[0]代表R值,pixel[1]代表G值,pixel[2]代表B值
    if abs(pixel1[0]-pixel2[0])<5:
      return i
  return image

为了更快捷获取滑块移动距离,我们可以考虑将滑块先滑至最右端再进行截图,因为采用从左往右对比遍历的方式,采用这种方式能保证第一次获取到的便是缺口位置,由于滑块起点相同,此种方法可减少计算滑块大小这一步(毕竟滑块大小计算也是通过像素遍历,没必要再计算一次)。

# 获取缺口位置
visualstack=get_diff_location(sourceimg,quekouimg)
# 获取移动距离loc,827为滑块起点位置
loc=visualstack-827
# 计算滑块位移距离
def get_diff_location(image1,image2):
  #(825,1082)(335,463)为滑块图片区域,可根据实际情况修改
  for i in range(825,1082):
    for j in range(335,463):
      #遍历原图与缺口图像素值寻找缺口位置
      if is_similar(image1,image2,i,j)==False:
        return i
  return -1
# 对比RGB值得到缺口位置
def is_similar(image1,image2,x,y):
  pixel1=image1.getpixel((x, y+88))
  pixel2=image2.getpixel((x, y))
  # 截图像素也许存在误差,50作为容差范围
  if abs(pixel1[0]-pixel2[0])>=50 and abs(pixel1[1]-pixel2[1])>=50 and abs(pixel1[2]-pixel2[2])>=50:
    return False
  return True

接下来,破解滑块验证码最关键也最难的一步来了,机器模拟人工滑动轨迹,或许你可以精准滑动到缺口位置,但还是会被识别为机器被怪物吃掉拼图,本人在测试的时候也是一把辛酸泪,最后经过不断调试学习,得到一种通过率还OK的滑动轨迹算法,即采用物理加速度位移相关公式按照先快后慢的人工滑动规律进行轨迹计算,同时还采用了模拟人滑动超过了缺口位置再滑回至缺口的情况以使轨迹更契合人工滑动轨迹。由于项目时间有限,本人就没花过多时间研究了,如果想要99%通过率可以尝试机器学习,采集人工滑动轨迹进行曲线拟合的方法获取轨迹。

#滑块移动轨迹
def get_track(self,distance):
  track=[]
  current=0
  mid=distance*3/4
  t=random.randint(2,3)/10
  v=0
  while current<distance:
     if current<mid:
       a=2
     else:
       a=-3
     v0=v
     v=v0+a*t
     move=v0*t+1/2*a*t*t
     current+=move
     track.append(round(move))
  return track
# 生成拖拽移动轨迹,加3是为了模拟滑过缺口位置后返回缺口的情况
track_list=get_track(loc+3)
time.sleep(2)
ActionChains(driver).click_and_hold(slideblock).perform()
time.sleep(0.2)
# 根据轨迹拖拽圆球
for track in track_list:
  ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()
# 模拟人工滑动超过缺口位置返回至缺口的情况,数据来源于人工滑动轨迹,同时还加入了随机数,都是为了更贴近人工滑动轨迹
imitate=ActionChains(driver).move_by_offset(xoffset=-1, yoffset=0)
time.sleep(0.015)
imitate.perform()
time.sleep(random.randint(6,10)/10)
imitate.perform()
time.sleep(0.04)
imitate.perform()
time.sleep(0.012)
imitate.perform()
time.sleep(0.019)
imitate.perform()
time.sleep(0.033)
ActionChains(driver).move_by_offset(xoffset=1, yoffset=0).perform()
# 放开圆球
ActionChains(driver).pause(random.randint(6,14)/10).release(slideblock).perform()
time.sleep(2)
#务必记得加入quit()或close()结束进程,不断测试电脑只会卡卡西
driver.close()

至此,小白破解滑块验证码就算基本了结,整个步骤看起来挺简单的,但其中的坑大概只有实践才会知道,出BUG之后第一件事请认真检查你的代码,不要放过任何一个地方,参数、范围、返回值、取值等等,甚至可能是你最觉得没问题的地方,往往是问题所在……over

到此这篇关于Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)的文章就介绍到这了,更多相关Python Selenium破解滑块验证码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)

    从最简单的Web浏览器的登录界面开始,登录界面如下: 进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver就是利用元素的这些属性来进行定位的. 可以用于定位的常用的元素属性: id name class name tag name link text partial link text xp

  • Python +Selenium解决图片验证码登录或注册问题(推荐)

    1. 解决思路 首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载. 解决方案:截图然后根据该图片的定位和长高,使用工具进行裁剪 裁剪完毕之后,使用工具解析该图片. 2. 代码实现 2.1 裁剪出验证码图片 裁剪图片需要使用 Pillow 库,进入pip包路径后输入安装命令pip install Pillow: 之前安装的时候忘记了截图,只能够截一张安装后的图片了 ╰(:з╰∠)_ 安装完成后,代码实现方式如下: #coding=utf-8 from selen

  • Python Selenium Cookie 绕过验证码实现登录示例代码

    之前介绍过通过cookie 绕过验证码实现登录的方法.这里并不多余,会增加分析和另外一种方法实现登录. 1.思路介绍  1.1.直接看代码,内有详细注释说明 # FileName : Wm_Cookie_Login.py # Author : Adil # DateTime : 2018/3/20 19:47 # SoftWare : PyCharm from selenium import webdriver import time url = 'https://system.address'

  • Python使用selenium实现网页用户名 密码 验证码自动登录功能

    好久没有学python了,反正各种理由吧(懒惰总会有千千万万的理由),最近网上学习了一下selenium,实现了一个简单的自动登录网页,具体如下. 1.安装selenium: 如果你已经安装好anaconda3,直接在windows的dos窗口输入命令安装selenium: python -m pip install --upgrade pip 查看版本pip show selenium 2.接着去http://chromedriver.storage.googleapis.com/index.

  • Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能

    测试结果: 整个买票流程可以再快一点,不过为了稳定起见,有些地方等待了一些时间 完整程序,拿去可用 整个程序分了三个模块:购票模块(主体).验证码识别模块.余票查询模块 购票模块: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.commo

  • 基于opencv的selenium滑动验证码的实现

    基于selenium进行动作链 由于最近很多人聊到滑动验证码怎么处理,所以决定自己动手试一下. 做一个东西前.我们首先要对这个东西的操作过程有一个大概的了解. 打开验证码页面. 鼠标放到拖动按钮上 对拖动按钮进行拖动 拖动到阴影快重合的位置. 放开拖动按钮. from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains artice = browser.find_el

  • selenium+Chrome滑动验证码破解二(某某网站)

    具体详情见代码,研究网站,随便输入手机号点击获取验证码 在自己写代码前参考了一批博客,是把所有验证码图片截取所有验证码图片保存在本地,再对比,感觉方法不行,所以自己写了个破解方法,通过js修改css直接抓取完整图片,因为上一篇写了B站,这里就不一一分析了,直接上代码: 破解成功界面 完整代码: # -*- coding:utf-8 -*- ''' 研究网站: https://account.ch.com/NonRegistrations-Regist 滑块验证码也分两种: 1.直接给缺口图片,先

  • Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框

    1.随机生成格式正确手机号码 # 随机产生格式正确的手机号码 def create_phone(self): num_start = ['134', '135', '136', '137', '138', '139', '150', '151', '152', '158', '159', '157', '182', '187', '188', '147', '130', '131', '132', '155', '156', '185', '186', '133', '153', '180',

  • python+selenium识别验证码并登录的示例代码

    由于工作需要,登录网站需要用到验证码.最初是研究过验证码识别的,但是总是不能获取到我需要的那个验证码.直到这周五,才想起这事来,昨天顺利的解决了. 下面正题: python版本:3.4.3 所需要的代码库:PIL,selenium,tesseract 先上代码: #coding:utf-8 import subprocess from PIL import Image from PIL import ImageOps from selenium import webdriver import t

  • Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)

    一.滑块验证码简述 有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展.而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术.其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通

  • Python+selenium破解拼图验证码的脚本

    目录 实现思路 核心代码 实现思路 很多网站都有拼图验证码 1.首先要了解拼图验证码的生成原理 2.制定破解计划,考虑其可能性和成功率. 3.编写脚本 很多网站的拼图验证码都是直接借助第三方插件,也就是一类一种解法. 笔者遇到的这种拼图验证码实际上是多个小碎片经过重新组合成的一张整体,首先要在网站上抓取这种小碎片图片并下载到本地 我们先捋一捋大体思路: 获取所有碎片图片----找出他们的排列顺序逻辑-----找出他们中含有颜色深的真正位置的那个小碎块的序号-----根据每块碎片的宽度和上下和这个

  • 利用Python+Selenium破解春秋航空网滑块验证码的实战过程

    目录 前言 开发工具 环境搭建 实战记录 一. 验证码简介 二.破解滑块验证码 2.1 计算滑块到缺口的距离 2.2 将滑块拖到缺口位置 前言 记录一次利用Python+Selenium破解滑块验证码的实战过程. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pillow模块: selenium模块: numpy模块: 以及一些Python自带的模块. 其他: chromedriver 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 实战

  • 用Python爬虫破解滑动验证码的案例解析

    做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈. 今天分享个如何简单处理滑动图片的验证码的案例. 类似这种拖动滑块移动到图片中缺口位置与之重合的登录验证在很多网站或者APP都比较常见,因为它对真实用户体验友好,容易识别.同时也能拦截掉大部分初级爬虫. 作为一只python爬虫,如何正确地自动完成这个验证过程呢? 先来分析下,核心问题其实是要怎么样找到目标缺口的位置,一旦知道了位置,我们就可以借用selenium

  • OpenCV结合selenium实现滑块验证码

    本次案例使用OpenCV和selenium来解决一下滑块验证码 先说一下思路: 弹出滑块验证码后使用selenium元素截图将验证码整个背景图截取出来 将需要滑动的小图单独截取出来,最好将小图与背景图顶部的像素距离获取到,这样可以将背景图上下多余的边框截取掉 使用OpenCV将背景图和小图进行灰度处理,并对小图再次进行二值化全局阈值,这样就可以利用OpenCV在背景图中找到小图所在的位置 用OpenCV获取到相差的距离后利用selenium的鼠标拖动方法进行拖拉至终点. 详细步骤: 先获取验证码

  • 基于python实现破解滑动验证码过程解析

    前言: 很多小伙伴们反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 今天我们主要来聊聊滑动验证码如何去识别破解. 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤:

  • python滑块验证码的破解实现

    破解滑块验证码的思路主要有2种: 获得一张完整的背景图和一张有缺口的图片,两张图片进行像素上的一一对比,找出不一样的坐标. 获得一张有缺口的图片和需要验证的小图,两张图片进行二极化以及归一化,确定小图在图片中间的坐标. 之后就要使用初中物理知识了,使用直线加速度模仿人手动操作 本次就使用第2种,第一种比较简单.废话不多说,直接上代码: 以下均利用无头浏览器进行获取 获得滑块验证的小图片 def get_image1(self,driver): """ 获取滑块验证缺口小图片

  • python自动化测试之破解滑动验证码

    在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤: 1.获取滑块滑动的距离 2.模拟拖动滑块,通过验证. 关于这种滑动的验证码,滑块和缺口背景都是分别是

随机推荐