Fork me on GitHub

采集方案策略之App抓包

这是崔斯特的第二十二篇原创文章

采集方案策略设计

在群里看到有人询问饿了么的参数,正好感兴趣,就来时间一番。

这里引用下大佬的一段话:

首先大的地方,我们想抓取某个数据源,我们要知道大概有哪些路径可以获取到数据源,基本上无外乎三种:

  • PC端网站
  • 针对移动设备响应式设计的网站(也就是很多人说的H5, 虽然不一定是H5);
  • 移动App

原则是能抓移动App的,最好抓移动App,如果有针对移动设备优化的网站,就抓针对移动设备优化的网站,最后考虑PC网站。因为移动App基本都是API很简单,而移动设备访问优化的网站一般来讲都是结构简单清晰的HTML,而PC网站自然是最复杂的了;
针对PC端网站和移动网站的做法一样,分析思路可以一起讲,移动App单独分析。

其实很多网页都有移动端,像微博,我知道这三个:

  1. weibo.com
  2. weibo.cn
  3. m.weibo.cn

最简单的当然是第二种了,对于今天的受害者——饿了么来说,当然,首选也是移动端。

饿了么抓包分析

这里抓包工具选择Fiddler,这里不讲如何配置,具体参考 用Fiddler对Android应用进行抓包

下面打开手机的饿了么,原本以为会有数据,结果,竟然是这样

去询问了专业人士,了解了有些应用不允许用户抓包,会有相应的限制。好吧,这就能难倒我了吗??

当我切换到发现类目下,发现有奇怪的提示

在疯狂点击继续访问后,我终于可以正常访问了。

那么就可以在Fiddler中查看对应的数据了。这里直接把接口展示出来:饿了么接口

浏览器直接打开,貌似没有啥验证

具体分析里面的参数

1
2
3
4
offset:20
limit:40
latitude:39.93245
longitude:116.50097

有4个参数, offsetlimit 就很常见了,翻页和每页的数据,至于 latitudelongitude 仔细观察就知道,经纬度嘛,把它该修改为你想采集的位置的经纬度就好。

抓包分析之后,接下来采集数据就很简单了,数据字段标识:

food_id 是商品ID,接口是:https://www.ele.me/restapi/shopping/v1/foods?food_ids%5B%5D=712859937

打开此链接就是商品详情内容

可爱的小笼包

restaurant_id 是店铺ID,接口 https://www.ele.me/shop/157458556

打开就是店铺详情页,当然,也有移动端:https://h5.ele.me/shop/#id=157458556

这样进行商品采集就比较轻松了。

好饿,容我先点个外卖。


微信公众号抓包分析

既然都看了饿了么,那也来看看微信吧。

使用Fiddler抓出来的curl命令

1
curl -k -i --raw -o 0.dat "https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzA4NzA1OTc5Nw==&f=json&offset=20&count=10&appmsg_token=936_iWFH%%252F9haOTPb6GApBj6wXjPGKg9eeU7slzmH2Q~~" -H "User-Agent: Mozilla/5.0 (Linux; Android 7.1.1; MI 6 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043632 Safari/537.36 MicroMessenger/6.5.23.1180 NetType/WIFI Language/zh_CN" -H "Accept-Encoding: gzip, deflate" -H "Accept: */*" -H "Connection: keep-alive" -H "Host: mp.weixin.qq.com" -H "X-Requested-With: XMLHttpRequest" -H "Referer: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA4NzA1OTc5Nw==&scene=124&devicetype=android-25&version=26051732&lang=zh_CN&nettype=WIFI&a8scene=3&pass_ticket=lLCqBwwrZ581bGDqrEkRsgjKkWYNPdUBs9grSaFjd79hSX0mdvR8%%2BLUbHoWGGBEp&wx_header=1" -H "Accept-Language: zh-CN,en-US;q=0.8" -H "Cookie: pgv_pvi=4831552512; pgv_si=s989715456; sd_userid=18991505459750403; sd_cookie_crttime=1505459750403; tvfe_boss_uuid=a8e4e4f1ab6cd93d; pgv_info=ssid=s8735681072; pgv_pvid=4201362299; rewardsn=8d8b49dfb1811092eefe; wxtokenkey=19643e9f2ee569a10857d365bba88556d220fd33c1a0666b5d028a72b5bcd901; wxuin=838107840; devicetype=android-25; version=26051732; lang=zh_CN; pass_ticket=lLCqBwwrZ581bGDqrEkRsgjKkWYNPdUBs9grSaFjd79hSX0mdvR8+LUbHoWGGBEp; wap_sid2=CMCF0o8DElxUVDVJR3o1ZldpbDlHWWdjQ0xMU3lxM3BWTUozTFFuZFhrUEJaanhoSmZ1aEVncnU0VzFIaWR3QkVVVXFuTUlMTlkxNFZjTnRCMEt1VHJjV3UzQVNOYWdEQUFBfjD6rvjRBTgMQJRO" -H "Q-UA2: QV=3&PL=ADR&PR=WX&PP=com.tencent.mm&PPVN=6.5.23&TBSVC=43602&CO=BK&COVC=043632&PB=GE&VE=GA&DE=PHONE&CHID=0&LCID=9422&MO= MI6 &RL=1080*1920&OS=7.1.1&API=25" -H "Q-GUID: 569ade09b5931656e4f49098113e88cb" -H "Q-Auth: 31045b957cf33acf31e40be2f3e71c5217597676a9729f1b" -H "Content-Type: application/json; charset=UTF-8" -H "Cache-Control: no-cache, must-revalidate" -H "RetKey: 14" -H "LogicRet: 0"

