Генерация шрифтов профиля, экшен рандомизации шрифтов

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
Любой сервис, который трекает отпечатки может отследить вас по уникальному набору шрифтов через JS.
Проверял на сайте browserleaks.com/fonts методом JS Fonts (Classic). При генерации новых профилей данный параметр не меняется, и значит мы идентифицированы как один и тот же пользователь. Это серьезная дыра в анонимности.

Просьба разработчикам сделать решение для исправления этой ситуации. Спасибо!
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 573
Благодарностей
3 397
Баллы
113

Oleg1987

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

Reactor3000

Client
Регистрация
25.09.2019
Сообщения
434
Благодарностей
263
Баллы
63
А что на каждом пк свой уникальный набор шрифтов?
У 99,9% с одинаковой ОС будет стандартный набор.
Но, вроде, немного странно когда, когда UA андроид, а там список стандартных шрифтов с винды
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 573
Благодарностей
3 397
Баллы
113
Пока шрифты можно менять только самому через C#.
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 347
Благодарностей
892
Баллы
113

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
Набор шрифтов за частую может быть разным:
-Установил кастомную винду
-Работаешь с графикой и на комп поставил сторонние шрифты. Например, при работе с Photoshop понадобился конкретный шрифт
 
  • Спасибо
Реакции: Mikhail B.

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
480
Благодарностей
200
Баллы
43
Ап. Столкнулся с той же проблемой, в js-fingerprints у 30 разных профилей лист один и тот же вне зав. от UA.
 

ArtemMavrin

Client
Регистрация
29.09.2019
Сообщения
13
Благодарностей
2
Баллы
3
У 99,9% с одинаковой ОС будет стандартный набор.
Но, вроде, немного странно когда, когда UA андроид, а там список стандартных шрифтов с винды
Затестил с 6 компов + еще с десятка мобилок. У всех это значение разное.
 

ArtemMavrin

Client
Регистрация
29.09.2019
Сообщения
13
Благодарностей
2
Баллы
3

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 573
Благодарностей
3 397
Баллы
113

ArtemMavrin

Client
Регистрация
29.09.2019
Сообщения
13
Благодарностей
2
Баллы
3
Необходимо переоткрыть вкладку, но GetFonts похоже будет показывать старый набор.
Разобрался с Этим.
2019-11-30_14-30-12.png
На движке FireFox 52 смена шрифтов работает корректно. Даже вкладку переоткрывать не нужно.
Осталось придумать как заставить зенку самостоятельно уникализировать этот набор (но думаю проблем не возникнет).

Еще вопрос к знатокам, по поводу GetFonts.
В C# не силен, по этому не понял как это работает.
Вот код из вики:

C#:
// get fonts
var fonts = instance.GetFonts();
// name of first font
string name = "";
if (fonts != null)
{
    var fontList = fonts.ToList();
    if(fontList.Count > 0)
    {
        name = fontList[0];
    }
}
Как в итоге получить шрифты? в список например. Может что-то дописать нужно?
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
480
Благодарностей
200
Баллы
43
Как в итоге получить шрифты? в список например. Может что-то дописать нужно?
// get fonts
var list = project.Lists["Имя листа"];
list.Clear();
var fonts = instance.GetFonts();
// name of first font
string name = "";
if (fonts != null)
{
var fontList = fonts.ToList();
if(fontList.Count > 0)
{
for(int i = 0 ; i<fontList.Count ; i++) {
list.Add(fontList);
}
}
}
 
  • Спасибо
Реакции: ArtemMavrin

ArtemMavrin

