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

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

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

破解成功界面

完整代码:

# -*- 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()

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

(0)

相关推荐

  • selenium+java破解极验滑动验证码的示例代码

    摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 1.打开威锋网注册页面 2.移动鼠标至小滑块,一张完整的图片会出现(如下图1) 3.点击鼠标左键,图片中间会出现一个缺块(如下图2) 4.移动小滑块正上方图案至缺块处 5.验证通过 selenium模拟验证的过程 加载威锋网注册页面 下载图片1和缺块图片2 根据两张图片的差异计算平移的距离x 模拟鼠标点击事件,点击小滑块向右移动x 验证通过 详细分析 1.打开chrome浏览器控制台,会

  • Java selenium处理极验滑动验证码示例

    要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题,我按照这思路去大概实现了一下. 1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过) 我用的是java,我首先先想到了用直接用htmlunit,我做了点初始化 private void initWebClient() { if (webClient != null) { return; } webClient = new WebClient(BrowserVersion.

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

    具体详情见代码,研究网站,随便输入手机号点击获取验证码 在自己写代码前参考了一批博客,是把所有验证码图片截取所有验证码图片保存在本地,再对比,感觉方法不行,所以自己写了个破解方法,通过js修改css直接抓取完整图片,因为上一篇写了B站,这里就不一一分析了,直接上代码: 破解成功界面 完整代码: # -*- coding:utf-8 -*- ''' 研究网站: https://account.ch.com/NonRegistrations-Regist 滑块验证码也分两种: 1.直接给缺口图片,先

  • 基于python实现破解滑动验证码过程解析

    前言: 很多小伙伴们反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 今天我们主要来聊聊滑动验证码如何去识别破解. 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤:

  • python自动化测试之破解滑动验证码

    在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤: 1.获取滑块滑动的距离 2.模拟拖动滑块,通过验证. 关于这种滑动的验证码,滑块和缺口背景都是分别是

  • python验证码识别教程之滑动验证码

    前言 上篇文章记录了2种分割验证码的方法,此外还有一种叫做"滴水算法"(Drop Fall Algorithm)的方法,但本人智商原因看这个算法看的云里雾里的,所以今天记录滑动验证码的处理吧.网上据说有大神已经破解了滑动验证码的算法,可以不使用selenium来破解,但本人能力不足还是使用笨方法吧. 基础原理很简单,首先点击验证码按钮后的图片是滑动后的完整结果,点击一下滑块后会出现拼图,对这2个分别截图后比较像素值来找出滑动距离,并结合selenium来实现拖拽效果. 至于seleni

  • python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码

    最近学了python爬虫,本着学以致用的态度去应用在生活中.突然发现算法的考试要来了,范围就是PTA刷过的题.让我一个个复制粘贴?不可能,必须爬它! 先开页面,人傻了,PTA的题目是异步加载的,爬了个寂寞(空数据).AJAX我又不熟,突然想到了selenium. selenium可以模拟人的操作让浏览器自动执行动作,具体的自己去了解,不多说了.干货来了: 登录界面有个图片的滑动验证码 破解它的最好方式就是用opencv,opencv巨强,自己了解. 思路开始: 1.将背景图片和可滑动的图片下载

  • 使用java + selenium + OpenCV破解腾讯防水墙滑动验证码功能

    * 验证码地址:https://007.qq.com/online.html * 使用OpenCv模板匹配 * 成功率90%左右 * Java + Selenium + OpenCV 产品样例 来吧!展示! 注意!!! · 在模拟滑动时不能按照相同速度或者过快的速度滑动,需要向人滑动时一样先快后慢,这样才不容易被识别. 模拟滑动代码↓↓↓ /** * 模拟人工移动 * @param driver * @param element页面滑块 * @param distance需要移动距离 */ pu

  • 使用java + selenium + OpenCV破解网易易盾滑动验证码的示例

    网易易盾:dun.163.com * 验证码地址:https://dun.163.com/trial/jigsaw * 使用OpenCv模板匹配 * Java + Selenium + OpenCV 产品样例 接下来就是见证奇迹的时刻! 注意!!! · 在模拟滑动时不能按照相同速度或者过快的速度滑动,需要向人滑动时一样先快后慢,这样才不容易被识别. 模拟滑动代码↓↓↓ /** * 模拟人工移动 * @param driver * @param element页面滑块 * @param dista

  • python破解bilibili滑动验证码登录功能

    地址:https://passport.bilibili.com/login 左图事完整验证码图,右图是有缺口的验证码图                                    步骤: 1.准备bilibili账号 2.工具:pycharm selenium chromedriver PIL 3.破解思路: 找到完整验证码和有缺口的验证码图片,然后计算缺口坐标,再利用selenium移动按钮到指定位置,齐活 步骤代码如下: 先导入需要的包和库 from selenium impor

随机推荐