selenium+Chrome滑动验证码破解二(某某网站)


Posted in Python onDecember 17, 2019

具体详情见代码,研究网站,随便输入手机号点击获取验证码

在自己写代码前参考了一批博客,是把所有验证码图片截取所有验证码图片保存在本地,再对比,感觉方法不行,所以自己写了个破解方法,通过js修改css直接抓取完整图片,因为上一篇写了B站,这里就不一一分析了,直接上代码:

破解成功界面

selenium+Chrome滑动验证码破解二(某某网站)

完整代码:

# -*- coding:utf-8 -*-
'''
研究网站: https://account.ch.com/NonRegistrations-Regist
滑块验证码也分两种:
  1.直接给缺口图片,先滑动到缺口找到完整验证码图片,对比有缺口的验证码图片,然后计算缺口坐标,再利用selenium移动按钮到指定位置
  2.直接给原图,缺口需要点击出现,直接保存原图,然后对比
'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from lxml.html import etree
from PIL import Image
from time import sleep
import re, requests
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
 
class SliderVerificationCode(object):
  def __init__(self): # 初始化一些信息
    self.left = 60 # 定义一个左边的起点 缺口一般离图片左侧有一定的距离 有一个滑块
    self.url = 'https://account.ch.com/NonRegistrations-Regist'
    self.chromedriverPath = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
    self.driver = webdriver.Chrome(executable_path=self.chromedriverPath)
    self.wait = WebDriverWait(self.driver, 20) # 设置等待时间20秒
    self.phone = "18516544488"
 
  def input_name_password(self): # 输入手机号
    self.driver.get(self.url)
    self.driver.maximize_window()
    self.inputphone = self.wait.until(EC.presence_of_element_located((By.NAME, 'phoneNumberInput')))
    self.inputphone.send_keys(self.phone)
 
 
  def click_login_button(self): # 点击登录按钮,出现验证码图片
    login_button = self.wait.until(EC.element_to_be_clickable((By.ID, 'getDynamicPwd')))
    login_button.click()
    sleep(1)
 
  def get_geetest_image(self): # 获取验证码图片
    # print(self.driver.page_source)
    gapimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_bg')))
    sleep(2)
    gapimg.screenshot(r'./captcha1.png')
    # 通过js代码修改标签样式 显示图片2
    js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'
    self.driver.execute_script(js)
    sleep(2)
    fullimg = self.wait.until(
      EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_fullbg')))
    fullimg.screenshot(r'./captcha2.png')
 
  def is_similar(self, image1, image2, x, y):
    '''判断两张图片 各个位置的像素是否相同
    #image1:带缺口的图片
    :param image2: 不带缺口的图片
    :param x: 位置x
    :param y: 位置y
    :return: (x,y)位置的像素是否相同
    '''
    # 获取两张图片指定位置的像素点
    pixel1 = image1.load()[x, y]
    pixel2 = image2.load()[x, y]
    # 设置一个阈值 允许有误差
    threshold = 60
    # 彩色图 每个位置的像素点有三个通道
    if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
        pixel1[2] - pixel2[2]) < threshold:
      return True
    else:
      return False
 
  def get_diff_location(self): # 获取缺口图起点
    captcha1 = Image.open('captcha1.png')
    captcha2 = Image.open('captcha2.png')
    for x in range(self.left, captcha1.size[0]): # 从左到右 x方向
      for y in range(captcha1.size[1]): # 从上到下 y方向
        if not self.is_similar(captcha1, captcha2, x, y):
          return x # 找到缺口的左侧边界 在x方向上的位置
 
  def get_move_track(self, gap):
    track = [] # 移动轨迹
    current = 0 # 当前位移
    # 减速阈值
    mid = gap * 4 / 5 # 前4/5段加速 后1/5段减速
    t = 0.2 # 计算间隔
    v = 0 # 初速度
    while current < gap:
      if current < mid:
        a = 3 # 加速度为+3
      else:
        a = -3 # 加速度为-3
      v0 = v # 初速度v0
      v = v0 + a * t # 当前速度
      move = v0 * t + 1 / 2 * a * t * t # 移动距离
      current += move # 当前位移
      track.append(round(move)) # 加入轨迹
    return track
 
  def move_slider(self, track):
    slider = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_slider_button')))
    ActionChains(self.driver).click_and_hold(slider).perform()
    for x in track: # 只有水平方向有运动 按轨迹移动
      ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
    sleep(1)
    ActionChains(self.driver).release().perform() # 松开鼠标
 
  def main(self):
    self.input_name_password()
    self.click_login_button()
    self.get_geetest_image()
    gap = self.get_diff_location() # 缺口左起点位置
    gap = gap - 6 # 减去滑块左侧距离图片左侧在x方向上的距离 即为滑块实际要移动的距离
    track = self.get_move_track(gap)
    print("移动轨迹", track)
    self.move_slider(track)
 
 
if __name__ == "__main__":
  springAutumn = SliderVerificationCode()
  springAutumn.main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编写简单的Python程序来判断文本的语种
Apr 07 Python
python复制文件的方法实例详解
May 22 Python
python相似模块用例
Mar 04 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python读写docx文件的方法
May 08 Python
儿童学习python的一些小技巧
May 27 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
python使用matplotlib绘制热图
Nov 07 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
Python初学者常见错误详解
Jul 02 Python
python实现扫雷游戏
Mar 03 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 #Python
Django app配置多个数据库代码实例
Dec 17 #Python
python关闭占用端口方式
Dec 17 #Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 #Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 #Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 #Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 #Python
You might like
php通过COM类调用组件的实现代码
2012/01/11 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
JavaScript 创建对象
2009/07/17 Javascript
基于JQuery的动态删除Table表格的行和列的代码
2011/05/12 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
python numpy 按行归一化的实例
2019/01/21 Python
python实现函数极小值
2019/07/10 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
UNIX特点都有哪些
2016/04/05 面试题
网站创业计划书
2014/04/30 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS
Python正则表达式中flags参数的实例详解
2022/04/01 Python
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技