完成登录功能

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

@ -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
/// 导航栏用户信息
/// </summary>
/// <returns></returns>
public NavigationInfo? GetNavigationInfo()
public async Task<NavigationInfo?> 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;

@ -5,6 +5,7 @@ using System.Net;
namespace Downkyi.Core.Bili.Web;
[Obsolete("Use LoginHelperV2 instead")]
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")]
public long Id { get; set; }
[Indexed]
[Column("uid")]
public long Uid { get; set; }

@ -9,12 +9,20 @@ public class LoginDatabase
private SQLiteAsyncConnection? _database;
// 私有构造函数防止外部实例化
private LoginDatabase() { }
private LoginDatabase()
{
}
// 单例模式
private static LoginDatabase? _instance;
private static readonly object _lock = new();
public static LoginDatabase Instance()
/// <summary>
/// 获取LoginDatabase唯一实例
/// </summary>
public static LoginDatabase Instance
{
get
{
// 双重检查锁定
if (_instance == null)
@ -24,12 +32,14 @@ public class LoginDatabase
_instance ??= new LoginDatabase();
}
}
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();
}
}

@ -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; }

@ -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
/// 导航到页面时执行
/// </summary>
/// <param name="parameter"></param>
public override async void OnNavigatedTo(Dictionary<string, object>? parameter)
public override void OnNavigatedTo(Dictionary<string, object>? 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,10 +155,8 @@ public partial class IndexViewModel : ViewModelBase
return;
}
await Task.Run(() =>
{
// 获取用户信息
var userInfo = BiliLocator.Login.GetNavigationInfo();
var userInfo = await BiliLocator.Login.GetNavigationInfoAsync();
if (userInfo != null)
{
SettingsManager.Instance.SetUserInfo(new UserInfoSettings
@ -201,7 +199,6 @@ public partial class IndexViewModel : ViewModelBase
Header = defaultHeader;
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 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

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

Loading…
Cancel
Save