Client
Регистрация
29.09.2019
Сообщения
13
Благодарностей
2
Баллы
3
// get fonts
var list = project.Lists["Имя листа"];
list.Clear();
var fonts = instance.GetFonts();
// name of first font
string name = "";
if (fonts != null)
{
var fontList = fonts.ToList();
if(fontList.Count > 0)
{
for(int i = 0 ; i<fontList.Count ; i++) {
list.Add(fontList);
}
}
}
Компиляция кода Ошибка в действии "CS1503" "Аргумент "1": преобразование типа из "System.Collections.Generic.List<string>" в "string" невозможно". [Строка: 12; Cтолбец: 10]
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Компиляция кода Ошибка в действии "CS1503" "Аргумент "1": преобразование типа из "System.Collections.Generic.List<string>" в "string" невозможно". [Строка: 12; Cтолбец: 10]
C#:
Форум сжирает [i]
list.Add(fontList[i]);
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
480
Благодарностей
200
Баллы
43

sw_sw

Client
Регистрация
24.02.2017
Сообщения
785
Благодарностей
314
Баллы
63
Сдвиги по теме есть?
 
  • Спасибо
Реакции: devffy

Valandersi

Client
Регистрация
19.01.2015
Сообщения
2 003
Благодарностей
1 126
Баллы
113
Шел 2020 год, а шрифты андроида и айфона так и остались одинаковые
 

sw_sw

Client
Регистрация
24.02.2017
Сообщения
785
Благодарностей
314
Баллы
63
Думается, что генерацию шрифтов всеже нужно подправить..
 
Последнее редактирование:
  • Спасибо
Реакции: Valandersi
Регистрация
20.02.2019
Сообщения
293
Благодарностей
35
Баллы
28
На хроме есть какие -то изменения? Скажем так на 7ой версии зенно может есть уже такая функция эмуляции?
Реально в разных браузерах разный хеш на компе, думаю актуальный параметр для разработки.

В общем в 7ой версии работают методы на хроме.
Шрифты удаляются и добавляются, хеши соответственно меняются.

Вопрос такой
Есть ли смысл всем профилям делать коррекцию шрифтов?
 
Последнее редактирование:

LitePanda

Client
Регистрация
11.04.2025
Сообщения
6
Благодарностей
3
Баллы
3
Не понимаю в программировании. Какой готовый код C# добавить в проект? Чтобы генерировался при каждом запуске проекта разный набор шрифтов? и он соответствовал либо MacOS либо Windows. В зависимости от того какая операционная система генерируется в профиле. На данный момент всегда показывает 165 штук на сайте - https://iphey.com/ и если операционная система сгенерирована как MacOS - он показывает что установленные шрифты НЕ соответствуют MacOS.
 

LitePanda

Client
Регистрация
11.04.2025
Сообщения
6
Благодарностей
3
Баллы
3
Генерация рандомных шрифтов для профиля. Готовые коды.

Проверил через сайт https://browserleaks.com/fonts - выдает разный набор шрифтов/Fingerprint.
Работают при выбранном типе браузера - CEF (Chrome).
Запускать C# в zennoposter до открытия нужной страницы в браузере.

Вариант 1. Подходит для генерации в рамках Windows/Desktop. Всегда показывает базовые шрифты Windows 10 из тех что установлены в системе + добавляет рандомные шрифты из системы в случайном количестве.


Вариант 1 - Windows 10 базовые шрифты + случайные. Устанавливаются из доступных:
   var predefinedSystemFonts = new List<string>
    {
        "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria", "Cambria Math",
        "Candara", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Courier New",
        "Ebrima", "Franklin Gothic Medium", "Gabriola", "Gadugi", "Georgia", "HoloLens MDL2 Assets",
        "Impact", "Ink Free", "Javanese Text", "Leelawadee UI", "Lucida Console", "Lucida Sans Unicode",
        "Malgun Gothic", "Marlett", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
        "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft YaHei",
        "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti", "MS Gothic", "MV Boli",
        "Myanmar Text", "Nirmala UI", "Palatino Linotype", "Segoe MDL2 Assets", "Segoe Print",
        "Segoe Script", "Segoe UI", "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol",
        "SimSun", "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Trebuchet MS",
        "Verdana", "Webdings", "Wingdings", "Yu Gothic"
    };

    var fonts = instance.GetFonts().ToList();

    var systemFonts = fonts.Where(f => predefinedSystemFonts.Contains(f)).ToList();
    var nonSystemFonts = fonts.Except(systemFonts).ToList();
    var rnd = new Random();

    // Генерация целевого количества (системные + случайные)
    int targetCount = rnd.Next(
        systemFonts.Count,
        Math.Max(systemFonts.Count + 1, fonts.Count + 1)
    );

    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(targetCount - systemFonts.Count)
        .ToList();

    foreach (var font in fonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);
