完成登录功能

v2.0.x
leiurayer 8 months ago
parent 7f952fe791
commit 0d1c5f4330

@ -1,5 +1,6 @@
using Downkyi.BiliSharp; using Downkyi.BiliSharp;
using Downkyi.BiliSharp.Api.Login; using Downkyi.BiliSharp.Api.Login;
using Downkyi.BiliSharp.Api.Models.Login;
using Downkyi.Core.Bili.Models; using Downkyi.Core.Bili.Models;
using Downkyi.Core.Settings; using Downkyi.Core.Settings;
@ -48,13 +49,18 @@ internal class Login : ILogin
/// 导航栏用户信息 /// 导航栏用户信息
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public NavigationInfo? GetNavigationInfo() public async Task<NavigationInfo?> GetNavigationInfoAsync()
{ {
string userAgent = SettingsManager.Instance.GetUserAgent(); string userAgent = SettingsManager.Instance.GetUserAgent();
BiliManager.Instance().SetUserAgent(userAgent); 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) if (origin == null || origin.Data == null)
{ {
return null; return null;

@ -5,6 +5,7 @@ using System.Net;
namespace Downkyi.Core.Bili.Web; namespace Downkyi.Core.Bili.Web;
[Obsolete("Use LoginHelperV2 instead")]
public static class LoginHelper public static class LoginHelper
{ {
// 本地位置 // 本地位置

@ -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
{
/// <summary>
/// 保存登录的cookies到数据库
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static Task<bool> SaveLoginInfoCookies(string url)
{
CookieContainer cookieContainer = Cookies.ParseCookieByUrl(url);
return SaveLoginInfoCookies(cookieContainer);
}
/// <summary>
/// 保存cookies到数据库
/// </summary>
/// <param name="cookieContainer"></param>
/// <returns></returns>
public static async Task<bool> 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;
}
/// <summary>
/// 从本地获得登录的cookies
/// </summary>
/// <returns></returns>
public static async Task<CookieContainer?> 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;
}
/// <summary>
/// 返回登录信息的cookies的字符串
/// </summary>
/// <returns></returns>
public static async Task<string> GetLoginInfoCookiesString()
{
var cookieContainer = await GetLoginInfoCookies();
if (cookieContainer == null)
{
return "";
}
return Cookies.GetCookiesString(cookieContainer);
}
/// <summary>
/// 注销登录
/// </summary>
/// <returns></returns>
public static async Task<bool> 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;
}
}

@ -9,7 +9,6 @@ public class Cookies
[Column("id")] [Column("id")]
public long Id { get; set; } public long Id { get; set; }
[Indexed]
[Column("uid")] [Column("uid")]
public long Uid { get; set; } public long Uid { get; set; }

@ -9,12 +9,20 @@ public class LoginDatabase
private SQLiteAsyncConnection? _database; private SQLiteAsyncConnection? _database;
// 私有构造函数防止外部实例化 // 私有构造函数防止外部实例化
private LoginDatabase() { } private LoginDatabase()
{
}
// 单例模式 // 单例模式
private static LoginDatabase? _instance; private static LoginDatabase? _instance;
private static readonly object _lock = new(); private static readonly object _lock = new();
public static LoginDatabase Instance()
/// <summary>
/// 获取LoginDatabase唯一实例
/// </summary>
public static LoginDatabase Instance
{
get
{ {
// 双重检查锁定 // 双重检查锁定
if (_instance == null) if (_instance == null)
@ -24,12 +32,14 @@ public class LoginDatabase
_instance ??= new LoginDatabase(); _instance ??= new LoginDatabase();
} }
} }
return _instance; return _instance;
} }
}
private async Task Init() private async Task Init()
{ {
if (_database is not null) if (_database != null)
return; return;
var options = new SQLiteConnectionString(_databasePath, true, key: "Bu1rj3jc"); var options = new SQLiteConnectionString(_databasePath, true, key: "Bu1rj3jc");
@ -87,5 +97,4 @@ public class LoginDatabase
.Where(i => i.Uid == uid) .Where(i => i.Uid == uid)
.ToListAsync(); .ToListAsync();
} }
} }

@ -9,7 +9,7 @@ public class Users
[Column("id")] [Column("id")]
public long Id { get; set; } public long Id { get; set; }
[Indexed, Unique] [Indexed(Unique = true)]
[Column("uid")] [Column("uid")]
public long Uid { get; set; } public long Uid { get; set; }

