2

привет всем.

Я пытаюсь одним пост-запросом изменить аватар в 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();

    }
}

}

spaden
  • 35
  • _ga и _gid куки - это Google аналитика, можете их выбросить, они не относятся к Steam, другими словами это отслеживающий вас мусор. Транспортный заголовок Connection тоже ни к чему, его HttpClient сам добавит, если посчитает нужным, и скорее всего он так и сделает. А вот User-Agent я бы добавил client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0");. – aepot May 26 '22 at 19:31
  • @aepot Спасибо за ответ! И ещё, у меня вопрос: как я могу добавить ещё несколько параметров в мультипарт? Т.е. там ещё нужно указать айди, тип и т.д. – spaden May 27 '22 at 12:44
  • Так добавьте еще стинг-контентов, как я указывал в прошлом ответе { streamImg, stringContent1, stringContent2,... }. Если ответ был полезен, вы можете принять его галочкой. – aepot May 27 '22 at 13:14
  • @aepot Ещё раз, огромное спасибо, как всегда выручаете! Я так и делал, добавлял StringContent, но результата не было, стоило только поменять куки на более актуальные и тут же сработало!

    Я так заметил, что у меня чаще ошибки происходят из-за куков, поэтому я сделал вход в стим с сохранением куков, теперь они будут только актуальные!

    – spaden May 27 '22 at 16:22
  • HttpClient правильно с куками работает, если что. То есть если в процессе работы ему от сервера приходят куки, он вносит их в контейнер. https://ru.stackoverflow.com/q/1178026/373567 – aepot May 27 '22 at 16:25

1 Answers1

2

На скрине сигнатура 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"
aepot
  • 49,560