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代码真的很爽
Aug 26 Python
python中urllib模块用法实例详解
Nov 19 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
对python的输出和输出格式详解
Dec 08 Python
python设置环境变量的作用和实例
Jul 09 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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 Http_Template_IT类库进行模板替换
2009/03/19 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
python 正则式使用心得
2009/05/07 Python
python正则表达式re之compile函数解析
2017/10/25 Python
django之session与分页(实例讲解)
2017/11/13 Python
Python 将pdf转成图片的方法
2018/04/23 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
解决yum对python依赖版本问题
2019/07/05 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
详解python中的数据类型和控制流
2019/08/08 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
新学期感想
2015/08/10 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js