From 06117adf4711a4b8c8df594105fa538b9e567e05 Mon Sep 17 00:00:00 2001 From: Wave Dev <66224387+wavedevgit@users.noreply.github.com> Date: Thu, 12 Mar 2026 17:06:40 +0000 Subject: [PATCH] use correct http method to get xsp --- .../Discord/DiscordClient.cs | 123 +++++++----------- 1 file changed, 47 insertions(+), 76 deletions(-) diff --git a/DiscordChatExporter.Core/Discord/DiscordClient.cs b/DiscordChatExporter.Core/Discord/DiscordClient.cs index 54e4323d..287117c4 100644 --- a/DiscordChatExporter.Core/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Core/Discord/DiscordClient.cs @@ -69,90 +69,61 @@ public class DiscordClient( tokenKind == TokenKind.Bot ? $"Bot {token}" : token ); - // add browser headers like x-super-properties and user-agent - // discord flags requests that don't look like a real browser - if (tokenKind != TokenKind.Bot) + // add browser headers like x-super-properties and user-agent + // discord flags requests that don't look like a real browser + if (tokenKind != TokenKind.Bot) + { + try { - try + using var apiReq = new HttpRequestMessage( + HttpMethod.Post, + "https://cordapi.dolfi.es/api/v2/properties/web" + ); + + using var apiRes = await Http.Client.SendAsync(apiReq, innerCancellationToken); + apiRes.EnsureSuccessStatusCode(); + + var apiJson = await apiRes.Content.ReadAsStringAsync(innerCancellationToken); + + using var doc = JsonDocument.Parse(apiJson); + + var root = doc.RootElement; + + string xspBase64 = root.GetProperty("encoded").GetString()!; + + var properties = root.GetProperty("properties"); + + string userAgent = proprties.GetProperty("user_agent").GetString()!; + string browserVersion = proprties.GetProperty("browser_version").GetString()!; + string osType = properties.GetProperty("os").GetString()!; + + string chromeMajor = browserVersion.Split('.')[0]; + + var headers = new Dictionary { - var apiJson = await Http.Client.GetStringAsync( - "https://cordapi.dolfi.es/api/v2/properties/web", - innerCancellationToken - ); + ["sec-ch-ua-platform"] = $"\"{osType}\"", + ["referer"] = "https://discord.com/app", + ["x-debug-options"] = "bugReporterEnabled", + ["accept-language"] = "en-US,en;q=0.9", - using var doc = JsonDocument.Parse(apiJson); + ["sec-ch-ua"] = + $"\"Chromium\";v=\"{chromeMajor}\", \"Not;A=Brand\";v=\"99\"", - var client = doc.RootElement.GetProperty("client"); - var browser = doc.RootElement.GetProperty("browser"); - var os = browser.GetProperty("os"); + ["sec-ch-ua-mobile"] = "?0", - string userAgent = browser.GetProperty("user_agent").GetString()!; - string browserVersion = browser.GetProperty("version").GetString()!; - string browserType = browser.GetProperty("type").GetString()!; - string osType = os.GetProperty("type").GetString()!; - string osVersion = os.GetProperty("version").GetString()!; + ["x-discord-timezone"] = "Europe/Warsaw", + ["x-context-properties"] = "eyJsb2NhdGlvbiI6Ii9hcHAifQ==", + ["x-discord-locale"] = "en-US", - int buildNumber = client.GetProperty("build_number").GetInt32(); - string releaseChannel = client.GetProperty("release_channel").GetString()!; + ["user-agent"] = userAgent, + ["x-super-properties"] = xspBase64, + }; - string chromeMajor = browserVersion.Split('.')[0]; - - var xsp = new Dictionary - { - ["os"] = osType, - ["browser"] = browserType, - ["device"] = "", - ["system_locale"] = "en-US", - - ["browser_user_agent"] = userAgent, - ["browser_version"] = browserVersion, - ["os_version"] = osVersion, - - ["referrer"] = "", - ["referring_domain"] = "", - ["referrer_current"] = "https://www.google.com/", - ["referring_domain_current"] = "www.google.com", - ["search_engine_current"] = "google", - ["mp_keyword_current"] = "discord", - - ["release_channel"] = releaseChannel, - ["client_build_number"] = buildNumber, - ["client_event_source"] = null, - ["has_client_mods"] = false, - - ["client_launch_id"] = GenerateUuid(), - ["launch_signature"] = GenerateLaunchSignature(), - ["client_heartbeat_session_id"] = GenerateUuid(), - }; - - var xspJson = JsonSerializer.Serialize(xsp); - var xspBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(xspJson)); - - var headers = new Dictionary - { - ["sec-ch-ua-platform"] = $"\"{osType}\"", - ["referer"] = "https://discord.com/app", - ["x-debug-options"] = "bugReporterEnabled", - ["accept-language"] = "en-US,en;q=0.9", - - ["sec-ch-ua"] = - $"\"Chromium\";v=\"{chromeMajor}\", \"Not;A=Brand\";v=\"99\"", - - ["sec-ch-ua-mobile"] = "?0", - - ["x-discord-timezone"] = "Europe/Warsaw", - ["x-context-properties"] = "eyJsb2NhdGlvbiI6Ii9hcHAifQ==", - ["x-discord-locale"] = "en-US", - - ["user-agent"] = userAgent, - ["x-super-properties"] = xspBase64, - }; - - foreach (var kv in headers) - request.Headers.TryAddWithoutValidation(kv.Key, kv.Value); - } - catch { } + foreach (var kv in headers) + request.Headers.TryAddWithoutValidation(kv.Key, kv.Value); } + catch { } + } var response = await Http.Client.SendAsync( request,