本章节实现,清空购物车、修改购物车库存和添加购物车功能
需要用到京东的用户登陆后的信息,详情请查看 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.加购物车商品接口

参数分析,只解析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