CAPSOLVER
博客
如何使用Python解决AWS验证码/挑战

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

Logo of CapSolver

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: AntiAwsWafTaskAntiAwsWafTaskProxyLess 有什么区别?
A3: AntiAwsWafTask 用于解决AWS验证码,需要完整的浏览器环境(通常在405状态码下看到),并且需要您提供代理。AntiAwsWafTaskProxyLess 用于解决较简单的JavaScript挑战(202状态码),在CapSolver的服务器上解决,不需要您提供代理。我们的代码会根据状态码自动选择合适的任务类型。

Q4: 这种方法适用于所有使用AWS WAF的网站吗?
A4: 这种方法对大多数标准AWS WAF配置有效。然而,网站所有者可以自定义WAF规则,这可能会增加绕过难度。如果您遇到问题,请查阅CapSolver文档或联系支持。不同的挑战可能需要不同的策略。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多