破解流程

#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库自动执行滑动验证码模拟登陆的更多相关文章

  1. python利用selenium库识别点触验证码

    利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分 ...

  2. Python:利用 selenium 库抓取动态网页示例

    前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...

  3. Python-异常处理 使用selenium库自动爬取数据

    异常处理 处理程序的报错 语法 捕捉万能异常: try: print(a) except Exception as e: print("你的代码有问题") print(" ...

  4. selenium处理极验滑动验证码

    要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了 ...

  5. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    [前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...

  6. PHP利用GD库绘图和生成验证码图片

    首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...

  7. 利用jenkins+git自动执行接口测试代码

    事前准备 部署好jenkins.申请一个码云账号.代码同步至码云 1.在码云上新建一个项目,并把代码同步上去 我设置成了私有项目 2.为项目添加部署公钥 因为是私有项目,所以需要添加一个部署公钥,不然 ...

  8. 破解验证码模拟登陆cnblogs

    from selenium import webdriver from selenium.webdriver import ActionChains from PIL import Image imp ...

  9. Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

    Python 2.7 IDE Pycharm 5.0.3 Selenium:Selenium的介绍及使用,强烈推荐@ Eastmount的博客 PIL : Pillow-3.3.0-cp27-cp27 ...

随机推荐

  1. 【SDOI2015】bzoj3990 排序

    A. 排序 题目描述 输入格式 输出格式 一行,一个整数,表示可以将数组A从小到大排序的不同的操作序列的个数. 样例 样例输入 3 7 8 5 6 1 2 4 3 样例输出 6 数据范围与提示 对于3 ...

  2. @codeforces - 1186F@ Vus the Cossack and a Graph

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 点 m 边的图(n, m<=10^6),记第 ...

  3. LRJ-Example-06-12-Uva572

    #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <string ...

  4. RegExp类型

    一.创建正则表达式的方法 1.字面量形式 var expressiion=/pattern/flags; flags:g全局模式,即将被应用于所有字符串,而非在发现第一个匹配项时立即停止: i不区分大 ...

  5. JavaScript跨域问题

    通过实现Ajax通信的主要限制,来源于跨域安全策略.默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源.这种安全策略可以预防某些恶意行为.但是,实现合理的跨域请求对于开发某些浏览器应用程 ...

  6. C# 16 进制字符串转 int

    最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理. 本文告诉大家如何从 16 进制转整形 如果输入的是 0xaa 这时转换 int 不能使用 Parse 不然会出现异 ...

  7. angular 全局常用指令

    1.全局支持 enter快捷键触发事件 // 全局指令 app.directive('ngEnter', ['$window',"$timeout", ($window,$time ...

  8. artDialog4.0.5

    artDialog4.0.5 2011-08-22 11:54:36 haiwei_sun 阅读数 4109  收藏 更多 分类专栏: jquery   下载 Google Code 项目主页 最新版 ...

  9. flex布局简单兼容性写法

    /* 定义 */ .flex-def { display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit brow ...

  10. 为什么Redis是单线程,性能还如此高?

    一. Redis为什么是单线程 注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程. 因为CPU不是Redis的瓶颈.Redis的瓶颈最有可能 ...