def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(self.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.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 request_seckill_url(self): is_request_url_ok = False """访问商品的抢购链接(用于设置cookie等""" logger.info('用户:{}'.format(self.get_username())) logger.info('商品名称:{}'.format(self.get_sku_title())) self.seckill_url[self.sku_id] = self.get_seckill_url() logger.info('访问商品的抢购连接...') headers = { 'User-Agent': self.user_agent, 'Host': 'marathon.jd.com', 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } try: retry_time = 3 while(retry_time > 0): retry_time -= 1 resp = self.session.get( url=self.seckill_url.get( self.sku_id), headers=headers, allow_redirects=False) resp.raise_for_status() is_request_url_ok = True break catch Exception as e: logger.error("访问商品的抢购连接重试....") wait_some_time()
def _get_qrcode_ticket(self): """ 通过 token 获取票据 :return: """ url = 'https://qr.m.jd.com/check' payload = { 'appid': '133', 'callback': 'jQuery{}'.format(random.randint(1000000, 9999999)), 'token': self.session.cookies.get('wlfstk_smdl'), '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.spider_session.get_user_agent(), 'Referer': 'https://passport.jd.com/new/login.aspx', } resp = self.session.get(url=url, headers=headers, params=payload) if not response_status(resp): logger.error('获取二维码扫描结果异常') return False resp_json = parse_json(resp.text) if resp_json['code'] != 200: logger.info('Code: %s, Message: %s', resp_json['code'], resp_json['msg']) return None else: logger.info('已完成手机客户端确认') return resp_json['ticket']
def _seckill(self): """ 抢购 """ ''' STEP 1: 等待开始时间 ''' self.timers.start() ''' STEP 2:获取抢购信息 ''' is_request_url = self.request_seckill_url() if not is_request_url: logger.error("获取抢购信息失败, 抢购失败...") return ''' STEP 3:抢购 ''' retry_time = 3 try: while retry_time > 0: retry_time-=1 self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.error('抢购发生异常,稍后继续执行!', e) wait_some_time()
def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(self.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.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') url = 'https:' + reserve_url logger.info('茅台预约url:{}'.format(url)) # self.timers.start() while True: try: yuyue_resp = self.session.get(url) if "您已成功预约过了,无需重复预约" in yuyue_resp.text: logger.info('用户:{},预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约'.format( self.get_username())) break except Exception as e: logger.error('预约失败正在重试...') wait_some_time()
def _reserve(self): """ 预约 """ try: logger.info('预约结果:' + self.make_reserve()) except Exception as e: logger.error('预约发生异常!', e)
def _validate_cookies(self): """ 验证cookies是否有效(是否登陆) 通过访问用户订单列表页进行判断:若未登录,将会重定向到登陆页面。 :return: cookies是否有效 True/False """ url = 'https://order.jd.com/center/list.action' payload = { 'rid': str(int(time.time() * 1000)), } try: resp = self.session.get(url=url, params=payload, allow_redirects=False) if resp.status_code == requests.codes.OK: return True except Exception as e: logger.error("验证cookies是否有效发生异常", e) return False
def make_reserve(self): """商品预约""" logger.info('商品名称:{}'.format(self.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.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') resp.raise_for_status() self.timers.start() retry_time = 3 is_reserve_ok = false while retry_time > 0: retry_time -= 1 try: resp = self.session.get(url='https:' + reserve_url) if resp.status_code != 200: logger.error("预约请求失败:{}, 重试中....".format( resp.status_code)) continue logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约') is_reserve_ok = True if global_config.getRaw('messenger', 'enable') == 'true': success_message = "预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约" send_wechat(success_message) break except Exception as e: logger.error('预约失败正在重试...') if not is_reserve_ok: logger.error('预约失败...') return is_reserve_ok