Браузер как объект который можно создать

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Реакции
14
Баллы
18
Здравствуйте уважаемая администрация!

Столкнулся с проблемкой и в принципе не впервые.

Опять надо создать программу которая будет иметь возможность управлять несколькими браузерами. У каждого из браузер свои настройки (прокси, разрешение экрана, видимая область экрана, в общем свой профиль) свои отдельные друг от друга файлы кэша и кукисов и все остальное отдельное друг от друга (evercookie и flashcookie например).

Насколько я понимаю сейчас все так и есть, только вот созданием нового отдельного браузера занимаеться сам ЗенноПостер, а не програмист и это порождает ряд трудностей. Для обмена данными между этими браузерами приходиться придумывать какие-то непонятные костыли в виде связки через БД (каждый поток реагирует на изменения в БД и видя команду в БД например start{9} стартует функцию под номером 9 например) вместо того чтобы делать это через колбэки в рамках одной программы.

Для сохранения условий ограничения потоков на разные версии программы можно в объекте Browser создать свойство с подсчетом количества запущеных браузеров.

Програмист я далеко не топовый, поэтому не пинайте если идея вам кажется труднореализуемой.

В C# есть прекрасная возможность создавать Tasks / Threads и другие интересные вещи для многопотока, а также Делегаты и События помогут сделать многопоточную программу намного лучше и удобнее (и без костылей). Только вот возможности все это применить пока не вижу.

Благодарю за внимание! С уважением, Олег.
 
Отпишитесь пожалуйста можно ли ожидать подобное решение. Если да - то приблизительно когда?

Пока для моих целей больше другой продукт подходит. У вас же с fingerprint'ами намного лучше...
 
Мне кажется о чем вы написали это как раз Входные настройки а не колбеки... А для событий - есть диспетчер заданий.
>>В C# есть прекрасная возможность создавать Tasks / Threads и другие интересные вещи для многопотока
Смысл как раз не писать это вручную... Вы документацию смотрели? Там есть есть нормальное описание как работать с instance. Хотя может вы про маршалинг инстансов - ну было тоже неплохо....Короче что надо не понятно - зенка это менеджер он и должен управлять потоками. Событийная модель тоже бы неплохо смотрелась в рамках диспетчера и проектов - чтобы можно было задавать события в менеджере с привязкой к конкретным экшенам в проектах и ветвям по ID и в проектах вызывать события. Как раз ваши колбеки/делегаты почти... Только делать это куча времени.....

А для обмена данными я бы тоже предложил че нить сгородить .. например Shared Objects или Queue - они будут в 100 раз быстрее работать, чем база и раз в 1000 быстрей , чем таблицы.списки.

Апну... что-ли... Вроде как тема про сетевой стек.
 
Последнее редактирование:
Смысл как раз не писать это вручную... Вы документацию смотрели? Там есть есть нормальное описание как работать с instance.

С этого места поподробней.

Документацию читать - читал, но возможно не все корректно понял.

Итак задача. Написать код таким образом чтобы конечная программа оперировала 2-3-10-ю браузерами с различными настройками (прокси, кэш/куки, в общем каждый из них какбуд-то открыт на разных компах).

Создав в рамках одной программы 2-3-10 инстансов я добъюсь поставленой задачи? И смогу оперировать 2-3-10-ю разными браузерами?

Код:
Развернуть Свернуть Копировать
// create a new instance
Instance instance = new Instance("127.0.0.1", 40500, "server");

// create a new instance2
Instance instance2 = new Instance("127.0.0.1", 40501, "server");

// create a new instance3
Instance instance3 = new Instance("127.0.0.1", 40502, "server");

Вот таким образом я создам 3 браузера?

P.S. Извините за много текста.
P.S.S. Вот я глупец если не заметил эту возможность. Мне казалось работая в 10 потоков надо 10 потоков в ЗенноПостере задавать каждый из которых являеться отдельным браузером, но в то же время не взаимодействует напрямую друг с другом и не имеет возможности осуществить это взаимодействие.
 
Overloaded. Saves fonts. The method needs isolated process, because it is applied to all instances in the process.

То есть инстансы надо в отдельных Tasks/Threads запускать?

Или "isolated process" это и есть поток именно ЗенноПостера, а не програмный?
 
