mitmproxy + Appium实现快手数据的抓取

mitmproxy + Appium实现快手数据的抓取

mitmproxy

1,mitmproxy介绍

mitmproxy是一个支持Http和Https的抓包程序,类似于fiddler,Charles的功能,只不过是通过控制台的形式操作。
此外,mitmproxy还有两个关联组件:
mitmdump:是mitmproxy的命令行接口,利用它可以对接python脚本,实现监听后的处理。
mitmweb:是一个web程序,通过它可以清楚的观察到mitmproxy捕获的请求。

2,mitmroxy环境安装

pip install mitmproxy
注意:在python3.6版本的解释器下是可以安装成功,但是运行会出错,建议使用python3.7版本(3.7版本以上的未测试)
安装完成后使用命令:mitmdump --version 命令来进行测试显示一下结果则表示安装成功:
Mitmproxy: 5.1.1
Python:    3.7.7
OpenSSL:   OpenSSL 1.1.1g  21 Apr 2020
Platform:  Windows-10-10.0.18362-SP0
不使用mitmproxy测试是因为在Windows下不支持mitmproxy的控制台接口。

3, 证书配置

对于mitmproxy来说,如果想要截获HTTPS请求,就需要设置证书,mitmproxy在安装完成后会提供一套CA证书,在用户目录下的.mimtproxy目录下找到CA证书
1)Windows下安装证书
    双击mitmproxy-ca.p12,就会出现导入证书的引导页,有一个私钥密码设置直接跳过,然后选择“将所有证书都翻入下列存储”,点击浏览按钮,选择存储位置为“受信任的根证书颁发机构”,点击确定,下一步按钮即可完成Windows下证书的安装。
2)Android下证书的安装
    mitmproxy在安装完成后会提供一套CA证书,里面有一个mitmproxy-ca-cert.pem文件,将该文件传送到手机上,在手机设置里面选择证书的安装,命名随便即可。

4, Android设置网络与mitmproxy进行连接

手机与PC端在同一局域网下,点击手机网络,修改网络设置为手动,代理服务器主机名为PC端IP地址(cmd下运行ipconfig),端口号为默认为8080,保存。

Appium

1, 安装JDK

在JAVA官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK的安装包

2, 安装SDK

1)下载SDK安装文件,并安装,记录SDK的安装所在文件夹,配置环境变量时使用。

2)配置SDK
	打开SDK Manager.exe,选择安装组件时要注意:查看模拟器或者真机的安卓系统,根据安卓系统安卓组件,必须勾选Tools(Preview Channel),其余的组件根据自己的安卓系统进行勾选安装。
3)添加环境变量
	系统环境变量中添加:变量名:ANDROID_HOME 变量值:SDK所在文件位置
	系统变量Path中添加:%ANDROID_HOME%;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools
4)测试是否安装成功
	cmd下输入adb version查看,安装成功会显示出具体的版本号及位置信息等。

3,安装node.js

运行于服务端的JavaScript解释器
node.js官网下载安装包进行安装。
官网下载:https://nodejs.org/en/download/

4, 安装appium-python-client

appium的python客户端
进入cmd,输入:pip install Appium-Python-Client
安装过程中如果出现网络超时,可以通过换源来解决。

5, 模拟器的安装(用真机的忽略)

1)下载模拟器安装包进行安装
2)cmd下输入人adb devices进行测试

6,问题解决

1)SDK adb的版本和夜神adb的版本不一致导致,解决方法:
    1.将SDK中platform-tools目录下的adb.exe改名为adb_bak.exe,进行备份;
    2.将夜神模拟器安装目录下的adb.exe复制到SDK中platform-tools目录下
2)安装android sdk时,查看安装成功否,用命令adb version,提示adb不是内部或外部命令?
    方法一:在配置环境变量时,path下面添加adb.exe所在路径:D:\software\android-sdk_r24.4.1-windows\android-sdk-windows\platform-tools 配置好后重新在cmd执行adb version命令
    方法二:打开SDK中对应的路径,平台工具目录下找到adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll并复制三个文件 将其复制到C:\Users\bakclass下,配置好后再cmd执行adb version命令,若还是不成功,重启cmd再输入命令,我是使用第二种方法成功的
