利用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 ...
随机推荐
- How To Move Or Rebuild A Lob Partition
How To Move Or Rebuild A Lob Partition [ID 761388.1] 改动时间 29-JUN-2010 类型 HOWTO 状 ...
- @codechef - BIKE@ Chef and Bike
目录 @description@ @solution@ @accepted code@ @details@ @description@ 输入 n(n ≤ 22) 个点,m(m ≤ 8000) 个边.每 ...
- OpenStack项目及组件功能简单介绍
核心项目3个 1.控制台 服务名:Dashboard 项目名:Horizon 功能:web方式管理云平台,建云主机,分配网络,配安全组,加云盘 2.计算 服务名:计算 项目名:Nova 功能:负责响应 ...
- Websocket 单聊功能
单聊代码 import json from flask import Flask,request,render_template from geventwebsocket.handler import ...
- hdu 1532 Drainage Ditches(最大流模板题)
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ]ubuntu开机自动挂载的ntfs硬盘的权限问题
原文地址:ubuntu开机自动挂载的ntfs硬盘的权限问题 在linux操作系统中, 挂载是一个非常重要的功能,使用非常频繁. 它指将一个设备(通常是存储设备)挂接到一个已存在的目录上. (这个目录可 ...
- supersockets单个 listener
在下面的配置中,你可以配置服务器的监听 ip/port: <superSocket> <servers> <server name="TelnetServer& ...
- poj 3572 Hanoi Tower
Hanoi Towers Time Limit : 10000/5000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- c语言中的字节数关系、
转载自:传送门 16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: ...
- JPA批量操作及性能比对
假设需要批量插入10000条实体数据至数据库.如下是各个操作方法及耗时 环境Spring boot 1.JDBC(JdbcTemplate) pom.xml <dependency> &l ...