CAPSOLVER
博客
如何使用官方SDK在Go中解决AWS WAF CAPTCHA

如何使用官方 SDK 在 Go 中解决 AWS WAF CAPTCHA

Logo of CapSolver

Nikolai Smirnov

How to use CapSolver

17-Sep-2026

简要说明

  • 官方 Go SDK 可以提交一个记录的 AntiAwsWafTask 并返回 AWS WAF CAPTCHA 结果。
  • 该任务使用一个自有页面 URL 和代理;可选的挑战字段应遵循当前任务文档。
  • 在此处使用的版本中,需显式将 SDK API 主机设置为 HTTPS,并应用 HTTP 请求超时。
  • 在检查错误、就绪状态和非空解决方案后,通过 result.Solution.Cookie 读取结果。
  • 本地 HTTP 模拟测试验证了示例的请求和响应行为;未对实际 AWS WAF 解决方案和应用接受情况进行测试。

在 Go 中集成 AWS WAF CAPTCHA 有两个独立的责任:向求解器请求记录的结果,然后在被测试的应用程序中正确使用该结果。官方 SDK 处理 API 交互,但它无法决定您的应用程序是否接受了完成的尝试。

本教程使用 CapSolver 进行自有 AWS WAF 测试页面。它专注于安装 Go 模块、构建任务、处理返回的 cookie 以及理解 SDK 的传输行为。本指南不假设在一个域上接受的令牌适用于另一个域。

Go SDK 处理什么?

Go SDK 将任务创建和结果检索封装在其 Solve 方法中。API 库 将这些调用打包为语言级方法,但您仍需要正确的任务参数和应用程序逻辑。

官方 AWS WAF 任务文档 描述了 AntiAwsWafTask 及其 solution.cookie 结果。Go SDK 将响应公开为包含 Solution 指针的 CapSolverResponse。这种区别很重要:Solve 不会直接返回 cookie 字符串。

本教程的预期流程是:

  1. 打开自有测试页面并识别 AWS WAF 挑战上下文。
  2. 提供该页面 URL、所需的代理和求解 API 密钥。
  3. 调用 SDK 并检查返回的响应。
  4. 将 cookie 值传递给同一授权的应用程序测试。
  5. 断言应用程序的实际结果。

AWS 将其令牌描述为 AWS WAF 智能威胁缓解 的一部分。将结果视为与特定尝试相关,而不是永久访问应用程序的权限。

步骤 1:安装官方 Go 模块

创建一个小型 Go 模块并固定此示例中使用的 SDK 版本。该包发布在 官方 CapSolver Go 仓库 中。

bash 复制代码
mkdir capsolver-aws-waf-example
cd capsolver-aws-waf-example
go mod init capsolver-aws-waf-example
go get github.com/capsolver/capsolver-go@v0.0.0-20251204081438-e4e07af23eae

该示例使用 Go 1.27.1 编译,并执行了本地测试。长版本号是标识特定提交的 Go 伪版本。固定它使 SDK 源代码可重复;这不是推荐忽略未来上游修复的建议。

保留生成的 go.modgo.sum 文件。标准 Go 依赖管理文档 解释了这些文件和版本选择。升级 SDK 时,重新运行覆盖请求字段和响应处理的测试。

此安装准备了客户端库。它不会提供 AWS WAF 测试页面、购买求解信用或配置代理。这些都是真实求解的独立前提条件。

步骤 2:准备三个必需的设置

示例从环境变量中读取自有页面 URL、代理字符串和求解 API 密钥。

变量 要提供的值
OWNED_WAF_URL 您拥有或被授权测试的 AWS WAF 页面的 URL
CAPSOLVER_PROXY 按照任务文档格式化的代理
CAPSOLVER_API_KEY 您 CapSolver 账户的求解 API 密钥

这些变量名称属于示例;它们不是额外的 API 任务字段。Go 代码将它们映射到 websiteURLproxy 和 SDK 客户端的 ApiKey

使用您的正常密钥管理器或开发环境提供凭据。不要将真实密钥粘贴到提交的源代码中,也不要将内容管理凭据替换为求解密钥。代理凭据应受到相同的重视。

