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

Adamastor

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

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

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

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

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

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

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

Благодарю за внимание! С уважением, Олег.
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Отпишитесь пожалуйста можно ли ожидать подобное решение. Если да - то приблизительно когда?

Пока для моих целей больше другой продукт подходит. У вас же с fingerprint'ами намного лучше...
 

Max

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

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

Апну... что-ли... Вроде как тема про сетевой стек.
 
Последнее редактирование:

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Смысл как раз не писать это вручную... Вы документацию смотрели? Там есть есть нормальное описание как работать с 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 потоков в ЗенноПостере задавать каждый из которых являеться отдельным браузером, но в то же время не взаимодействует напрямую друг с другом и не имеет возможности осуществить это взаимодействие.
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Overloaded. Saves fonts. The method needs isolated process, because it is applied to all instances in the process.

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

Или "isolated process" это и есть поток именно ЗенноПостера, а не програмный?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Overloaded. Saves fonts. The method needs isolated process, because it is applied to all instances in the process.

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

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

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
вероятно речь идёт о выделенном процессе на поток. В настройках шаблона нужно отметить галку
Уважаемый Doc это ведь настройки Зеннопостера. Они будут распространяться на програмно созданный instance?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Увы, тут ничего сказать не могу
Пробую вот так:

Код:
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;
        }
И ничего не происходит. В КодКриэйторе работает только первый инстанс. В ЗенноПостере выдает ошибку (возможно из-за того что Зенка у меня однопоточная)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Пробую вот так:

Код:
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;
        }
И ничего не происходит. В КодКриэйторе работает только первый инстанс. В ЗенноПостере выдает ошибку (возможно из-за того что Зенка у меня однопоточная)
я не знаю что как, но тоже думаю, что в однопотоке с несколькими инстансами не поработать. Иначе какой бы был смысл в версиях зп
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113
Я правильно понимаю, что вы хотите запустить многопоток в однопоточной Лайт версии? :-)
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113
Для создания инстанса нужно пользоваться ZennoPoster.GetNewInstance
Он вернет уже параметры для Instance instance = new Instance("127.0.0.1", 40500, "server");
т.е. вместо "127.0.0.1", 40500, "server" нужно ставить то что возвращает ZennoPoster.GetNewInstance
и можно с ним работать.
 
  • Спасибо
Реакции: volody00

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Для создания инстанса нужно пользоваться ZennoPoster.GetNewInstance
Он вернет уже параметры для Instance instance = new Instance("127.0.0.1", 40500, "server");
т.е. вместо "127.0.0.1", 40500, "server" нужно ставить то что возвращает ZennoPoster.GetNewInstance
и можно с ним работать.
Тогда есть более хитрый вопрос: а как его закрыть по завершению действий?
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Я правильно понимаю, что вы хотите запустить многопоток в однопоточной Лайт версии? :-)
Да, все верно. Я пытаюсь создать новый Instance "в однопоточной Лайт версии". Это и есть единственная моя проблема? То есть в многопоточной версии программы все будет работать корректно?

Сейчас попробую через ZennoPoster.GetNewInstance.
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Код:
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;
        }
Попробовал запустить код с использованием Вашего совета, теперь проект при запуске в ЗенноПостере не выдает ошибку (не удалось воспроизвести проект), но и никак не может завершиться (предполагаемо из-за однопоточной версии программы).
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113
Тогда есть более хитрый вопрос: а как его закрыть по завершению действий?
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;
        }
Попробовал запустить код с использованием Вашего совета, теперь проект при запуске в ЗенноПостере не выдает ошибку (не удалось воспроизвести проект), но и никак не может завершиться (предполагаемо из-за однопоточной версии программы).
Видимо надо закрыть инстанс по завершении действий, как выше говорят)
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Код:
ZennoPoster.GetNewInstance(out url, out port, out address);
А вот в КодКриэйторе на этой строчке ошибку тайм-аута выдало.
 
