使用Watin更改IE实例的代理设置
本文关键字:代理 设置 实例 IE Watin 更改 使用 | 更新日期: 2023-09-27 18:16:16
我知道我可以改变计算机的全局代理设置,Software''Microsoft''Windows''CurrentVersion''Internet Settings
,以影响使用Watin创建的IE实例。
但是有没有办法拦截IE浏览器发出的请求并通过代理运行它们?我的目标是运行多个IE实例,每个实例都有自己的代理,这在我目前的解决方案中是不可能的。
WatiN IE创建多个 processid (单个实例IE创建多个进程id)。为了通过使用Fiddler Core覆盖WatiN的代理设置,我们需要获得由WatiN IE创建的所有子进程id。帮助类可以在这里找到PInvoke:获取窗口的所有子句柄- Svett Ralchev类。然后我们检查 beforeerequest 事件中的所有进程id,并等待等待进程id覆盖代理设置。
private void FiddlerApplication_BeforeRequest(Session sess)
{
//Debug.WriteLine("FiddlerApplication_BeforeRequest: " + sess.LocalProcessID.ToString());
if (WatinIEprocessHolder.ContainsKey(sess.LocalProcessID))
{
//see http://stackoverflow.com/questions/14284256/how-to-manually-set-upstream-proxy-for-fiddler-core
sess["X-OverrideGateway"] = WatinIEprocessHolder[sess.LocalProcessID];
}
}
Working Test Application可以在这里下载http://www.rentanadviser.com/downloads/WatiN-2.1.0.1196.zip
下面是不同匿名代理的测试结果。(ipaddress = browser.Text)
Process Ids:3852,7852,, Your IP address: 119.46.110.17, Proxy:119.46.110.17:8080
Process Ids:2508,6948,, Your IP address: 178.21.112.27, Proxy:178.21.112.27:3128
Process Ids:1348,1368,, Your IP address: 122.96.59.107, Proxy:122.96.59.107:83
Process Ids:7152,5104,, Your IP address: 136.0.16.217, Proxy:136.0.16.217:3127
Process Ids:4128,3480,, Your IP address: 198.52.199.152, Proxy:198.52.199.152:7808
Process Ids:2036,7844,, Your IP address: 122.96.59.107, Proxy:122.96.59.107:82
示例代码:
private void this_FormClosing(object sender, FormClosingEventArgs e)
{
StopFiddler();
}
private void Form1_Load(object sender, EventArgs e)
{
this.FormClosing += this_FormClosing;
ProxyHolder = new List<string>();
ProxyHolder.Add("119.46.110.17:8080");
ProxyHolder.Add("178.21.112.27:3128");
ProxyHolder.Add("122.96.59.107:83");
ProxyHolder.Add("136.0.16.217:3127");
ProxyHolder.Add("198.52.199.152:7808");
ProxyHolder.Add("122.96.59.107:82");
StartFiddler();
System.Threading.Thread.Sleep(500);
for (var i = 0; i < ProxyHolder.Count; i++)
{
WhatIsMyIpThroughProxy(ProxyHolder[i]);
Application.DoEvents();
System.Threading.Thread.Sleep(500);
}
//WhatIsMyIpThroughProxy();
}
private Dictionary<int, string> WatinIEprocessHolder = new Dictionary<int, string>();
private List<string> ProxyHolder = null;
public void WhatIsMyIpThroughProxy(string ProxyIPandPort)
{
using (var browser = new IE(true))// we should not navigate now. Because we need process ids.
{
WindowHandleInfo ChildHandles = new WindowHandleInfo(browser.hWnd);
foreach (var cHandle in ChildHandles.GetAllChildHandles())
{
int pid = new WatiN.Core.Native.Windows.Window(cHandle).ProcessID;
if (WatinIEprocessHolder.ContainsKey(pid) == false)
WatinIEprocessHolder.Add(pid, ProxyIPandPort);
}
System.Text.StringBuilder processIDs = new System.Text.StringBuilder();
foreach (var k in WatinIEprocessHolder.Keys)
{
processIDs.Append(k.ToString() + ",");
//Debug.WriteLine(string.Format("{0}:{1}", k, WatinIEprocessHolder[k]));
}
//we got the process ids above. Navigate now.
browser.GoTo("http://www.rentanadviser.com/en/common/tools.ashx?action=whatismyip");
browser.WaitForComplete();
WatinIEprocessHolder.Clear();
System.Net.IPAddress ip;
if (System.Net.IPAddress.TryParse(browser.Text, out ip))
{
Debug.WriteLine(string.Format("Process Ids:{0}, Your IP address: {1}, Proxy:{2}", processIDs.ToString(), browser.Text, ProxyIPandPort));
}
else
{
Debug.WriteLine(string.Format("Process Ids:{0}, Your IP address: {1}, Proxy:{2}", processIDs.ToString(), "Failed", ProxyIPandPort));
}
}
}
private void StartFiddler()
{
FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;
FiddlerApplication.Startup(8888, true, true, true);
}
private void StopFiddler()
{
FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest;
if (FiddlerApplication.IsStarted())
{
FiddlerApplication.Shutdown();
}
}
private void FiddlerApplication_BeforeRequest(Session sess)
{
//Debug.WriteLine("FiddlerApplication_BeforeRequest: " + sess.LocalProcessID.ToString());
if (WatinIEprocessHolder.ContainsKey(sess.LocalProcessID))
{
//see http://stackoverflow.com/questions/14284256/how-to-manually-set-upstream-proxy-for-fiddler-core
sess["X-OverrideGateway"] = WatinIEprocessHolder[sess.LocalProcessID];
}
}
我创建了一个名为Process Proxifier
的应用程序,它使用FiddlerCore动态地为Windows应用程序添加代理设置。你可以在这里找到它的完整源代码:https://processproxifier.codeplex.com/
我还应该提到,此解决方案仅限于具有系统默认"CERN"代理设置的目标进程(指向Fiddler/FiddlerCore)。
这是不可能的,甚至与IE浏览器(它只是IE的一个实例)。
但是你可以操纵WebBrowser的行为来实现你想要的功能。
可以通过发送包含不同代理的自定义WebRequest来编写获取数据的自定义WebBrowser。
如何使用web响应加载web浏览器
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://example.com");
webRequest.Proxy = new WebProxy(host, port);
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
Stream receiveStream = response.GetResponseStream();
WebBrowser webBrowser = new WebBrowser();
webBrowser.DocumentStream = receiveStream;
WebRequest。代理
我知道你正在寻找an alternative solution without using the computers global proxy setting
,但我想在这里添加这个,以便其他没有此约束的人了解它。
解决方案是在你的问题- Windows注册表。
在运行时全局更改代理设置很简单,您需要更改在Microsoft.Win32
名称空间中使用Microsoft.Win32.Registry
类感兴趣的注册表项。
您可以在这里找到MSDN文档:http://msdn.microsoft.com/en-us/library/microsoft.win32.registry(v=vs.110).aspx
请参见下面的示例。
RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE''Your key", true);
myKey.SetValue("My String Value", "Test Value", RegistryValueKind.String);
现在要更改代理设置,您需要更改或创建正确的代理注册表项,您可以找到所有可用的键:
- MSDN文档- 2.2.1.10 Internet设置。
下面是一些你需要设置的键。每个版本的IE都有自己的密钥,但下面的密钥对所有浏览器都是相同的。
UseProxyServer REG_DWORD
- HKEY_CURRENT_USER ' Software '微软互联网设置' Windows ' CurrentVersion ' ' ProxyEnable
ProxyServerAndPort REG_DWORD
- HKEY_CURRENT_USER ' Software '微软互联网设置' Windows ' CurrentVersion ' ' ProxyServer
ProxyOverride REG_SZ
- HKEY_CURRENT_USER ' Software '微软互联网设置' Windows ' CurrentVersion ' ' ProxyOverride
HTTP1_1ThroughProxy REG_DWORD
- HKEY_CURRENT_USER ' Software '微软互联网设置' Windows ' CurrentVersion ' ' HTTP1_1ThroughProxy
用户特定的
请记住这些是当前用户注册表项,因此您可能需要在windows标识上下文中设置它们。此外,查看这些键的值的最简单方法是在Internet设置对话框中应用代理更改,并在RegEdit.exe上检查它们。
创建用户
这是你的可取之处,因为你可以在本地windows帐户上运行等待进程,这样你就不需要更改自己的代理设置了。
然后您可以有一个名为WatinUser
的用户,代理设置是针对它设置的,您可以使用System.DirectoryServices.AccountManagement命名空间类自动创建此用户。
- 创建本地用户帐户
像Proxifier这样的产品可以让你设置规则,根据应用程序名称、IP地址、主机名和端口号将流量路由到不同的代理。这将不允许您为多个IE进程使用不同的代理,但是如果这些进程访问不同的url,您可以通过单独的代理服务器路由流量。代理程序使用WinSocks堆栈工作,类似于许多反病毒程序使用的堆栈,并且它对应用层是透明的。
另一个建议是编写自己的web请求拦截器/代理服务器,它将从请求的url中获取代理服务器信息,并将规范化的url转发给真正的代理服务器。例如,当你启动url"someurl?ProxyServer=10.10.10.12"时,这将被你自己的代理服务器截获,它将使用代理服务器参数重定向请求的url,即。"someurl"到10.10.10.12您的代理服务器实现可以在运行时设置代理详细信息,并使用动态代理从服务器获取结果。