Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo enviar códigos de verificación en lotes usando Python

Cómo enviar códigos de verificación en lotes usando Python

Hoy en día, para evitar que los robots envíen formularios en páginas web, los códigos de verificación de imágenes son uno de los métodos más comunes. No entraré en detalles aquí, creo que todos lo han encontrado.

Ahora proporcione el código para implementar la imagen captcha usando la biblioteca PIL de Python. Hay comentarios detallados en el código.

#! /usr/bin/env python

#coding=utf-8

importar aleatorio

desde PIL importar imagen, ImageDraw, ImageFont, ImageFilter

_letter_cases = "abcdefghjjkmnpqrstuvwxy" # Letras minúsculas, eliminar posibles interferencias i, l, o, z

_upper_cases = _letter_cases.upper() # Letras mayúsculas

_numbers = ' '.join(map(str, range(3, 10)))# Números

init_chars = ''.join((_letter_cases, _upper_cases, _numbers))

def create_validate_code( tamaño=(120, 30),

chars=init_chars,

img_type="GIF",

mode="RGB",

bg_color= (255, 255, 255),

fg_color=(0, 0, 255),

font_ size=18,

font_type="ae_AlArabiya .ttf ",

longitud=4,

draw_line=Verdadero,

n_line=(1, 2),

draw_points= Verdadero,

point_chance = 2):

'''

@todo: Generar imagen del código de verificación

@param size: Tamaño de la imagen, formato (ancho, alto), el valor predeterminado es (120, 30)

@param chars: tamaño de fuente del código de verificación

@param font_type: fuente del código de verificación, el valor predeterminado es ae_AlArabiya ttf<. /p>

@param longitud Número de caracteres del código de verificación

@param draw_lines: si se dibujan líneas de interferencia

@param n_lines: si se dibujan puntos de interferencia

@param point_chance: probabilidad de que ocurra un punto de interferencia, rango de tamaño [0, 100]

@return: [0]: instancia de imagen PIL

@return: [1 ] :Cadena en la imagen del código de verificación

'''

ancho, alto = tamaño # Ancho, alto

ancho, alto = tamaño # Ancho, alto

Ancho, alto. alto = tamaño # Ancho, alto

img = Image.new(mode, size, bg_color) # Crear gráficos

draw = ImageDraw .Draw(img) # Crear pincel

def get_chars():

'''generar cadena de longitud dada, devolver formato de lista'''

return random.sample(chars, length)

def create_lines():

'''Dibujar líneas de interferencia'''

line_num = random.randint(0 , tamaño[0])

, random.randint(0, tamaño[1]))

draw.line([begin, end], fill=(0, 0, 0))

def create_points( ):

'''Dibujar puntos de interferencia''

chance = min(100, max(0, int(point_chance)))# El límite de tamaño es [0, 100]

para w en xrange(ancho):

para h en xrange(alto):

tmp = random.randint(0, 100)

si tmp > 100 - probabilidad:

draw.point((w, h), fill=(0, 0, 0))

def create_strs():

'''Dibujar caracteres CAPTCHA''

c_chars = get_chars()

strs = ' %s ' % ' '.join(c_chars) # cada uno Separado caracteres con espacios antes y después

font = ImageFont.truetype(font_type, font_size)

font_width, font_height = font.get size(strs)

dibujar. text(((ancho - ancho_fuente) / 3, (alto - alto_fuente) / 3),

cadenas, fuente=fuente, relleno=fg_color)

return ''.join (c_chars)

si dibuja_líneas:

create_lines()

si dibuja _puntos:

create_points()

strs = create_strs()

# Parámetros de distorsión gráfica

params = [1 - float(random.randint(1, 2))/ 100,

0,

0,

0,

1 - flotante(random.randint(1, 10)) / 100,

float(random.randint(1, 2))/ 500,

0.001,

float(random.randint(1, 2))/ 500

]

img = img.transform(size, Image.PERSPECTIVE, params) # Crear una transformación

img = img.filter(ImageFilter.EDGE_ ENHANCE_MORE) # Usar mejora de límites (más grande filter

Devuelve img, strs

if __name__ == "__main__":

code_img = create_validate_code()

code_ img.Save ("validate.gif", "GIF")

El resultado final devuelve una tupla, el primer valor de retorno es una instancia de la clase de imagen y el segundo parámetro es la cadena en la imagen (para comparar para ver si es correcto).

El resultado final devuelve una tupla, el primer valor de retorno es una instancia de la clase de imagen y el segundo parámetro es la cadena en la imagen (utilizada para comparar si es correcta).

Cabe señalar que si se produce una excepción IOError al generar una instancia ImageFont.truetype, es posible que la computadora que ejecuta el código no contenga la fuente especificada y deba descargar e instalar la fuente. .

El efecto de la imagen del código de verificación generada:

En este punto, los estudiantes cuidadosos pueden querer preguntar si cada vez que se genera un código de verificación, la imagen generada debe guardarse primero. y luego Mostrar en la página? Hacerlo sería inaceptable. En este punto, necesitamos usar el módulo StringIO integrado de Python, que se comporta como un objeto de archivo, pero opera en archivos de memoria. Por lo tanto, podemos escribir el código así:

intenta:

importar cStringIO como StringIO

excepto ImportError:

importar StringIO

mstream = StringIO.

img = create_validate_code()[0]

img.save(mstream, "GIF")

En De esta manera, cuando necesitemos generar una imagen, solo necesitamos usar "mstream.getvalue()". Por ejemplo, en Django primero definimos esta URL:

from django.conf.urls.defaults import *

urlpatterns = patrones('example.views',

url(r'^ validar/$', 'validar', nombre='validar'),

)

En la vista guardamos la cadena correcta en la sesión para que que cuando el usuario envía el formulario, se puede comparar con la cadena correcta en la sesión.

desde django.shortcuts importar HttpResponse

desde validar importar create_validate_code

def validar(solicitud):

mstream = StringIO.StringIO( )

validate_code = create_validate_code()

img = validar_code[0]

img.save(mstream, "GIF")

request.session['validate'] = validar_code[1]

return HttpResponse(mstream.getvalue(), "image/gif")