转:https://www.cnblogs.com/shiluoliming/p/7611569.html

Kernel_wu
快速学习的实践者
python3 破解 geetest(极验)的滑块验证码from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
import time,re, random
import requests
try:from StringIO import StringIO
except ImportError:from io import StringIO#爬虫模拟的浏览器头部信息
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {'User-Agent': agent}# 根据位置对图片进行合并还原
# filename:图片
# location_list:图片位置
#内部两个图片处理函数的介绍
#crop函数带的参数为(起始点的横坐标,起始点的纵坐标,宽度,高度)
#paste函数的参数为(需要修改的图片,粘贴的起始点的横坐标,粘贴的起始点的纵坐标)
def get_merge_image(filename,location_list):#打开图片文件im = image.open(filename)#创建新的图片,大小为260*116new_im = image.new('RGB', (260,116))im_list_upper=[]im_list_down=[]# 拷贝图片for location in location_list:#上面的图片if location['y']==-58:im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))#下面的图片if location['y']==0:im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))new_im = image.new('RGB', (260,116))x_offset = 0#黏贴图片for im in im_list_upper:new_im.paste(im, (x_offset,0))x_offset += im.size[0]x_offset = 0for im in im_list_down:new_im.paste(im, (x_offset,58))x_offset += im.size[0]return new_im#下载并还原图片
# driver:webdriver
# div:图片的div
def get_image(driver,div):#找到图片所在的divbackground_images=driver.find_elements_by_xpath(div)location_list=[]imageurl=''#图片是被CSS按照位移的方式打乱的,我们需要找出这些位移,为后续还原做好准备for background_image in background_images:location={}#在html里面解析出小图片的url地址,还有长高的数值location['x']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1])location['y']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2])imageurl=re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0]location_list.append(location)#替换图片的后缀,获得图片的URLimageurl=imageurl.replace("webp","jpg")#获得图片的名字imageName = imageurl.split('/')[-1]#获得图片session = requests.session()r = session.get(imageurl, headers = headers, verify = False)#下载图片with open(imageName, 'wb') as f:f.write(r.content)f.close()#重新合并还原图片image=get_merge_image(imageName, location_list)return image#对比RGB值
def is_similar(image1,image2,x,y):pass#获取指定位置的RGB值pixel1=image1.getpixel((x,y))pixel2=image2.getpixel((x,y))for i in range(0,3):# 如果相差超过50则就认为找到了缺口的位置if abs(pixel1[i]-pixel2[i])>=50:return Falsereturn True#计算缺口的位置
def get_diff_location(image1,image2):i=0# 两张原始图的大小都是相同的260*116# 那就通过两个for循环依次对比每个像素点的RGB值# 如果相差超过50则就认为找到了缺口的位置for i in range(0,260):for j in range(0,116):if is_similar(image1,image2,i,j)==False:return  i#根据缺口的位置模拟x轴移动的轨迹
def get_track(length):passlist=[]#间隔通过随机范围函数来获得,每次移动一步或者两步x=random.randint(1,3)#生成轨迹并保存到list内while length-x>=5:list.append(x)length=length-xx=random.randint(1,3)#最后五步都是一步步移动for i in range(length):list.append(1)return list#滑动验证码破解程序
def main():#打开火狐浏览器driver = webdriver.Firefox()#用火狐浏览器打开网页driver.get("http://www.geetest.com/exp_embed")#等待页面的上元素刷新出来WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']").is_displayed())WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_bg gt_show']").is_displayed())WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_fullbg gt_show']").is_displayed())#下载图片image1=get_image(driver, "//div[@class='gt_cut_bg gt_show']/div")image2=get_image(driver, "//div[@class='gt_cut_fullbg gt_show']/div")#计算缺口位置loc=get_diff_location(image1, image2)#生成x的移动轨迹点track_list=get_track(loc)#找到滑动的圆球element=driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")location=element.location#获得滑动圆球的高度y=location['y']#鼠标点击元素并按住不放print ("第一步,点击元素")ActionChains(driver).click_and_hold(on_element=element).perform()time.sleep(0.15)print ("第二步,拖动元素")track_string = ""for track in track_list:#不能移动太快,否则会被认为是程序执行track_string = track_string + "{%d,%d}," % (track, y - 445)#xoffset=track+22:这里的移动位置的值是相对于滑动圆球左上角的相对值,而轨迹变量里的是圆球的中心点,所以要加上圆球长度的一半。#yoffset=y-445:这里也是一样的。不过要注意的是不同的浏览器渲染出来的结果是不一样的,要保证最终的计算后的值是22,也就是圆球高度的一半ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-445).perform()#间隔时间也通过随机函数来获得,间隔不能太快,否则会被认为是程序执行time.sleep(random.randint(10,50)/100)print (track_string)#xoffset=21,本质就是向后退一格。这里退了5格是因为圆球的位置和滑动条的左边缘有5格的距离ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()time.sleep(0.1)ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()time.sleep(0.1)ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()time.sleep(0.1)ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()time.sleep(0.1)ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()print ("第三步,释放鼠标")#释放鼠标ActionChains(driver).release(on_element=element).perform()time.sleep(3)#点击验证# submit = driver.find_element_by_xpath("//div[@class='gt_ajax_tip success']")# print(submit.location)# time.sleep(5)#关闭浏览器,为了演示方便,暂时注释掉.#driver.quit()#主函数入口
if __name__ == '__main__':passmain()

