Пост-запросом изменить аватар в 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 шт):
На скрине сигнатура 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"

