python3 破解 geetest(极验)的滑块验证码功能


Posted in Python onFebruary 24, 2018

下面一段代码给大家介绍python破解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*116
  new_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 = 0
  for 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):
  #找到图片所在的div
  background_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)
  #替换图片的后缀,获得图片的URL
  imageurl=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 False
  return 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):
  pass
  list=[]
  #间隔通过随机范围函数来获得,每次移动一步或者两步
  x=random.randint(1,3)
  #生成轨迹并保存到list内
  while length-x>=5:
    list.append(x)
    length=length-x
    x=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__':
  pass
  main()

总结

以上所述是小编给大家介绍的python3 破解 geetest(极验)的滑块验证码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
理解Python中的类与实例
Apr 27 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
python Tkinter的图片刷新实例
Jun 14 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
通过代码实例了解Python sys模块
Sep 14 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
python opencv之SURF算法示例
Feb 24 #Python
几种实用的pythonic语法实例代码
Feb 24 #Python
使用Python爬取最好大学网大学排名
Feb 24 #Python
python opencv 直方图反向投影的方法
Feb 24 #Python
python爬虫爬取淘宝商品信息
Feb 23 #Python
python爬取淘宝商品详情页数据
Feb 23 #Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 #Python
You might like
微信自定义分享php代码分析
2016/11/24 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
JS正则表达式比较常见用法
2016/01/26 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python比较两个列表是否相等的方法
2015/07/28 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Numpy中的mask的使用
2018/07/21 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
办公室前台的岗位职责
2013/12/20 职场文书
庆元旦演讲稿
2014/09/15 职场文书
重阳节标语大全
2014/10/07 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
个人原因辞职信模板
2015/05/13 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
导游词之安徽巢湖
2019/12/26 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js