随机生成混合验证码(Python)


定义常量

# author: suoxd123@126.com
# 常量
NUMBER = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
LOWERCASE = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
UPPERCASE = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

CAPTCHA_LEN = 4 
CAPTCHA_HEIGHT = 60
CAPTCHA_WIDTH = 160
CAPTCHA_COUNT = 1000
CAPTCHA_DIR = './captcha/'

生成随机字符

# author: suoxd123@126.com
# 生成随机字符
import random
def getRandomText(charset = NUMBER, length = CAPTCHA_LEN):
    text = [random.choice(charset) for _ in range(length)]
    return ''.join(text)

生成本地验证码

# author: suoxd123@126.com
# 生成验证码并存储到本地
import os
from captcha.image import ImageCaptcha
def createCaptcha(dataset=[NUMBER], path='./img/', height=50, width=150, len = 4, image='.png'):
    if not os.path.exists(path):
        os.mkdir(path)
    
    charset = []
    for a in dataset:
        charset.extend(a)
    captcha = ImageCaptcha(width=width, height=height)
    text = getRandomText(charset)
    captcha.write(text, path + text + image)# 验证码写入文件
    return

# 生成1000个图片验证码
for _ in range(CAPTCHA_COUNT):
    # 需要什么内容,首个参数列出来即可
    # 小写字母:[LOWERCASE]
    # 仅字母:[LOWERCASE, UPPERCASE]
    # 数字 + 小写字母:[NUMBER, LOWERCASE]
    createCaptcha([NUMBER, LOWERCASE, UPPERCASE], CAPTCHA_DIR, CAPTCHA_HEIGHT, CAPTCHA_WIDTH)

生成内存验证码

# author: suoxd123@126.com
# 生成验证码
import numpy as np
import PIL.Image as Image
def makeCaptcha(dataset=[NUMBER], height=50, width=150, len=4):
    charset = []
    for a in dataset:
        charset.extend(a)
    images, texts = [], []
    captcha = ImageCaptcha(width=width, height=height)
    text = getRandomText(charset)
    image = np.array(Image.open(captcha.generate(text))) # 验证码写入内存
    return image, text

# 生成1000个图片验证码
texts, images = [None]*CAPTCHA_COUNT,[None]*CAPTCHA_COUNT
for i in range(CAPTCHA_COUNT):
    tmpImg, tmpText = makeCaptcha([NUMBER, LOWERCASE, UPPERCASE], CAPTCHA_HEIGHT, CAPTCHA_WIDTH)
    images[i] = tmpImg
    texts[i] = tmpText
    

在线绘制验证码

# 在线绘制验证码
import matplotlib.pyplot as plt
figure = plt.figure()
for i in range(30):
    plt.subplot(5, 6, i+1)
    plt.tight_layout()
    plt.imshow(images[i])
    plt.title(texts[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

结果查看

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上次发了一个易语言内存生成验证码的源码,后来压力测试的时候发现多线程下程序会崩溃。原因是 GDI 在多线程创建hDC的时候,经常会失败,内存hDC只有一个工作区域,导致多线程冲突 所以后来研究了一段时间发现,多线程下不能用 GDI,需要用DGI+,虽然 DGI+的确是线程安全的,可是它保证安全的做法可能类似于我们易语言加许可区,所以严格意义上来说, DGI+也不是多线程的,只不过在多线程下是安全的而已 后来网上查找资料,得到了一个让人很沮丧的说法: 这是CSDN上的人说的,他说:听公司一个图形方面的大佬说过,图形绘制主流的技术,GDI、GDI+、OpenGL,D3D什么的都不支持多线程,同一时间内,只能有一个线程在屏幕绘制,所以,根本就没有什么多线程绘图这个玩意。。。 根据我这几天的测试,查看内存和CPU数据,也确实发现即使是GDI+,也只能单线程运行,多线程下也是排队进行绘图的,因为Windows只有一个画板。。。 好了,那就不纠结了,既然连OpenGL都不支持多线程绘图,那就老老实实的就这样用着吧 ============================================================================================ 本源码介绍: 还是跟上次一样,只有一个公开子程序,里面的参数做了一下调整 特点是 每个字符都可以用不同的字体,字体可以随时扩充,在哪里找到了什么好看的字体,直接安装到电脑里,然后把字体名称添加到参数里就可以了 理论上,如果经常更换字体,字体足够多的话,制作识别库是很头疼的一件事,这个用于易语言web开发很合适哟

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放羊郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值