Вариант 2.1 Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет рандомные шрифты из системы в случайном количестве. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType.


Windows 10 + MacOS v1:
    // Получаем UserAgent из профиля
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown"; // Значение по умолчанию

    // Определяем список системных шрифтов по UserAgent
    List<string> systemFontsList = new List<string>();

    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
            "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var fonts = instance.GetFonts().ToList();
    var rnd = new Random();

    // Фильтруем системные шрифты
    var systemFonts = fonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    var nonSystemFonts = fonts.Except(systemFonts).ToList();

    // Генерация целевого количества
    int targetCount = rnd.Next(
        systemFonts.Count,
        Math.Max(systemFonts.Count + 1, fonts.Count + 1)
    );

    // Выбираем дополнительные шрифты
    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(targetCount - systemFonts.Count)
        .ToList();

    // Применяем изменения
    foreach (var font in fonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;
Вариант 2.2 Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет от 3-х рандомных шрифтов из системы в случайном количестве. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType. В переменной
minExtra можно указать свое значение минимально добавляемых случайных доступных шрифтов.


Windows 10 + MacOS v2 - отличается тем что в minExtra указано минимальное число для добавления случайных не базовых шрифтов Windows 10/MacOS. можно добавить туда свое значение:
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown";
    var systemFontsList = new List<string>();
    var rnd = new Random();

    // Выбор базовых шрифтов для ОС
    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
             "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var allFonts = instance.GetFonts().ToList();

    // Фильтрация доступных системных шрифтов
    var systemFonts = allFonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    // Если системные шрифты не найдены - используем все доступные
    if (!systemFonts.Any())
    {
        foreach (var font in allFonts) instance.ShowFont(font);
        return osType;
    }

    var nonSystemFonts = allFonts.Except(systemFonts).ToList();

    // Настройки количества дополнительных шрифтов
    int minExtra = 3;
    int maxExtra = Math.Max(minExtra + 1, nonSystemFonts.Count);

    // Выбор случайного количества дополнительных шрифтов
    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(rnd.Next(minExtra, maxExtra))
        .ToList();

    // Применение изменений
    foreach (var font in allFonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;

Вариант 2.3. Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет от 3-х рандомных шрифтов из системы в случайном количестве для Windows профиля и + от 20-ти для MacOS профиля. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType. Для переменной minExtra можно указать свое значение минимально добавляемых случайных доступных шрифтов отдельно для Windows и MacOS.



Windows 10 + MacOS v3 - minExtra для MacOs = 20, minExtra для Windows = 3:
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown";
    var systemFontsList = new List<string>();
    var rnd = new Random();

    // Выбор базовых шрифтов для ОС
    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
            "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var allFonts = instance.GetFonts().ToList();
 
    // Фильтрация доступных системных шрифтов
    var systemFonts = allFonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    if (!systemFonts.Any())
    {
        foreach (var font in allFonts) instance.ShowFont(font);
        return osType;
    }

    var nonSystemFonts = allFonts.Except(systemFonts).ToList();
 
    // Настройки количества дополнительных шрифтов
    int minExtra = osType == "Windows" ? 3 : 20; // Основное изменение
    int maxExtra = Math.Max(minExtra + 1, nonSystemFonts.Count);
 
    // Защита от недостатка шрифтов
    int actualTake = Math.Min(
        rnd.Next(minExtra, maxExtra),
        nonSystemFonts.Count
    );

    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(actualTake)
        .ToList();

    foreach (var font in allFonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;
 
Последнее редактирование:
  • Спасибо
Реакции: volody00

heks

Client
Регистрация
01.10.2013
Сообщения
1 349
Благодарностей
378
Баллы
83
Генерация рандомных шрифтов для профиля. Готовые коды.

Проверил через сайт https://browserleaks.com/fonts - выдает разный набор шрифтов/Fingerprint.
Работают при выбранном типе браузера - CEF (Chrome).
Запускать C# в zennoposter до открытия нужной страницы в браузере.

Вариант 1. Подходит для генерации в рамках Windows/Desktop. Всегда показывает базовые шрифты Windows 10 из тех что установлены в системе + добавляет рандомные шрифты из системы в случайном количестве.


Вариант 1 - Windows 10 базовые шрифты + случайные. Устанавливаются из доступных:
   var predefinedSystemFonts = new List<string>
    {
        "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria", "Cambria Math",
        "Candara", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Courier New",
        "Ebrima", "Franklin Gothic Medium", "Gabriola", "Gadugi", "Georgia", "HoloLens MDL2 Assets",
        "Impact", "Ink Free", "Javanese Text", "Leelawadee UI", "Lucida Console", "Lucida Sans Unicode",
        "Malgun Gothic", "Marlett", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
        "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft YaHei",
        "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti", "MS Gothic", "MV Boli",
        "Myanmar Text", "Nirmala UI", "Palatino Linotype", "Segoe MDL2 Assets", "Segoe Print",
        "Segoe Script", "Segoe UI", "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol",
        "SimSun", "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Trebuchet MS",
        "Verdana", "Webdings", "Wingdings", "Yu Gothic"
    };

    var fonts = instance.GetFonts().ToList();

    var systemFonts = fonts.Where(f => predefinedSystemFonts.Contains(f)).ToList();
    var nonSystemFonts = fonts.Except(systemFonts).ToList();
    var rnd = new Random();

    // Генерация целевого количества (системные + случайные)
    int targetCount = rnd.Next(
        systemFonts.Count,
        Math.Max(systemFonts.Count + 1, fonts.Count + 1)
    );

    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(targetCount - systemFonts.Count)
        .ToList();

    foreach (var font in fonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);
Вариант 2.1 Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет рандомные шрифты из системы в случайном количестве. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType.


Windows 10 + MacOS v1:
    // Получаем UserAgent из профиля
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown"; // Значение по умолчанию

    // Определяем список системных шрифтов по UserAgent
    List<string> systemFontsList = new List<string>();

    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
            "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var fonts = instance.GetFonts().ToList();
    var rnd = new Random();

    // Фильтруем системные шрифты
    var systemFonts = fonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    var nonSystemFonts = fonts.Except(systemFonts).ToList();

    // Генерация целевого количества
    int targetCount = rnd.Next(
        systemFonts.Count,
        Math.Max(systemFonts.Count + 1, fonts.Count + 1)
    );

    // Выбираем дополнительные шрифты
    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(targetCount - systemFonts.Count)
        .ToList();

    // Применяем изменения
    foreach (var font in fonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;
Вариант 2.2 Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет от 3-х рандомных шрифтов из системы в случайном количестве. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType. В переменной
minExtra можно указать свое значение минимально добавляемых случайных доступных шрифтов.


Windows 10 + MacOS v2 - отличается тем что в minExtra указано минимальное число для добавления случайных не базовых шрифтов Windows 10/MacOS. можно добавить туда свое значение:
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown";
    var systemFontsList = new List<string>();
    var rnd = new Random();

    // Выбор базовых шрифтов для ОС
    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
             "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var allFonts = instance.GetFonts().ToList();

    // Фильтрация доступных системных шрифтов
    var systemFonts = allFonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    // Если системные шрифты не найдены - используем все доступные
    if (!systemFonts.Any())
    {
        foreach (var font in allFonts) instance.ShowFont(font);
        return osType;
    }

    var nonSystemFonts = allFonts.Except(systemFonts).ToList();

    // Настройки количества дополнительных шрифтов
    int minExtra = 3;
    int maxExtra = Math.Max(minExtra + 1, nonSystemFonts.Count);

    // Выбор случайного количества дополнительных шрифтов
    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(rnd.Next(minExtra, maxExtra))
        .ToList();

    // Применение изменений
    foreach (var font in allFonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;

Вариант 2.3. Подходит для генерации в рамках Windows/MacOS/Desktop. Всегда показывает базовые шрифты Windows 10 или MacOS из тех что установлены в системе + добавляет от 3-х рандомных шрифтов из системы в случайном количестве для Windows профиля и + от 20-ти для MacOS профиля. Самостоятельно подстраивается под сгенерированный профиль zennoposter - Mac или Windows (в зависимости от того есть ли в переменной project.Profile.UserAgent - слово Windows или Macintosh). Возвращает тип ОС в переменную osType. Для переменной minExtra можно указать свое значение минимально добавляемых случайных доступных шрифтов отдельно для Windows и MacOS.



Windows 10 + MacOS v3 - minExtra для MacOs = 20, minExtra для Windows = 3:
    string userAgent = project.Profile.UserAgent;
    string osType = "Unknown";
    var systemFontsList = new List<string>();
    var rnd = new Random();

    // Выбор базовых шрифтов для ОС
    if (userAgent.Contains("Windows NT"))
    {
        osType = "Windows";
        systemFontsList = new List<string>
        {
            "Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria",
            "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia",
            "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola",
            "Gadugi", "Georgia", "Impact", "Javanese Text", "Leelawadee UI",
            "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett",
            "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue",
            "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le",
            "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti",
            "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype",
            "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI",
            "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun",
            "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman",
            "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"
        };
    }
    else if (userAgent.Contains("Macintosh"))
    {
        osType = "Macintosh";
        systemFontsList = new List<string>
        {
            "San Francisco", "Helvetica Neue", "Times New Roman", "Arial",
            "Arial Narrow", "Arial Rounded MT Bold", "Baskerville", "Big Caslon",
            "Brush Script MT", "Chalkboard", "Chalkduster", "Courier New",
            "Futura", "Geneva", "Georgia", "Gill Sans", "Herculanum", "Hoefler Text",
            "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Monaco",
            "Noteworthy", "Optima", "Palatino", "Papyrus", "Phosphate",
            "Skia", "Tahoma", "Trebuchet MS", "Verdana", "Zapf Dingbats",
            "Zapfino"
        };
    }

    var allFonts = instance.GetFonts().ToList();

    // Фильтрация доступных системных шрифтов
    var systemFonts = allFonts
        .Where(f => systemFontsList.Contains(f))
        .ToList();

    if (!systemFonts.Any())
    {
        foreach (var font in allFonts) instance.ShowFont(font);
        return osType;
    }

    var nonSystemFonts = allFonts.Except(systemFonts).ToList();

    // Настройки количества дополнительных шрифтов
    int minExtra = osType == "Windows" ? 3 : 20; // Основное изменение
    int maxExtra = Math.Max(minExtra + 1, nonSystemFonts.Count);

    // Защита от недостатка шрифтов
    int actualTake = Math.Min(
        rnd.Next(minExtra, maxExtra),
        nonSystemFonts.Count
    );

    var additionalFonts = nonSystemFonts
        .OrderBy(f => rnd.Next())
        .Take(actualTake)
        .ToList();

    foreach (var font in allFonts) instance.HideFont(font);
    foreach (var font in systemFonts.Concat(additionalFonts)) instance.ShowFont(font);

    return osType;
А в хромиуме работает?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 914
Благодарностей
1 653
Баллы
113
o_O тема 2019 - го года, неужели разработчики до сих пор не пофиксили в зенке проблему со шрифтами?
 

LitePanda

Client
Регистрация
11.04.2025
Сообщения
6
Благодарностей
3
Баллы
3

heks

Client
Регистрация
01.10.2013
Сообщения
1 349
Благодарностей
378
Баллы
83

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 828
Благодарностей
1 207
Баллы
113
Нет. Не знаю как сделать, чтобы работало в Chromium.
только аргументом --zl-fonts-dir="C:\fonts_en"
А рандомизация - физически удалять/копировать шрифты в папке. Костыль тот еще.
 

LitePanda

Client
Регистрация
11.04.2025
Сообщения
6
Благодарностей
3
Баллы
3
Протестировал свои коды выше для Windows/MacOs - сорян, на сайте "https://iphey.com/" при расширенной проверке шрифты палятся, если операционная система в профиле выбрана как MacOS - пишет шрифты не соответствуют MacOS. Кароче т.к. шрифты берутся из доступных методом instance.GetFonts() для установки, а у меня в системе только шрифты для Windows 10 то и устанавливаются они из этого списка, получается что сайт видит это несоответствие. Имеет смысл использовать только "Вариант 1" код - для Windows 10, который всегда устанавливает базовые шрифты Windows 10 + рандомные. Он не учитывает создаваемый профиль в Zennoposter.
 

LitePanda

Client
Регистрация
11.04.2025
Сообщения
6
Благодарностей
3
Баллы
3
только аргументом --zl-fonts-dir="C:\fonts_en"
А рандомизация - физически удалять/копировать шрифты в папке. Костыль тот еще.
Ок. Создал вариант подходящий для профиля только с Windows и нового браузера Chromium. Он замороченный, но сделать можно. Генерирует рандомную папку с рандомными шрифтами (базовые Windows 10 всегда копируются + рандомные). Код на С#.

Настройки такие:

1.
Скачать и распокавать куда нибудь архив со шрифтами. Подготовил готовый архив, в нем 2 папки - "Windows 10 RU EN Based Fonts" и "Аdditional Fonts" - ссылка
2. Добавить "Входные настройки" для проекта.
3. Добавить переменую Fonts_Path. Тип переменной "FileName". Имя "Шрифты указать папку:{Folder}". Сохранить в переменную "Fonts_Path".
4. Указать путь для переменной Fonts_Path - в котором должны лежать 2 папки -"Windows 10 RU EN Based Fonts" (базовые, всегда копирующиеся шрифты) и "Аdditional Fonts" (дополнительные, рандомно копирующиеся шрифты)
5. Добавить переменную Generated_Fonts_Path. Тип переменной: "FileName". Имя "Путь до папки для генерации шрифтов{Folder}" - в этой папке будут создаваться папки с рандомным именем, в которые уже будут копироваться рандомно шрифты.
6. Указать путь для переменной Generated_Fonts_Path - в которой будут создаваться папки с радомными именами/и шрифтами в них.

Пример на скриншоте:
132648

7. Добавить С# код в проект:

(в переменной minAdditionalFiles - можете указать свое значение - минимальное кол-во копируемых шрифтов, в maxAdditionalFiles - максимальное кол-во копир. шрифтов. Эти значения влияют только на число дополнительно копируемых шрифтов. Если их поставить в 0. Тогда сгенерированная папка будет содержать только базовый набор шрифтов Windows 10)

Возвращает значение из randomFolderPath - путь до сгенерированной папки со шрифтами.:
    // Настройки количества копируемых файлов
    int minAdditionalFiles = 100;  // Минимальное количество
    int maxAdditionalFiles = 250;  // Максимальное количество

    // Получаем пути из переменных проекта
    string fontsPath = project.Variables["Fonts_Path"].Value;
    string generatedPath = project.Variables["Generated_Fonts_Path"].Value.Trim();

    // Создаем целевую папку если не существует
    Directory.CreateDirectory(generatedPath);

    // Формируем пути к исходным папкам
    string winFontsPath = Path.Combine(fontsPath, "Windows 10 RU EN Based Fonts");
    string additionalFontsPath = Path.Combine(fontsPath, "Аdditional Fonts");

    // Генерация уникального имени папки
    string randomFolderName;
    string randomFolderPath;
    var rand = new Random();

    do {
        randomFolderName = GenerateRandomString(30);
        randomFolderPath = Path.Combine(generatedPath, randomFolderName);
    }
    while (Directory.Exists(randomFolderPath));

    // Создаем целевую папку
    Directory.CreateDirectory(randomFolderPath);

    // Копируем основные шрифты (Windows)
    foreach (var file in Directory.GetFiles(winFontsPath))
    {
        File.Copy(file, Path.Combine(randomFolderPath, Path.GetFileName(file)), true);
    }

    // Обработка дополнительных шрифтов
    var additionalFiles = Directory.GetFiles(additionalFontsPath).ToList();
    int totalAdditional = additionalFiles.Count;

    if(totalAdditional > 0)
    {
        // Рассчет количества файлов для копирования
        int actualMin = Math.Min(minAdditionalFiles, totalAdditional);
        int actualMax = Math.Min(maxAdditionalFiles, totalAdditional);
    
        if(actualMin > actualMax) actualMax = actualMin;
    
        int filesToCopy = totalAdditional >= minAdditionalFiles
            ? rand.Next(actualMin, actualMax + 1)
            : totalAdditional;

        // Перемешиваем и копируем
        foreach (var file in additionalFiles.OrderBy(x => rand.Next()).Take(filesToCopy))
        {
            File.Copy(file, Path.Combine(randomFolderPath, Path.GetFileName(file)), true);
        }
    }

    return randomFolderPath;


// Генератор случайных строк
string GenerateRandomString(int length)
{
    const string chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    var random = new Random();
    return new string(Enumerable.Repeat(chars, length)
        .Select(s => s[random.Next(s.Length)]).ToArray());
}

8. Получить из кода значение в переменную randomFolderPath (или с вашим именем) - это путь к рандомной папке со шрифтами. Пример на скриншоте:

Screenshot_21.png

9. В настройках проекта поставить галочу напротив - "Не использовать браузер".
10. Добавить действие >> Браузер >> Настройки >> выбрать "Запустить инстанс" и браузер "Chromium"
11. В аргументы добавить следующую строку: --zl-fonts-dir="{-Variable.randomFolderPath-}" (сюда добавляется имя переменной, в которую мы записали путь к раномной папке со шрифтами). Пример на скриншоте:
132649

12. Если вы не поставите галочку напротив "Применить текущий профиль браузера" в проекте будет сгенерирован новый профиль. Я не ставлю, т.к. у меня это действие выполняется вначале проекта, чтобы был новый профиль рандомный. Если поставить. то будет использоваться тот что был сгенерирован до этого.
13. Все почти настроено. При проверке на сайте на сайте "https://iphey.com/ - выдает разные отпечатки для шрифтов.

14. Но есть проблема. Чтобы не городить бесконечное число сгенерированных папок со шрифтами на компьютере нужно их удалять после того как нужные вам действия выполнены. Этому мешает то что запущенный браузер блокирует доступ к файлам в сгенерированной папке.
14. Освобождаем сгенерированную папку от блокировки. Для этого, как я понял/протестировал, нужно запустить инстанс еще раз БЕЗ аргументов. Пример на скриншоте:

132651

15. Теперь папка дает себя удалить. Добавить действие >> Данные >> Директории >> выбираем - "Удалить".
В "Путь до директории" прописываем нашу переменную с рандомной папкой {-Variable.randomFolderPath-} Пример на скрине:

132652

16. Сгенерированная папка со шрифтами удалится.

Как бы все.

P.S. Cоветую для ускорения работы и чтобы не тратить ресурсы SSD на запись/стирания шрифтов. Поставить программу RamDisk. Например Primo Ramdisk Server Edition. Она создает виртуальный жесткий диск. Который хранится в оперативной памяти. Вся инфма которую вы будете на него записывать, будет хранится в оперативной памяти. И папку в которую нужно генерировать шрифты указывать на этом RamDisk (создайте диск с достаточным размером, если там не хватит места, код C# при копировании шрифтов завершится с ошибкой - и проект выдаст в логе что-то вроде - не хватает места на диске).
 
Последнее редактирование:
  • Спасибо
Реакции: Oleg1987 и zoneofsoft

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