From 0310afd77d61fc9151eba96475c3b7b9f2ff6be4 Mon Sep 17 00:00:00 2001
From: DismissedLight <1686188646@qq.com>
Date: Fri, 15 Dec 2023 21:34:04 +0800
Subject: [PATCH] correct game record requests
---
src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs | 8 +++-
.../Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs | 2 +
.../Hoyolab/Takumi/GameRecord/CardClient.cs | 16 -------
.../GameRecord/CardVerifiationHeaders.cs | 44 +++++++++++++++++++
.../Takumi/GameRecord/GameRecordClient.cs | 28 ++++--------
5 files changed, 60 insertions(+), 38 deletions(-)
create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardVerifiationHeaders.cs
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
index 9e3e72f2..881b3c55 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiEndpoints.cs
@@ -132,9 +132,11 @@ internal static class ApiEndpoints
/// 游戏记录主页字符串
public static string GameRecordIndex(in PlayerUid uid)
{
- return $"{ApiTakumiRecordApi}/index?server={uid.Region}&role_id={uid.Value}";
+ return $"{GameRecordIndexPath}?server={uid.Region}&role_id={uid.Value}";
}
+ public const string GameRecordIndexPath = $"{ApiTakumiRecordApi}/index";
+
///
/// 深渊信息
///
@@ -143,8 +145,10 @@ internal static class ApiEndpoints
/// 深渊信息字符串
public static string GameRecordSpiralAbyss(Hoyolab.Takumi.GameRecord.SpiralAbyssSchedule scheduleType, in PlayerUid uid)
{
- return $"{ApiTakumiRecordApi}/spiralAbyss?schedule_type={(int)scheduleType}&role_id={uid.Value}&server={uid.Region}";
+ return $"{GameRecordSpiralAbyssPath}?schedule_type={(int)scheduleType}&role_id={uid.Value}&server={uid.Region}";
}
+
+ public const string GameRecordSpiralAbyssPath = $"{ApiTakumiRecordApi}/spiralAbyss";
#endregion
#region ApiTakumiEventCalculate
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs
index ad3dff78..ed0b1d08 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs
@@ -32,6 +32,8 @@ internal static class HoyolabOptions
///
public const string MobileUserAgentOversea = $"Mozilla/5.0 (Linux; Android 12) Mobile miHoYoBBSOversea/{SaltConstants.OSVersion}";
+ public const string ToolVersion = "v4.2.2-ys";
+
///
/// 米游社设备Id
///
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 bee74d16..41e9e4b2 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
@@ -101,20 +101,4 @@ 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/CardVerifiationHeaders.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardVerifiationHeaders.cs
new file mode 100644
index 00000000..394fd71a
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Takumi/GameRecord/CardVerifiationHeaders.cs
@@ -0,0 +1,44 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Web.Hoyolab.Takumi.GameRecord;
+
+internal sealed class CardVerifiationHeaders
+{
+ public int ChallengeGame { get; private set; }
+
+ public string ChallengePath { get; private set; } = string.Empty;
+
+ public string Page { get; private set; } = string.Empty;
+
+ public static CardVerifiationHeaders CreateForDailyNote()
+ {
+ return Create(ApiEndpoints.GameRecordDailyNotePath);
+ }
+
+ public static CardVerifiationHeaders CreateForIndex()
+ {
+ return Create(ApiEndpoints.GameRecordIndexPath);
+ }
+
+ public static CardVerifiationHeaders CreateForSpiralAbyss()
+ {
+ return Create(ApiEndpoints.GameRecordSpiralAbyssPath);
+ }
+
+ public static CardVerifiationHeaders CreateForCharacter()
+ {
+ return Create(ApiEndpoints.GameRecordCharacter, $"{HoyolabOptions.ToolVersion}_#/ys/role/all");
+ }
+
+ private static CardVerifiationHeaders Create(string path, string page = $"{HoyolabOptions.ToolVersion}_#/ys")
+ {
+ return new()
+ {
+ ChallengeGame = 2,
+ ChallengePath = path,
+ Page = page,
+ };
+ }
+
+}
\ 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 992ed6ec..a3719026 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
@@ -28,12 +28,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient
private readonly ILogger logger;
private readonly HttpClient httpClient;
- ///
- /// 异步获取实时便笺
- ///
- /// 用户与角色
- /// 取消令牌
- /// 实时便笺
[ApiInformation(Cookie = CookieType.Cookie, Salt = SaltType.X4)]
public async ValueTask> GetDailyNoteAsync(UserAndUid userAndUid, CancellationToken token = default)
{
@@ -54,9 +48,9 @@ internal sealed partial class GameRecordClient : IGameRecordClient
{
// Replace message
resp.Message = SH.WebDailyNoteVerificationFailed;
- IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
- CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath);
+ IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
+ CardVerifiationHeaders headers = CardVerifiationHeaders.CreateForDailyNote();
if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge)
{
@@ -78,12 +72,6 @@ internal sealed partial class GameRecordClient : IGameRecordClient
return Response.Response.DefaultIfNull(resp);
}
- ///
- /// 获取玩家基础信息
- ///
- /// 用户与角色
- /// 取消令牌
- /// 玩家的基础信息
[ApiInformation(Cookie = CookieType.LToken, Salt = SaltType.X4)]
public async ValueTask> GetPlayerInfoAsync(UserAndUid userAndUid, CancellationToken token = default)
{
@@ -104,9 +92,9 @@ internal sealed partial class GameRecordClient : IGameRecordClient
{
// Replace message
resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed;
- IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
- CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath);
+ IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
+ CardVerifiationHeaders headers = CardVerifiationHeaders.CreateForIndex();
if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge)
{
@@ -155,9 +143,9 @@ internal sealed partial class GameRecordClient : IGameRecordClient
{
// Replace message
resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed;
- IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
- CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath);
+ IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
+ CardVerifiationHeaders headers = CardVerifiationHeaders.CreateForSpiralAbyss();
if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge)
{
@@ -230,9 +218,9 @@ internal sealed partial class GameRecordClient : IGameRecordClient
{
// Replace message
resp.Message = SH.WebIndexOrSpiralAbyssVerificationFailed;
- IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
- CardVerifiationHeaders headers = CardVerifiationHeaders.Create(ApiEndpoints.GameRecordDailyNotePath);
+ IGeetestCardVerifier verifier = serviceProvider.GetRequiredKeyedService(GeetestCardVerifierType.Custom);
+ CardVerifiationHeaders headers = CardVerifiationHeaders.CreateForCharacter();
if (await verifier.TryValidateXrpcChallengeAsync(userAndUid.User, headers, token).ConfigureAwait(false) is { } challenge)
{