Use um resolvedor de CAPTCHA com Puppeteer
Use o SDK JavaScript oficial para obter um token de reCAPTCHA v3 Enterprise e depois passe solution.token para seu formulário pelo Puppeteer. O SDK resolve a tarefa; ele não aplica a solução a um navegador nem fornece um plugin de navegador.
O exemplo abaixo usa um formulário HTTPS sob seu controle com uma textarea g-recaptcha-response e um botão de envio. Esses são os requisitos do formulário da demonstração, não uma interface universal para páginas protegidas por reCAPTCHA.
Nesta página
Prepare as dependências e o formulário sob seu controle
- 1.
Instale o Puppeteer e o SDK
Use Node.js 22 ou posterior. Com npm, instale
puppeteere o tarball do SDK oficial emhttps://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. O SDK é importado como@solvethree/sdk; use a URL de download em vez de presumir que há uma versão publicada no registro npm. Salve o exemplo como um módulo ES, por exemplo, em um arquivo com extensão.mjs. - 2.
Configure o perfil do site
Configure o hostname sob seu controle no console do solvethree e verifique se o perfil está ativo para seu espaço de trabalho. Enviar um hostname e uma ação não cria esse perfil. O exemplo usa a ação
login; altere-a para a ação configurada para sua aplicação. - 3.
Defina as variáveis de ambiente
Defina
TARGET_URLcomo a URL do formulário HTTPS sob seu controle,SOLVETHREE_PROXYcomo a URL do seu proxy HTTP ou HTTPS eSOLVETHREE_API_KEYcomo a chave do seu espaço de trabalho. Mantenha a chave no processo Node.js, não no JavaScript da página. O exemplo usa um único proxy tanto para a resolução quanto para o envio pelo navegador.
O site da tarefa é o hostname extraído de TARGET_URL, não a URL completa da página. Para reCAPTCHA, envie site, action e exatamente um entre proxy e proxyCandidates; não adicione um campo type ou url. Este exemplo usa proxy para que o Puppeteer possa usar esse mesmo proxy diretamente.
Resolva e depois abra o Puppeteer com a mesma identidade
// Install puppeteer and the official solvethree SDK first.
import puppeteer from 'puppeteer';
import { Solvethree } from '@solvethree/sdk';
const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy.protocol}//${proxy.host}`],
});
try {
const page = await browser.newPage();
if (proxy.username) await page.authenticate({
username: decodeURIComponent(proxy.username),
password: decodeURIComponent(proxy.password),
});
await page.setUserAgent({ userAgent: result.solution.userAgent });
await page.setExtraHTTPHeaders({ 'sec-ch-ua': result.solution.secChUa });
await page.goto(target.href);
// Adapt these selectors and any required callback to your own form.
await page.waitForSelector('[name="g-recaptcha-response"]');
await page.$eval('[name="g-recaptcha-response"]', (field, token) => {
field.value = token;
field.dispatchEvent(new Event('input', { bubbles: true }));
}, result.solution.token);
await Promise.all([
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
page.click('button[type="submit"]'),
]);
// Check your application's success response here.
} finally {
await browser.close();
}client.solve cria a tarefa uma única vez e consulta seu status até que esteja pronta ou lance uma exceção. Este exemplo só inicia o Puppeteer após o retorno dessa chamada. O navegador usa o proxy da tarefa, autentica-se quando há credenciais de proxy e aplica solution.userAgent e solution.secChUa antes de navegar.
Não substitua esse proxy ou essa identidade de navegador por valores sem relação com a resolução ao enviar o token. Se depois você mudar para proxyCandidates, use a função auxiliar successfulProxy do SDK para selecionar o proxy original vencedor para o navegador.
Se a resolução falhar, inspecione errorCode e error da tarefa em vez de tentar novamente com as mesmas entradas. Erros de requisição HTTP são diferentes de falhas terminais de tarefa. O bloco finally fecha o navegador local após o trabalho no navegador; fechar páginas não é um mecanismo de cancelamento remoto de tarefas.
Adapte as premissas do formulário da demonstração
[name="g-recaptcha-response"]seleciona a textarea da demonstração. Substitua-o se sua aplicação receber o token por outro campo ou parâmetro de requisição. O valor a enviar ésolution.token, não o ID da tarefa.button[type="submit"]seleciona o botão de envio da demonstração. Use o controle ou mecanismo de envio real da sua aplicação.- O exemplo atribui o token e dispara um evento
input. Isso não substitui um callback específico da aplicação. Adicione qualquer callback, valor de CSRF, campos de login e configuração de sessão necessários antes do envio. - Substitua o comentário final de verificação de sucesso por uma asserção que verifique a resposta da aplicação ou o estado resultante. Uma tarefa de resolução pronta não comprova que a aplicação aceitou o token.
Se você reutilizar um navegador em execução, escolha seu BrowserContext de forma deliberada: uma nova página não é automaticamente uma sessão separada. Mantenha os requisitos de sessão do formulário juntos em vez de misturar páginas de fluxos sem relação entre si.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.