2012-04-30 3 views
0

POST 로그인 인증이 필요한 웹 사이트의 스크린 스크랩을 시도하고 있습니다. 첫 번째 요청에서 인증을받을 수 있지만 다음 페이지로 돌아가려고하면 로그인 페이지로 리디렉션됩니다 (기본적으로 로그인하지 않은 것입니다).HttpWebRequest를 사용하여 여러 페이지에 액세스

코드 :

Public Function GetPage(ByVal PageName As String, ByVal UserName As String, ByVal Password As String) As String 
    Dim ReturnString As String = "" 
    Dim Cookies As New CookieContainer 
    Dim AuthURI As Uri = New Uri(AuthURL) 
    Cookies.GetCookieHeader(AuthURI) 
    Cookies.GetCookies(AuthURI) 

    'Set Header/Meta Info 
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 
    Dim request As HttpWebRequest = HttpWebRequest.Create(AuthURL) 
    request.Method = "POST" 
    request.CookieContainer = Cookies 
    request.UserAgent = "Mozilla/5.0 (Windows; U;Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" 

    'Set POST Info 
    Dim postData As String = "userName=" & HttpUtility.UrlEncode(UserName) & "&password=" & HttpUtility.UrlEncode(Password) 
    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData) 
    request.ContentType = "application/x-www-form-urlencoded" 
    request.ContentLength = byteArray.Length 

    'Write to the request stream 
    Dim dataStream As Stream = request.GetRequestStream() 
    dataStream.Write(byteArray, 0, byteArray.Length) 
    dataStream.Close() 

    ' Get the response. 
    Dim response As HttpWebResponse = request.GetResponse() 
    dataStream = response.GetResponseStream() 
    Dim reader As New StreamReader(dataStream) 
    Dim responseFromServer As String = reader.ReadToEnd() 
    ReturnString = responseFromServer 

    'Append cookie data 
    For Each c As Cookie In response.Cookies 
     Cookies.Add(c) 
    Next 

    ' Clean up the streams. 
    reader.Close() 
    dataStream.Close() 
    response.Close() 

    'Bail on fail 
    If ReturnString.Contains("Login failed") Then Return Nothing 

    'Generate new request 
    request = HttpWebRequest.Create(URLStub & PageName) 
    request.Method = "POST" 
    request.UserAgent = "Mozilla/5.0 (Windows; U;Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" 
    request.CookieContainer = Cookies 

    'Set POST Info 
    postData = "userName=" & HttpUtility.UrlEncode(UserName) & "&password=" & HttpUtility.UrlEncode(Password) 
    byteArray = Encoding.UTF8.GetBytes(postData) 
    request.ContentType = "application/x-www-form-urlencoded" 
    request.ContentLength = byteArray.Length 

    'Write to the request stream 
    dataStream = request.GetRequestStream() 
    dataStream.Write(byteArray, 0, byteArray.Length) 
    dataStream.Close() 

    'Get the response. 
    response = request.GetResponse 
    dataStream = response.GetResponseStream 
    reader = New StreamReader(dataStream) 
    responseFromServer = reader.ReadToEnd 
    ReturnString = responseFromServer 

    'Clean up the streams. 
    reader.Close() 
    dataStream.Close() 
    response.Close() 

    Return ReturnString 
End Function 

이 코드를 모방 PHP로 작성된 다른 페이지. PHP 코드 페이지가 작동하고 PHP 버전과 동일한 URL을 사용하고 있으므로 문제가 서버쪽에 있지 않음을 99 % 정도 확신합니다.

또한이 문제와 관련하여 다른 게시물을 훑어 본 결과 인 것처럼 보입니다. 모든 구문을 올바로 처리하고 있지만 어쩌면 작고 어리석은 것을 놓친 것일까 요?

아이디어가 있으십니까? 나는 지금 이틀 동안이 싸움을 해왔다. 미리 감사드립니다. :)


편집 : 내가 세션 쿠키 놀았 던 초기 로그온 및 실제 요구 사이에 비교되었다. 여기에 내가있어 무엇 :

FIRST: 
ORA_WX_SESSION: "1FAA2AB1EF40DF4BC291DD3326F1DC3C596F56CF-2#3" 
JSESSIONID: a2c38b128e1e54051a2c95c5a3a1e3a4cb0cb5b7ba74cd260aaec531856d722f.e34SahmMbNaMe34Sa3yPaN8Sc40 
XYZCustomerServiceUserName: (login-name) 
XYZ: d53f8dcd87b861a61d99ac21ec53bb2b 

LAST: 
ORA_WX_SESSION: 1FAA2AB1EF40DF4BC291DD3326F1DC3C596F56CF-2#3 
JSESSIONID: a2c38b128e1e54051a2c95c5a3a1e3a4cb0cb5b7ba74cd260aaec531856d722f.e34SahmMbNaMe34Sa3yPaN8Sc40 

나는 두 가지를 알 ... 먼저 ORA_WX_SESSION (나는 응답과 요청 사이에 다시 그들을 강제로 시도 할 경우에도) 그것에서 제거의 따옴표가있다. 또한 XYZCustomerServiceUserName 및 XYZ 값이 제거됩니다. 그 이외의 세션 정보는 두 연결 시도간에 동일합니다.

+0

나는 당신이 데리러 오지 않는다는 응답으로 뭔가가 돌아오고 있다고 생각합니다. – Paparazzi

답변

0

당신이 로그 아웃하게 만드는 것은 서버가 당신에게 원하는 것이며 당신이 제공하지 않은 것일 수 있습니다. 우리는 System.Net 클래스를 사용하여 몇 가지 자동화를 만들었으며 가장 좋은 방법은 Watin 또는 Selenium을 사용하는 것으로 나타났습니다. 우리는 Watin을 사용하고 있습니다. 이러한 도구를 사용하면 서버 측에서 간단한 변경의 영향을받지 않습니다.

관련 문제