
Emma Foster
Machine Learning Engineer

CAPTCHA(全自动公共图灵测试,用于区分计算机和人类)是一种安全机制,旨在区分人类用户和自动化机器人。它通常会提出图像识别、文本扭曲或交互式谜题等挑战,这些对人类来说很容易,但对机器人来说却很困难。虽然CAPTCHA可以保护网站免受自动化滥用,但它可能成为合法自动化和网络爬虫活动的重大障碍。
在本文中,我们将探讨如何使用Playwright和CapSolver扩展程序来解决CAPTCHA。此外,我们还将研究如何使用CapSolver API通过Python和Go来解决reCAPTCHA。
CAPTCHA是网站用来防止自动化访问并确保用户为人类的安全机制。常见的类型包括:
CapSolver是一个强大的工具,可自动解决各种类型的CAPTCHA,包括CAPTCHA和reCAPTCHA。它提供浏览器扩展和API,可无缝集成到您的网页自动化工作流中。
领取您的CapSolver优惠码
立即提升您的自动化预算!
在充值CapSolver账户时使用优惠码 CAPN,每次充值可获得额外 5% 的奖励 —— 无限制。
立即在您的 CapSolver仪表板 中领取
。
首先,您需要安装Playwright。您可以通过npm进行安装:
npm install playwright
./CapSolver.Browser.Extension 文件夹中。./assets/config.json 中的配置设置。确保 enabledForcaptcha 设置为 true,并将 captchaMode 设置为 token 以实现自动求解。示例配置更改:
{
"enabledForcaptcha": true,
"captchaMode": "token"
}
以下是一个使用Playwright通过CapSolver扩展程序解决CAPTCHA的示例脚本:
const { chromium } = require('playwright');
const path = require('path');
(async () => {
const extensionPath = path.join(__dirname, 'CapSolver.Browser.Extension');
const browser = await chromium.launchPersistentContext('', {
headless: false,
args: [
`--disable-extensions-except=${extensionPath}`,
`--load-extension=${extensionPath}`
]
});
const page = await browser.newPage();
await page.goto('https://site.example');
// 定位CAPTCHA复选框或框架并相应地进行交互
await page.waitForSelector('selector-for-captcha', { state: 'visible' });
await page.click('selector-for-captcha');
// 根据您的需求添加其他步骤
// ...
await browser.close();
})();
对于reCAPTCHA,您可以使用CapSolver API。以下是Python和Go的示例。
import requests
import time
api_key = "YOUR_API_KEY"
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
site_url = "https://www.google.com/recaptcha/api2/demo"
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("求解失败!response:", res.text)
return
token = capsolver()
print(token)
package main
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"time"
)
type capSolverResponse struct {
ErrorId int32 `json:"errorId"`
ErrorCode string `json:"errorCode"`
ErrorDescription string `json:"errorDescription"`
TaskId string `json:"taskId"`
Status string `json:"status"`
Solution map[string]any `json:"solution"`
}
func capSolver(ctx context.Context, apiKey string, taskData map[string]any) (*capSolverResponse, error) {
uri := "https://api.capsolver.com/createTask"
res, err := request(ctx, uri, map[string]any{
"clientKey": apiKey,
"task": taskData,
})
if err != nil {
return nil, err
}
if res.ErrorId == 1 {
return nil, errors.New(res.ErrorDescription)
}
uri = "https://api.capsolver.com/getTaskResult"
for {
select {
case <-ctx.Done():
return res, errors.New("solve timeout")
case <-time.After(time.Second):
break
}
res, err = request(ctx, uri, map[string]any{
"clientKey": apiKey,
"taskId": res.TaskId,
})
if err != nil {
return nil, err
}
if res.ErrorId == 1 {
return nil, errors.New(res.ErrorDescription)
}
if res.Status == "ready" {
return res, err
}
}
}
func request(ctx context.Context, uri string, payload interface{}) (*capSolverResponse, error) {
payloadBytes, err := json.Marshal(payload)
if err != nil {
return nil, err
}
req, err := http.NewRequestWithContext(ctx, "POST", uri, bytes.NewReader(payloadBytes))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
responseData, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
capResponse := &capSolverResponse{}
err = json.Unmarshal(responseData, capResponse)
if err != nil {
return nil, err
}
return capResponse, nil
}
func main() {
apikey := "YOUR_API_KEY"
ctx, cancel := context.WithTimeout(context.Background(), time.Second*120)
defer cancel()
res, err := capSolver(ctx, apikey, map[string]any{
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
})
if err != nil {
panic(err)
}
fmt.Println(res.Solution["gRecaptchaResponse"])
}
使用Playwright和CapSolver等工具,您可以自动化解决CAPTCHA,使网络爬虫和自动化任务更加高效。无论您处理的是CAPTCHA还是reCAPTCHA,这里列出的方法都能提供稳健的解决方案来克服这些挑战。
解决CAPTCHA的合法性取决于网站的服务条款、适用的地方法律以及自动化使用的具体方式。CapSolver本身是一个中立工具,旨在用于合法的使用场景,例如测试、QA自动化、无障碍访问和授权的数据收集。在部署任何CAPTCHA求解解决方案之前,您应确保已获得目标网站的许可,并确保您的使用符合相关法规。
CapSolver支持广泛的现代CAPTCHA系统,包括但不限于:
支持通过浏览器扩展(用于Playwright、Puppeteer等)和基于API的解决方案实现后端自动化。
当以下情况发生时,请使用CapSolver浏览器扩展程序:
当以下情况发生时,请使用CapSolver API:
在许多生产环境中,团队会根据具体情况结合使用这两种方法。
CapSolver经过优化,具有高成功率和低延迟。在大多数情况下,reCAPTCHA v2挑战可在几秒钟内解决,具体取决于网络状况和任务复杂性。对于大规模自动化,CapSolver还支持并发和稳定的吞吐量,使其适用于企业级爬虫和测试工作流程。