From 72ebd1067b211f67b2b8fc8e4af63455f4a7fc20 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Fri, 15 Dec 2023 17:33:06 +0800 Subject: [PATCH] attempt to fix code 5001 --- .../Service/User/UserFingerprintService.cs | 14 +++++----- .../View/Page/LoginMihoyoUserPage.xaml.cs | 3 +-- src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs | 4 ++- .../Hoyolab/Takumi/GameRecord/CardClient.cs | 26 ++++++++++++++----- .../Takumi/GameRecord/GameRecordClient.cs | 23 ++++++++-------- .../Verification/HomaGeetestCardVerifier.cs | 4 +-- .../Verification/IGeetestCardVerifier.cs | 2 +- 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserFingerprintService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserFingerprintService.cs index 60bb0701..4833570b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserFingerprintService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserFingerprintService.cs @@ -22,13 +22,13 @@ internal sealed partial class UserFingerprintService : IUserFingerprintService return; } - //if (user.Entity.FingerprintLastUpdateTime >= DateTimeOffset.UtcNow - TimeSpan.FromDays(7)) - //{ - // if (!string.IsNullOrEmpty(user.Fingerprint)) - // { - // return; - // } - //} + if (user.Entity.FingerprintLastUpdateTime >= DateTimeOffset.UtcNow - TimeSpan.FromDays(7)) + { + if (!string.IsNullOrEmpty(user.Fingerprint)) + { + return; + } + } string device = Core.Random.GetUpperAndNumberString(12); string product = Core.Random.GetUpperAndNumberString(6); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LoginMihoyoUserPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/LoginMihoyoUserPage.xaml.cs index 61529721..54206ec1 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LoginMihoyoUserPage.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LoginMihoyoUserPage.xaml.cs @@ -74,10 +74,9 @@ internal sealed partial class LoginMihoyoUserPage : Microsoft.UI.Xaml.Controls.P } Cookie stokenV2 = Cookie.FromLoginResult(loginResultResponse.Data); - webCookie.TryGetDeviceFp(out string? deviceFp); await ISupportLoginByWebView - .PostHandleCurrentCookieAsync(serviceProvider, InputCookie.Create(stokenV2, false, deviceFp)) + .PostHandleCurrentCookieAsync(serviceProvider, InputCookie.Create(stokenV2, false, default)) .ConfigureAwait(false); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs index 2774436b..9e3e72f2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs @@ -120,9 +120,11 @@ internal static class ApiEndpoints /// 游戏记录实时便笺字符串 public static string GameRecordDailyNote(in PlayerUid uid) { - return $"{ApiTakumiRecordApi}/dailyNote?server={uid.Region}&role_id={uid.Value}"; + return $"{GameRecordDailyNotePath}?server={uid.Region}&role_id={uid.Value}"; } + public const string GameRecordDailyNotePath = $"{ApiTakumiRecordApi}/dailyNote"; + /// /// 游戏记录主页 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs index e70b89b7..9ae3ffa8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardClient.cs @@ -25,17 +25,13 @@ internal sealed partial class CardClient private readonly ILogger logger; private readonly HttpClient httpClient; - /// - /// 注册验证码 - /// - /// 用户 - /// 取消令牌 - /// 注册结果 - public async ValueTask> CreateVerificationAsync(User user, CancellationToken token) + public async ValueTask> CreateVerificationAsync(User user, CardVerifiationHeaders headers, CancellationToken token) { HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.CardCreateVerification(true)) .SetUserCookieAndFpHeader(user, CookieType.LToken) + .SetHeader("x-rpc-challenge_game", $"{headers.ChallengeGame}") + .SetHeader("x-rpc-challenge_path", headers.ChallengePath) .Get(); await builder.SignDataAsync(DataSignAlgorithmVersion.Gen2, SaltType.X4, false).ConfigureAwait(false); @@ -110,4 +106,20 @@ internal sealed partial class CardClient [JsonPropertyName("geetest_seccode")] public string GeetestSeccode { get; set; } } +} + +internal sealed class CardVerifiationHeaders +{ + public int ChallengeGame { get; private set; } + + public string ChallengePath { get; private set; } + + public static CardVerifiationHeaders Create(string path) + { + return new() + { + ChallengeGame = 2, + ChallengePath = path, + }; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs index e7b21cac..992ed6ec 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/GameRecordClient.cs @@ -56,7 +56,9 @@ internal sealed partial class GameRecordClient : IGameRecordClient resp.Message = SH.WebDailyNoteVerificationFailed; IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom); - if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, token).ConfigureAwait(false) is { } challenge) + CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath); + + if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge) { HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordDailyNote(userAndUid.Uid)) @@ -88,7 +90,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordIndex(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); @@ -105,12 +106,13 @@ internal sealed partial class GameRecordClient : IGameRecordClient resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed; IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom); - if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, token).ConfigureAwait(false) is { } challenge) + CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath); + + if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge) { HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordIndex(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .Get(); @@ -139,7 +141,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordSpiralAbyss(schedule, userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); @@ -156,12 +157,13 @@ internal sealed partial class GameRecordClient : IGameRecordClient resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed; IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom); - if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, token).ConfigureAwait(false) is { } challenge) + CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath); + + if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge) { HttpRequestMessageBuilder verifiedbuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordSpiralAbyss(schedule, userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .Get(); @@ -189,7 +191,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordRoleBasicInfo(userAndUid.Uid)) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .Get(); @@ -215,7 +216,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordCharacter) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .PostJson(new CharacterData(userAndUid.Uid, playerInfo.Avatars.Select(x => x.Id))); @@ -232,12 +232,13 @@ internal sealed partial class GameRecordClient : IGameRecordClient resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed; IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom); - if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, token).ConfigureAwait(false) is { } challenge) + CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath); + + if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge) { HttpRequestMessageBuilder verifiedBuilder = httpRequestMessageBuilderFactory.Create() .SetRequestUri(ApiEndpoints.GameRecordCharacter) .SetUserCookieAndFpHeader(userAndUid, CookieType.Cookie) - .SetHeader("x-rpc-page", "v4.2.2-ys_#/ys/daily") .SetReferer(ApiEndpoints.WebStaticMihoyoReferer) .SetXrpcChallenge(challenge) .PostJson(new CharacterData(userAndUid.Uid, playerInfo.Avatars.Select(x => x.Id))); diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/HomaGeetestCardVerifier.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/HomaGeetestCardVerifier.cs index 600e74d9..f803edf5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/HomaGeetestCardVerifier.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/HomaGeetestCardVerifier.cs @@ -13,9 +13,9 @@ internal sealed partial class HomaGeetestCardVerifier : IGeetestCardVerifier private readonly CardClient cardClient; private readonly HomaGeetestClient homaGeetestClient; - public async ValueTask TryValidateXrpcChallengeAsync(User user, CancellationToken token) + public async ValueTask TryValidateXrpcChallengeAsync(User user, CardVerifiationHeaders headers, CancellationToken token) { - Response.Response registrationResponse = await cardClient.CreateVerificationAsync(user, token).ConfigureAwait(false); + Response.Response registrationResponse = await cardClient.CreateVerificationAsync(user, headers, token).ConfigureAwait(false); if (registrationResponse.IsOk()) { VerificationRegistration registration = registrationResponse.Data; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/IGeetestCardVerifier.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/IGeetestCardVerifier.cs index 1ffc505f..13126c45 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/IGeetestCardVerifier.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/Verification/IGeetestCardVerifier.cs @@ -7,5 +7,5 @@ namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.Verification; internal interface IGeetestCardVerifier { - ValueTask TryValidateXrpcChallengeAsync(User user, CancellationToken token); + ValueTask TryValidateXrpcChallengeAsync(User user, CardVerifiationHeaders headers, CancellationToken token); } \ No newline at end of file