本文转载自微信公众号“AirPython”,作者邢安国。转载本文请联系AirPython公众号.一、前言在App端爬取过程中,遇到未知参数时,我们往往需要对App进行逆向工程。参数的生成逻辑,使用Python实现部分App参数的生成逻辑。一些App参数的生成逻辑可能被写入了多个JAR文件,此时,我们只需要使用Python来执行JAR。本文将讨论Python如何调用JAR中的方法。MergeallJARfilesintoaJARfilePS:对于AAR文件,可以先用解压软件解压,然后mergeJARsMergeJARs分为2个步骤:DecompressJARandmergeallsourcecodes2-1DecompressJAR安装JDK后,使用jar-xvf命令解压单个JAR,会根据包名在同一目录下生成JAVA编译的class文件#一个一个解压JAR#在本地生成class文件jar-xvfa.jarjar-xvfb.jarjar-xvfc.jar2-2Mergeallsourcecodes使用jar-cvfM命令从所有本地类文件生成一个新的JAR#将当前目录下的所有源代码合并到一个JAR#其中:output.jar代表新的JARjar-cvfMoutput.jar。3.Python调用JAR首先,我们安装依赖包:jpype#安装依赖包pip3installJPype1假设JAR中的加密逻辑实现代码如下:packagecom.xingag.common;publicclassEncryHelper{publicStringencrypt(Stringcontent){//加密逻辑}}使用Python调用JAR方法分为3步:启动JVM,实例化JAVA对象,调用相应方法关闭JVM3-1启动JVMimportjpype#JAR本地路径jar_path=os.path.join(os.path.abspath('.'),'./output.jar')#启动jvmjpype.startJVM(jpype.getDefaultJVMPath(),"-ea","-Djava.class.path=%s"%(jar_path))3-2实例化JAVA对象,根据调用方法的包名调用方法,使用jpyte中的JClass()方法实例化类JAVA对象,最后调用JAVA对象的方法。需要注意的是,由于JAVA是实例方法,需要先实例化对象,再调用方法;如果是静态方法,可以直接调用方法#通过包名,实例化JAVA对象EncryClass=jpype.JClass("com.xingag.common.EncryHelper")encryClass=EncryClass()#调用中的加密方法JAVAcontent_encry=encryClass.encrypt("xag")print(content_encry)3-3关闭JVM,可以选择主动关闭JVM,也可以运行后自动关闭Python程序释放资源importjpype#Closejvmjpype.shutdownJVM()4.最后,Python直接调用JAR中的方法,可以帮助我们复用轮子,减少爬虫的工作量!
