Skip to content

Commit 7dadf00

Browse files
committed
新增获取Steam私密游戏AppId列表接口与实现
1 parent 07e7d5d commit 7dadf00

3 files changed

Lines changed: 78 additions & 0 deletions

File tree

src/BD.SteamClient/Constants/SteamApiUrls.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public static class SteamApiUrls
1111
public const string STEAM_LOGIN_URL = "https://steamcommunity.com/login/home/?goto=my/profile";
1212
public const string STEAM_BADGES_URL = "https://steamcommunity.com/profiles/{0}/badges/?l=schinese&p={1}";
1313
public const string STEAM_GAMECARDS_URL = "https://steamcommunity.com/profiles/{0}/gamecards/{1}?l=english";
14+
public const string STEAM_PROFILE_GAMES_ALL_URL = "https://steamcommunity.com/profiles/{0}/games/?tab=all";
1415
public const string STEAMAPP_LIST_URL = "https://api.steampowered.com/ISteamApps/GetAppList/v2";
1516
public const string STEAMAPP_LOGO_URL = "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/{0}/{1}.jpg";
1617
public const string STEAMAPP_LIBRARY_URL = "https://steamcdn-a.akamaihd.net/steam/apps/{0}/library_600x900.jpg";

src/BD.SteamClient/Services.Implementation/SteamIdleCardServiceImpl.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace BD.SteamClient.Services.Implementation;
44
using AngleSharp.Dom;
55
using AngleSharp.Html.Dom;
66
using AngleSharp.Html.Parser;
7+
using BD.SteamClient.Constants;
78
using BD.SteamClient.Models.Idle;
89
using Nito.Comparers.Linq;
910
using System.Linq;
@@ -210,6 +211,52 @@ public async Task<IEnumerable<CardsMarketPrice>> GetCardsMarketPrice(uint appId,
210211
}
211212
return Enumerable.Empty<CardsMarketPrice>();
212213
}
214+
215+
public async Task<(IReadOnlyCollection<uint> appIds, HttpStatusCode status)> GetPrivateGameAppIdsAsync(string steam_id)
216+
{
217+
var steamSession = _sessionService.RentSession(steam_id);
218+
if (steamSession == null)
219+
throw new Exception($"Unable to find session for {steam_id}, pelese login first");
220+
221+
try
222+
{
223+
var url = SteamApiUrls.STEAM_PROFILE_GAMES_ALL_URL.Format(steamSession.SteamId);
224+
var response = await steamSession.HttpClient!.GetAsync(url);
225+
if (!response.IsSuccessStatusCode)
226+
return (Array.Empty<uint>(), response.StatusCode);
227+
228+
var html = await response.Content.ReadAsStringAsync();
229+
var match = Regex.Match(html, @"var\s+rgGames\s*=\s*(\[[\s\S]*?\]);");
230+
if (!match.Success)
231+
return (Array.Empty<uint>(), HttpStatusCode.OK);
232+
233+
var privateAppIds = new HashSet<uint>();
234+
using var document = JsonDocument.Parse(match.Groups[1].Value);
235+
if (document.RootElement.ValueKind == JsonValueKind.Array)
236+
{
237+
foreach (var item in document.RootElement.EnumerateArray())
238+
{
239+
if (!item.TryGetProperty("appid", out var appidValue))
240+
continue;
241+
if (!TryGetUInt32(appidValue, out var appId))
242+
continue;
243+
244+
if (item.TryGetProperty("is_private", out var isPrivateValue)
245+
&& IsTrueJsonValue(isPrivateValue))
246+
{
247+
privateAppIds.Add(appId);
248+
}
249+
}
250+
}
251+
252+
return (privateAppIds.ToArray(), HttpStatusCode.OK);
253+
}
254+
catch (Exception ex)
255+
{
256+
Log.Warn(nameof(GetPrivateGameAppIdsAsync), ex, "获取私密游戏列表失败");
257+
return (Array.Empty<uint>(), HttpStatusCode.InternalServerError);
258+
}
259+
}
213260
#endregion
214261

215262
#region Private
@@ -325,5 +372,28 @@ SteamCard GetCard(IElement element)
325372
return card;
326373
}
327374
}
375+
376+
private static bool IsTrueJsonValue(JsonElement value)
377+
{
378+
return value.ValueKind switch
379+
{
380+
JsonValueKind.True => true,
381+
JsonValueKind.False => false,
382+
JsonValueKind.Number => value.TryGetInt32(out var v) && v != 0,
383+
JsonValueKind.String => bool.TryParse(value.GetString(), out var v) && v,
384+
_ => false,
385+
};
386+
}
387+
388+
private static bool TryGetUInt32(JsonElement value, out uint appId)
389+
{
390+
if (value.ValueKind == JsonValueKind.Number && value.TryGetUInt32(out appId))
391+
return true;
392+
if (value.ValueKind == JsonValueKind.String && uint.TryParse(value.GetString(), out appId))
393+
return true;
394+
395+
appId = default;
396+
return false;
397+
}
328398
#endregion
329399
}

src/BD.SteamClient/Services/ISteamIdleCardService.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,11 @@ public interface ISteamIdleCardService
2828
/// <param name="currency"></param>
2929
/// <returns></returns>
3030
Task<IEnumerable<CardsMarketPrice>> GetCardsMarketPrice(uint appId, string currency);
31+
32+
/// <summary>
33+
/// 获取账号私密游戏 AppId 列表
34+
/// </summary>
35+
/// <param name="steam_id"></param>
36+
/// <returns></returns>
37+
Task<(IReadOnlyCollection<uint> appIds, HttpStatusCode status)> GetPrivateGameAppIdsAsync(string steam_id);
3138
}

0 commit comments

Comments
 (0)