Delphi TWebBrowser-如何使用带有登录名/密码的代理?
我想使用Delphi VCL组件TWebBrowser和代理。这样做似乎很容易:Delphi TWebBrowser-如何使用带有登录名/密码的代理?,delphi,proxy,twebbrowser,Delphi,Proxy,Twebbrowser,我想使用Delphi VCL组件TWebBrowser和代理。这样做似乎很容易: var PIInfo: PInternetProxyInfo; begin PIInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY; PIInfo^.lpszProxy := PAnsiChar('proxyserver.com:8888'); PIInfo^.lpszProxyBypass := PAnsiChar(''); UrlMkSetSession
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;
但我也希望使用代理进行身份验证。我遇到了麻烦。我了解到,可以使用WinAPI函数InternetSetOption设置代理名称和密码,示例如下:
var UserName: AnsiString;
ConnectionHandle: HINTERNET;
begin
// Init ConnectionHandle here
//...
res := InternetSetOption(ConnectionHandle,
INTERNET_OPTION_PROXY_USERNAME,
UserName,
Length(UserName) + 1);
end;
我了解到,InternetSetOption和InternetOption、PROXY用户名等参数只能应用于InternetConnect或HttpOpenRequest等函数生成的INTERNET句柄
关于这一点,可以找到答案
没问题,我可以先打电话给InternetConnect。但似乎不可能在我的TWebBrowser上绑定这个互联网句柄。TWebBrowser将忽略这些设置,因为它们应用于具体的专用internet句柄
所以我的问题是:是否可以在Delphi代码中设置具有身份验证的代理以从TWebBrowser使用它
PS。另一种选择是,当TWebBrowser请求登录/密码代理设置时,记住它们,但我有多个登录/密码,所以我想从代码中设置它们
提前谢谢。的一条评论迫使我朝着正确的方向前进。在回答我自己的问题时,如果有人在寻找答案,我找到了解决这个问题的三种方法
所有代码片段都可用于Delphi XE4
1。在TWebBrowser中使用事件处理程序。
TWebBrowser在BeforeNavigate2上具有事件。此方法的过程包含字段标题
。因此,我们可以定义一些方法,如:
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;
此方法基于使用允许为请求定义代理凭据的标头代理授权
。还需要首先使用第一篇文章中定义的UrlMkSetSessionOption
设置代理服务器和端口
2。在方法Navigate2中使用headers参数
TWebBrowser的方法Navigate2支持参数Headers
。因此,我们可以在调用此方法时定义相同的头代理授权
。这种方式的问题是,Navigate2的所有内部调用(比如页面上的一些Javascript将通过AJAX调用某些内容)都没有这个头
第一种解决方案没有这个缺点
下面是一段代码片段:
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。使用替代组件
我发现Chromium for Delphi的实现(正在进行开发)——。它是基于DCEF3库的,似乎有点左
它支持现成的代理设置界面。可以使用主浏览器对象的基本属性定义代理服务器、端口、用户名和密码
因此,如果使用TWebBrowser不一定是出于您的目的,您可以查看此组件。FYI,您的第一个代码段是错误的。您正在声明一个未初始化的指针,它不指向任何东西。您需要改用它:var IInfo:InternetProxyInfo;begin IInfo.dwAccessType:=INTERNET\u OPEN\u TYPE\u PROXY。。。UrlMkSetSessionOption(INTERNET_OPTION_PROXY,@IInfo,SizeOf(IInfo),0);结束代码>雷米·勒博,没错。实际上,我忘了在这段代码中添加代码:New(PIInfo)。。。。。处置(PInfo);
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;