加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何设置每个TWebBrowser使用独立代理?

发布时间:2020-12-15 09:50:40 所属栏目:大数据 来源:网络整理
导读:我找到了各种关于如何让TWebBrowser使用代理的 examples(如202.8.128.5:8080). 但是,所有这些示例都是为所有正在运行的TWebBrowser实例全局更改代理.我有两个例子.如何为每个浏览器设置不同的代理? 解决方法 这可以使用以下代码(公共代码,而不是我的代码)来
我找到了各种关于如何让TWebBrowser使用代理的 examples(如202.8.128.5:8080).
但是,所有这些示例都是为所有正在运行的TWebBrowser实例全局更改代理.我有两个例子.如何为每个浏览器设置不同的代理?

解决方法

这可以使用以下代码(公共代码,而不是我的代码)来实现:

{$DEFINE DELPHI2009_UP}

function SetProxy(Server: String): Boolean;
// Server z.B. '127.0.0.1:8080' oder ''
type
  INTERNET_PER_CONN_OPTION = record
    dwOption: DWORD;
    Value: record case Integer of 1: (dwValue: DWORD);
    2: (pszValue: {$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PAnsiChar{$ENDIF});
    3: (ftValue: TFileTime);
  end;

end;
LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
INTERNET_PER_CONN_OPTION_LIST = record dwSize: DWORD;
pszConnection:
LPTSTR;
dwOptionCount:
DWORD;
dwOptionError:
DWORD;
pOptions:
LPINTERNET_PER_CONN_OPTION;
end;
LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST;

const
  INTERNET_PER_CONN_FLAGS = 1;
  INTERNET_PER_CONN_PROXY_SERVER = 2;
  INTERNET_PER_CONN_PROXY_BYPASS = 3;
  INTERNET_PER_CONN_AUTOCONFIG_URL = 4;
  INTERNET_PER_CONN_AUTODISCOVERY_FLAGS = 5;
  PROXY_TYPE_DIRECT = $00000001;
  PROXY_TYPE_PROXY = $00000002;
  PROXY_TYPE_AUTO_PROXY_URL = $00000004;
  PROXY_TYPE_AUTO_DETECT = $00000008;
  INTERNET_OPTION_REFRESH = 37;
  INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
  INTERNET_OPTION_SETTINGS_CHANGED = 39;

var
  OptionsList: INTERNET_PER_CONN_OPTION_LIST;
  BufSize: DWORD;
  HInternet: Pointer;
  Agent: String;

begin
  Result := False;
  BufSize := SizeOf(OptionsList);
  OptionsList.dwSize := BufSize;
  OptionsList.pszConnection := nil; // nil -> LAN,sonst Verbindungsname
  OptionsList.dwOptionCount := 3; // 3 Optionen werden gesetzt
  OptionsList.pOptions := AllocMem(3 * SizeOf(INTERNET_PER_CONN_OPTION));
  try
    if not Assigned(OptionsList.pOptions) then
      EXIT;
    OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_FLAGS;
    OptionsList.pOptions^.Value.dwValue := PROXY_TYPE_DIRECT or
      PROXY_TYPE_PROXY;
    inc(OptionsList.pOptions);
    OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_PROXY_SERVER;
    OptionsList.pOptions^.Value.pszValue := PChar(Server);
    inc(OptionsList.pOptions);
    OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_PROXY_BYPASS;
    OptionsList.pOptions^.Value.pszValue := 'local';
    dec(OptionsList.pOptions,2);
    Agent := ExtractFileName(Application.ExeName);
    HInternet := InternetOpen
      ({$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PAnsiChar{$ENDIF}
      (Agent),INTERNET_OPEN_TYPE_DIRECT,nil,0);
    try // Optionen setzen
      Result := InternetSetOption(HInternet,INTERNET_OPTION_PER_CONNECTION_OPTION,@OptionsList,BufSize);
      InternetSetOption(HInternet,INTERNET_OPTION_REFRESH,0);
    finally
      InternetCloseHandle(HInternet);
    end;
  finally
    FreeMem(OptionsList.pOptions); // Speicher freigeben
  end;
end;

>在表单上删除两个TWebBrowser组件和两个TButton
> TWebBrowser组件将具有默认名称WebBrowser1和WebBrowser2
> twoTButton将具有默认名称Button1和Button2
>将WinInet添加到您的uses子句中

在Button1中调用上面的函数

Button1 OnClick事件的代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
SetProxy('ip:port');
WebBrowser1.Navigate('www.whatismyipaddress.com');
end;

Button2 OnClick事件的代码:

procedure TForm1.Button2Click(Sender: TObject);
begin
SetProxy('ip:port');
WebBrowser2.Navigate('www.whatismyipaddress.com');
end;

以下是它的外观:

enter image description here

左边是带有代理的WebBrowser1,右边是带有不同代理的WebBrowser2 – 两个浏览器都在同一个应用程序中,显然它们都有效.我还在应用程序运行时从我的常规浏览器(Chrome)访问了该地址,它确实显示为使用我的原始连接.

所以,它的工作原理. WebBrowser组件正在使用其分配的代理,而我的电脑上的浏览器不受影响(未使用任何一个代理)

刚刚使用Rad Studio 10.2 Tokyo对此进行了测试.
祝好运 :)

UPDATE

正如注释中所强调的那样,设置将用于导航的代理,而不是在设计时或用于导航的按钮中设置代理的方法是使用TStringList并从文件中加载它(例如.txt. ).这可以在TWebBrowser OnBeforeNavigate2事件中使用.

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL,Flags,TargetFrameName,PostData,Headers: OleVariant; var Cancel: WordBool);

var
proxylist: TStringList;

begin
proxylist:= TStringList.Create;
proxylist.LoadFromFile('proxylist.txt');
SetProxy(proxylist.Strings[0]); //adds the proxy from the 1st line in the txt
proxylist.Free;
end;

在应用程序文件夹中创建一个名为proxylist的.txt文件,并在那里编写代理.

现在,在开始导航之前,您将拥有TWebBrowser的代理集.无论哪种方式,我相信有很多方法可以扩展它,所以要运用你的想象力.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读