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
flow.request.url
flow.request.pretty_url
flow.request.host
flow.request.method
flow.request.scheme
flow.request.path
flow.request.get_text()
flow.request.query
flow.request.get_content()
flow.request.raw_content
flow.request.urlencoded_form
flow.request.multipart_form
时的请求参数,不包含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
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否则会出现滑动错误。