ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14082|回复: 72

[原创] 带带弟弟OCR,纯VBA本地获取网络验证码整体解决方案

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-2 17:31 | 显示全部楼层 |阅读模式
最近,看到好多关于网页验证码获取的帖子,对于VBA来说,通过网络接口申请无疑是最方便简单,但免费和稳定的OCR接口并不多,所以本地识别的优势就体现出来了。
本帖主要介绍网友提到的一个Python的开源库DdddOcr,4个D的中文是带带弟弟,挺有意思,开源地址:https://github.com/sml2h3/ddddocr

如果你更喜欢用python,知道这个库就可以了,因为可以直接pip安装,一切都帮你部署好,直接使用即可。
但如果你想在VBA中使用,就没那么简单了,搜索整个GitHub和网页根本找不到任何的和VBA有关的资料和示例,只有C++,C#,Js等这些主流语言有相应的实现,但例子也很少。


言归正传,下面将详细介绍下如何在VBA中本地调用这个DDDDOCR,并且不依赖pyhon环境,也不是网络申请获取。
首先,先看看怎么用,必须简单才行,只需要引用一个名为DdddOcr.dll的动态链接库,可以在VBA在像调用其他系统API一样调用,然后剩下的就是获取结果,示例如下:
说明:此贴只讨论该库的VBA使用方法,不涉及任何网抓相关内容,若有违规,请版主删除。
1.gif

评分

11

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 17:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

虽然下面可能很多废话,但如果对这个库敢兴趣,建议完整看完,因为那样你才能真正明白如何使用这个库。
本想着既然有C++版本,应该挺简单的,因为VBA和外部语言的交换,C算最方便的了,只需申明一下就可以在VBA中调用了,于是就来到了这个页面:

image.jpg
一顿操作猛如虎后,发现自己编译不了,这就尴尬了。。。。。。
但明白了这个库的底层实现原理,其调用的是其他两个很著名的库一个微软的Onnx,一个OpenCV,但这两个库都很庞大很复杂,而且最后要变成单文件的dll引用肯定得静态编译,好家伙,官方还没静态编译版本,不过作者很贴心提供了这两个库的静态编译版本,那就加进去继续搞,经过漫长的下载,设置,导库,加载,编译,又尴尬了,还是报错,没法编译,然后就是各种百度,因为报得都是Link错误,发现Onnx和Opencv对环境,版本,编译器等等都有很多对应版本,但咱也不知道作者用的啥版本,而且C++的这个开源库没有任何的文档说明,只好放弃。
既然C++走不通,那就换C#吧,通过插件或Com调用应该可以吧,于是又是一顿操作猛如虎后,发现这回确实可以,毕竟C#有对应的Nuget包,直接添加到项目中调用就可以了,但这又得搞个插件让Excel得VBA来调用,好像也挺麻烦,不管了,先整个xll的插件调用起来再说,于是用另外一个库Exceldna做了个简单的保证,果然成了,可以正确的调用了,不容易啊,待续。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 18:04 | 显示全部楼层
说完了C++,那就说说C#了,个人是通过ExcelDna来封装的,本想着用插件也挺方便,但考虑到一般用这个库的,都是网抓的,谁用高兴用什么插件,直接VBA调用弹性多大,好吧,那算了,不搞了。
先玩玩这个插件,好家伙,编译后发现生成的DLL有80多M,不错压缩的挺好,但这个是.net的DLL,VBA不能直接调用,而且即使封装好了,还得注册,引用啥得,其实挺麻烦,不管了,先跑了一个看看,这时最关键得亮点来了。。。。。。。。。

运行xll文件识别验证码时,重要得事情说3遍,
它竟然自动生成了另外一个dll,
它竟然自动生成了另外一个dll,
它竟然自动生成了另外一个dll,
如下图:
image.png
这个40多M的dll是啥?不是Nuget包导入的啊,是编译运行生成的,那就看看它是啥吧,这个简单,然后又是一顿操作猛如虎,嘴角露出了微微的笑容,感觉有希望了,因为它是一个编译好的C库,待续。。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 19:40 | 显示全部楼层
瞎扯了半天,终于到正题了,先看下这个C的dll是啥,可以看出,这个Dll对外提供了3个函数:Classification,Close,Init

