2017-04-19 3 views
2

Ich möchte Delphi VCL-Komponente TWebBrowser mit Proxy verwenden. Es scheint ziemlich einfach zu sein, so etwas zu tun:Delphi TWebBrowser - wie Proxy mit Login/Passwort zu verwenden?

var PIInfo: PInternetProxyInfo; 
begin 
    PIInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY; 
    PIInfo^.lpszProxy := PAnsiChar('proxyserver.com:8888'); 
    PIInfo^.lpszProxyBypass := PAnsiChar(''); 
    UrlMkSetSessionOption(INTERNET_OPTION_PROXY, PIInfo, SizeOf(Internet_Proxy_Info), 0); 
end; 

Aber ich möchte auch Proxy mit Authentifizierung verwenden. Und hier hatte ich die Probleme. Ich erfuhr, dass es möglich ist, Proxy-Namen und Passwort festlegen WinAPI Funktion InternetSetOption verwendet wird, ein Beispiel unter:

var UserName: AnsiString; 
    ConnectionHandle: HINTERNET; 
begin 
    // Init ConnectionHandle here 
    //... 
    res := InternetSetOption(ConnectionHandle, 
          INTERNET_OPTION_PROXY_USERNAME, 
          UserName, 
          Length(UserName) + 1); 
end; 

ich, dass InternetSetOption gelernt, mit Parametern wie INTERNET_OPTION_PROXY_USERNAME nur mit dem Internet Griff angewandt werden könnten, die wie von Funktionen erzeugt wurden InternetConnect oder HttpOpenRequest.

Eine Antwort dazu finden Sie here.

Es ist kein Problem, ich kann InternetConnect zuerst aufrufen. Es scheint aber nicht möglich zu sein, diesen Internet-Handle an meinen TWebBrowser zu binden. TWebBrowser ignoriert diese Einstellungen, weil sie auf konkrete dedizierte Internet-Handles angewendet wurden.

Also meine Frage: ist es möglich, Proxy mit Authentifizierung im Delphi-Code einzurichten, um es von TWebBrowser zu verwenden?

PS. Eine alternative Option ist, sich an Login-/Passwort-Proxy-Einstellungen zu erinnern, wenn TWebBrowser nach ihnen fragt, aber ich habe mehrfache Logins/Passwörter, also möchte ich sie aus dem Code einrichten.

Danke von Voraus.

+1

http://microsoft.public.inets-dk.programming.webbrowser-ctl.narkive.com/rgz718KC/how-to-pass-proxy-username-password-into-webbrowser-control –

+1

FYI, Ihr erster Codeausschnitt ist falsch. Sie deklarieren einen nicht initialisierten Zeiger, der auf nichts verweist. Sie müssen dies stattdessen verwenden: 'var IInfo: InternetProxyInfo; begin IInfo.dwAccessType: = INTERNET_OPEN_TYPE_PROXY; ... UrlMkSetSessionOption (INTERNET_OPTION_PROXY, @IInfo, SizeOf (IInfo), 0); Ende; ' –

+0

Remy Lebeau, ja, genau. Eigentlich habe ich vergessen, in diesem Snippet auch den Code einzufügen: Neu (PIInfo); ..... Entsorgen (PInfo); –

Antwort

0

Ein Kommentar von David Heffernan zwang mich in die richtige Richtung zu gehen. Auf meine eigene Frage antwortend, falls jemand nach der Antwort sucht, fand ich drei Lösungen dieses Problems.

Alle Codefragmente sind für Delphi XE4 verfügbar.

1. Verwendung von Event-Handler in TWebBrowser.

TWebBrowser hat das Ereignis OnBeforeNavigate2. Die Prozedur dieser Methode enthält das Feld Headers. So können wir eine Methode wie definieren:

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; 
              const pDisp: IDispatch; 
              const URL: OleVariant; 
              const Flags: OleVariant; 
              const TargetFrameName: OleVariant; 
              const PostData: OleVariant; 
              const Headers: OleVariant; 
              var Cancel: WordBool); 
var aHeaders: OleVariant; 
begin 
    if ASender = WebBrowser1 then begin 
    if ALPos('X-StopHandling', Headers) <= 0 then begin 
     aHeaders := Headers + 'Proxy-Authorization: BASIC BASE64_of_login_and_password' + #13#10 + 
          'X-StopHandling: 1' + #13#10; 
     WebBrowser1.Navigate2(URL, Flags, TargetFrameName, PostData, aHeaders); 
     Cancel := true; 
    end; 
    end; 
end; 

... und nach der es auf WebBrowser ...

WebBrowser1.OnBeforeNavigate2 := WebBrowser1BeforeNavigate2; 

Diese Methode zur Verwendung des Header Proxy-Authorization basiert, die Proxy-Anmeldeinformationen zu definieren, ermöglicht die Anfrage. Es wird auch erforderlich sein, zuerst den Proxy-Server und -Port unter Verwendung von UrlMkSetSessionOption wie im ersten Post definiert zu setzen.

2. Mit Header-Parameter in der Methode Navigate2

Navigate2 Method of TWebBrowser unterstützen die Parameter Headers. So können wir beim Aufruf dieser Methode den gleichen Header Proxy-Authorization definieren. Das Problem auf diese Weise ist, dass alle internen Aufrufe von Navigate2 (wie wenn einige Javascript auf der Seite etwas über AJAX aufrufen) ohne diesen Header gehen.

Erste Lösung hat diesen Nachteil nicht.

Ein Code-Snippet ist hier:

var EmptyParam: OleVariant; 
    //... 
begin 

    // init proxy server and port first as described in the first post 
    EmptyParam := System.Variants.EmptyParam; 
    WebBrowser1.Navigate2('http://something', 
         EmptyParam{Flags}, 
         EmptyParam{TargetFrameName}, 
         EmptyParam{PostData}, 
         'Proxy-Authorization: ...' + #13#10); 
end; 

3. eine alternative Komponente verwenden

I Implementierung von Chromium für Delphi (in der aktiven Entwicklung) gefunden - CEF4Delphi. Es basierte auf DCEF3 Bibliothek, die ein wenig zu bleiben scheint.

Es unterstützt Proxy-Einstellungen Schnittstelle out-of-the-Box. Es ist möglich, Proxy-Server, Port, Benutzername und Passwort unter Verwendung grundlegender Eigenschaften des Haupt-Browser-Objekts zu definieren.

Wenn Sie TWebBrowser nicht unbedingt für Ihre Zwecke verwenden, können Sie sich diese Komponente ansehen.

Verwandte Themen