CAPSOLVER
博客
使用 Python、Java 和 C++ 解决 reCAPTCHA 问题当我最初开始使用 reCAPTCHA 时,我发现它是一把双刃剑。一方面,它非常适合过滤机器人,但另一方面,对于合法的自动化项目来说,它可能是一个不小的障碍。正是在这时,我发现了 CapSolver,这是一种简化解决 reCAPTCHA 挑战的强大工具。无论您使用 Python、Java 还是 C++ 编码,将 CapSolver 集成到您的工作流程中都可以节省时间和精力,同时使您的自动化任务更加可靠。以下是如何在这些语言中逐步实施它。

使用 Python、Java 和 C++ 解决 reCAPTCHA

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

25-Oct-2024

当我第一次开始使用 reCAPTCHA 时,我发现它是一把双刃剑。一方面,它非常适合过滤机器人,但另一方面,它对于合法的自动化项目来说却是一个不小的障碍。因此,在这篇文章中,我将指导你使用三种强大的编程语言(Python、Java 和 C++)来解决 reCAPTCHA。每种语言在处理 reCAPTCHA 挑战方面都有自己的优势,根据项目的需求提供灵活性。我们将首先了解什么是 CAPTCHA 和 reCAPTCHA,以及它们在网络安全中的重要性。

什么是 CAPTCHA?

让我们从最基本的概念开始:什么是 CAPTCHA,或“完全自动化的公共图灵测试以区分计算机和人类”,这是一种常见的用来区分人类用户和机器人的方法。它通过要求用户解决对人类来说很容易但对机器来说很难的任务来帮助网站避免自动化攻击、垃圾邮件或利用。这可能是识别扭曲的文本、选择包含特定对象的图像或解决逻辑谜题。

什么是 reCAPTCHA?

reCAPTCHA 是一种由 Google 开发的服务,通过区分人类用户和机器人来帮助保护网站免受垃圾邮件和滥用。它随着时间的推移发展出不同的版本,每个版本都提供特定的功能。

  1. reCAPTCHA v2: 这是最常见的形式,用户需要解决的任务例如点击复选框(“我不是机器人”)或选择图像。它更加人性化,但仍然可能会根据风险因素显示挑战。

  2. reCAPTCHA v3: 此版本在后台运行,不会中断用户。它根据用户行为分配风险分数(0.0 到 1.0)。低风险用户无需验证即可通过,而可疑活动可能会触发验证步骤。

  3. reCAPTCHA Enterprise: 此版本专为企业级保护而设计,为大型企业提供增强的安全功能。它提供高级分析、机器学习模型和针对高风险交易量身定制的基于风险的评估,并提供更大的定制选项以满足业务安全需求。

这些版本中的每一个都旨在提供最佳安全性,同时最大程度地减少对合法用户的阻碍,适应机器人和攻击的日益复杂化。

  1. reCAPTCHA v2 演示
    查看 reCAPTCHA v2 演示
  2. reCAPTCHA v3 演示
    查看 reCAPTCHA v3 演示
  3. reCAPTCHA Enterprise 演示
    了解有关 reCAPTCHA Enterprise 的更多信息

在 Python、Java 和 C++ 中解决 reCAPTCHA

每种语言在处理 reCAPTCHA 挑战时都具有独特的优势:

  • Python 以其简洁性和大量用于网页自动化和数据抓取的库而闻名。使用像 SeleniumPlaywright 这样的库,你可以轻松地自动执行浏览器任务并使用合适的工具绕过 CAPTCHA。

  • Java 非常适合企业级应用程序和跨平台项目。它的多线程功能和像 Selenium WebDriver 这样的框架允许在可扩展系统中流畅地处理 reCAPTCHA。

  • C++ 提供性能优势,使其成为需要速度和低延迟的系统的理想选择。虽然不太常用于自动化,但它可以与其他工具集成以在高性能环境中解决 reCAPTCHA 挑战。

