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中sleep函数用法实例分析
Apr 29 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python实现拓扑排序的基本教程
Mar 11 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
实例讲解python中的协程
Oct 08 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 Python
python适合做数据挖掘吗
Jun 16 Python
Python实现弹球小游戏
Aug 01 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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
php Undefined index的问题
2009/06/01 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
python中判断文件结束符的具体方法
2020/08/04 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
材料物理专业个人求职信
2013/12/15 职场文书
公司年底活动方案
2014/08/17 职场文书
公务员个人年终总结
2015/02/12 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
python多次执行绘制条形图
2022/04/20 Python