2010-12-01 31 views
0

J'essaie de me connecter au site Web ci-dessous en utilisant HttpWebRequest. Je passe le nom d'utilisateur et le mot de passe à l'aide de la propriété Credentials mais je reviens toujours sur la page de connexion du site. Quelqu'un peut-il expliquer ce que je fais mal.Connexion à la page Web en utilisant HttpWebRequest

https://oyster.tfl.gov.uk/oyster/entry.do (Connexion)

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.ContentType = "application/x-www-form-urlencoded"; 
request.Credentials = new NetworkCredential(Username, Password); 
request.Method = "POST"; 
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
request.Headers.Add("Accept-Language: en-us,en;q=0.5"); 
request.Headers.Add("Accept-Encoding: gzip,deflate"); 
request.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
request.KeepAlive = true; 
request.Headers.Add("Keep-Alive: 300"); 
request.Referer = Url; 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    string tmp = reader.ReadToEnd(); 
} 
+0

(vos actions semblent violer les termes et conditions TfL, je regardais cette première ...) –

Répondre

1

note la Terms and Conditions:

Sont interdits [... snip ...]

L'utilisation de tout système automatisé , logiciel ou processus pour extraire le contenu et/ou des données, y compris le chalutage, l'exploration de données et grattage de l'écran.

Credentials est pour la sécurité de base/etc http - pas basée sur les formulaires de sécurité.

Il serait préférable d'utiliser une API s'il en existe une. Les formulaires HTML sont destinés aux humains, pas aux ordinateurs. On dirait qu'il y a un beta TfL API here.

0

Cette page ne contient aucune authentification HTTP (Basic, Digest, NTLM), donc les informations d'identification ne font rien.

Vous devez construire un POST /oyster/security_check qui envoie le nom d'utilisateur et mot de passe contenu (les données à envoyer se ressembleront ce que vous voyez dans la chaîne de requête si la forme était un GET, par exemple username=myName&password=myPass. Maintenir le cookie de ce pour les demandes ultérieures.

+0

(notez que cela viole les termes du site; p) –

+0

@Marc Eh bien c'est en utilisant le contenu trouvé en le parcourant qu'ils revendiquent le droit d'interdire, plutôt que de se connecter, et cela pourrait ne pas se lever devant un tribunal, que je sache, il y a des appels de la Cour suprême sur ces questions pendantes aux États-Unis et L'Irlande, tandis que le Danemark ironisait, le seul pays à interdire partiellement le «deepplinking» (quelle décision stupide - il n'y a pas de «lien profond»), mais il a accepté d'en faire au moins quelques utilisations. En outre, google cache a déjà éraflé une grande partie du contenu pour lequel vous n'avez pas besoin de connexion. Quoi qu'il en soit, nous avons répondu à la question technique. –

0

Voici une classe C# que vous trouverez peut-être très utile.

Il est très simple à utiliser et a des fonctions de base pour le téléchargement d'un tableau de chaînes ou octet. Il analyse également la page de connexion sous forme pour des choses comme les jetons d'authentification que certains sites utilisent pour empêcher l'authentification programmatique.J'ai essayé avec un certain nombre de sites Web tels que Faceb ook et ça a l'air de bien fonctionner.

[Lien removed]