image.png
结合C#dll的调用示例,如下图:可以发现其是通过实例化一个对象来继续调用其内部的方法,VBA要调用类和对象的话,不是又很麻烦。。。。。。
image.jpg
但没关系,竟然其必须导出C的dll,肯定是调用了这个dll,那就找找看,VS很方便的一点是自带反编译,那就F12进入看下,于是看到了C#的源码,如下:
image.jpg
这就简单了,C#只是封装了这个Dll,C#能这么封装,VBA也就可以,于是有了1楼VBA的上面的那3个函数
image.png
这样,就通过了C#的源码将其逻辑很容易的改编成了VBA版本,剩下的就是调用了,对了还有一点,其实这个C的dll只是作为资源文件内嵌再C#的dll中,从源码中也可以得到,这里就不演示了,说说如何调用。
注意3点:
1. 初始化,初始化最简单,因为其是无参数的,直接调用init即可。
2. 调用参数,这里是需要特别注意的,因为涉及到C的调用约定和指针等,所以还得翻回去看C++得源码,C#看不出来。至于如何传递指针到C,很多人也知道,就是用CopyMemory这些API,这里就不过多介绍了,VBA得示例代码中有对应得说明。
image.jpg
3. 释放资源,这个不能少,不然调用不了几次,内存就满了,这一点VBA得调用方式倒是和C很像,不像C#有GC,可以内存自动回收。
好了,整体得逻辑和过程都说得差不多了,看下VBA得代码:
image.jpg
再补充一下那个Classification函数,这个函数得接受参数是一个Base64得字符串指针,所以如果网站返回得是一个byte数组自己直接调用,这里的示例是识别本地图片,所以做了一层转换。好了,基本上从开始的想法,过程,到最后的实现都说的差不多了,有错误的地方还请指正。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 20:00 | 显示全部楼层
分卷压缩包共8个,包含了64位的DdddOcr.dllVBA示例程序及图片,需全部下载后再解压缩,结构如下:
注意:这是64位版本的,32位的Excel,或WPS是调用不了。

image.png


带带弟弟VBA解决方案-64位.part08.rar

317.59 KB, 下载次数: 317

带带弟弟VBA解决方案-64位.part07.rar

2 MB, 下载次数: 410

带带弟弟VBA解决方案-64位.part06.rar

2 MB, 下载次数: 396

带带弟弟VBA解决方案-64位.part05.rar

2 MB, 下载次数: 412

带带弟弟VBA解决方案-64位.part04.rar

2 MB, 下载次数: 402

带带弟弟VBA解决方案-64位.part03.rar

2 MB, 下载次数: 422

带带弟弟VBA解决方案-64位.part02.rar

2 MB, 下载次数: 425

带带弟弟VBA解决方案-64位.part01.rar

2 MB, 下载次数: 447

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-7-2 21:10 | 显示全部楼层
居然弄了个64的,哈哈,搞个蓝奏链接也行啊。。。。。最近也在研究如何快速识别网页验证码并自动填写,目前还差VBA自动截图这一关,打通了就顺了

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 21:16 | 显示全部楼层
约定的童话 发表于 2023-7-2 21:10
居然弄了个64的,哈哈,搞个蓝奏链接也行啊。。。。。最近也在研究如何快速识别网页验证码并自动填写,目前 ...

哈哈,没有蓝奏。
另外验证码无需截图,直接请求,如何返回的是base64或byte数组都不需要存储,直接作为参数传入进去就可以返回识别结果,有兴趣仔细看下上面的说明。
这个帖子40楼,我试过。
https://club.excelhome.net/forum ... ;page=4#pid11283482

TA的精华主题

TA的得分主题

发表于 2023-7-2 21:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
啊, 可惜了, 一般用vba都比較屬意32位, 畢竟還有很多32控件有用, 32位用不了真可惜...

TA的精华主题

TA的得分主题

发表于 2023-7-2 21:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢分享,白嫖

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-2 21:59 | 显示全部楼层
chis3 发表于 2023-7-2 21:33
啊, 可惜了, 一般用vba都比較屬意32位, 畢竟還有很多32控件有用, 32位用不了真可惜...

,一点都不可惜,都搞全了,就没学习的动力了,就只能无脑的调库了。
就像本来VBA不能调这个库一样,有了这个兴趣就去搞了,只不过我的环境是64位的而已。
同样有32位需求和兴趣的朋友,自己会想办法去编译的,都是开源的东西,谁都拿的到。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 03:47 , Processed in 0.044355 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表