Chame a API de CAPTCHA a partir do Cloudflare Workers
Use um Worker para chamar a API de tarefas do solvethree com fetch no servidor. Mantenha a chave de API do espaço de trabalho em um binding de segredo, defina as entradas do destino no Worker e retorne respostas de tarefas apenas ao chamador autorizado da sua aplicação.
Nesta página
Configure o destino e os segredos
Primeiro, ative no console o perfil do site de destino para seu espaço de trabalho. Enviar um hostname e uma ação não cria um perfil. Consulte a configuração do perfil do site se esse pré-requisito ainda não estiver concluído.
SOLVETHREE_API_KEY: a chave de API do seu espaço de trabalho, armazenada como um segredo do Worker.INTEGRATION_KEY: um segredo separado que o chamador da sua aplicação deve enviar emx-integration-key.SOLVETHREE_PROXY: a URL do proxy usado na resolução. Armazene-a como segredo se contiver credenciais.CAPTCHA_SITE: o hostname de destino, não uma URL completa.
O exemplo fixa a ação em login e fornece um único proxy. Altere essas entradas na implantação para corresponder à sua integração; não aceite entradas de destino arbitrárias dos chamadores. Quando recaptchaType é omitido, a API usa reCAPTCHA Enterprise v3 por padrão.
Use a chave de integração entre um chamador confiável da aplicação e o Worker, não em código de navegador distribuído publicamente. Ela é uma credencial compartilhada, não uma autorização de tarefas por usuário.
Crie e consulte tarefas
export default {
async fetch(request, env) {
if (!env.INTEGRATION_KEY || request.headers.get('x-integration-key') !== env.INTEGRATION_KEY) {
return new Response('Unauthorized', { status: 401 });
}
const url = new URL(request.url);
const headers = { Authorization: `Bearer ${env.SOLVETHREE_API_KEY}`, 'Content-Type': 'application/json' };
let response;
if (request.method === 'POST') {
const requestId = request.headers.get('x-request-id');
if (!requestId || !/^[A-Za-z0-9_-]{1,64}$/.test(requestId)) return new Response('Provide X-Request-ID', { status: 400 });
response = await fetch('https://api.solvethree.com/v1/tasks?waitMs=0', {
method: 'POST', headers, redirect: 'error', signal: AbortSignal.timeout(20000),
body: JSON.stringify({ site: env.CAPTCHA_SITE, action: 'login', proxy: env.SOLVETHREE_PROXY, requestId }),
});
} else if (request.method === 'GET') {
const id = url.searchParams.get('id');
if (!id || !/^[A-Za-z0-9_-]{1,128}$/.test(id)) return new Response('Provide a valid id', { status: 400 });
response = await fetch(`https://api.solvethree.com/v1/tasks/${encodeURIComponent(id)}?waitMs=15000`, {
headers, redirect: 'error', signal: AbortSignal.timeout(25000),
});
} else return new Response('Use POST or GET', { status: 405 });
if (!response.ok) return Response.json({ error: 'Solver API request failed', status: response.status }, { status: response.status });
return Response.json(await response.json(), { headers: { 'Cache-Control': 'no-store' } });
},
};
// Store keys in Worker secret bindings. The task proxy field does not add a
// generic HTTP proxy option to Workers fetch; another client must submit through it.- 1.
Crie uma tarefa
Envie um POST ao Worker com
x-integration-keyex-request-id. Escolha um ID de solicitação com 1–64 letras ASCII, números, sublinhados ou hífens. O Worker monta o corpo da tarefa a partir do destino e do proxy configurados; ele não usa um corpo fornecido pelo chamador. - 2.
Guarde o ID da tarefa
O Worker retorna a resposta JSON do serviço de resolução. Salve o ID da tarefa retornado e mantenha o ID de solicitação usado para criá-la.
- 3.
Consulte o resultado
Envie um GET ao Worker com o ID da tarefa no parâmetro de consulta
ide o mesmo cabeçalho da chave de integração. O handler valida a sintaxe do ID e consulta essa tarefa no solvethree.
As duas solicitações ao serviço usam a chave do espaço de trabalho para autenticação. O handler repassa códigos de status HTTP que não indicam sucesso com um corpo de erro genérico e marca as respostas JSON bem-sucedidas com Cache-Control: no-store. Ele não verifica a propriedade da tarefa além da chave de integração compartilhada; adicione essa autorização antes de disponibilizar a consulta a usuários distintos.
Trate os tempos limite sem criar outra tarefa
A criação usa waitMs=0 com um tempo limite de fetch de 20 segundos. A consulta usa waitMs=15000 com um tempo limite de fetch de 25 segundos. Esses limites se aplicam a chamadas HTTP individuais, não ao tempo de vida total da tarefa.
Se a criação exceder o tempo limite antes de você receber um ID de tarefa, repita a mesma solicitação de tarefa com o mesmo ID de solicitação. Isso recupera a tarefa existente, caso ela tenha sido criada. Não gere um novo ID só porque a conexão falhou: a primeira solicitação pode já ter chegado ao solvethree. Reutilizar um ID com entradas alteradas gera conflito.
O exemplo não captura exceções de fetch, incluindo tempos limite. Adicione tratamento de exceções se o chamador precisar de uma resposta de erro estruturada, mas mantenha o ID de solicitação disponível para recuperação.
pendingousolving: consulte a mesma tarefa novamente, respeitando um prazo total definido no chamador.ready: a solução está disponível; pare as consultas periódicas e passe-a ao cliente de envio.failed: pare as consultas periódicas e inspecioneerrorCodeeerror. Corrija o problema informado antes de criar outra tarefa.
Um erro HTTP e uma tarefa com status failed são falhas diferentes. O handler verifica primeiro o status HTTP; o chamador ainda precisa inspecionar o status da tarefa em uma resposta bem-sucedida. Para diagnóstico, consulte erros da API de CAPTCHA.
Envie por um cliente que possa usar o proxy
O exemplo de Worker chama apenas o solvethree. O campo proxy da tarefa informa ao serviço de resolução qual proxy usar; ele não altera o roteamento de rede do Worker. O fetch do Workers não tem uma opção genérica de URL de proxy.
Envie a solução pronta a um cliente que possa enviá-la ao destino pretendido pelo mesmo proxy. Use os valores de userAgent e secChUa retornados na solução, em vez de cabeçalhos de navegador sem relação com ela. Uma tarefa pronta significa que o solvethree gerou uma solução; a aceitação depende da solicitação subsequente ao destino.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.