none
Login à un web site automatiquement RRS feed

  • Question

  • Salut tout le monde,

    Je dévellope un code qui me permettra de s'authentifier automatiquement à mon site web et de récupérer le code HTML d'une page précise (page d'acceuil par exemple).vous trouverez  ci dessous mon code. le problème c'est que lorsque je récupére le code html, je trouve celui de la page "Login".

    COMMENT FAIRE POUR RECEPERER LE CODE HTML DE LA PAGE D'ACCEUIL

    Merci d'avance

    Dim cookieJar As New Net.CookieContainer() Dim request As Net.HttpWebRequest Dim response As Net.HttpWebResponse Dim strURL As String Try 'Get Cookies strURL = "https://monsite.com/login.aspx" request = Net.HttpWebRequest.Create(strURL) request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" request.Method = "GET" request.CookieContainer = cookieJar response = request.GetResponse() For Each tempCookie As Net.Cookie In response.Cookies cookieJar.Add(tempCookie) Next 'Send the post data now request = Net.HttpWebRequest.Create(strURL) request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" request.Method = "POST" request.AllowAutoRedirect = True request.CookieContainer = cookieJar Dim writer As StreamWriter = New StreamWriter(request.GetRequestStream()) writer.Write("email=username&pass=password") writer.Close() response = request.GetResponse() 'Get the data from the page Dim stream As StreamReader = New StreamReader(response.GetResponseStream()) Dim data As String = stream.ReadToEnd() response.Close() If data.Contains("<title>titre") = True Then 'LOGGED IN SUCCESSFULLY 'Si j'affiche ici la variable data, je trouve le code de la page login

    Else End If Catch ex As Exception MsgBox(ex.Message) End Try


    jeudi 16 février 2012 10:00

Réponses

  • Bonjour,

    Avez-vous essayé de voir ce qui se passe côté site web (par exemple les données sont bien récupérées ?) ou de tester par exemple avec un site web de test hébergé dans VS ? Est-ce que le login n'a pas réussit ou est-ce que c'est la redirection qui ne se fait pas ?

    Il manque peut-être httpRequest.ContentType = "application/x-www-form-urlencoded"; ?

    Mon approche serait d'utiliser http://fiddler2.com/fiddler2/ ou d'enregistrer la requête avec http://msdn.microsoft.com/fr-fr/library/system.web.httprequest.saveas.aspx pour vérifier qu'une requête manuelle et automatisée sont bien identiques ce qui vous permettra de voir ce qui manque.

    Si c'est la redirection qui coince une autre approche serait de faire un POST vers la page de login, récupérer les cookies et faire un GET de la page d'accueil plutôt que de compter sur la redirection (je pense que la première requête GET ne sert pas).

    Accessoirement j'ai remarqué que HttpWebRequest est souvent utilisé même si on n'en as pas besoin. Sinon voir WebClient qui permet de poster les données en fournissant des paires de valeurs et qui prend peut-être en charge automatiquement le bon ContentType et le codage des valeurs (pas d'accents dans username ou password ?)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    jeudi 16 février 2012 12:26
    Modérateur
  • Bonjour tout le monde,

    Merci Patrice pour ton aide.

     Dim _otherData As Hashtable
            _otherData = New Hashtable()
            ' in an initialization routine
            Dim _retVal As [String] = "err001"
            Dim _urlLogin As [String] = ""
            Dim _urlSignin As [String] = ""
            
            Dim _respStr As [String] = ""
            Dim _postData As [String] = ""
            Dim _uriLogin As Uri = Nothing
            Dim _uriSignin As Uri = Nothing
     _urlLogin= "monsite/Login.aspx"
            ' is the login Page
    _urlSignin= "monsite/Login.aspx?Page=/Page.aspx"
            'is the link used inside the action of the form tag 
           
            _uriLogin = New Uri(_urlLogin)
            _uriSignin = New Uri(_urlSignin)
           
            Try
                Dim _wReq As HttpWebRequest
                Dim _wResp As HttpWebResponse
                Dim _sr As System.IO.StreamReader
                Dim _enc As New System.Text.ASCIIEncoding()
                Dim _cookies As CookieContainer
                           
                _wReq = DirectCast(WebRequest.Create(_uriLogin), HttpWebRequest)
                _wReq.CookieContainer = New CookieContainer()
                _wReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
                _wResp = DirectCast(_wReq.GetResponse(), HttpWebResponse)
                _sr = New System.IO.StreamReader(_wResp.GetResponseStream())
                _respStr = _sr.ReadToEnd()
                _sr.Close()
                
                _cookies = _wReq.CookieContainer
                _wResp.Close()
                'Here insert all the parameter needed for the login... eg: in my example I suppose that the loginForm has 2 input field 
                _otherData.Add("username", New Hashtable())
                _otherData.Add("pass", New Hashtable())
                
                _otherData.Add("Login", New Hashtable())
                
                DirectCast(_otherData("username"), Hashtable)("value") = "username"
                DirectCast(_otherData("pass"), Hashtable)("value") = "pwd"
                
                DirectCast(_otherData("Login"), Hashtable)("value") = "Entrer"
                
                'you could need  to insert other information
                _postData = ""
                For Each name As String In _otherData.Keys
                    _postData += ("&" & name & "=") + DirectCast(_otherData(name), Hashtable)("value")
                Next
                _postData = _postData.Substring(1)
                Dim _data As Byte() = _enc.GetBytes(_postData)
                _wReq = DirectCast(WebRequest.Create(_uriSignin), HttpWebRequest)
                _wReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
                _wReq.Referer = _urlLogin
                _wReq.KeepAlive = True
                _wReq.Method = "POST"
                _wReq.ContentType = "application/x-www-form-urlencoded"
                _wReq.ContentLength = _data.Length
                _wReq.CookieContainer = _cookies
                _wReq.AllowAutoRedirect = True
                _wReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
                Dim _outStream As System.IO.Stream = _wReq.GetRequestStream()
                _outStream.Write(_data, 0, _data.Length)
                _outStream.Close()
                _wResp = DirectCast(_wReq.GetResponse(), HttpWebResponse)
                _sr = New System.IO.StreamReader(_wResp.GetResponseStream())
                _respStr = _sr.ReadToEnd()
                _sr.Close()
                _wResp.Close()
        
    ça marche bien Merci
    • Marqué comme réponse Yanese vendredi 24 février 2012 10:40
    vendredi 24 février 2012 10:38

Toutes les réponses

  • Bonjour,

    Avez-vous essayé de voir ce qui se passe côté site web (par exemple les données sont bien récupérées ?) ou de tester par exemple avec un site web de test hébergé dans VS ? Est-ce que le login n'a pas réussit ou est-ce que c'est la redirection qui ne se fait pas ?

    Il manque peut-être httpRequest.ContentType = "application/x-www-form-urlencoded"; ?

    Mon approche serait d'utiliser http://fiddler2.com/fiddler2/ ou d'enregistrer la requête avec http://msdn.microsoft.com/fr-fr/library/system.web.httprequest.saveas.aspx pour vérifier qu'une requête manuelle et automatisée sont bien identiques ce qui vous permettra de voir ce qui manque.

    Si c'est la redirection qui coince une autre approche serait de faire un POST vers la page de login, récupérer les cookies et faire un GET de la page d'accueil plutôt que de compter sur la redirection (je pense que la première requête GET ne sert pas).

    Accessoirement j'ai remarqué que HttpWebRequest est souvent utilisé même si on n'en as pas besoin. Sinon voir WebClient qui permet de poster les données en fournissant des paires de valeurs et qui prend peut-être en charge automatiquement le bon ContentType et le codage des valeurs (pas d'accents dans username ou password ?)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".


    jeudi 16 février 2012 12:26
    Modérateur
  • Bonjour tout le monde,

    Merci Patrice pour ton aide.

     Dim _otherData As Hashtable
            _otherData = New Hashtable()
            ' in an initialization routine
            Dim _retVal As [String] = "err001"
            Dim _urlLogin As [String] = ""
            Dim _urlSignin As [String] = ""
            
            Dim _respStr As [String] = ""
            Dim _postData As [String] = ""
            Dim _uriLogin As Uri = Nothing
            Dim _uriSignin As Uri = Nothing
     _urlLogin= "monsite/Login.aspx"
            ' is the login Page
    _urlSignin= "monsite/Login.aspx?Page=/Page.aspx"
            'is the link used inside the action of the form tag 
           
            _uriLogin = New Uri(_urlLogin)
            _uriSignin = New Uri(_urlSignin)
           
            Try
                Dim _wReq As HttpWebRequest
                Dim _wResp As HttpWebResponse
                Dim _sr As System.IO.StreamReader
                Dim _enc As New System.Text.ASCIIEncoding()
                Dim _cookies As CookieContainer
                           
                _wReq = DirectCast(WebRequest.Create(_uriLogin), HttpWebRequest)
                _wReq.CookieContainer = New CookieContainer()
                _wReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
                _wResp = DirectCast(_wReq.GetResponse(), HttpWebResponse)
                _sr = New System.IO.StreamReader(_wResp.GetResponseStream())
                _respStr = _sr.ReadToEnd()
                _sr.Close()
                
                _cookies = _wReq.CookieContainer
                _wResp.Close()
                'Here insert all the parameter needed for the login... eg: in my example I suppose that the loginForm has 2 input field 
                _otherData.Add("username", New Hashtable())
                _otherData.Add("pass", New Hashtable())
                
                _otherData.Add("Login", New Hashtable())
                
                DirectCast(_otherData("username"), Hashtable)("value") = "username"
                DirectCast(_otherData("pass"), Hashtable)("value") = "pwd"
                
                DirectCast(_otherData("Login"), Hashtable)("value") = "Entrer"
                
                'you could need  to insert other information
                _postData = ""
                For Each name As String In _otherData.Keys
                    _postData += ("&" & name & "=") + DirectCast(_otherData(name), Hashtable)("value")
                Next
                _postData = _postData.Substring(1)
                Dim _data As Byte() = _enc.GetBytes(_postData)
                _wReq = DirectCast(WebRequest.Create(_uriSignin), HttpWebRequest)
                _wReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
                _wReq.Referer = _urlLogin
                _wReq.KeepAlive = True
                _wReq.Method = "POST"
                _wReq.ContentType = "application/x-www-form-urlencoded"
                _wReq.ContentLength = _data.Length
                _wReq.CookieContainer = _cookies
                _wReq.AllowAutoRedirect = True
                _wReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
                Dim _outStream As System.IO.Stream = _wReq.GetRequestStream()
                _outStream.Write(_data, 0, _data.Length)
                _outStream.Close()
                _wResp = DirectCast(_wReq.GetResponse(), HttpWebResponse)
                _sr = New System.IO.StreamReader(_wResp.GetResponseStream())
                _respStr = _sr.ReadToEnd()
                _sr.Close()
                _wResp.Close()
        
    ça marche bien Merci
    • Marqué comme réponse Yanese vendredi 24 février 2012 10:40
    vendredi 24 février 2012 10:38