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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Python OS模块常用函数说明
May 23 Python
深入理解python中的select模块
Apr 23 Python
Python有序字典简单实现方法示例
Sep 28 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
python如何生成网页验证码
Jul 28 Python
python实现简易数码时钟
Feb 19 Python
在cmd中查看python的安装路径方法
Jul 03 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
python使用selenium爬虫知乎的方法示例
Oct 28 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
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
.net软件工程师面试题
2015/03/31 面试题
人力资源部培训专员岗位职责
2014/01/02 职场文书
合伙经营协议书范本
2014/04/18 职场文书
档案保密承诺书
2014/06/03 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
网吧管理制度范本
2015/08/05 职场文书
公司与个人合作协议书
2016/03/19 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL