-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrecaptcha_classification.py
More file actions
100 lines (80 loc) · 3.35 KB
/
recaptcha_classification.py
File metadata and controls
100 lines (80 loc) · 3.35 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
99
100
import os
import base64
import requests
from dotenv import load_dotenv
# Cargar variables de entorno desde el archivo .env
load_dotenv()
# Configuracion de la API de CapSolver
CAPSOLVER_API_KEY = os.getenv("CAPSOLVER_API_KEY")
CREATE_TASK_URL = "https://api.capsolver.com/createTask"
# Tipos de preguntas para clasificacion de ReCaptcha
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
}
def solve_recaptcha_classification(image_path=None, image_base64=None, question="cars"):
"""
Clasificar desafios de imagenes de ReCaptcha v2.
Args:
image_path: Ruta al archivo de imagen del captcha
image_base64: Imagen codificada en Base64 (alternativa a image_path)
question: Tipo de objeto a identificar (ver QUESTION_TYPES)
Returns:
Solucion conteniendo indices de objetos o flag hasObject
"""
# Obtener imagen en base64
if image_path:
with open(image_path, "rb") as f:
image_base64 = base64.b64encode(f.read()).decode("utf-8")
if not image_base64:
raise ValueError("Se debe proporcionar image_path o image_base64")
# Convertir nombre de pregunta a codigo si es necesario
question_code = QUESTION_TYPES.get(question, question)
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2Classification",
"image": image_base64,
"question": question_code
}
}
# ReCaptchaV2Classification devuelve resultado directamente (no necesita polling)
response = requests.post(CREATE_TASK_URL, json=payload)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Error al resolver: {result.get('errorDescription')}")
return result.get("solution", {})
def main():
if not CAPSOLVER_API_KEY:
print("Error: CAPSOLVER_API_KEY no encontrada en el archivo .env")
print("Por favor, crea un archivo .env con tu clave API:")
print("CAPSOLVER_API_KEY=tu_clave_api_aqui")
return
print("Clasificacion de Imagenes ReCaptcha v2")
print("\nTipos de preguntas disponibles:")
for name, code in QUESTION_TYPES.items():
print(f" {name}: {code}")
print("\nEjemplo de uso:")
print(' solution = solve_recaptcha_classification(image_path="captcha.png", question="cars")')
print(' # o')
print(' solution = solve_recaptcha_classification(image_base64="...", question="/m/0k4j")')
print("\nFormato de respuesta:")
print(" Multi-objeto: {'type': 'multi', 'objects': [0, 1, 2], 'size': 3}")
print(" Objeto-unico: {'type': 'single', 'hasObject': True, 'size': 1}")
if __name__ == "__main__":
main()