python 调用Tesseract,dll模式,无需安装,绿色版
系统环境:3.7.4-64+win10
最近做批量登录,网站的验证码还是挺简单的,如果说接入打码平台,那不划算了
验证码类似下图
然后看了下ocr识别,比较方便的就是Tesseract,识别率还行
接下去就是python调用,常规对接方式就是先安装teseract.exe,然后python调用接口
1.cmd直接调用
2.接入库调用,比如pyocr等
这2中方式都不是很方便,第一种需要安装软件,第二种也要按照,而且把项目打包成exe也是个大问题,各种导入错误
那么有没有其他方法呢,网上查阅后发现.net可以直接调用dll组件来识别,既然能调用dll,那么python自然也能调用
网上搜寻一番,果然有人已经给出了解决方案,参考如下,里面给出了32位和64位的调用方法,不过没有给dll下载地址
https://www.polarxiong.com/archives/python-pytesser-tesseract.html
下载(32和64位都放进去了,按照自己需求使用)
链接:https://pan.baidu.com/s/19mFffGpLgtHq1f2tGzQqXw
提取码:kr70
文件结构如下
tessdata是训练数据,304是主dll,172是辅助,2个需要放在一起
main.py(64位调用方法,32位不同,参照上面连接)
import ctypes class OCR(): def __init__(self, DLL_PATH, TESSDATA_PREFIX, lang): self.DLL_PATH = DLL_PATH self.TESSDATA_PREFIX = TESSDATA_PREFIX self.lang = lang self.ready = False if self.do_init(): self.ready = True def do_init(self): self.tesseract = ctypes.cdll.LoadLibrary(self.DLL_PATH) self.tesseract.TessBaseAPICreate.restype = ctypes.c_uint64 self.api = self.tesseract.TessBaseAPICreate() rc = self.tesseract.TessBaseAPIInit3(ctypes.c_uint64(self.api), self.TESSDATA_PREFIX, self.lang) if rc: self.tesseract.TessBaseAPIDelete(ctypes.c_uint64(self.api)) print('Could not initialize tesseract.\n') return False return True def get_text(self, path): if not self.ready: return False self.tesseract.TessBaseAPIProcessPages( ctypes.c_uint64(self.api), path, None, 0, None) self.tesseract.TessBaseAPIGetUTF8Text.restype = ctypes.c_uint64 text_out = self.tesseract.TessBaseAPIGetUTF8Text(ctypes.c_uint64(self.api)) return bytes.decode(ctypes.string_at(text_out)).strip() if __name__ == '__main__': DLL_PATH = 'libtesseract304.dll' TESSDATA_PREFIX = b'./tessdata' lang = b'eng' ocr = OCR(DLL_PATH, TESSDATA_PREFIX, lang) image_file_path = b'test.png' result = ocr.get_text(image_file_path) print(result)
做了一下简单的封装,这样就能简单调用了,打包成exe也不会有问题,无需按照,绿色软件
注意:dll需要放到和主程序相同的目录,这里涉及到加载的问题,因为304dll加载需要172dll,如果在文件夹内,则会出现找不到dll
当然这是我水平有限的原因,暂时没找到更好的方法,具体可以自己修改