Изменить настройку прокси-сервера для экземпляра IE с помощью Watin

Я знаю, что я могу изменить настройки глобального прокси-сервера компьютеров, Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings, чтобы повлиять на экземпляры IE, созданные с помощью Watin.

Но есть ли способ перехватить запросы, сделанные браузерами IE, и запустить их через прокси? Моя цель - запустить несколько экземпляров IE, каждый со своим собственным прокси-сервером, что невозможно с моим текущим решением выше.

Ответ 1

WatiN IE создает несколько ProcessIDs (один экземпляр IE создает несколько идентификаторов процесса). чтобы перезаписать настройки прокси-сервера только для WatiN с помощью Fiddler Core, нам нужно получить все дочерние процессы, созданные WatiN IE. Класс помощника можно найти здесь PInvoke: Получение всех дочерних ручек окна - Светта Ралчева. Затем мы проверяем все идентификаторы процессов внутри события BeforeRequest и ожидаем, что идентификатор процесса watin перезапишет настройки прокси-сервера.

    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];
        }
    } 

Работая тестовое приложение, можно скачать здесь 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];
        }
    }    

Ответ 2

Я создал приложение под названием Process Proxifier, которое использует FiddlerCore для динамического добавления параметров прокси-сервера в приложения Windows. Здесь вы можете найти полный исходный код: https://processproxifier.codeplex.com/

Также следует упомянуть, что это решение ограничено целевыми процессами с настройкой прокси-сервера по умолчанию "CERN" (который указывает на Fiddler/FiddlerCore).

Ответ 3

Это невозможно сделать с IE или даже с WebBrowser (это просто экземпляр IE).

Но вы можете управлять поведением WebBrowser для достижения желаемой функции.

Можно написать свой собственный WebBrowser, который извлекал данные, отправив ваш собственный WebRequest, содержащий ваш другой прокси.

Как загрузить веб-браузер с веб-ответом

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.Proxy

Ответ 4

Я знаю, что вы ищете an alternative solution without using the computers global proxy setting, но я думал добавить это здесь, чтобы другие, у кого этого ограничения, не знали об этом.

Решение было по вашему вопросу - Реестр Windows.

Просто изменить настройки прокси-сервера во время выполнения, вам нужно изменить интересующие вас разделы реестра, используя класс Microsoft.Win32.Registry в пространстве имен Microsoft.Win32.

Вы можете найти документацию 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);

Теперь, чтобы изменить настройки прокси-сервера в окне, вам необходимо изменить или создать нужные ключи реестра прокси-сервера, вы можете найти все доступные ключи по адресу:

Ниже приведены некоторые из ключей, которые вам нужно установить. Каждая версия IE имеет свои собственные ключи, но те, которые указаны ниже, идентичны всем браузерам.

UseProxyServer REG_DWORD

  • HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Windows\CurrentVersion\Настройки Интернета \ProxyEnable

ProxyServerAndPort REG_DWORD

  • HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Windows\CurrentVersion\Настройки Интернета \ProxyServer

ProxyOverride REG_SZ

  • HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Windows\CurrentVersion\Настройки Интернета \ProxyOverride

HTTP1_1ThroughProxy REG_DWORD

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\HTTP1_1ThroughProxy

Пользовательский

Пожалуйста, имейте в виду, что это текущие записи реестра пользователя, поэтому вам может потребоваться установить их в контексте идентификатора Windows. Также самый простой способ увидеть, какие значения должны быть для этих ключей, - применить изменения прокси в диалоговом окне "Параметры Интернета" и проверить их на RegEdit.exe.

Создать пользователя автоматически

Это ваше экономическое благословение здесь, потому что вы можете запустить свой процесс для просмотра в локальной учетной записи Windows с настройками, которые вам не нужны, чтобы изменить собственные настройки прокси.

Затем у вас может быть один пользователь с именем WatinUser, который задает настройки прокси-сервера, и вы можете автоматизировать создание этого пользователя с помощью System.DirectoryServices. Пространство имен AccountManagement.

Ответ 5

Есть такие продукты, как Proxifier, которые позволяют настраивать правила для маршрутизации трафика на разные прокси на основе имен приложений, IP-адресов, имен хостов и номера портов. Это не позволит вам использовать разные прокси-серверы для нескольких процессов IE, но если эти процессы имеют доступ к различным URL-адресам, вы можете маршрутизировать трафик через отдельные прокси-серверы. Proxifier работает с использованием стека WinSocks, похожего на то, что многие используют антивирус, и прозрачно для прикладного уровня.

Ответ 6

Еще одно предложение - написать собственный веб-сервер перехватчика/прокси-сервера, который будет захватывать информацию прокси-сервера из запрошенного URL-адреса и перенаправлять нормализованный URL-адрес на реальный прокси-сервер. например. от watin вы запускаете url "someurl? ProxyServer = 10.10.10.12", теперь это будет перехвачено вашим собственным прокси-сервером, и он будет использовать параметр прокси-сервера для перенаправления запрошенного URL-адреса, то есть "someurl" до 10.10.10.12 ваша реализация прокси-сервера может установить детали прокси во время выполнения и получать результаты с вашего сервера с помощью динамического прокси.

Надеюсь, это имеет смысл.