shuzui1985的专栏

工作中需要自动破解识别验证码,本着不闭门造车的原则,我尝试使用了下优优云识别(逼格高吧,其实是自己对复杂的图像识别有心无力了)。

以前自己积累的识别二维码的文章,传送门:

优优云识别(验证码识别)主页:

原理及环境

注册开发者模式,同时和客服套取一定数量的免费调试题分(有人会问题分 是什么东东,其实就是充值积分了,优优云的二维码识别基于的原理是发送本地图片到他的服务器识别,而每次请求都需要消耗一定的题分!),下载对应的开发语言demo以及sdk,我使用的开发模式是 window7+java+dll调用方式!

下载:

开发

java中调用DLL函数uu_easyRecognizeBytesA进行远程云识别:

int codeID=UUDLL.INSTANCE.uu_easyRecognizeBytesA(SOFTID, SOFTKEY, USERNAME, PASSWORD, by, by.length, codeType, resultBtye);

识别效果如下,还不错吧,嘎嘎

本来到此就应该是一个完美的解决,何以箫声默中一样,男女猪脚在一起了,大团圆了!

但是更多的折腾在后面(不想看悲剧的同学可以掠过此分割线一下,但是个人觉得还有很多可以值得他人简介学习的地方)

折腾一:java 运行环境不一致,操作系统不一致带来的问题

(开发环境是win7+java7,多高大上的组合,,想想还有些小得意),换到了一台XP机器和java6的机器上,运行jar直接fail.

xp需要配置32位的dll,以及jar导出配置为jre1.6的运行时,不然执行不了。

折腾二:切换到linux环境,dll文件尝试转换成so

需求是无穷无尽的,鄙人的屁股还没有坐稳,需要提供一套linux主机环境下可以使用的识别二维码的jar。大家都知道dll 是window上的动态库,而so 是linux上的动态库。两个格式不一致无法直接通用,java loadlibrary到了linux上就需要加载so文件了。

具体原理参考文章:

下载pexports 文件转换出 dll def声明文件:

>pexports UUWiseHelper_x64.dll > UUWiseHelper_x64.def

我们这里就没有使用cywin环境,而是直接使用了mingw 环境编译了a静态库文件

>dlltool -D UUWiseHelper_x64.dll -d UUWiseHelper_x64.def-l UUWiseHelper_x64.a

然后将a 静态库文件转换成so 动态库的时候出问题了(?t=1954793)

>ar -x UUWiseHelper_x64>gcc -shared *.o -o UUWiseHelper_x64.so

尝试失败

折腾三:java QTcore 折腾

后来发现官网上支持so的,?n=ApiDoc.Linux

dll与so 提供的导出函数不一致,需要在java中额外定义so的函数;

public void uu_setSoftInfoA(int nSoftID, String pcSoftKey);public int uu_reguserA(String pcUsername, String pcPassword, int nSoftID, String pcSoftKey);public int uu_UploadFileA(String pcPicPath, int nCodeType);public void uu_getResultA(int upid,byte[] pCodeResult);public int uu_recognizeByCodeTypeAndPathA(String filename, int nCodeType, byte[] pCodeResult);public int uu_recognizeByCodeTypeAndUrlA(String pcUrl, String pcInCookie, int nCodeType, String pCookieResult, byte[] pCodeResult);

导出OK但是万万没想到,这块也是个悲剧的伏笔(直接公布答案,官网的so 是基于QT5开发的,而JAVA 调用QT的包目前只维护到QT4)

Qt Jambi 4.8.6 for Linux

There is nownew release for 64 bit Linux.I’ll do 32 bit package later, for Windows current builds should work, but updated packages will follow afterfew Windows bundling related problems have been sorted out.

Most notable differences are bundling of libpng, so distributions not shipping the libpng the bundled Qtwas built with will continue working and bump to Qt 4.8.6.

具体运行错误如下:加载QT4版本的’libQtCore.so.4‘ 找不到!

Caused by: java.lang.RuntimeException: Loading library failed, progress so far:No ‘qtjambi-deployment.xml’ found in classpath, loading libraries via ‘java.library.path’Loading library: ‘libQtCore.so.4’…- using ‘java.library.path’ at com.trolltech.qt.internal.NativeLibraryManager.loadNativeLibrary(Unknown Source) at com.trolltech.qt.internal.NativeLibraryManager.loadQtLibrary(Unknown Source) at com.trolltech.qt.Utilities.loadQtLibrary(Unknown Source) at com.trolltech.qt.Utilities.loadQtLibrary(Unknown Source) at com.trolltech.qt.QtJambi_LibraryInitializer.<clinit>(Unknown Source) … 7 moreCaused by: java.lang.RuntimeException: Library ‘libQtCore.so.4’ was not found in ‘java.library.path’=:/usr/local/lib:/usr/lib:/usr/lib64:/root/111/Qt5.2.1/5.2.1/gcc_64/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib at com.trolltech.qt.internal.NativeLibraryManager.loadLibrary_helper(Unknown Source) … 12 more

折腾四:c++ QT最后还是没成功

总不能空手而归吧,毕竟官网还是给C++ DEMO了。

直接make

>g++ testapi.cpp -o apitest -I/root/111/Qt5.2.1/5.2.1/gcc_64/include -fPIC -ldl

报错:链不到QT的函数。

可就是这样,还是有人,期望过多的温暖。

shuzui1985的专栏

相关文章:

你感兴趣的文章:

标签云: