Use o SDK de Node.js no AWS Lambda
Use Node.js 22 ou posterior e inclua o SDK oficial no pacote do seu handler. Defina o prazo limite do SDK abaixo do tempo de execução restante do Lambda para que a função tenha tempo de retornar os IDs da tarefa e do erro.
Nesta página
Empacote o SDK e configure o destino
- 1.
Instale a dependência
Inicialize um pacote npm em um diretório de build limpo. Use npm para instalar o tarball oficial em
https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. Ele fornece a importação@solvethree/sdk; não suponha que exista uma versão publicada no registro npm. - 2.
Configure o workspace e o destino
Defina variáveis de ambiente privadas do Lambda chamadas
SOLVETHREE_API_KEY,CAPTCHA_SITEeSOLVETHREE_PROXY. Use uma chave de API do workspace, o hostname de destino em vez de uma URL completa e o proxy para esta tarefa. O workspace já deve ter um perfil ativo para esse site; consulte a configuração do perfil do site. - 3.
Salve e empacote o handler
Salve o exemplo abaixo como
index.mjs. Crie um ZIP comindex.mjs, os metadados do pacote e o diretórionode_modulesinstalado na raiz do arquivo — não dentro de um diretório de projeto que os contenha. Não inclua credenciais no ZIP. - 4.
Implante pelo seu processo existente do Lambda
Use o runtime Node.js 22 e defina o handler como
index.handler. Invoque-o pelo seu backend autorizado ou fluxo IAM, fornecendo umrequestIdestável para o trabalho lógico. Mantenha privados os dados da solução retornados.
O exemplo usa a ação login; altere-a para a ação esperada pelo destino antes de implantar. Ele envia um proxy e usa o tipo de requisição padrão enterprise-v3. Não adicione os campos reCAPTCHA type nem url.
Limite a espera do SDK ao tempo disponível da invocação
import { Solvethree, SolvethreeError, TaskFailedError, ApiError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export const handler = async (event, context) => {
const timeoutMs = Math.min(180000, context.getRemainingTimeInMillis() - 1500);
if (timeoutMs < 1000) throw new Error('Not enough execution time to start a task');
// The caller supplies one stable ID for this logical job; Lambda retries must
// reuse it. awsRequestId changes with invocations and is not that logical ID.
if (!event.requestId) throw new Error('Provide a stable requestId');
try {
return await client.solve({
site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
requestId: event.requestId,
}, { timeoutMs, signal: AbortSignal.timeout(timeoutMs) });
} catch (error) {
if (error instanceof TaskFailedError) return { status: 'failed', id: error.taskId, errorCode: error.errorCode };
if (error instanceof ApiError) return { apiError: error.status, requestId: error.requestId };
if (error instanceof SolvethreeError) return { interrupted: true, requestId: error.requestId, taskId: error.taskId };
throw error;
}
};
// Invoke through your authorized backend/IAM flow. The return value is private
// solution data; do not attach this handler to an unauthenticated public URL.O handler lê o tempo de execução restante do Lambda, reserva 1,500 milissegundos e limita a espera do SDK a 180,000 milissegundos. Esse limite pertence a este exemplo; não é um limite universal de execução do Lambda. Com menos de um segundo restante após a reserva, o handler se recusa a iniciar.
Tanto o tempo limite do SDK quanto o sinal de cancelamento usam o prazo calculado. solve cria a tarefa uma única vez e a consulta até que esteja pronta ou ocorra um erro. A reserva dá tempo ao tratamento de erros para retornar informações de recuperação, mas um encerramento forçado do Lambda ainda pode impedir qualquer resposta.
O chamador deve manter event.requestId nas novas tentativas de invocação. Use 1–64 letras ASCII, números, sublinhados ou hífens. Não use awsRequestId: ele identifica uma invocação, não a requisição lógica de resolução.
Trate falhas sem iniciar outra resolução às cegas
| Resultado | O que fazer |
|---|---|
Uma tarefa com status ready | Use a solução dela. Apenas a criação da tarefa ou uma resposta HTTP bem-sucedida não basta. |
status: failed | Registre id e errorCode. Consulte a tarefa se precisar da mensagem de erro, mas pare de consultar periodicamente essa tarefa com falha. |
apiError | Registre o status HTTP e o ID de requisição retornado. Isso é um erro de requisição da API, não uma falha final da tarefa; inspecione a causa antes de tentar novamente com os mesmos dados de entrada. |
interrupted: true | Guarde qualquer taskId e requestId retornado, junto com o ID original da requisição lógica do chamador, para recuperação. |
Erros de validação e erros inesperados são relançados. O handler não transforma toda exceção em uma resposta de interrupção.
- 1.
Recupere pelo ID da tarefa quando disponível
Consulte a tarefa existente com
getTask.pendingesolvingsignificam que ela ainda está em execução; apenasreadycontém uma solução utilizável. Mantenha qualquer espera adicional dentro do tempo restante da nova invocação. - 2.
Caso contrário, recupere pelo ID da requisição lógica
Repita a mesma solicitação de tarefa com o
requestIdoriginal de quem fez a chamada. Entradas idênticas retornam a tarefa existente; entradas diferentes geram conflito. Mantenha o site, a ação e o proxy inalterados durante a recuperação, inclusive após mudanças de configuração.
Um tempo limite de conexão não comprova que a criação da tarefa falhou. Recupere a tarefa existente antes de atribuir um novo ID de solicitação lógica. Consulte consulta periódica de tarefas e tratamento de erros da API para entender os contratos envolvidos.
Envie usando o mesmo proxy e a identidade de navegador retornada
O SDK retorna os dados da solução; ele não os aplica ao destino. Quando sua aplicação os enviar, use o proxy configurado e os valores de userAgent e secChUa retornados. Não os substitua por uma identidade de navegador ou URL de destino sem relação com a tarefa. Uma tarefa pronta significa que uma solução foi gerada — não que o destino aceitou a solicitação subsequente.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.