Как работают и как работать с Instance?

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Набросал примерно такой кодец, который по очереди создает несколько Инстансов (в моем понимании браузеров).
Создал я их без проблем.
Закрыл я их также без проблем (или может я не всё выполнил чтобы уничтожить их правильно?).

Беда в том, что они все дружно используют 1 юзерагент, и одинаковые заголовки.
А мне нужно, чтобы каждый использовал другой юзерагент, другой прокси, другую пачку куков.

По большому счёту, можно например загрузить профиль, создать Инстанс, потом загрузить другой профиль - потом обратно запустить Инстанс и так повторять сколько нужно раз.
В этом случае меня мучают смутные сомнения о том, не получится ли в этот момент так, что все инстансы будут сбрасывать куки в один активный на текущий момент профиль?

Кто реализовывал подобную логику - поделитесь пожалуйста своими размышлениями по данному поводу.

C#:
int count = 5;
int sleep = 1;
List<Instance> list = new List<Instance>(); // Список инстансов

for(int i=0;i<count;i++) {
    string instance_url = string.Empty;
    int instance_port = -1;
    string instance_address = string.Empty;
       
    ZennoPoster.GetNewInstance(out instance_url, out instance_port, out instance_address, ZennoLab.InterfacesLibrary.Enums.Browser.BrowserType.Chrome, string.Empty);
    Instance inst = new Instance(instance_url, instance_port, instance_address);
    Thread.Sleep(sleep * 1000);
    if(inst!=null) list.Add(inst);

}

foreach(Instance inst in list) {
    inst.ActiveTab.Navigate("https://nghttp2.org/httpbin/get");
    ZennoPoster.ShowInstance(inst.Url, inst.Port, inst.Address);
    Thread.Sleep(sleep * 1000);
    project.SendInfoToLog(inst.ActiveTab.GetSourceText("UTF-8"));
    inst.ReleasePreparing(false);
    inst.MinimizeMemory();
    ZennoPoster.ReleaseInstance(inst.Url, inst.Port, inst.Address);
}
P.S. Нашел, видимо это и будет тем правильным вариантом, который я искал.
Но, вопрос всё таки остается открытым - не будут ли инстансы сбрасывать куки в текущий профиль?...
C#:
// заголовки
inst.SetHeader (ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.UserAgent, "hello world" );

// прокси
inst.SetProxy("http://127.0.0.1:8888");

// куки
inst.LoadCookie(project.Profile.CookieContainer.Export());// загрузка куки
project.Profile.CookieContainer.Import(inst.SaveCookie()); // выгрузка куки
 
Последнее редактирование:
  • Спасибо
Реакции: Astraport

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Лучше реализуйте на уже имеющейся многопоточности, так каждому instance, всегда соответствует project.
P.S. Нашел, видимо это и будет тем правильным вариантом, который я искал.
Тут вы просто грузите куки, для простенького сайта может и норм.
 
  • Спасибо
Реакции: BAZAg

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 228
Благодарностей
784
Баллы
113
C#:
//эмуляция полей navigator
instance.ShowNavigatorField(NavigatorField.AcceptLanguage);
instance.SetHeader(NavigatorField.AcceptLanguage, navigator.AcceptLanguage);
instance.ShowNavigatorField(NavigatorField.AppCodeName);
instance.SetHeader(NavigatorField.AppCodeName, navigator.AppCodeName);
instance.ShowNavigatorField(NavigatorField.AppName);
instance.SetHeader(NavigatorField.AppName, navigator.AppName);
instance.ShowNavigatorField(NavigatorField.AppVersion);
instance.SetHeader(NavigatorField.AppVersion, navigator.AppVersion);
instance.ShowNavigatorField(NavigatorField.Language);
instance.SetHeader(NavigatorField.Language, navigator.Language);
instance.ShowNavigatorField(NavigatorField.Languages);
instance.SetHeader(NavigatorField.Languages, navigator.Languages);
instance.ShowNavigatorField(NavigatorField.OsCpu);
instance.SetHeader(NavigatorField.OsCpu, navigator.OsCpu);
instance.ShowNavigatorField(NavigatorField.Platform);
instance.SetHeader(NavigatorField.Platform, navigator.Platform);
instance.ShowNavigatorField(NavigatorField.Product);
instance.SetHeader(NavigatorField.Product, navigator.Product);
instance.ShowNavigatorField(NavigatorField.ProductSub);
instance.SetHeader(NavigatorField.ProductSub, navigator.ProductSub);
instance.ShowNavigatorField(NavigatorField.UserAgent);
instance.SetHeader(NavigatorField.UserAgent, navigator.UserAgent);
instance.ShowNavigatorField(NavigatorField.Vendor);
instance.SetHeader(NavigatorField.Vendor, navigator.Vendor);           
instance.ShowNavigatorField(NavigatorField.BuildId);
instance.SetHeader(NavigatorField.BuildId, navigator.BuildId);
instance.ShowNavigatorField(NavigatorField.HardwareConcurrency);
instance.SetHeader(NavigatorField.HardwareConcurrency, navigator.HardwareConcurrency.ToString());
instance.ShowNavigatorField(NavigatorField.DeviceMemory);
instance.SetHeader(NavigatorField.DeviceMemory, navigator.DeviceMemory.ToString());

