文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python+selenium怎么破解拼图验证码

2023-06-29 02:12

关注

这篇文章主要介绍“Python+selenium怎么破解拼图验证码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python+selenium怎么破解拼图验证码”文章能帮助大家解决问题。

实现思路

很多网站都有拼图验证码

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

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

编写脚本

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

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

我们先捋一捋大体思路:

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

核心代码

先导入必要的包:

# -*- coding:utf-8 -*-import colorsysimport urllib,os,uuid,re,timefrom PIL import Imagefrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriver

抓到并下载到本地

def create(locapath,fileName):  filePath=locapath+'/'+fileName  if not os.path.exists(filePath):    file=open(filePath,'a+')    file.close()    return filePathdef 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 deferentdef 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怎么破解拼图验证码”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