1. 引言
在如今不断进化的网站防护体系中,自动化测试与爬虫常面临两大主要难题:首先是基于TLS握手数据生成的TLS指纹检测,用于识别非正常客户端;其次,当流量被怀疑为自动化时,往往会触发验证码(如reCAPTCHA、Akamai等)的挑战以进一步验证用户身份。本文旨在为初级开发者提供一套技术实现指南,介绍如何利用自动化验证码服务EzCaptcha来解决验证码挑战,并结合模拟真实浏览器TLS指纹的技术,从而在绕过TLS检测的同时,确保自动化流程的继续运行。
2. TLS指纹检测基础
TLS指纹是指在建立HTTPS连接时,客户端在TLS握手阶段发送的Client Hello消息中包含的加密套件、扩展信息和其他参数的特征参数。由于不同浏览器、操作系统和设备所支持的加密算法各有差异,网站防护系统可以通过对这些特征的哈希处理生成一个“指纹”,用以验证访问请求是否来自正常用户。
例如,当一个自动化工具使用默认的请求库时,其发送的TLS握手信息可能与真实浏览器大相径庭,导致被检测到并被进一步触发验证码挑战或直接封禁。为了绕过这一检测机制,模拟真实浏览器的TLS指纹便成为了关键步骤之一。
3. 模拟浏览器TLS指纹技术
为避免被TLS检测识别,自动化工具需要模拟真实浏览器发起TLS握手的参数。常用的方法有以下两种:
-
使用具有模拟功能的网络请求库 例如,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指纹检测的成功率。
- 安装方法:
-
利用浏览器自动化工具(如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的自动求解能力主要包括以下几个步骤:
-
准备请求参数 需要从目标页面获取相关参数,包括目标页面URL、v3脚本URL、最新的bm_sz和_abck cookie值、用户代理(User-Agent)、语言、以及验证码相关的JavaScript脚本Base64编码值。
-
创建任务请求 通过调用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。
-
任务结果处理 在获得返回结果后,根据其中的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服务文档及相关安全检测资料整理而成.