首先根据绿泡泡日志,定位到朋友圈模型类com.tencent.mm.plugin.sns.model.m3
/cgi-bin/micromsg-bin/mmsnsuserpage是获取好友朋友圈的接口
我们hook该类的回调方法onGYNetEnd,参数param.args[4]包含了朋友圈的元数据。
如果jadx看不到onGYNetEnd函数,可以用jeb反编译apk,查看源码,阅读开发者处理数据的流程
通过阅读源码,我们可以发现类sn4.p26的 f 字段(LinkedList类型)是最终的直接数据源
f 字段的每一项数据都是SnsObject类,对应了一条朋友圈
获取到SnsObject对象已经成功迈出了第一步
我们在onGYNetEnd源码中发现,开发者将SnsObject转化为了SnsInfo类
找到该方法(pv3.e.m),对处理数据的流程进行1:1复刻
这个str字符串就是我们要的东西,是一个XML格式的字符串,包含了一条朋友圈的数据。
我们通过编写工具类以及数据模型,来解析并存储这些数据
为什么不直接调用这个方法进行数据解析转化?
这是因为开发者在方法体中清空了元数据并进行了备份,而我们调用该方法会影响到用户的使用,导致好友朋友圈无法加载(数据源被清空)
在成功解析SnsObject后,我们已经成功了一大半。
我们只需要每条朋友圈的发布日期,朋友圈文本,以及各图片的Url。
但是绿泡泡返回的Url并不是http网址,而是一个cdn的下载连接
通过ddms录制,我们找到了一个提交下载任务的方法 yu.k.db
我们需要主动构造参数(ll.i对象),并调用db方法,提交下载任务
成功下载之后,我们可以在本地(构造参数时包含本地路径)找到下载的文件
但这一步仍然没有达到最终目的,我们使用MT管理器,通过16进制打开文件,发现这并不是一个图片文件
显然,这只是一个临时文件(可以发现文件名存在tmp)
我们需要找到解密/重编码的方法,并主动调用该方法
最终我们定位到fr1.z.Vb方法,该方法将临时文件重编码,得到最终的图片文件
至此,我们抓取朋友圈数据的整个流程就结束了,这其中还涉及到一些其他问题。
比如:重编码的时机,我们需要找到临时文件下载成功的回调
比如:朋友圈的元数据获取,绿泡泡服务器是分页下发的,每次10条,我们需要主动编码实现分页获取
这里我就不多赘述了,欢迎感兴趣的朋友动手尝试。