0

POSTログイン認証が必要なWebサイトをスクリーンスクレイプしようとしています。最初のリクエストで正常に認証できますが、振り返って次のページにアクセスしようとすると、ログインページにリダイレクトされます(基本的には、ログインしていないと表示されます)。

コード:

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%確信しています。

また、私はこの問題について他の投稿を精査しました、そして私は構文的にすべてを正しくやっているようです、しかし多分私は小さくて愚かな何かを逃していますか?

何か案は?私はこれと数日間戦ってきました。前もって感謝します。:)


編集:私はセッションCookieで遊んでいて、最初のログオンと実際のリクエストを比較しています。これが私が持っているものです:

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

私は2つのことに気づきました...最初に、ORA_WX_SESSIONは引用符を削除します(応答と要求の間にそれらを強制的に戻そうとしても)。また、XYZCustomerServiceUserNameとXYZの値が削除されます。それ以外は、セッション情報は2回の接続試行間で同一です。

4

1 に答える 1

0

ログアウトさせるのは、サーバーがあなたに望んでいて、あなたが提供していないものなら何でもかまいません。System.Netクラスを使用していくつかの自動化を行いましたが、実行できる最善の方法はWatinまたはSeleniumを使用することです。Watinを使用しています。このようなツールを使用することで、サーバー側の単純な変更の影響を受けません。

于 2012-04-30T16:52:05.443 に答える