/// <summary>
        /// 获取学校的详细信息(用于登录或其他)
        /// </summary>
        /// <param name="schoolId">学校ID</param>
        /// <param name="chk">通过GetSecretKeyAsync()获取到的Chk密钥</param>
        /// <returns>SchoolDetails</returns>
        public async Task <SchoolDetails> GetSchoolDetailsAsync(string schoolId, string chk)
        {
            var        encryptedId = CpdailyCrypto.DESEncrypt(schoolId, CpdailyCrypto.GetDESKey(chk), CpdailyCrypto.IV);
            string     url         = $"https://mobile.campushoy.com/v6/config/guest/tenant/info/v-8213";
            RestClient client      = new RestClient(url)
            {
                CookieContainer = CookieContainer
            };
            var request = new RestRequest(Method.GET);

            request.AddHeader("sessionTokenKey", "szFn6zAbjjU=");
            request.AddHeader("SessionToken", "szFn6zAbjjU=");
            request.AddHeader("CpdailyClientType", "CPDAILY");
            request.AddHeader("CpdailyStandAlone", "0");
            request.AddHeader("CpdailyInfo", DeviceInfo.EncryptCache);
            request.AddHeader("User-Agent", ApiUserAgent);
            request.AddParameter("a", encryptedId);
            request.AddParameter("b", "firstv");
            request.AddParameter("oick", CpdailyCrypto.GetOick());
            var response = await client.ExecuteGetAsync(request);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception("非200状态响应");
            }
            var apiResponse = JsonConvert.DeserializeObject <ApiResponse>(response.Content);

            if (apiResponse.ErrorCode != 0)
            {
                throw new Exception($"出现错误: {apiResponse.ErrorMessage}, 错误代码: {apiResponse.ErrorCode}。");
            }
            string decretedData = CpdailyCrypto.DESDecrypt(apiResponse.Data, CpdailyCrypto.GetDESKey(chk), CpdailyCrypto.IV);

            return(JArray.Parse(decretedData)[0].ToObject <SchoolDetails>());
        }
        /// <summary>
        /// 获取用于访问校内应用的 Cookie
        /// </summary>
        /// <param name="loginResult">LoginResult Object</param>
        /// <returns>Cookie string</returns>
        public async Task <string> UserStoreAppListAsync(LoginResult loginResult)
        {
            string sessionToken = CpdailyCrypto.DESEncrypt(
                loginResult.SessionToken,
                "XCE927==",
                CpdailyCrypto.IV);
            string tgc = CpdailyCrypto.DESEncrypt(
                loginResult.Tgc,
                "XCE927==",
                CpdailyCrypto.IV);

            var amp = new
            {
                AMP1 = new[]
                {
                    new { name = "sessionToken", value = loginResult.SessionToken },
                    new { name = "sessionToken", value = loginResult.SessionToken }
                },
                AMP2 = new[]
                {
                    new { name = "CASTGC", value = loginResult.Tgc },
                    new { name = "AUTHTGC", value = loginResult.Tgc },
                    new { name = "sessionToken", value = loginResult.SessionToken },
                    new { name = "sessionToken", value = loginResult.SessionToken }
                }
            };

            string ampCookies = CpdailyCrypto.DESEncrypt(
                JsonConvert.SerializeObject(amp),
                "XCE927==",
                CpdailyCrypto.IV);

            string        url             = $"https://cqjtu.campusphere.net/wec-portal-mobile/client/userStoreAppList?oick={CpdailyCrypto.GetOick(loginResult.UserId)}";
            IRestResponse response        = null;
            var           cookieContainer = new CookieContainer();

            cookieContainer.Add(new Uri("http://ids.cqjtu.edu.cn/"), new Cookie("CASTGC", loginResult.Tgc));
            cookieContainer.Add(new Uri("http://ids.cqjtu.edu.cn/"), new Cookie("AUTHTGC", loginResult.Tgc));
            // RestSharp 不会处理复杂的跳转,因此自行循环处理
            do
            {
                RestClient client = new RestClient(url)
                {
                    CookieContainer = cookieContainer,
                    FollowRedirects = false
                };
                var request = new RestRequest(Method.GET);
                request.AddHeader("sessionTokenKey", sessionToken);
                request.AddHeader("SessionToken", sessionToken);
                request.AddHeader("clientType", "cpdaily_student");
                request.AddHeader("deviceType", "1");
                request.AddHeader("CpdailyClientType", "CPDAILY");
                request.AddHeader("CpdailyStandAlone", "0");
                request.AddHeader("CpdailyInfo", DeviceInfo.EncryptCache);
                request.AddHeader("User-Agent", ApiUserAgent);
                request.AddHeader("tenantId", "cqjtu");// TODO:
                request.AddHeader("TGC", tgc);
                request.AddHeader("AmpCookies", ampCookies);
                response = await client.ExecuteGetAsync(request);

                url = response.Headers.Where(x => x.Name == "Location").Select(x => x.Value.ToString()).FirstOrDefault();
            } while (!string.IsNullOrEmpty(url));
            StringBuilder sb = new StringBuilder();

            foreach (var cookie in response.Cookies)
            {
                sb.Append($"{cookie.Name}={cookie.Value}; ");
            }
            return(sb.ToString());
        }
        /// <summary>
        /// 获取所有入驻的学校
        /// </summary>
        /// <returns>School[]</returns>
        public async Task <School[]> GetSchoolsAsync()
        {
            string     url    = $"https://static.campushoy.com/apicache/tenantListSort?v={DateTimeOffset.Now.ToUnixTimeMilliseconds()}&oick={CpdailyCrypto.GetOick()}";
            RestClient client = new RestClient(url)
            {
                CookieContainer = CookieContainer
            };
            var request = new RestRequest(Method.GET);

            request.AddHeader("sessionTokenKey", "szFn6zAbjjU=");
            request.AddHeader("SessionToken", "szFn6zAbjjU=");
            request.AddHeader("CpdailyClientType", "CPDAILY");
            request.AddHeader("CpdailyStandAlone", "0");
            request.AddHeader("CpdailyInfo", DeviceInfo.EncryptCache);
            request.AddHeader("User-Agent", ApiUserAgent);
            var response = await client.ExecuteGetAsync(request);

            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception("非200状态响应");
            }
            var json = JObject.Parse(response.Content);

            if (json["errCode"].Value <int>() != 0)
            {
                throw new Exception($"出现错误: {json["errMsg"].Value<string>()}, 错误代码: {json["errCode"].Value<int>()}。");
            }
            List <School> schools = new List <School>();
            var           lists   = JArray.FromObject(json["data"]);

            foreach (JObject t in lists)
            {
                var list = JArray.FromObject(t["datas"]);
                schools.AddRange(list.ToObject <List <School> >());
            }
            return(schools.ToArray());
        }