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

目录
  • 实现思路
  • 核心代码

实现思路

很多网站都有拼图验证码

1.首先要了解拼图验证码的生成原理

2.制定破解计划,考虑其可能性和成功率。

3.编写脚本

很多网站的拼图验证码都是直接借助第三方插件,也就是一类一种解法。

笔者遇到的这种拼图验证码实际上是多个小碎片经过重新组合成的一张整体,首先要在网站上抓取这种小碎片图片并下载到本地

我们先捋一捋大体思路:

获取所有碎片图片----找出他们的排列顺序逻辑-----找出他们中含有颜色深的真正位置的那个小碎块的序号-----根据每块碎片的宽度和上下和这个深色小块的序号算出距离----用selenium向右移动滑块到这个距离

核心代码

先导入必要的包:

# -*- coding:utf-8 -*-
import colorsys
import urllib,os,uuid,re,time
from PIL import Image
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver

抓到并下载到本地

def create(locapath,fileName):
  filePath=locapath+'/'+fileName
  if not os.path.exists(filePath):
    file=open(filePath,'a+')
    file.close()
    return filePath
def downloadImg():
  list = openBrowser()
  for i in range(2):
    fileName = str(i) + '_test.jpg'
    urllib.urlretrieve(list[i], create('/Users/zijiawang/Downloads/', fileName))  #下载到本地
  time.sleep(3)
def openBrowser():
  global wzj
  wzj =  webdriver.Firefox()
  wzj.get('https://。。。。')
  image1_url = wzj.find_elements_by_class_name('gt_cut_bg_slice')[0].get_attribute('style')
  image1_url=image1_url[23:-38]
  image2_url = wzj.find_elements_by_class_name('gt_cut_fullbg_slice')[0].get_attribute('style')
  image2_url=image2_url[23:-38]
  return [image1_url,image2_url]

分割并获取rgb颜色

ef getcolor(image):
  list = [[x,y] for x in range(26) for y in range(2)]
  listt = []
  colors = []
  for i in range(len(list)):
    l = list[i][0]*12+12
    w = list[i][1]*58+58
    listt.append([12*0.25+i/2*12, 58*0.25+((i+10)%2)*58])
    listt.append([12*0.25+i/2*12, 58*0.75+((i+10)%2)*58])
    listt.append([12*0.75+i/2*12, 58*0.25+((i+10)%2)*58])
    listt.append([12*0.75+i/2*12, 58*0.75+((i+10)%2)*58])
  for i in range(len(listt)):
    colors.append(image[listt[i][0],listt[i][1]])
  return colors

找出不同的小碎片序号

def getDeferent():
  deferent = []
  for i in range(208):
    if abs(color1[i][2] - color2[i][2]) >20:
      print u'B差值: ',color1[i][2]-color2[i][2]
      deferent.append(i)
      # print ([i,abs(color1[i][0] - color2[i][0]),abs(color1[i][1] - color2[i][1]),abs(color1[i][2] - color2[i][2])])
  return deferent
def getUPDOWN():
  deferent = getDeferent()
  xlist = []
  ylist = []
  for i in deferent:
    if (i / 4) % 2 == 0:
      xlist.append(i)
    else:
      ylist.append(i)
  uplist = []
  downlist = []
  for i in xlist:
    uplist.append(i / 4)
  for i in ylist:
    downlist.append(i / 4)
  for i in range(len(uplist)):
    uplist[i] /= 2
  for i in range(len(downlist)):
    downlist[i] /= 2
  func = lambda x, y: x if y in x else x + [y]
  up = reduce(func, [[], ] + uplist)
  func = lambda x, y: x if y in x else x + [y]
  down = reduce(func, [[], ] + downlist)
  return up,down

编写好排列方法,会用的

def bubble(l):
    for index in range(len(l) - 1, 0 , -1):
        for two_index in range(index):
            if l[two_index] > l[two_index + 1]:
                l[two_index], l[two_index + 1] = l[two_index + 1], l[two_index]
    return l

最后的进行解析,拼装源码