3)安装appium-python-client时,提示pip不是内部或外部命令?
找到python安装的路径,查看script下是否有pip.exe
再命令行中进入到scripts目录,再执行命令pip install Appium-Python-Client
就可以成功了

mitmdump对接python脚本

在确保环境安装正常的情况下编写py脚本。
通过之前的抓包我们已经得到了数据包在具体的url中请求响应过来,我们不需要去关注该请求是get还是post,请求参数是什么,我们只需要通过抓包将该url进行对比,找到url中共有的字符串,在mitmdump进行截取的时候根据共有的字符串将我们需要截取的url进行目标截取。
url1 = 'gifshow'
url2 = 'ksapisrv'
if flow.request.url.find(url1) != -1 or flow.request.url.find(url2) != -1:
    ctx.log.warn(flow.request.url)
    data_list = flow.response.text.encode('gbk', 'ignore').decode('gbk', 'ignore')
    parse_data(data_list)
上述parse_data是目标url的响应结果解析函数,我们可以根据需求来对响应数据进行解析。

mitmdump获取request信息的一些常用方法:

flow.request.headers #获取所有头信息,包含Host、User-Agent、Content-type等字段
flow.request.url #完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数
flow.request.pretty_url #同flow.request.url目前没看出什么差别
flow.request.host #域名
flow.request.method #请求方式。POST、GET等
flow.request.scheme #什么请求 ,如https
flow.request.path # 请求的路径,url除域名之外的内容
flow.request.get_text() #请求中body内容,有一些http会把请求参数放在body里面,那么可通过此方法获取,返回字典类型
flow.request.query #返回MultiDictView类型的数据,url直接带的键值参数
flow.request.get_content()#bytes,结果如flow.request.get_text()
flow.request.raw_content #bytes,结果如flow.request.get_content()
flow.request.urlencoded_form #MultiDictView,content-type:application/x-www-form-urlencoded时的请求参数,不包含url直接带的键值参数
flow.request.multipart_form #MultiDictView,content-type:multipart/form-data
时的请求参数,不包含url直接带的键值参数

mitmdump获取响应信息的常用方法:

flow.response.status_code #状态码
flow.response.text#返回内容,已解码
flow.response.content #返回内容,二进制
flow.response.setText()#修改返回内容,不需要转码

至此我们已经将mitmdump数据截取完成,下面我们将使用Appium来实现自动化下滑,完成Appium自动化下滑实现数据的刷新。

Appium实现打开目标app,并实现点击滑动等操作。

1,appPackage与appActivity名称的获取

1,介绍
appPackage  待检测的APP名称
appActivity 待检测的APPappActivity名字
以上两条信息必须要相互对应,否则不能正确运行
2,查找目标APP的属性
方法:
    确保环境配置正确的情况下
    1)adb logcat > d:/log.txt  #将手机的日志信息保存到本地log.txt文件
    2)打开手机中需要操作的APP
    3)cmd终端Ctrl+C终止命令行的日志信息
    4)打开log.txt文件,搜索cmp 会显示cmp=com.tencent.weishi/com.tencent.oscar.module.main.MainActivity} from uid 10038 on display 0 类似信息
    5)appPackage = com.tencent.weishi
    6)appActivity = com.tencent.oscar.module.main.MainActivity

appium实现页面的上滑

获取窗口的大小
    def get_size(self):
    # 获取窗口尺寸,滑动窗口使用
    size = self.driver.get_window_size()
    x = size['width']
    y = size['height']
    return x, y
使用swipe来实现窗口的滑动
    def swipe_up(self):
    # 向上滑动
    size = self.get_size()
    x1 = int(size[0] * 0.5)
    y1 = int(size[1] * 0.9)
    y2 = int(size[1] * 0.1)
    self.driver.swipe(x1, y1, x1, y2, 500)
使用while True 来实现窗口的无限循环上滑
但注意,在循环下滑的时候中间休眠1s否则会出现滑动错误。

你可能感兴趣的:(python,android)