Cloudflare Challenge

O CapMonster Cloud pode retornar o resultado da solução como um token ou como um cookie cf_clearance. Antes de começar, analise ambas as opções e escolha a que melhor se adapta ao seu caso de uso.
Parâmetros da solicitação
IMPORTANTE: alguns valores de parâmetros são dinâmicos — eles mudam a cada renderização da página que contém Cloudflare Challenge.
Extraia-os imediatamente antes de criar a tarefa para evitar erros durante a resolução.
Veja exemplos de extração automática de parâmetros na seção Como encontrar todos os parâmetros necessários para a criação da tarefa.
Opção 1. Challenge (token)
-
O CapMonster Cloud, por padrão, funciona com proxies integrados — já incluídos no custo do serviço. É necessário especificar seus próprios proxies apenas nos casos em que o site não aceita o token ou quando o acesso aos serviços integrados está restrito.
-
Se o proxy utiliza autenticação por IP, é necessário adicionar o endereço 65.21.190.34 à lista de permissões (whitelist).
-
Após resolver, você receberá um token para confirmar a conclusão do captcha.
type<string>requiredTurnstileTask
websiteURL<string>requiredA URL da página onde o captcha será resolvido
websiteKey<string>requiredChave do Cloudflare Challenge (consulte a seção Como encontrar todos os parâmetros necessários para criar uma tarefa)
Tem aproximadamente o seguinte formato: 0x4AAAAAAABUYP0XeMJF0xoy
cloudflareTaskType<string>requiredtoken
pageAction<string>requiredO campo action, que pode ser encontrado na função de callback usada para carregar o captcha. Quando cloudflareTaskType é usado, o valor de action geralmente é “managed” ou “non-interactive”.
userAgent<string>requiredUser-Agent do navegador.
Transmita apenas o UA atual do sistema operacional Windows. No momento, o válido é: userAgentPlaceholder
data<string>requiredO valor do campo data pode ser obtido do parâmetro cData.
Exemplo: 874291f4retD1366
pageData<string>requiredO valor do campo pageData pode ser obtido do parâmetro chlPageData.
Exemplo: HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=
apiJsUrl<string>optionalString que contém o link para o script do captcha.
proxyType<string>optionalhttp - proxy http/https comum;
https - tente esta opção apenas se "http" não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy socks4;
socks5 - proxy socks5.
proxyAddress<string>optionalEndereço IP do proxy IPv4/IPv6. Não é permitido:
- uso de proxies transparentes (que revelem o IP do cliente);
- uso de proxies em máquinas locais.
proxyPort<integer>optionalPorta do proxy.
proxyLogin<string>optionalLogin do servidor proxy.
proxyPassword<string>optionalSenha do servidor proxy.
Estes parâmetros estão no objeto passado para window.turnstile.render(el, paramsObj) ao criar o captcha. Você pode obtê-los, por exemplo, executando JavaScript antes de carregar outros scripts:
(function () {
const obj = {
render: function () {
const { action, cData, chlPageData } = arguments[1];
const params = [
["action", action],
["data", cData],
["pageData", chlPageData],
];
console.table(params)
}
};
Object.defineProperty(window, "turnstile", {
get: () => {
return obj;
},
});
})();
Quando window.turnstile.render(el, paramsObj) é chamado, o captcha é carregado na página e, após a resolução bem-sucedida, a função callback retorna as informações da solução.
window.turnstile.render(el, paramsObj):
el: elemento DOM no qual o captcha será inserido.
paramsObj: objeto de parâmetros que contém informações sobre o captcha e instruções para resolvê-lo. Normalmente, esse objeto contém campos como
sitekey, action, cData, chlPageData, callback.
callback – função de retorno de chamada executada após a conclusão bem-sucedida do captcha.
Opção 2. Challenge (cookie)
-
Use seus próprios proxies para esta tarefa.
-
Após resolver, você receberá cookies especiais para adicionar ao navegador.
type<string>requiredTurnstileTask
websiteURL<string>requiredA URL da página onde o captcha será resolvido
websiteKey<string>requiredChave do Cloudflare Challenge. É possível enviar qualquer string, por exemplo: xxxxxx.
cloudflareTaskType<string>requiredcf_clearance
htmlPageBase64<string>requiredPágina HTML codificada em Base64 do "Just a moment" exibido com resposta 403.
Exemplo para obter htmlPageBase64:
var serializer = new XMLSerializer();
var fullHtml = serializer.serializeToString(document);
var htmlBase64 = btoa(unescape(encodeURIComponent(fullHtml)));
console.log(htmlBase64);
userAgent<string>requiredUser-Agent do navegador.
Forneça apenas o UA do Windows atual: userAgentPlaceholder
proxyType<string>requiredhttp - proxy HTTP/HTTPS normal;
https - use se http não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy SOCKS4;
socks5 - proxy SOCKS5.
proxyAddress<string>requiredEndereço IP do proxy (IPv4/IPv6). Não permitido:
- Proxies transparentes
- Proxies da máquina local
proxyPort<integer>requiredPorta do proxy.
proxyLogin<string>requiredLogin do proxy.
proxyPassword<string>requiredSenha do proxy.
Método de criação da tarefa
Opção 1. Challenge (token)
- TurnstileTask (sem proxy)
- TurnstileTask (com proxy)
https://api.capmonster.cloud/createTask
Exemplo de requisição
{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://yourwebsite.com/page-with-cf-challenge",
"websiteKey": "your-website-key",
"cloudflareTaskType": "token",
"userAgent": "userAgentPlaceholder",
"pageAction": "your-page-action",
"pageData": "your-page-data",
"data": "your-data"
}
}
Exemplo de resposta
{
"errorId": 0,
"taskId": 407533072
}
https://api.capmonster.cloud/createTask
Exemplo de requisição
{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://yourwebsite.com/page-with-cf-challenge",
"websiteKey": "your-website-key",
"cloudflareTaskType": "token",
"userAgent": "userAgentPlaceholder",
"pageAction": "your-page-action",
"pageData": "your-page-data",
"data": "your-data",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Exemplo de resposta
{
"errorId": 0,
"taskId": 407533072
}
Opção 2. Challenge (cookie)
https://api.capmonster.cloud/createTask
Exemplo de requisição
{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://yourwebsite.com/page-with-cf-challenge",
"websiteKey": "xxxxxxxxxx",
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": "PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+",
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Exemplo de resposta
{
"errorId":0,
"taskId":407533072
}
Método de obter resultado da tarefa
Opção 1. Challenge (token)
https://api.capmonster.cloud/getTaskResult
Exemplo de requisição
{
"clientKey": "API_KEY",
"taskId": 407533072
}
Exemplo de resposta
{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "userAgentPlaceholder",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}
| Propriedade | Tipo | Descrição |
|---|---|---|
| token | String | Use o token ao chamar a função de callback |
Opção 2. Challenge (cookie)
https://api.capmonster.cloud/getTaskResult
Exemplo de requisição
{
"clientKey": "API_KEY",
"taskId": 407533072
}
Exemplo de resposta
{
"errorId": 0,
"status": "ready",
"solution": {
"cf_clearance": "1tarGvbY2_ZhQdYxpSBloao.FoOn9VtcJtmb_IQ_hCE-1761217338-1.2.1.1-vyVPoLYIGX0VCJomVuLjF7n0kdM0PXaPjpDsRcohxGr7hb2CE7WfcHpmQZ70goqEjdWxPsDhSVaKNTz9opxWguiNdWEEq_.SceWXIqfP7tnEb69f3bP0mixNqcWy_5P_9INpoAEqr1k7aYU0r45PT4gPr5pwHxedVySyLRdoBXIJasdTE52YOQ3NPdGWTwQ_3h2n_wYqqIvf0kCSAvimRrmsgZxomlyejwqPI6ZHi.w"
}
}
| Propriedade | Tipo | Descrição |
|---|---|---|
| cf_clearance | String | Cookies especiais do Cloudflare que podem ser adicionados ao navegador |
Como diferenciar Challenge do Turnstile
Diferenças entre Challenge e Turnstile
Os tipos de verificação da Cloudflare podem aparecer de formas diferentes.
Turnstile padrão:

Variantes estilizadas:

Para ter certeza absoluta da presença de um Challenge, você pode abrir as ferramentas de desenvolvedor, analisar o tráfego, estudar o código da página e observar os sinais característicos:
- A primeira requisição ao site retorna status 403:

- O formulário com id challenge-form possui atributo action (não confundir com o action do Turnstile captcha) contendo o parâmetro
__cf_chl_f_tk=:

- A página contém duas tags
<script>similares que criam novos valores no objetowindow:

Como encontrar todos os parâmetros necessários para a criação da tarefa
Automaticamente
Para automatizar a extração dos parâmetros, eles podem ser obtidos via navegador (normal ou headless, por exemplo, usando Playwright) ou diretamente a partir de requisições HTTP. Como os valores dos parâmetros dinâmicos têm curta duração, recomenda-se utilizá-los imediatamente após a extração.
Os trechos de código fornecidos são exemplos básicos para aprendizado sobre como extrair os parâmetros necessários. A implementação exata dependerá do seu site com captcha, sua estrutura e os elementos HTML e seletores utilizados.
- JavaScript
- Python
- C#
Para a Opção 1: Challenge (token) – Node.js
import { chromium } from "playwright";
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
let params = null;
try {
while (!params) {
await page.goto("https://yourwebsite.com/page-with-cf-challenge");
await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
const p = {
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
};
window.params = p;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});
params = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.params || null), 5000);
});
});
if (!params) {
await page.waitForTimeout(3000);
}
}
console.log("Parâmetros Turnstile:", params);
} finally {
await browser.close();
}
})();
Para a Opção 2: Challenge (cookie cf_clearance) – Node.js
import { chromium } from "playwright";
import { Buffer } from "buffer";
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
let websiteKey = null;
while (!websiteKey) {
await page.goto("https://yourwebsite.com/page-with-cf-challenge");
await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
window.websiteKey = b.sitekey;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});
websiteKey = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
});
});
if (!websiteKey) {
await page.waitForTimeout(3000);
}
}
const html = await page.content();
const htmlPageBase64 = Buffer.from(html).toString("base64");
const result = {
websiteKey,
htmlPageBase64,
};
console.log(result);
await browser.close();
})();
Para a Opção 1: Challenge (token)
import asyncio
from playwright.async_api import async_playwright
async def extract_turnstile_params():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
params = None
while not params:
await page.goto("https://yourwebsite.com/page-with-cf-challenge")
await page.evaluate("""
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function(a, b) {
const p = {
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
window.params = p;
return target.render.apply(this, arguments);
};
}
return target[prop];
}
});
""")
await page.wait_for_timeout(5000)
params = await page.evaluate("window.params || null")
if not params:
await page.wait_for_timeout(3000)
print("Parâmetros Turnstile:", params)
await browser.close()
asyncio.run(extract_turnstile_params())
Para a Opção 2: Challenge (cookie cf_clearance)
import asyncio
import base64
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
website_key = None
while not website_key:
await page.goto("https://yourwebsite.com/page-with-cf-challenge")
await page.evaluate("""
() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
window.websiteKey = b.sitekey;
return target.render.apply(this, arguments);
};
}
return target[prop];
}
});
}
""")
website_key = await page.evaluate("""
() => new Promise(resolve => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
})
""")
if not website_key:
await page.wait_for_timeout(3000)
html = await page.content()
html_base64 = base64.b64encode(html.encode("utf-8")).decode("utf-8")
result = {
"websiteKey": website_key,
"htmlPageBase64": html_base64
}
print(result)
await browser.close()
asyncio.run(main())
Para a Opção 1: Challenge (token)
using Microsoft.Playwright;
using System.Text.Json;
class Program
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
Headless = false
});
var page = await browser.NewPageAsync();
object? parameters = null;
while (parameters == null)
{
await page.GotoAsync("https://yourwebsite.com/page-with-cf-challenge");
await page.EvaluateAsync(@"() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
const p = {
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
window.params = p;
return target.render.apply(this, arguments);
};
}
return target[prop];
}
});
}");
parameters = await page.EvaluateAsync(@"() => new Promise(resolve => {
setTimeout(() => resolve(window.params || null), 5000);
})");
if (parameters == null)
{
await page.WaitForTimeoutAsync(3000);
}
}
Console.WriteLine("Parâmetros Turnstile:");
Console.WriteLine(JsonSerializer.Serialize(parameters, new JsonSerializerOptions { WriteIndented = true }));
await browser.CloseAsync();
}
}
Para a Opção 2: Challenge (cookie cf_clearance)
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Playwright;
class Program
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(
new BrowserTypeLaunchOptions { Headless = false });
var page = await browser.NewPageAsync();
string websiteKey = null;
while (websiteKey == null)
{
await page.GotoAsync("https://yourwebsite.com/page-with-cf-challenge");
await page.EvaluateAsync(@"() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
window.websiteKey = b.sitekey;
return target.render.apply(this, arguments);
};
}
return target[prop];
}
});
}");
websiteKey = await page.EvaluateAsync<string>(@"() =>
new Promise(resolve => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
})");
if (websiteKey == null)
{
await page.WaitForTimeoutAsync(3000);
}
}
var html = await page.ContentAsync();
var htmlBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(html));
Console.WriteLine($"websiteKey: {websiteKey}");
Console.WriteLine($"htmlPageBase64: {htmlBase64}");
await browser.CloseAsync();
}
}
Usar biblioteca SDK
- JavaScript
- Node.js
- Python
- C#
Opção 1: Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-js
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest
} from '@zennolab_com/capmonstercloud-client';
const API_KEY = "YOUR_API_KEY"; // Insira sua chave de API do CapMonster Cloud
document.addEventListener("DOMContentLoaded", async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
let turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge", // URL da página com o captcha
websiteKey: "your-website-key", // Substitua pelo valor necessário
data: "your-data",
pageAction: "managed", // Substitua pelo valor necessário
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});
// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};
turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge", // Substitua pelo valor correto
websiteKey: "your-website-key",
proxy,
data: "your-data",
pageAction: "managed", // Substitua pelo valor necessário
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});
*/
// Se necessário, você pode verificar o saldo
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(turnstileRequest);
console.log("Solution:", result);
});
Opção 2: Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-js
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest
} from '@zennolab_com/capmonstercloud-client';
document.addEventListener("DOMContentLoaded", async () => {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // Insira sua chave de API do CapMonster Cloud
);
// Se necessário, você pode verificar o saldo
const balance = await cmcClient.getBalance();
console.log('Balance:', balance);
const proxy = {
proxyType: "http",
proxyAddress: '123.45.67.89',
proxyPort: 8080,
proxyLogin: 'username',
proxyPassword: 'password'
};
// O Cloudflare cf_clearance só pode ser resolvido usando seu próprio proxy
const turnstileRequest = new TurnstileRequest({
websiteURL: 'https://yourwebsite.com/page-with-cf-challenge/', // Substitua pelo valor correto
websiteKey: 'xxxxx',
cloudflareTaskType: 'cf_clearance',
proxy,
htmlPageBase64: 'PGh0bW...h0bWw+',
userAgent: 'userAgentPlaceholder'
});
// Envio da tarefa para resolução
const result = await cmcClient.Solve(turnstileRequest);
console.log('Solution:', result.solution);
});
Opção 1: Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-js
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest
} from '@zennolab_com/capmonstercloud-client';
const API_KEY = "YOUR_API_KEY"; // Insira sua chave de API do CapMonster Cloud
(async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
let turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge", // URL da página com o captcha
websiteKey: "your-website-key", // Substitua pelo valor necessário
data: "your-data",
pageAction: "managed", // Substitua pelo valor necessário
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});
// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};
turnstileRequest = new TurnstileRequest({
websiteURL: "https://yourwebsite.com/page-with-cf-challenge",
websiteKey: "your-website-key",
proxy,
data: "your-data",
pageAction: "managed", // Substitua pelo valor necessário
cloudflareTaskType: "token",
pageData: "your-page-data",
userAgent: "userAgentPlaceholder"
});
*/
// Se necessário, você pode verificar o saldo
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(turnstileRequest);
console.log("Solution:", result);
})();
Opção 2: Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-js
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from '@zennolab_com/capmonstercloud-client';
async function main() {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // Insira sua chave de API do CapMonster Cloud
);
// Se necessário, você pode verificar o saldo
const balance = await cmcClient.getBalance();
console.log('Balance:', balance);
const proxy = {
proxyType: "http",
proxyAddress: '123.45.67.89',
proxyPort: 8080,
proxyLogin: 'username',
proxyPassword: 'password'
};
// O Cloudflare cf_clearance só pode ser resolvido usando seu próprio proxy
const turnstileRequest = new TurnstileRequest({
websiteURL: 'https://yourwebsite.com/page-with-cf-challenge/', // Substitua pelo valor correto
websiteKey: 'xxxxx',
cloudflareTaskType: 'cf_clearance',
proxy,
htmlPageBase64: 'PGh0bW...h0bWw+',
userAgent: 'userAgentPlaceholder'
});
const result = await cmcClient.Solve(turnstileRequest);
console.log('Solution:', result.solution);
}
main().catch(console.error);
Opção 1: Challenge (token)
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
# from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo # Descomente se planeja usar um proxy
API_KEY = "YOUR_API_KEY" # Insira sua chave de API do CapMonster Cloud
async def solve_turnstile_token():
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Exemplo básico sem proxy
# O CapMonster Cloud usa automaticamente seus próprios proxies
turnstile_request = TurnstileRequest(
websiteURL="https://yourwebsite.com/page-with-cf-challenge/", # URL da página com o captcha
websiteKey="your-website-key", # Substitua pelo valor necessário
data="your-data",
pageAction="managed", # Substitua pelo valor necessário
cloudflareTaskType="token",
pageData="your-page-data",
userAgent="userAgentPlaceholder"
)
# Exemplo de uso do seu próprio proxy
# Descomente este bloco se quiser usar um proxy personalizado
#
# proxy = ProxyInfo(
# proxyType="http",
# proxyAddress="123.45.67.89",
# proxyPort=8080,
# proxyLogin="username",
# proxyPassword="password"
# )
#
# turnstile_request = TurnstileRequest(
# websiteURL="https://yourwebsite.com/page-with-cf-challenge/",
# websiteKey="your-website-key",
# proxy=proxy,
# data="your-data",
# pageAction="managed",
# cloudflareTaskType="token",
# pageData="your-page-data",
# userAgent="userAgentPlaceholder"
# )
# Se necessário, você pode verificar o saldo
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Solution:", result)
asyncio.run(solve_turnstile_token())
Opção 2: Challenge (cookie cf_clearance)
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo # Usando ProxyInfo
API_KEY = "YOUR_API_KEY" # Insira sua chave de API do CapMonster Cloud
async def solve_cf_clearance():
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Exemplo de configuração do proxy
proxy = ProxyInfo(
proxyType="http",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password"
)
# O Cloudflare cf_clearance só pode ser resolvido usando seu próprio proxy
turnstile_request = TurnstileRequest(
websiteURL="https://yourwebsite.com/page-with-cf-challenge",
websiteKey="xxxxx",
cloudflareTaskType="cf_clearance",
htmlPageBase64="BASE64_HTML_PAGE_HERE",
userAgent="userAgentPlaceholder",
proxy=proxy
)
# Se necessário, você pode verificar o saldo
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Solution:", result)
asyncio.run(solve_cf_clearance())
Opção 1: Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-dotnet
using System;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Insira sua chave de API do CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge", // URL da página com o captcha
WebsiteKey = "your-website-key", // Seu sitekey
Data = "your-data",
PageAction = "managed", // Substitua pelo valor necessário
CloudflareTaskType = "token",
PageData = "your-page-data",
UserAgent = "userAgentPlaceholder"
};
// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado
/*
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge",
WebsiteKey = "your-website-key",
Data = "your-data",
PageAction = "managed", // Substitua pelo valor necessário
CloudflareTaskType = "token",
PageData = "your-page-data",
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
*/
// Se necessário, você pode verificar o saldo
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
Console.WriteLine("Solution: " + turnstileResult.Solution.Value);
}
}
Opção 2: Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-dotnet
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY" // Insira sua chave de API do CapMonster Cloud
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// O Cloudflare cf_clearance só pode ser resolvido usando seu próprio proxy
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-cf-challenge", // URL da página com o captcha
WebsiteKey = "xxxxx",
CloudflareTaskType = "cf_clearance",
HtmlPageBase64 = "htmlPageBase64Here",
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
Console.WriteLine("Solution: " + turnstileResult.Solution.Clearance);
}
}
Exemplos de resolução automática do Cloudflare Challenge (cf_clearance)
Os exemplos abaixo demonstram o fluxo geral para trabalhar com o Cloudflare Challenge: obter os parâmetros necessários, criar uma tarefa no CapMonster Cloud e usar o cookie cf_clearance nas solicitações subsequentes. Você pode usar o SDK oficial ou integrar diretamente com a API — escolha a opção que melhor se adapta às suas necessidades.
- Node.js
- Python
- C#
Mostrar código
import { ProxyAgent, setGlobalDispatcher } from "undici";
// ================= CONFIGURAÇÃO (OU USE .ENV) =================
const API_KEY = "YOUR_API_KEY"; // Substitua pela sua chave de API do CapMonster Cloud
const URL = "https://www.example.com"; // Substitua pela URL de destino
const SITEKEY = "xxxxxx";
const UA =
"userAgentPlaceholder";
// ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
const PROXY_HOST = "PROXY_HOST";
const PROXY_PORT = 1234;
const PROXY_USER = "PROXY_USER";
const PROXY_PASS = "PROXY_PASS";
const proxy = new ProxyAgent(
`http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`,
);
setGlobalDispatcher(proxy);
// ================= SESSÃO =================
let cookieHeader = "";
const headers = {
"User-Agent": UA,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
Connection: "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"sec-ch-ua":
'"Chromium";v="150", "Google Chrome";v="150", "Not:A-Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
};
// ================= OBTER A PÁGINA =================
async function fetchPage(url) {
const response = await fetch(url, {
method: "GET",
headers: {
...headers,
...(cookieHeader && {
Cookie: cookieHeader,
}),
},
});
const buffer = Buffer.from(await response.arrayBuffer());
return {
status: response.status,
body: buffer,
};
}
// ================= REQUISIÇÃO POST COM JSON =================
async function postJson(url, data) {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
return await response.json();
}
// ================= RESOLVER =================
async function solveTurnstile(htmlBase64) {
const create = await postJson("https://api.capmonster.cloud/createTask", {
clientKey: API_KEY,
task: {
type: "TurnstileTask",
websiteURL: URL,
websiteKey: SITEKEY,
cloudflareTaskType: "cf_clearance",
htmlPageBase64: htmlBase64,
userAgent: UA,
proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
},
});
if (create.errorId) {
throw new Error(JSON.stringify(create));
}
const taskId = create.taskId;
console.log("ID da tarefa:", taskId);
while (true) {
await new Promise((resolve) => setTimeout(resolve, 5000));
const result = await postJson(
"https://api.capmonster.cloud/getTaskResult",
{
clientKey: API_KEY,
taskId,
},
);
if (result.errorId) {
throw new Error(JSON.stringify(result));
}
if (result.status === "ready") {
return result.solution.cf_clearance;
}
console.log("Aguardando...");
}
}
// ================= FUNÇÃO PRINCIPAL =================
async function main() {
// PRIMEIRA REQUISIÇÃO
const first = await fetchPage(URL);
console.log("Status inicial:", first.status);
console.log(first.body.toString("utf8").substring(0, 800));
// RESOLVER
const htmlBase64 = first.body.toString("base64");
const cfClearance = await solveTurnstile(htmlBase64);
console.log("cf_clearance:", cfClearance);
cookieHeader = `cf_clearance=${cfClearance}`;
// SEGUNDA REQUISIÇÃO
const second = await fetchPage(URL);
console.log("Status final:", second.status);
console.log(second.body.toString("utf8").substring(0, 800));
}
main().catch(console.error);
Mostrar código (SDK)
import { ProxyAgent, setGlobalDispatcher } from "undici";
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest,
} from "@zennolab_com/capmonstercloud-client";
// ================= CONFIGURAÇÃO (OU USE .ENV) =================
const API_KEY = "YOUR_API_KEY"; // Substitua pela sua chave de API do CapMonster Cloud
const URL = "https://www.example.com"; // Substitua pela URL de destino
const SITEKEY = "xxxxxx";
const UA =
"userAgentPlaceholder";
// ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
const PROXY_HOST = "PROXY_HOST";
const PROXY_PORT = 1234;
const PROXY_USER = "PROXY_USER";
const PROXY_PASS = "PROXY_PASSWORD";
const proxy = new ProxyAgent(
`http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`,
);
setGlobalDispatcher(proxy);
// ================= INICIALIZAÇÃO DO SDK CAPMONSTER CLOUD =================
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY }),
);
// ================= SESSÃO =================
let cookieHeader = "";
const headers = {
"User-Agent": UA,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
Connection: "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"sec-ch-ua":
'"Chromium";v="150", "Google Chrome";v="150", "Not:A-Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
};
// ================= OBTER A PÁGINA =================
async function fetchPage(url) {
const response = await fetch(url, {
method: "GET",
headers: {
...headers,
...(cookieHeader && {
Cookie: cookieHeader,
}),
},
});
const buffer = Buffer.from(await response.arrayBuffer());
return {
status: response.status,
body: buffer,
};
}
// ================= RESOLVER USANDO O SDK =================
async function solveTurnstile(htmlBase64) {
try {
// Verifica o saldo (opcional)
const balance = await cmcClient.getBalance();
console.log("Saldo:", balance);
// Cria a solicitação de resolução
const turnstileRequest = new TurnstileRequest({
websiteURL: URL,
websiteKey: SITEKEY,
cloudflareTaskType: "cf_clearance",
htmlPageBase64: htmlBase64,
userAgent: UA,
proxy: {
proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
},
});
console.log("Enviando tarefa para resolução...");
const result = await cmcClient.Solve(turnstileRequest);
console.log("Tarefa resolvida!");
return result.solution.cf_clearance;
} catch (error) {
throw new Error(`Erro do SDK CapMonster Cloud: ${error.message}`);
}
}
// ================= FUNÇÃO PRINCIPAL =================
async function main() {
// PRIMEIRA REQUISIÇÃO
const first = await fetchPage(URL);
console.log("Status inicial:", first.status);
console.log(first.body.toString("utf8").substring(0, 800));
// RESOLVER
const htmlBase64 = first.body.toString("base64");
const cfClearance = await solveTurnstile(htmlBase64);
console.log("cf_clearance:", cfClearance);
cookieHeader = `cf_clearance=${cfClearance}`;
// SEGUNDA REQUISIÇÃO
const second = await fetchPage(URL);
console.log("Status final:", second.status);
console.log(second.body.toString("utf8").substring(0, 800));
}
main().catch(console.error);
Mostrar código
import time, base64, requests
# ================= CONFIGURAÇÃO (OU USE .ENV) =================
API_KEY = "YOUR_API_KEY" # Substitua pela sua chave de API do CapMonster Cloud
URL = "https://www.example.com" # Substitua pela URL de destino
SITEKEY = "xxxxxx"
UA = "userAgentPlaceholder"
# ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
PROXY_HOST = "PROXY_HOST"
PROXY_PORT = 1234
PROXY_USER = "PROXY_USER"
PROXY_PASS = "PROXY_PASSWORD"
PROXY_URL = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
PROXY = {
"http": PROXY_URL,
"https": PROXY_URL
}
# ================= SESSÃO =================
session = requests.Session()
session.proxies.update(PROXY)
session.headers.update({
"User-Agent": UA,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"sec-ch-ua": '"Chromium";v="150", "Google Chrome";v="150", "Not:A-Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"'
})
# ================= OBTER A PÁGINA =================
def fetch(url):
return session.get(url, verify=True, timeout=30)
# ================= REQUISIÇÃO POST COM JSON =================
def solve_turnstile(html):
task = {
"clientKey": API_KEY,
"task": {
"type": "TurnstileTask",
"websiteURL": URL,
"websiteKey": SITEKEY,
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": html,
"userAgent": UA,
"proxyType": "http",
"proxyAddress": PROXY_HOST,
"proxyPort": PROXY_PORT,
"proxyLogin": PROXY_USER,
"proxyPassword": PROXY_PASS
}
}
create = requests.post(
"https://api.capmonster.cloud/createTask",
json=task
).json()
if create.get("errorId"):
raise Exception(create)
task_id = create["taskId"]
print("ID da tarefa:", task_id)
while True:
time.sleep(5)
result = requests.post(
"https://api.capmonster.cloud/getTaskResult",
json={
"clientKey": API_KEY,
"taskId": task_id
}
).json()
if result.get("errorId"):
raise Exception(result)
if result.get("status") == "ready":
return result["solution"]["cf_clearance"]
print("Aguardando...")
# ================= FUNÇÃO PRINCIPAL =================
# PRIMEIRA REQUISIÇÃO
resp = fetch(URL)
print("Status inicial:", resp.status_code)
print("\n--- Trecho inicial da página ---")
print(resp.text[:800])
print("\n----------------------------------\n")
# RESOLUÇÃO
cookie = solve_turnstile(
base64.b64encode(resp.content).decode()
)
print("cf_clearance:", cookie)
session.cookies.set(
"cf_clearance",
cookie
)
# SEGUNDA REQUISIÇÃO
resp2 = fetch(URL)
print("Status final:", resp2.status_code)
print("\n--- Trecho final da página ---")
print(resp2.text[:800])
Mostrar código (SDK)
import base64, requests
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo
# ================= CONFIGURAÇÃO (OU USE .ENV) =================
API_KEY = "YOUR_API_KEY" # Substitua pela sua chave de API do CapMonster Cloud
URL = "https://www.example.com" # Substitua pela URL de destino
SITEKEY = "xxxxxx"
UA = "userAgentPlaceholder"
# ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
PROXY_HOST = "PROXY_HOST"
PROXY_PORT = 1234
PROXY_USER = "PROXY_USER"
PROXY_PASS = "PROXY_PASSWORD"
PROXY_URL = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
PROXY = {
"http": PROXY_URL,
"https": PROXY_URL
}
# ================= SESSÃO =================
session = requests.Session()
session.proxies.update(PROXY)
session.headers.update({
"User-Agent": UA,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"sec-ch-ua": '"Chromium";v="150", "Google Chrome";v="150", "Not:A-Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"'
})
# ================= OBTER A PÁGINA =================
def fetch(url):
return session.get(url, verify=True, timeout=30)
# ================= RESOLVER USANDO O SDK =================
async def solve_turnstile(html_base64):
# Inicializar o cliente CapMonster Cloud usando a chave da API
client_options = ClientOptions(api_key=API_KEY)
cap_monster_client = CapMonsterClient(options=client_options)
# Verificar saldo (opcional)
try:
balance = await cap_monster_client.get_balance()
print(f"Saldo: {balance}")
except Exception as e:
print(f"Falha ao obter saldo: {e}")
# Configurar o proxy para o CapMonster Cloud
proxy = ProxyInfo(
proxyType="http",
proxyAddress=PROXY_HOST,
proxyPort=PROXY_PORT,
proxyLogin=PROXY_USER,
proxyPassword=PROXY_PASS
)
# Criar a solicitação de resolução
turnstile_request = TurnstileRequest(
websiteURL=URL,
websiteKey=SITEKEY,
cloudflareTaskType="cf_clearance",
htmlPageBase64=html_base64,
userAgent=UA,
proxy=proxy
)
print("Enviando tarefa para resolução...")
result = await cap_monster_client.solve_captcha(turnstile_request)
print("Tarefa resolvida!")
# Extrair cf_clearance do resultado
return result.get('cf_clearance')
# ================= FUNÇÃO PRINCIPAL =================
async def main():
# PRIMEIRA REQUISIÇÃO
resp = fetch(URL)
print("Status inicial:", resp.status_code)
print("\n--- Trecho inicial da página ---")
print(resp.text[:800])
print("\n----------------------------------\n")
# RESOLVER USANDO O SDK
html_base64 = base64.b64encode(resp.content).decode()
cf_clearance = await solve_turnstile(html_base64)
print("cf_clearance:", cf_clearance)
# Definir cookie para a sessão
if cf_clearance:
session.cookies.set("cf_clearance", str(cf_clearance))
else:
print("Erro: não foi possível obter cf_clearance")
return
# SEGUNDA REQUISIÇÃO
resp2 = fetch(URL)
print("Status final:", resp2.status_code)
print("\n--- Trecho final da página ---")
print(resp2.text[:800])
# ================= EXECUÇÃO =================
if __name__ == "__main__":
asyncio.run(main())
Mostrar código
using System.Net;
using System.Text;
using System.Text.Json;
using System.Text.Json.Nodes;
class Program
{
// ================= CONFIGURAÇÃO (OU USE .ENV) =================
const string API_KEY = "YOUR_API_KEY";
const string URL = "https://www.example.com";
const string SITEKEY = "xxxxxx";
const string UA =
"userAgentPlaceholder";
// ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
const string PROXY_HOST = "PROXY_HOST";
const int PROXY_PORT = 1234;
const string PROXY_USER = "PROXY_USER";
const string PROXY_PASS = "PROXY_PASSWORD";
// ================= SESSÃO =================
static readonly CookieContainer Cookies = new();
static readonly HttpClient Client;
static readonly HttpClient Api = new();
static Program()
{
var handler = new HttpClientHandler
{
Proxy = new WebProxy(PROXY_HOST, PROXY_PORT)
{
Credentials = new NetworkCredential(PROXY_USER, PROXY_PASS)
},
UseProxy = true,
CookieContainer = Cookies,
AutomaticDecompression =
DecompressionMethods.GZip |
DecompressionMethods.Deflate
};
Client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(30)
};
Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", UA);
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.9");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Dest", "document");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Mode", "navigate");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Site", "none");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-User", "?1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua",
"\"Chromium\";v=\"150\", \"Google Chrome\";v=\"150\", \"Not:A-Brand\";v=\"99\"");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-mobile", "?0");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-platform",
"\"Windows\"");
}
// ================= OBTENÇÃO DA PÁGINA =================
static async Task<(HttpStatusCode Status, byte[] Body)> Fetch()
{
var response = await Client.GetAsync(URL);
return (
response.StatusCode,
await response.Content.ReadAsByteArrayAsync()
);
}
// ================= SOLICITAÇÃO POST COM JSON =================
static async Task<JsonNode> PostJson(string url, object body)
{
var response = await Api.PostAsync(
url,
new StringContent(
JsonSerializer.Serialize(body),
Encoding.UTF8,
"application/json"));
var json = await response.Content.ReadAsStringAsync();
return JsonNode.Parse(json)!;
}
static async Task<string> SolveTurnstile(string html)
{
var task = new
{
clientKey = API_KEY,
task = new
{
type = "TurnstileTask",
websiteURL = URL,
websiteKey = SITEKEY,
cloudflareTaskType = "cf_clearance",
htmlPageBase64 = html,
userAgent = UA,
proxyType = "http",
proxyAddress = PROXY_HOST,
proxyPort = PROXY_PORT,
proxyLogin = PROXY_USER,
proxyPassword = PROXY_PASS
}
};
var create = await PostJson(
"https://api.capmonster.cloud/createTask",
task);
if (create["errorId"] != null)
throw new Exception(create.ToString());
int taskId = create["taskId"]!.GetValue<int>();
Console.WriteLine("ID da tarefa: " + taskId);
while (true)
{
await Task.Delay(5000);
var result = await PostJson(
"https://api.capmonster.cloud/getTaskResult",
new
{
clientKey = API_KEY,
taskId
});
if (result["errorId"] != null)
throw new Exception(result.ToString());
if (result["status"]!.GetValue<string>() == "ready")
{
return result["solution"]!["cf_clearance"]!
.GetValue<string>();
}
Console.WriteLine("Aguardando...");
}
}
// ================= FUNÇÃO PRINCIPAL =================
static async Task Main()
{
// PRIMEIRA REQUISIÇÃO
var resp = await Fetch();
Console.WriteLine("Status inicial: " + (int)resp.Status);
Console.WriteLine("\n--- Trecho inicial da página ---");
Console.WriteLine(
Encoding.UTF8.GetString(resp.Body)
.Substring(0, Math.Min(800, resp.Body.Length))
);
Console.WriteLine("\n----------------------------------\n");
// RESOLUÇÃO
string cookie = await SolveTurnstile(
Convert.ToBase64String(resp.Body)
);
Console.WriteLine("cf_clearance: " + cookie);
Cookies.Add(
new Uri(URL),
new Cookie("cf_clearance", cookie)
);
// SEGUNDA REQUISIÇÃO
var resp2 = await Fetch();
Console.WriteLine("Status final: " + (int)resp2.Status);
Console.WriteLine("\n--- Trecho final da página ---");
Console.WriteLine(
Encoding.UTF8.GetString(resp2.Body)
.Substring(0, Math.Min(800, resp2.Body.Length))
);
}
}
Mostrar código (SDK)
using System.Net;
using System.Text;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
using Zennolab.CapMonsterCloud.Responses;
class Program
{
// ================= CONFIGURAÇÃO (OU USE .ENV) =================
const string API_KEY = "YOUR_API_KEY"; // Substitua pela sua API-key do CapMonster Cloud
const string URL = "https://www.example.com"; // Substitua pela URL de destino
const string SITEKEY = "xxxxxx";
const string UA =
"userAgentPlaceholder";
// ================= PROXY (SUBSTITUA PELOS DADOS DO SEU PROXY) =================
const string PROXY_HOST = "PROXY_HOST";
const int PROXY_PORT = 1234;
const string PROXY_USER = "PROXY_USER";
const string PROXY_PASS = "PROXY_PASSWORD";
// ================= SESSÃO =================
static readonly CookieContainer Cookies = new();
static readonly HttpClient Client;
static readonly ICapMonsterCloudClient CmCloudClient;
static Program()
{
// Configuração do proxy para o cliente HTTP
var handler = new HttpClientHandler
{
Proxy = new WebProxy(PROXY_HOST, PROXY_PORT)
{
Credentials = new NetworkCredential(PROXY_USER, PROXY_PASS)
},
UseProxy = true,
CookieContainer = Cookies,
AutomaticDecompression =
DecompressionMethods.GZip |
DecompressionMethods.Deflate
};
Client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(30)
};
// Configuração dos cabeçalhos
Client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", UA);
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.9");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Upgrade-Insecure-Requests", "1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Dest", "document");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Mode", "navigate");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-Site", "none");
Client.DefaultRequestHeaders.TryAddWithoutValidation("Sec-Fetch-User", "?1");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua",
"\"Chromium\";v=\"150\", \"Google Chrome\";v=\"150\", \"Not:A-Brand\";v=\"99\"");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-mobile", "?0");
Client.DefaultRequestHeaders.TryAddWithoutValidation("sec-ch-ua-platform",
"\"Windows\"");
// Inicialização do cliente CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = API_KEY
};
CmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
}
// ================= OBTENÇÃO DA PÁGINA =================
static async Task<(HttpStatusCode Status, byte[] Body)> Fetch()
{
var response = await Client.GetAsync(URL);
return (
response.StatusCode,
await response.Content.ReadAsByteArrayAsync()
);
}
// ================= RESOLUÇÃO ATRAVÉS DO SDK =================
static async Task<string> SolveTurnstile(string htmlBase64)
{
try
{
// Verificação de saldo (opcional)
try
{
var balance = await CmCloudClient.GetBalanceAsync(CancellationToken.None);
Console.WriteLine($"Saldo: {balance}");
}
catch (Exception ex)
{
Console.WriteLine($"Não foi possível obter o saldo: {ex.Message}");
}
// Criação da solicitação de resolução
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = URL,
WebsiteKey = SITEKEY,
CloudflareTaskType = "cf_clearance",
HtmlPageBase64 = htmlBase64,
UserAgent = UA,
Proxy = new ProxyContainer(
PROXY_HOST,
PROXY_PORT,
ProxyType.Http,
PROXY_USER,
PROXY_PASS
)
};
Console.WriteLine("Enviando tarefa para resolução...");
// Resolução do captcha
var result = await CmCloudClient.SolveAsync(turnstileRequest, CancellationToken.None);
Console.WriteLine("Tarefa resolvida!");
// Extração do cf_clearance do resultado
if (result.Solution != null)
{
// Tentando obter o Clearance
var clearance = result.Solution.Clearance;
if (!string.IsNullOrEmpty(clearance))
{
return clearance;
}
}
return string.Empty;
}
catch (Exception ex)
{
throw new Exception($"Erro do CapMonster Cloud SDK: {ex.Message}", ex);
}
}
// ================= FUNÇÃO PRINCIPAL =================
static async Task Main()
{
try
{
// PRIMEIRA REQUISIÇÃO
var resp = await Fetch();
Console.WriteLine($"Status inicial: {(int)resp.Status}");
Console.WriteLine("\n--- Trecho inicial da página ---");
var bodyText = Encoding.UTF8.GetString(resp.Body);
Console.WriteLine(bodyText.Length > 800 ? bodyText[..800] : bodyText);
Console.WriteLine("\n----------------------------------\n");
// RESOLUÇÃO ATRAVÉS DO SDK
var htmlBase64 = Convert.ToBase64String(resp.Body);
var cfClearance = await SolveTurnstile(htmlBase64);
if (string.IsNullOrEmpty(cfClearance))
{
Console.WriteLine("Erro: não foi possível obter cf_clearance");
return;
}
Console.WriteLine($"cf_clearance: {cfClearance}");
// Configuração do cookie para a sessão
Cookies.Add(
new Uri(URL),
new Cookie("cf_clearance", cfClearance)
);
// SEGUNDA REQUISIÇÃO
var resp2 = await Fetch();
Console.WriteLine($"Status final: {(int)resp2.Status}");
Console.WriteLine("\n--- Trecho final da página ---");
var bodyText2 = Encoding.UTF8.GetString(resp2.Body);
Console.WriteLine(bodyText2.Length > 800 ? bodyText2[..800] : bodyText2);
}
catch (Exception ex)
{
Console.WriteLine($"Erro: {ex.Message}");
}
}
}
