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