目录

  • 背景
  • 分析
  • 环境
  • 实践
  • 总结

最近一段时间忙于搬家和适应新的环境,接下来可以正常分享一些工作中用到的东西和学习技巧相关

背景

接手一个需求,想要调研一下某个chrome 的插件为什么能拿到数据

当打开这个链接的时候
https://www.aliexpress.com/af/1PC-Simulation-Grass-figurine-Micro-Landscape-home.html?SearchText=1PC+Simulation+Grass+figurine+Micro+Landscape+home&d=y&initiative_id=SB_20190424011710&origin=n&catId=0&isViewCP=y&jump=afs

安装插件:https://chrome.google.com/webstore/detail/oberlo-aliexpresscom-prod/hmanipjnbjnhoicdnooapcnfonebefel?hl=en

再次打开产品链接时会出现如下效果

需要拿到Processing Time这个字段的结果

分析

网页上的展现的数据一般就两种途径

  • 来自于网络请求的数据,如:ajax ,websocket
  • 数据本身就存在页面的隐藏域里面,插件以某种方式来解密数据,然后呈现到客户端

我们是装了插件之后,数据才呈现出来的,所以插件非常大的可能性是新增加了一个api去拿数据,但是为了保证实践方向是ok的,我还是要打开Chrome F12去模拟一次请求查看数据的关键字是不是在某个api里面

在搜索了 daysProcessing Time等关键字之后,确定不在内置的api中,我猜想chrome请求监控 并不会把插件的http(s) api 列出来

还好,chrome插件是以源码形式存在的,我们直接找到插件文件夹就可以了,chrome 插件的文件夹命名就是插件的ID

我们在本地文件夹里面找一下

sudo find / -name "*hmanipjnbjnhoicdnooapcnfonebefel*"

一下就找到结果了

/Users/brucedone/Library/Application Support/Google/Chrome/Profile 1/Extensions/hmanipjnbjnhoicdnooapcnfonebefel

里面有3个版本,一般点开最新的就可以了

├── _metadata
├── assets
│   ├── css
│   ├── icons
│   ├── images
│   └── js
├── pages
├── popups
└── scripts
    ├── content
    ├── pages
    └── popups

用Pycharm 打开这个文件夹,然后全局搜索一下’Processing Time’这个关键字

显示出来是在main.js中体现,那自然的,这个方法是被renderProcessingTime方法回调了,我们在本文件中追查这个方法的源头

方法调用的至下而上的路径

renderProcessingTime -> renderShipping -> processResponseProduct -> initPage


最后一层的源码所在
this.errorMessage = !1, this.chrome.runtime.onMessage.addListener(function (t) {
    if (t.action === h.default.actions.GET_PRODUCTS_SHIPPING_INFO && e.settings) try {
        t.result.error ? e.showFailMessage(t.result) : e.processResponseProduct(t.result)
    } catch (t) {
        e.logException(t.message, {stack: t.stack, settings: e.settings})
    }

查到在初使状态相关的字段

从字段意思解读出来,那就是shippingInfo这个url比较可疑了,OK,通过源码我们锁定了目标的api url,接下来就有请今天的主角登场了

环境

实践

安装配置whistle

根据文档的指示,完成安装,在安装完之后,直接跳转到这个页面

http://wproxy.org/whistle/webui/https.html

根据文档提示,安装根证书,不然是没有办法来获取https请求,另外根据文档要求,我们可以进一步安装chrome切换代理的插件


如图配置好我们的代理请求地址

启动工具

切换回命令行,使用命令

w2 start


如图所示,我们监控进程已经启动,切换回chrome界面,使用switchyomega切到我们配置的规则

这里我命令规则为debug,和上面的whistle 规则等同,刷新页面,然后查看
http://local.whistlejs.com/#network

目标http api 就可以监听到请求了,请求的request 和 response 就轻松展现出来了

编写代码

import requests


def get_processing_time():
    url = 'https://freight.aliexpress.com/ajaxFreightCalculateService.htm?productid=32638146402&country=US&count=1¤cyCode=USD'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',
        'Accept-Language': 'en-US,en;q=0.9',
        'Cookie': 'ali_apache_id=11.180.246.136.1556097768408.177215.8; acs_usuc_t=acs_rt=c4b2d77c823e454184bb9dd979dbe8ac&x_csrf=83uwj9mybb9m; xman_t=6Dqiz/274fKeAncjaDzZHI4Cb4JO0xoZ22MHNstIJbqk2LNUhQq3sHvmBcHIf/Vn; intl_locale=en_US; xman_f=jYFgPbrkepaZBbTiMXnbnrzcne5PdnEPrY/bLbP6RdpNANNR/7zbIickdPJEufu2xybgiJ0saoEonRaLk+spPA9GQRh4SWHslUhJ9am0rDFniK0lnAZDkQ==; _m_h5_tk=a16a61a129520657ac4aa98ff7f8ee82_1556108213279; _m_h5_tk_enc=6fe711ecff4676c49b9c3695e602ad5e; aep_history=keywords%5E%0Akeywords%09%0A%0Aproduct_selloffer%5E%0Aproduct_selloffer%0932638146402; JSESSIONID=EB608513FB395C6910F22B667F2CC4C6; xman_us_f=x_l=1&x_locale=en_US; isg=BBwcoOjorO7xhlgzjOH0cp3f7TzEl8gPIp9ndfYdKIfqQbzLHqWQT5KwpeEcSfgX; l=bBrIcuOVvCaYIdgKBOCi5ZaPGQQOSIRAguWbUVbJi_5Bw_Y1k4bOlIOq0Ev6Vf5RsvYB4v_MwA99-etf2; aep_usuc_f=region=US&site=glo&b_locale=en_US&c_tp=USD; intl_common_forever=Bi5sZD8Yst3SGy4VxXAkM00Fh1WNtoarnNM/T3yMjZ1jjWNM1IpuPg=='
    }

    r = requests.get(url=url, headers=headers)
    print(r.status_code)
    print(r.text)


if __name__ == '__main__':
    get_processing_time()

关于结果的解析就不加以详细说明了

总结

本次主要从

  • 猜想
  • 验证
  • 推翻
  • 重试

的思路,从一个简单的目标关键字,找到最后目标api,然后介绍了新工具whistle的简单使用,当然他的功能强大,可以单独列一个篇章了

关于破解api类别的,如果不涉及加密和解密,一般不会特别的复杂,如果涉及(ps:请遵守相关的法律法规,只用于学习),可以去看雪论坛或者52pojie论坛里面找寻,我们的目标不是要求自己学会各种复杂的技能,是在合理的人力成本和时间内,产生最大的价值,想法比行动重要。