Appium抓取app数据

主流APP数据抓取难点:

 

 

1.请求参数加密

                -sign签名,使用sha1加上md5做辅助加密

 

2.请求body加密

                -整个请求体使用DES算法做加解密

 

3.代理检测反爬

                -抓包设置代理后,直接不再加载数据

 

4.私有CA证书反爬

                -由于公有的证书需要付费,有一些厂商(oppo)的证书为私有

 

 

 

解决办法:

 

一、暴力解决:

针对以上问题,暴力解决的方式就是一切不予解决,直接以侵入webview的方式获取数据。

 

优点:直接,简单,暴力

缺点:依赖appium环境,整套环境搭建安装起来还是比较麻烦,抓取效率低下

 

二、破解sign签名:

反编译源码进行动态调试,然后利用

 

优点:  抓取效率高

缺点:破解成本高,反编译浪费时间,成功概率较小,非常麻烦,需要看和调试代码

 

 

 

项目示例:(oppo软件商店抓取)

 

传统抓取方式的表现:

    按照传统步骤charles抓包,发现进入app详情和评论页面的时候出现CA证书无法加载!

 

分析问题:

    https是需要SSL认证的,所以去去请求的时候会带着CA证书来鉴定请求是否安全,对于

    一些比较重视安全的企业来说,app内置的CA证书就够用了,但是 发现oppo软件商店这

    款应用比较奇葩,CA证书是自己签发的,这样必须得绕过认证

 

解决CA自签发证书问题:

    那么解决方法就是不带https就好了,在模拟器中,安装以下内容

            Xposed框架     ——>  加载第三方模块库来侵入系统达到可自定制需求的目的

                需要做的事情:

                    1.模拟器需要root

                    2.在模拟器上安装xposed框架app

                    3.进入Xposed  app , 点击安装,完成之后可能卡死,重启就好

 

            JustTrustMe    ——>  安装

            SSLSping         ——>  安装

            这两个模块下载完成后,进入Xposed app选择模块,导入这两个模块后重启即可   

    这样就不再走https了,自然绕过了CA认证!

 

 

然后再通过传统的方式去抓包:

       抓取的结果如下:

Appium抓取app数据_第1张图片

            

Appium抓取app数据_第2张图片

 

 

发现问题:

        1. sign签名

        2.数据返回格式是x-protostuff (序列化协议)

        

 

解决问题(方式二:基于反编译源码动态调试): 

        破解app(这个在之后再做仔细的分析)

        

        1.下载apk,修改后缀为zip,解压之后拿到dex文件(dalvik虚拟机字节码,相当于java的class文件),使用apktool反编译dex2jar转化为jar文件(将smali代码转化为class文件,一般会有针对变量和方法名的混淆) , 再使用jd-GUI打开jar文件,这样就可以看到基本的代码了,但是仅仅只是看到代码而已,距离研究分析破解而言才刚刚开始。

 

 

       2.动态调试需要和反编译需要安卓环境的支持,这里暂时不做说明和实践。

 

 

 

 

解决问题(方式一:基于appium):

        appium是一款自动化测试移动端的工具,可以获取app的视图,那么问题就很好解决了。

 

        环境下载安装与配置

        1.安装appium-desktop ,下载后安装即可

        2.安装adb工具  (3个文件:adb.exe, xxxx.dll,xxxxx.dll) 将这三个文件放在c盘下的Windwos目录下

            都复制到System32 和SysWow目录下,最后在控制台输入adb命令就可以用了

        3.打开模拟器,打开开发者调试模式,进入系统的版本号,点击5次即可打开

        4.使用adb命令连接模拟器,adb connect 127.0.0.1:xxxx   

                   逍遥模拟器是21503

                   夜神模拟器是62001

                最后使用adb devices -l 查看连接的设备应该可以看到模拟器的设备名称

        5.下载Android idk环境,由于新版本(25.2+)的Android sdk会出现命令过时的情况,所以下载低版本的比较好

           下载完成之后配置android_home环境变量到Path下即可,这样可以在终端直接运行android sdk命令

        6.在终端运行android sdk 命令,下载那些sdk. 完成之后即可

        

        创建appium session:

        1.appium创建127.0.0.1的host

        2.配置参数如下json:

 

{

  "platformName": "Android",

  "platformVersion": " 4.4.4”,       ——> 模拟器android版本号

  "appPackage": "com.oppo.market”,         ——> main入口类位置

  "appActivity": "com.oppo.market.activity.MainActivity”,      ——>入口的activity

  "deviceName": “127.0.0.1:21503”,              ——>模拟器的host与端口

  “app": “c://xxxxx”               —> 模拟器app的位置

}

 

设置完成之后就可以看到app视图了,这样就可以拿数据了

                Appium抓取app数据_第3张图片

 

怎么拿数据呢?

        appium提供不同版本的代码支持,可以调用seleium相关的api直接获取元素

    Appium抓取app数据_第4张图片

 

依赖:appium => 

 

pip install Appium-Python-Client

 

 

方案架构图:

 

                                 请求                                                                代理请求发送

代码client        ————————>  appium-desktop-server   ————————>   adb server  ————>  app

 

 

可以看到,整个请求链经过了好几层转换,所以环境搭建是相对较难的,但是理清晰了还是很直接的。

 

 

 

 

 

你可能感兴趣的:(爬虫)