// настройки экрана
 instance.SetScreenPreference(ScreenPreference.AvailHeight, screen.AvailHeight);
instance.SetScreenPreference(ScreenPreference.AvailWidth, screen.AvailWidth);
instance.SetScreenPreference(ScreenPreference.AvailLeft, screen.AvailLeft);
instance.SetScreenPreference(ScreenPreference.AvailTop, screen.AvailTop);
instance.SetScreenPreference(ScreenPreference.Height, screen.Height);
instance.SetScreenPreference(ScreenPreference.Width, screen.Width);
instance.SetScreenPreference(ScreenPreference.PixelDepth, screen.PixelDepth);
instance.SetScreenPreference(ScreenPreference.ColorDepth, screen.ColorDepth);
instance.ScreenOrientation = ZennoLab.InterfacesLibrary.Enums.Browser.ScreenOrientation.LandscapePrimary;
 
// настройки сенсорного экрана
instance.SetBrowserPreference("dom.w3c_touch_events.enabled", 1);
instance.ShowNavigatorField(NavigatorField.MaxTouchPoints);
instance.SetHeader(NavigatorField.MaxTouchPoints, touchscreenInfo.MaxTouchPoints.ToString());

// загрузка истории
instance.LoadCookie(cookieBytes);
instance.LoadSuperCookie(superCookieBytes);
instance.LoadLocalStorage(storageBytes);
instance.LoadIndexedDb(indexeddbBytes);
navigator, screen, touchscreenInfo, cookieBytes, superCookieBytes, storageBytes, indexeddbBytes - это мои локальные переменные. Меняем на свои значения

Минусы при такой работе:
- Объект project не доступен.
- Методы FullEmulation не работают (писал по поводу этого бага, но ответа пока нет https://zennolab.com/discussion/threads/pri-udalennoj-otladke-instance-ne-rabotajut-metody-fullemulation.85597/)
 
  • Спасибо
Реакции: djaga и BAZAg

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
  • Спасибо
Реакции: BAZAg

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
В чём смысл и преимущества данного способа?
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Лучше реализуйте на уже имеющейся многопоточности, так каждому instance, всегда соответствует project.
Может подскажете, как получить новый project, который соответствует этому новому instance?
Или заставить этот новый созданный instance подгрузить (синхронизировать) данные с текущим project?

В чём смысл и преимущества данного способа?
Возможность управлять тем, когда именно я запущу браузер и когда именно я уничтожу этот экземпляр браузера.
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 228
Благодарностей
784
Баллы
113
В чём смысл и преимущества данного способа?
Я это использую для разрабтки из VS. Написал удобные обвертки, реализовал свой IZennoProjectModel. - все удобно, красиво, аккуратно. Можно даже шаблон unit тестами покрывать (что не доступно при отладке через CodeCreator). Я не понимаю почему разработчики так долго мусолятся с интеграцией с VS. Сделайте возможность манипулировать project из вне и все готово
 
  • Спасибо
Реакции: BAZAg

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Возможность управлять тем, когда именно я запущу браузер и когда именно я уничтожу этот экземпляр браузера.
Тут нет отличий, таймаут настроек всё равно используется, если, конечно, явно по PID не прибивать.
Может подскажете, как получить новый project, который соответствует этому новому instance?
Или заставить этот новый созданный instance подгрузить (синхронизировать) данные с текущим project?
Запустив новый поток шаблона.
Я это использую для разрабтки из VS. Написал удобные обвертки, реализовал свой IZennoProjectModel. - все удобно, красиво, аккуратно. Можно даже шаблон unit тестами покрывать (что не доступно при отладке через CodeCreator). Я не понимаю почему разработчики так долго мусолятся с интеграцией с VS. Сделайте возможность манипулировать project из вне и все готово
Скоро будет интеграция со студией, с браузером в ней.
 
  • Спасибо
Реакции: inilim и BAZAg

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 228
Благодарностей
784
Баллы
113

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
  • Спасибо
Реакции: SHILY, Koqpe и Oleg1987

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