直接在浏览器中打开,会提示错误

1
2
3
4
5
{
ret: -3,
errmsg: "no session",
cookie_count: 0
}

使用postman分析,最后Python的代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
url = "https://mp.weixin.qq.com/mp/profile_ext"
querystring = {"action":"getmsg","__biz":"MzA4NzA1OTc5Nw==","f":"json","offset":"20","count":"10","appmsg_token":"936_iWFH%2F9haOTPb6GApBj6wXjPGKg9eeU7slzmH2Q~~"}
headers = {
'user-agent': "Mozilla/5.0 (Linux; Android 7.1.1; MI 6 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043632 Safari/537.36 MicroMessenger/6.5.23.1180 NetType/WIFI Language/zh_CN",
'accept-encoding': "gzip, deflate",
'accept': "*/*",
'connection': "keep-alive",
'host': "mp.weixin.qq.com",
'x-requested-with': "XMLHttpRequest",
'referer': "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA4NzA1OTc5Nw==&scene=124&devicetype=android-25&version=26051732&lang=zh_CN&nettype=WIFI&a8scene=3&pass_ticket=lLCqBwwrZ581bGDqrEkRsgjKkWYNPdUBs9grSaFjd79hSX0mdvR8%%2BLUbHoWGGBEp&wx_header=1",
'accept-language': "zh-CN,en-US;q=0.8",
'cookie': "pgv_pvi=4831552512; pgv_si=s989715456; sd_userid=18991505459750403; sd_cookie_crttime=1505459750403; tvfe_boss_uuid=a8e4e4f1ab6cd93d; pgv_info=ssid=s8735681072; pgv_pvid=4201362299; rewardsn=8d8b49dfb1811092eefe; wxtokenkey=19643e9f2ee569a10857d365bba88556d220fd33c1a0666b5d028a72b5bcd901; wxuin=838107840; devicetype=android-25; version=26051732; lang=zh_CN; pass_ticket=lLCqBwwrZ581bGDqrEkRsgjKkWYNPdUBs9grSaFjd79hSX0mdvR8+LUbHoWGGBEp; wap_sid2=CMCF0o8DElxUVDVJR3o1ZldpbDlHWWdjQ0xMU3lxM3BWTUozTFFuZFhrUEJaanhoSmZ1aEVncnU0VzFIaWR3QkVVVXFuTUlMTlkxNFZjTnRCMEt1VHJjV3UzQVNOYWdEQUFBfjD6rvjRBTgMQJRO",
'q-ua2': "QV=3&PL=ADR&PR=WX&PP=com.tencent.mm&PPVN=6.5.23&TBSVC=43602&CO=BK&COVC=043632&PB=GE&VE=GA&DE=PHONE&CHID=0&LCID=9422&MO= MI6 &RL=1080*1920&OS=7.1.1&API=25",
'q-guid': "569ade09b5931656e4f49098113e88cb",
'q-auth': "31045b957cf33acf31e40be2f3e71c5217597676a9729f1b",
'content-type': "application/json; charset=UTF-8",
'cache-control': "no-cache",
'retkey': "14",
'logicret': "0",
}
response = requests.request("GET", url, headers=headers, params=querystring, verify=False)
print(response.json())

这个时候的参数有

1
2
3
4
5
6
action:getmsg
__biz:MzA4NzA1OTc5Nw==
f:json
offset:20
count:10
appmsg_token:936_iWFH%%252F9haOTPb6GApBj6wXjPGKg9eeU7slzmH2Q~~

目前还不清楚这些参数的作用,再抓一个试试

1
2
3
4
5
6
action:getmsg
__biz:MjM5NzI3NDg4MA==
f:json
offset:10
count:10
appmsg_token:936_kFNdYU3DJ%%252B%%252BVfHfEGImXqB5DMbIeqtSR75ZFZQ~~

估计就是 __bizappmsg_token 这两个参数对应不同的公众号

对了,上面的代码会出现一个问题

1
2
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

解决方法

1
2
from requests.packages import urllib3
urllib3.disable_warnings()

App的分析

App类使用的工具是Fidder,手机和电脑在一个局域网内,先用Fidder配置好端口,然后手机设置代理,ip为电脑的ip,端口为设置的端口,然后如果手机上请求网络内容时,Fidder会显示相应地请求,那么就ok了,分析的大体逻辑基本一致,限制会相对少很多,但是也有几种情况需要注意:

  • 加密,App有时候也有一些加密的字段,这个时候,一般来讲都会进行反编译进行分析,找到对应的代码片段,逆推出加密方法;
  • gzip压缩或者base64编码,base64编码的辨别度较高,有时候数据被gzip压缩了,不过Charles都是有自动解密的;
  • https证书,有的https请求会验证证书, Fidder提供了证书,可以在官网找到,手机访问,然后信任添加就可以。

最后,祝大家圣诞节快乐