C# Получить данные из сообщения с параметрами - PullRequest
0 голосов
/ 09 февраля 2020

Я знаю, что мой вопрос выглядит как дублированный вопрос, но я не смог найти полезного решения для своей проблемы.

Поэтому я пытаюсь собрать данные с автомобиля go отправляет сайт, предоставляющий данные * Ссылка (Это корейский веб-сайт. Черная кнопка справа - это кнопка поиска)

, но для того, чтобы получить данные из нее, необходимо установить некоторые радиокнопки, а затем нажать кнопку поиска.

Я думал, что смогу просто передать значения параметров через FormUrlEncodedContent, а затем просто использовать PostAsyn c, но каким-то образом я не смог их пропустить.

Вот мои коды до сих пор

       using (var client = new HttpClient())
       {
            client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
            client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");

            var doc = new HtmlAgilityPack.HtmlDocument();
            var content = new FormUrlEncodedContent(structInfo.ScriptValues);
            var response = await client.PostAsync(structInfo.PageURL, content);
            var responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);

       }

        using (WebClient client = new WebClient())
        {
            var reqparm = new System.Collections.Specialized.NameValueCollection();
            reqparm.Add("v_time", "month");
            reqparm.Add("ROCD", "ALL");
            reqparm.Add("ORDER", "item2");
            reqparm.Add("v_gu", "S");
            byte[] responsebytes = client.UploadValues("http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp", "POST", reqparm);
            string responsebody = Encoding.UTF8.GetString(responsebytes);

            Console.WriteLine(responsebody);
        }

Значения, которые я поместил в класс StructInfo

            PageURL = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp",
            ScriptValues = new Dictionary<string, string>
            {
                {"v_time", "month"},
                {"ROCD", "ALL"},
                {"ORDER", "item2"},
                {"v_gu", "S"}
            },

До сих пор я пробовал HttpClient, WebClient, WebBrowser, но мне не повезло.

Burp Suite Image

Но странно то, что когда я пытаюсь отправить сообщение с помощью Burp Suite, данные получаются очень хорошо, как я и хотел.

Я искал решение для последних 4 часов rs, не повезло.

Ребята, не могли бы вы помочь мне?

Спасибо

1 Ответ

1 голос
/ 09 февраля 2020

Сгенерированный код для C# - RestSharp от Почтальона

    var client = new RestClient("http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr");
    client.Timeout = -1;
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
    request.AddParameter("v_time", "3days");
    request.AddParameter("ROCD", "ALL");
    request.AddParameter("ORDER", "item2");
    request.AddParameter("v_gu", "S");
    IRestResponse response = client.Execute(request);
    Console.WriteLine(response.Content);

Версия HttpClient

    using var client = new HttpClient();
    var content = new FormUrlEncodedContent(new[]
    {
        new KeyValuePair<string, string>("v_time", "3days"),
        new KeyValuePair<string, string>("ROCD", "ALL"),
        new KeyValuePair<string, string>("ORDER", "item2"),
        new KeyValuePair<string, string>("v_gu", "S"),
    });
    string url = "http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr";
    var response = await client.PostAsync(url, content);
    var bytes = await response.Content.ReadAsByteArrayAsync();
    string responseString = Encoding.UTF8.GetString(bytes);
    Console.WriteLine(responseString);

Проблема

Если говорить о версии HttpClient, при условии, что вы используете. net core.

Исключение выдается при вызове ReadAsStringAsyn c. Более конкретно ниже: https://github.com/microsoft/referencesource/blob/aaca53b025f41ab638466b1efe569df314f689ea/System/net/System/Net/Http/HttpContent.cs#L95

Ответ имеет ContentType: text / html; charset = eu c -kr.

И проблема в том, что net core не поддерживает корейскую charset из коробки. Мой обходной путь - вместо этого использовать ReadAsByteArrayAsyn c, а затем использовать поддерживаемый кодер UTF8. Это винты корейских символов, хотя. Лучшим способом было бы сослаться на пакет System.Text.Encoding.CodePages, а затем использовать Encoding.RegisterProvider. Примерно так Encoding.GetEncoding не может работать в приложении UWP

...