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

Ethan Collins
Pattern Recognition Specialist
25-Oct-2024

当我第一次开始使用 reCAPTCHA 时,我发现它是一把双刃剑。一方面,它非常适合过滤机器人,但另一方面,它对于合法的自动化项目来说却是一个不小的障碍。因此,在这篇文章中,我将指导你使用三种强大的编程语言(Python、Java 和 C++)来解决 reCAPTCHA。每种语言在处理 reCAPTCHA 挑战方面都有自己的优势,根据项目的需求提供灵活性。我们将首先了解什么是 CAPTCHA 和 reCAPTCHA,以及它们在网络安全中的重要性。
什么是 CAPTCHA?
让我们从最基本的概念开始:什么是 CAPTCHA,或“完全自动化的公共图灵测试以区分计算机和人类”,这是一种常见的用来区分人类用户和机器人的方法。它通过要求用户解决对人类来说很容易但对机器来说很难的任务来帮助网站避免自动化攻击、垃圾邮件或利用。这可能是识别扭曲的文本、选择包含特定对象的图像或解决逻辑谜题。
什么是 reCAPTCHA?
reCAPTCHA 是一种由 Google 开发的服务,通过区分人类用户和机器人来帮助保护网站免受垃圾邮件和滥用。它随着时间的推移发展出不同的版本,每个版本都提供特定的功能。
-
reCAPTCHA v2: 这是最常见的形式,用户需要解决的任务例如点击复选框(“我不是机器人”)或选择图像。它更加人性化,但仍然可能会根据风险因素显示挑战。
-
reCAPTCHA v3: 此版本在后台运行,不会中断用户。它根据用户行为分配风险分数(0.0 到 1.0)。低风险用户无需验证即可通过,而可疑活动可能会触发验证步骤。
-
reCAPTCHA Enterprise: 此版本专为企业级保护而设计,为大型企业提供增强的安全功能。它提供高级分析、机器学习模型和针对高风险交易量身定制的基于风险的评估,并提供更大的定制选项以满足业务安全需求。
這些版本中的每一個都旨在提供最佳安全性,同時最大程度地減少對合法用戶的阻礙,適應機器人和攻擊的日益複雜化。
- reCAPTCHA v2 演示
查看 reCAPTCHA v2 演示- reCAPTCHA v3 演示
查看 reCAPTCHA v3 演示- reCAPTCHA Enterprise 演示
了解有关 reCAPTCHA Enterprise 的更多信息
在 Python、Java 和 C++ 中解决 reCAPTCHA
每种语言在处理 reCAPTCHA 挑战时都具有独特的优势:
-
Python 以其簡潔性和大量用于網頁自動化和數據抓取的庫而聞名。使用像 Selenium 和 Playwright 这样的库,你可以轻松地自动执行浏览器任务并使用合适的工具绕过 CAPTCHA。
-
Java 非常適合企業級應用程序和跨平台項目。它的多線程功能和像 Selenium WebDriver 这样的框架允许在可扩展系统中流畅地处理 reCAPTCHA。
-
C++ 提供性能优势,使其成为需要速度和低延迟的系统的理想选择。虽然不太常用于自动化,但它可以与其他工具集成以在高性能环境中解决 reCAPTCHA 挑战。
介绍 CapSolver
当你继续前进时,你会注意到,由于不断变化的算法和复杂性,解决 reCAPTCHA 挑战可能变得很棘手。这就是 CapSolver 的用武之地。它是一种专门的服务,以高精度自动执行 reCAPTCHA 解决过程,处理多种 CAPTCHA 类型,包括 reCAPTCHA v2、reCAPTCHA v3 等等。通过将 CapSolver 集成到你的 Python、Java 或 C++ 项目中,你可以将解决 CAPTCHA 的复杂性卸载到专门的服务中,从而使你的脚本能够平稳高效地运行。
接下来,我们将逐步介绍每种语言的示例代码以及如何在项目中快速集成 CapSolver...
附加代碼
領取用于頂級驗證碼解決方案的 獎勵代碼;CapSolver:WEBS。兑换后,你每次充值后将获得额外的 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
先決條件
在開始之前,請確保已安裝以下庫:
- cpr: 一个 C++ HTTP 库。
- jsoncpp: 一个用于 JSON 解析的 C++ 库。
你可以使用 vcpkg 安裝它們:
bash
vcpkg install cpr jsoncpp
步骤 1:设置你的项目
创建一个新的 C++ 项目,并包含 cpr
和 jsoncpp
的必要頭文件。
cpp
#include <iostream>
#include <cpr/cpr.h>
#include <json/json.h>
步骤 2:定义用于创建和获取任务结果的函数
我們將定義兩個主要函數:createTask
和 getTaskResult
。
- createTask: 此函数创建 reCAPTCHA 任务。
- 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% 合規的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隱私政策。
更多

如何解决隐形reCAPTCHA v2
本博客是关于如何使用Capsolver解决reCaptcha v2隐形版的全面指南。它提供了从向Capsolver提交必要信息到验证结果的分步教程。本博客设计得易于理解和遵循,使在您的网站上实施和解决reCaptcha v2隐形版的流程变得快速且高效。这是一份独特且详尽的指南,确保读者能够深入理解整个过程,杜绝抄袭。

Ethan Collins
11-Oct-2025

如何解决reCaptcha v3企业版
使用Capsolver轻松解决reCAPTCHA v3 Enterprise:这是您应对复杂验证码,进行高级风险分析和无缝集成的关键。

Ethan Collins
24-Sep-2025

如何找到reCaptcha的回調函數
查找 reCAPTCHA 的回调函数需要识别在成功解决 reCAPTCHA 后执行的 JavaScript 函数。以下是您可能采取的步骤的简要预览。

Ethan Collins
23-Sep-2025

如何解决reCaptcha v2
本文将教您什么是reCaptcha以及如何使用CapSolver轻松解决reCaptcha v2。

Ethan Collins
23-Sep-2025

如何解决reCaptcha v3并获得接近人类水平(>0.7–0.9)的分数
使用Capsolver高效解决reCaptcha v3。本指南涵盖从设置到解决验证码的全部内容,确保获得高分和流畅的网页浏览体验。

Ethan Collins
23-Sep-2025

验证码解答器 | 自动解决浏览器中的验证码
本文將向您展示如何在浏覽器上解決reCaptcha。

Ethan Collins
23-Sep-2025