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)
Exemple #4
0
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