破解极验滑动验证

  博客园登录url:
    https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F

  代码逻辑:
    1、输入用户名与密码,并点击登录
    2、弹出滑动验证,获取有缺口与完整的图片
    3、通过像素点进行比对,获取滑动位移距离
    4、模拟人的行为轨迹
    5、开始滑动

 from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver import ActionChains # 破解滑动验证码的时候用的 可以拖动图片
import time
from PIL import Image # pip3 install pillow
import random # 截图图片函数
def cut_image(driver):
# 获取整个页面图片,图片名字为'snap.png'
driver.save_screenshot('snap.png') # 获取滑动小画图
image = driver.find_element_by_class_name('geetest_canvas_img')
print(image.location)
print(image.size) # 获取小图片的左上右下的位置
left = image.location['x']
top = image.location['y']
right = left + image.size['width']
buttom = top + image.size['height']
print(left, top, right, buttom) # 调用open方法打开全屏图片并赋值给image_obj对象
image_obj = Image.open('snap.png') # 通过image_obj对象对小图片进行截取
# box: The crop rectangle, as a (left, upper, right, lower)-tuple.
img = image_obj.crop((left, top, right, buttom))
# 打开截取后的小图片
# img.show()
return img # 获取完整图片
def get_image1(driver):
time.sleep(2) # 修改document文档树,把完整图片的display属性修改为block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block";
''' # 执行js代码
driver.execute_script(js_code) # 截取图片
image = cut_image(driver) return image # 获取有缺口图片
def get_image2(driver):
time.sleep(2) # 修改document文档树,把完整图片的display属性修改为block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
''' # 执行js代码
driver.execute_script(js_code) # 截取图片
image = cut_image(driver) return image # 获取滑块滑动距离
def get_distance(image1, image2):
# 小滑块右侧位置
start = 60 # 像素差
num = 60
print(image1.size)
for x in range(start, image1.size[0]):
for y in range(image1.size[1]): # 获取image1完整图片每一个坐标的像素点
rgb1 = image1.load()[x, y] # 获取image2缺口图片每一个坐标的像素点
rgb2 = image2.load()[x, y]
# (60, 86, 40) (60, 86, 40) rgb
print(rgb1, rgb2) # abs获取绝对值, 像素点比较的值
r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2]) # 如果条件成立,则找到缺口位置
if not (r < num and g < num and b < num):
# 有误差 - 7像素
return x - 7 # 模拟人的滑动轨迹
def get_strck_move(distance):
distance += 20 '''
滑动行为轨迹
加速公式:
v = v0 + a * t 路程公式:
s = v0 * t + 0.5 * a * (t ** 2)
''' # 初速度
v0 = 0 # 时间
t = 0.2 # 位置
s = 0 # 滑动轨迹列表 向前滑动列表
move_list = [] # 中间值,作为加减速度的位置
mid = distance / 5 * 3 # 加减速度列表
v_list = [1, 2, 3, 4] # 循环位移
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) # 取整 # 加速公式:
# v = v0 + a * t
m_v = v + a * t # 把当前加/减速度赋值给初始速度,以便下一次计算
v0 = m_v # 把位移添加到滑动列表中
move_list.append(s1) # 修改滑动初始距离
s += s1 # 后退列表, 自定义后退滑动轨迹,必须是负值
back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1] return {'move_list': move_list, 'back_list': back_list} def main():
driver = webdriver.Chrome(r'D:\BaiduNetdiskDownload\chromedriver_win32\chromedriver.exe')
driver.implicitly_wait(10)
try:
driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') # 1、输入用户名与密码,并点击登录
user_input = driver.find_element_by_id('LoginName')
user_input.send_keys('_tank_')
time.sleep(0.2) pwd_input = driver.find_element_by_id('Password')
pwd_input.send_keys('k46709394.')
time.sleep(2) login_submit = driver.find_element_by_id('submitBtn')
login_submit.click() # 2、获取完整的图片
image1 = get_image1(driver) # 3、获取有缺口图片
image2 = get_image2(driver) # 4、比对两张图片,获取滑动距离
distance = get_distance(image1, image2)
print(distance) # 5、模拟人的滑动轨迹
move_dict = get_strck_move(distance)
# 获取前进滑动轨迹
move_list = move_dict['move_list']
# 获取后退滑动轨迹
back_list = move_dict['back_list'] # 6、开始滑动
move_tag = driver.find_element_by_class_name('geetest_slider_button')
# 点击摁住滑动按钮
ActionChains(driver).click_and_hold(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) # 制作微妙晃动
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() time.sleep(0.1) # 释放滑动按钮
ActionChains(driver).release().perform() time.sleep(100) finally:
driver.close() if __name__ == '__main__':
main()from selenium import webdriver # 用来驱动浏览器的
from selenium.webdriver import ActionChains # 破解滑动验证码的时候用的 可以拖动图片
import time
from PIL import Image # pip3 install pillow
import random # 截图图片函数
def cut_image(driver):
# 获取整个页面图片,图片名字为'snap.png'
driver.save_screenshot('snap.png') # 获取滑动小画图
image = driver.find_element_by_class_name('geetest_canvas_img')
print(image.location)
print(image.size) # 获取小图片的左上右下的位置
left = image.location['x']
top = image.location['y']
right = left + image.size['width']
buttom = top + image.size['height']
print(left, top, right, buttom) # 调用open方法打开全屏图片并赋值给image_obj对象
image_obj = Image.open('snap.png') # 通过image_obj对象对小图片进行截取
# box: The crop rectangle, as a (left, upper, right, lower)-tuple.
img = image_obj.crop((left, top, right, buttom))
# 打开截取后的小图片
# img.show()
return img # 获取完整图片
def get_image1(driver):
time.sleep(2) # 修改document文档树,把完整图片的display属性修改为block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block";
''' # 执行js代码
driver.execute_script(js_code) # 截取图片
image = cut_image(driver) return image # 获取有缺口图片
def get_image2(driver):
time.sleep(2) # 修改document文档树,把完整图片的display属性修改为block
js_code = '''
var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
''' # 执行js代码
driver.execute_script(js_code) # 截取图片
image = cut_image(driver) return image # 获取滑块滑动距离
def get_distance(image1, image2):
# 小滑块右侧位置
start = 60 # 像素差
num = 60
print(image1.size)
for x in range(start, image1.size[0]):
for y in range(image1.size[1]): # 获取image1完整图片每一个坐标的像素点
rgb1 = image1.load()[x, y] # 获取image2缺口图片每一个坐标的像素点
rgb2 = image2.load()[x, y]
# (60, 86, 40) (60, 86, 40) rgb
print(rgb1, rgb2) # abs获取绝对值, 像素点比较的值
r = abs(rgb1[0] - rgb2[0])
g = abs(rgb1[1] - rgb2[1])
b = abs(rgb1[2] - rgb2[2]) # 如果条件成立,则找到缺口位置
if not (r < num and g < num and b < num):
# 有误差 - 7像素
return x - 7 # 模拟人的滑动轨迹
def get_strck_move(distance):
distance += 20 '''
滑动行为轨迹
加速公式:
v = v0 + a * t 路程公式:
s = v0 * t + 0.5 * a * (t ** 2)
''' # 初速度
v0 = 0 # 时间
t = 0.2 # 位置
s = 0 # 滑动轨迹列表 向前滑动列表
move_list = [] # 中间值,作为加减速度的位置
mid = distance / 5 * 3 # 加减速度列表
v_list = [1, 2, 3, 4] # 循环位移
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) # 取整 # 加速公式:
# v = v0 + a * t
m_v = v + a * t # 把当前加/减速度赋值给初始速度,以便下一次计算
v0 = m_v # 把位移添加到滑动列表中
move_list.append(s1) # 修改滑动初始距离
s += s1 # 后退列表, 自定义后退滑动轨迹,必须是负值
back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1] return {'move_list': move_list, 'back_list': back_list} def main():
driver = webdriver.Chrome(r'D:\BaiduNetdiskDownload\chromedriver_win32\chromedriver.exe')
driver.implicitly_wait(10)
try:
driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') # 1、输入用户名与密码,并点击登录
user_input = driver.find_element_by_id('LoginName')
user_input.send_keys('_tank_')
time.sleep(0.2) pwd_input = driver.find_element_by_id('Password')
pwd_input.send_keys('k46709394.')
time.sleep(2) login_submit = driver.find_element_by_id('submitBtn')
login_submit.click() # 2、获取完整的图片
image1 = get_image1(driver) # 3、获取有缺口图片
image2 = get_image2(driver) # 4、比对两张图片,获取滑动距离
distance = get_distance(image1, image2)
print(distance) # 5、模拟人的滑动轨迹
move_dict = get_strck_move(distance)
# 获取前进滑动轨迹
move_list = move_dict['move_list']
# 获取后退滑动轨迹
back_list = move_dict['back_list'] # 6、开始滑动
move_tag = driver.find_element_by_class_name('geetest_slider_button')
# 点击摁住滑动按钮
ActionChains(driver).click_and_hold(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) # 制作微妙晃动
ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() time.sleep(0.1) # 释放滑动按钮
ActionChains(driver).release().perform() time.sleep(100) finally:
driver.close() if __name__ == '__main__':
main()

Python Learning Day7的更多相关文章

  1. python笔记 - day7

    python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...

  2. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  3. Python Learning Paths

    Python Learning Paths Python Expert Python in Action Syntax Python objects Scalar types Operators St ...

  4. Python Learning

    这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...

  5. python基础 Day7

    python Day7 基础数据类型的补充 str的数据类型补充 capitalize函数将首字母大写,其余变小写 s1="taibei" print(s1.capitalize( ...

  6. How to begin Python learning?

    如何开始Python语言学习? 1. 先了解它,Wiki百科:http://zh.wikipedia.org/zh-cn/Python 2. Python, Ruby等语言来自开源社区,社区的学法是V ...

  7. python学习day7

    目录 一.反射 二.socket 三.socketserver 一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分 ...

  8. Experience of Python Learning Week 1

    1.The founder of python is Guido van Rossum ,he created it on Christmas in 1989, smriti of ABC langu ...

  9. Python Learning: 03

    An inch is worth a pound of gold, an inch of gold is hard to buy an inch of time. Slice When the sca ...

随机推荐

  1. 修改了ssh默认端口对git的影响

    如果服务端的ssh不是采用的默认端口. 那么客户端git命令就会报错: ssh: connect to host 192.168.2.152 port 22: Connection refused 这 ...

  2. hibernate部分源码解析and解决工作上关于hibernate的一个问题例子(包含oracle中新建表为何列名全转为大写且通过hibernate取数时如何不用再次遍历将列名(key)值转为小写)

    最近在研究系统启动时将数据加载到内存非常耗时,想着是否有办法优化!经过日志打印测试发现查询时间(查询时间:将数据库数据查询到系统中并转为List<Map>或List<*.Class& ...

  3. 无需重新编译安装PHP扩展的方法

    转自:https://www.jianshu.com/p/ae3c17b0f126 PHP扩展模块通常有两种: PHP官方扩展.如果php通过源码安装(php7),安装的时候未开启,而后来需要开启某个 ...

  4. Java入门基础(类的方法)

    方法 1.添加方法 方法表示一个类能做什么.在Java里,方法和属性属于对等的术语,在一个类中,不仅可以添加属性,还可以添加方法. 类 { 属性:描述“我有什么” 方法:描述“我能做什么” } 例子: ...

  5. P1064 朋友数

    P1064 朋友数 转跳点:

  6. 怎样管理Exchange Server 2013资源邮箱

    1. exchange资源邮箱介绍 这次将介绍Exchange Server 2013的资源邮箱相关内容. Exchange Server 2013的资源邮箱包含两类,其一为“会议室邮箱”,另一类是“ ...

  7. mysq8设置编码utf8

    设置mysql默认编码utf8 以及其他配置 系统:centos7 vi /etc/my.cnf #红色部分如果以存在则在他的下方添加 [mysql] default-character-set=ut ...

  8. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  9. jenkins#安装jenkins

    1. 访问官网下载地址https://jenkins.io/zh/download/ 2. 选择自己的平台,然后按照文档进行操作: 主要按照文档来,下面是我按照文档按照的一个记录 #访问 https: ...

  10. 7.11 如何应用Varnish

    动态数据缓存 Step 1 修改devault.vcl文件 # This ) # man page for details on VCL syntax and semantics. # # Defau ...