选择特定的自有 URL 以产生挑战。通用主页可能无法提供不同路由测试所需上下文。保持应用程序会话和网络配置与测试设计一致,而不是将求解结果视为与需要它的请求无关。

步骤 3:设置 HTTPS 并提交任务

将以下代码保存为 main.go。其任务映射和 Solve 调用遵循官方 SDK 和任务示例。环境检查、显式 HTTPS 主机、超时和就绪 cookie 检查是此小型程序的附加内容。本地 HTTP 模拟测试了 SDK;实际求解需要您的求解密钥、代理和自有页面,但未执行。

go 复制代码
package main

import (
    "errors"
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    capsolver_go "github.com/capsolver/capsolver-go"
)

func solveAWS(pageURL, proxy, key string) (*capsolver_go.CapSolverResponse, error) {
    if pageURL == "" || proxy == "" || key == "" {
        return nil, errors.New("set OWNED_WAF_URL, CAPSOLVER_PROXY and CAPSOLVER_API_KEY")
    }
    client := capsolver_go.CapSolver{ApiKey: key}
    result, err := client.Solve(map[string]any{
        "type": "AntiAwsWafTask",
        "websiteURL": pageURL,
        "proxy": proxy,
    })
    if err != nil {
        return nil, err
    }
    if result == nil || result.Status != "ready" ||
        result.Solution == nil || result.Solution.Cookie == "" {
        return nil, errors.New("no ready AWS WAF cookie result")
    }
    return result, nil
}

func main() {
    capsolver_go.ApiHost = "https://api.capsolver.com"
    http.DefaultClient.Timeout = 20 * time.Second
    result, err := solveAWS(
        os.Getenv("OWNED_WAF_URL"),
        os.Getenv("CAPSOLVER_PROXY"),
        os.Getenv("CAPSOLVER_API_KEY"),
    )
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("AWS WAF result status:", result.Status)
    // result.Solution.Cookie 属于此授权测试尝试。
}

在固定版本的 SDK 源中,默认主机回退到 HTTP URL。将 capsolver_go.ApiHost 显式分配为 https://api.capsolver.com 会在请求中选择该主机,然后携带您的求解凭证。

SDK 使用 Go 的默认 HTTP 客户端。因此,设置 http.DefaultClient.Timeout 为此独立示例应用请求超时。它还会更改该进程范围的客户端:如果您将 SDK 嵌入到更大的应用程序中,请检查对默认客户端其他用户的影响。

20 秒的值是一个示例设置,不是服务完成保证或整个任务的截止时间。SDK 在检索结果时可能发出多个 HTTP 请求。每个请求有超时时间并不意味着完整的 Solve 调用是 20 秒的操作。

Go net/http 文档 描述了客户端超时行为。包装器不暴露基于上下文的取消参数,因为此处显示的 SDK 方法不接受它。

领取您的 CapSolver 奖励代码

立即提升您的自动化预算!
在充值 CapSolver 账户时使用奖励代码 CAP26,每次充值可获得额外 5% 奖励 —— 无限制。
立即在您的 CapSolver 仪表板 中领取
奖励代码

步骤 4:运行程序并检查结果

在提供三个环境设置后运行程序。此实时命令仍需要使用您的自有页面进行验证;记录的测试使用了本地 HTTP 模拟:

bash 复制代码
go run .

当 SDK 返回带有非空 cookie 的就绪响应时,程序会打印响应状态。它故意不打印 cookie 本身。该值在 result.Solution.Cookie 中可用,供您自有测试中继续应用程序流程的部分使用。

solveAWS 中有三个不同的检查。Go 错误会使调用失败。缺失或非就绪的响应会失败包装器的就绪检查。空的解决方案或空的 cookie 会失败结果内容检查。这可防止调用代码仅因返回指针而继续。

状态打印不是成功的应用程序断言。在测试运行器中使用返回值后添加最终检查。如果页面仍显示挑战,请保留观察到的阶段和相关提供者错误信息,而不是将打印的状态视为页面接受尝试的证明。

