HttpClient очищает данные с сайта с помощью входа c #

c# html-agility-pack httpclient

Вопрос

Я хотел бы очистить некоторые данные со следующего веб-сайта:

http://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559# .

На сайте есть некоторые данные о настольном теннисе. Фактический сезон можно получить без логина в последних сезонах только с логином. Для фактического сезона я уже создал некоторый код, чтобы получить данные из него, и он отлично работает. Я использую HttpClient из HtmlAgilityPack. Код выглядит так:

            HttpClient http = new HttpClient();
            var response = await http.GetByteArrayAsync(website);
            String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
            source = WebUtility.HtmlDecode(source);
            HtmlDocument resultat = new HtmlDocument();
            resultat.LoadHtml(source);

            Do something to get the relevant data from resultat by scanning the DocumentNodes from resultat...

Теперь я хотел бы получить данные с веб-сайта, для которого требуется логин. У кого-нибудь есть идея, как войти на сайт и получить данные? Вход должен быть выполнен, щелкнув «Ergebnishistorie freischalten ...», а затем введите имя пользователя и пароль.

Принятый ответ

Существует множество способов выполнить вход на веб-сайт, и это зависит от метода проверки подлинности, используемого конкретным сайтом (проверка подлинности на основе форм, обычная проверка подлинности, проверка подлинности Windows и т. Д.). Обычно веб-сайты используют FormsAuthentication.

Чтобы выполнить вход на стандартном веб-сайте FormsAuthentication с использованием HttpClient, вам необходимо установить CookieContainer, поскольку данные проверки подлинности будут установлены на файлы cookie.

В вашем конкретном примере форма входа делает POST на любую страницу в HTTPS, я использовал https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState = rueckrunde & чемпионат = SK + Bez. + BB + 13% 2F14 & group = 204559 в качестве примера. Это код для запроса с использованием HttpClient:

var baseAddress = new Uri("https://wttv.click-tt.de/");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    //usually i make a standard request without authentication, eg: to the home page.
    //by doing this request you store some initial cookie values, that might be used in the subsequent login request and checked by the server
    var homePageResult = client.GetAsync("/");
    homePageResult.Result.EnsureSuccessStatusCode();

    var content = new FormUrlEncodedContent(new[]
    {
        //the name of the form values must be the name of <input /> tags of the login form, in this case the tag is <input type="text" name="username">
        new KeyValuePair<string, string>("username", "username"),
        new KeyValuePair<string, string>("password", "password"),
    });
    var loginResult = client.PostAsync("/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559", content).Result;
    loginResult.EnsureSuccessStatusCode();

    //make the subsequent web requests using the same HttpClient object
}

Тем не менее, многие веб-сайты используют некоторые значения загруженной формы javascript или даже некоторые элементы управления captcha, и, очевидно, это решение не будет работать. Это можно сделать, как указано в элементе управления WebBrowser (путем автоматизации ввода пользователем полей формы и нажатия кнопки входа в систему). Эта ссылка имеет пример: https://social.msdn.microsoft.com/Forums/vstudio/en- US / 0b77ca8c-48ce-4fa8-9367-c7491aa359b0 / yahoo-login-via-systemnetsockets-namespace? Forum = vbgeneral ).

Как правило, чтобы проверить, как работает логин на вашем запрошенном веб-сайте, используйте Fiddler: http://www.telerik.com/fiddler : когда вы нажимаете кнопку входа на свой сайт, смотрите Fiddler и находите запрос на вход (обычно это первый запрос сразу после нажатия кнопки «Вход», и обычно это запрос POST).

Затем проверьте данные запроса (выберите запрос и перейдите на вкладку «Инспекторы» - «Текстовое изображение») и попробуйте повторить запрос на свой код.

На левой панели находятся все запросы, перехваченные Fiddler, на правой панели находятся инспекторы запроса и ответа

На левой панели находятся все запросы, перехваченные Fiddler, на правой панели находятся инспекторы запроса и ответа (сверху есть инспекторы запросов, внизу - контролеры ответов)

редактировать

Тот же код со старым классом WebRequest: http://rextester.com/LLP86817

var cookieContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://wttv.click-tt.de/");
request.CookieContainer = cookieContainer;
//set the user agent and accept header values, to simulate a real web browser
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";


//SET AUTOMATIC DECOMPRESSION
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

Console.WriteLine("FIRST RESPONSE");
Console.WriteLine();
using (WebResponse response = request.GetResponse())
{
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

request = (HttpWebRequest)HttpWebRequest.Create("https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState=rueckrunde&championship=SK+Bez.+BB+13%2F14&group=204559");
//set the cookie container object
request.CookieContainer = cookieContainer;
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

//set method POST and content type application/x-www-form-urlencoded
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

//SET AUTOMATIC DECOMPRESSION
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

//insert your username and password
string data = string.Format("username={0}&password={1}", "username", "password");
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(data);

request.ContentLength = bytes.Length;

using (Stream dataStream = request.GetRequestStream())
{
    dataStream.Write(bytes, 0, bytes.Length);
    dataStream.Close();
}

Console.WriteLine("LOGIN RESPONSE");
Console.WriteLine();
using (WebResponse response = request.GetResponse())
{
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}

//request = (HttpWebRequest)HttpWebRequest.Create("INTERNAL PROTECTED PAGE ADDRESS");
//After a successful login, you must use the same cookie container for all request
//request.CookieContainer = cookieContainer;

//....


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему