gpt4 book ai didi

Delphi TWebBrowser - 如何使用带有登录名/密码的代理?

转载 作者:行者123 更新时间:2023-12-02 02:26:56 28 4
gpt4 key购买 nike

我想使用带代理的 Delphi VCL 组件 TWebBrowser。做这样的事情似乎很容易:

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;

我了解到带有 INTERNET_OPTION_PROXY_USERNAME 等参数的 InternetSetOption 只能应用于由 InternetConnect 或 HttpOpenRequest 等函数生成的互联网句柄。

关于这个问题的答案可以在 here 找到。 .

这不是问题,我可以先调用 InternetConnect。但将此互联网句柄绑定(bind)到我的 TWebBrowser 后似乎不可能。 TWebBrowser 将忽略这些设置,因为它们应用于具体的专用互联网句柄。

所以我的问题:是否可以在 Delphi 代码中设置带有身份验证的代理以从 TWebBrowser 使用它?

附注。另一种选择是在 TWebBrowser 要求时记住登录名/密码代理设置,但我有多个登录名/密码,所以我想从代码中设置它们。

提前谢谢您。

最佳答案

David Heffernan的评论迫使我朝着正确的方向前进。回答我自己的问题,以防万一有人会寻找答案,我找到了这个问题的三个解决方案。

所有代码片段均可用于Delphi XE4

<强>1。在 TWebBrowser 中使用事件处理程序。

TWebBrowser 有事件 OnBeforeNavigate2。该方法的过程包含字段Headers。所以我们可以定义一些方法,例如:

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;

...并将其应用到 WebBrowser 后...

WebBrowser1.OnBeforeNavigate2 := WebBrowser1BeforeNavigate2;

此方法基于使用 header Proxy-Authorization,该 header 允许为请求定义代理凭据。它还需要首先使用第一篇文章中定义的 UrlMkSetSessionOption 设置代理服务器和端口。

<强>2。在 Navigate2 方法中使用 headers 参数

TWebBrowser的方法Navigate2支持参数Headers。因此我们可以在调用该方法时定义相同的头Proxy-Authorization。这种方式的问题是 Navigate2 的所有内部调用(例如页面上的某些 Javascript 将通过 AJAX 调用某些内容)都将没有此 header 。

第一个解决方案没有这个缺点。

代码片段在这里:

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 的实现(正在积极开发中)- CEF4Delphi 。它基于DCEF3库,似乎还剩下一点。

它支持开箱即用的代理设置界面。可以使用主浏览器对象的基本属性来定义代理服务器、端口、用户名和密码。

因此,如果使用 TWebBrowser 不一定符合您的目的,您可以查看此组件。

关于Delphi TWebBrowser - 如何使用带有登录名/密码的代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43489335/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com