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

  • Автор темы Автор темы BAZAg
  • Дата начала Дата начала

BAZAg

Client
Регистрация
08.11.2015
Сообщения
2 394
Реакции
2 801
Баллы
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
Лучше реализуйте на уже имеющейся многопоточности, так каждому instance, всегда соответствует project.
P.S. Нашел, видимо это и будет тем правильным вариантом, который я искал.
Тут вы просто грузите куки, для простенького сайта может и норм.
 
  • Оценить
Реакции: BAZAg
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/thr...ance-ne-rabotajut-metody-fullemulation.85597/)
 
  • Оценить
Реакции: djaga и BAZAg
  • Оценить
Реакции: BAZAg
В чём смысл и преимущества данного способа?
 
  • Оценить
Реакции: BAZAg
Лучше реализуйте на уже имеющейся многопоточности, так каждому instance, всегда соответствует project.
Может подскажете, как получить новый project, который соответствует этому новому instance?
Или заставить этот новый созданный instance подгрузить (синхронизировать) данные с текущим project?

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

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