使用EzCaptcha轻松绕过TLS检测的完整指南

67 阅读10分钟

1. 引言

在如今不断进化的网站防护体系中,自动化测试与爬虫常面临两大主要难题:首先是基于TLS握手数据生成的​TLS指纹检测​,用于识别非正常客户端;其次,当流量被怀疑为自动化时,往往会触发验证码(如reCAPTCHA、Akamai等)的挑战以进一步验证用户身份。本文旨在为初级开发者提供一套​技术实现指南​,介绍如何利用自动化验证码服务EzCaptcha来解决验证码挑战,并结合模拟真实浏览器TLS指纹的技术,从而在绕过TLS检测的同时,确保自动化流程的继续运行。


2. TLS指纹检测基础

TLS指纹是指在建立HTTPS连接时,客户端在TLS握手阶段发送的Client Hello消息中包含的加密套件、扩展信息和其他参数的特征参数。由于不同浏览器、操作系统和设备所支持的加密算法各有差异,网站防护系统可以通过对这些特征的哈希处理生成一个“指纹”,用以验证访问请求是否来自正常用户。

例如,当一个自动化工具使用默认的请求库时,其发送的TLS握手信息可能与真实浏览器大相径庭,导致被检测到并被进一步触发验证码挑战或直接封禁。为了绕过这一检测机制,模拟真实浏览器的TLS指纹便成为了关键步骤之一。


3. 模拟浏览器TLS指纹技术

为避免被TLS检测识别,自动化工具需要模拟真实浏览器发起TLS握手的参数。常用的方法有以下两种:

  1. 使用具有模拟功能的网络请求库 例如,Python的curl_cffi库支持通过impersonate参数模拟Chrome或Edge等主流浏览器的TLS指纹,从而使请求在TLS握手阶段发送与真实浏览器一致的信息。

    • 安装方法:
      pip install curl_cffi
      
    • 示例代码片段:
      from curl_cffi import requests  session = requests.Session()  url = "https://目标网站.com"  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..."}  # 使用 impersonate 参数模拟 chrome124 浏览器的TLS指纹  response = session.get(url, headers=headers, impersonate="chrome124", verify=False)
      

    这种方法可以较好地隐藏自动化工具的真实身份,提高绕过TLS指纹检测的成功率。

  2. 利用浏览器自动化工具(如Selenium) 通过启动真实浏览器,如Chrome或Edge,自动化脚本自然会生成真实的TLS握手信息。然而,这种方法一般资源占用较大,并且配置代理或修改TLS参数较为复杂。

通过以上方法,可以保证自动化请求在TLS握手阶段产生与正常用户一致的指纹,从而降低被检测的风险。


4. EzCaptcha简介与API集成

4.1 EzCaptcha简介

EzCaptcha是一款专注于自动化验证码求解的服务平台,利用先进的机器学习、OCR以及人工求解相结合的技术,支持多种验证码类型,如reCAPTCHA v2/v3、Akamai验证码、FunCaptcha等。其主要优势包括:

  • 高准确率​:部分技术实现准确率可达99%
  • 灵活的API接口​:便于用户集成到各种自动化脚本中
  • 高可用性​:设计上支持高并发请求,确保在高流量情况下依然稳定运行

4.2 EzCaptcha API集成步骤

使用EzCaptcha的自动求解能力主要包括以下几个步骤:

  1. 准备请求参数 需要从目标页面获取相关参数,包括目标页面URL、v3脚本URL、最新的bm_sz和_abck cookie值、用户代理(User-Agent)、语言、以及验证码相关的JavaScript脚本Base64编码值。

  2. 创建任务请求 通过调用EzCaptcha提供的同步任务创建API:

    POST https://sync.ez-captcha.com/createSyncTask
    

    请求体示例(JSON格式):

    {  
        "clientKey": "YourClientKey",  
        "task": {  
            "type": "AkamaiWEBTaskProxyless",  
            "pageUrl": "目标网站URL",  
            "v3Url": "动态获取的v3脚本URL",  
            "bmsz": "最新的bm_sz值",  
            "abck": "最新的_abck值",  
            "ua": "Chrome的User-Agent",  
            "lang": "en-GB",  
            "script_base64": "验证码JS脚本的Base64编码(首次请求)",  
            "index": 0,  
            "encodeData": ""  
        }  
    }
    

    该请求会返回payload和encodedata,其中payload即为后续需要发送的sensor_data。

  3. 任务结果处理 在获得返回结果后,根据其中的payload数据进行后续传递,并对验证码进行验证。若遇到验证码求解失败的情况,系统设计了重试机制(最多可重试至八次)进行应急处理.


