Cómo enviar códigos de verificación en lotes usando Python
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")