
Nikolai Smirnov
Software Development Lead
已发表 Sep 17, 2026
已更新 Sep 17, 2026 · 最小阅读量

AntiAwsWafTask 并返回 AWS WAF CAPTCHA 结果。result.Solution.Cookie 读取结果。在 Go 中集成 AWS WAF CAPTCHA 有两个独立的责任:向求解器请求记录的结果,然后在被测试的应用程序中正确使用该结果。官方 SDK 处理 API 交互,但它无法决定您的应用程序是否接受了完成的尝试。
本教程使用 CapSolver 进行自有 AWS WAF 测试页面。它专注于安装 Go 模块、构建任务、处理返回的 cookie 以及理解 SDK 的传输行为。本指南不假设在一个域上接受的令牌适用于另一个域。
Go SDK 将任务创建和结果检索封装在其 Solve 方法中。API 库 将这些调用打包为语言级方法,但您仍需要正确的任务参数和应用程序逻辑。
官方 AWS WAF 任务文档 描述了 AntiAwsWafTask 及其 solution.cookie 结果。Go SDK 将响应公开为包含 Solution 指针的 CapSolverResponse。这种区别很重要:Solve 不会直接返回 cookie 字符串。
本教程的预期流程是:
AWS 将其令牌描述为 AWS WAF 智能威胁缓解 的一部分。将结果视为与特定尝试相关,而不是永久访问应用程序的权限。
创建一个小型 Go 模块并固定此示例中使用的 SDK 版本。该包发布在 官方 CapSolver Go 仓库 中。
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.mod 和 go.sum 文件。标准 Go 依赖管理文档 解释了这些文件和版本选择。升级 SDK 时,重新运行覆盖请求字段和响应处理的测试。
此安装准备了客户端库。它不会提供 AWS WAF 测试页面、购买求解信用或配置代理。这些都是真实求解的独立前提条件。
示例从环境变量中读取自有页面 URL、代理字符串和求解 API 密钥。
| 变量 | 要提供的值 |
|---|---|
OWNED_WAF_URL |
您拥有或被授权测试的 AWS WAF 页面的 URL |
CAPSOLVER_PROXY |
按照任务文档格式化的代理 |
CAPSOLVER_API_KEY |
您 CapSolver 账户的求解 API 密钥 |
这些变量名称属于示例;它们不是额外的 API 任务字段。Go 代码将它们映射到 websiteURL、proxy 和 SDK 客户端的 ApiKey。
使用您的正常密钥管理器或开发环境提供凭据。不要将真实密钥粘贴到提交的源代码中,也不要将内容管理凭据替换为求解密钥。代理凭据应受到相同的重视。
选择特定的自有 URL 以产生挑战。通用主页可能无法提供不同路由测试所需上下文。保持应用程序会话和网络配置与测试设计一致,而不是将求解结果视为与需要它的请求无关。
将以下代码保存为 main.go。其任务映射和 Solve 调用遵循官方 SDK 和任务示例。环境检查、显式 HTTPS 主机、超时和就绪 cookie 检查是此小型程序的附加内容。本地 HTTP 模拟测试了 SDK;实际求解需要您的求解密钥、代理和自有页面,但未执行。
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 仪表板 中领取
在提供三个环境设置后运行程序。此实时命令仍需要使用您的自有页面进行验证;记录的测试使用了本地 HTTP 模拟:
go run .
当 SDK 返回带有非空 cookie 的就绪响应时,程序会打印响应状态。它故意不打印 cookie 本身。该值在 result.Solution.Cookie 中可用,供您自有测试中继续应用程序流程的部分使用。
solveAWS 中有三个不同的检查。Go 错误会使调用失败。缺失或非就绪的响应会失败包装器的就绪检查。空的解决方案或空的 cookie 会失败结果内容检查。这可防止调用代码仅因返回指针而继续。
状态打印不是成功的应用程序断言。在测试运行器中使用返回值后添加最终检查。如果页面仍显示挑战,请保留观察到的阶段和相关提供者错误信息,而不是将打印的状态视为页面接受尝试的证明。
示例未实现 HTTP cookie jar 或浏览器自动化层。这些取决于您的应用程序如何创建和维护测试会话。避免添加猜测的 cookie 域或全局头,将值应用于不相关的请求。
可选字段在实际挑战上下文和当前任务文档需要它们时才相关。AWS WAF 任务指南包括 awsKey、awsIv、awsContext 和 awsChallengeJS 等字段,用于记录的情况。
从与您的页面和受支持的任务类型匹配的请求开始。如果服务报告缺少所需上下文,请检查自有页面上的当前挑战并遵循相应的文档。不要简单地将占位符值插入每个可选字段以使 JSON 看起来完整。
挑战数据应属于当前尝试。将一个测试的页面 URL 与从不同页面或时间保存的挑战参数混合会使请求更难推理。请求可以语法正确,但其输入可能描述不兼容的上下文。
更广泛的 AWS WAF CAPTCHA 指南 解释了任务家族。此 Go 示例增加了对响应封装和 HTTP 行为的语言特定处理;它不更改所需的挑战信息。
应用程序应仅在获得该 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 测试页面来验证服务行为和应用接受情况。

Nikolai Smirnov
Software Development Lead
Building dependable software for complex automation.
关于作者