Overloaded. Saves fonts. The method needs isolated process, because it is applied to all instances in the process.

То есть инстансы надо в отдельных Tasks/Threads запускать?

Или "isolated process" это и есть поток именно ЗенноПостера, а не програмный?
вероятно речь идёт о выделенном процессе на поток. В настройках шаблона нужно отметить галку
 
вероятно речь идёт о выделенном процессе на поток. В настройках шаблона нужно отметить галку
Уважаемый Doc это ведь настройки Зеннопостера. Они будут распространяться на програмно созданный instance?
 
Увы, тут ничего сказать не могу
Пробую вот так:

Код:
Развернуть Свернуть Копировать
public static int Execute(Instance instance, IZennoPosterProjectModel project)
        {
            instance.ClearCookie();

            Tab tab = instance.ActiveTab;
            if ((tab.IsVoid) || (tab.IsNull)) return -1;
            if (tab.IsBusy) tab.WaitDownloading();
            tab.Navigate("http://zennolab.com/ru/", "");
            if (tab.IsBusy) tab.WaitDownloading();
           
            Instance instance2 = new Instance("127.0.0.1", 40510, "server");
            Tab tab2 = instance2.ActiveTab;
            if ((tab2.IsVoid) || (tab2.IsNull)) return -1;
            if (tab2.IsBusy) tab2.WaitDownloading();
            tab2.Navigate("http://zennolab.com/discussion/threads/brauzer-kak-obekt-kotoryj-mozhno-sozdat.44352/#post-329459", "");
            if (tab2.IsBusy) tab2.WaitDownloading();
           
                       
            return 0;
        }

И ничего не происходит. В КодКриэйторе работает только первый инстанс. В ЗенноПостере выдает ошибку (возможно из-за того что Зенка у меня однопоточная)
 
Пробую вот так:

Код:
Развернуть Свернуть Копировать
public static int Execute(Instance instance, IZennoPosterProjectModel project)
        {
            instance.ClearCookie();

            Tab tab = instance.ActiveTab;
            if ((tab.IsVoid) || (tab.IsNull)) return -1;
            if (tab.IsBusy) tab.WaitDownloading();
            tab.Navigate("http://zennolab.com/ru/", "");
            if (tab.IsBusy) tab.WaitDownloading();
          
            Instance instance2 = new Instance("127.0.0.1", 40510, "server");
            Tab tab2 = instance2.ActiveTab;
            if ((tab2.IsVoid) || (tab2.IsNull)) return -1;
            if (tab2.IsBusy) tab2.WaitDownloading();
            tab2.Navigate("http://zennolab.com/discussion/threads/brauzer-kak-obekt-kotoryj-mozhno-sozdat.44352/#post-329459", "");
            if (tab2.IsBusy) tab2.WaitDownloading();
          
                      
            return 0;
        }

И ничего не происходит. В КодКриэйторе работает только первый инстанс. В ЗенноПостере выдает ошибку (возможно из-за того что Зенка у меня однопоточная)
я не знаю что как, но тоже думаю, что в однопотоке с несколькими инстансами не поработать. Иначе какой бы был смысл в версиях зп
 
Я правильно понимаю, что вы хотите запустить многопоток в однопоточной Лайт версии? :-)
 
Для создания инстанса нужно пользоваться ZennoPoster.GetNewInstance
Он вернет уже параметры для Instance instance = new Instance("127.0.0.1", 40500, "server");
т.е. вместо "127.0.0.1", 40500, "server" нужно ставить то что возвращает ZennoPoster.GetNewInstance
и можно с ним работать.
 
  • Спасибо
Реакции: volody00
Для создания инстанса нужно пользоваться ZennoPoster.GetNewInstance
Он вернет уже параметры для Instance instance = new Instance("127.0.0.1", 40500, "server");
т.е. вместо "127.0.0.1", 40500, "server" нужно ставить то что возвращает ZennoPoster.GetNewInstance
и можно с ним работать.
Тогда есть более хитрый вопрос: а как его закрыть по завершению действий?
 
Я правильно понимаю, что вы хотите запустить многопоток в однопоточной Лайт версии? :-)
Да, все верно. Я пытаюсь создать новый Instance "в однопоточной Лайт версии". Это и есть единственная моя проблема? То есть в многопоточной версии программы все будет работать корректно?

