python验证码解码器库
Posted
技术标签:
【中文标题】python验证码解码器库【英文标题】:python captcha decoder library 【发布时间】:2022-01-23 06:35:45 【问题描述】:我需要一个用于 python 的验证码解码器来读取简单的图像验证码,如下图所示:
您知道可以帮助我阅读此验证码的库吗?
如果您不知道用于阅读验证码的库,您能帮我用 PIL 阅读这个(以及其他类似的)吗?
【问题讨论】:
我认为你不应该这样做 【参考方案1】:我希望这个验证码不要在任何地方使用。
以下是一种解码方法。基本上,您需要的是这些验证码中存在的从 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])
【讨论】:
我得到:traceback(最后一次调用):文件“./decrypt_captcha.py”,第 70 行,在我希望您善意使用它,并且不会伤害(/垃圾邮件)任何人。
我不会为您编写脚本,也不会将您转发给外部插件。但是如果你是自己写的,这可能会有所帮助:
如果您尝试解码特定的验证码模式,您应该收集所有字符(我从您附加的示例中看到它只是数字,所以它不应该做很多工作)。 将所有字符放在一个文件中并使用 PIL 进行分析 将每个字符、其位置和含义保存在一个数组中。 获取验证码图像 - 必要时清除背景噪音。 将 Captcha 图像拆分为 char 大小,然后通过您自制的字符字典将其交叉。【讨论】:
【参考方案3】:出于学术原因,这是一个不错的项目,我不久前对此很感兴趣。您有几个选择:
您可以在此站点的帮助下自己编写:[已清理的死链接]
您使用 OpenCV 进行匹配。
如果认为有专门的神经网络图像匹配库,但我似乎找不到。
基本上正如其他人所说,您想要去除噪音,分成单个字符并使用所选技术将其与模型字符进行比较。
【讨论】:
另一个简单的指南:ptigas.com/blog/2011/02/18/simple-captcha-solver-in-python以上是关于python验证码解码器库的主要内容,如果未能解决你的问题,请参考以下文章