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);