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 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
python单元测试unittest实例详解
May 11 Python
举例详解Python中yield生成器的用法
Aug 05 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
python 的topk算法实例
Apr 02 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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 Switch 语句之学习笔记
2013/09/21 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python splitlines使用技巧
2008/09/06 Python
python中文编码问题小结
2014/09/28 Python
Python常用算法学习基础教程
2017/04/13 Python
关于python的list相关知识(推荐)
2017/08/30 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
服务之星获奖感言
2014/01/21 职场文书
暑期社会实践方案
2014/02/05 职场文书
小学运动会口号
2014/06/07 职场文书
材料员岗位职责范本
2015/04/11 职场文书