zoukankan      html  css  js  c++  java
  • 阿里系纯滑块验证码破解思路

    本文旨在经验交流,如若侵犯利益,请联系删除。


    2019.09.10

    下面的例子已经改为阿里的人机认证了,但是其实用selenium启动浏览器后,依旧可以用pynput来操控键鼠来完成模拟操作,单纯调用send_keys()和click()都会被识别出来了。webdriver参数太多了,有兴趣的可以考虑puppeteer来实现。


    阿里系滑块验证码以nc_1开头,通过调用XXXnc.js来实现。

    给个例子,视觉中国的登陆页面www.vcg.com/login

    对于这样的验证码,进行JS破解是比较难得,所以应该通过selenium进行破解。

    在破解过程中会遇到被网站识别出来,一般都是send_keys后面再拖动再点击登陆,但是这样大部分不行的,多半是阿里的js识别出来了。

    大抵是出现:

    浏览器最大化时被识别

    执行滑动的action被识别

    send_keys后被识别

    处理逻辑是:

    打开浏览器后,最大化后get(url)再刷新页面。

    滑动滑块不能利用webdriver,利用pynput这个模块去做拖动操作,这个库是比较底层的,调用win32。之前使用pyautogui发现不行,估计被封装多次,已经被识别出来了

    from pynput.mouse import Button, Controller as c1

    send_keys应该在滑块拖动之后,这样不会被识别了

    import json
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from pynput.keyboard import Key, Controller as c2
    from pynput.mouse import Button, Controller as c1
    
    class vcg_get_cookies():
        mouse = c1()
        url = 'https://www.vcg.com/login'
        options = webdriver.ChromeOptions()
        # 不加载图片,加快访问速度
        options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
        # 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 添加本地代理
        # options.add_argument("--proxy--server=127.0.0.1:8080")
        # 添加UA
        ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
        options.add_argument('user-agent=' + ua)
    
        driver = webdriver.Chrome(executable_path="D:chromedriver.exe", options=options)
        driver.maximize_window()
        wait = WebDriverWait(driver, 10)
        driver.get(url)
        time.sleep(3)
        driver.refresh()
        while True:
            # pyautogui.press('f5')
            # keyboard.press(Key.f5)
            driver.refresh()
            time.sleep(3)
            mouse.position = (1562, 355)
            mouse.press(Button.left)
            mouse.move(1890, 358)
            mouse.release(Button.left)
            time.sleep(3)
            WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.CLASS_NAME, 'nc-lang-cnt')))
            if driver.find_element_by_class_name('nc-lang-cnt').text == '验证通过':
                break
    
        time.sleep(2)
        driver.find_element_by_name('id').send_keys('用户名')
        time.sleep(2)
        driver.find_element_by_name('password').send_keys('密码')
        driver.find_element_by_class_name('sign-in-form__btn').click()
        time.sleep(5)
        user_name = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'userInfo')))
        print(user_name)
        cookies = driver.get_cookies()  # Selenium为我们提供了get_cookies来获取登录cookies
        driver.close()  # 获取cookies便可以关闭浏览器
        # 然后的关键就是保存cookies,之后请求从文件中读取cookies就可以省去每次都要登录一次的
        # 当然可以把cookies返回回去,但是之后的每次请求都要先执行一次login没有发挥cookies的作用
        jsonCookies = json.dumps(cookies)  # 通过json将cookies写入文件
        with open('vcgCookies.json', 'w') as f:
            f.write(jsonCookies)
        print(cookies)
  • 相关阅读:
    如何简单的理解LSTM——其实没有那么复杂(转载)
    关于梯度爆炸和梯度消失的详解(转载)
    通俗易懂---反向传播(转载)
    pandas读取csv文件中文乱码问题
    python安装imblearn(PackageNotFoundError: ''Package missing in current channels")
    python中的虚拟环境(在jupyter和pycharm中的使用)
    关于阻塞/非阻塞、同步/非同步、死锁
    关于synchronize与lock的区别
    为什么volatile能保证有序性不能保证原子性
    索引以及Mysql中的索引
  • 原文地址:https://www.cnblogs.com/triangle959/p/12024358.html
Copyright © 2011-2022 走看看