def _seckill(self): """ 抢购 """ logger.info('正在等待到达设定时间:{},还有{}秒,检测本地时间与京东服务器时间误差为【{}】毫秒'.format(self.timers.buy_time, (self.timers.buy_time_ms-self.timers.local_time())/1000, self.timers.diff_time)) logger.info('用户:{}'.format(self.get_username())) logger.info('商品名称:{}'.format(self.get_sku_title())) while True: now_status = self.timers.status if now_status == 'start': logger.info('时间到达,开始执行……') try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time() elif now_status == 'waiting': time.sleep(self.timers.sleep_interval) else: # now_status == 'over' logger.info('抢购结束') break
def get_username(self): """获取用户信息""" url = 'https://passport.jd.com/user/petName/getUserInfoForMiniJd.action' payload = { 'callback': 'jQuery'.format(random.randint(1000000, 9999999)), '_': str(int(time.time() * 1000)), } headers = { 'User-Agent': self.user_agent, 'Referer': 'https://order.jd.com/center/list.action', } resp = self.session.get(url=url, params=payload, headers=headers) try_count = 5 while not resp.text.startswith("jQuery"): try_count = try_count - 1 if try_count > 0: resp = self.session.get(url=url, params=payload, headers=headers) else: break wait_some_time() # 响应中包含了许多用户信息,现在在其中返回昵称 # jQuery2381773({"imgUrl":"//storage.360buyimg.com/i.imageUpload/xxx.jpg","lastLoginTime":"","nickName":"xxx","plusStatus":"0","realName":"xxx","userLevel":x,"userScoreVO":{"accountScore":xx,"activityScore":xx,"consumptionScore":xxxxx,"default":false,"financeScore":xxx,"pin":"xxx","riskScore":x,"totalScore":xxxxx}}) return parse_json(resp.text).get('nickName')
def get_seckill_url(self): """获取商品的抢购链接 点击"抢购"按钮后,会有两次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.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("抢购链接获取失败,稍后自动重试") wait_some_time()
def _seckill(self): """ 抢购 """ start = time.time() while True: try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() # 超时自动关闭 end = time.time() if (int(end) - int(start) > self.MAXTIME): return except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time() # 超时自动关闭 end = time.time() if (int(end) - int(start) > self.MAXTIME): return
def get_username(self): """获取用户信息""" url = 'http://my.suning.com/person.do' # payload = { # 'safp': 'jQuery{}'.format(random.randint(1000000, 9999999)), # '_': str(int(time.time() * 1000)), # } # https://my.suning.com/person.do?safp=d488778a.eiem.AVsm.2 headers = { 'User-Agent': self.user_agent, 'Referer': 'http://order.suning.com/order/orderList.do', } resp = self.session.get(url=url, headers=headers) # , params=payload try_count = 5 profile_name = '' while True: try: x_data = etree.HTML(resp.text) profile_eles = x_data.xpath( '//div[@class="profile-info"]//span') if len(profile_eles) > 0: profile_name = profile_eles[0].text.strip() try_count = try_count - 1 if try_count > 0: resp = self.session.get( url=url, headers=headers) # , params=payload else: break wait_some_time() except Exception as e: logger.error("获取用户名异常", e) # 响应中包含了许多用户信息,现在在其中返回昵称 return profile_name
def _reserve(self): """ 预约 """ while True: try: self.make_reserve() except Exception as e: logger.info('预约发生异常!', e) wait_some_time()
def reserve_seckill_until_success(self): """ 在未成功抢购时持续预约和抢购 :return: """ while not self.success: self.reserve() self.seckill_by_proc_pool() logger.info("等待1小时开启下一轮预约和抢购...") wait_some_time(3600)
def _seckill(self): """ 抢购 """ while True: try: pass except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _receive(self): """ 预约 """ while True: try: break_this_loop = self.make_reserve() if break_this_loop: logger.info('退出领取') break except Exception as e: logger.info('领券发生异常!', e) wait_some_time()
def _seckill(self): """ 抢购 """ while True: try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _reserve(self): """ 预约 """ while True: try: break_this_loop = self.make_reserve() if break_this_loop: logger.info('预约成功,已获得抢购资格 / 您已成功预约过了,无需重复预约 --- 退出') break except Exception as e: logger.info('预约发生异常!', e) wait_some_time()
def _seckill(self): """ 抢购 """ while self.timers.kill_not_out_time(): try: self.request_seckill_url() while self.timers.kill_not_out_time(): self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time() logger.info('当前时间为:{},抢购设定时间已经截止,抢购自动退出!'.format( self.timers.time_now()))
def _seckill(self): """ 抢购 """ logger.info('用户:{}'.format(self.get_username())) logger.info('商品名称:{}'.format(self.get_sku_title())) while True: try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _seckill(self): """ 抢购 """ self.seckill_order_data[self.sku_id] = self._get_seckill_order_data() logger.info('订单信息生成......{}'.format( self.seckill_order_data[self.sku_id])) while not self.seckill_url_get: try: self.request_seckill_url() self.request_seckill_checkout_page() while True: self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _seckill(self): """ 抢购 """ while True: # 抢购3分钟后退出 current_time = datetime.now() if (current_time - self.buy_time).total_seconds() > 3 * 60: break try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def get_seckill_url(self): """获取商品的抢购链接 点击"抢购"按钮后,会有两次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.user_agent, 'Host': 'itemko.jd.com', 'Referer': 'https://item.jd.com/{}.html'.format(self.sku_id), } while True: if datetime.now().strftime("%H:%M:%S") >= "10:08:00": logger.info("时间到10:08了,放弃吧") requests.post( "https://sc.ftqq.com/SCU67992Tb6d106e75a7e8fa6f00c53c9bf7f7bb05de8bce100ce2.send", data={ "text": "茅台抢购失败,时间到了", "desp": """茅台抢购失败,时间到了 ![image](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601019829813&di=f40ea308a5fb36b99d793cd74785b24c&imgtype=0&src=http%3A%2F%2Fpic.feizl.com%2Fupload%2Fallimg%2F170704%2F4881tnxkewt5mq.jpg) """ }) break 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("抢购链接获取失败,稍后自动重试") wait_some_time()
def _seckill(self): """ 抢购 """ while self.timers.enabled(): try: self.request_seckill_url() while self.timers.enabled(): self.request_seckill_checkout_page() if self.submit_seckill_order(): self.success = True break except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) if self.success: break else: wait_some_time()
def _seckill(self): """ 抢购 """ logger.info('用户:{}'.format(self.get_username())) logger.info('商品名称:{}'.format(self.get_sku_title())) # 定时 self.timers.start() # 开始抢购时间,秒 start_skill_time = round(time.time()) while (round(time.time()) - start_skill_time) < 60: try: self.request_seckill_url() while True: self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _seckill(self): """ 抢购 """ while True: try: result = self.request_seckill_url() if result == -1: return while True: self.request_seckill_checkout_page() orderresult = self.submit_seckill_order() if orderresult == True: return 1 if self.timers.check() == -1: logger.info("退出循环") return -1 except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time()
def _seckill(self): """ 抢购 """ stop = False while True: try: self.request_seckill_url() while True: self.request_seckill_checkout_page() stop = self.submit_seckill_order() if stop: break # else: # break except Exception as e: logger.info('抢购发生异常,稍后继续执行!', e) wait_some_time() if stop: break
def _seckill(self): """ 抢购 """ while True: if datetime.now().strftime("%H:%M:%S") >= "10:08:00": logger.info("时间超过10点08了,放弃吧") requests.post( "https://sc.ftqq.com/SCU67992Tb6d106e75a7e8fa6f00c53c9bf7f7bb05de8bce100ce2.send", data={ "text": "茅台抢购失败,时间到了", "desp": """茅台抢购失败,时间到了 ![image](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601019829813&di=f40ea308a5fb36b99d793cd74785b24c&imgtype=0&src=http%3A%2F%2Fpic.feizl.com%2Fupload%2Fallimg%2F170704%2F4881tnxkewt5mq.jpg) """ }) break try: self.request_seckill_url() while True: if datetime.now().strftime("%H:%M:%S") >= "10:08:00": logger.info("时间超过10点08了,放弃吧") requests.post( "https://sc.ftqq.com/SCU67992Tb6d106e75a7e8fa6f00c53c9bf7f7bb05de8bce100ce2.send", data={ "text": "茅台抢购失败,时间到了", "desp": """茅台抢购失败,时间到了 ![image](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601019829813&di=f40ea308a5fb36b99d793cd74785b24c&imgtype=0&src=http%3A%2F%2Fpic.feizl.com%2Fupload%2Fallimg%2F170704%2F4881tnxkewt5mq.jpg) """ }) break self.request_seckill_checkout_page() self.submit_seckill_order() except Exception as e: logger.info('抢购发生异常,稍后继续执行!', 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') # 从api设定预约和抢购开始时间 reserve_stime = resp_json.get('yueStime') buy_stime = resp_json.get('qiangStime') self.timers.init_time(reserve_stime) self.timers.start('预约') while self.timers.enabled(): try: res = self.session.get(url='https:' + reserve_url) # 从api设定抢购开始时间 self.timers.init_time(buy_stime) if res.text.find("预约成功,已获得抢购资格") > 0: message = '预约成功,已获得抢购资格' if self.wechat_enable == 'true': send_wechat(message) if self.bark_enable == 'true': send_bark(message, 'detail') else: message = '您已成功预约过了,无需重复预约' logger.info(message) break except Exception as e: logger.error('预约失败正在重试...') wait_some_time()