selenium 破解登录滑块验证码mu
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的更多相关文章
- selenium破解人人登陆验证码
from selenium import webdriverfrom PIL import Imagefrom chaojiying import Chaojiying_Clientimport ti ...
- 使用Python + Selenium破解滑块验证码
在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...
- 使用 Python+Selenium 破解滑块验证码
开发工具 Python版本:3.6.4 相关模块: pillow模块: selenium模块: numpy模块: 以及一些Python自带的模块. 其他: chromedriver 环境搭建 安装 ...
- python3 破解 geetest(极验)的滑块验证码
Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...
- 爬虫笔记之w3cschool注册页面滑块验证码破解(巨简单滑块位置识别,非鼠标模拟轨迹)
一.背景介绍 最开始接触验证码破解的时候就是破解的w3cschool的使用手机号找回密码页面的验证码,详见:验证码识别之w3cschool字符图片验证码(easy级别),这次破解一下他们注册页面的滑块 ...
- 温习数据算法—js滑块验证码
前言 大多数的应用软件都需要输入一些验证码,验证码的样式也多种多样. 比如抢票,提交订单需要验证码,很多人就纳闷了,怎么还需要验证码呢?这不是浪费时间嘛. 存在即合理,合理就是现实的. 源码下载地址+ ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- selenium cookie 登录
前言 爬虫方向的小伙伴们都知道网页爬虫经常遇到的问题就是登录账户,有些简单的网站我们可以简单的send key来输入账户密码就可以登录,但是有很多网站需要验证码之类的就不太好用了,这时候就体现到了co ...
- selenium模拟登录豆瓣和qq空间
selenium模拟登录豆瓣和qq空间今天又重新学习了下selenium,模拟登录豆瓣,发现设置等待时间真的是很重要的一步,不然一直报错:selenium.common.exceptions.NoSu ...
随机推荐
- 入门大数据---Map/Reduce,Yarn是什么?
简单概括:Map/Reduce是分布式离线处理的一个框架. Yarn是Map/Reduce中的一个资源管理器. 一.图形说明下Map/Reduce结构: 官方示意图: 另外还可以参考这个: 流程介绍: ...
- linux查看当前目录下,各文件夹大小
du -lh --max-depth=1
- 老板急坏了,公司网站的 HTTPS 过期了
端午出去玩的时候,老板打电话说公司网站的 HTTPS 过期了,访问不了(见下图),要我立马升级一下.可惜我当时没带电脑,无能为力,可把老板急坏了. 没办法,急就先急着,只能等我有电脑了才能搞.点击高级 ...
- PDF无法复制/打印/编辑怎么办?
PDF的内容不能复制/打印/编辑,主要有两种原因: 1.PDF文件设置了权限保护 2.PDF内容是图片 第一种,PDF被设置了权限保护 这种的特点是可以选中PDF里的文字,但无法复制 PDF格式标准内 ...
- 【2003、2004 NOIp 入门组错题报告】
2003: T4: 题目大意: 讲这么多话,其实就是求比当前序列大的序列中第m小的一个.可以每次找出比当前序列大的最小的一个序列.我们可以从后往前扫描,当当前这个数比后一个数小时,我们把它与它后面的 ...
- (私人收藏)SQLite 全面手册以及教程
SQLite 全面手册以及教程 https://pan.baidu.com/s/1VKzCWjF79fAiOLjAlx-3zwnfkp SQLite 全面手册以及教程 SQLite 简介 SQLite ...
- mssql 手工注入流程小结
对于MSSQL的注入点,无外乎这三种权限:SA,DB_OENER,PUBLIC.SA(System Admin)权限我们可以直接执行命令,DB_OENER权限的话,我们可以找到WEB的路径,然后用备份 ...
- css3条件判断_@supports的用法/Window.CSS.supports()的使用
为了判断浏览器是否支持css3的一些新属性样式,当不兼容该样式的时候,我们可以更优雅的降级处理.这就需要使用到css3的条件判断功能:在css中支持@supports标记.或者在js中使用CSS.su ...
- P4408 逃学的小孩 题解
题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...
- POJ3057 Evacuation 二分图匹配+最短路
POJ3057 Evacuation 二分图匹配+最短路 题目描述 Fires can be disastrous, especially when a fire breaks out in a ro ...