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类和函数中使用静态变量的方法
May 09 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
Python快速查找list中相同部分的方法
Jun 27 Python
python 读取文件并替换字段的实例
Jul 12 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
python交易记录链的实现过程详解
Jul 03 Python
python使用matplotlib绘制雷达图
Oct 18 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
django的autoreload机制实现
Jun 03 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
python中K-means算法基础知识点
Jan 25 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php函数的常用方法及注意之处小结
2011/07/10 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
pandas string转dataframe的方法
2018/04/11 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python之时间和日期使用小结
2019/02/14 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
星空联盟C# .net笔试题
2014/12/05 面试题
《小猪家的桃花树》教学反思
2014/04/11 职场文书
商场父亲节活动方案
2014/08/27 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
捐款仪式主持词
2015/07/04 职场文书
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL