HttpClient récupère les données d'un site Web avec le login c #

c# html-agility-pack httpclient

Question

Je voudrais extraire des données du site Web suivant:

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

Le site Web contient des données sur le tennis de table. La saison actuelle est accessible sans connexion les dernières saisons uniquement avec connexion. Pour la saison actuelle, j'ai déjà créé du code pour en extraire les données et cela fonctionne bien. J'utilise le HttpClient du HtmlAgilityPack. Le code ressemble à ceci:

            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...

Maintenant, j'aimerais récupérer les données du site Web qui nécessite un identifiant. Quelqu'un a-t-il une idée à ce sujet, comment se connecter au site Web et obtenir les données? La connexion doit être effectuée en cliquant sur "Ergebnishistorie freischalten ..." puis en entrant le nom d'utilisateur et le mot de passe.

Réponse acceptée

Il existe de nombreuses manières d’effectuer une connexion à un site Web, et cela dépend de la méthode d’authentification utilisée par le site en question (authentification par formulaire, authentification de base, authentification Windows, etc.). Les sites Web utilisent généralement l’authentification Forms.

Pour vous connecter à un site Web standard FormsAuthentication à l'aide de HttpClient, vous devez définir CookieContainer, car les données d'authentification seront définies sur des cookies.

Dans votre exemple spécifique, le formulaire de connexion crée un POST sur l'une des pages HTTPS. J'ai utilisé https://wttv.click-tt.de/cgi-bin/WebObjects/nuLigaTTDE.woa/wa/teamPortrait?teamtable=1673669&pageState. = rueckrunde & championship = SK + Bez. + BB + 13% 2F14 & group = 204559 par exemple. C'est le code pour faire la requête en utilisant 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
}

Cependant, de nombreux sites Web utilisent des valeurs de formulaire chargé en javascript ou encore plus de contrôles captcha, et bien évidemment cette solution ne fonctionnera pas. Cela peut être effectué comme indiqué avec un contrôle WebBrowser (en automatisant la saisie de l'utilisateur sur les champs du formulaire, puis en cliquant sur le bouton de connexion, ce lien contient un exemple: https://social.msdn.microsoft.com/Forums/vstudio/fr. US / 0b77ca8c-48ce-4fa8-9367-c7491aa359b0 / yahoo-login-via-systemnetsockets-namespace? Forum = vbgeneral ).

En règle générale, pour vérifier le fonctionnement de la connexion sur votre site Web souhaité, utilisez Fiddler: http://www.telerik.com/fiddler : lorsque vous cliquez sur le bouton de connexion de votre site Web, regardez Fiddler et recherchez la demande de connexion la première demande juste après que vous avez cliqué sur le bouton "Connexion" (généralement une demande POST).

Ensuite, inspectez les données de la demande (sélectionnez la demande et allez dans l'onglet "Inspecteurs" - "TextView") et essayez de répliquer la demande sur votre code.

Dans le volet de gauche, il y a toutes les demandes interceptées par Fiddler, dans le volet de droite, les inspecteurs de demande et de réponse.

Dans le volet gauche, toutes les demandes interceptées par Fiddler, dans le volet droit, les inspecteurs des demandes et des réponses (en haut, les inspecteurs des demandes, en bas, les inspecteurs des réponses).

modifier

Même code avec l'ancienne classe WebRequest: http://rextester.com/LLP86817

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
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi