Skip to main content
 首页 » 编程设计

python验证码解码器库

2025年05月04日15飞鱼

我需要一个用于 python 的验证码解码器来读取如下图所示的简单图像验证码:

您知道可以帮助我阅读此验证码的库吗?

如果您不知道用于读取验证码的库,您能帮我用 PIL 阅读这个(以及其他类似的)吗?

请您参考如下方法:

我希望这个验证码没有被用到任何地方。

以下是解码它的虚拟方法。基本上,您需要的是这些验证码中存在的从 0 到 9 的模式。从你的例子中,我只有 0 3 4 5 7 8 的模式。因为一切都是固定的,你知道在哪里分割每个字符。您还知道每个字符都是一些固定大小和固定字体的字符。如果它还包含字母或更多字符,但大小和字体固定,则可以轻松修改以下代码。

代码的作用是:a) 加载模式(我认为它们被命名为 n0.png、n1.png、...); b) 将验证码分成 NUMS 个部分; c) 对每个模式和每个分割数之间的差平方求和; d) 决定拆分数是总和最小的那个。它按顺序返回验证码中出现的每个数字的列表。要获得初始模式,您可以取消注释保存拆分数字的行,在该部分之后放置一个return,并调整文件名。

import sys 
from PIL import Image, ImageOps 
 
PAT_SIZE = (8, 10) 
NUMS = 3 
FIRST_NUM_OFFSET = 5 
NUM_OFFSET = (1, 3) 
 
 
NUMBERS = [] 
for i in xrange(10): 
    try: 
        NUMBERS.append(Image.open('n%d.png' % i).load()) 
    except IOError: 
        print "I do not know the pattern for the number %d." % i 
        NUMBERS.append(None) 
 
 
def magic(fname): 
    captcha = ImageOps.grayscale(Image.open(fname)) 
    im = captcha.load() 
 
    # Split numbers 
    num = [] 
    for n in xrange(NUMS): 
        x1, y1 = (FIRST_NUM_OFFSET + n * (NUM_OFFSET[0] + PAT_SIZE[0]), 
                NUM_OFFSET[1]) 
        num.append(captcha.crop((x1, y1, x1 + PAT_SIZE[0], y1 + PAT_SIZE[1]))) 
 
    # If you want to save the split numbers: 
    #for i, n in enumerate(num): 
    #    n.save('%d.png' % i) 
 
    def sqdiff(a, b): 
        if None in (a, b): # XXX This is here just to handle missing pattern. 
            return float('inf') 
 
        d = 0 
        for x in xrange(PAT_SIZE[0]): 
            for y in xrange(PAT_SIZE[1]): 
                d += (a[x, y] - b[x, y]) ** 2 
        return d 
 
    # Calculate a dummy sum of squared differences between the patterns 
    # and each number. We assume the smallest diff is the number in the 
    # "captcha". 
    result = [] 
    for n in num: 
        n_sqdiff = [(sqdiff(p, n.load()), i) for i, p in enumerate(NUMBERS)] 
        result.append(min(n_sqdiff)[1]) 
    return result 
 
print magic(sys.argv[1])