Получить HTML из URL - StreamReader использует другую кодировку символов? - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу получить HTML с этого URL: https://store.steampowered.com/app/513710/SCUM/

Это должно быть легко, но я не смог этого сделать из-за ошибки SSL / TLS.

Поэтому я использовал код из этого вопроса: Запрос html через https с помощью c # Webclient

Наконец-то я мог заполнить свой StreamReader, но когда я пытаюсь использовать ReadToEnd () со строкой, я получаю поврежденную строку, что-то вроде этого: " "

Это должно быть что-то в кодировке символов, но если вы откроете: https://store.steampowered.com/app/513710/SCUM/

А затем откройте консоль браузера, в начале вы увидите:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

При указанном коде:

webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";

У вас есть utf-8, поэтому я просто не знаю, почему у меня такая проблема. Я пытался заменить:

StreamReader(webClient.OpenRead(steamURL));

С:

StreamReader(webClient.OpenRead(steamURL), Encoding.UTF8, true);

Но он все еще не получил правильный текст. Я попытался добавить всю информацию, что мог, если понадобится что-нибудь еще, я отредактирую вопрос.

Спасибо за потраченное время и хорошего дня.

С уважением,

David

PS: Это мой код прямо сейчас:

private StreamReader getStreamReader(string steamURL, WebClient webClient)
{
    return new StreamReader(webClient.OpenRead(steamURL), Encoding.UTF8, true);
}

private void getSteamCosts()
{
    // When I try to access an Steam HTML, SSL error appears
    // We need an specific security protocol
    // I check all, just in case
    ServicePointManager.ServerCertificateValidationCallback =
        new RemoteCertificateValidationCallback(
            delegate
        {
            return true;
        });
    using (WebClient webClient = new WebClient())
    {
        webClient.Headers["User-Agent"] = "Mozilla/5.0 (Windows;"
            + " U; Windows NT 6.0; en-US; rv:1.9.2.6) Gecko/20100625"
            + " Firefox/3.6.6 (.NET CLR 3.5.30729)";
        webClient.Headers["Accept"] = "text/html,application/xhtml+"
            + "xml,application/xml;q=0.9,*/*;q=0.8";
        webClient.Headers["Accept-Language"] = "en-us,en;q=0.5";
        webClient.Headers["Accept-Encoding"] = "gzip,deflate";
        webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";

        StreamReader sr = null;

        string steamURL = "https://store.steampowered.com/app/513710/SCUM/";

        try
        {
            // This one should work
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            sr = getStreamReader(steamURL, webClient);
            lbFinalSteam.Text = "TLS12Final";
        }
        catch (Exception) // Bad coding practice, just wanted it to work
        {
            // If that's not the case, I try the rest
            try
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
                sr = getStreamReader(steamURL, webClient);
                lbFinalSteam.Text = "TLSFinal";
            }
            catch (Exception)
            {
                try
                {
                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
                    sr = getStreamReader(steamURL, webClient);
                    lbFinalSteam.Text = "SSL3Final";
                }
                catch (Exception)
                {
                    try
                    {
                        ServicePointManager.SecurityProtocol =
                            SecurityProtocolType.Tls11;
                        sr = getStreamReader(steamURL, webClient);
                        lbFinalSteam.Text = "TLS11Final";
                    }
                    catch (Exception)
                    {
                        lbFinalSteam.Text = "NoFinal";
                    }
                }
            }
        }

        if (sr != null)
        {
            string allLines = sr.ReadToEnd();
        }
    }
}

edit: может быть проблема в том, как я преобразую StreamReader в строку? Я имею в виду эту строку:

string allLines = sr.ReadToEnd();

Должен ли я использовать что-нибудь еще?

1 Ответ

0 голосов
/ 01 сентября 2018

Как уже писал https://stackoverflow.com/users/246342/alex-k, проблема была не в кодировке, а в получении сжатого Gzimp. Я только что удалил это:

webClient.Headers["Accept-Encoding"] = "gzip,deflate";

И это работает! Спасибо, Алекс К! : D

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