/// <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()); }