• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Генерируем фейковые личности с помощью faker и mimesis в Python

Генерация фейковой личности, то есть данных, которых не существует на самом деле, может понадобиться при работе над большим проектом. И, для того, чтобы не наполнять базы данных вручную, были созданы специальные библиотеки, которые сделают это в автоматическом режиме. Тем более, что генерация данных занимает считанные секунды. Ну, а тем, кто не занимается разработкой, данные библиотеки также могут пригодиться. Тут уже все зависит от вашей фантазии. В этом случае генераторы фейковых личностей подойдут также как нельзя кстати. Давайте сделаем парочку, на разных библиотеках. Тем более, что они более-менее похожи. Различается лишь количество встроенного функционала.

000.jpg



Дисклеймер: Данная статья предоставлена для ознакомления и не призывает ни к каким действиям

Что потребуется?

Для начала давайте поработаем с библиотекой для генерации фейковых данных faker. Так же нам понадобиться библиотека transliterate для транслитерации русских слов английскими буквами. Установим их с помощью терминала:

pip install faker transliterate

А теперь нужно импортировать в проект как те библиотеки, что были только что установлены, так и те, что понадобятся в дальнейшем. Поэтому, сразу же импортируем их в скрипт:

Python:
from datetime import date
from random import choice

from faker import Faker
from transliterate import translit

Теперь нужно создать объект фейкер с русской локализацией. Сделаем этот объект глобальным, чтобы доступ к нему был из каждой функции. Для этого пишем:

faker = Faker('ru_RU')

Создадим функцию calculate_age(). Как следует из ее названия, она будет вычислять возраст, отталкиваясь от текущей даты и даты, которую сгенерирует в качестве даты рождения библиотека фейкера. Здесь все довольно просто. Получаем текущую дату. Затем разделяем ее по «-» и забираем по отдельности год, месяц и день. Отнимаем от текущего года год рождения, затем сравниваем текущие месяц и день с месяцем и днем рождения. Если текущий месяц и день меньше, чем месяц и день рождения, то отнимаем единицу. Ведь в текущем году еще не было дня рождения. Затем компонуем дату рождения и возвращаем из функции возраст и дату рождения для дальнейшего использования.

Python:
def calculate_age():
    today = date.today()
    year_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[0])
    month_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[1])
    day_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[2])
    age_t = today.year - year_f - ((today.month, today.day) < (month_f, day_f))
    bith_date = f'{day_f}.{month_f}.{year_f}'
    return age_t, bith_date

Теперь создадим фейковую личность. Я создал функцию faker_person_create(). В ней я заполняю словарь данными, которые генерируются с помощью faker. Взял именно те, что мне показались более актуальны в данном контексте. Более подробно о библиотеке можно почитать на сайте с документацией. Здесь получаем Ф.И.О., дату рождения, возраст, место работы, должность и еще несколько плюшек. Затем заполненный словарь возвращаем из функции.

Python:
def faker_person_create():
    age, b_date = calculate_age()
    credit_card = f'{faker.credit_card_number()}, Срок действия: {faker.credit_card_expire()}, ' \
                  f'CVS-код: {faker.credit_card_security_code()}'
    dict_mail = ['@mail.ru', '@yandex.ru', '@rambler.ru', '@gmail.com', '@bk.ru']
    name_f = faker.name()
    vk_ur = f'{str(name_f).split()[0].lower()}_{str(name_f).split()[2][:4].lower()}'
    dict_person = {'Ф.И.О.': name_f, 'Дата рождения': b_date, 'Возраст': age, 'Место работы': faker.company(),
                   'Должность': faker.job().lower(), 'Адрес': f'Россия, {faker.address()[0:-8]}',
                   'Почтовый индекс': faker.address()[-6:], 'Телефон': faker.phone_number(),
                   'E-mail': translit(str(name_f).split()[0].lower(), language_code='ru', reversed=True) + \
                             choice(dict_mail),
                   'Профиль VK': "https://vk.com/" + translit(vk_ur, language_code='ru', reversed=True). \
                       replace("'", "").replace(".", ""),
                   'Банковская карта': credit_card}

    return dict_person

