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获得一个月有多少天的方法
Jun 04 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Python之字典添加元素的几种方法
Sep 30 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
解决python的空格和tab混淆而报错的问题
Feb 26 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使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
理解AngularJs指令
2015/12/10 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
Python批量查询域名是否被注册过
2017/06/21 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
python 多线程中join()的作用
2020/10/29 Python
在Python中实现字典反转案例
2020/12/05 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
加拿大探亲邀请信
2014/01/28 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
文案策划专业自荐信
2014/07/07 职场文书
初婚初育证明范本
2014/11/24 职场文书
银行给客户的感谢信
2015/01/23 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
企业愿景口号
2015/12/25 职场文书
合作合同协议书
2016/03/21 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python