@ -1,4 +1,5 @@
using CommunityToolkit.Mvvm.ComponentModel; using System.Text.RegularExpressions;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Downkyi.Core.Bili; using Downkyi.Core.Bili;
using Downkyi.Core.Log; using Downkyi.Core.Log;
@ -11,7 +12,6 @@ using Downkyi.UI.ViewModels.Login;
using Downkyi.UI.ViewModels.Settings; using Downkyi.UI.ViewModels.Settings;
using Downkyi.UI.ViewModels.Toolbox; using Downkyi.UI.ViewModels.Toolbox;
using Downkyi.UI.ViewModels.User; using Downkyi.UI.ViewModels.User;
using System.Text.RegularExpressions;
namespace Downkyi.UI.ViewModels; namespace Downkyi.UI.ViewModels;
@ -47,11 +47,11 @@ public partial class IndexViewModel : ViewModelBase
/// 导航到页面时执行 /// 导航到页面时执行
/// </summary> /// </summary>
/// <param name="parameter"></param> /// <param name="parameter"></param>
public override async void OnNavigatedTo(Dictionary<string, object>? parameter) public override void OnNavigatedTo(Dictionary<string, object>? parameter)
{ {
base.OnNavigatedTo(parameter); base.OnNavigatedTo(parameter);
await UpdateUserInfo(); UpdateUserInfo();
} }
#region 命令申明 #region 命令申明
@ -142,7 +142,7 @@ public partial class IndexViewModel : ViewModelBase
InputText = string.Empty; InputText = string.Empty;
} }
private async Task UpdateUserInfo() private async void UpdateUserInfo()
{ {
LoginPanelVisibility = false; LoginPanelVisibility = false;
@ -155,10 +155,8 @@ public partial class IndexViewModel : ViewModelBase
return; return;
} }
await Task.Run(() =>
{
// 获取用户信息 // 获取用户信息
var userInfo = BiliLocator.Login.GetNavigationInfo(); var userInfo = await BiliLocator.Login.GetNavigationInfoAsync();
if (userInfo != null) if (userInfo != null)
{ {
SettingsManager.Instance.SetUserInfo(new UserInfoSettings SettingsManager.Instance.SetUserInfo(new UserInfoSettings
@ -201,7 +199,6 @@ public partial class IndexViewModel : ViewModelBase
Header = defaultHeader; Header = defaultHeader;
UserName = null; UserName = null;
} }
});
} }

@ -1,10 +1,10 @@
using CommunityToolkit.Mvvm.ComponentModel; using System.Collections.ObjectModel;
using System.Net;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Downkyi.Core.Bili.Web; using Downkyi.Core.Bili.Web;
using Downkyi.Core.Log; using Downkyi.Core.Log;
using Downkyi.UI.Mvvm; using Downkyi.UI.Mvvm;
using System.Collections.ObjectModel;
using System.Net;
namespace Downkyi.UI.ViewModels.Login; namespace Downkyi.UI.ViewModels.Login;
@ -63,23 +63,23 @@ public partial class CookiesViewModel : ViewModelBase
} }
[RelayCommand(FlowExceptionsToTaskScheduler = true)] [RelayCommand(FlowExceptionsToTaskScheduler = true)]
private Task SaveCookiesAsync() private async Task SaveCookiesAsync()
{ {
if (_cookieContainer == null) if (_cookieContainer == null)
{ {
return Task.CompletedTask; return;
} }
// 保存登录信息 // 保存登录信息
try try
{ {
bool isSucceed = LoginHelper.SaveLoginInfoCookies(_cookieContainer); bool isSucceed = await LoginHelperV2.SaveLoginInfoCookies(_cookieContainer);
if (!isSucceed) if (!isSucceed)
{ {
Log.Logger.Error($"{Key}: {LoginFailed}"); Log.Logger.Error($"{Key}: {LoginFailed}");
NotificationEvent.Publish(LoginFailed); NotificationEvent.Publish(LoginFailed);
return Task.CompletedTask; return;
} }
} }
catch (Exception e) catch (Exception e)
@ -87,7 +87,7 @@ public partial class CookiesViewModel : ViewModelBase
Log.Logger.Error(e); Log.Logger.Error(e);
NotificationEvent.Publish(LoginFailed); NotificationEvent.Publish(LoginFailed);
return Task.CompletedTask; return;
} }
// 发送通知 // 发送通知
@ -95,7 +95,7 @@ public partial class CookiesViewModel : ViewModelBase
Log.Logger.Info($"{Key}: {LoginSuccessful}"); Log.Logger.Info($"{Key}: {LoginSuccessful}");
BroadcastEvent.Send("cookiesLogin", "loginSuccessful"); BroadcastEvent.Send("cookiesLogin", "loginSuccessful");
return Task.CompletedTask; return;
} }
#endregion #endregion

@ -125,7 +125,7 @@ public partial class QRCodeViewModel : ViewModelBase
// 保存登录信息 // 保存登录信息
try try
{ {
bool isSucceed = LoginHelper.SaveLoginInfoCookies(loginStatus.Url); bool isSucceed = await LoginHelperV2.SaveLoginInfoCookies(loginStatus.Url);
if (!isSucceed) if (!isSucceed)
{ {
NotificationEvent.Publish(LoginFailed); NotificationEvent.Publish(LoginFailed);

Loading…
Cancel
Save