Отдельно сделал случайный выбор почты из списка, чтобы не генерировалась стандартная example.com. Также сделал более осмысленный логин в почте, чтобы он создавался на основе сгенерированного имени. Так как то, что генерируется, не совсем сочетается с Ф.И.О. Для этого я делю Ф.И.О., затем беру первый элемент из списка, перевожу в нижний регистр. С помощью функции translit конвертирую слово в английские буквы и добавляю случайную почту из списка. То же и с профилем VK. Чтобы все было более-менее естественно и приближено к сгенерированному имени и фамилии.

Затем создаем функцию печати, print_person_data(dict_person, i), которая принимает сгенерированный словарь с данными, а также порядковый номер сгенерированных данных. После чего в цикле распечатывается и сохраняется в текстовый файл.

Python:
def print_person_data(dict_person, i):
    with open('person_faker.txt', 'a', encoding='utf-8') as file:
        file.write(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
    for item in dict_person:
        print(f'{item}: {dict_person[item]}')
        with open('person_faker.txt', 'a', encoding='utf-8') as file:
            file.write(f'{item}: {dict_person[item]}\n')

И функция main(). Здесь запрашиваю у пользователя количество личностей для генерации, После чего в цикле запускаю функции генерации и печати.

Python:
# pip install faker
# pip install transliterate

from datetime import date
from random import choice

from faker import Faker
from transliterate import translit

faker = Faker('ru_RU')


def calculate_age():
    today = date.today()
    year_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[0])
    month_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[1])
    day_f = int(str(faker.date_of_birth(minimum_age=25, maximum_age=50)).split("-")[2])
    age_t = today.year - year_f - ((today.month, today.day) < (month_f, day_f))
    bith_date = f'{day_f}.{month_f}.{year_f}'
    return age_t, bith_date


def faker_person_create():
    age, b_date = calculate_age()
    credit_card = f'{faker.credit_card_number()}, Срок действия: {faker.credit_card_expire()}, ' \
                  f'CVS-код: {faker.credit_card_security_code()}'
    dict_mail = ['@mail.ru', '@yandex.ru', '@rambler.ru', '@gmail.com', '@bk.ru']
    name_f = faker.name()
    vk_ur = f'{str(name_f).split()[0].lower()}_{str(name_f).split()[2][:4].lower()}'
    dict_person = {'Ф.И.О.': name_f, 'Дата рождения': b_date, 'Возраст': age, 'Место работы': faker.company(),
                   'Должность': faker.job().lower(), 'Адрес': f'Россия, {faker.address()[0:-8]}',
                   'Почтовый индекс': faker.address()[-6:], 'Телефон': faker.phone_number(),
                   'E-mail': translit(str(name_f).split()[0].lower(), language_code='ru', reversed=True) + \
                             choice(dict_mail),
                   'Профиль VK': "https://vk.com/" + translit(vk_ur, language_code='ru', reversed=True). \
                       replace("'", "").replace(".", ""),
                   'Банковская карта': credit_card}

    return dict_person


