首页
社区
课程
招聘
[转帖]自己动手用抓包工具抓取抖音上的“美女”
2019-1-11 20:00 22932

[转帖]自己动手用抓包工具抓取抖音上的“美女”

2019-1-11 20:00
22932

手机抓包

本文的重点就在于如何获取手机 App 发出的请求。

手机 App 不像电脑上的网页能直接通过浏览器查看相关信息,在手机设备上也不方便使用工具一边流量一边调试。所以常用的方式就是通过在电脑上装一些“抓包”软件,将手机上的网络请求全部显示出来。

那为什么电脑能看到手机上的网络请求?这里就要提下“代理”这个概念。“ 代理 ”形象的解释就是字面的理解:所有你发出的请求不再是直接发到目的地,而是先发给这个代理,再由代理帮你发出。所以通过代理,可以实现隐藏 IP、进入专用网络、翻…咳咳那啥等功能,也包括我们今天说的:手机抓包。

顺带说句,在公共场所别随便连不确定的免费 wifi,理论上来说,人家也可以抓你的包。

这里,我们要用的工具是Fiddler。它是一个较成熟的免费抓包工具。可以抓取网页、桌面软件、手机 App 的网络请求,并可以运行在 Windows、Mac、Linux 平台上,支持 iOS 和 Android。(虽说都支持,但强烈建议Windows + Android,后面我会有吐槽)

下载安装

搜索一下fiddler很容易找到它们的官网https://www.telerik.com/fiddler,点击 download 下载即可(有个表格随便填下)。

Windows 下载后正常安装。如果是 Mac,还会有安装步骤提示,告诉你需要先安装一个叫做Mono的框架,以便可以执行 Fiddler.exe。另外 Mac 版还有几个小坑:

1. 运行 mono 命令用sudo

2. 如果报一堆错闪退,请用mono --arch=32 Fiddler.exe(这个参数还必须放在文件名前面)

3. 第一次正确运行时,程序会卡住很长时间,以至于我以为还是挂了,这时请耐心等待。(我要不是正好有事走开,回来发现成功了,可能就放弃尝试了)

4. 即使正常运行了,Mac 上界面也会有各种显示的 bug,切记不要打开的弹窗的情况下切换程序,不然回来就找不到弹窗了……

5. 软件中无法复制……

6. 在 iOS 上无法抓取 HTTPS 请求(这基本就是废了),需要额外创建一个证书,但这个证书工具只能在 Windows 下运行……

所以可以的话,还是用Windows来做。Mac 上还有个比较知名的工具Charles,有用过的可以留言评价下。

配置

安装好工具后,需要做一些必要配置才能抓包。

1. Fiddler 配置

设置允许抓取 HTTPS 信息包。打开下载好的 fiddler,找到Tools -> Options,然后在HTTPS的工具栏下勾选Decrpt HTTPS traffic,在新弹出的选项栏下勾选Ignore server certificate errors。这样,fiddler 就会抓取到 HTTPS 的信息包。

设置允许外部设备发送 HTTP/HTTPS 到 fiddler。设置端口号,并在Connections选项栏下勾选Allow remote computers to connect。

配置好后需重启软件。

2. 设置手机代理

在抓包前,确保你的电脑和手机是在一个可以互访的局域网中。最简单的情况就是都连在同一个 wifi 上,特殊情况这里不展开讨论(有些商用 wifi 并不能互访)。

打开软件,鼠标放在右上角的Online上可以看到本机的 IP。或者也可以通过命令行中的ipconfig命令(Mac/Linux 是ifconfig)查看。(截图仅为演示,以你自己的 IP 为准)

手机设置代理 IP。打开手机无线网络连接,选择已经连接的网络连接,点击一个小圆圈叹号进入可以看到下图(安卓也类似),选择配置代理,进入后把刚刚的IP 地址输入进去,端口就是 fiddler 中设置的 8888。

3. 安装证书

获取HTTPS请求必须要验证证书。电脑端访问:http://localhost:8888/ 进行安装。

手机访问前面设置的电脑的 IP 地址加端口 8888 访问,比如图中例子是:http://192.168.23.1:8888

有些安卓需要手动从设置里进入并导入证书,否则无法生效。

4. 测试

开启 fiddler 的状态下,打开手机随便一个 APP,应对可以正常访问,并且在 fiddler 中看到所发出的网络请求。

如果能访问但看不到请求,确认下有没有代理有没有生效。如果不能访问,检查下证书是否都下载并验证。还是不行则按照上述步骤再仔细配置一遍。

分析请求

完成这一步之后,接下来的事情就和网页爬虫没太大区别了。无非就是从这些请求中,找到我们需要的那几个。

fiddler 里记录的是所有请求,比较多。在操作 App 前,记得清空已有请求,方便观察。然后再配合上filter 筛选器,定义筛选规则,会较容易找你需要的内容。找到请求后,在软件里查看你要的信息,或者右键点击选择将请求导出。

经过操作+观察,可以定位到获取用户上传视频列表的请求是

https://api.amemv.com/aweme/v1/aweme/post/?…

从WebForms栏里可以查看请求的详细参数信息。返回值是一个组JSON数据,里面包含了视频的下载地址。

这是一个需要经验积累的活儿,不同的网站/App,规则都不一样,但套路是相似的。对网页爬虫还不熟悉的话,先看看之前的文章爬虫必备工具,掌握它就解决了一半的问题。

代码抓取

得到地址之后,经过在浏览器和代码里的一番尝试,找到了此请求的正确解锁方式:

1. 需要提供以下参数:max_cursor=0&user_id=94763945245&count=20&aid=1128,其中user_id是你要抓取的用户 ID,其他参数都可以固定不用改。

2. 需要使用手机的User-Agent,最简单的就是{'user-agent': 'mobile'}

请求代码:

import requests as rs
uid = 94763945245
url = 'https://api.amemv.com/aweme/v1/aweme/post/?max_cursor=0&user_id=%d&count=20&aid=1128' % uid
h = {'user-agent': 'mobile'}
req = rs.get(url, headers=h, verify=False)
data = req.json()
print(data)

uid 替换成你想抓的用户 ID。获取用户 ID 有个简单方法:在用户页面选择分享,链接发到微信上,从网页打开就可以看到 user_id。

提取视频列表并下载:

import urllib.request
for video in data['aweme_list']:
    name = video['desc'] or video['aweme_id']    
    url_v = video['video']['download_addr']['url_list'][0]
    print(name, url_v, '\n')
    urllib.request.urlretrieve(url_v, name + '.mp4')

此方法元旦前还是有效的,可以通过 Chrome 开发者工具进行模拟。之后能使用多久这就没法保证了,爬虫代码都不会是一劳永逸的。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PYGame 2019-1-11 22:25
2
0
666 就问一下有没有水印
雪    币: 248
活跃值: (3779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2019-1-12 15:17
3
0
公共场所的WiFi抓包,可以通过监听无线网卡流量来实现
特别是免费WiFi,一旦有用户连接,就完全不知道自己掉进坑里了
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yellowjun 2019-5-7 13:30
4
0
为什么手机上个显示网络连接错误
游客
登录 | 注册 方可回帖
返回