Работа с POST-запросами в C#

186
02 апреля 2022, 02:20

Есть сайт, с которого надо спарсить данные. Проблема заключается в том, что я в силу отсутствия опыта не могу правильно это сделать. В дебаггере браузера нашёл, какой примерно POST-запрос надо отправлять:

faculty=0&teacher=&group=%CA%B2-51%EC&sdate=03.02.2020&edate=07.02.2020&n=700

Судя по получаемому ответу, этот запрос принимается и обрабатывается сервером - даты и название группы, отправленные в запросе, подставляются в текстовые поля на получаемой странице(как и при ручном введении этих данных), но вот проблема в следующем - в C# проекте получаемая страница вместо необходимых данных содержит в своём коде сообщение об ошибке, а в Node.JS проекте всё работает как надо. Коды используемых методов:

C#:

public static async Task PostRequestAsync() 
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    WebRequest request = WebRequest.Create("http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi/srequest.cgi");
    request.Method = "POST";
    string data = "n=700&faculty=0&teacher=&group=КІ-51м&sdate=03.02.2020&edate=07.02.2020";
    byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(data);
    request.ContentLength = byteArray.Length;
    using(Stream dataStream = request.GetRequestStream()) 
    {
        await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
    }
    WebResponse response = await request.GetResponseAsync();
    using(Stream stream = response.GetResponseStream()) 
    {
        using(StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251"))) 
        {
            string text = reader.ReadToEnd();
            Console.WriteLine(text);
        }
    }
    response.Close();
    Console.WriteLine("Запрос выполнен...");
}

Node.JS:

const iconv = require("iconv-lite");
var axios = require("axios");
axios
    .post(
        "http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700",
        "faculty=0&teacher=&group=%CA%B2-51%EC&sdate=&edate=&n=700",
        {
            responseType: "arraybuffer",
            responseEncoding: "binary",
            headers: {
                "Content-Type": "application/x-www-form-urlencoded"
            }
        }
    )
    .then(function (response) {
        let z = iconv
            .encode(iconv.decode(response.data, "cp1251"), "utf8")
            .toString();
        console.log(z);
    });

Работающий Node.JS код скинул случайный знакомый, я этот язык не знаю совсем. Как мне кажется, проблема здесь в том, что в C# HTTP клиент не умеет выполнять javascript'ы, и подгрузка необходимой мне информации осуществляется чем-то типа AJAX'а, но подтверждений этому я не смог найти. Хотелось бы узнать, в чём тут причина и по возможности методы или подсказки, как эту проблему решить. Заранее спасибо.

Коды получаемых страниц: C# проект, Node.JS проект
Отправляемые данные:
группа: КІ-51м, %CA%B2-51%EC в дебаггере;
даты: 03.02.2020 - 07.02.2020

Answer 1

У вас запрос идёт не по тем URL. Вот так должно работать.

public static async Task PostRequestAsync()
        {
            string faculty = "13";
            string teacher = "";
            string group = "КІ-51";
            string startDate = "01.01.2020";
            string endDate = "07.02.2020";
            string n = "700";
            string urlRequest = "http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700";
            string postData = $"faculty={faculty}&teacher={teacher}&group={group}&sdate={startDate}&edate={endDate}&n={n}";
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            WebRequest request = WebRequest.Create(urlRequest);
            request.Method = "POST";
            byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(postData);
            request.ContentLength = byteArray.Length;
            using (Stream dataStream = request.GetRequestStream())
            {
                await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
            }
            WebResponse response = await request.GetResponseAsync();
            using (Stream stream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251")))
                {
                    string text = reader.ReadToEnd();
                    Console.WriteLine(text);
                }
            }
            response.Close();
            Console.WriteLine("Запрос выполнен...");
        }
READ ALSO
Как можно смоделировать сеть

Как можно смоделировать сеть

Как смоделировать сеть состоящую из сервера и нескольких рабочих машин,с возможностью моделирования скорости сетиЧто использовать WmWare?...

83
Linq множественный выбор (если не содержит)

Linq множественный выбор (если не содержит)

Вот выборка по 2 условиям

211
Использование dll из различных процессов

Использование dll из различных процессов

Использую в приложении(windows сервис) на C#, dll написаную на DelphiКод dll у меня есть

90
Вывод результата вычислений из одной формы в другую

Вывод результата вычислений из одной формы в другую

Есть две формы: на Form2 располагаются textbox1, button1 и checkbox1-2В ней пользователь вводит радиус окружности и выбирает при помощи checkbox режим вычислений...

86