水滴宝宝是我小孩出生到现在3岁一直在用的一款亲子相册app,挺好用,没有广告,但是最近发现有图片无法显示、视频无法播放的情况,感觉这app可能哪天就没了,我需要把之前上传的数据拿下来,备份到本地。
再后来,我有了个想法,想做成一个完整的程序,当成一款产品来做,做成注册版,供有需要的人使用,搞了一段时间,发现浪费时间,服务器的钱都赚不回来,决定把它开源,同时把当时的思路也整理一下。
水滴宝宝提供了web版,官网http://home.ishuidi.cn/,登陆web版可以看到之前通过app上传的照片和视频,既然能看,我们就能想办法把它下载下来。
先登陆web版,登陆后cookie里面有下载照片要用到的关键数据:childid、mid、token、familyid号,通过这些信息可以组合成相关的协议格式,按指定的格式去请求就能拿到照片信息了。
Cookie:
pgv_pvid=123123; __qc_wId=123123; Hm_lvt_123123=123123; Hm_lpvt_123123=123123; cookie_mid=123123; cookie_pw=123123; weibojs_123123=123123; cookie_token=123123; cookie_username=123123; cookie_phone=123123; cookie_familyId=123123; cookie_child=123123; cookie_bg=1; cookie_islogin=1
先看看第一条数据请求信息:
http://home.ishuidi.cn/query_all_growth_list.php
上图两箭头是关键点,这是第一条照片信息请求的数据格式,通过max_t可以用来索引出所有的信息,上面的请求服务端返回的数据如下:
每请求翻一页,web会展示更多的照片,这些照片信息就是通过上次返回的min_t来决定的,每次请求数据,以上次返回的min_t值作为本次请求的max_t值(初始的max_t、min_t为0)。
如果我往下翻页,便产生第二条请求:
图中的max_t:1xxxx3就是上一次返回的min_t,依次类推。。。。。。
具体每张照片、视频的地址信息也是藏在这个response数据里面,json格式,格式比较简单,拿出来分析一下:
medias就是每次上传的照片、视频信息(数组格式),i是照片或视频的id号,这是它们的唯一标识,ty是类型,0为照片、1为视频,ct是照片创建的unix时间,拿到这些信息就可以组装成具体的数据请求url,然后去抓取照片和数据,然后通过它们来对数据分类。
拿到信息后,组合url,就能下载文件了http://home.ishuidi.cn/web_download_file.php?id=121313&type=0(如果type为1的话,要跟上&mime=mp4后缀)
当时遇到个问题
1、有些用户有几个宝宝,这样我下载下来的数据就混在一起了,其实是可以结合cookie信息,为每个宝宝建立对应的文件夹,来存放各自的数据。
2、照片下载回来,都已经丢掉了原始的日期信息,需要用服务端返回的ct来修复exif格式里面时间信息,这里我在github上down了个处理代码来修复时间。
3、水滴宝宝使用的是ucloud的存储服务器,不确定是啥原因,如果请求的文件稍大点,每次都只能请求到一部分数据,导致最终文件格式不对,无法播放,要用断点续传才能解决这个文件,多次尝试,直到数据被下载完(这里我采用wget的断点续传功能,通过多次尝试来下载回所有的文件)。
导出工具在这里下载:http://pan.baidu.com/s/1bpMSFUZ
成品界面:
代码在这里:https://github.com/llydd/ishuidi
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法