- Регистрация
- 27.11.2023
- Сообщения
- 82
- Благодарностей
- 161
- Баллы
- 33
ZBSync: best practice of profile management
Всем здоровья и процветания, господа автоматизаторы
Давно хотел прибраться на ферме, но особого повода и времени как- то не находилось. И вот посмотрел я в тему с анонсом текущего конкурса и подумал - это же онзнак судьбы повод прибраться.
Приятно и удобно менеджерить данные через БД - все наглядно и перед глазами.
В целом не важно: 10000 у вас профилей или 10. Если вы привыкли думать "у меня10 wtf?! 50/100 акков - зачем оно мне", то это не повод - даже 5 аккаунтов в БД вести приятнее и удобнее, чем во всяких там эксельчиках.
Так или иначе, большую часть данных я уже давно храню и подтягиваю из БД - ники, био, куки, настройки канваса и все такое. И данными профиля я пользовался больше как фолбеком чем как инструментом - если никнейм из БД занят - берем никнейм из
Все это время мне и в голову не приходило проверить, есть ли сеттеры у полей вообще или нет - все потому, что управлять этими данными мне не виделось удобным ни под каким углом. Оказывается, сеттеры есть, и угол удобный тоже есть. Можно хранить и редактировать все в БД а когда надо - записывать в профили. Или даже подтягивать при загрузке профиля одной строкой кода - "было быЗБС значительно более структурированно..." - подумал я.
• Приложенный шаблон создаст необходимые структуры данных в SQLite или PostgreSQL .
• В зависимости от настроек вы можете управлять данными
• Реализована защита от
• Вы можете отслеживать и изменять данные
• Запускается инстанс из выбранного источника
• Через рефлексию в бд парсятся все поля у которых есть сеттеры (которые мы можем записать обратно - иначе какой от них смысл) у выбранных нами типов
• Так же сохраняются куки (по умолчанию формат netscape, но если вы хотите json - код сам определит что вы положили в БД и конвертирует перед импортом)
• Инстанс закрывается
зачем: Один объект управляет полным циклом save/restore для всех типов данных профиля
Конструктор принимает
Параметр restoreFrom/saveTo определяет режим работы:
- "folder" - работа с папками профилей
- "zb" - работа с профилями ZennoBrowser
- "zpprofile" - работа с .zpprofile файлами
Булевые флаги позволяют выборочно управлять тем, что именно синхронизировать.
зачем: Не нужно вручную перечислять 50+ полей Profile и Instance - один метод достанет все что имеет публичный геттер/сеттер.
Если в новых версиях ZennoPoster добавятся новые свойства в профиль — код подхватит их автоматически
зачем: ZennoPoster генерирует WebGL случайно, не учитывая реальное железо. BrowserScan детектит несоответствие NVIDIA в отпечатке vs AMD на машине.
В связке с rebuildWebgl позволяет подменить только vendor в существующем отпечатке, сохранив остальной fingerprint нетронутым.
зачем: Zenno работает с Netscape форматом, но хранить и читать JSON удобнее. Код автоматически конвертирует туда-сюда.
зачем: Получить списки профилей, отфильтровать по папкам, экспортировать ID для batch-операций (сахар чтобы не морочиться с подключением каждый раз когда нужны данные из штатной БД ZB)
Шаблон писался и тестировался на версиях
Zennoposter
ZennoBrowser
Всем здоровья и процветания, господа автоматизаторы