Сейчас попробую через ZennoPoster.GetNewInstance.
 
Код:
Развернуть Свернуть Копировать
public static int Execute(Instance instance, IZennoPosterProjectModel project)
        {
            instance.ClearCookie();

            Tab tab = instance.ActiveTab;
            if ((tab.IsVoid) || (tab.IsNull)) return -1;
            if (tab.IsBusy) tab.WaitDownloading();
            tab.Navigate("http://zennolab.com/ru/", "");
            if (tab.IsBusy) tab.WaitDownloading();
           
            var url = "127.0.0.1";
            var port = 40510;
            var address = "server";
            // Gets parameters of instance
            ZennoPoster.GetNewInstance(out url, out port, out address);
           
            Instance instance2 = new Instance(url, port, address);
            Tab tab2 = instance2.NewTab("zennolab");
            if ((tab2.IsVoid) || (tab2.IsNull)) return -1;
            if (tab2.IsBusy) tab2.WaitDownloading();
            tab2.Navigate("http://zennolab.com/discussion/threads/brauzer-kak-obekt-kotoryj-mozhno-sozdat.44352/#post-329459", "");
            if (tab2.IsBusy) tab2.WaitDownloading();
                       
            return 0;
        }

Попробовал запустить код с использованием Вашего совета, теперь проект при запуске в ЗенноПостере не выдает ошибку (не удалось воспроизвести проект), но и никак не может завершиться (предполагаемо из-за однопоточной версии программы).
 
Тогда есть более хитрый вопрос: а как его закрыть по завершению действий?
ZennoPoster.ReleaseInstance
Код:
Развернуть Свернуть Копировать
public static int Execute(Instance instance, IZennoPosterProjectModel project)
        {
            instance.ClearCookie();

            Tab tab = instance.ActiveTab;
            if ((tab.IsVoid) || (tab.IsNull)) return -1;
            if (tab.IsBusy) tab.WaitDownloading();
            tab.Navigate("http://zennolab.com/ru/", "");
            if (tab.IsBusy) tab.WaitDownloading();
         
            var url = "127.0.0.1";
            var port = 40510;
            var address = "server";
            // Gets parameters of instance
            ZennoPoster.GetNewInstance(out url, out port, out address);
         
            Instance instance2 = new Instance(url, port, address);
            Tab tab2 = instance2.NewTab("zennolab");
            if ((tab2.IsVoid) || (tab2.IsNull)) return -1;
            if (tab2.IsBusy) tab2.WaitDownloading();
            tab2.Navigate("http://zennolab.com/discussion/threads/brauzer-kak-obekt-kotoryj-mozhno-sozdat.44352/#post-329459", "");
            if (tab2.IsBusy) tab2.WaitDownloading();
                     
            return 0;
        }

Попробовал запустить код с использованием Вашего совета, теперь проект при запуске в ЗенноПостере не выдает ошибку (не удалось воспроизвести проект), но и никак не может завершиться (предполагаемо из-за однопоточной версии программы).
Видимо надо закрыть инстанс по завершении действий, как выше говорят)
 
Добавил в конце строчки:

Код:
Развернуть Свернуть Копировать
// Release the instance on the known port
            ZennoPoster.ReleaseInstance(url, port, address);

Все ровно зависло и висит себе.
Я подозреваю что @amyboose знает хитрый ответ)
 
Код:
Развернуть Свернуть Копировать
ZennoPoster.GetNewInstance(out url, out port, out address);
А вот в КодКриэйторе на этой строчке ошибку тайм-аута выдало.
 
Последнее редактирование:
""Во время операции запроса в net.pipe://localhost/ZP_InstanceManager/InstanceManager ответ не был получен в течение настроенного времени ожидания (00:20:00). Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. Это может быть связано с тем, что служба продолжает обработать операцию, или с тем, что службе не удалось отправить ответное сообщение. Увеличьте значение тайм-аута операции (путем привода канал/прокси в IContextChannel и изменения свойства OperationTimeout), а также убедитесь, что службв способна подключиться к клиенту.""

Это CodeCreator выдает. Я так понимаю в ЗенноПостере все нормально должно быть?
 
""Во время операции запроса в net.pipe://localhost/ZP_InstanceManager/InstanceManager ответ не был получен в течение настроенного времени ожидания (00:20:00). Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. Это может быть связано с тем, что служба продолжает обработать операцию, или с тем, что службе не удалось отправить ответное сообщение. Увеличьте значение тайм-аута операции (путем привода канал/прокси в IContextChannel и изменения свойства OperationTimeout), а также убедитесь, что службв способна подключиться к клиенту.""

Это CodeCreator выдает. Я так понимаю в ЗенноПостере все нормально должно быть?
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
 
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
Код:
Развернуть Свернуть Копировать
ZennoPoster.GetNewInstance(out url, out port, out address);
На этой строчке останавливает.
 
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
Вот что я могу сказать
1) При желании теоретически можно открывать 100500 новых браузеров даже в ПМ
2) На практике после открытия штук 5 примерно дальнейшее открытие не приводит к успеху и последующему открытию браузеров (внутри ПМ даже создавал кучу браузеров в то время, когда в другом месте работал зеннопостер)
3) Даже если новое окно браузера открыто и работает, то оно не закрывается никак (не нашел метода закрытия его)
4) Когда я во всём этом копался, у меня не было достаточно времени изучить всю суть и причину проблем, так что я отложил это всё на неопределенное время, поэтому подсказать не могу.
5) Я думал, что это закрытая тема и её используют только те, кто владеет в достаточной степени C#
 
  • Спасибо
Реакции: djaga
Вопрос к автору, к чему такие сложности? Зачем самостоятельно запускать инстансы, когда они сами запустятся сколько нужно при выполнении шаблона в многопотоке?
 
Ну вот допустим я хочу запустить всего 50 выполнений и у каждого шаблона по 8 фаз, при этом на каждой фазе надо дожидаться одновременного выполнения ровно 10 потоков, потом переходить на следующую фазу, а на предыдущую фазу пускать 10 других браузеров. Таким образом надо синхронизировать работу определенного количества браузеров. Вот один из примеров использования.
P.S.: есть несколько способов решить проблему по-другому, но они костыльные, плюс не обеспечивают некоторого дополнительного функционала, который бы мне пригодился
 
Вопрос к автору, к чему такие сложности? Зачем самостоятельно запускать инстансы, когда они сами запустятся сколько нужно при выполнении шаблона в многопотоке?
Попытаюсь доступно объяснить.

Проблема наверное в слове "шаблон")) Мне нужно именно самостоятельно функционирующую программу (а не шаблон) которая сможет запускать новые браузеры и оперировать ими. То есть запустить Браузер_1 и Браузер_2 и когда наступит определенное событие программа должна решить какому из браузеров и какую команду отдать.

Отдельные браузеры нужны для того чтобы через прокси и другие настройки (подмена канваса, шрифтов) сделать практически невозможным связку Браузера_1 с браузером 2. То есть на целевом сайте не должны догадываться что действия делает один и тот же человек (а тем более машина).

Поэтому удобно было бы создать програмно два браузера, запихнуть их управление в разные Tasks C#, а в управлении подписаться браузерами на некие события которые мы и будем вызывать из основной программы (в то время как браузеры у нас в Tasks крутятся, ожидают запроса на какие-либо действия).

Как-то так.
 
Плюс Браузер_1 и Браузер_2 должны парсить и хранить некоторую информацию, которая также влияет на то какой из браузеров будет выбран для выполнения действия. И вот тут возникает новая проблема в том чтобы обмениваться информацией между Браузером_1 и Браузером_2.

Придеться создавать таблицы в БД куда браузеры будут сгружать информацию. Создавать отдельную программу которая будет анализировать эту информацию и через ту же БД отдавать команду какому-либо из браузеров. То есть каждый из браузеров должен мониторить изменения в БД и смотреть не отдали ли им команду?

Я это так вижу если через костыли делать.
 
А в варианте с цельной программой все данные хранятся в переменных (объекта или структуры или просто в переменной) и не надо себе парить голову. Просто пишешь функцию на сравнение этих данных и все, сравниваешь и выбираешь тот или иной метод для браузера который победил в результате сравнения данных (даже в Tasks ничего засовывать не надо получается)
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)