viernes, 7 de enero de 2011

Rompiendo captchas

Por cosas de la vida, últimamente ando trasteando con las arañas, crawleando cosas varias... y al final era inevitable toparse con los CAPTCHAs, así que se me ha presentado la ocasión de intentar vencerlos, por ahora esto es lo poco que he conseguido [ captcha_baker.py ], lo poco que hace el propio script es leer los pixels de la primera línea y pasar a blanco los que estén cerca de estos, y a negro el resto. Después corta las letras por las columnas en blanco.

El valor de la "cercanía" es modificable (de hecho la idea viene del parámetro "umbral" de la selección de color de GIMP).

Depende de Image Magick para convertir las imágenes a BMP, Python Image Library para recortar las letras y tesseract-ocr para reconocer las letras.

No funciona demasiado bien, pero estoy bastante contento con el resultado para ser una primera prueba.

Los parámetros son:


./captcha_baker.py <imágen> <número de letras> [<umbral>]


El número de letras no es realmente necesario, se puede poner a 0 para no considerarlo. El umbral por defecto es 15. Por último unas muestras.

El tipo de captchas para el que esta pensado:

$ ./captcha_baker.py img.png 0 75
Convirtiendo a img.bmp ...
24
Leyendo primera fila
Aplicando un umbral de 75
Guardando base: output.bmp
Partiendo nosecuantas letras
Letra 1: L
Letra 2: L
Letra 3: I
Letra 4: B
Resultado: LLIB


Uno que me encotré por ahí [ Python ocr or How to break captchas ]:

$ ./captcha_baker.py captcha.bmp 0 75
24
Leyendo primera fila
Aplicando un umbral de 75
Guardando base: output.bmp
Partiendo nosecuantas letras
Letra 1: W
Letra 2: 6
Letra 3: 8
Letra 4: 8
Letra 5: H
Letra 6: P
Resultado: W68HP


Y uno que no consigue separar las letras porque no hay columnas en blanco, pero algo hace...

$ ./captcha_baker.py img.jpeg 0 150
Convirtiendo a img.bmp ...
24
Leyendo primera fila
Aplicando un umbral de 150
Guardando base: output.bmp
Partiendo nosecuantas letras
Letra 1: \
Resultado: \
$

Peeero si se ve el archivo intermedio, antes de cortar:
se puede ver que el que escribe metió la pata al programar la clase BMP ... ah! y que algo sí que limpia.

Nos vemos

2 comentarios:

  1. Qu artista! Antes de ayer tuve que hacer un script para crear captchas... y veo que el 50% te los cargaras :) pero bueno, ah va a quedar...

    ResponderEliminar
  2. Bueno, habrá que conformarse el 50% xD

    Espero que no haya ningún spammer por aquí :P

    ResponderEliminar