背景
昨天做项目的时候因为没有数据源,就想着用jsoup去爬点数据用用(别问我为什么不用python,因为不会)。首选爬的对象就是36kr。但是这个网站做了脚本处理,用script去动态加载页面。毕竟不是咱熟悉的领域,算他牛逼,咱爬不了他的网站,那就直接去反编译的app,app你总得给出获取数据的链接了吧。我和你用一样的数据一样的链接行不行?
想着以前也没有写过反编译这个方面的东西,想着就写点,抛钻引玉。
只是学术研究,并无恶意,希望36kr的大哥别和我一般见识。
准备工具
· Apk反编译的集成工具给大家推荐个好用的。点击下载。
· 36kr的app for Android。点击下载。
开始
Step One:
打开apk的反编译工具:
接着只要选择需要反编译的apk,选择反编译后的文档位置,编译选项选择all。
编译完成后出现一个文件夹以及一个jar包。文件夹里面是36krapp的工程结构,而我们需要用到的是jar包。
Step Two:
接着打开反编译工具里面的jd-gui.exe
这个程序。这个程序可以反编译jar文件。打开之后点击File->Open File 选择刚刚得到的jar包。
我们看到了经过代码混淆之后的工程目录。但是无论代码再怎么混淆,都躲不过有心人的查找。
从这个apk的名字我们都可以看出来36kr的主目录在那里。com.android36kr。所以主目录一定在
com
这个包下。但是打开com
这个包才是最头疼的。
是不是感觉有点难以动手?还记不记得前面说的
com.android36kr
?别急,打开android36kr
这个包。
我们可以看到a
,app
,login
这三个包。分析一下,a包做了混淆。app是软件的主目录包,login是登陆功能包。为什么要对a包做混淆?难道里面有着什么重要的东西?(好吧,我承认我说出这句话是因为整个工程的所有文件我的看了一遍。。。。)节省你们的时间,我们直接查看a
包。
- 为了节省大家的时间,我也不是写悬疑小说的作家,我告诉你们他们的大部分请求链接都是放在
com.android36kr.a.b.a.b.class
这个文件里面。
这个b
包下也还是有很多其他的请求链接的。但是我们着重来看b.class。因为我的目的只是想那我的数据,其他的我不作非分之想。接下来打开b.class
。
在这个类中我找到了我要的请求方法newsflash
这是36kr的一个快讯的数据接口。
napi/newsflash
这个就是链接后缀。但是前缀呢?自然就是http://36kr.com
。
猜测准不准确,验一验就知道了。点击实验。(为了防止以后测试过期,我在这里加一条测试时间 2017年5月16日 15:10:09)
那道一大堆数据的我也是欣喜若狂,但是我不喜欢这些乱七八糟的数据,那是程序看的,不是人。我只看到了json中有一个字段limit:10
。什么意思?你每次只给我10条?难道我的app就只能给别人看10条?
我们再回去看看源码中的api 发现了一个字段per_page
不用想肯定有猫腻。链接是get方式请求的,那么我们尝试在连接中加入这个字段,per_page=20
吧。也给出一条验证链接 per_page=20 。
在一坨json数据的底部,我们再次看到了limit:20
这个字段。那么就是说我们只要凭这个per_page
就可以获取更多的数据。
到此打住
人家的东西就看到这里好了,有兴趣的朋友可以自己去发掘,但是我要声明与本人无关。手痒的我发现我连json的格式化类我的省了。
借来用用
最后祝大家玩的开心。