示例未实现 HTTP cookie jar 或浏览器自动化层。这些取决于您的应用程序如何创建和维护测试会话。避免添加猜测的 cookie 域或全局头,将值应用于不相关的请求。

何时需要可选的 AWS WAF 字段?

可选字段在实际挑战上下文和当前任务文档需要它们时才相关。AWS WAF 任务指南包括 awsKeyawsIvawsContextawsChallengeJS 等字段,用于记录的情况。

从与您的页面和受支持的任务类型匹配的请求开始。如果服务报告缺少所需上下文,请检查自有页面上的当前挑战并遵循相应的文档。不要简单地将占位符值插入每个可选字段以使 JSON 看起来完整。

挑战数据应属于当前尝试。将一个测试的页面 URL 与从不同页面或时间保存的挑战参数混合会使请求更难推理。请求可以语法正确,但其输入可能描述不兼容的上下文。

更广泛的 AWS WAF CAPTCHA 指南 解释了任务家族。此 Go 示例增加了对响应封装和 HTTP 行为的语言特定处理;它不更改所需的挑战信息。

应用程序应如何使用返回的 cookie?

应用程序应仅在获得该 cookie 的授权测试上下文中使用它。AWS 文档 记录了令牌域和域列表,这会影响令牌可被接受的位置。

对于自有集成测试,请记录目标主机和与结果相关的尝试。让应用程序特定的客户端或浏览器层管理其预期的 cookie 范围。不要假设返回的字符串应复制到爬虫或代理访问的每个主机。

一个有用的成功检查回答两个问题:提供者是否返回了预期的结果结构,以及应用程序是否接受了后续操作?保留这两个结果。如果第一个成功而第二个失败,请调查域、会话、时间以及应用程序响应,而不是将每次拒绝标记为 SDK 传输失败。

SDK 不实现 AWS 访问策略或更改您的 Web ACL。您的应用程序的 WAF 配置仍然控制请求处理。

本地测试验证了什么?

该示例在使用真实固定 SDK 的本地 HTTP 模拟上运行。测试检查了传出的任务映射、直接就绪响应、创建后轮询响应、提供者错误、损坏的 JSON、缺失的 cookie 和缺失的设置。

该测试范围比实际求解更窄。模拟提供了自己的 cookie 值,没有实际的 AWS WAF 页面接受它。测试确认了 Go 包装器与安装的 SDK 的交互以及处理这些响应格式。它们不确认实际服务兼容性或求解成功率。

在扩展客户端时,有一个源细节值得关注:固定 SDK 使用 ClientKey 序列化其凭证,而 REST 示例显示 clientKey。本地模拟记录了 SDK 实际发送的内容;它不证明实时端点接受的大小写。在诊断真实请求时,保持此区别可见,并在更改 SDK 内部之前咨询上游支持。

对于首次实际检查,请使用单个代表性的自有页面、有效的求解密钥和记录的代理设置。验证返回的 cookie 和最终应用程序结果。尝试 CapSolver 进行该特定任务检查,然后再将集成扩展到其他页面。

常见问题

Q: 正确的 Go 导入路径是什么?

使用 github.com/capsolver/capsolver-go。此示例将其分配为本地别名 capsolver_go,并固定安装命令中显示的依赖版本。

Q: Solve 是否直接返回 AWS WAF cookie?

不。它返回一个响应封装。在检查错误、响应状态和解决方案后,通过 result.Solution.Cookie 访问 cookie。

Q: 为什么要显式设置 API 主机?

固定 SDK 源具有 HTTP 回退主机。该示例在发送凭证前选择 HTTPS API 端点。更改依赖版本时,请再次检查此行为。

Q: HTTP 超时是完整求解的截止时间吗?

不。SDK 在检索结果时可能发出多个请求。每个请求的超时不会对整个操作施加相同限制或建立远程取消。

Q: 是否在实际的 AWS WAF 页面上进行了测试?

没有。Go 代码在使用真实 SDK 的本地 HTTP 模拟上运行。仍需要实际求解密钥和自有 AWS WAF 测试页面来验证服务行为和应用接受情况。

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

更多