网络编程
位置:首页>> 网络编程>> Python编程>> Python+selenium破解拼图验证码的脚本

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

作者:我去热饭  发布时间:2023-11-22 05:24:05 

标签: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破解拼图验证码的脚本

来源:https://juejin.cn/post/7060143197963419679

0
投稿

猜你喜欢

  • 1、什么是GIL全局解释器锁GIL:Global Interpreter Lock,意思就是全局解释器锁,这个GIL并不是Python的特性
  • Django1.8.2中文文档:Django1.8.2中文文档上传图片配置上传文件保存目录1)新建上传文件保存目录。2)配置上传文件保存目录
  • 我正在开发一个档案管理系统,需要从数据库中同时调出图像及相关的文字说明,可我只做到了单纯地显示图片,像有一个数据库CHUNFENG,在数据库
  • 从09年初接手淘宝手机网站前端开发的工作至今,转眼已是一年。一步步看着手机淘宝从最初的beta版本到今天的样子,感慨良多。手机网站开发,有着
  • 昨天用ucweb看到了goos发的一篇帖子:谁说Float菜单不可以水平居中,进去看了看,觉得方法有点繁琐了,用到了负边距,position
  • 通过变量ID得到变量的值已知获得变量的id用函数id(),那么它的反函数是什么?答案是:PyObj_FromPtr,据此,写了一个函数di(
  • 在SQL中,很多威力都来自于将几个表或查询中的信息联接起来,并将结果显示为单个逻辑记录集的能力。在这种联接中包括INNER、LEFT、RIG
  • 算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键。在计算机世界中,算法无处不在。数据库是存储数据和执行大批量计算的场所,在数据库中
  • <?php/*======================================事务处理==================
  • [前言]:搭往公司的班车,遇到其他部门的同事,他问了很多关于我的工作的问题,由此引发这篇文章。这些问题,我也经常被其他人问到,其中既有我们亲
  • Python 是由吉多·范罗苏姆(Guido Van Rossum)在 90 年代早期设计。 它是如今最常用的编程语言之一。它的语法简洁且优
  • 通过本文给大家介绍Python3控制路由器——使用requests重启极路由.py的相关知识,代码写了相应的注释,以后再写成可以方便调用的模
  • 在seclists中看到一个很惊人的thread:http://seclists.org/oss-sec/2012/q2/493MySQL爆
  • 在这篇文章中,我将展示如何在 CentOS/RHEL 7、Debian 以及它的衍生版本比如 Ubuntu(最新的 Ubuntu 16.04
  • 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型。列表中的每个元素都分配一个数字
  • 我一直都不喜欢在访问数据库时采用拼接SQL的方法,原因有以下几点: 1. 不安全:有被SQL注入的风险。 2. 可能会影响性能:每条SQL语
  • 大家好,我们的数据库已经介绍完了,这里给大家总结一下。我们这段主要是学习了SQL的增删改查语句,其中查询是我们的重点。我们是以SQL Ser
  • 本文的目的是探讨JS相关技术,并不是以杀毒为主要目的,杀毒只是为讲解一些JS做铺垫的,呵呵,文章有点长,倒杯咖啡或者清茶慢慢看,学习切勿急躁
  • 如何验证日期输入是否正确?我们可以利用ASP 3.0里的On Error Resume Next来完成这项功能:<%Option&nb
  • hmac主要应用在身份验证中,它的使用方法是这样的:1. 客户端发出登录请求(假设是浏览器的GET请求)2. 服务器返回一个随机值,并在会话
手机版 网络编程 asp之家 www.aspxhome.com