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. Mac下搭建react开发环境

    安装node 官网下载 https://nodejs.org/en/ 双击安装,接下来都是默认选择即可,直至安装成功 测试是否安装成功,分别输入以下命令: node -v npm -v 如下图所示,说 ...

  2. 读取模式下cbc latch的事件模拟(热块竞争和热链竞争)-P62

    文章目录 1. 背景 2. 过程 2.1 热块竞争 2.1.1 版本11.2.0.1.0 2.1.1.1 session 1(sid:34) 2.1.1.2 session 2(sid:35) 2.1 ...

  3. 关于SQL SERVER 的日期格式化

    --日期格式化Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), G ...

  4. 大多数人可能都不会使用socketTimeout,看了底层才知道一直都做错了

    前几天一个机房网络抖动,引发了很多对外请求的超时问题,在发生问题排查日志的时候,发现了这么一个现象,httpclient我们的请求超时时间并没有按照我们的设置报超时异常 我们的大概配置如下: Requ ...

  5. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  6. 洛谷 P4408 [NOI2003]逃学的小孩

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  7. django模板中变更数据库信息后,如何把变更后的信息同步更新到数据库

    我们在基于django开发项目的过程中,经常会遇到数据库表字段增加,删除,或者修改的情况,以及字段属性更改的情况,因为django基于ORM模式来操作数据库的, 传统上如果django项目中的数据库m ...

  8. Rust String(官方文档翻译)

    学习Rust,官方文档全英文,查询不太方便,索性直接翻译完,方便查询使用.有需要自由转载,本人英文水平有限,文档是在谷歌翻译的基础上加个人理解完成,不敢保证正确.文档翻译错误的地方欢迎指出: 原文地址 ...

  9. python面试题五:Python 编程

    1.B Tree和B+ Tree的区别? 1.B树中同一键值不会出现多次,并且有可能出现在叶结点,也有可能出现在非叶结点中. 而B+树的键一定会出现在叶结点中,并有可能在非叶结点中重复出现,以维持B+ ...

  10. 机器学习实战基础(十九):sklearn中数据集

    sklearn提供的自带的数据集   sklearn 的数据集有好多个种 自带的小数据集(packaged dataset):sklearn.datasets.load_<name> 可在 ...