介绍 CapSolver

当你继续前进时,你会注意到,由于不断变化的算法和复杂性,解决 reCAPTCHA 挑战可能变得很棘手。这就是 CapSolver 的用武之地。它是一种专门的服务,以高精度自动执行 reCAPTCHA 解决过程,处理多种 CAPTCHA 类型,包括 reCAPTCHA v2、reCAPTCHA v3 等等。通过将 CapSolver 集成到你的 Python、Java 或 C++ 项目中,你可以将解决 CAPTCHA 的复杂性卸载到专门的服务中,从而使你的脚本能够平稳高效地运行。

接下来,我们将逐步介绍每种语言的示例代码以及如何在项目中快速集成 CapSolver...

附加代码

领取用于顶级验证码解决方案的 奖励代码CapSolverWEBS。兑换后,你每次充值后将获得额外的 5% 奖励,无限次

如何使用 Python 解决 reCAPTCHA

先决条件

步骤 1. 获取站点密钥
对于 V2 和 V3,你可以在浏览器请求日志中搜索请求 /recaptcha/api2/reload?k=6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf,其中 k= 是我们需要的值

步骤 2. 区分 V2 和 V3

V2 和 V3 的处理方法不同。V2 需要图像识别来选择答案,而 V3 相对不显眼;但是,V3 在验证期间需要提供一个 Action。根据之前获得的键值,在响应页面中搜索,你将在页面中找到 Action 值

步骤 3. 调用 CapSolver 服务

区分 reCAPTCHA 版本

  • 在浏览器请求日志中,你可以看到对于 V2,在 /recaptcha/api2/reload 请求之后,通常需要一个 /recaptcha/api2/userverify 请求来获取通行令牌;
  • 对于 V3,/recaptcha/api2/reload 请求可以直接获取通行令牌

CapSolver API 调用的完整示例

  • Python reCAPTCHA V2
python 复制代码
# pip install requests
import requests
import time

# TODO: 设置你的配置
api_key = "YOUR_API_KEY"  # 你在 capsolver 中的 api 密钥
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"  # 你目标网站的站点密钥
site_url = "https://www.google.com/recaptcha/api2/demo"  # 你目标网站的页面 URL

# site_key = "6LelzS8UAAAAAGSL60ADV5rcEtK0x0lRsHmrtm62"
# site_url = "https://mybaragar.com/index.cfm?event=page.SchoolLocatorPublic&DistrictCode=BC45"


def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'ReCaptchaV2TaskProxyLess',
            "websiteKey": site_key,
            "websiteURL": site_url
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("创建任务失败:", res.text)
        return
    print(f"获取 taskId:{task_id} / 获取结果...")

    while True:
        time.sleep(3)  # 延迟
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("解决失败!响应:", res.text)
            return


token = capsolver()
print(token)
  • Python reCAPTCHA V3
python 复制代码
# pip install requests
import requests
import time

# TODO: 设置你的配置
api_key = "YOUR_API_KEY"  # 你在 capsolver 中的 api 密钥

site_key = "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf"  # 你目标网站的站点密钥
site_url = "https://antcpt.com/score_detector/"  # 你目标网站的页面 URL


def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'ReCaptchaV3TaskProxyLess',
            "websiteKey": site_key,
            "websiteURL": site_url,
            "pageAction": "homepage",
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("创建任务失败:", res.text)
        return
    print(f"获取 taskId:{task_id} / 获取结果...")

    while True:
        time.sleep(1)  # 延迟
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("解决失败!响应:", res.text)
            return

# 验证分数
def score_detector(token):
    headers = {
        "accept": "application/json, text/javascript, */*; q=0.01",
        "accept-language": "fr-CH,fr;q=0.9",
        "content-type": "application/json",
        "origin": "https://antcpt.com",
        "priority": "u=1, i",
        "referer": "https://antcpt.com/score_detector/",
        "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"macOS\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
        "x-requested-with": "XMLHttpRequest"
    }
    url = "https://antcpt.com/score_detector/verify.php"
    data = {
        "g-recaptcha-response": token
    }
    data = json.dumps(data, separators=(',', ':'))
    response = requests.post(url, headers=headers, data=data)

    print(response.json())
    print(response)

