CAPSOLVER
Blog
Como resolver AWS Captcha / Desafio com Python

Como resolver o desafio AWS / Captcha com Python

Logo of CapSolver

Adélia Cruz

Neural Network Developer

04-Dec-2025

Introdução

Seus tarefas de raspagem de web ou automação estão sendo bloqueadas por um AWS WAF (Firewall de Aplicativos Web) aparentemente insuperável? Este é um desafio comum para muitos desenvolvedores. O AWS WAF é um serviço de segurança poderoso da Amazon projetado para proteger sites contra explorações web comuns e bots maliciosos. Ele identifica e bloqueia atividades suspeitas analisando padrões de tráfego, usando métodos que incluem desafios de JavaScript (retornando um código de status 202) e captchas de imagem mais complexos (retornando um código de status 405).

Embora essas medidas de segurança sejam essenciais para a proteção do site, elas podem ser um grande obstáculo para scripts de automação legítimos. Felizmente, com as ferramentas certas, você pode contornar efetivamente essas proteções. Este guia fornecerá um passo a passo detalhado sobre como usar o Python e CapSolver para obter facilmente o aws-waf-token, permitindo acesso sem interrupções a sites protegidos pelo AWS WAF.

⚙️ Pré-requisitos

Antes de começar, certifique-se de ter as seguintes ferramentas e informações prontas:

  • Um proxy funcional: Isso é crucial para resolver o AWS WAF. É altamente recomendado usar proxies de ISP ou residenciais para evitar ser bloqueado devido a má reputação de IP.
  • Python instalado: Certifique-se de que o Python está instalado no seu sistema.
  • Chave de API do CapSolver: Você precisará de uma conta no CapSolver (Registre-se) para obter sua chave de API no painel.

🤖 Passo 1: Instalar Pacotes Python Necessários

Primeiro, precisamos instalar algumas bibliotecas Python importantes para fazer solicitações HTTP e analisar HTML. Abra seu terminal e execute o seguinte comando:

bash Copy
pip install capsolver requests beautifulsoup4

👨‍💻 Passo 2: Escrever Código Python para Resolver o AWS WAF

O seguinte é o código Python completo para resolver desafios e captchas do AWS WAF usando o CapSolver. Este código baseia-se nas práticas mais recentes da documentação oficial do CapSolver, possui uma estrutura mais limpa e lida automaticamente com os dois cenários mais comuns de bloqueio.

Código Python Atualizado

python Copy
import capsolver
import requests
from bs4 import BeautifulSoup
import re
from urllib.parse import urlparse

# -------------------POR FAVOR MODIFIQUE ESTES VALORES-------------------
# Seus detalhes de proxy no formato: http://username:password@ip:port
PROXY = "http://username:password@ip:port"
# A URL do site alvo que você deseja resolver o AWS WAF
PAGE_URL = "https://www.seu-site-aws-protegido.com"
# Sua chave de API do CapSolver do painel
CAPSOLVER_API_KEY = "SUA_CHAVE_API"
# ----------------------------------------------------------------

def solve_aws_waf(is_captcha_challenge, **kwargs):
    """
    Resolve um desafio AWS WAF ou captcha usando o CapSolver.
    :param is_captcha_challenge: True para um captcha (código de status 405), False para um desafio de JS (código de status 202).
    :param kwargs: Parâmetros necessários para a tarefa de resolução.
    :return: O objeto de solução, ou None em caso de falha.
    """
    task_type = "AntiAwsWafTask" if is_captcha_challenge else "AntiAwsWafTaskProxyLess"
    print(f"Criando tarefa '{task_type}'...")
    
    task_payload = {
        "type": task_type,
        "websiteURL": PAGE_URL,
    }
    
    # Adicione parâmetros específicos com base no tipo de desafio
    if is_captcha_challenge:
        # Para desafios de captcha, são necessários 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:
        # Para desafios de JS, apenas a URL awsChallengeJS é necessária
        task_payload["awsChallengeJS"] = kwargs.get("awsChallengeJS")

    try:
        solution = capsolver.solve(task_payload)
        if solution and solution.get("errorId", 0) == 0:
            print("Solução obtida com sucesso!")
            return solution
        else:
            error_desc = solution.get('errorDescription', 'Erro desconhecido') if solution else 'Erro desconhecido'
            print(f"Falha ao resolver a tarefa: {error_desc}")
            return None
    except Exception as e:
        print(f"Ocorreu uma exceção ao chamar o CapSolver: {e}")
        return None

def main():
    """Função principal para executar todo o processo."""
    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"Tentando acessar: {PAGE_URL}")
    response = session.get(PAGE_URL, headers=headers)
    print(f"Código de status recebido: {response.status_code}")

    solution = None
    
    # Cenário 1: Tratar desafio JavaScript do AWS (Código de status 202)
    if response.status_code == 202:
        print("Desafio JavaScript do AWS detectado.")
        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"Encontrada URL do desafio JS: {challenge_js_url}")
            solution = solve_aws_waf(is_captcha_challenge=False, awsChallengeJS=challenge_js_url)
        else:
            print("Erro: Não foi possível encontrar o script de desafio AWS.")

    # Cenário 2: Tratar Captcha do AWS (Código de status 405)
    elif response.status_code == 405:
        print("Captcha do AWS detectado.")
        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"Parâmetros extraídos: Chave={key[:5]}..., IV={iv[:5]}..., Contexto={context[:5]}...")
            solution = solve_aws_waf(
                is_captcha_challenge=True,
                awsKey=key,
                awsIv=iv,
                awsContext=context,
                awsChallengeJS=challenge_js_url
            )
        else:
            print("Erro: Falha ao extrair todos os parâmetros necessários do captcha da página.")

    # Se resolvido com sucesso, defina o cookie e tente novamente a solicitação
    if solution and solution.get("cookie"):
        aws_token = solution["cookie"]
        print(f"Obtido com sucesso o aws-waf-token: {aws_token[:30]}...")
        
        domain = f".{urlparse(PAGE_URL).netloc}"
        session.cookies.set("aws-waf-token", aws_token, domain=domain)
        
        print("Cookie definido. Tentando novamente a solicitação...")
        final_response = session.get(PAGE_URL, headers=headers)
        print(f"Código de status da solicitação final: {final_response.status_code}")
        
        if final_response.status_code == 200:
            print("Bypass do AWS WAF realizado com sucesso!")
            # print(final_response.text) # Remova o comentário para ver o conteúdo da página
        else:
            print("A solicitação falhou após definir o cookie. Verifique o token ou o proxy.")
    else:
        print("Falha ao resolver o AWS WAF. Saindo.")

if __name__ == "__main__":
    main()

⚠️ Variáveis Importantes a Modificar

Antes de executar o código, certifique-se de modificar as seguintes variáveis:

  • PROXY: Substitua esta variável pelo endereço e credenciais do seu servidor proxy. O formato deve ser http://username:password@ip:port.
  • CAPSOLVER_API_KEY: Encontre sua chave de API no Painel do CapSolver e substitua o espaço reservado.
  • PAGE_URL: Substitua esta variável pela URL do site alvo protegido pelo AWS WAF.

Conclusão

Ao integrar o CapSolver ao seu fluxo de automação Python, você pode lidar efetivamente com desafios de JavaScript e captchas disparados pelo AWS WAF. Este método simplifica um processo de verificação complexo em uma única chamada de API, permitindo que você se concentre na lógica do seu negócio em vez de se envolver em uma batalha constante com tecnologias anti-bot. Esta é uma solução valiosa para qualquer desenvolvedor que precise interagir com sites protegidos pelo AWS WAF.

Use o código de bônus CAPN ao recarregar sua conta do CapSolver para obter um bônus adicional de 5% em cada recarga — sem limites.
Redeeme-o agora no seu Painel do CapSolver

Perguntas Frequentes (FAQ)

Q1: Por que devo usar um proxy?
A1: O AWS WAF monitora estritamente o comportamento dos endereços IP. Solicitações de centros de dados ou IPs marcados como suspeitos são facilmente bloqueadas. Usar um proxy de alta qualidade residencial ou de ISP imita o comportamento de acesso de um usuário real e é um passo crítico para superar com sucesso o WAF.

Q2: Quanto tempo o aws-waf-token é válido?
A2: A validade deste token é geralmente muito curta, possivelmente apenas alguns minutos. Após a expiração do token, você precisa executar novamente o processo de verificação para obter um novo. É importante projetar uma lógica de atualização de token em seu aplicativo.

Q3: Qual é a diferença entre AntiAwsWafTask e AntiAwsWafTaskProxyLess?
A3: AntiAwsWafTask é usado para resolver o captcha do AWS, que requer um ambiente de navegador completo (normalmente visto com um código de status 405) e precisa de um proxy fornecido por você. AntiAwsWafTaskProxyLess é usado para o desafio mais simples de JavaScript (código de status 202), que é resolvido nos servidores do CapSolver e não requer que você forneça um proxy. Nosso código seleciona automaticamente o tipo de tarefa apropriado com base no código de status.

Q4: Este método funciona para todos os sites que usam o AWS WAF?
A4: Este método é eficaz para a maioria das configurações padrão do AWS WAF. No entanto, os proprietários de sites podem personalizar as regras do WAF, o que pode aumentar a dificuldade de contorná-las. Se você encontrar problemas, consulte a documentação ou o suporte do CapSolver. Diferentes desafios podem exigir estratégias diferentes.

Declaração de Conformidade: As informações fornecidas neste blog são apenas para fins informativos. A CapSolver está comprometida em cumprir todas as leis e regulamentos aplicáveis. O uso da rede CapSolver para atividades ilegais, fraudulentas ou abusivas é estritamente proibido e será investigado. Nossas soluções de resolução de captcha melhoram a experiência do usuário enquanto garantem 100% de conformidade ao ajudar a resolver dificuldades de captcha durante a coleta de dados públicos. Incentivamos o uso responsável de nossos serviços. Para mais informações, visite nossos Termos de Serviço e Política de Privacidade.

Mais