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 ...
随机推荐
- 入门大数据---Python基础
前言 由于AI的发展,包括Python集成了很多计算库,所以淡入了人们的视野,成为一个极力追捧的语言. 首先概括下Python中文含义是蟒蛇,它是一个胶水语言和一个脚本语言,胶水的意思是能和多种语言集 ...
- shell基本正则表达式
基本正则表达式 星号* 匹配它前面的字符串或正则表达式任意次(包括0次).比如,“1122*” 将匹配11+1个或多个2,其可能匹配的字符串将是112.1122.112222.11223343等 句点 ...
- JDK8--01:JDK8简介
一.新特性1.lambda表达式(重点)2.函数式接口3.方法引用与构造器引用4.Stream API(重点)5.接口中的默认方法和静态方法6.新时间日期API7.其他新特性 二.特点: 1.速度更快 ...
- 平时自己常用的git指令
增删改查 创建标签 $ git tag -a v1.4 -m 'my version 1.4' 用 -a (译注:取 annotated 的首字母)指定标签名字即可 -m 选项则指定了对应的标签说明 ...
- vue基础入门(4)
4.综合实例 4.1.基于数据驱动的选项卡 4.1.1.需求 需求说明: 1. 被选中的选项按钮颜色成橙色 2. 完成被选中选项下的数据列表渲染 3. 完成选项切换 4.1.2.代码实现 <!D ...
- 数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……
热门资讯 1.Stackoverflow 2020年度报告出炉!开发者最喜爱的数据库是什么?[摘要]2020年2月,近6.5万名开发者参与了 Stackoverflow 的 2020 年度调查,这份报 ...
- 一文说通MongoDB via Python操作
Python并不仅仅是一个做Machine Learning的语言. 说到Python,一般都会感觉它关联着ML,如果不是做ML开发,就会觉得离自己很远.而实际上,作为一门语言,Python在应用 ...
- 洛谷 P6136 【【模板】普通平衡树(数据加强版)】
爱死替罪羊树了 这种暴力的数据结构爱死了.什么?!你还不知道替罪羊树?那就看看这篇博客这篇博客吧.替罪羊树就是当不平衡时,拍扁重建,然后就平衡了.想切这道题,要先把普通平衡树那道题做了(这篇博客讲了的 ...
- eIQ WSL下工具及环境配置
1. 配置WSL 参考[https://www.cnblogs.com/hayley111/p/12844337.html] 2. 配置VScode 参考[https://zhuanlan.zhihu ...
- 如何配置-整合ssm框架之配置文件
ssm整合 一.applicationContext.xml 1.配置数据源 <bean id="dataSource" class="org.springfram ...