直接进入正文。京东抢购形式有很多种。

  1. 普通产品无货,守时查询库存蹲抢
  2. 普通产品守时发售(库存由0变为有货),守时提早构造订单恳求抢
  3. 预售产品(需求先预定),可以参加购物车,通过购物车结算。这种用常规购物车结算订单接口就行,当然也可以用抢购接口。

这种体现为可以加购,抢购时分显现两个按钮,参加购物车(黄色)和当即购买(淡绿色)。

  1. 预售产品(需求先预定),无法参加购物车,电脑端无法预定,有必要手机端预定。这种选用marathon.jd.com/seckillnew/… 接口完结抢购,有完整流程验证和tokenKey(sign),sk验证。

这种体现为 无法参加购物车,有必要手机端才干预定,可购买时分只显现一个赤色按钮当即抢购

逻辑参阅GitHub大佬给出的思路。

第一步:获取跳转链接

跳转链接是指形如:un.m.jd.com/cgi-bin/app… 的链接,获取该链接,还需求一个前置步骤,即获取token和拼接url。先说获取token,获取token是通过genToken接口获取的,然后将获取到的tokenKey和url拼接起来,得到跳转链接。

第二步:拜访跳转链接

拿到跳转链接后,直接将该跳转链接仍给浏览器即可,浏览器会经过两次302跳转得到sekill.action链接,然后烘托出提交订单页面,此时咱们需求模仿点击“提交订单”按钮,实现抢购。(可以运用Selenium、Pyppeteer或Playwright等类库 来模仿浏览器)

拜访跳转衔接,及提交订单的时分需求供给移动端的APP参数抓包获取。Android抓包较为简单,IOS的也不费事,便是步骤多了一些。

然后提取Hades头的信息组成以下参数

        query_params = {
            "functionId": "genToken",
            "clientVersion": "12.0.8",
            "build": "168782",
            "client": "apple",
            "d_brand": "apple",
            "d_model": "iPhone11,4",
            "osVersion": "16.5",
            "screen": "1284*2778",
            "partner": "apple",
            "aid": self.aid,
            "eid": self.eid,
            "sdkVersion": "29",
            "lang": "zh_CN",
            # 'harmonyOs': '0',
            "uuid": self.uuid,
            "area": "4_51026_58465_0",
            "networkType": "wifi",
            "wifiBssid": self.wifiBssid,
            "uts": self.uts,
            "uemps": "0-0-0",
            "ext": '{"prstate":"0","pvcStu":"1"}',
            # 'ef': '1',
            # 'ep': json.dumps(ep, ensure_ascii=False, separators=(',', ':')),
        }

这种仅仅是前面所需的参数。详细办法仍是需求运用这些参数来获取用户的个人信息拿到跳转衔接

如:

    def get_appjmp(self, token_params):
        headers = {"user-agent": self.ua}
        appjmp_url = token_params["url"]
        params = {
            "to": "https://divide.jd.com/user_routing?skuId=%s" % self.skuId,
            "tokenKey": token_params["tokenKey"],
        }
        response = self.s.get(
            url=appjmp_url,
            params=params,
            allow_redirects=False,
            verify=False,
            headers=headers,
        )
        print("Get Appjmp跳转链接-------------->%s" % response.headers["Location"])
        return response.headers["Location"]

get_appjmp(self, token_params) 函数承受一个名为 token_params 的参数。

然后发送相关恳求后携带参数得到跳转链接。

  • headers 是一个字典,包括了恳求头中的 “User-Agent” 字段,用于模仿浏览器的用户代理。

  • appjmp_url 是一个变量,它存储了 token_params 字典中的 “url” 键所对应的值。

  • params 是一个字典,其中包括两个键值对:

  • “to” 键对应的值是一个字符串,运用了 %s 占位符,用于生成跳转链接中的 skuId 参数。

  • “tokenKey” 键对应的值是一个字符串,运用了 token_params 字典中的 “tokenKey” 键所对应的值。

  • 通过调用 self.s.get() 办法发起一个 GET 恳求,传入以下参数:

  • url 参数是 appjmp_url,表示要拜访的链接地址。

  • params 参数是之前界说的 params 字典,用于增加恳求参数。

  • allow_redirects 参数设置为 False,禁止主动重定向。

  • verify 参数设置为 False,越过 SSL 证书验证。

  • headers 参数是之前界说的 headers 字典,用于设置恳求头。

  • 最后,打印获取到的跳转链接的响应头中的 “Location” 字段值,并将其回来。

抢购回来处理无非便是

{‘errorMessage’: ‘很遗憾没有抢到,再接再厉哦。’, ‘orderId’: 0, ‘resultCode’: 90016, ‘skuId’: 0, ‘success’: False}

{‘errorMessage’: ‘很遗憾没有抢到,再接再厉哦。’, ‘orderId’: 0, ‘resultCode’: 90008, ‘skuId’: 0, ‘success’: False}

【JD京东抢购】茅台抢购逻辑

根据其他作者的推测 推测回来 90008 是京东的风控机制,代表这次恳求直接失败,不参与抢购。
小白信用越低越简单触发京东的风控。

详细代码可参阅GitHub地址

感谢GitHub作者@geeeeeeeek @jd-seckill等