Как указывать заголовки для пост запроса для 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 шт):
Ваша основная и непреодолимая проблема в целом не в заголовках, хотя как добавить заголовок, я оставлю в коде. Проблема здесь в куках. Дело в том, что сайт загружает сборку 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# и достать нужные вам значения.
Мне жаль, что не смогу помочь. Сайт хорошо защищен от ботов.

