如何通过 Python 解决 AWS 验证码/挑战

Adélia Cruz
Neural Network Developer
04-Dec-2025

简介
你的网络爬虫或自动化任务是否被看似无法克服的AWS WAF(Web应用防火墙)所阻止?这对许多开发人员来说是一个常见的挑战。AWS WAF是亚马逊设计的一种强大的安全服务,用于保护网站免受常见网络攻击和恶意机器人程序的侵害。它通过分析流量模式,使用JavaScript挑战(返回202状态码)和更复杂的图像验证码(返回405状态码)等方法来识别并阻止可疑活动。
虽然这些安全措施对于网站保护至关重要,但它们可能会成为合法自动化脚本的主要障碍。幸运的是,使用正确的工具,您可以有效绕过这些保护。本指南将详细介绍如何使用Python和**CapSolver**轻松获取aws-waf-token,从而无缝访问受AWS WAF保护的网站。
⚙️ 前提条件
在开始之前,请确保准备好以下工具和信息:
- 一个可用的代理服务器:这是解决AWS WAF的关键。强烈建议使用ISP或住宅代理,以避免因IP信誉差而被阻止。
- 已安装的Python:确保您的系统上已安装Python。
- CapSolver API密钥:您需要注册一个CapSolver账户 (注册) 以从仪表板获取API密钥。
🤖 第1步:安装必要的Python包
首先,我们需要安装几个关键的Python库,用于发送HTTP请求和解析HTML。打开终端并执行以下命令:
bash
pip install capsolver requests beautifulsoup4
👨💻 第2步:编写Python代码以解决AWS WAF
以下是在CapSolver的帮助下使用Python解决AWS WAF挑战和验证码的完整代码。该代码基于CapSolver官方文档的最新实践,结构更清晰,并能自动处理两种最常见的阻塞场景。
更新后的Python代码
python
import capsolver
import requests
from bs4 import BeautifulSoup
import re
from urllib.parse import urlparse
# -------------------请修改以下值-------------------
# 代理服务器信息,格式为:http://用户名:密码@IP:端口
PROXY = "http://用户名:密码@IP:端口"
# 您要解决AWS WAF的网站目标URL
PAGE_URL = "https://www.您要访问的AWS保护网站.com"
# 从CapSolver仪表板获取的API密钥
CAPSOLVER_API_KEY = "您的API密钥"
# ---------------------------------------------------
def solve_aws_waf(is_captcha_challenge, **kwargs):
"""
使用CapSolver解决AWS WAF挑战或验证码。
:param is_captcha_challenge: True表示验证码(405状态码),False表示JS挑战(202状态码)。
:param kwargs: 解决任务所需的参数。
:return: 解决方案对象,或在失败时返回None。
"""
task_type = "AntiAwsWafTask" if is_captcha_challenge else "AntiAwsWafTaskProxyLess"
print(f"创建 '{task_type}' 任务...")
task_payload = {
"type": task_type,
"websiteURL": PAGE_URL,
}
# 根据挑战类型添加特定参数
if is_captcha_challenge:
# 对于验证码挑战,需要awsKey、awsIv、awsContext
task_payload.update({
"awsKey": kwargs.get("awsKey"),
"awsIv": kwargs.get("awsIv"),
"awsContext": kwargs.get("awsContext"),
"awsChallengeJS": kwargs.get("awsChallengeJS"),
"proxy": PROXY
})
else:
# 对于JS挑战,只需要awsChallengeJS的URL
task_payload["awsChallengeJS"] = kwargs.get("awsChallengeJS")
try:
solution = capsolver.solve(task_payload)
if solution and solution.get("errorId", 0) == 0:
print("成功获取解决方案!")
return solution
else:
error_desc = solution.get('errorDescription', '未知错误') if solution else '未知错误'
print(f"解决任务失败: {error_desc}")
return None
except Exception as e:
print(f"调用CapSolver时发生异常: {e}")
return None
def main():
"""执行整个过程的主函数。"""
capsolver.api_key = CAPSOLVER_API_KEY
session = requests.Session()
session.proxies = {"http": PROXY, "https": PROXY}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
}
print(f"尝试访问: {PAGE_URL}")
response = session.get(PAGE_URL, headers=headers)
print(f"收到状态码: {response.status_code}")
solution = None
# 场景1:处理AWS JavaScript挑战(状态码202)
if response.status_code == 202:
print("检测到AWS JavaScript挑战。")
soup = BeautifulSoup(response.content, 'html.parser')
script_tag = soup.find('script', {'src': re.compile(r'token\.awswaf\.com')})
if script_tag:
challenge_js_url = script_tag['src']
print(f"找到挑战JS URL: {challenge_js_url}")
solution = solve_aws_waf(is_captcha_challenge=False, awsChallengeJS=challenge_js_url)
else:
print("错误:无法找到AWS挑战脚本。")
# 场景2:处理AWS验证码(状态码405)
elif response.status_code == 405:
print("检测到AWS验证码。")
soup = BeautifulSoup(response.content, 'html.parser')
script_tag = soup.find('script', {'src': re.compile(r'token\.awswaf\.com')})
script_text_tag = soup.find('script', string=re.compile('.*key.*'))
if script_tag and script_text_tag:
challenge_js_url = script_tag['src']
script_text = script_text_tag.string
key = re.search(r'"key":"(.*?)"', script_text).group(1)
iv = re.search(r'"iv":"(.*?)"', script_text).group(1)
context = re.search(r'"context":"(.*?)"', script_text).group(1)
print(f"提取的参数: Key={key[:5]}..., IV={iv[:5]}..., Context={context[:5]}...")
solution = solve_aws_waf(
is_captcha_challenge=True,
awsKey=key,
awsIv=iv,
awsContext=context,
awsChallengeJS=challenge_js_url
)
else:
print("错误:无法从页面中提取所有必需的验证码参数。")
# 如果成功解决,设置cookie并重试请求
if solution and solution.get("cookie"):
aws_token = solution["cookie"]
print(f"成功获取aws-waf-token: {aws_token[:30]}...")
domain = f".{urlparse(PAGE_URL).netloc}"
session.cookies.set("aws-waf-token", aws_token, domain=domain)
print("Cookie已设置。正在重试请求...")
final_response = session.get(PAGE_URL, headers=headers)
print(f"最终请求状态码: {final_response.status_code}")
if final_response.status_code == 200:
print("成功绕过AWS WAF!")
# print(final_response.text) # 取消注释以查看页面内容
else:
print("设置Cookie后请求失败。请检查token或代理。")
else:
print("无法解决AWS WAF。退出。")
if __name__ == "__main__":
main()
⚠️ 需要修改的重要变量
在运行代码之前,请确保修改以下变量:
PROXY: 将其替换为您的代理服务器地址和凭证。格式应为http://用户名:密码@IP:端口。CAPSOLVER_API_KEY: 在**CapSolver仪表板**中找到您的API密钥并替换占位符。PAGE_URL: 将其替换为受AWS WAF保护的目标网站的URL。
结论
通过将CapSolver集成到您的Python自动化流程中,您可以有效处理由AWS WAF触发的JavaScript挑战和验证码。这种方法将复杂的验证过程简化为一次API调用,使您能够专注于核心业务逻辑,而不是陷入与反机器人技术的持续对抗中。这对需要与受AWS WAF保护的网站交互的开发人员来说是一个无价的解决方案。
在为CapSolver账户充值时使用优惠码 CAPN,每次充值可额外获得 5% 的奖励 —— 没有限制。
立即在您的 CapSolver仪表板 中使用它
常见问题(FAQ)
Q1: 为什么必须使用代理?
A1: AWS WAF严格监控IP地址的行为。来自数据中心或被标记为可疑的IP的请求很容易被阻止。使用高质量的住宅或ISP代理可以模拟真实用户的访问行为,这是成功绕过WAF的关键第一步。
Q2: aws-waf-token 有效多久?
A2: 该令牌的有效期通常很短,可能只有几分钟。令牌过期后,您需要重新运行验证流程以获取新令牌。在您的应用程序中设计令牌刷新逻辑非常重要。
Q3: AntiAwsWafTask 和 AntiAwsWafTaskProxyLess 有什么区别?
A3: AntiAwsWafTask 用于解决AWS验证码,需要完整的浏览器环境(通常在405状态码下看到),并且需要您提供代理。AntiAwsWafTaskProxyLess 用于解决较简单的JavaScript挑战(202状态码),在CapSolver的服务器上解决,不需要您提供代理。我们的代码会根据状态码自动选择合适的任务类型。
Q4: 这种方法适用于所有使用AWS WAF的网站吗?
A4: 这种方法对大多数标准AWS WAF配置有效。然而,网站所有者可以自定义WAF规则,这可能会增加绕过难度。如果您遇到问题,请查阅CapSolver文档或联系支持。不同的挑战可能需要不同的策略。
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

如何通过 Python 解决 AWS 验证码/挑战
使用Python和CapSolver处理AWS WAF挑战的实用指南,实现更流畅的访问受保护网站

Adélia Cruz
04-Dec-2025

如何解决 AWS WAF 验证码令牌
本博客解释如何使用 CapSolver 以快速、便宜和简单的方式解决 AWS WAF CAPTCHA

Ethan Collins
01-Dec-2025
![如何使用Puppeteer [JavaScript] 通过CapSolver扩展解决AWS验证码](https://assets.capsolver.com/prod/posts/aws-captcha-solver-puppeteer/5e93a8e9739b4c24ab2f6cbba8563a93.png)
如何使用Puppeteer [JavaScript] 通过CapSolver扩展解决AWS验证码
学习如何使用Puppeteer和Capsolver扩展无缝解决AWS CAPTCHA,一份关于有效设置和自动化CAPTCHA解决方案的详细指南

Ethan Collins
25-Nov-2025

前5名AWS WAF挑战解决工具:企业自动化和网络爬虫
发现解决AWS WAF挑战的前五名工具,实现无缝网页抓取和企业自动化。找到绕过AWS WAF的最佳解决方案。

Aloísio Vítor
07-Nov-2025

如何使用NodeJS解决AWS验证码
在本文中,我们将向您展示如何使用Node.JS解决AWS验证码/挑战。

Ethan Collins
03-Nov-2025

通过浏览器或API集成自动解决AWS WAF验证码
学习如何通过浏览器扩展和API集成自动解决亚马逊云服务WAF验证码。本指南涵盖图像识别、基于令牌的挑战以及CapSolver解决方案,实现无缝自动化和网络爬虫。

Emma Foster
23-Oct-2025


