节选自《移动app爬虫攻防实战》第12章

微信的用户发展到现在早已超过10亿了,身边热衷于发朋友圈的数不胜数,甚至已经到了现在很多人被朋友圈的海量的内容骚扰的不行,不停屏蔽这个屏弊那个,但还是离不开它,因为我们的记忆被套在朋友圈里。

笔者曾经在2016年开发了一个导出朋友圈的小功能,可以把好友发表的朋友圈内容导出并全成一个html页面,并且为不少想保存自己朋友圈内容的人提供了导出服务,也认识了不少朋友。

虽然只是一个小小功能,但通过交流才发现:导出来的朋友圈内容转化成朋友圈相册,其实是一个不错的细分市场,甚至发展出好几家创业公司,并持续有一些团队进入及退出,而大家用的技术也基本都是围绕app逆向这个思路来进行的。

12.1 朋友圈的导出

笔者使用了app逆向技术对微信做了对应的分析,从朋友圈内容加载和渲染的入口跟进去,然后就可以寄生在微信客户端上来获取朋友圈的索引数据并且下载图片,其核心要点的流程如图12-1所示:

图12-1

有了这个核心流程,再在此基础上扩展工程代码,就可以得到一个完整可用的朋友圈导出的插件,图12-2是对整个流程的一个通俗简介:

图12-2

当代码已经有效地运行之后,就会在微信的个人信息页上多出一个“朋友圈”的按钮,如图12-3,这是早期版本的界面。

图12-3

点“朋友圈”之后会启动导出过程,会以10条/秒的速度循环加载朋友圈的索引信息,并根据索引信息里的图片、视频的http地址去下载资源文件,索引信息的格式如图12-4:

图12-4

根据索引信息合成的html页面效果如图12-5:

图12-5

看起来挺简单的,整个过程只要突破图12-1所对应的核心技术点,剩下的就是工程量了。第一版的代码量,不包括html页面部分,大概只用了3000行就完成以上的所有功能。

在和一些相关团队交流后发现,有的团队用的方法很粗暴:通过模拟器不停地刷一个人的朋友圈,然后把所有的图片、视频一个个点开下载,再提取缓存中的文件。这样的最大缺点就是速度慢,与笔者这种直接刷原生接口的速度相比几乎慢一个量级,不过只要能解决问题也OK。

12.2 wxpc图片格式

在公开运行了几个月,为不少朋友导出朋友圈记录之后,突然遇到一个意外情况:通过索引信息里的http链接获取图片失败了!

笔者有几个专门服务的微信号,有的微信号仍然可以通过http直接获取图片,有的微信号则不行。通过分析有问题的协议发现索引信息中图片http链接已经无法有效下载图片,再进一步调试发现:微信用了自己的wxpc图片格式,其真实对应的url格式如下:

http://[::ffff:111.12.34.142]/mmsns/KuPATVb3SJXyhekdicVpLrO3RhEtY0ibjEA76v1lHpMRpiaVRYnm83R7OCuvhM3Jp9Nmvyg6jp6IPs/0?tp=wxpc&length=1136&width=640&idx=1&token=WSEN6qDsKwV8A02w3onOGQYfxnkibdqSOkmHhZGNB4DFFicvVGZvFHg08YsLPdlqiagg6oiaGepT0RlJNMh5SQxDbg

即使我们能截取这种url并通过它去获得图片资源文件,拿到的也是wxpc格式而不是常见的jpg格式。我搜索了一圈,这种wxpc文件对微信的最大的价值就是文件尺寸更小、加载速度更快;并且,站在安全的角度理解:还可以防止别人低成本盗用~

顺便说一句,微信早在6.2或者之前就已经加入了对wxpc的支持,但笔者一直到6.3才碰到这个问题,也许是因为当时所用的微信账号导出的内容太多,然后被灰度到了。

不过,哪怕wxpc格式我们无法直接使用,可是它终究也是要变成UIImage对象加载到UI上来显示的,那么,我们就可以盯住wxpc->UIImage这个环节来达到我们的目标。依据这个思路,笔者做了一次大的升级,其核心流程改变可见图12-6。

图12-6

当然,实际的开发过程远比这个复杂,这种异步请求的处理、容错等等,整个代码量由3000行增加到5000行。

直到现在,我们所有的操作都是基于微信客户端来完成的,而不像本书前面的章节所说,将协议复制到PC上来提高执行效率,原因很简单:微信的通信协议是自己的私有socket协议,而且层级非常多,远不是普通小app那种拦截了https就万事大吉,我们也投不起那么大的时间成本来做这样的协议迁移。