def end():
  orders = getUPDOWN()
  orderx = orders[0]
  ordery = orders[1]
  print 'x:',orderx
  print 'y:',ordery
  orderX = [145, 157, 277, 265, 169, 181, 253, 241, 97, 109, 301, 289, 73, 85, 37, 25, 1, 13, 133, 121, 49, 61, 229,
            217, 193, 205]
  orderY = [157, 145, 265, 277, 181, 169, 241, 253, 109, 97, 289, 301, 85, 73, 25, 37, 13, 1, 121, 133, 61, 49, 217,
            229, 205, 193]
  print u'X:',orderX
  print u'Y:',orderY
  for x in range(26):
    orderX[x] -= 1
    orderX[x] /= 12
  for y in range(26):
    orderY[y] -= 1
    orderY[y] /= 12
  endX = []
  endY = []
  for i in range(len(orderX)):
    for j in range(len(orderx)):
      if orderx[j] == orderX[i]:
        endX.append(i)
        break
  for i in range(len(orderY)):
    for j in range(len(ordery)):
      if ordery[j] == orderY[i]:
        endY.append(i)
        break
  print 'endx:',endX
  print 'endy:',endY
  os.remove('/Users/zijiawang/Downloads/0_test.jpg')
  os.remove('/Users/zijiawang/Downloads/1_test.jpg')
  all = []
  all = endX+endY
  # print 'all:',all
  #系统最多可实验5次
  func = lambda x, y: x if y in x else x + [y]
  all_old = reduce(func, [[], ] + all)
  # print 'all_old:',all_old
  all_end =bubble(all_old)
  print 'all_end:',all_end
  duandata = 1000
  for i in range(1,len(all_end)):
    if all_end[i]-1 in all_end:
      pass
    else:
      duandata = all_end[i]
      print u'断点为:',duandata
  guess =[]
  if duandata != 1000:
    if endX != [] and endY!=[]:
      print u'断点1'
      guess = [duandata,all_end[0]]
    elif endX ==[]:
      print u'断点2'
      guess = [duandata, endY[0]]
    elif endY == []:
      print u'断点3'
      guess = [duandata,  endX[0]]
  else:
      print u'无断点'
      guess = [ all_end[0]]
  end_guess =[]
  print u'猜测的点:',guess
  for i in guess:
    end_guess.append(i * 12 - 38)
    end_guess.append(i * 12 - 28)
    end_guess.append(i * 12 - 20)
    end_guess.append(i * 12 - 17)
    end_guess.append(i * 12 - 15)
  print  u'猜测的位移量: ',end_guess
  return end_guess

主函数

if __name__ == '__main__':
  downloadImg()
  color1 = getcolor(Image.open('/Users/zijiawang/Downloads/0_test.jpg').load())
  color2 = getcolor(Image.open('/Users/zijiawang/Downloads/1_test.jpg').load())
  guess = end()
  for i in guess:
    print i,wzj.title
    try:
      ele = wzj.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]')
    except:
      ele = wzj.find_element_by_xpath('//div[@class="gt_slider_knob gt_show moving"]')
    ActionChains(wzj).click_and_hold(ele).perform()
    ActionChains(wzj).move_to_element_with_offset(ele, 0,i).perform()

因每个网站的都大同小异,这里不写具体测试的网站了,以免对其造成压力。此算法属于高度定制的,应用其他网站需要改些参数,但是代码注释较小。需要注释,不明白的地方请留言哈。

以上就是Python+selenium破解拼图验证码的脚本的详细内容,更多关于Python selenium拼图验证码的资料请关注我们其它相关文章!

(0)

相关推荐

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

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

  • 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+Pytesseract实现图片验证码识别

    目录 一.selenium截取验证码 二.安装识别环境pytesseract+Tesseract-OCR 验证识别环境是否正常 三.处理验证码图片 图片处理识别 一.selenium截取验证码 import json from io import BytesIO import time from test.testBefore.testDriver import driver from test.util.test_pytesseract import recognize from PIL im

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

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

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

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

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

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

  • Python实现滑块拼图验证码详解

    目录 初级版滑块拼图验证码 补充知识点 高级版滑动拼图验证码 滑动拼图验证码可以算是滑块验证码的进阶版本,其验证机制相对复杂.本节将介绍两种滑动拼图验证码:初级版和高级版本. 初级版滑块拼图验证码 初级版滑动拼图验证码是在普通滑块验证码的基础上增加了随机的滑动距离,用户需要根据拼图的缺口位置来决定滑块的滑动位置. 如下左图所示为一个滑块拼图验证码的起始状态,注意此时还没有显示拼图和缺口.单击滑块后就会出现拼图和缺口,如下右图所示.之后会利用这一特性来找到拼图和缺口的位置. 下面开始编写代码.首先

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

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

  • 使用Python+selenium实现第一个自动化测试脚本

    最近在学web自动化,记录一下学习过程. 此处我选用python3.6+selenium3.0,均用最新版本,以适应未来需求. 环境:windows10,64位 一.安装python python官方下载地址:https://www.python.org/downloads/ 进入页面就有两个版本的下载选择,2.x版本和3.x版本,或者根据系统选择对应版本. 点击Windows,跳转到Windows版本页面: 点选Python3.6.0版本,进入3.6版本页面,拉到页面下方,找到files 选择

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

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

  • 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自动化测试之破解滑动验证码

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

随机推荐