-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrecaptcha_classification.js
More file actions
98 lines (83 loc) · 3.6 KB
/
recaptcha_classification.js
File metadata and controls
98 lines (83 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import 'dotenv/config';
import axios from 'axios';
import { readFileSync } from 'fs';
// Configuracion de la API de CapSolver
const CAPSOLVER_API_KEY = process.env.CAPSOLVER_API_KEY;
const CREATE_TASK_URL = 'https://api.capsolver.com/createTask';
// Tipos de preguntas para clasificacion de ReCaptcha
const QUESTION_TYPES = {
cars: '/m/0k4j', // coches
motorcycles: '/m/04_sv', // motocicletas
taxis: '/m/0pg52', // taxis
buses: '/m/01bjv', // autobuses
traffic_lights: '/m/015qff', // semaforos
bicycles: '/m/0199g', // bicicletas
boats: '/m/019jd', // barcos
crosswalks: '/m/014xcs', // pasos de peatones
fire_hydrants: '/m/01pns0', // hidrantes
parking_meters: '/m/015qbp', // parquimetros
stairs: '/m/01lynh', // escaleras
chimneys: '/m/01jk_4', // chimeneas
bridges: '/m/015kr', // puentes
tractors: '/m/07j7r', // tractores
palm_trees: '/m/0cdl1', // palmeras
mountains: '/m/09d_r', // montañas
hills: '/m/0cnMx' // colinas
};
/**
* Clasificar desafios de imagenes de ReCaptcha v2.
* @param {Object} options - Objeto de opciones
* @param {string} options.imagePath - Ruta al archivo de imagen del captcha
* @param {string} options.imageBase64 - Imagen codificada en Base64 (alternativa a imagePath)
* @param {string} options.question - Tipo de objeto a identificar (ver QUESTION_TYPES)
* @returns {Promise<Object>} Solucion conteniendo indices de objetos o flag hasObject
*/
async function solveRecaptchaClassification({ imagePath, imageBase64, question = 'cars' }) {
// Obtener imagen en base64
if (imagePath) {
const imageBuffer = readFileSync(imagePath);
imageBase64 = imageBuffer.toString('base64');
}
if (!imageBase64) {
throw new Error('Se debe proporcionar imagePath o imageBase64');
}
// Convertir nombre de pregunta a codigo si es necesario
const questionCode = QUESTION_TYPES[question] || question;
const payload = {
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2Classification',
image: imageBase64,
question: questionCode
}
};
// ReCaptchaV2Classification devuelve resultado directamente (no necesita polling)
const response = await axios.post(CREATE_TASK_URL, payload);
const result = response.data;
if (result.errorId !== 0) {
throw new Error(`Error al resolver: ${result.errorDescription}`);
}
return result.solution || {};
}
async function main() {
if (!CAPSOLVER_API_KEY) {
console.log('Error: CAPSOLVER_API_KEY no encontrada en el archivo .env');
console.log('Por favor, crea un archivo .env con tu clave API:');
console.log('CAPSOLVER_API_KEY=tu_clave_api_aqui');
return;
}
console.log('Clasificacion de Imagenes ReCaptcha v2');
console.log('\nTipos de preguntas disponibles:');
for (const [name, code] of Object.entries(QUESTION_TYPES)) {
console.log(` ${name}: ${code}`);
}
console.log('\nEjemplo de uso:');
console.log(' const solution = await solveRecaptchaClassification({ imagePath: "captcha.png", question: "cars" });');
console.log(' // o');
console.log(' const solution = await solveRecaptchaClassification({ imageBase64: "...", question: "/m/0k4j" });');
console.log('\nFormato de respuesta:');
console.log(" Multi-objeto: { type: 'multi', objects: [0, 1, 2], size: 3 }");
console.log(" Objeto-unico: { type: 'single', hasObject: true, size: 1 }");
}
main();
export { solveRecaptchaClassification, QUESTION_TYPES };