2010-04-10 6 views
3

J'ai besoin d'aide pour un projet de travail qui m'a été assigné. Pour l'instant, nous allons manuellement sur le site, connectez-vous, puis téléchargez deux fichiers Excel sur le site Web d'un fournisseur chaque mois. Les fichiers sont ensuite chargés dans SQL.Automatiser les téléchargements depuis un site protégé par mot de passe

Nous voulons automatiser ce processus. Maintenant, le chargement des fichiers dans SQL, je peux le faire, mais je ne suis pas sûr de savoir comment je peux automatiser la connexion sur le site Web en entrant mes informations d'utilisateur et la collecte des fichiers. Je m'occupe principalement de SQL et j'ai très peu d'expérience .NET, donc tout échantillon de code serait très apprécié.

Juste pour confirmer. Le formulaire d'ouverture de session est sur une page ASPX. juste un formulaire de base avec une table contenant le nom d'utilisateur & les champs de mot de passe, le lien de mot de passe oublié et le bouton d'ouverture de session

+0

est-il connexion via un formulaire sur la page, ou une boîte de dialogue du navigateur qui demande un nom d'utilisateur et un mot de passe? –

+2

Il existe de nombreuses façons de protéger un site Web par un mot de passe (HTTP Basic, page de connexion définissant un cookie, ...). Quel mécanisme utilise votre site Web? – dtb

Répondre

4

Vous pouvez utiliser webclient ou httpwebrequest.

Login to the page with HttpWebRequest

How do you login to a webpage and retrieve its content in C#?

HttpWebRequest exemple:

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://sso.bhmobile.ba/sso/login"); 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 
    req.Method = "POST"; 
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    req.Headers.Add("Accept-Language: en-us,en;q=0.5"); 
    req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
    req.KeepAlive = true; 
    req.Headers.Add("Keep-Alive: 300"); 
    req.Referer ="http://sso.bhmobile.ba/sso/login"; 

    req.ContentType = "application/x-www-form-urlencoded"; 

    String Username = "username"; 
    String PassWord = "Password"; 

    StreamWriter sw = new StreamWriter(req.GetRequestStream()); 
    sw.Write("application=portal&url=http%3A%2F%2Fwww.bhmobile.ba%2Fportal%2Fredirect%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Ftype%3Dssologin%26url%3D%2Fportal%2Fshow%3Bjsessionid%3D1C568AAA1FB8B5C757CF5F68BE6ECE65%3Fidc%3D1023278&realm=sso&userid=" + Username + "&password=" + password + "&x=16&y=11"); 
    sw.Close(); 

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


    StreamReader reader = new StreamReader(response.GetResponseStream()); 
    string tmp = reader.ReadToEnd(); 

    foreach (Cookie cook in response.Cookies) 
    { 
     tmp += "\n" + cook.Name + ": " + cook.Value; 
    } 


    Response.Write(tmp); 
    Response.End(); 

exemple Webclient:

WebClient wc = new WebClient(); 
wc.Credentials = new NetworkCredential("username", "password"); 
string url = "http://foo.com";     
try 
{ 
     using (Stream stream = wc.OpenRead(new Uri(url))) 
     { 
       using (StreamReader reader = new StreamReader(stream)) 
      { 
       return reader.ReadToEnd(); 
      } 
     } 
} 
catch (WebException e) 
{ 
     //Error handeling 
} 
+1

Bonne réponse, sauf que je supprimerais l'en-tête "Accept-Encoding: gzip, deflate" comme vous auriez à déballer le flux aussi bien pour ce cas. Et utilisez quelque chose comme Fiddler pour renifler comment vous devriez envoyer la demande réelle. –

+0

Merci: - il semble que webclient est ce dont j'avais besoin. Va enquêter plus loin – Andrew

+0

@Mikael Svenson: Bon point! Yip, fiddler est génial et devrait toujours être utilisé pour vérifier quels en-têtes, champs de formulaire et champs cachés vous devez envoyer en essayant d'imiter les requêtes du navigateur avec webclient ou httpwebrequest. +1 –

Questions connexes