zoukankan      html  css  js  c++  java
  • 极验验证Canvas

    来源:https://blog.csdn.net/qq_28654919/article/details/89923687

    请勿用于商务用途哦,仅限于学习,否则后果自负哦
    有两篇关于极验验证滑块破解的文章,在此分享一下:
    https://www.jianshu.com/p/c8df1194b514
    https://www.jianshu.com/p/f12679a63b8d
    这两篇文章针对不同滑块,有不同的寻找缺口的以及滑动的方法,收益颇多。
    本博客是基于第一篇文章上写的,寻找缺口的方法和滑动的方法是一模一样的。唯一不同是,保存图片的方式,第一篇文章有图片的链接地址,并且图片是乱序的。我这里是canvas。所以这里只介绍前半部分,后半部分寻找缺口以及滑动距离,请大家参考原文。
    正文
    爬取的网址:https://www.binance.co/login.html

    首先,可以看到图片是以canvas的形式呈现出来的,所以无法进行下载保存到本地。
    其次,我们要找到有缺口的图片以及完整的图片。
    仔细观察class的名字,可以很明显的发现,geetest_canvas_bg 是有缺口的背景图,geetest_canvas_slice是那一小块缺口,geetest_canvas_fullbg是完整的图片,有注意到我绿色框框吗,你只要把这个删掉,就可以看到完整的图片,css把它隐藏了而已,实际上它是存在的。
    参考了第一种方式,所以我这里需要下载,有缺口的背景图以及完整的图片,具体实现方法如下
    def save_img(self, img_name, class_name):
    # img_name 是保存图片的名字,class_name 是需要保存的canvas的className
    getImgJS = 'return document.getElementsByClassName("' + class_name + '")[0].toDataURL("image/png");'
    img = self.driver.execute_script(getImgJS)
    base64_data_img = img[img.find(',') + 1:]
    image_base = base64.b64decode(base64_data_img)
    file = open(img_name, 'wb')
    file.write(image_base)
    file.close()
    123456789
    其它没有多大的改动,这里距离可能要根据具体情况进行调节,在方法start_move里面,我把distance调高了点,变成:distance += 25。
    以下是全部代码
    import random
    import time, re
    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    from PIL import Image
    import base64

    '''
    极验验证滑块3.0版本
    '''

    class Binance(object):
    def __init__(self):
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_experimental_option('excludeSwitches', ['enable-automation'])
    self.driver = webdriver.Chrome(chrome_options=chrome_option)
    self.driver.set_window_size(1440, 900)

    def visit_index(self):
    # 输入邮箱和密码
    self.driver.get("https://www.binance.co/login.html")
    email = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((By.ID, 'email')))
    email.clear()
    email.send_keys("xxxxxxxxxx@qq.com")
    pwd = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((By.ID, 'pwd')))
    pwd.clear()
    pwd.send_keys("xxxxxxxxx")

    # 点击登录,弹出滑块验证码
    login_btn = WebDriverWait(self.driver, 10, 0.5).until(EC.element_to_be_clickable((By.ID, 'login-btn')))
    login_btn.click()
    WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_fullbg')))

    # 进入模拟拖动流程
    self.analog_drag()

    def analog_drag(self):

    # 刷新一下极验图片
    element = self.driver.find_element_by_xpath('//a[@class="geetest_refresh_1"]')
    element.click()
    time.sleep(1)

    # 保存两张图片
    self.save_img('full.jpg', 'geetest_canvas_fullbg')
    self.save_img('cut.jpg','geetest_canvas_bg')
    full_image = Image.open('full.jpg')
    cut_image = Image.open('cut.jpg')

    # 根据两个图片计算距离
    distance = self.get_offset_distance(cut_image, full_image)

    # 开始移动
    self.start_move(distance)

    # 如果出现error
    try:
    WebDriverWait(self.driver, 5, 0.5).until(
    EC.presence_of_element_located((By.XPATH, '//div[@class="geetest_slider geetest_error"]')))
    print("验证失败")
    return
    except TimeoutException as e:
    pass

    # 判断是否验证成功
    try:
    WebDriverWait(self.driver, 10, 0.5).until(
    EC.presence_of_element_located((By.XPATH, '//div[@class="geetest_slider geetest_success"]')))
    except TimeoutException:
    print("again times")
    self.analog_drag()
    else:
    print("验证成功")

    def save_img(self, img_name, class_name):
    getImgJS = 'return document.getElementsByClassName("' + class_name + '")[0].toDataURL("image/png");'
    img = self.driver.execute_script(getImgJS)
    base64_data_img = img[img.find(',') + 1:]
    image_base = base64.b64decode(base64_data_img)
    file = open(img_name, 'wb')
    file.write(image_base)
    file.close()

    # 判断颜色是否相近
    def is_similar_color(self, x_pixel, y_pixel):
    for i, pixel in enumerate(x_pixel):
    if abs(y_pixel[i] - pixel) > 50:
    return False
    return True

    # 计算距离
    def get_offset_distance(self, cut_image, full_image):
    for x in range(cut_image.width):
    for y in range(cut_image.height):
    cpx = cut_image.getpixel((x, y))
    fpx = full_image.getpixel((x, y))
    if not self.is_similar_color(cpx, fpx):
    img = cut_image.crop((x, y, x + 50, y + 40))
    # 保存一下计算出来位置图片,看看是不是缺口部分
    img.save("1.png")
    return x

    # 开始移动
    def start_move(self, distance):
    element = self.driver.find_element_by_xpath('//div[@class="geetest_slider_button"]')

    # 这里就是根据移动进行调试,计算出来的位置不是百分百正确的,加上一点偏移
    distance -= element.size.get('width') / 2
    distance += 25

    # 按下鼠标左键
    ActionChains(self.driver).click_and_hold(element).perform()
    time.sleep(0.5)
    while distance > 0:
    if distance > 10:
    # 如果距离大于10,就让他移动快一点
    span = random.randint(5, 8)
    else:
    # 快到缺口了,就移动慢一点
    span = random.randint(2, 3)
    ActionChains(self.driver).move_by_offset(span, 0).perform()
    distance -= span
    time.sleep(random.randint(10, 50) / 100)

    ActionChains(self.driver).move_by_offset(distance, 1).perform()
    ActionChains(self.driver).release(on_element=element).perform()

    if __name__ == "__main__":
    b = Binance()
    b.visit_index()

  • 相关阅读:
    Mermaid 学习
    几个统计学的概念
    MXNet——symbol
    Graphviz 在 Windows 10 下 的 安装 Bug 解决方案
    数据挖掘学习笔记
    Python 黑魔法 --- 描述器(descriptor)
    理解 Python 中的元类
    python 创建项目
    创建 python 虚拟环境
    python开发之路Day17-算法设计(冒泡排序、选择排序、插入排序、二叉树)
  • 原文地址:https://www.cnblogs.com/zzllovehappy/p/11112690.html
Copyright © 2011-2022 走看看