5

Outlook VBA でマクロを使用して、POST 経由でファイルを URL に送信しています。

Set http = New WinHttp.WinHttpRequest
http.Open "POST", UrlToPostTo, False    'True                                          '
http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
http.setRequestHeader "Content-Type", "multipart/form-data; "
http.Send data

私の問題は、リクエストを受け入れるページ (この場合はファイル アップロード ページ) が認証によって保護されていることです。上記の最初のリクエストでは、ページ自体ではなくログイン ページが返されます。

ログインページが表示されるかどうかを検出しようとしましたが、表示されている場合は、ユーザー名とパスワードをフォーム変数として投稿します (これは、人間が Web ブラウザーのページにユーザー名とパスワードを入力するのと同等であることを願っています)。

手順は次のとおりです。
* URL をリクエストします (投稿にファイルを含めます)。
* 応答がログイン ページかどうかを確認します。
* その場合、同じ http セッションで、ユーザー名とパスワードを URL に送信します。
* サーバーが元の投稿を処理するようになった場合は問題ありません。そうでない場合は、再度投稿できます。

コードは次のようになります。

' if the login page comes back, send credentials                                     '
If (InStr(http.ResponseText, "j_password") > 0) Then

    Dim loginData As String
    loginData = "j_username=theusername&j_password=thepassword"

    http.Open "POST", UrlToPostTo, False
    http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    http.setRequestHeader "Content-Type", "multipart/form-data; "
    http.Send loginData
End If

しかし、私がこれを行うと、 http.Responsetext はログインページのままです (または再び?)。

私が間違っていることは何か分かりますか?私の計画は有効ですか?

(これは、この問題を解決しようとすることに関連しています)

4

4 に答える 4

10

私はこのスレッドが古いことを知っており、OPが間違いなくずっと前に移動したことを認識しています. 私は 3 晩の大部分をこのまったく同じ問題に謙虚に過ごしました。さらに調査するのをやめたときにこのスレッドが立て続けに出てきたので、次に来る人のために貢献しようと思いました。

トリックは次のとおりです。

  • Optionプロパティを使用してリダイレクトを無効にし、あなたなしで移動しないようにします。(以下のコメントを参照)
  • Statusプロパティの出力でリダイレクトをキャプチャし、そこから処理します。

他の方法もあると思いますが、これは私にはかなりエレガントに思えました。また、他にも多くの使用方法を見つけました。

OPs コード例を使用するには、1 つの例外を除いて、計画どおりにリクエストを行うことができます: EnableRedirects 変数は、接続を開いた後に来る必要があります (どこにも読み取れず、閉じられた接続に固執することができませんでした)。 .

頑張れ「次男」!

    Dim http As WinHttp.WinHttpRequest
    Dim UrlToPostTo As String, UrlRedirectedTo As String

    'Your initial request (assuming lots here)
    Set http = New WinHttp.WinHttpRequest
    http.Open "POST", UrlToPostTo, False
    'Stop it from redirecting automatically, so you can capture it
    http.Option(WinHttpRequestOption_EnableRedirects) = False 'You can also use the collection index instead of the pretty name
    http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    http.setRequestHeader "Content-Type", "multipart/form-data; "
    http.Send

    'Now if you have an active session, you should get your desired content
    'If it redirected you, you'll have a different status, header etc...    

    If http.status = "302" Then
        Dim loginData As String
        'Now lets find out where we're being pointed and POST there
        'This may not be the same url you see in your address bar 
        UrlRedirectedTo = http.GetResponseHeader("Location")
        'Also, you may have to do this again to arrive back at the intended resource    
        loginData = "j_username=theusername&j_password=thepassword"
        http.Open "POST", UrlRedirectedTo, False
        http.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
        http.setRequestHeader "Content-Type", "multipart/form-data; "
        http.Send loginData
    End If

MSDN の迷路で役に立つと思った情報。

WinHttpRequest オプション (MSDN)

WinHttpRequest オブジェクト (MSDN)

Cookie 処理 WinHttp (MSDN)

于 2015-04-04T00:59:54.413 に答える
0

ユーザー名とパスワードを Cookie に保存して、ページに直接アクセスできるようにすることもできます。

    Dim doc As WinHttp.WinHttpRequest
    Set doc = New WinHttpRequest

    doc.Open "POST", url, False

    doc.SetRequestHeader "Cookie", "UserID=" & username
    doc.SetRequestHeader "Cookie", "Password=" & password

サーバー上の変数名を確認する必要があります。IEHTTPHeadersなどのツールを使用して、ブラウザーからページにアクセスするときにヘッダーを調べて、何をする必要があるかを確認できます。

于 2010-01-27T11:14:59.750 に答える
0

SetCredentialsを試してみてください。たとえば、次のように機能する場合があります。

http.Open "POST", UrlToPostTo, False
http.SetCredentials "YourUsername", "YourPassword", 0
http.Send

ソース: http://www.automateexcel.com/2005/02/11/excel_vba_winhttprequest_with_login_and/

于 2011-09-20T06:57:01.130 に答える
0

ログオン ページは、最初に送信したページと同じ URL にありますか? 変更されるコードが表示されないurlToPostTo

最初の送信後、Statusリクエストのプロパティを確認することをお勧めします。各ステータス コードの意味については、RFCを参照してください。GetAllResponseHeadersまた、この方法を使用して、何が起こっているのかを正確に理解するのにも役立ちます。詳細については、 MSDNを参照してください

于 2009-05-21T17:49:04.273 に答える