Post-запрос Steam на смену ника

привет всем.

С запросами начал работать недавно, поэтому я не понимаю как правильно подать ПОСТ-запрос в Steam. Мне нужно автоматизировать смену ника в стиме.

Так должен выглядеть запрос: введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

А такой получается у меня: введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

Вот код:

static async Task Main(string[] args)
        {
            string uri = "https://steamcommunity.com/id/spaden2k/edit";
 
            HttpClient client = new HttpClient();
 
            var post = new Dictionary<string, string>
                {
                    { "Content-Disposition: form-data; name=\"personaName\"",          "test" },
                    { "Content-Disposition: form-data; name=\"type\"",          "profileSave" },
                };
            var content_post = new FormUrlEncodedContent(post);
 
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0");
            client.DefaultRequestHeaders.Add("Accept", "application/json, text/plain, */*");
            client.DefaultRequestHeaders.Add("Referer", "https://steamcommunity.com/id/spaden2k/edit/info");
            client.DefaultRequestHeaders.Add("Origin", "https://steamcommunity.com");
            client.DefaultRequestHeaders.Add("Host", "steamcommunity.com");
            client.DefaultRequestHeaders.Add("Connection", "keep-alive");
            client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
 
            var response = await client.PostAsync(uri, content_post);
        }

Ответы (1 шт):

Автор решения: aepot

FormUrlEncodedContent это application/x-www-form-urlencoded а вам надо multipart/form-data, то есть MultipartFormDataContent

static readonly CookieContainer container = new CookieContainer();
static readonly HttpClient client = new HttpClient(new HttpClientHandler()
{ 
    AutomaticDecompression = DecompressionMethods.All, 
    CookieContainer = container
});

static async Task Main(string[] args)
{
    string url = "https://ссылка";
    Dictionary<string, string> formData = new Dictionary<string, string>()
    {
        ["personaName"] = "test",
        ["type"] = "profileSave"
    };

    // пример добавления кук
    //var cookie = new Cookie("myCookie", "my-cookie-value", "/", "mydomain.com");
    //container.Add(cookie);

    using var request = new HttpRequestMessage(HttpMethod.Post, url);
    var content = CreateMultipartFormContent(formData);
    request.Content = content;

    //Console.WriteLine(request.ToString());
    //Console.WriteLine(await content.ReadAsStringAsync());

    using var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
    Console.WriteLine($"{(int)response.StatusCode} {response.ReasonPhrase}");
    Console.WriteLine(await response.Content.ReadAsStringAsync());

    Console.ReadKey();
}

static HttpContent CreateMultipartFormContent(Dictionary<string, string> formData)
{
    var result = new MultipartFormDataContent();
    foreach (var pair in formData)
    {
        var content = new StringContent(pair.Value);
        content.Headers.ContentType = null;
        result.Add(content, pair.Key);
    }
    return result;
}

Отладочный вывод (закомментровал отправку, раскомментировал вывод)

Method: POST, RequestUri: 'https://ссылка/', Version: 1.1, Content: System.Net.Http.MultipartFormDataContent, Headers:
{
  Content-Type: multipart/form-data; boundary="86e6797b-a7bb-477e-85d5-488227c8e2e1"
}
--86e6797b-a7bb-477e-85d5-488227c8e2e1
Content-Disposition: form-data; name=personaName

test
--86e6797b-a7bb-477e-85d5-488227c8e2e1
Content-Disposition: form-data; name=type

profileSave
--86e6797b-a7bb-477e-85d5-488227c8e2e1--

Заголовки Connection и Accept-Encoding добавлять не нужно, HttpClient их сам добавит при необходимости. Например задание AutomaticDecompression как раз и добавляет Accept-Encoding и включает поддержку разархивации ответов от сервера.

→ Ссылка