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) {