4.3 EzCaptcha API调用示例代码

下面展示一段基于Python以及curl_cffi库的示例代码(部分内容基于Akamai文档示例改编),用于说明如何调用EzCaptcha接口求解验证码,并继续后续请求处理:

import base64  
from curl_cffi import requests  
import json  
import time  

def solve_captcha():  
    # 目标页面与v3脚本URL  
    url = "https://目标网站.com"  
    v3_url = "https://目标网站.com/v3_script.js"  
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"  
    client_key = "YourClientKey"  
    proxies = {}  # 可根据需要配置代理  

    # 设置请求头  
    headers = {  
        "User-Agent": user_agent,  
        "Accept-Language": "en-GB,en;q=0.9"  
    }  

    try:  
        session = requests.Session()  
        # 模拟真实浏览器TLS指纹,使用 impersonate 模式  
        resp1 = session.get(url, headers=headers, proxies=proxies, verify=False, impersonate="chrome124")  
        # 请求v3脚本,获取验证码JavaScript文件  
        resp2 = session.get(v3_url, headers=headers, proxies=proxies, verify=False, impersonate="chrome124")  
        # 从响应中提取cookies  
        bm_sz_cookie = session.cookies.get('bm_sz', '')  
        abck_cookie = session.cookies.get('_abck', '')  
        # Base64编码v3脚本内容(仅在第一次请求时提供)  
        script_base64 = base64.b64encode(resp2.content).decode('utf-8')  

        # 构造EzCaptcha任务请求payload  
        payload = {  
            "clientKey": client_key,  
            "task": {  
                "type": "AkamaiWEBTaskProxyless",  
                "pageUrl": url,  
                "v3Url": v3_url,  
                "bmsz": bm_sz_cookie,  
                "abck": abck_cookie,  
                "ua": user_agent,  
                "lang": "en-GB",  
                "script_base64": script_base64,  
                "index": 0,  
                "encodeData": ""  
            }  
        }  

        # 发送任务请求  
        ez_url = "https://sync.ez-captcha.com/createSyncTask"  
        response = session.post(ez_url, json=payload, proxies=proxies, verify=False, timeout=10)  
        result = json.loads(response.text)  
        solution = result.get("solution", {})  
        encodedata = solution.get("encodedata", "")  
        sensor_data = solution.get("payload", "")  
        print("验证码求解结果:", sensor_data)  

        # 若需要发送后续请求传递sensor_data,则在此处调用相关逻辑,重试机制可根据需求实施  
        for count in range(1, 9):  
            # 调用v3接口发送sensor_data,实现验证码验证后的后续操作  
            response_next = session.post(v3_url, headers=headers, json={'sensor_data': sensor_data},  
                                         proxies=proxies, verify=False, impersonate="chrome124")  
            ret_cookie = session.cookies.get('_abck', '')  
            print(f"第{count}次尝试后得到的_abck cookie:", ret_cookie)  

            # 此处根据业务逻辑判断是否验证码已经解决  
            if ret_cookie and ret_cookie != "-1":  
                print("验证码验证成功,继续后续请求处理。")  
                break  
            time.sleep(1)  
        else:  
            print("验证码求解失败,超出最大重试次数。")  
    except Exception as e:  
        print("请求出错:", e)  

if __name__ == "__main__":  
    solve_captcha()

该代码示例中,我们使用了curl_cffi库模拟真实的Chrome浏览器TLS指纹,调用EzCaptcha API创建验证码求解任务,并通过重试机制检查验证码验证结果的有效性。


5. 综合示例:绕过TLS检测与验证码挑战

在实际应用中,目标网站可能同时采用TLS指纹检测和验证码防护来阻止自动化工具。下面提供一个​综合流程图​,展示如何将上述技术结合到一起,实现完整的绕过流程。

5.1 综合流程图

下面的流程图描述了整个绕过过程:从初始请求、TLS指纹模拟、验证码触发、到调用EzCaptcha接口并验证响应,最后提交正常请求。