python3 破解 geetest(极验)的滑块验证码相关推荐

  1. 极验第四代滑块验证码破解(四):请求分析及加密参数破解

    极验第四代滑块验证码破解(四):请求分析及加密参数破解 声明 一.极验请求分析 1. 滑块测试网站入口 2. 滑块验证过程抓包 3. 请求详解 3.1. adaptive-captcha-demo 3 ...

  2. 极验第四代滑块验证码破解(一):AST还原混淆JS

    极验第四代滑块验证码破解(一):AST还原混淆JS 声明 一.环境安装 二.AST还原混淆JS 1. 需要还原的js代码链接 2. AST还原源码 3. 极验不同js或不同版本还原方式 三.结语 *本 ...

  3. 极验第四代滑块验证码破解(三):滑块轨迹构造

    极验第四代滑块验证码破解(三):滑块轨迹构造 声明 一.极验滑动轨迹分析 1. 生成滑动轨迹的js入口 2. 滑动轨迹的python实现 二.结语 *本期文章结束啦,如果对您有帮助,记得收藏加关注哦, ...

  4. 极验第四代滑块验证码破解(二):滑块缺口识别

    极验第四代滑块验证码破解(二):滑块缺口识别 声明 一.环境安装 1. 第三方库安装 二.滑块缺口识别 1. 与极验三代滑块对比 2. 缺口识别完整代码 三.结语 *本期文章结束啦,如果对您有帮助,记 ...

  5. 【JavaScript 逆向】极验三代滑块验证码逆向分析

    声明 本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除! 案例目标 极验验证码 demo:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby8= ...

  6. 教你如何快速破解假极验验证码

    随着爬虫技术的日益发展,反爬虫技术也越来越强大,极验(GeeTest)是一家致力于为企业用户提供验证安全的解决方案的公司,通过自主研发的行为安全模型算法,能有效阻止恶意程序对网站的攻击(垃圾注册.撞库 ...

  7. 极验验证滑块破解,canvas

    前言 请勿用于商务用途哦,仅限于学习,否则后果自负哦 有两篇关于极验验证滑块破解的文章,在此分享一下: https://www.jianshu.com/p/c8df1194b514 https://w ...

  8. 极验验证--滑块验证

    极验验证–滑块验证 本文通过通过模拟登录极验网站,完成滑块验证 所用语言和相关模块 python3.6 selenium requests` PIL 极验验证码特点分析 极验验证是一种在计算机领域用于 ...

  9. 极验点选验证码位置识别(一):点选验证码位置识别技术总览

    极验点选验证码位置识别(一):点选验证码位置识别技术总览 声明 一.技术栈 1. 验证码图片下载 2. 验证码图片预处理 3. 标签图分割 4. 背景图图标标注 5. 背景图图标训练&识别 5 ...

最新文章

  1. 你拖后腿了吗?工信部发布前 11 月软件行业经济报告
  2. Linux Rootkit 系列五:感染系统关键内核模块实现持久化
  3. week 7 spring AOP
  4. org.hibernate.NonUniqueObjectException 异常处理
  5. Vuejs发送Ajax请求
  6. python用递归方式实现最大公约数_关于python最大递归深度 - 998
  7. linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换
  8. php 随机在文章中添加锚文本_锚文本对网站SEO优化有什么帮助?
  9. python 类不实例化方法:@staticmethod或@classmethod
  10. kali 无法使用ifconfig等常用命令
  11. 有了这三个神器工具集,应用开发想怎么玩就怎么玩
  12. 网关为0.0.0.0_距离ETH 2.0仅7天,目标价为?美元
  13. mysql主从复制-主库已有数据
  14. Just a test
  15. 图像识别中——目标分割、目标识别、目标检测和目标跟踪的区别
  16. java留言板_java实现简单留言板功能的代码实例
  17. 破解qq上网限制 突破限制上QQ
  18. 关于Excel常用函数做数据分析
  19. 微信小程序在线考试系统 毕业设计(2)分类
  20. office转pdf(在线预览)思路(java示例)

热门文章

  1. 台式计算机如何安装6个系统?,联想台式机重装系统图文教程
  2. css filter blur 白边,如何解决CSS3毛玻璃效果blur有白边的问题
  3. 职业生涯规划设计-分析第一部分
  4. 基于模板匹配的手写字体数字识别-含Matlab代码
  5. 荣耀YOYO建议新增快递取件服务
  6. bzoj 3356: [Usaco2004 Jan]禁闭围栏 离散化+树状数组
  7. m35c android 4.4,索尼M35c电信版评测:Android 4.1系统和娱乐体验
  8. ARCGIS怎么在地图上绘制长宽500m*500m的fishnet
  9. ORA-00821: Specified value of sga_target 980M is too small, needs to be at least 1164M
  10. 铨顺宏RFID:服饰行业和店铺管理与解决方法是如何利用RFID技术