Давно хотел прибраться на ферме, но особого повода и времени как- то не находилось. И вот посмотрел я в тему с анонсом текущего конкурса и подумал - это же он
Приятно и удобно менеджерить данные через БД - все наглядно и перед глазами.
В целом не важно: 10000 у вас профилей или 10. Если вы привыкли думать "у меня
Так или иначе, большую часть данных я уже давно храню и подтягиваю из БД - ники, био, куки, настройки канваса и все такое. И данными профиля я пользовался больше как фолбеком чем как инструментом - если никнейм из БД занят - берем никнейм из
project.ProfileВсе это время мне и в голову не приходило проверить, есть ли сеттеры у полей вообще или нет - все потому, что управлять этими данными мне не виделось удобным ни под каким углом. Оказывается, сеттеры есть, и угол удобный тоже есть. Можно хранить и редактировать все в БД а когда надо - записывать в профили. Или даже подтягивать при загрузке профиля одной строкой кода - "было бы
• Приложенный шаблон создаст необходимые структуры данных в SQLite или PostgreSQL .
• В зависимости от настроек вы можете управлять данными
профиль папок / .zpprofile / ZennoBrowser независимо друг от друга или синхронизировать их по своему усмотрению для консистентности профилей.• Реализована защита от
database is locked для SQLite• Вы можете отслеживать и изменять данные
WebGLPreferences независимо друг от друга - можно забить нужные вам данные в плоскую базу и код сам соберет вам Json для импорта в текущий инстанс. (актуально для Chromium, не работает в ZB )• При старте шаблона создаются отдельные таблицы под все типы профилейКак все работает
• Запускается инстанс из выбранного источника
• Через рефлексию в бд парсятся все поля у которых есть сеттеры (которые мы можем записать обратно - иначе какой от них смысл) у выбранных нами типов
• Так же сохраняются куки (по умолчанию формат netscape, но если вы хотите json - код сам определит что вы положили в БД и конвертирует перед импортом)
• Инстанс закрывается
что делает: Центральный класс для синхронизации профилей с БДZBSync
зачем: Один объект управляет полным циклом save/restore для всех типов данных профиля
Конструктор принимает
project и instance - дальше просто вызываете SaveProfile() или RestoreProfile() с нужными параметрами.Параметр restoreFrom/saveTo определяет режим работы:
- "folder" - работа с папками профилей
- "zb" - работа с профилями ZennoBrowser
- "zpprofile" - работа с .zpprofile файлами
Булевые флаги позволяют выборочно управлять тем, что именно синхронизировать.
rebuildWebgl пересобирает WebGL из плоской структуры БД - позволяет подменить только vendor под реальное железо без перегенерации всего fingerprint.
C#:
var sync = new ZBSync(project, instance);
sync.SaveProfile("zpprofile", saveProfile: true, saveCookies: true, saveWebgl: true);
// Теперь все в БД, можно редактировать через SQL
что делает: Магия рефлексии для автоматического сохранения/восстановления свойств объектовPropertyManager
зачем: Не нужно вручную перечислять 50+ полей Profile и Instance - один метод достанет все что имеет публичный геттер/сеттер.
Если в новых версиях ZennoPoster добавятся новые свойства в профиль — код подхватит их автоматически
GetTypeProperties() сканирует тип через рефлексию и возвращает список всех простых свойств.GetValuesByProperty() берет объект, читает значения всех свойств и складывает в Dictionary. Опционально сразу пишет в БД.SetValuesFromDb() делает обратное - читает данные из БД и через рефлексию записывает обратно в свойства объекта с автоматической конвертацией типов.
C#:
// Сохранить все поля Profile в БД
var profileFields = PropertyManager.GetTypeProperties(typeof(IProfile));
project.GetValuesByProperty(project.Profile, profileFields, tableToUpd: "folder_profile");
// Восстановить из БД
project.SetValuesFromDb(project.Profile, "folder_profile", profileFields);
что делает: Валидация и коррекция WebGL fingerprint под физическую видеокартуVideoManager
зачем: ZennoPoster генерирует WebGL случайно, не учитывая реальное железо. BrowserScan детектит несоответствие NVIDIA в отпечатке vs AMD на машине.
HWVideoVendor() определяет реальную видеокарту через WMI (NVIDIA/AMD/Intel).VideoVendor() парсит vendor из текущего WebGL.ValidateVideoVendor() сравнивает их - если не совпадают возвращает false.В связке с rebuildWebgl позволяет подменить только vendor в существующем отпечатке, сохранив остальной fingerprint нетронутым.
C#:
if (!instance.ValidateVideoVendor()) {
project.SendWarningToLog("WebGL не соответствует железу!");
// Пересобираем WebGL с правильным vendor
}
что делает: Конвертация между форматами cookies и синхронизация с БДCookies
зачем: Zenno работает с Netscape форматом, но хранить и читать JSON удобнее. Код автоматически конвертирует туда-сюда.
ConvertCookieFormat() автоматически определяет входной формат (JSON/Netscape) и конвертирует в нужный.SaveAllCookies() / LoadCookies() сохраняют/восстанавливают куки в/из БД с автоматической конвертацией.GetCookiesByJs() / SetCookiesByJs() - альтернативный метод работы через JS injection в браузер.
C#:
// Сохранить куки в БД
project.SaveAllCookies(instance, table: "folder_profile");
// Восстановить
project.LoadCookies(instance, table: "folder_profile");
// Или вручную конвертировать
string netscape = instance.GetCookie();
string json = Cookies.ConvertCookieFormat(netscape, output: "json");
что делает: Прямая работа с базой ZennoBrowser (ProfileManagement.db)ZbDbManager
зачем: Получить списки профилей, отфильтровать по папкам, экспортировать ID для batch-операций (сахар чтобы не морочиться с подключением каждый раз когда нужны данные из штатной БД ZB)
ZBDbGet() временно переключает подключение на ProfileManagement.db из LocalAppData, делает запрос и возвращает подключение обратно.ZBIdDic() парсит JSON из ZB и возвращает словарь Name → Id с фильтром по папке.ZBIdList() возвращает просто список ID профилей из нужной папки.
C#:
// Получить все профили из папки "Farm"
string json = project.ZBDbGet("Name, Id, FolderName", "ProfileInfos");
var ids = project.ZBIdList(json, folder: "Farm");
// Batch-сохранение в вашу БД
foreach(var zbId in ids) {
project.Var("zb_id", zbId);
sync.SaveProfile("zb", saveCookies: true, saveWebgl: true);
}
Все остальные классы и методы (работа с БД, логирование, переменные, time utilities, string extensions и т.д.) описаны в предыдущей работе: z3nCore.dll
ZBSync использует стек из z3nCore (в этой работе вынесен из библиотеки в общий код для ознакомления) для работы с базами данных (PostgreSQL/SQLite), логированием операций, управлением переменными и другими служебными задачами. Если вы еще не знакомы с библиотекой - рекомендую изучить статью о ней.
Тут фокус на profile management функционале, который является надстройкой над базовым функционалом z3nCore.
ZBSync использует стек из z3nCore (в этой работе вынесен из библиотеки в общий код для ознакомления) для работы с базами данных (PostgreSQL/SQLite), логированием операций, управлением переменными и другими служебными задачами. Если вы еще не знакомы с библиотекой - рекомендую изучить статью о ней.
Тут фокус на profile management функционале, который является надстройкой над базовым функционалом z3nCore.
Шаблон писался и тестировался на версиях
Zennoposter
7.8.14.0ZennoBrowser
0.29.41 Вложения
-
94,6 КБ Просмотры: 10
-
4,2 МБ Просмотры: 11
Последнее редактирование:

