阿里系纯滑块验证码破解思路

本文分享了使用Selenium破解滑块验证码的经验。由于JS破解较难,推荐用Selenium。以阿里系滑块验证码为例,介绍了破解中易被网站识别的情况,如浏览器最大化、执行滑动动作、send_keys后等,还给出处理逻辑,如刷新页面、用pynput拖动滑块等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

2020.04.13

自古评论区出大神,我也隔了段时间没搞滑块了,下面例子不知道还能用不,推荐热心网友写的解决方案

Selenium反反爬-滑块验证


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)

 

要在Android App中接入HTML5滑块验证,你需要进行以下步骤: 1. 在Android App中嵌入WebView组件用于加载HTML5页面。 2. 在HTML5页面中引入阿里滑块验证码的JS SDK,并初始化验证码。 3. 在Android App中实现WebView的相关回调方法,以便在WebView中与JS交互。 下面是一个简单的实现示例: 1. 在布局文件中添加WebView组件 ``` <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在Activity中加载HTML5页面,并初始化验证码 ``` public class MainActivity extends AppCompatActivity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = findViewById(R.id.web_view); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 初始化阿里滑块验证SDK view.loadUrl("javascript:window.initSlideVerify()"); } }); mWebView.loadUrl("file:///android_asset/index.html"); } // 与JS交互的回调方法 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } } ``` 3. 在HTML5页面中引入阿里滑块验证码的JS SDK,并初始化验证码 ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>滑块验证Demo</title> <script src="https://g.alicdn.com/sd/slide/0.1.4/slide.min.js"></script> </head> <body> <div id="verify-wrap"></div> <script> window.initSlideVerify = function() { var slideVerify = new SlideVerify('#verify-wrap', { mode: 'pop', vOffset: 5, barSize: { width: '100%', height: '50px' }, ready: function() { console.log('滑块验证组件初始化成功!'); }, success: function() { console.log('滑块验证通过!'); // TODO: 在JS中向Android发送验证通过的消息 } }); }; </script> </body> </html> ``` 这样就可以在Android App中接入HTML5滑块验证了。需要注意的是,在JS中向Android发送消息需要通过WebView的`addJavascriptInterface()`方法实现,具体可参考Android官方文档。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值