def login(self, verify_code=''):
        """
        登录微信公众平台
        注意在实例化 ``WechatExt`` 的时候，如果没有传入 ``token`` 及 ``cookies`` ，将会自动调用该方法，无需手动调用
        当且仅当捕获到 ``NeedLoginError`` 异常时才需要调用此方法进行登录重试
        :param verify_code: 验证码, 不传入则为无验证码
        :raises LoginVerifyCodeError: 需要验证码或验证码出错，该异常为 ``LoginError`` 的子类
        :raises LoginError: 登录出错异常，异常内容为微信服务器响应的内容，可作为日志记录下来
        """
        url = 'https://mp.weixin.qq.com/cgi-bin/login'
        payload = {
            'username': self.__username,
            'pwd': self.__password,
            'imgcode': verify_code,
            'f': 'json',
        }
        headers = {
            'x-requested-with': 'XMLHttpRequest',
            'referer': 'https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN',
            'Cookie': self.__cookies,
        }
        r = requests.post(url, data=payload, headers=headers)

        s = re.search(r'token=(\d+)', r.text)
        if not s:
            try:
                error_code = json.loads(r.text)['base_resp']['ret']
            except (KeyError, ValueError):
                raise LoginError(r.text)

            if error_code in [-8, -27]:
                raise LoginVerifyCodeError(r.text)
            elif re.search(r'readtemplate', r.text):
                raise LoginError('You need to turn off the safety protection of wechat.')
            else:
                raise LoginError(r.text)
        self.__token = int(s.group(1))

        self.__cookies = ''
        for cookie in r.cookies:
            self.__cookies += cookie.name + '=' + cookie.value + ';'
登录微信公众平台
        注意在实例化 ``WechatExt`` 的时候，如果没有传入 ``token`` 及 ``cookies`` ，将会自动调用该方法，无需手动调用
        当且仅当捕获到 ``NeedLoginError`` 异常时才需要调用此方法进行登录重试
        :param verify_code: 验证码, 不传入则为无验证码
        :raises LoginVerifyCodeError: 需要验证码或验证码出错，该异常为 ``LoginError`` 的子类
        :raises LoginError: 登录出错异常，异常内容为微信服务器响应的内容，可作为日志记录下来