def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(get_sku_title())) url = 'https://yushou.jd.com/youshouinfo.action?' payload = { 'callback': 'fetchJSON', 'sku': self.sku_id, '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.default_user_agent, 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } resp = self.session.get(url=url, params=payload, headers=headers) resp_json = parse_json(resp.text) reserve_url = resp_json.get('url') self.timers.start() while True: try: self.session.get(url='https:' + reserve_url) logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约') if global_config.getRaw('messenger', 'enable') == 'true': success_message = "预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约" send_wechat(success_message) break except Exception as e: logger.error('预约失败正在重试...')
def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(get_sku_title())) url = 'https://yushou.jd.com/youshouinfo.action?' payload = { 'callback': 'fetchJSON', 'sku': self.sku_id, '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.default_user_agent, 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } print("payload" + json.dumps(payload) + "\n" + "headers" + json.dumps(headers)) resp = self.session.get(url=url, params=payload, headers=headers) print(resp) resp_json = parse_json(resp.text) reserve_url = resp_json.get('url') for flag in range(10): try: self.session.get(url='https:' + reserve_url) logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约') if global_config.getRaw('messenger', 'enable') == 'true': success_message = "预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约" send_wechat(success_message) break except Exception as e: logger.error('预约失败正在重试...' + str(flag) + " " + str(e)) sleep(random.randint(1, 3)) sys.exit(1)
def get_seckill_url(self): self.sku_name = get_sku_title() """获取商品的抢购链接 点击"抢购"按钮后,会有两次302跳转,最后到达订单结算页面 这里返回第一次跳转后的页面url,作为商品的抢购链接 :return: 商品的抢购链接 """ url = 'https://itemko.jd.com/itemShowBtn' payload = { 'callback': 'jQuery{}'.format(random.randint(1000000, 9999999)), 'skuId': self.sku_id, 'from': 'pc', '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.default_user_agent, 'Host': 'itemko.jd.com', 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } while True: resp = self.session.get(url=url, headers=headers, params=payload) resp_json = parse_json(resp.text) if resp_json.get('url'): # https://divide.jd.com/user_routing?skuId=8654289&sn=c3f4ececd8461f0e4d7267e96a91e0e0&from=pc router_url = 'https:' + resp_json.get('url') # https://marathon.jd.com/captcha.html?skuId=8654289&sn=c3f4ececd8461f0e4d7267e96a91e0e0&from=pc seckill_url = router_url.replace('divide', 'marathon').replace( 'user_routing', 'captcha.html') logger.info("抢购链接获取成功: %s", seckill_url) return seckill_url else: logger.info("抢购链接获取失败,%s 不是抢购商品或抢购页面暂未刷新,0.5秒后重试", self.sku_name) time.sleep(0.1)
def request_seckill_url(self): """访问商品的抢购链接(用于设置cookie等""" logger.info('用户:{}'.format(self.get_username())) logger.info('商品名称:{}'.format(get_sku_title())) self.timers.start() self.seckill_url[self.sku_id] = self.get_seckill_url() logger.info('访问商品的抢购连接...') headers = { 'User-Agent': self.default_user_agent, 'Host': 'marathon.jd.com', 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } self.session.get(url=self.seckill_url.get(self.sku_id), headers=headers, allow_redirects=False)
def mobile_submit_order(self): # 手机端提交订单 url = 'https://fo.m.jd.com/m/pay/payWithCheckOut' payload = { 'skuId': self.sku_id, 'skuNum': 1, 'addressId': 1405661826, 'type': 2, 'payType': 1, } # sec_kill_order_data = self._get_seckill_order_data( # ) # logger.info('提交抢购订单...') headers = { 'User-Agent': self.default_user_agent, # 'Host': 'trade.jd.com', 'Referer': 'https://fo.m.jd.com/m/settlement/payMiddle?skuId=' + self.sku_id + 'subPrice=0¬iPrice=0&expectingPrice=0&expireDate=undefined&type=2', 'authority': 'fo.m.jd.com', 'scheme': 'https', 'method': 'POST', 'path': '/m/pay/payWithCheckOut', # 'sec-fetch-dest:': 'empty', # 'sec-fetch-mode:': 'cors', # 'sec-fetch-site:': 'same-origin', } # self.session.mount('https://trade.jd.com/', HTTP20Adapter()) # resp = requests.post(url, cookies=self.session.cookies, headers=headers, params=payload, data=.seckill_order_data.get( # self.sku_id)) logger.info('用户:{}'.format(self.get_username())) logger.info('sku_id:{}'.format(self.sku_id)) logger.info('商品名称:{}'.format(get_sku_title())) self.timers.start() resp = self.session.post( url=url, params=payload, # data=sec_kill_order_data, headers=headers) logger.info(resp.text) resp_json = parse_json(resp.text) # 返回信息 # 抢购失败: # {'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 60074, 'skuId': 0, 'success': False} # {'errorMessage': '抱歉,您提交过快,请稍后再提交订单!', 'orderId': 0, 'resultCode': 60017, 'skuId': 0, 'success': False} # {'errorMessage': '系统正在开小差,请重试~~', 'orderId': 0, 'resultCode': 90013, 'skuId': 0, 'success': False} # 抢购成功: # {"appUrl":"xxxxx","orderId":820227xxxxx,"pcUrl":"xxxxx","resultCode":0,"skuId":0,"success":true,"totalMoney":"xxxxx"} if resp_json.get('success'): order_id = resp_json.get('orderId') # total_money = resp_json.get('totalMoney') # pay_url = 'https:' + resp_json.get('pcUrl') logger.info('抢购成功,需要手动支付,订单号:{}'.format(order_id)) if global_config.getRaw('messenger', 'enable') == 'true': success_message = "抢购成功,需要手动支付,订单号:{}, 商品:{}".format( order_id, get_sku_title()) send_wechat(success_message) return True else: logger.info('抢购失败,返回信息:{}'.format(resp_json)) if global_config.getRaw('messenger', 'enable') == 'true': error_message = '抢购失败,返回信息:{}'.format(resp_json) send_wechat(error_message) return False
def submit_seckill_order(self): """提交抢购(秒杀)订单 :return: 抢购结果 True/False """ # url = 'https://marathon.jd.com/seckillnew/orderService/pc/submitOrder.action' url = 'https://trade.jd.com/shopping/order/submitOrder.action' payload = { 'skuId': self.sku_id, 'submitOrderParam.payPassword': '******', 'vendorRemarks': '[{"venderId":"715322","remark":""}]', 'submitOrderParam.sopNotPutInvoice': 'true', 'submitOrderParam.trackID': 'TestTrackId', 'submitOrderParam.ignorePriceChange': '0', 'submitOrderParam.btSupport': '0', 'submitOrderParam.eid': 'IFFL6KCM7GNWKEF7QYJWY7GV6N5TDO3XY32JXHQYGXVRSU37R7XXMVOGMB55UONBL657M5JEAKFPNLWJVO7MP6RQCI', 'submitOrderParam.fp': 'f8796ac2de74f27aa2279ebd189d5121', 'submitOrderParam.jxj': '1', } sec_kill_order_data = self._get_seckill_order_data() # logger.info('提交抢购订单...') headers = { 'User-Agent': self.default_user_agent, 'Host': 'trade.jd.com', 'Referer': 'https://trade.jd.com/shopping/order/getOrderInfo.action', 'authority': 'trade.jd.com', 'scheme': 'https', 'method': 'POST', 'path': '/shopping/order/submitOrder.action?', # 'sec-fetch-dest:': 'empty', # 'sec-fetch-mode:': 'cors', # 'sec-fetch-site:': 'same-origin', } # self.session.mount('https://trade.jd.com/', HTTP20Adapter()) # resp = requests.post(url, cookies=self.session.cookies, headers=headers, params=payload, data=.seckill_order_data.get( # self.sku_id)) resp = self.session.post(url=url, params=payload, data=sec_kill_order_data, headers=headers) resp_json = parse_json(resp.text) # 返回信息 # 抢购失败: # {'errorMessage': '很遗憾没有抢到,再接再厉哦。', 'orderId': 0, 'resultCode': 60074, 'skuId': 0, 'success': False} # {'errorMessage': '抱歉,您提交过快,请稍后再提交订单!', 'orderId': 0, 'resultCode': 60017, 'skuId': 0, 'success': False} # {'errorMessage': '系统正在开小差,请重试~~', 'orderId': 0, 'resultCode': 90013, 'skuId': 0, 'success': False} # 抢购成功: # {"appUrl":"xxxxx","orderId":820227xxxxx,"pcUrl":"xxxxx","resultCode":0,"skuId":0,"success":true,"totalMoney":"xxxxx"} if resp_json.get('success'): order_id = resp_json.get('orderId') # total_money = resp_json.get('totalMoney') # pay_url = 'https:' + resp_json.get('pcUrl') logger.info('抢购成功,需要手动支付,订单号:{}'.format(order_id)) if global_config.getRaw('messenger', 'enable') == 'true': success_message = "抢购成功,需要手动支付,订单号:{}, 商品:{}".format( order_id, get_sku_title()) send_wechat(success_message) return True else: logger.info('抢购失败,返回信息:{}'.format(resp_json)) if global_config.getRaw('messenger', 'enable') == 'true': error_message = '抢购失败,返回信息:{}'.format(resp_json) send_wechat(error_message) return False