手机抓包工具charles和mitmdump抓取手机APP数据(附抓取抖音小视频例子)

mitmdump可以对接Python脚本,在Python脚本中可以修改请求报文和响应报文。

在这里插入图片描述

安装mitmdump

在命令行模式pip install mitmproxy就可以了

连接手机

直接用手机连接电脑的WiFi就可以了
第一步:手机连接WiFi
第二步:点击手机WiFi里的代理设置,选择手动设置代理
第三步:服务器ip填电脑的ip(不知道就在命令行模式下输入ipconfig查看),端口填8080(默认端口)

##经过以上三步,你的手机所有的网络请求,响应,都会流经mitmproxy。现在我们没有打开mitmproxy服务,所有手机暂时是上不了网的。

抓包

在命令行模式下输入mitmdump就可以启动mitmproxy服务。现在所有手机上的网络请求和响应都会被抓包。

##现在手机可以上网了,只要有网络请求和响应,在命令行界面上就会显示出来。

用Python脚本修改网络请求

脚本文件保存为 script.py (随便什么文件名都可以,只要是py后缀就可以了)
接下来编写 script.py

# 修改请求的话,函数名必须为request,参数必须为flow,不然执行不了。
# flow就是我们利用mitmproxy抓包抓取下来的请求报文。

def request(flow):
	flow.request.url = 'http://httpbin.org/get'	

现在启动mitmproxy服务和Python脚本,在命令行界面输入mitmdump -s script.py
虽然脚本里的函数只有一行代码,但是现在所有的网络请求url都被修改为了 httpbin.org/get 了,可以尝试利用手机浏览器输入任何网站。(如果打开app也是一样的道理,请求被发送到 httpbin.org/get 了,所以你手机里需要上网的app现在是用不了的。)

如果单单是修改url,有一些网站会拒绝响应。可以利用request函数修改更多的请求报文信息。

def request(flow):
	flow.request.headers['user-agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.108 Safari/537.36 MZBrowser/7.9.6'
	flow.request.headers['accept'] = '*/*'
	flow.request.headers['referer'] = 'https://www.qq.com/'
	flow.request.headers['accept-encoding'] = 'gzip, deflate, br'
	flow.request.headers['accept-language'] = 'zh-CN,en-US;q=0.8'
	flow.request.url = 'https://www.qq.com'

抓包工具怎么用,看个人的需求,如果是用来实现爬虫,mitmproxy就和浏览器的开发者工具一样。
最基本的代码就是:

import requests


def request(flow):
	## 获取请求的url
	url = flow.request.url
	## 获取请求的headers(伪装成由手机发起请求)
	headers = flow.request.headers
	data = requests.get(url=url, headers=headers)

至于后面的data怎么处理,看个人需求。

例子:抓取抖音小视频

第一步:连接手机
第二步:写代码
第三步:mitmdump -s file.py

import requests


## num变量用来设置文件名
num = 1

def request(flow):
	## 获取请求url和headers
	url = flow.request.url
	headers = flow.request.headers

	global num
	## 抓包之后自行观察,得出小视频的抓取逻辑
	if 'ixigua' in url:
		filename = str(num) + '.mp4'
		resp = requests.get(url=url, headers=headers, stream=True)
		with open(filename, 'wb') as f:
			f.write(resp.content)
	num += 1

在这里插入图片描述
或者可以用response方法。效果和用request方法一样。
其中的区别就是,如果是写request方法,手机app此时还没发送请求到“抖音服务器”(被mitmproxy截取了);
如果是response方法,此时,“抖音服务器”已经把响应发送回来了,我们mitmproxy截取它的响应报文,这样我们PC端就不需要再发送请求了。直接把响应报文的主体拿来使用。

## num变量用来设置文件名
num = 10000

def response(flow):
	## 获取请求url
	url = flow.request.url

	global num
	## 抓包之后自行观察,得出小视频的抓取逻辑
	if 'ixigua' in url:
		filename = str(num) + '.mp4'
		resp = flow.response
		with open(filename, 'wb') as f:
			f.write(resp.content)
	num += 1

一定要注意def request(flow)和def response(flow)的区别
如果在request方法中,flow.response是没有任何内容返回的,因为此时请求还没有转发出去。

## num变量用来设置文件名
num = 10000

def request(flow): ##注意这一行,把response改为request
	## 获取请求url
	url = flow.request.url

	global num
	## 抓包之后自行观察,得出小视频的抓取逻辑
	if 'ixigua' in url:
		filename = str(num) + '.mp4'
		resp = flow.response  ##注意这一行,request方法中,flow.response是没有内容返回的
		with open(filename, 'wb') as f:
			f.write(resp.content)
	num += 1

保存下来的只是一个空文件。

就这样,动动手指就可以把抖音的小视频下载到电脑上。(这个不算是爬虫,因为没有涉及到自动操作,需要人为地用手指操作手机屏幕,如果需要自动化操作,可以利用Appium)

如果要下载音乐或者其他什么的,也是一样的原理。音乐的代码就不放出来了,因为涉及到版权的问题。

由于Windows中不能使用mitmproxy,只能用mitmdump,(虽然在抓包功能上是一样的,但是在命令行界面看mitmdump真的看得头晕)可以使用charles来抓包来进行分析,charles配置连接手机的方法也是一样的。
(Android系统和IOS系统是一样的)
1.下载charles
2.PC端下载charles证书(然后把设置为“受信任的根证书)
3.在移动端(手机)下载charles证书
4.在移动端连接局域网(再手动设置IP,端口)

在charles中,当有流量经过的时候,Host会高亮显示,如下图黄色的,分析起来比较方便。
在这里插入图片描述
分析完之后,用mitmdump来对接python脚本,最终就可以实现把移动端的数据,手动抓取到PC端了。

猜你喜欢

转载自blog.csdn.net/eighttoes/article/details/86697718
今日推荐