def print_person_data(dict_person, i):
    with open('person_faker.txt', 'a', encoding='utf-8') as file:
        file.write(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
    for item in dict_person:
        print(f'{item}: {dict_person[item]}')
        with open('person_faker.txt', 'a', encoding='utf-8') as file:
            file.write(f'{item}: {dict_person[item]}\n')


def main():
    person_count = int(input('\n[+] Введите количество личностей\n    для генерации >>> '))
    for i in range(person_count):
        print(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
        dict_person = faker_person_create()
        print_person_data(dict_person, i)


if __name__ == "__main__":
    main()

Все довольно просто и не требует особых усилий. Но, давайте рассмотрим еще одну библиотеку, которая мне понравилась гораздо больше. Хотя бы тем, что данных для генерации здесь намного больше. И они несколько разнообразнее, что ли. Давайте сделаем генератор, для примера с помощью библиотеки mimesis. Для начала ее нужно установить, поэтому пишем в терминале:

pip install mimesis

И импортируем все модули, которые нам понадобятся. А понадобиться их довольно много:

Python:
from datetime import date
from random import choice

from mimesis import Person, Address, Finance, Transport, Payment
from mimesis.builtins import RussiaSpecProvider
from mimesis.enums import Gender
from mimesis.locales import Locale

Теперь будем создавать фейковую личность. Ничего особо нового я тут не придумал. Все также заполняю словарь и передаю его из функции дальше. Создадим функцию: create_fake_person(). Для начала создадим объекты генерируемых данных.

Python:
address = Address(Locale.RU)
fin = Finance(Locale.RU)
person = Person(Locale.RU)
pay = Payment()
transport = Transport()
ru_spec = RussiaSpecProvider()

Кстати, здесь есть такая замечательная штука, как RussiaSpecProvider(). С ее помощью можно генерировать паспортные данные, СНИЛС, ИНН. Далее создаю список с почтой и в переменную возраст генерирую его в самом начале, для того, чтобы вычислить впоследствии год рождения от текущего года. Это будет не совсем правильно, очевидно, но, здесь особой точности не требуется.

Python:
mail_dict = ['mail.ru', 'gmail.com', 'rambler.ru', 'yandex.ru', 'hotmail.com', 'outlook.com', 'ya.ru', 'yahoo.com',
                 'mail.com', 'protonmail.com']
age_pers = person.age(minimum=22, maximum=66)

Python:
def create_fake_person():
    address = Address(Locale.RU)
    fin = Finance(Locale.RU)
    person = Person(Locale.RU)
    pay = Payment()
    transport = Transport()
    ru_spec = RussiaSpecProvider()

    mail_dict = ['mail.ru', 'gmail.com', 'rambler.ru', 'yandex.ru', 'hotmail.com', 'outlook.com', 'ya.ru', 'yahoo.com',
                 'mail.com', 'protonmail.com']
    age_pers = person.age(minimum=22, maximum=66)

    dict_person = {'Ф.И.О.': f'{person.first_name(gender=Gender.MALE)} {ru_spec.patronymic(gender=Gender.MALE)} ' \
                             f'{person.last_name(gender=Gender.MALE)}', 'Год рождения': date.today().year - age_pers,
                   'Возраст': age_pers, 'Адрес': f'{address.postal_code()}, {address.city()}, {address.address()}',
                   'Номер телефона': person.telephone(mask='+7-9##-###-####'),
                   'E-mail': person.email(domains=[choice(mail_dict)]), 'Паспорт': ru_spec.series_and_number(),
                   'ИНН': ru_spec.inn(), 'СНИЛС': ru_spec.snils(),
                   'Банковская карта': f'{pay.credit_card_number(card_type=None)}, ' \
                                       f'{pay.credit_card_expiration_date(minimum=23, maximum=27)}, {pay.cvv()}',
                   'Автомобиль': transport.car(), 'Образование': person.university(),
                   'Место работы': f'{fin.company_type(abbr=True)} {fin.company()}',
                   'Должность': person.occupation().lower(), 'Политические взгляды': person.political_views().lower(),
                   'Мировоззрение': person.worldview().lower(), 'Вес': person.weight(minimum=55, maximum=120),
                   'Группа крови': person.blood_type(), 'Логин': person.username(mask='l_Cd', drange=(1800, 2100)),
                   'Пароль': person.password(length=16, hashed=False)}
    return dict_person

Ну и дальше нужно распечатать и сохранить сгенерированные данные. Создаем точно такую же функцию, как и в предыдущем примере и печатаем полученный словарь, попутно его сохраняя.

Python:
def print_person(dict_person, i):
    with open('person_mimesis.txt', 'a', encoding='utf-8') as file:
        file.write(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
    for item in dict_person:
        print(f'{item}: {dict_person[item]}')
        with open('person_mimesis.txt', 'a', encoding='utf-8') as file:
            file.write(f'{item}: {dict_person[item]}\n')

В функции main() так же опрашиваем пользователя на предмет количества генерируемых персон и запускаем функции генерации и печати в цикле.

Python:
def main():
    person_count = int(input('\n[+] Введите количество личностей\n    для генерации >>> '))
    for i in range(person_count):
        print(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
        dict_person = create_fake_person()
        print_person(dict_person, i)

Я тут подумал о том, что можно было бы добавить сюда еще и запрос на пол генерируемой личности. Так как здесь пол указывается явно с помощью gender=Gender.MALE или gender=Gender.FEMALE. Таким образом, можно даже предоставить выбор, 50х50, ну или случайным образом. Но в коде это не сделал. Думаю, что делается это просто запросом у пользователя нужных данных и передачи их в функцию генерации.

Python:
# pip install mimesis

from datetime import date
from random import choice

from mimesis import Person, Address, Finance, Transport, Payment
from mimesis.builtins import RussiaSpecProvider
from mimesis.enums import Gender
from mimesis.locales import Locale


def create_fake_person():
    address = Address(Locale.RU)
    fin = Finance(Locale.RU)
    person = Person(Locale.RU)
    pay = Payment()
    transport = Transport()
    ru_spec = RussiaSpecProvider()

    mail_dict = ['mail.ru', 'gmail.com', 'rambler.ru', 'yandex.ru', 'hotmail.com', 'outlook.com', 'ya.ru', 'yahoo.com',
                 'mail.com', 'protonmail.com']
    age_pers = person.age(minimum=22, maximum=66)

    dict_person = {'Ф.И.О.': f'{person.first_name(gender=Gender.MALE)} {ru_spec.patronymic(gender=Gender.MALE)} ' \
                             f'{person.last_name(gender=Gender.MALE)}', 'Год рождения': date.today().year - age_pers,
                   'Возраст': age_pers, 'Адрес': f'{address.postal_code()}, {address.city()}, {address.address()}',
                   'Номер телефона': person.telephone(mask='+7-9##-###-####'),
                   'E-mail': person.email(domains=[choice(mail_dict)]), 'Паспорт': ru_spec.series_and_number(),
                   'ИНН': ru_spec.inn(), 'СНИЛС': ru_spec.snils(),
                   'Банковская карта': f'{pay.credit_card_number(card_type=None)}, ' \
                                       f'{pay.credit_card_expiration_date(minimum=23, maximum=27)}, {pay.cvv()}',
                   'Автомобиль': transport.car(), 'Образование': person.university(),
                   'Место работы': f'{fin.company_type(abbr=True)} {fin.company()}',
                   'Должность': person.occupation().lower(), 'Политические взгляды': person.political_views().lower(),
                   'Мировоззрение': person.worldview().lower(), 'Вес': person.weight(minimum=55, maximum=120),
                   'Группа крови': person.blood_type(), 'Логин': person.username(mask='l_Cd', drange=(1800, 2100)),
                   'Пароль': person.password(length=16, hashed=False)}
    return dict_person


def print_person(dict_person, i):
    with open('person_mimesis.txt', 'a', encoding='utf-8') as file:
        file.write(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
    for item in dict_person:
        print(f'{item}: {dict_person[item]}')
        with open('person_mimesis.txt', 'a', encoding='utf-8') as file:
            file.write(f'{item}: {dict_person[item]}\n')


def main():
    person_count = int(input('\n[+] Введите количество личностей\n    для генерации >>> '))
    for i in range(person_count):
        print(f'\n{"-" * 16} {i + 1} {"-" * 16}\n')
        dict_person = create_fake_person()
        print_person(dict_person, i)


if __name__ == "__main__":
    main()

Вот, собственно и все. С помощью данных функций можно получить достаточно личностей для того, чтобы зарегистрироваться где угодно. Главное – это потом не забыть где, когда и кто.

И да, можно еще использовать данные функции не совсем стандартно. То есть, они в своем составе имеют генератор паролей и имен пользователя. А значит, можно с помощью пары строк сделать генератор логинов и паролей. Единственное, мне генератор имен пользователя из faker не понравился. Больно уж персонализированные логины он генерит. Поэтому установил библиотеку random-username и генерировал логины с ее помощью. Установка в терминале:

pip install random-username

А вот код скриптика генерации:

Python:
# pip install random-username
# pip install faker

from faker import Faker
from random_username.generate import generate_username


faker = Faker('ru_RU')

for i in range(10):
    print(f'Логин: {generate_username()[0]}')
    print(f'Пароль: {faker.password(length=16, special_chars=True, digits=True, upper_case=True, lower_case=True)}\n')

Ну и собственно, то же самое, только уже без сторонних библиотек можно сделать и в mimesis. Вот то, что у меня получилось:

Python:
# pip install mimesis

from mimesis import Person
from mimesis.locales import Locale


person = Person(Locale.RU)
for i in range(10):
    print(f"Логин: {person.username(mask='l_d', drange=(1800, 2100))}")
    print(f"Пароль: {person.password(length=16, hashed=False)}\n")

А на этом все.

Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!