token = capsolver()
print(token)

...
...
{
    'success': True, 
    'challenge_ts': '2024-07-19T10:50:56Z', 
    'hostname': 'antcpt.com', 
    'score': 0.7, 
    'action': 'homepage'
}

如何使用 Java 解决 reCAPTCHA

先决条件

在我们深入代码之前,你应该先完成以下几个先决条件,以便成功地完成本教程:

  • Node.js 和 npm: 我们将使用 Node.js(一个 JavaScript 运行时)以及 npm(Node 包管理器)来管理项目依赖项。如果你还没有安装 Node.js,可以从 Node.js 官方网站 下载。
  • CapSolver API 密钥: 要有效地 解决 reCAPTCHA 挑战,你需要访问像 CapSolver 这样的服务,它专门负责以编程方式解决 CAPTCHA 挑战。确保你注册并从 CapSolver 获取 API 密钥,以便将其集成到你的解决方案中。

完成这些先决条件后,你就可以准备设置环境并开始使用 JavaScript 和 CapSolver 解决 reCAPTCHA 挑战。

步骤 1:获取站点密钥

  • 在浏览器的请求日志中,搜索请求
    /recaptcha/api2/reload?k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-,其中 k= 后面的值是我们需要的站点密钥。或者你可以通过 CapSolver 扩展 找到解决 reCAPTCHA 的所有参数
  • URL 是触发 reCAPTCHA V2 的页面的地址。

步骤 2:安装 requests 库

bash 复制代码
pip install requests

步骤 3:示例代码

python 复制代码
import requests
import time
from DrissionPage import ChromiumPage

# 创建 ChromiumPage 实例
page = ChromiumPage()

# 访问触发 reCAPTCHA 的示例页面
page.get("https://www.google.com/recaptcha/api2/demo")

# TODO: 设置你的配置
api_key = "你在 capsolver 中的 api 密钥"  # 你的 CapSolver API 密钥
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"  # 你目标网站的站点密钥
site_url = "https://www.google.com/recaptcha/api2/demo"  # 你目标网站的页面 URL

def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'ReCaptchaV2TaskProxyLess',
            "websiteKey": site_key,
            "websiteURL": site_url
        }
    }
    # 向 CapSolver 发送请求以创建任务
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("创建任务失败:", res.text)
        return
    print(f"获取 taskId:{task_id} / 获取结果...")

    while True:
        time.sleep(3)  # 延迟
        payload = {"clientKey": api_key, "taskId": task_id}
        # 查询任务结果
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("解决失败!响应:", res.text)
            return

def check():
    # 获取 reCAPTCHA 解决方案
    token = capsolver()
    # 设置 reCAPTCHA 响应值
    page.run_js(f'document.getElementById("g-recaptcha-response").value="{token}"')
    # 调用成功回调函数
    page.run_js(f'onSuccess("{token}")')
    # 提交表单
    page.ele('x://input[@id="recaptcha-demo-submit"]').click()

if __name__ == '__main__':
    check()

如何使用 C++ 解决 reCAPTCHA

先决条件

在开始之前,请确保已安装以下库:

  1. cpr: 一个 C++ HTTP 库。
  2. jsoncpp: 一个用于 JSON 解析的 C++ 库。

你可以使用 vcpkg 安装它们:

bash 复制代码
vcpkg install cpr jsoncpp

步骤 1:设置你的项目

创建一个新的 C++ 项目,并包含 cprjsoncpp 的必要头文件。

cpp 复制代码
#include <iostream>
#include <cpr/cpr.h>
#include <json/json.h>

步骤 2:定义用于创建和获取任务结果的函数

