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