nodejs京东接口分析系列-实现京东自动化功能 之 购物车修改

本章节实现,清空购物车、修改购物车库存添加购物车功能

需要用到京东的用户登陆后的信息,详情请查看 https://blog.csdn.net/weixin_38407447/article/details/116590602 章节

后续感兴趣的小伙伴可自行实现 购物车的增删查改等全部功能

 

首先,我们先分析一下京东的购物车接口

打开 https://item.jd.com/100009820314.html,ctrl+f12来一波~

 

 

发现加入购物车功能是如此简单,以至于不敢相信

http://cart.jd.com/gate.action?pid=100009820314&pcount=1&ptype=1

其实这个接口是一个页面,请求之后,服务器全部给你处理好了,给前端返回一个页面

-----------------------------------------------------------------------------------------------------------------------------------------------

但是 本人更喜欢 纯api请求,出于好奇心,尝试看看能不能在购物车页面找到纯api接口

https://cart.jd.com/cart_index/

直接就能找到api  ,都是post请求,带上登陆cookie信息

1.获取购物车信息 接口

https://api.m.jd.com/api?functionId=pcCart_jc_getCurrentCart&appid=JDC_mall_cart&loginType=3&body=%7B%22serInfo%22:%7B%22area%22:%2219_1601_36953_0%22,%22user-key%22:%22mu15tkL3TxhUnUxx4Wb5jS4Eup7Gtg5x%22%7D,%22cartExt%22:%7B%22specialId%22:1%7D%7D

接下来参数分析

functionId:pcCart_jc_getCurrentCart

appid:JDC_mall_cart

loginType:3

body:{"serInfo":{"area":"19_1601_36953_0","user-key":"mu15tkL3TxhUnUxx4Wb5jS4Eup7Gtg5x"},"cartExt":{"specialId":1}}

经过测试 body里面的 user-key 可直接传空字符串,可根据页面数据,分析返回的接口数据字段含义,这个比较简单,不做说明

 

    async function getUserCartInfo(user){
        let url = 'https://api.m.jd.com/api'
        let body =  {"serInfo":{"area":g_data.areaId,"user-key":""},"cartExt":{"specialId":1}}
        const result = await request({
            method: 'post',
            url: url,
            headers: Object.assign(user.header, {
                "origin": "https://cart.jd.com",
                "referer": "https://cart.jd.com/",
                cookie: user.cookieData.join('')
            }),
            params: {
                'functionId': 'pcCart_jc_getCurrentCart',
                'appid': 'JDC_mall_cart',
                'loginType': '3',
                'body': body,
            },
        })
        // result.data.resultData.cartInfo == null

        // console.log(JSON.stringify(result.data.resultData))
        return this.getGoodInfo(result.data.resultData,user)
    }

 

2.修改购物车库存接口

 

3.加购物车商品接口

https://api.m.jd.com/api

参数分析,只解析body,其他跟上面接口一样

body: {"serInfo":{"area":"19-1601-36953-0","user-key":"mu15tkL3TxhUnUxx4Wb5jS4Eup7Gtg5x"},"operations":[{"carttype":1,"TheSkus":[{"Id":"100012763746","num":1}]}]}

user-key 可以为空字符串  这里推测, serInfo里面的参数都固定好传个京东地址编号就可以了

operations 字段数据分析,

carttype:1(固定)

TheSkus数组, 很明显就是需要加购的商品信息, id是商品id,num:表示加购数量

 

4. 清空购物车接口

这里发现有两个可以清空购物车的接口

 

两个接口都差不多 ,只不过返回参数不一样,一个get请求,一个post

这样我们就可以推测 https://api.m.jd.com/api 这个接口,直接就能实现购物车的增删查改所有功能了,传到对应参数就可以了

购物车清空接口需要传购物车所有商品信息,通过 上面的 获取购物车信息接口返回的信息 解析得到

这里解析一下

resultData.vendors  : 是个数组,表示不同商店的各个商品信息

其中vendorId 和shopId 就是对应的店铺id 

 

resultData.vendors[0].sorted : 数组,包含单个店铺已加购的商品信息

resultData.vendors[0].sorted.item : 对象,对应的每个商品信息

奉上我的解析代码

  function getGoodInfo(resultData,user){
        let shopList = []
        let goodInfo = {}
     
        if(!resultData){
            // console.error(`登陆授权可能失败 ${user.unick}`)
            resultData = {}
            if(!user.outLogin){
                let ids = this.getTempMsgUserId(user.unick);
                ids.forEach(e=>{
                    this.temp_msg(e,"登陆状态已过期",`京东账号:${user.unick}`,"点击跳转扫码登陆","","",true)
                })
            }
            user.outLogin  = true
        }
        if(resultData.cartInfo){
            let vendors = resultData.cartInfo.vendors
            vendors.forEach(e=>{
                let shopitem = e.sorted[0].item
                // let sType = shopitem.SType;
                let sType = 1;
                let num = shopitem.Num;
                let Id = e.shopId;
                let items = []
                e.sorted.forEach(o=>{
                    let obj = {
                        Id:o.item.Id,
                        skuUuid:o.item.skuUuid,
                        useUuid:o.item.useUuid,
                        num:o.item.Num,
                        Name:o.item.Name,
                    }
                    items.push(obj)
                    goodInfo[o.Id] = obj
                })
                shopList.push({
                    sType,num,Id,
                    items:items,
                })
            })
        }
       
        // let sorted = vendors[0].sorted[0];
        // let buyShopid = sorted.item.Id;
        return {shopList,goodInfo}

    }

清空购物车代码

    async function removeUserCart(user){
        let { shopList } = await this.getUserCartInfo(user)
        if(shopList.length == 0){
            console.log(`${user.unick} 购物车已空${shopList.length}`)
            return true
        }
        console.log(shopList)
        // let url = 'https://cart.jd.com/quickDel.action'
        let url = 'https://api.m.jd.com/api'
        let body =  {"operations":[{"carttype":"4","TheSkus":[],"ThePacks":[{"Id":106417096782,"num":1,"sType":13,"TheSkus":[{"Id":"10025678773125","num":1,"skuUuid":"1194226238944649706634989568","useUuid":false}]}]}],"serInfo":{"area":"19_1601_36953_62867"}}
        body.serInfo.area = g_data.areaId
        body.operations[0].ThePacks = []
        console.log(body)
        shopList.forEach(e=>{
            let obj = {
                num:e.num,
                sType:e.sType,
                Id:e.Id,
                TheSkus:[]
            }
            e.items.forEach(item=>{
                obj.TheSkus.push({
                    num:item.num,
                    Id:item.Id,
                    skuUuid:item.skuUuid,
                    useUuid:item.useUuid,
                })
            })
            body.operations[0].ThePacks.push(obj)
        })
        // let delParam = [{id:10025522073879,s:false,vs:false},{id:10025678773125,s:false,vs:false},{id:70196142298,s:false,vs:false}]
        let delParam = []
        shopList.forEach(e=>{
            e.items.forEach(item=>{
                delParam.push({
                    id:item.Id,
                    s:false,
                    vs:false,
                })
            })
         
        })
        console.log(delParam)
        const result = await request({
            method: 'post',
            url: url,
            headers: Object.assign(user.header, {
                "origin": "https://cart.jd.com",
                "referer": "https://cart.jd.com/",
                cookie: user.cookieData.join('')
            }),
            params: {
                'functionId': 'pcCart_jc_cartRemove',
                'appid': 'JDC_mall_cart',
                'loginType': '3',
                'body': body,
            },
        })
        // console.log(result.data)
        // console.log(result.data.resultData)
        // console.log(JSON.stringify(result.data.resultData))
    }

 

至此,本章节功能已完成,下单功能请查看下个章节

 

 

 

其他功能实现分析链接

1.京东扫码登陆功能实现 原理 分析

https://blog.csdn.net/weixin_38407447/article/details/116590602

2.京东商品信息监控功能实现 原理 分析

https://blog.csdn.net/weixin_38407447/article/details/116592629

3.京东购物车修改功能实现 原理 分析

https://blog.csdn.net/weixin_38407447/article/details/116593254

4.京东自动下单功能实现 原理 分析

https://blog.csdn.net/weixin_38407447/article/details/116595784


版权声明:本文为weixin_38407447原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。