利用selenium库自动执行滑动验证码模拟登陆
破解流程
#1、输入账号、密码,然后点击登陆
#2、点击按钮,弹出没有缺口的图
#3、针对没有缺口的图片进行截图
#4、点击滑动按钮,弹出有缺口的图
#5、针对有缺口的图片进行截图
#6、对比两张图片,找出缺口,即滑动的位移
#7、按照人的行为行为习惯,把总位移切成一段段小的位移
#8、按照位移移动
#9、完成登录
模拟登陆案例一:
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import time
import random
option = webdriver.ChromeOptions()
# 添加启动参数 (add_argument)
option.add_argument('disable-infobars') # 禁用浏览器正在被自动化程序控制的提示
driver = webdriver.Chrome(chrome_options=option)
def get_snap(driver):
# selenium自带的截图网页全屏图片
driver.save_screenshot('snap.png')
# 拿到验证图片所在的标签,方便确认位置
img = driver.find_element_by_class_name('geetest_canvas_img')
# location 代表该图片在整个页面所在的位置(x, y),x:距离左边多长,y:距离上面多长
# print(img.location)
# size 代表该图片的大小
# print(img.size)
left = img.location.get('x')
upper = img.location.get('y')
right = left + img.size.get('width')
lower = upper + img.size.get('height')
# 拿到图片四个边的位置,就可以进行裁剪图片了
# print(left, upper, right, lower)
img_obj = Image.open('snap.png')
# 对屏幕进行裁剪,获取滑动验证码图片
image = img_obj.crop((left, upper, right, lower))
# image.show()
return image
# 获取完整图片
def get_img1(driver):
time.sleep(0.2)
js_code = """
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block";
console.log(x)
"""
# 执行js代码
driver.execute_script(js_code)
time.sleep(1)
# 截取图片
img_obj = get_snap(driver)
return img_obj
# 获取有缺口的图片
def get_img2(driver):
time.sleep(0.2)
js_code = """
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="none";
console.log(x)
"""
# 执行js代码
driver.execute_script(js_code)
time.sleep(1)
# 截取图片
img_obj = get_snap(driver)
return img_obj
def get_distance(img1, img2):
# 初始值
start = 60
# 模块色差
color_num = 60
for x in range(start, img1.size[0]):
for y in range(img1.size[1]):
rgb1 = img1.load()[x, y]
rgb2 = img2.load()[x, y]
# abs 获取绝对值
r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2])
if not (r < color_num and g < color_num and b < color_num):
return x - 7 # 误差值大概为7
def get_stacks(distance):
distance += 20
'''
拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
变速运动基本公式:
① v=v0+at 匀加速\减速运行
② s=v0t+½at² 位移
③ v²-v0²=2as
'''
# 初速度
v0 = 0
# 加减速度列表
a_list = [50, 65, 80]
# 时间
t = 0.2
# 初始位置
s = 0
# 向前滑动轨迹
forward_stacks = []
mid = distance * 3 / 5
while s < distance:
if s < mid:
a = a_list[random.randint(0, 2)]
else:
a = -a_list[random.randint(0, 2)]
v = v0
stack = v * t + 0.5 * a * (t ** 2)
# 每次拿到的位移
stack = round(stack)
s += stack
v0 = v + a * t
forward_stacks.append(stack)
# 往后返回20距离,因为之前distance向前多走了20
back_stacks = [-5, -5, -5, -5,]
return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks}
if __name__ == '__main__':
try:
driver.get('https://account.cnblogs.com/signin')
# 隐式等待
driver.implicitly_wait(5)
# 步骤一:找到输入账户框
user_input = driver.find_element_by_id('LoginName')
# 步骤二:找到输入密码框
pwd_input = driver.find_element_by_id('Password')
user_input.send_keys('123456@qq.com')
time.sleep(1)
pwd_input.send_keys('123456')
# 步骤三:找到确认登录按钮,并点击
login_btn = driver.find_element_by_id('submitBtn')
time.sleep(1)
login_btn.click()
time.sleep(3)
# 步骤四: 拿到没有缺口的图片并截取
img1 = get_img1(driver)
# 步骤五: 拿到有缺口的图片并截取
img2 = get_img2(driver)
# 步骤六: 对比两张图片,获取滑动距离
distance = get_distance(img1, img2)
# 步骤七: 模拟人为滑动轨迹
stacks = get_stacks(distance)
# 步骤八: 根据滑动轨迹进行滑动
forward_stacks = stacks['forward_stacks']
back_stacks = stacks['back_stacks']
# 步骤九:找到滑动按钮,并点击与hole住
slider_btn = driver.find_element_by_class_name('geetest_slider_button')
time.sleep(0.2)
ActionChains(driver).click_and_hold(slider_btn).perform()
time.sleep(0.2)
# 步骤十:开始循环向前滑动
for forward_stack in forward_stacks:
ActionChains(driver).move_by_offset(xoffset=forward_stack, yoffset=0).perform()
time.sleep(0.1)
# 步骤十一:开始循环向后滑动20
for back_stack in back_stacks:
ActionChains(driver).move_by_offset(xoffset=back_stack, yoffset=0).perform()
time.sleep(0.1)
time.sleep(0.2)
# 步骤十二:为了防止极验检测到,再将滑块前后小浮动5位置,再释放
ActionChains(driver).move_by_offset(xoffset=5, yoffset=0).perform()
time.sleep(0.2)
ActionChains(driver).move_by_offset(xoffset=-5, yoffset=0).perform()
# 可能会出现识别不了,说图片被怪物吃了,上面模拟人的行为都不要了,拿到距离后,直接执行下面代码,一步滑到缺口处即可
# ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0).perform()
ActionChains(driver).release().perform()
time.sleep(50)
finally:
driver.close()
利用selenium库自动执行滑动验证码模拟登陆的更多相关文章
- python利用selenium库识别点触验证码
利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...
- Python:利用 selenium 库抓取动态网页示例
前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...
- Python-异常处理 使用selenium库自动爬取数据
异常处理 处理程序的报错 语法 捕捉万能异常: try: print(a) except Exception as e: print("你的代码有问题") print(" ...
- selenium处理极验滑动验证码
要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
- PHP利用GD库绘图和生成验证码图片
首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...
- 利用jenkins+git自动执行接口测试代码
事前准备 部署好jenkins.申请一个码云账号.代码同步至码云 1.在码云上新建一个项目,并把代码同步上去 我设置成了私有项目 2.为项目添加部署公钥 因为是私有项目,所以需要添加一个部署公钥,不然 ...
- 破解验证码模拟登陆cnblogs
from selenium import webdriver from selenium.webdriver import ActionChains from PIL import Image imp ...
- Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录
Python 2.7 IDE Pycharm 5.0.3 Selenium:Selenium的介绍及使用,强烈推荐@ Eastmount的博客 PIL : Pillow-3.3.0-cp27-cp27 ...
随机推荐
- 20-1 django上传文件和项目里上传头像如何查看
一 普通上传方式 1 views def upload(request): if request.method == "POST": # print(request.POST) # ...
- 公司安装mariaDB-5.5.52和Jdk 7
转自:http://www.cnblogs.com/kgdxpr/p/3209009.html vi /etc/yum.repos.d/MariaDB.repo 加入下面内容 [mariabd]nam ...
- LocalDate、LocalDateTime与timestamp、Date的转换
LocalDate.LocalDateTime与timestamp.Date的转换 1.LocalDate转Date LocalDate nowLocalDate = LocalDate.now(); ...
- HDU - 6534 Chika and Friendly Pairs
这个题其实也是很简单的莫队,题目要求是给一个序列,询问l-r区间内部,找到有多少对答案满足 i < j 并且 | a[ i ] -a[ j ] | <=k 也就是有多少对,满足差值小于k的 ...
- VSCode配置启动Vue项目
下载安装并配置VSCode 随便百度上搜个最新的VSCode安装好后,点击Ctrl + Shit + X打开插件扩展窗口进行插件扩展,这里要安装两个插件. 1.vetur插件的安装 该插件是vue文件 ...
- array_map 用法
array_map - 将回调函数作用到数组中的每一个元素上 function add2($value) { return $value + 2; } $arr = array(1, 2, 3, 4, ...
- [ Laravel 5.1 文档 ] 服务 —— 帮助函数
http://laravelacademy.org/post/205.html 1.简介 Laravel自带了一系列PHP帮助函数,很多被框架自身使用,然而,如果你觉得方便的话也可以在应用中随心所欲的 ...
- 如何学习Python的一些总结
https://mp.weixin.qq.com/s/w0NoDiYfvtTy8N3BVoIVpw 为什么选择Python 经常会有同学问我为什么选择Python.我很喜欢这门语言,因为它的简洁灵活, ...
- hdu 1045 Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- tf.shape()
tf.shapetf.shape( input, name=None, out_type=tf.int32)12345例如:将矩阵的维度输出为一个维度矩阵import tensorflow as tf ...