2

問題の解決に役立つ可能性のあるあらゆる種類のヘルプに非常に感謝しています。

Excel VBA コードから、HTTPS サイトhttps://redmine.itransition.com/から CSV ファイルをダウンロードして解析する必要があります。WinHTTP を使用してファイルを取得しようとしています。ただし、認証が機能しない理由がわかりません。関連するコードは次のとおりです。

TargetURL = "https://redmine.itransition.com/projects/pmct/time_entries.csv"
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Option(4) = 13056 ' WinHttpRequestOption_SslErrorIgnoreFlags 13056: ignore all err, 0: accept no err
HTTPReq.Open "GET", TargetURL, False
HTTPReq.SetCredentials "UN", "PW", 0
HTTPReq.send

次の応答を返します (特定の文字列のみがリストされています)。

Content-Type: text/html; charset=utf-8
Status: 406
X-Runtime: 5

ただし、手動認証に成功した後、Firefox Cookie から「Cookie」文字列を送信すると、

HTTPReq.setRequestHeader "Cookie", SetCookieString
HTTPReq.send

期待されるファイルを簡単に取得できます。もちろん、私はそのようなソリューションに満足しておらず、真の WinHTTP 認証を実行したいと考えています。しかし、何が間違っているのか、自分のコードで何が欠けているのか理解できません。ほとんどの場合.SetClientCertificate、メソッドを使用する必要がありますが、これは私には不明です-どの証明書が必要ですか?

または、より一般的に言えば、デバッグにどの WinHTTP メソッドまたは関数を使用して、どのステップがブロックされているか正しくないかを確認し、正しい認証を妨げているのでしょうか? MSDN とさまざまなリソースを 2 週間探しましたが、まだ解決策がありません。

ご提案いただきありがとうございます。

4

3 に答える 3

6

上記の@Alex K.の応答は、まさに私がずっと探していたものでした! Firebug と MSDN の助けを借りて、次の 3 つの要求を完了しました。

  • 正規表現を使用してログインページからauthenticity_tokenデータを収集するGETリクエスト
  • 応答から必要な Cookie 文字列を認証および収集するための POST 要求
  • ついに念願のCSVを取得するGETリクエスト

期待どおりに動作している次のコード:

Set RegX_AuthToken = CreateObject("VBScript.RegExp")
' Below Pattern w/o double-quotes encoded: (?:input name="authenticity_token" type="hidden" value=")(.*)(?:")
RegX_AuthToken.Pattern = "(?:input name=" & Chr(34) & "authenticity_token" & Chr(34) & " type=" & Chr(34) & "hidden" & Chr(34) & " value=" & Chr(34) & ")(.*)(?:" & Chr(34) & ")"
RegX_AuthToken.IgnoreCase = True
RegX_AuthToken.Global = True

TargetURL = "https://redmine.itransition.com/login"

Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Open "GET", TargetURL, False
HTTPReq.Send

Set Token_Match = RegX_AuthToken.Execute(HTTPReq.ResponseText)
AuthToken = Token_Match.Item(0).SubMatches.Item(0)

PostData = "authenticity_token=" & AuthToken & "&back_url=https://redmine.itransition.com/" & "&username=" & UN & "&password=" & PW & "&login=Login »"

HTTPReq.Open "POST", TargetURL, False
HTTPReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
HTTPReq.Send (PostData)

SetCookieString = HTTPReq.GetResponseHeader("Set-Cookie")

TargetURL = "https://redmine.itransition.com/projects/pmct/time_entries.csv"
HTTPReq.Open "GET", TargetURL, False
HTTPReq.setRequestHeader "Cookie", SetCookieString
HTTPReq.Send

次の URL は、POST リクエストの作成に役立ちました: http://tkang.blogspot.com/2010/09/sending-http-post-request-with-vba.html

認証情報なしでそのページをロードし、生成されたフォームから揮発性フィールドのauthenticity_tokenのように見えるものを取得し、それをユーザー名とパスワードとともに/loginに投稿する必要があります。

Alex K.-素晴らしい提案をありがとう!(:

于 2013-01-08T19:28:15.160 に答える
3

https://redmine.itransition.com/でのログオンは、ユーザー名とパスワードを のスクリプトに送信する単なる HTML フォームです/login

SetCredentialsこれは、basic/digest/ntlm などのサーバー ベースの認証方式用に設計されたものとは互換性がありません。

資格情報なしでそのページをロードし、生成されたフォームから volatile フィールドのように見えるものを取得し、authenticity_tokenそれをユーザー名とパスワードとともに に投稿する必要があります/login

セッションベースのシステムの場合、set-cookie ヘッダーと後続のリクエストで使用する必要があるデータで応答します。

于 2013-01-07T11:36:29.570 に答える
0

そして、もう 1 つ (上記の解決策に加えて) 上記のコードに似た POST リクエストを使用する場合に注意する必要があります: 何らかのあいまいな理由で、まだ 4-5 回 (またはそれ以上) に 1 回 (またはそれ以上) 嫌いな 406 を受け取りました。ウェブサイトからの応答。これは、私の場合、認証が完了していないことを意味します。何時間にもわたる段階的なデバッグの後、喜んで原因を突き止めました。認証トークンの値には+兆候がある可能性があり、数十の認証トークン/応答コードの矢印を分析した結果、 - を+含むトークンが 406 コードと正確に一致することがわかりました。

解決策はかなり明白になり+ましたPostDatahttp://www.blooberry.com/indexdot/html/topics/urlencoding.htmの助けを借りて、私は最終的に次のことを思いつきました:

PostData = "authenticity_token=" & Replace(AuthToken, "+", "%2B", vbTextCompare) & _
    "&back_url=https://redmine.itransition.com/projects/" & Trim(RedmineProject) & _
    "/time_entries" & "&username=" & UN & "&password=" & PW & "&login=Login »"

+es は s に置き換えられ%2B、これがそれでした - もう 406 ではありません!)

私の場合、他の特殊文字は問題ではありませんが、教訓が得られました。これが他の誰かのために数時間の命を救うことを願っています!

于 2013-01-10T09:11:53.133 に答える