flowchart TD  
    A["启动自动化请求"]  
    B["使用curl_cffi模拟Chrome TLS指纹"]  
    C["发送初始请求至目标网站"]  
    D["检测响应是否包含验证码触发"]  
    E["如果验证码出现,调用EzCaptcha API创建任务"]  
    F["接收EzCaptcha返回的验证码解决结果"]  
    G["提交验证码答案,获取更新的cookie"]  
    H["正常访问目标页面"]  
    A --> B  
    B --> C  
    C --> D  
    D -- "有验证码" --> E  
    D -- "无验证码" --> H  
    E --> F  
    F --> G  
    G --> H  
    H --> END["结束"]

图 1:绕过TLS检测与验证码挑战的综合流程图

5.2 综合示例说明

  • 步骤1-3​:脚本启动后,利用curl_cffi模拟真实浏览器的TLS指纹发送请求,确保TLS握手信息与正常浏览器一致,从而通过初步检测。
  • 步骤4​:当目标网站因异常流量触发验证码时,系统检测到验证码页面。
  • 步骤5-7​:调用EzCaptcha接口创建任务,等待自动求解,返回的验证码答案(payload)通过后续请求传递,更新cookie验证结果。
  • 步骤8​:验证码验证成功后,自动化工具继续正常访问目标页面,完成绕过全过程。

6. 注意事项与最佳实践

在实施该技术方案时,需要注意以下几点:

注意事项说明
代理轮换建议结合代理IP动态轮换,防止同一IP频繁请求被列入黑名单。
模拟人类行为在自动化流程中加入随机延时、鼠标移动轨迹等措施,降低触发检测风险。
错误重试机制对验证码请求及验证失败时使用重试策略,确保误差最小化。
TLS指纹一致性配置请求库或浏览器时务必使用最新版本的Chrome User-Agent,确保TLS握手参数稳定。
合规性与隐私所有操作须基于合法授权,确保不违反网站使用条款和地区法律法规。

表 1:绕过TLS与验证码时的注意事项对比表

此外,还需注意:

  • 日志监控​:在整个自动化流程中,记录每次请求、验证码求解及重试日志,有助于后续调试与安全审计。
  • 证书与安全性​:当使用中间人技术或TLS模拟时,必须确保数据传输加密,杜绝安全隐患。
  • 开发环境测试​:建议在测试环境中充分验证各项参数设置后,再应用到正式环境中。

7. 结论

本文详细介绍了如何结合模拟浏览器TLS指纹技术和EzCaptcha验证码求解服务,构建一个完整的绕过TLS检测与验证码挑战的自动化流程。主要结论如下:

  • TLS指纹检测​:网站通过解析客户端发送的加密套件与扩展特征生成指纹,从而识别自动化工具,必须采用模拟真实浏览器的TLS握手参数来绕过此检测。
  • 模拟技术​:通过使用支持impersonate参数的curl_cffi请求工具,可以有效模拟Chrome浏览器的TLS指纹,降低异常检测风险。
  • EzCaptcha服务优势​:EzCaptcha提供的自动验证码求解API能够迅速、准确地解决验证码挑战,整合到自动化流程中后,可实现验证码任务的自动化处理,同时具备错误重试和动态响应机制。
  • 综合防护方案​:将代理轮换、模拟人类行为(如随机延时、鼠标轨迹)与上述技术相结合,可以建立一个更为稳健和灵活的绕过方案,有效应对复杂的防护检测系统。

关键发现总结:

  • TLS指纹作为检测自动化流量的重要依据,要求请求参数与真实浏览器保持一致。
  • 模拟浏览器TLS指纹技术(如使用curl_cffi)是绕过TLS检测的可行方案。
  • EzCaptcha的自动验证码求解能力可有效降低验证码带来的自动化中断风险。
  • 结合代理轮换与行为模拟等技术,能大幅提高整体绕过检测的成功率与系统稳定性。

通过本文的技术实现指南,初级开发者可以借助现有工具与示例代码,逐步完善自身自动化应用的防护绕过策略,以应对日趋严苛的网络安全检测要求。


以上所有技术细节和代码示例均基于EzCaptcha服务文档及相关安全检测资料整理而成.