/// <summary> /// 尝试获取Token过期时间 /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <(bool, int)> GetExpiresIn(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } ResultInfo result; try { string json = await LoginApi.GetInfoAsync(user); if (string.IsNullOrEmpty(json)) { throw new ApiException(new Exception("获取Token过期时间失败,没有返回的数据。")); } result = JsonHelper.DeserializeJsonToObject <ResultInfo>(json); } catch (Exception ex) { throw new ApiException(ex); } if (result.Code == 0 && !string.IsNullOrEmpty(result.Data.Mid)) { return(true, result.Data.ExpiresIn); } else { return(false, 0); } }
private static async Task <bool> LoginWithCaptcha(User user, string key) { string json; JObject result; try { string captcha; captcha = await LoginApi.SolveCaptchaAsync(await LoginApi.GetCaptchaAsync(user)); json = await LoginApi.LoginAsync(user, key, captcha); result = JObject.Parse(json); } catch (Exception ex) { user.LogError("登录失败"); throw new ApiException(ex); } if ((int)result["code"] == 0 && (int)result["data"]["status"] == 0) { // 登录成功,保存数据直接返回 user.LogInfo("登录成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(true); } else { // 其它错误 user.LogError("登录失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }
/// <summary> /// 刷新Token /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <bool> RefreshToken(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } string json; JObject result; try { json = await LoginApi.RefreshTokenAsync(user); result = JObject.Parse(json); } catch (Exception ex) { throw new ApiException(ex); } if ((int)result["code"] == 0 && result["data"]["token_info"]["mid"] != null) { user.LogInfo("Token刷新成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(true); } else { user.LogError("Token刷新失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }
/// <summary> /// 尝试获取Token过期时间 /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <(bool, int)> GetExpiresIn(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } JObject result; try { string json = await LoginApi.GetInfoAsync(user); result = JObject.Parse(json); } catch (Exception ex) { throw new ApiException(ex); } if ((int)result["code"] == 0 && result["data"]["mid"] != null) { return(true, (int)result["data"]["expires_in"]); } else { return(false, 0); } }
/// <summary> /// 刷新Token /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <bool> RefreshToken(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } string json; ResultInfo result; try { json = await LoginApi.RefreshTokenAsync(user); if (string.IsNullOrEmpty(json)) { throw new ApiException(new Exception("登录失败,没有返回的数据。")); } if (json.ToLower().Contains("doctype html")) { throw new ApiException(new Exception("登录失败,刷新Token失败。")); } result = JsonHelper.DeserializeJsonToObject <ResultInfo>(json); } catch (Exception ex) { throw new ApiException(ex); } if (result.Code == 0 && !string.IsNullOrEmpty(result.Data.TokenInfo.Mid)) { user.LogInfo("Token刷新成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(true); } else { user.LogError("Token刷新失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }
private static async Task <bool> LoginWithCaptcha(User user, string key) { string json; ResultInfo result; try { string captcha; captcha = await LoginApi.SolveCaptchaAsync(await LoginApi.GetCaptchaAsync(user)); json = await LoginApi.LoginAsync(user, key, captcha); if (string.IsNullOrEmpty(json)) { throw new ApiException(new Exception("登录失败,没有返回的数据。")); } result = JsonHelper.DeserializeJsonToObject <ResultInfo>(json); } catch (Exception ex) { user.LogError("登录失败"); throw new ApiException(ex); } if (result.Code == 0 && result.Data.Status == 0) { // 登录成功,保存数据直接返回 user.LogInfo("登录成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(true); } else { // 其它错误 user.LogError("登录失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }
/// <summary> /// 登录 /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <bool> Login(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } bool flag; int expiresIn; string key; string json; ResultInfo result; if (false) //目前token刷新存在问题,强制登录 //if (user.HasData) { // 如果以前登录过,判断一下需不需要重新登录 // 这个API每次登录有效时间是720小时(expires_in=2592000) (flag, expiresIn) = await user.GetExpiresIn(); if (flag) { // Token有效 if (expiresIn < 1800) { // Token有效,但是有效时间太短,小于半个小时 user.LogWarning("Token有效时间不足"); return(user.IsLogin = await user.RefreshToken()); } else { // Token有效时间足够 user.LogInfo("使用缓存Token登录成功"); user.LogInfo($"Token有效时间还剩:{Math.Round(expiresIn / 3600d, 1)} 小时"); return(user.IsLogin = true); } } } // 不存在登录数据,这是第一次登录 try { key = await LoginApi.GetKeyAsync(user); json = await LoginApi.LoginAsync(user, key, null); if (string.IsNullOrEmpty(json)) { throw new ApiException(new Exception("登录失败,没有返回的数据。")); } result = JsonHelper.DeserializeJsonToObject <ResultInfo>(json); } catch (Exception ex) { user.LogError("登录失败"); throw new ApiException(ex); } if (result.Code == 0 && result.Data.Status == 0) { // 登录成功,保存数据直接返回 user.LogInfo("登录成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(user.IsLogin = true); } else if (result.Code == -105) { // 需要验证码 return(await LoginWithCaptcha(user, key)); } else { // 其它错误 user.LogError("登录失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }
/// <summary> /// 登录 /// </summary> /// <param name="user">用户</param> /// <returns></returns> public static async Task <bool> Login(this User user) { if (user == null) { throw new ArgumentNullException(nameof(user)); } bool flag; int expiresIn; string key; string json; JObject result; if (user.HasLoginData) { // 如果以前登录过,判断一下需不需要重新登录 // 这个API每次登录有效时间是720小时(expires_in=2592000) (flag, expiresIn) = await user.GetExpiresIn(); if (flag) { // Token有效 if (expiresIn < 1800) { // Token有效,但是有效时间太短,小于半个小时 user.LogWarning("Token有效时间不足"); return(await user.RefreshToken()); } else { // Token有效时间足够 user.LogInfo("使用缓存Token登录成功"); user.LogInfo($"Token有效时间还剩:{Math.Round(expiresIn / 3600d, 1)} 小时"); return(true); } } } // 不存在登录数据,这是第一次登录 try { key = await LoginApi.GetKeyAsync(user); json = await LoginApi.LoginAsync(user, key, null); result = JObject.Parse(json); } catch (Exception ex) { user.LogError("登录失败"); throw new ApiException(ex); } if ((int)result["code"] == 0 && (int)result["data"]["status"] == 0) { // 登录成功,保存数据直接返回 user.LogInfo("登录成功"); UpdateLoginData(user, result); OnLoginDataUpdated(new LoginDataUpdatedEventArgs(user)); return(true); } else if ((int)result["code"] == -105) { // 需要验证码 return(await LoginWithCaptcha(user, key)); } else { // 其它错误 user.LogError("登录失败"); user.LogError($"错误信息:{Utils.FormatJson(json)}"); return(false); } }