From 0d1c5f4330a3cd82cc6c40548c65d3bb61c34e1e Mon Sep 17 00:00:00 2001 From: leiurayer <1432593898@qq.com> Date: Wed, 5 Feb 2025 22:57:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=99=BB=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Downkyi.Core/Bili/Web/Login.cs | 12 +- src/Downkyi.Core/Bili/Web/LoginHelper.cs | 1 + src/Downkyi.Core/Bili/Web/LoginHelperV2.cs | 128 ++++++++++++++++++ src/Downkyi.Core/Database/Login/Cookies.cs | 1 - .../Database/Login/LoginDatabase.cs | 27 ++-- src/Downkyi.Core/Database/Login/Users.cs | 2 +- src/Downkyi.UI/ViewModels/IndexViewModel.cs | 79 ++++++----- .../ViewModels/Login/CookiesViewModel.cs | 18 +-- .../ViewModels/Login/QRCodeViewModel.cs | 2 +- 9 files changed, 205 insertions(+), 65 deletions(-) create mode 100644 src/Downkyi.Core/Bili/Web/LoginHelperV2.cs diff --git a/src/Downkyi.Core/Bili/Web/Login.cs b/src/Downkyi.Core/Bili/Web/Login.cs index 360cbaf..f732289 100644 --- a/src/Downkyi.Core/Bili/Web/Login.cs +++ b/src/Downkyi.Core/Bili/Web/Login.cs @@ -1,5 +1,6 @@ using Downkyi.BiliSharp; using Downkyi.BiliSharp.Api.Login; +using Downkyi.BiliSharp.Api.Models.Login; using Downkyi.Core.Bili.Models; using Downkyi.Core.Settings; @@ -48,13 +49,18 @@ internal class Login : ILogin /// 导航栏用户信息 /// /// - public NavigationInfo? GetNavigationInfo() + public async Task GetNavigationInfoAsync() { string userAgent = SettingsManager.Instance.GetUserAgent(); BiliManager.Instance().SetUserAgent(userAgent); - BiliManager.Instance().SetCookies(LoginHelper.GetLoginInfoCookies()); + var cookies = await LoginHelperV2.GetLoginInfoCookies(); + BiliManager.Instance().SetCookies(cookies); - var origin = LoginInfo.GetNavigationInfo(); + NavigationLoginInfo? origin = null; + await Task.Run(() => + { + origin = LoginInfo.GetNavigationInfo(); + }); if (origin == null || origin.Data == null) { return null; diff --git a/src/Downkyi.Core/Bili/Web/LoginHelper.cs b/src/Downkyi.Core/Bili/Web/LoginHelper.cs index 8d66208..049d631 100644 --- a/src/Downkyi.Core/Bili/Web/LoginHelper.cs +++ b/src/Downkyi.Core/Bili/Web/LoginHelper.cs @@ -5,6 +5,7 @@ using System.Net; namespace Downkyi.Core.Bili.Web; +[Obsolete("Use LoginHelperV2 instead")] public static class LoginHelper { // 本地位置 diff --git a/src/Downkyi.Core/Bili/Web/LoginHelperV2.cs b/src/Downkyi.Core/Bili/Web/LoginHelperV2.cs new file mode 100644 index 0000000..2af9a91 --- /dev/null +++ b/src/Downkyi.Core/Bili/Web/LoginHelperV2.cs @@ -0,0 +1,128 @@ +using System.Net; +using Downkyi.BiliSharp; +using Downkyi.BiliSharp.Api.Login; +using Downkyi.Core.Database.Login; +using Downkyi.Core.Settings; +using Downkyi.Core.Settings.Models; + +namespace Downkyi.Core.Bili.Web; + +public static class LoginHelperV2 +{ + /// + /// 保存登录的cookies到数据库 + /// + /// + /// + public static Task SaveLoginInfoCookies(string url) + { + CookieContainer cookieContainer = Cookies.ParseCookieByUrl(url); + + return SaveLoginInfoCookies(cookieContainer); + } + + /// + /// 保存cookies到数据库 + /// + /// + /// + public static async Task SaveLoginInfoCookies(CookieContainer cookieContainer) + { + string userAgent = SettingsManager.Instance.GetUserAgent(); + BiliManager.Instance().SetUserAgent(userAgent); + BiliManager.Instance().SetCookies(cookieContainer); + await Task.Run(() => + { + var origin = LoginInfo.GetNavigationInfo(); + if (origin == null || origin.Data == null) + { + return; + } + + SettingsManager.Instance.SetUserInfo(new UserInfoSettings + { + Mid = origin.Data.Mid, + Name = origin.Data.Uname, + IsLogin = origin.Data.Islogin, + IsVip = origin.Data.Vipstatus == 1 + }); + }); + + var userInfo = SettingsManager.Instance.GetUserInfo(); + foreach (Cookie cookie in cookieContainer.GetAllCookies()) + { + await LoginDatabase.Instance.AddCookiesAsync(new Database.Login.Cookies + { + Uid = userInfo.Mid, + Key = cookie.Name, + Value = cookie.Value + }); + } + + return true; + } + + /// + /// 从本地获得登录的cookies + /// + /// + public static async Task GetLoginInfoCookies() + { + var userInfo = SettingsManager.Instance.GetUserInfo(); + + var cookies = await LoginDatabase.Instance.GetCookiesAsync(userInfo.Mid); + if (cookies.Count == 0) { return null; } + + var cookieContainer = new CookieContainer(); + foreach (var cookie in cookies) + { + DateTime dateTime = DateTime.Now; + dateTime = dateTime.AddMonths(12); + + // 添加cookie + cookieContainer.Add(new Cookie(cookie.Key, cookie.Value, "/", ".bilibili.com") { Expires = dateTime }); + } + return cookieContainer; + } + + /// + /// 返回登录信息的cookies的字符串 + /// + /// + public static async Task GetLoginInfoCookiesString() + { + var cookieContainer = await GetLoginInfoCookies(); + if (cookieContainer == null) + { + return ""; + } + + return Cookies.GetCookiesString(cookieContainer); + } + + /// + /// 注销登录 + /// + /// + public static async Task Logout() + { + var userInfo = SettingsManager.Instance.GetUserInfo(); + var result = await LoginDatabase.Instance.DeleteCookiesByUidAsync(userInfo.Mid); + if (result == 0) + { + Log.Log.Logger.Error("LoginDatabase删除失败!(DeleteCookiesByUidAsync)"); + return false; + } + + SettingsManager.Instance.SetUserInfo(new UserInfoSettings + { + Mid = -1, + Name = "", + IsLogin = false, + IsVip = false + }); + + return true; + } + +} \ No newline at end of file diff --git a/src/Downkyi.Core/Database/Login/Cookies.cs b/src/Downkyi.Core/Database/Login/Cookies.cs index ab96485..9b428b2 100644 --- a/src/Downkyi.Core/Database/Login/Cookies.cs +++ b/src/Downkyi.Core/Database/Login/Cookies.cs @@ -9,7 +9,6 @@ public class Cookies [Column("id")] public long Id { get; set; } - [Indexed] [Column("uid")] public long Uid { get; set; } diff --git a/src/Downkyi.Core/Database/Login/LoginDatabase.cs b/src/Downkyi.Core/Database/Login/LoginDatabase.cs index e180869..9af07b7 100644 --- a/src/Downkyi.Core/Database/Login/LoginDatabase.cs +++ b/src/Downkyi.Core/Database/Login/LoginDatabase.cs @@ -9,27 +9,37 @@ public class LoginDatabase private SQLiteAsyncConnection? _database; // 私有构造函数防止外部实例化 - private LoginDatabase() { } + private LoginDatabase() + { + } // 单例模式 private static LoginDatabase? _instance; private static readonly object _lock = new(); - public static LoginDatabase Instance() + + /// + /// 获取LoginDatabase唯一实例 + /// + public static LoginDatabase Instance { - // 双重检查锁定 - if (_instance == null) + get { - lock (_lock) + // 双重检查锁定 + if (_instance == null) { - _instance ??= new LoginDatabase(); + lock (_lock) + { + _instance ??= new LoginDatabase(); + } } + + return _instance; } - return _instance; } private async Task Init() { - if (_database is not null) + if (_database != null) return; var options = new SQLiteConnectionString(_databasePath, true, key: "Bu1rj3jc"); @@ -87,5 +97,4 @@ public class LoginDatabase .Where(i => i.Uid == uid) .ToListAsync(); } - } \ No newline at end of file diff --git a/src/Downkyi.Core/Database/Login/Users.cs b/src/Downkyi.Core/Database/Login/Users.cs index e6ac26d..99cf4ef 100644 --- a/src/Downkyi.Core/Database/Login/Users.cs +++ b/src/Downkyi.Core/Database/Login/Users.cs @@ -9,7 +9,7 @@ public class Users [Column("id")] public long Id { get; set; } - [Indexed, Unique] + [Indexed(Unique = true)] [Column("uid")] public long Uid { get; set; } diff --git a/src/Downkyi.UI/ViewModels/IndexViewModel.cs b/src/Downkyi.UI/ViewModels/IndexViewModel.cs index 6002379..85b3321 100644 --- a/src/Downkyi.UI/ViewModels/IndexViewModel.cs +++ b/src/Downkyi.UI/ViewModels/IndexViewModel.cs @@ -1,4 +1,5 @@ -using CommunityToolkit.Mvvm.ComponentModel; +using System.Text.RegularExpressions; +using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Downkyi.Core.Bili; using Downkyi.Core.Log; @@ -11,7 +12,6 @@ using Downkyi.UI.ViewModels.Login; using Downkyi.UI.ViewModels.Settings; using Downkyi.UI.ViewModels.Toolbox; using Downkyi.UI.ViewModels.User; -using System.Text.RegularExpressions; namespace Downkyi.UI.ViewModels; @@ -47,11 +47,11 @@ public partial class IndexViewModel : ViewModelBase /// 导航到页面时执行 /// /// - public override async void OnNavigatedTo(Dictionary? parameter) + public override void OnNavigatedTo(Dictionary? parameter) { base.OnNavigatedTo(parameter); - await UpdateUserInfo(); + UpdateUserInfo(); } #region 命令申明 @@ -142,7 +142,7 @@ public partial class IndexViewModel : ViewModelBase InputText = string.Empty; } - private async Task UpdateUserInfo() + private async void UpdateUserInfo() { LoginPanelVisibility = false; @@ -155,53 +155,50 @@ public partial class IndexViewModel : ViewModelBase return; } - await Task.Run(() => + // 获取用户信息 + var userInfo = await BiliLocator.Login.GetNavigationInfoAsync(); + if (userInfo != null) { - // 获取用户信息 - var userInfo = BiliLocator.Login.GetNavigationInfo(); - if (userInfo != null) + SettingsManager.Instance.SetUserInfo(new UserInfoSettings { - SettingsManager.Instance.SetUserInfo(new UserInfoSettings - { - Mid = userInfo.Mid, - Name = userInfo.Name, - IsLogin = userInfo.IsLogin, - IsVip = userInfo.VipStatus == 1 - }); - } - else + Mid = userInfo.Mid, + Name = userInfo.Name, + IsLogin = userInfo.IsLogin, + IsVip = userInfo.VipStatus == 1 + }); + } + else + { + SettingsManager.Instance.SetUserInfo(new UserInfoSettings { - SettingsManager.Instance.SetUserInfo(new UserInfoSettings - { - Mid = -1, - Name = "", - IsLogin = false, - IsVip = false - }); - } + Mid = -1, + Name = "", + IsLogin = false, + IsVip = false + }); + } - // - LoginPanelVisibility = true; + // + LoginPanelVisibility = true; - // 设置头像和用户名 - if (userInfo != null) + // 设置头像和用户名 + if (userInfo != null) + { + if (userInfo.Header != null) { - if (userInfo.Header != null) - { - Header = userInfo.Header; - } - else - { - Header = defaultHeader; - } - UserName = userInfo.Name; + Header = userInfo.Header; } else { Header = defaultHeader; - UserName = null; } - }); + UserName = userInfo.Name; + } + else + { + Header = defaultHeader; + UserName = null; + } } diff --git a/src/Downkyi.UI/ViewModels/Login/CookiesViewModel.cs b/src/Downkyi.UI/ViewModels/Login/CookiesViewModel.cs index a295959..2731ff7 100644 --- a/src/Downkyi.UI/ViewModels/Login/CookiesViewModel.cs +++ b/src/Downkyi.UI/ViewModels/Login/CookiesViewModel.cs @@ -1,10 +1,10 @@ -using CommunityToolkit.Mvvm.ComponentModel; +using System.Collections.ObjectModel; +using System.Net; +using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Downkyi.Core.Bili.Web; using Downkyi.Core.Log; using Downkyi.UI.Mvvm; -using System.Collections.ObjectModel; -using System.Net; namespace Downkyi.UI.ViewModels.Login; @@ -63,23 +63,23 @@ public partial class CookiesViewModel : ViewModelBase } [RelayCommand(FlowExceptionsToTaskScheduler = true)] - private Task SaveCookiesAsync() + private async Task SaveCookiesAsync() { if (_cookieContainer == null) { - return Task.CompletedTask; + return; } // 保存登录信息 try { - bool isSucceed = LoginHelper.SaveLoginInfoCookies(_cookieContainer); + bool isSucceed = await LoginHelperV2.SaveLoginInfoCookies(_cookieContainer); if (!isSucceed) { Log.Logger.Error($"{Key}: {LoginFailed}"); NotificationEvent.Publish(LoginFailed); - return Task.CompletedTask; + return; } } catch (Exception e) @@ -87,7 +87,7 @@ public partial class CookiesViewModel : ViewModelBase Log.Logger.Error(e); NotificationEvent.Publish(LoginFailed); - return Task.CompletedTask; + return; } // 发送通知 @@ -95,7 +95,7 @@ public partial class CookiesViewModel : ViewModelBase Log.Logger.Info($"{Key}: {LoginSuccessful}"); BroadcastEvent.Send("cookiesLogin", "loginSuccessful"); - return Task.CompletedTask; + return; } #endregion diff --git a/src/Downkyi.UI/ViewModels/Login/QRCodeViewModel.cs b/src/Downkyi.UI/ViewModels/Login/QRCodeViewModel.cs index 30fbe48..59254e2 100644 --- a/src/Downkyi.UI/ViewModels/Login/QRCodeViewModel.cs +++ b/src/Downkyi.UI/ViewModels/Login/QRCodeViewModel.cs @@ -125,7 +125,7 @@ public partial class QRCodeViewModel : ViewModelBase // 保存登录信息 try { - bool isSucceed = LoginHelper.SaveLoginInfoCookies(loginStatus.Url); + bool isSucceed = await LoginHelperV2.SaveLoginInfoCookies(loginStatus.Url); if (!isSucceed) { NotificationEvent.Publish(LoginFailed);