Пост-запросом изменить аватар в Steam C#

привет всем.

Я пытаюсь одним пост-запросом изменить аватар в Steam.

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

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

Вот такой получается у меня:

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

Код:

using System.Drawing;
using System.Net;
 
namespace Test
{
    class TestProgram
    {
        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)
        {
            Image newImage = Image.FromFile(@"D:\Bot files\images\photo_2022-01-24_13-01-11.jpg");
            ImageConverter _imageConverter = new ImageConverter();
            byte[] paramFileStream = (byte[])_imageConverter.ConvertTo(newImage, typeof(byte[]));
 
            client.DefaultRequestHeaders.Add("Accept", "application/json, text/plain, */*");
            client.DefaultRequestHeaders.Add("Referer", "https://steamcommunity.com/id/spaden2k/edit/avatar");
            client.DefaultRequestHeaders.Add("Origin", "https://steamcommunity.com");
            client.DefaultRequestHeaders.Add("Host", "steamcommunity.com");
            client.DefaultRequestHeaders.Add("Sec-Fetch-Dest", "empty");
            client.DefaultRequestHeaders.Add("Sec-Fetch-Mode", "cors");
            client.DefaultRequestHeaders.Add("Sec-Fetch-Site", "same-origin");
            client.DefaultRequestHeaders.Add("Connection", "keep-alive");
            client.DefaultRequestHeaders.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
 
            var cookies = new Cookie("sessionid", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("_ga", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("_gid", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("steamLoginSecure", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("browserid", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("steamMachineAuth76561198820241567", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
            cookies = new Cookie("steamRememberLogin", "тут данные", "/", "steamcommunity.com");
            container.Add(cookies);
 
            var streamImg = new StreamContent(new MemoryStream(paramFileStream));
                streamImg.Headers.Add("Content-Disposition", "form-data; name=\"avatar\"; filename=\"blob\"");
                streamImg.Headers.Add("Content-Type", "image/png");
 
 
                var formContent = new MultipartFormDataContent
                {
                    {streamImg,"avatar","blob"},
                };
 
                var response = client.PostAsync("https://steamcommunity.com/actions/FileUploader/", formContent).Result;
 
            
            Console.ReadKey();
 
        }
    }
}

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

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

На скрине сигнатура PNG файла, а в коде вы JPEG грузите. Конечно визуально бинарник PNG и JPEG отличаются. То есть вам либо надо путь поменять на PNG картинку, либо MIME type на image/jpeg. И не используйте .Result, используйте await как я вам показывал.

Прочитать картинку в массив байт можно вот так

byte[] bytes = await File.ReadAllBytesAsync("image.png");

А вы чего-то намудрили.

А лучше вообще открыть его в поток и отдать в контент. Итого получится:

using var fs = File.OpenRead("image.png");
var streamImg = new StreamContent(fs);
streamImg.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "avatar", FileName = "blob" };
streamImg.Headers.ContentType = new MediaTypeHeaderValue("image/png");
var formContent = new MultipartFormDataContent
{
    streamImg
};

Как определить MIME type картинки по расширению файла, можно подглядеть здесь.

Если хочется по содержимому, то можно как-то так с использованием GDI+

using Image bmp = Image.FromFile("image.png");
string imgType = ImageCodecInfo.GetImageEncoders()
    .FirstOrDefault(codec => codec.FormatID == bmp.RawFormat.Guid)?.MimeType ?? "application/unknown";
// выдаст "image/png"
→ Ссылка