自从改成完全依赖微信客户端来下载图片,整个过程一下子就拉长了:抓取索引的速度并没有变慢,但是早期的下载可以直接下载http图片,甚至可以在一个app进程中并发多个下载线程;新版本为了容错,只敢一个个地获取wxpc格式,并且还要先转UIImage再转jpg,与多线程下载相比慢了5-10倍,这已经和那些低技术团队的模拟器抓取+下载方式没有质的差距,哪怕技术细节上是更炫一点,但整体相比完全看不出高大上来。

为了改变这个结果,自然就要付出相应的精力。当单机的速度上不去的时候,我们就可以用多机,于是分布式的导出朋友圈设计也就浮出水面了。

12.3 分布式导出

根据提高速度的需求,我们可以做一个简单的分析:

1、抓取索引信息的速度很快,10条/秒,假设有1000条朋友圈记录,100秒就可以完成。

2、下载图片的速度很慢,假设1000条朋友圈记录,平均有1000张图片,每张图片从下载到转换完成的时间是0.5秒,需要500秒才能全部完成。

3、如果仅仅是一个人的朋友圈数据,整个导出过程不到10分钟,倒也无所谓。可是如果有100个人的数据需要导出,对应的时间就是1000分钟,也就是近2小时。如果有1000人,整个过程就拉到了20小时,这还不包括出错导致中断等问题。

4、我们可以把100人的任务分布到10个微信账号,等待时间也会线性下降,但是管理多个客服微信号是一件复杂的事,是否可以有更佳的方式?

5、可以注意到,抓索引信息的速度和下载图片的速度是1:5,也就是说,想要达到最佳平衡的速度,有5倍的下载能力即可让整个计算能力平衡起来。

有了前面章节的分布式设计经验,新的解决方案就可以定型了:

1、根据角色定义,将原本集成在一起的功能角色显式拆解成2部分,并且命名:索引机、下载机。

2、引入任务调度服务,并且下载机将所有获取的图片上传到云端。

3、索引机和下载机的默认配属比例是1:5,但是这个数字不是绝对的,可以在实际运行中根据需要来调高或调低下载能力,每个机器上可以通过开关来切换角色。

对应的框架图可见图12-7:

图12-7

和前面章节中描述的几乎一样,不同的只是用了一组移动设备当爬虫机,并且在实际运行过程中可以根据任务量去调整集群的数量和规模,原则上扩大10倍、100倍也没什么问题,前提是有这么大的业务量。

12.4 本章小结

朋友圈导出这个功能首先来源于笔者自己的需求,然后在提供服务的过程中吸收了很多人的需求,从功能到性能,从单机到分布式,整个代码和架构都在不停地变迁,几乎可以与本书前半部分的章节内容都对应上。

可能不少读者会不满:为什么不上代码?

从笔者的角度,授人以鱼,不如授人以渔。怎么分析,怎么实现,在前面的章节、甚至相关联的《iOS应用逆向工程》中都能得到,不自己动手去实践岂不是丧失了乐趣?

最后贴2个代码的图,回顾一下笔者在这个功能上投入的精力。

图12-8,iOS端的导出代码,5000行虽然不是一个大工程,但从插件的角度也不是一个小玩意了,而且集成了众多功能。

图12-8

图12-9,任务调度服务的关键代码,和前面对应章节里描述的一样,每个下载机都来Fetch各自的任务,完成之后再Fetch下一个,简单高效地工作着。

图12-9

从目前的需求看,朋友圈导出服务的技术架构已经稳定,至于新的升级,可能会在累积了足够多新的需求后才开始。友商们也可以对比自己的架构,有兴趣可以一起交流讨论。

