from selenium import webdriver
from PIL import Image
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.action_chains import ActionChains
import time
import random
def cut_image(driver):
# 获取整个页面图片,图片名字为'whole_img.png'
driver.save_screenshot('whole_img.png')
image = driver.find_element_by_class_name('geetest_canvas_img') # 获取图片的左上右下的位置
left = image.location['x']
top = image.location['y']
right = left + image.size['width']
buttom = top + image.size['height'] # 调用open方法打开全屏图片并赋值给image_obj对象
whole_img_obj = Image.open('whole_img.png') # 通过image_obj对象对小图片进行截取
img = whole_img_obj.crop((left, top, right, buttom))
return img
def get_image(driver, target):
time.sleep(2)
# 修改document文档树,把完整图片的display属性修改为block或 none (根据参数修改)
js_code = '''var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "{}";'''.format(target)
# 执行js代码
driver.execute_script(js_code)
# 截取图片
image = cut_image(driver)
return image
def is_similar(full_image, gap_image, x, y):
# 像素差
num = 50
pixel1 = full_image.getpixel((x, y))
pixel2 = gap_image.getpixel((x, y)) for i in range(0, 3):
if abs(pixel1[i]) - pixel2[i] >= num:
return False
return True
def get_distance(full_image, gap_image):
start = 60
for x in range(start, full_image.size[0]):
for y in range(full_image.size[1]):
if not is_similar(full_image, gap_image, x, y):
return x
def get_tracks(distance):
'''
滑动行为轨迹
加速公式: v = v0 + a * t
路程公式: s = v0 * t + 0.5 * a * (t ** 2)
'''
# 初速度
v0 = 0
# 时间
t = 0.3
# 位置
s = 0
# 滑动轨迹列表 向前滑动列表
move_list = []
# 中间值,作为加减速度的位置
mid = distance * 7 / 8
# 加减速度列表
v_list = [4, 8, 18, 28]
# 循环位移
while s < distance:
if s < mid:
# 随机获取一个加速度
a = v_list[random.randint(0, len(v_list) - 1)]
else:
# 随机获取一个减速度
a = -v_list[random.randint(0, len(v_list) - 1)]
'''
匀加速/减速运行: v = v0 + a * t
位移: s = v * t + 0.5 * a * (t**2)
'''
# 获取初始速度
v = v0
# 路程公式:
s1 = v * t + 0.5 * a * (t ** 2)
s1 = round(s1) # 取整
# 加速公式:
m_v = v + a * t
# 把当前加/减速度赋值给初始速度,以便下一次计算
v0 = m_v
# 把位移添加到滑动列表中
move_list.append(s1)
# 修改滑动初始距离
s += s1
# 后退列表, 自定义后退滑动轨迹,必须是负值
back_list = [-1, -1, -2, -3, -2, -2, -1, -1]
return {'move_list': move_list, 'back_list': back_list}
def main():
    path = r'C:\Users\software\chromedriver\chromedriver_win32\chromedriver.exe'
options = ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(executable_path=path, options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.maximize_window()
    try:
# 1. 输入账号,密码,登录
driver.get("https://passport.ceair.com/?redirectUrl=http%3A%2F%2Fwww.ceair.com%2F#/ffp") driver.find_element_by_xpath('//*[@id="login"]/section/article/aside/article/dl[1]/dd/input').send_keys(
'xxxxxxxxxxx')
time.sleep(0.2) driver.find_element_by_xpath('//*[@id="login"]/section/article/aside/article/dl[2]/dd/input').send_keys(
'19283746')
time.sleep(0.3) driver.find_element_by_xpath('//*[@id="login"]/section/article/aside/article/dl[4]/dd/input').click()
time.sleep(1)
        # 2.获取完整图片
full_image = get_image(driver, 'block')
# full_image.show() # 3.获取缺口图片
gap_image = get_image(driver, 'none')
# gap_image.show() # 4.对比两张图片,获取滑动距离
distance = get_distance(full_image, gap_image) # 5.模拟人的滑动轨迹
tracks = get_tracks(distance)
# 获取前进滑动轨迹
move_list = tracks['move_list']
# 获取后退滑动轨迹
back_list = tracks['back_list'] # 6.滑动
move_tag = driver.find_element_by_xpath('/html/body/div/div[2]/div[6]/div/div[1]/div[2]/div[2]')
# 点击摁住滑动按钮
ActionChains(driver).click_and_hold(on_element=move_tag).perform()
for move in move_list:
ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform()
time.sleep(0.1) time.sleep(0.1) # 向后滑动
for back in back_list:
ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform()
time.sleep(0.1) # 7.微妙晃动
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
time.sleep(0.1)
ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform()
time.sleep(0.1) # 8.释放滑动按钮
ActionChains(driver).release().perform()
time.sleep(1)
    except Exception as e:
print('exception: ', e)
driver.close()
if __name__ == '__main__':
main()

selenium 破解登录滑块验证码mu的更多相关文章

  1. selenium破解人人登陆验证码

    from selenium import webdriverfrom PIL import Imagefrom chaojiying import Chaojiying_Clientimport ti ...

  2. 使用Python + Selenium破解滑块验证码

    在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...

  3. 使用 Python+Selenium 破解滑块验证码

    ​​开发工具 Python版本:3.6.4 相关模块: pillow模块: selenium模块: numpy模块: 以及一些Python自带的模块. 其他: chromedriver 环境搭建 安装 ...

  4. python3 破解 geetest(极验)的滑块验证码

    Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...

  5. 爬虫笔记之w3cschool注册页面滑块验证码破解(巨简单滑块位置识别,非鼠标模拟轨迹)

    一.背景介绍 最开始接触验证码破解的时候就是破解的w3cschool的使用手机号找回密码页面的验证码,详见:验证码识别之w3cschool字符图片验证码(easy级别),这次破解一下他们注册页面的滑块 ...

  6. 温习数据算法—js滑块验证码

    前言 大多数的应用软件都需要输入一些验证码,验证码的样式也多种多样. 比如抢票,提交订单需要验证码,很多人就纳闷了,怎么还需要验证码呢?这不是浪费时间嘛. 存在即合理,合理就是现实的. 源码下载地址+ ...

  7. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  8. selenium cookie 登录

    前言 爬虫方向的小伙伴们都知道网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的send key来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了co ...

  9. selenium模拟登录豆瓣和qq空间

    selenium模拟登录豆瓣和qq空间今天又重新学习了下selenium,模拟登录豆瓣,发现设置等待时间真的是很重要的一步,不然一直报错:selenium.common.exceptions.NoSu ...

随机推荐

  1. 【秒懂Java】【第1章_初识Java】02_软件开发

    通过上一篇文章<01_编程语言>,我们了解到 Java是众多编程语言中的其中一种 编程语言可以用来开发软件 因此,我们即将要学习的Java技术,是属于软件开发的范畴.那软件开发的前景如何呢 ...

  2. hive 时间戳函数之unix_timestamp,from_unixtime

    一. 日期>>>>时间戳 1.unix_timestamp() 获取当前时间戳 例如:select unix_timestamp() -- 2.unix_timestamp(s ...

  3. 手写SpringMVC框架(三)-------具体方法的实现

    续接前文 手写SpringMVC框架(二)结构开发设计 本节我们来开始具体方法的代码实现. doLoadConfig()方法的开发 思路:我们需要将contextConfigLocation路径读取过 ...

  4. 5年前端经验小伙伴教你纯css3实现饼状图

    有一些网页中,有时候会碰到饼状图的需求,比如统计图表,进度指示器,定时器等,实现方式也是各种各样,现在也有不少现成的js库,可以直接拿来使用,方便很多.这里笔者为大家演示一种纯css实现饼状图效果的方 ...

  5. 《 ZooKeeper : Wait-free coordination for Internet-scale systems 》论文研读

    Zookeeper 研读 说明:本文为论文 < ZooKeeper : Wait-free coordination for Internet-scale systems > 的个人理解, ...

  6. Tallest Cow,题解

    题目链接 题意: 问满足一系列形如ab可以相互看到的约束的所有奶牛的最大身高(最高的编号和高度已给出) 分析: 首先,这个可以互相看到指的是中间的人比两头的都矮,一条斜线看到的不行,那么其实我们就可以 ...

  7. JVM零碎知识

    JVM常见XX参数 查看JVM默认值 常用基本配置参数 生产环境服务器变慢,如何诊断 生产环境CPU占用过高,如何诊断 JDK自带的JVM监控和性能分析工具 jps(虚拟机进程状况工具) jinfo( ...

  8. day63 django入门(4)

    目录 一.CBV源码解析 二.模版语法 1 传值 2 过滤器(最多只能传两个参数) 3 标签 4 自定义过滤器,标签,inclusion_tag 4.1 自定义过滤器 4.2 自定义标签(可以传多个参 ...

  9. ElasticSearch 定时批量删除N天前的数据

    描述: 之前我已经完成了使用ElasticSearch.kibana.filebeat.三个工具完成分布式集群收集 分布在各个ip地址上的微服务日志,这样就可以统一的在一个服务器上查看了所有的微服务产 ...

  10. web前端 javascript 兼容低版本 IE 6 7 8复合写法

    1. 返回检测屏幕宽度(可视区域) function client() { if(window.innerWidth != null) // ie9 + 最新浏览器 { return { width: ...