ZBSync: Zennoposter && ZennoBrowser SQL profile manager

web3grep

Client
Регистрация
27.11.2023
Сообщения
82
Благодарностей
161
Баллы
33
ZBSync: best practice of profile management

138496



Всем здоровья и процветания, господа автоматизаторы :bt:

Давно хотел прибраться на ферме, но особого повода и времени как- то не находилось. И вот посмотрел я в тему с анонсом текущего конкурса и подумал - это же он знак судьбы повод прибраться.

Приятно и удобно менеджерить данные через БД - все наглядно и перед глазами.
138504


В целом не важно: 10000 у вас профилей или 10. Если вы привыкли думать "у меня 10 wtf?! 50/100 акков - зачем оно мне", то это не повод - даже 5 аккаунтов в БД вести приятнее и удобнее, чем во всяких там эксельчиках.

Так или иначе, большую часть данных я уже давно храню и подтягиваю из БД - ники, био, куки, настройки канваса и все такое. И данными профиля я пользовался больше как фолбеком чем как инструментом - если никнейм из БД занят - берем никнейм из project.Profile

Все это время мне и в голову не приходило проверить, есть ли сеттеры у полей вообще или нет - все потому, что управлять этими данными мне не виделось удобным ни под каким углом. Оказывается, сеттеры есть, и угол удобный тоже есть. Можно хранить и редактировать все в БД а когда надо - записывать в профили. Или даже подтягивать при загрузке профиля одной строкой кода - "было бы ЗБС значительно более структурированно..." - подумал я.



138499


• Приложенный шаблон создаст необходимые структуры данных в SQLite или PostgreSQL .

• В зависимости от настроек вы можете управлять данными профиль папок / .zpprofile / ZennoBrowser независимо друг от друга или синхронизировать их по своему усмотрению для консистентности профилей.

• Реализована защита от database is locked для SQLite

• Вы можете отслеживать и изменять данные WebGLPreferences независимо друг от друга - можно забить нужные вам данные в плоскую базу и код сам соберет вам Json для импорта в текущий инстанс. (актуально для Chromium, не работает в ZB )


Как все работает
• При старте шаблона создаются отдельные таблицы под все типы профилей
• Запускается инстанс из выбранного источника
• Через рефлексию в бд парсятся все поля у которых есть сеттеры (которые мы можем записать обратно - иначе какой от них смысл) у выбранных нами типов
• Так же сохраняются куки (по умолчанию формат netscape, но если вы хотите json - код сам определит что вы положили в БД и конвертирует перед импортом)
• Инстанс закрывается


138500

что делает: Центральный класс для синхронизации профилей с БД
зачем: Один объект управляет полным циклом 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

что делает: Магия рефлексии для автоматического сохранения/восстановления свойств объектов
зачем: Не нужно вручную перечислять 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 под физическую видеокарту
зачем: 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 и синхронизация с БД
зачем: 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)
зачем: Получить списки профилей, отфильтровать по папкам, экспортировать 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);
}
138501

Все остальные классы и методы (работа с БД, логирование, переменные, time utilities, string extensions и т.д.) описаны в предыдущей работе: z3nCore.dll
ZBSync использует стек из z3nCore (в этой работе вынесен из библиотеки в общий код для ознакомления) для работы с базами данных (PostgreSQL/SQLite), логированием операций, управлением переменными и другими служебными задачами. Если вы еще не знакомы с библиотекой - рекомендую изучить статью о ней.
Тут фокус на profile management функционале, который является надстройкой над базовым функционалом z3nCore.

Шаблон писался и тестировался на версиях
Zennoposter 7.8.14.0
ZennoBrowser 0.29.41
 

Вложения

Последнее редактирование:

4agaga

Client
Регистрация
27.07.2018
Сообщения
18
Благодарностей
2
Баллы
3
приветствую, спасибо за статью .
Можете понизить версию Zennoposter до 7.8.2.0?
 

web3grep

Client
Регистрация
27.11.2023
Сообщения
82
Благодарностей
161
Баллы
33

Dmitriy_Zenno

Administrator
Регистрация
28.10.2025
Сообщения
264
Благодарностей
92
Баллы
28
приветствую, спасибо за статью .
Можете понизить версию Zennoposter до 7.8.2.0?
Шаблон можно будет понизить только до версии 7.8.11.0
Лучше будет вам обновить ZennoPoster
 
Последнее редактирование:
  • Спасибо
Реакции: web3grep

web3grep

Client
Регистрация
27.11.2023
Сообщения
82
Благодарностей
161
Баллы
33
приветствую, спасибо за статью .
Можете понизить версию Zennoposter до 7.8.2.0?
добавил поддержку legacy версий вплоть до 7.7.21
однако вам действительно лучше обновиться - текущие версии работают гораздо лучше чем первые билды 7.8....
 

Вложения

  • Спасибо
Реакции: 4agaga и Dmitriy_Zenno

4agaga

Client
Регистрация
27.07.2018
Сообщения
18
Благодарностей
2
Баллы
3
спасибо, меня просто очень заинтересовала реализация) давно сам хотел разобраться так подробно с профилями. А тут вы сделали всю работу за меня, с ZB сейчас не работаю, поэтому и попросил понизить. Спасибо большое за статью
 

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