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 def函数的定义、使用及参数传递实现代码
Aug 10 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
解决python 输出是省略号的问题
Apr 19 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
tensorflow更改变量的值实例
Jul 30 Python
Django添加sitemap的方法示例
Aug 06 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
Python csv模块使用方法代码实例
Aug 29 Python
Python3 assert断言实现原理解析
Mar 02 Python
python安装sklearn模块的方法详解
Nov 28 Python
Python中threading库实现线程锁与释放锁
May 17 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
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
javascript object array方法使用详解
2012/12/03 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
ES6新增的math,Number方法
2017/08/06 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
初中体育教学反思
2014/01/14 职场文书
大学生入党思想汇报
2014/01/14 职场文书
运动会演讲稿300字
2014/08/25 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
英语投诉信范文
2015/07/03 职场文书
酒店厨房管理制度
2015/08/06 职场文书
数据库之SQL技巧整理案例
2021/07/07 SQL Server