京东的京东App不像微信那样有公开的网页版接口,想抓它的抓包数据包,得先过HTTPS加密这道坎。软件我花了一个周末,京东在电脑上装好了Fiddler和Charles两套工具,抓包最后发现真正卡住我的软件不是软件本身,而是京东手机上的证书信任问题。
用小米手机调试的抓包时候,系统会拦截用户安装的软件证书。你装了Charles的京东证书,浏览器访问https网站倒是抓包没问题,但京东App内部请求照样报错。软件折腾到凌晨两点,京东我翻到一条冷门帖子——得把证书装进系统分区,抓包可这需要root权限。软件我的手机没解锁,这条路直接断了。
换个思路,用模拟器。夜神安卓7自带root,装证书方便得多。启动Charles,设置代理端口8888,模拟器里连上同一个WiFi,填好代理IP。打开京东App,Charles面板上终于开始刷出密密麻麻的域名请求。但问题又来了——大部分请求都指向api.m.jd.com,内容却是乱码。Charles的SSL Proxying设置里得手动添加这个域名,端口填443,再重启抓包,这回能看到明文了。
抓到的数据结构挺规整,全是JSON格式。比如商品详情页,请求URL里带skuId参数,返回的字段包括价格、库存、促销标签。但京东的反爬机制不是吃素的——同一个接口连续请求几十次,突然返回一段加密的sign字段错误。后来我对比正常请求和异常请求的header,发现有个cookie里的3AB9D23F7A4B3C9值一直在变,这个参数应该是服务器动态下发的,没法伪造。
有个取巧的办法,用京东的PC端网页版抓包。电脑浏览器直接按F12打开开发者工具,切到Network面板,刷新商品页面,能看到所有XHR请求。这里的接口和App端大部分重合,只是没有App那么严格的签名校验。我试着用Python的requests库模拟这些请求,带上浏览器cookie,居然能稳定拿到价格数据。不过京东的风控会监控请求频率,连续访问超过20次/分钟,IP会被临时封禁。
抓包软件本身不是重点,真正的门槛在于理解京东的接口加密逻辑。比如商品搜索接口https://search.jd.com/search.php,参数里有个keyword是明文,但还有个psort是加密的,得靠JS逆向才能解出来。我懒得碰逆向,直接改用手机App上的“扫码购”功能——那个接口只传商品二维码的编码,返回的价格和库存数据足够日常比价用。
折腾到最后,我留下一个结论:如果你只是想查某个商品的实时价格,别碰App,用京东的移动端H5页面(item.m.jd.com)配合Charles,抓包成功率最高。那个页面走的是普通HTTP/2协议,只验证基本的User-Agent,不需要处理复杂的签名。我写了个小脚本,每天早上自动抓一遍购物车里几个商品的报价,存进Excel里看价格波动。这个用法持续了两个月,没被封过号。
工具选型上,Windows用户优先用Fiddler,它对系统代理的接管更彻底;macOS用户就用Charles,界面更顺手。但不管选哪个,记得把抓包软件的端口设成不常用的数字,比如8888或9999,免得和本地其他服务冲突。最后提醒一句:抓包只适用于个人学习或比价,别拿去搞刷单或抢购,京东的异常检测系统不是吃素的,我亲眼见过有人用抓包脚本抢茅台,账号被永久冻结。