我们将定义两个主要函数:createTaskgetTaskResult

  1. createTask: 此函数创建 reCAPTCHA 任务。
  2. getTaskResult: 此函数检索已创建任务的结果。

以下是完整代码:

cpp 复制代码
#include <iostream>
#include <cpr/cpr.h>
#include <json/json.h>

std::string createTask(const std::string& apiKey, const std::string& websiteURL, const std::string& websiteKey) {
    Json::Value requestBody;
    requestBody["clientKey"] = apiKey;
    requestBody["task"]["type"] = "ReCaptchaV2Task";
    requestBody["task"]["websiteURL"] = websiteURL;
    requestBody["task"]["websiteKey"] = websiteKey;

    Json::StreamWriterBuilder writer;
    std::string requestBodyStr = Json::writeString(writer, requestBody);

    cpr::Response response = cpr::Post(
        cpr::Url{"https://api.capsolver.com/createTask"},
        cpr::Body{requestBodyStr},
        cpr::Header{{"Content-Type", "application/json"}}
    );

    Json::CharReaderBuilder reader;
    Json::Value responseBody;
    std::string errs;
    std::istringstream s(response.text);
    std::string taskId;

    if (Json::parseFromStream(reader, s, &responseBody, &errs)) {
        if (responseBody["errorId"].asInt() == 0) {
            taskId = responseBody["taskId"].asString();
        } else {
            std::cerr << "错误: " << responseBody["errorCode"].asString() << std::endl;
        }
    } else {
        std::cerr << "解析响应失败: " << errs << std::endl;
    }

    return taskId;
}

std::string getTaskResult(const std::string& apiKey, const std::string& taskId) {
    Json::Value requestBody;
    requestBody["clientKey"] = apiKey;
    requestBody["taskId"] = taskId;

    Json::StreamWriterBuilder writer;
    std::string requestBodyStr = Json::writeString(writer, requestBody);

    while (true) {
        cpr::Response response = cpr::Post(
            cpr::Url{"https://api.capsolver.com/getTaskResult"},
            cpr::Body{requestBodyStr},
            cpr::Header{{"Content-Type", "application/json"}}
        );

        Json::CharReaderBuilder reader;
        Json::Value responseBody;
        std::string errs;
        std::istringstream s(response.text);

        if (Json::parseFromStream(reader, s, &responseBody, &errs)) {
            if (responseBody["status"].asString() == "ready") {
                return responseBody["solution"]["gRecaptchaResponse"].asString();
            } else if (responseBody["status"].asString() == "processing") {
                std::cout << "任务仍在处理中,等待 5 秒..." << std::endl;
                std::this_thread::sleep_for(std::chrono::seconds(5));
            } else {
                std::cerr << "错误: " << responseBody["errorCode"].asString() << std::endl;
                break;
            }
        } else {
            std::cerr << "解析响应失败: " << errs << std::endl;
            break;
        }
    }

    return "";
}

int main() {
    std::string apiKey = "YOUR_API_KEY";
    std::string websiteURL = "https://example.com";
    std::string websiteKey = "SITE_KEY";

    std::string taskId = createTask(apiKey, websiteURL, websiteKey);
    if (!taskId.empty()) {
        std::cout << "任务创建成功。任务 ID: " << taskId << std::endl;
        std::string recaptchaResponse = getTaskResult(apiKey, taskId);
        std::cout << "reCAPTCHA 响应: " << recaptchaResponse << std::endl;
    } else {
        std::cerr << "创建任务失败。" << std::endl;
    }

    return 0;
}

最后的想法

在结束时,我可以自信地说,将 CapSolver 集成到我的项目中,使处理 reCAPTCHA 挑战变得容易得多。无论是 V2 还是 V3,流程都很简单,并且为我节省了大量时间。如果你也遇到了类似的挑战,我强烈建议你尝试一下 CapSolver——它对我来说是一个游戏规则改变者。

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

更多