Python模拟登录之滑块验证码的破解(实例代码)


Posted in Python onNovember 18, 2019

模拟登录之滑块验证码的破解,具体代码如下所示:

# 图像处理标准库
from PIL import Image
# web测试
from selenium import webdriver
# 鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
# 等待时间 产生随机数
import time, random
# 滑块移动轨迹
def get_tracks1(distance):
 # 初速度
 v = 0
 # 单位时间为0.3s来统计轨迹,轨迹即0.3s内的位移
 t = 0.3
 # 位移/轨迹列表
 tracks = []
 # 当前的位移
 current = 0
 # 到达mid值开始减速
 mid = distance * 4 / 5
 while current < distance:
  if current < mid:
   # 加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
   a = 2
  else:
   a = -3
  # 初速度
  v0 = v
  # 0.3s时间内的位移
  s = v0 * t + 0.5 * a * (t ** 2)
  # 当前位置
  current += s
  # 添加到轨迹列表
  tracks.append(round(s))
  # 速度已经达到V,该速度作为下次的初速度
  v = v0 + a * t
 return tracks
# 计算滑块位移距离
def get_diff_location(image1, image2):
 # (0,340)(0,340)为滑块图片区域,可根据实际情况修改
 for i in range(0, 340):
  for j in range(0, 198):
   # 遍历原图与缺口图像素值寻找缺口位置
   if is_similar(image1, image2, i, j) == False:
    return i
 return -1
# 对比RGB值得到缺口位置
def is_similar(image1, image2, x, y):
 pixel1 = image1.getpixel((x, y))
 pixel2 = image2.getpixel((x, y))
 # 截图像素也许存在误差,50作为容差范围
 if abs(pixel1[0] - pixel2[0]) >= 50 and abs(pixel1[1] - pixel2[1]) >= 50 and abs(pixel1[2] - pixel2[2]) >= 50:
  return False
 return True
def login():
 # 实例化浏览器
 driver = webdriver.Chrome()
 # 请求登录网址
 driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F')
 # 最大化浏览器
 driver.maximize_window()
 # 输入账号
 driver.find_element_by_xpath('//*[@id="LoginName"]').send_keys('你的账号')
 # 输入密码
 driver.find_element_by_xpath('//*[@id="Password"]').send_keys('你的密码')
 # 点击登录
 driver.find_element_by_xpath('//*[@id="submitBtn"]/span[1]').click()
 # 等待2s使验证弹窗加载完成
 time.sleep(2)
 # 定位到圆球
 slider = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div[1]/div[2]/div[2]')
 # 点击鼠标左键,不松开
 ActionChains(driver).click_and_hold(slider).perform()
 # 拖动到最右边,为了后续方便对比
 ActionChains(driver).move_by_offset(xoffset=198, yoffset=0).perform()
 # 定位到弹出的验证窗口
 y_element = driver.find_element_by_xpath('/html/body/div[2]/div[2]')
 # print(y_element.location)
 # print(y_element.size)
 # 获取左上,右,左下的坐标确定一个图片范围
 left = y_element.location['x']
 top = y_element.location['y']
 right = left + y_element.size['width']
 bottom = top + y_element.size['height']
 # 全窗口截图
 driver.save_screenshot('a.png')
 # 打开截图的图片
 im = Image.open('a.png')
 # 局部截图
 im = im.crop((left + 160, top + 55, right + 225, bottom - 30))
 # 保存有缺口的验证图片
 im.save('b.png')
 # 放开鼠标
 ActionChains(driver).release(slider).perform()
 time.sleep(2)
 # 定位到可以显示无缺图片的位置
 block = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/canvas')
 # 修改其属性值,使显示无缺图片
 driver.execute_script('arguments[0].style = "display: block; opacity: 1;"', block)
 time.sleep(2)
 # 全窗口截图
 driver.save_screenshot('a.png')
 # 打开截图的图片
 im = Image.open('a.png')
 # 局部截图
 im = im.crop((left + 160, top + 55, right + 225, bottom - 30))
 # 保存无缺口的验证图片
 im.save('c.png')
 time.sleep(0.5)
 # 打开获取的两个图片
 imageb = Image.open('b.png')
 imagec = Image.open('c.png')
 # 获取缺口位置
 visualstack = get_diff_location(imagec, imageb)
 # 减去左边图片空白像素值
 print(visualstack - 10)
 # 点击鼠标左键,不松开
 ActionChains(driver).click_and_hold(slider).perform()
 # 先快速拖动圆球到中间位置
 ActionChains(driver).move_by_offset(xoffset=visualstack/2,yoffset=0).perform()
 # 根据轨迹拖动圆球
 track_list = get_tracks1((visualstack/2 - 48))
 for track in track_list:
  ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()
 # 放开圆球
 time.sleep(0.8)
 ActionChains(driver).release(slider).perform()
 print(driver.page_source)
 time.sleep(4)
 if '你的昵称' in driver.page_source:
  print('登录成功')
  print(driver.get_cookies())
 else:
  driver.close()
  login()
if __name__ == '__main__':
 login()

总结

以上所述是小编给大家介绍的Python模拟登录之滑块验证码的破解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python 中split 和 strip的实例详解
Jul 12 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
Python OpenCV利用笔记本摄像头实现人脸检测
Aug 20 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
浅谈Python 递归算法指归
Aug 22 Python
基于python监控程序是否关闭
Jan 14 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 #Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 #Python
wxPython实现文本框基础组件
Nov 18 #Python
WxPython实现无边框界面
Nov 18 #Python
python中的RSA加密与解密实例解析
Nov 18 #Python
wxpython绘制圆角窗体
Nov 18 #Python
wxpython绘制音频效果
Nov 18 #Python
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP 文件系统详解
2012/09/13 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php定时执行任务设置详解
2015/02/06 PHP
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
javascript编写简易计算器
2017/05/06 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
擅自离岗检讨书
2014/02/11 职场文书
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript