def new_func(self, *args, **kwargs): if not self.qrlogin.is_login: logger.info("{0} 需登陆后调用,开始扫码登陆".format(func.__name__)) self.login_by_qrcode() # if not self.jd_tdufp.is_init: # self.jd_tdufp.init_jd_tdudfp() return func(self, *args, **kwargs)
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 resp.status_code != requests.codes.OK: 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 login_by_qr_code(self): if self.qr_login.is_login: logger.info('登录成功') return self.qr_login.login_by_qrcode() if self.qr_login.is_login: self.nick_name = self.get_username() self.spider_session.save_cookies_to_local(self.nick_name)
def add_bg_for_qr(qr_path): try: from PIL import Image qr = Image.open(qr_path) w = qr.width h = qr.width bg = Image.new("RGBA", (w * 2, h * 2), (255, 255, 255)) result = Image.new(bg.mode, (w * 2, h * 2)) result.paste(bg, box=(0, 0)) result.paste(qr, box=(int(w / 2), int(h / 2))) result.save(qr_path) return os.path.abspath(qr_path) except ImportError: logger.info("加载PIL失败,不对登录二维码进行优化,请查看requirements.txt") return qr_path
def login_by_qrcode(self): self._get_login_page() if not self._get_qrcode(): raise Exception('二维码下载失败') retry_times = 85 for _ in range(retry_times): ticket = self._get_qrcode_ticket() if ticket: break time.sleep(2) else: raise Exception('二维码过期,请重新获取扫描') # validate QR code ticket if not self._validate_qrcode_ticket(ticket): raise Exception('二维码信息校验失败') self.refresh_login_status() logger.info('二维码登录成功')
def _validate_qrcode_ticket(self, ticket): """ 通过已获取的票据进行校验 :param ticket: 已获取的票据 :return: """ url = 'https://passport.jd.com/uc/qrCodeTicketValidation' headers = { 'User-Agent': self.spider_session.get_user_agent(), 'Referer': 'https://passport.jd.com/uc/login?ltype=logout', } resp = self.session.get(url=url, headers=headers, params={'t': ticket}) if resp.status_code != requests.codes.OK: return False resp_json = json.loads(resp.text) if resp_json['returnCode'] == 0: return True else: logger.info(resp_json) return False
def _get_qrcode(self): """ 缓存并展示登录二维码 :return: """ url = 'https://qr.m.jd.com/show' payload = { 'appid': 133, 'size': 300, 't': 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 resp.status_code != requests.codes.OK: logger.info('获取二维码失败') return False save_image(resp, self.qrcode_img_file) logger.info('二维码获取成功,请打开京东APP扫描') open_image(add_bg_for_qr(self.qrcode_img_file)) return True