Последнее редактирование:

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
""Во время операции запроса в net.pipe://localhost/ZP_InstanceManager/InstanceManager ответ не был получен в течение настроенного времени ожидания (00:20:00). Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. Это может быть связано с тем, что служба продолжает обработать операцию, или с тем, что службе не удалось отправить ответное сообщение. Увеличьте значение тайм-аута операции (путем привода канал/прокси в IContextChannel и изменения свойства OperationTimeout), а также убедитесь, что службв способна подключиться к клиенту.""

Это CodeCreator выдает. Я так понимаю в ЗенноПостере все нормально должно быть?
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113
""Во время операции запроса в net.pipe://localhost/ZP_InstanceManager/InstanceManager ответ не был получен в течение настроенного времени ожидания (00:20:00). Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. Это может быть связано с тем, что служба продолжает обработать операцию, или с тем, что службе не удалось отправить ответное сообщение. Увеличьте значение тайм-аута операции (путем привода канал/прокси в IContextChannel и изменения свойства OperationTimeout), а также убедитесь, что службв способна подключиться к клиенту.""

Это CodeCreator выдает. Я так понимаю в ЗенноПостере все нормально должно быть?
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
Код:
ZennoPoster.GetNewInstance(out url, out port, out address);
На этой строчке останавливает.
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Ну судя по всему есть какая-то проблема с закрытием инстанса... это надо разбираться...
amyboose похоже знает в чем дело, но молчит как партизан)
Вот что я могу сказать
1) При желании теоретически можно открывать 100500 новых браузеров даже в ПМ
2) На практике после открытия штук 5 примерно дальнейшее открытие не приводит к успеху и последующему открытию браузеров (внутри ПМ даже создавал кучу браузеров в то время, когда в другом месте работал зеннопостер)
3) Даже если новое окно браузера открыто и работает, то оно не закрывается никак (не нашел метода закрытия его)
4) Когда я во всём этом копался, у меня не было достаточно времени изучить всю суть и причину проблем, так что я отложил это всё на неопределенное время, поэтому подсказать не могу.
5) Я думал, что это закрытая тема и её используют только те, кто владеет в достаточной степени C#
 
  • Спасибо
Реакции: djaga

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 455
Благодарностей
5 913
Баллы
113
Вопрос к автору, к чему такие сложности? Зачем самостоятельно запускать инстансы, когда они сами запустятся сколько нужно при выполнении шаблона в многопотоке?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Ну вот допустим я хочу запустить всего 50 выполнений и у каждого шаблона по 8 фаз, при этом на каждой фазе надо дожидаться одновременного выполнения ровно 10 потоков, потом переходить на следующую фазу, а на предыдущую фазу пускать 10 других браузеров. Таким образом надо синхронизировать работу определенного количества браузеров. Вот один из примеров использования.
P.S.: есть несколько способов решить проблему по-другому, но они костыльные, плюс не обеспечивают некоторого дополнительного функционала, который бы мне пригодился
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Вопрос к автору, к чему такие сложности? Зачем самостоятельно запускать инстансы, когда они сами запустятся сколько нужно при выполнении шаблона в многопотоке?
Попытаюсь доступно объяснить.

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

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

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

Как-то так.
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
Плюс Браузер_1 и Браузер_2 должны парсить и хранить некоторую информацию, которая также влияет на то какой из браузеров будет выбран для выполнения действия. И вот тут возникает новая проблема в том чтобы обмениваться информацией между Браузером_1 и Браузером_2.

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

Я это так вижу если через костыли делать.
 

Adamastor

Client
Регистрация
15.05.2016
Сообщения
282
Благодарностей
14
Баллы
18
А в варианте с цельной программой все данные хранятся в переменных (объекта или структуры или просто в переменной) и не надо себе парить голову. Просто пишешь функцию на сравнение этих данных и все, сравниваешь и выбираешь тот или иной метод для браузера который победил в результате сравнения данных (даже в Tasks ничего засовывать не надо получается)
 

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