Как указывать заголовки для пост запроса для https://kad.arbitr.ru/Kad/SearchInstances?

Хочу написать программу которая будет открывать нужное дело по его id(например А84-1724/2021) Написал такой код, но выдает вот это(фото). Хотя с помощью фиддлера все нормально(результат фиддлера в в виде фото). Мне кажется нужно указать User Agent и другое, но как?

Фиддлер Результат фиддлера

Программа Результат программы

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    async private void button1_MouseClick(object sender, MouseEventArgs e)
    {
       Dictionary<string, string> Params = new Dictionary<string, string>() {
       {"User-Agent:" , "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" },
      { "CaseNumbers:", "[А84-1719/2021]" },
      { "Count:", "25" },
      { "Courts:", "[]" },
      { "DateFrom:", "null" },
      { "DateTo:", "null" },
      { "Judges:", "[]" },
      { "Page:", "1" },
      { "Sides:", "[]" },
      { "WithVKSInstances:", "false" },
        };
        var result = await GetRequest("https://kad.arbitr.ru/Kad/SearchInstances", Params);
        var response = await result.Content.ReadAsStringAsync();
        File.WriteAllText(@"C:\Users\forgu_000\Desktop\Новый текстовый документ.txt", response);
    }

    static async private Task<HttpResponseMessage> GetRequest(string Addres, 
    Dictionary<string,string> Params)
    {
        HttpClient http = new HttpClient();
        Uri uri = new Uri(Addres);
        FormUrlEncodedContent content = new FormUrlEncodedContent(Params);
        return await http.PostAsync(uri, content);
    }
  }
}

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

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

Ваша основная и непреодолимая проблема в целом не в заголовках, хотя как добавить заголовок, я оставлю в коде. Проблема здесь в куках. Дело в том, что сайт загружает сборку WebAssembly - который компилируется и исполняется браузером. Суть его работы в отношении текущей задачи - установка куки типа wasm=7eed8209dad760c9b99d033aef554062, где значение куки, как я узнал из декомпилированных исходников - MD5 хэш. А вот хэш чего - это мне уже в отведенное время узнать не удалось.

Куку эту можно получить из обычного браузера, для этого нужно открыть страницу с формой поиска, открыть консоль браузера, ввести в консоли document.cookie и вам отобразятся все куки, хранящиеся в веб-странице, в том числе и wasm. Далее забрать значение этой куки себе в код, и какое-то время, быть может несколько минут она таки будет работать.

Вторая ваша проблема, что вы пытаетесь запостить form-urlencoded, а вроде-как невооруженным глазом видно, что надо постить JSON. Я взял более-менее полный запрос к серверу из формы, отправил, взял JSON и вставил в с Visual Studio как класс. Получился следующий код для формирования данных поискового запроса.

public class SearchQuery
{
    public int Page { get; set; }
    public int Count { get; set; }
    public string[] Courts { get; set; }
    public DateTime? DateFrom { get; set; }
    public DateTime? DateTo { get; set; }
    public Side[] Sides { get; set; }
    public Judge[] Judges { get; set; }
    public string[] CaseNumbers { get; set; }
    public bool WithVKSInstances { get; set; }
}

public class Side
{
    public string Name { get; set; }
    public int Type { get; set; }
    public bool ExactMatch { get; set; }
}

public class Judge
{
    public string JudgeId { get; set; }
    public int Type { get; set; }
}

Далее вот такой код позволит отправить верный запрос

public partial class Form1 : Form
{
    private readonly HttpClient client = new HttpClient();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Это больше не нужно
        // client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36");
    }

    private async void button1_MouseClick(object sender, MouseEventArgs e)
    {
        SearchQuery query = new SearchQuery
        {
            CaseNumbers = new string[] { "А84-1719/2021" },
            Count = 25,
            Courts = Array.Empty<string>(),
            DateFrom = null,
            DateTo = null,
            Judges = Array.Empty<Judge>(),
            Page = 1,
            Sides = Array.Empty<Side>(),
            WithVKSInstances = false
        };
           
        try
        {
            string result = await PostJsonAsync("https://kad.arbitr.ru/Kad/SearchInstances", query);
            File.WriteAllText(@"C:\Users\forgu_000\Desktop\Новый текстовый документ.txt", result);
            MessageBox.Show("Успех!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private async Task<string> PostJsonAsync<T>(string url, T obj)
    {
        using HttpContent content = new StringContent(JsonSerializer.Serialize(obj), Encoding.UTF8, "application/json");
        using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
        request.Content = content;
        // вот сюда вам нужно вставить тот самый MD5 из браузерной куки
        request.Headers.Add("Cookie", "wasm=7eed8209dad760c9b99d033aef554062");
        using HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead);
        return await response.EnsureSuccessStatusCode().Content.ReadAsStringAsync();
    }
  }
}

И вы получите в result HTML страницу. Далее вам останется только прочитать, Как распарсить HTML в C# и достать нужные вам значения.

Мне жаль, что не смогу помочь. Сайт хорошо защищен от ботов.

→ Ссылка