导出账号格式不对_朋友圈导出的架构变迁相关推荐

  1. php导出excel格式文件,PHP导入与导出Excel文件的方法

    一.PHP导出Excel文件 1,推荐phpexcel,官方网站: http://www.codeplex.com/PHPExcel 导入导出都成,可以导出office2007格式,同时兼容2003 ...

  2. idea在分屏拖不回来_朋友圈赏花晒照新玩法,宫格分屏视频!

    ∆ 点击上方[有科唠]一起涨姿势~ 近期的天气好的不要不要的,出去赏花是件很惬意的事情,继<城墙下>推出的近期赏花攻略,唠科粉们可以跟着攻略赏花一番,赏花的同时,大家肯定会发个朋友圈纪念一 ...

  3. ug导出step文件失败_解决UG导出CAD图纸失败的问题

    解决UG导出CAD图纸失败的问题 先说一下问题吧,有些人刚开始可以用UG在制图环境下导出CAD dwg图纸.可是后来就莫名其妙的导不出来了,那个黑色的框框跳到一半就自动不动了.而我们只得到一个XXX. ...

  4. cshtml的a标签跳转页面_朋友圈标签来了!热门流量关键词带动视频号、小程序、搜一搜...

    用户其实并不会按照你的内容多少来决定它的时间分配,但我觉得这是很合理的. 2019 年 1 月,张小龙在广州的微信公开课 Pro 上进行了一场 4 小时的超时演讲,在演讲中,他举了一个和朋友圈相关的例 ...

  5. Revit导出PDF格式图纸流程及“批量导出图纸”

    一.Revit导出PDF格式图纸流程 1.点击左上方"应用程序菜单"即"R"图标,进择"打印"选项. 2.在弹出的对话框中,需要设置图纸&q ...

  6. 微信朋友圈python广告投了多少钱_朋友圈广告的评论区,当代人的灌水BBS

    记者 | 马越 编辑 | 牙韩翔 1 如果你最近几天都忍住没发过朋友圈,也没给任何人点赞评论,却冷不防多了个小红点提醒--没错,八成是又有人收到Python的广告了. 6张不明所以的图片,加上20个字 ...

  7. keil写文字怎么会乱码_朋友圈发婚纱照配文字怎么写?

    当我们拍完婚纱照,都想要发一些心情说说自己的感受,下面这些美妙的句子带你寻找发圈灵感.一.朋友圈发婚纱照配文字 1.情不知所起,一往而情深. 2.幸福是相濡以沫的一辈子. 3.你若撒野,我今生把酒奉陪 ...

  8. 进度条设置_朋友圈可以设置quot;仅一个月可见quot;了,什么时候出语音进度条呢?内附陈粒小姐姐的新歌哦~...

    ■听歌推电影■ 改编自日本著名作家森见登美彦同名小说的动画电影<企鹅公路>正式定档5月17日. 近日,片方发布了姐姐版中文推广曲<圆形的海>以及歌曲MV.歌曲由实力唱作人陈粒作 ...

  9. 获取朋友圈照片_朋友圈可以发 30 秒视频啦!用微视这个新功能就能办到

    对于许多热爱分享生活中所见所闻的朋友来说,在发朋友圈时可能都会有这样的感觉:只能分享 15 秒以内的视频,完全不够用啊. 如果你也有同样的困扰,今天,A 君就给你介绍一个实用新功能,让你能够在朋友圈中 ...

最新文章

  1. SQL Server 执行计划
  2. 海思3559 人脸识别
  3. 同域下iframe操作时,js访问document出现拒绝访问的问题原因
  4. 一张图来看看.NETCore和前后端技术的演进之路
  5. Spring和JSF集成:MVC螺母和螺栓
  6. 客户端javascript对象的几何属性(获得大小及坐标)
  7. axis2 wsdl2java 报错_解决webService+axis2生成的wsdl文件有两个Bindings/Endpoint 的问题
  8. 2017《面向对象程序设计》课程作业七
  9. 第八章(三)滑动窗口
  10. python绘制函数x^2+y^2的3D图像
  11. AD7124的调试总结
  12. python爬虫——爬取汽车之家新闻
  13. 阿里用回mysql_回mysql事务
  14. 1/cos(x)、1/sin(x)的不定积分推导
  15. 企业微信的消息如何在个人微信上读取?
  16. 基于微信小程序的单词记忆系统(Java+SSM+MySQL)
  17. 百度地图批量精度和维度Java,关于百度地图API批量转换成坐标的方法
  18. C#,图像二值化(13)——全局阈值的双峰平均值算法(Bimodal Thresholding)与源程序
  19. 计算机科学数学基础及教材推荐(转)
  20. JS 通过百度地图获取详细地址及经纬度

热门文章

  1. ribbon基于接口配置超时_feign的ribbon超时配置和hystrix的超时配置说明
  2. 石英晶体谐振器不良问题归纳
  3. 斯坦福NLP名课带学详解 | CS224n 第18讲 - 句法分析与树形递归神经网络(NLP通关指南·完结)
  4. Materia Camera Mesh
  5. 【程序源代码】电商网站系统
  6. python实时读取日志_paramiko使用tail实时获取服务器的日志输出详解
  7. echarts.js刻度标签实现富文本实现中文+图片的效果解决方法
  8. 尚学堂Java学习笔记
  9. 收集的一些名人经典语录
  10. 三星认为 LG 零售店销售苹果 iPhone 违约:也应该销售 Galaxy 手机