python验证码解码器库

2024-04-26 05:13:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

captcha

simple captcha

captcha

你知道有一个图书馆可以帮我读这个验证码吗?

如果你不知道有一个图书馆可以阅读captchas,你能帮我阅读这个(和其他类似的)与PIL?


Tags: 图像pil图书馆解码器验证码captchas
4条回答

我希望这个验证码不在任何地方使用。

下面是一个虚拟的解码方法。基本上你需要的是从0到9的模式出现在这些标题中。从你的例子来看,我只有0345788的模式。因为所有的东西都是固定的,所以你知道在哪里分割每个角色。你也知道每个字符都是固定大小和固定字体的数字。如果它还包含字母或更多字符,但大小和字体固定,那么可以很容易地修改以下代码。

代码的作用是: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])

我希望你使用它的诚意,你不会伤害(/垃圾邮件)任何人。

我不会给你写脚本,也不会将你转发到外部插件。但如果你是自己写的,这可能会有帮助:

  • 如果你试图解码一个特定的验证码模式,你应该收集所有的字符(我从你所附的例子中看到,这只是数字,所以不应该太多的工作)。
  • 把所有的字符放在一个文件中,用PIL分析
  • 将每个字符、其位置和含义保存在数组中。
  • 获取验证码图像-必要时清除背景噪声。
  • 将验证码图像分割成字符大小,并通过自制的字符字典进行交叉。

我希望这个验证码不在任何地方使用。

下面是一个虚拟的解码方法。基本上你需要的是从0到9的模式出现在这些标题中。从你的例子来看,我只有0345788的模式。因为所有的东西都是固定的,所以你知道在哪里分割每个角色。你也知道每个字符都是固定大小和固定字体的数字。如果它也包含字母或更多字符,但大小和字体固定,那么可以很容易地修改以下代码。

代码的作用是: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])

这是一个很好的项目,因为学术原因,我对这个感兴趣前一阵子。你有几个选择:

  1. 你可以在这个网站的帮助下写自己的文章:http://www.wausita.com/captcha/

  2. 使用OpenCV进行匹配。

如果认为有专门的神经网络图像匹配库,但我似乎找不到它。

基本上,正如其他人所说,你想要去除噪音,分成单个字符,并使用选定的技术将其与模型字符进行比较。

相关问题 更多 >

    热门问题