Генерация фейковой личности, то есть данных, которых не существует на самом деле, может понадобиться при работе над большим проектом. И, для того, чтобы не наполнять базы данных вручную, были созданы специальные библиотеки, которые сделают это в автоматическом режиме. Тем более, что генерация данных занимает считанные секунды. Ну, а тем, кто не занимается разработкой, данные библиотеки также могут пригодиться. Тут уже все зависит от вашей фантазии. В этом случае генераторы фейковых личностей подойдут также как нельзя кстати. Давайте сделаем парочку, на разных библиотеках. Тем более, что они более-менее похожи. Различается лишь количество встроенного функционала.
Что потребуется?
Для начала давайте поработаем с библиотекой для генерации фейковых данных faker. Так же нам понадобиться библиотека transliterate для транслитерации русских слов английскими буквами. Установим их с помощью терминала:
А теперь нужно импортировать в проект как те библиотеки, что были только что установлены, так и те, что понадобятся в дальнейшем. Поэтому, сразу же импортируем их в скрипт:
Теперь нужно создать объект фейкер с русской локализацией. Сделаем этот объект глобальным, чтобы доступ к нему был из каждой функции. Для этого пишем:
Создадим функцию calculate_age(). Как следует из ее названия, она будет вычислять возраст, отталкиваясь от текущей даты и даты, которую сгенерирует в качестве даты рождения библиотека фейкера. Здесь все довольно просто. Получаем текущую дату. Затем разделяем ее по «-» и забираем по отдельности год, месяц и день. Отнимаем от текущего года год рождения, затем сравниваем текущие месяц и день с месяцем и днем рождения. Если текущий месяц и день меньше, чем месяц и день рождения, то отнимаем единицу. Ведь в текущем году еще не было дня рождения. Затем компонуем дату рождения и возвращаем из функции возраст и дату рождения для дальнейшего использования.
Теперь создадим фейковую личность. Я создал функцию faker_person_create(). В ней я заполняю словарь данными, которые генерируются с помощью faker. Взял именно те, что мне показались более актуальны в данном контексте. Более подробно о библиотеке можно почитать на сайте с документацией. Здесь получаем Ф.И.О., дату рождения, возраст, место работы, должность и еще несколько плюшек. Затем заполненный словарь возвращаем из функции.
Отдельно сделал случайный выбор почты из списка, чтобы не генерировалась стандартная example.com. Также сделал более осмысленный логин в почте, чтобы он создавался на основе сгенерированного имени. Так как то, что генерируется, не совсем сочетается с Ф.И.О. Для этого я делю Ф.И.О., затем беру первый элемент из списка, перевожу в нижний регистр. С помощью функции translit конвертирую слово в английские буквы и добавляю случайную почту из списка. То же и с профилем VK. Чтобы все было более-менее естественно и приближено к сгенерированному имени и фамилии.
Затем создаем функцию печати, print_person_data(dict_person, i), которая принимает сгенерированный словарь с данными, а также порядковый номер сгенерированных данных. После чего в цикле распечатывается и сохраняется в текстовый файл.
И функция main(). Здесь запрашиваю у пользователя количество личностей для генерации, После чего в цикле запускаю функции генерации и печати.
Все довольно просто и не требует особых усилий. Но, давайте рассмотрим еще одну библиотеку, которая мне понравилась гораздо больше. Хотя бы тем, что данных для генерации здесь намного больше. И они несколько разнообразнее, что ли. Давайте сделаем генератор, для примера с помощью библиотеки mimesis. Для начала ее нужно установить, поэтому пишем в терминале:
И импортируем все модули, которые нам понадобятся. А понадобиться их довольно много:
Теперь будем создавать фейковую личность. Ничего особо нового я тут не придумал. Все также заполняю словарь и передаю его из функции дальше. Создадим функцию: create_fake_person(). Для начала создадим объекты генерируемых данных.
Кстати, здесь есть такая замечательная штука, как RussiaSpecProvider(). С ее помощью можно генерировать паспортные данные, СНИЛС, ИНН. Далее создаю список с почтой и в переменную возраст генерирую его в самом начале, для того, чтобы вычислить впоследствии год рождения от текущего года. Это будет не совсем правильно, очевидно, но, здесь особой точности не требуется.
Ну и дальше нужно распечатать и сохранить сгенерированные данные. Создаем точно такую же функцию, как и в предыдущем примере и печатаем полученный словарь, попутно его сохраняя.
В функции main() так же опрашиваем пользователя на предмет количества генерируемых персон и запускаем функции генерации и печати в цикле.
Я тут подумал о том, что можно было бы добавить сюда еще и запрос на пол генерируемой личности. Так как здесь пол указывается явно с помощью gender=Gender.MALE или gender=Gender.FEMALE. Таким образом, можно даже предоставить выбор, 50х50, ну или случайным образом. Но в коде это не сделал. Думаю, что делается это просто запросом у пользователя нужных данных и передачи их в функцию генерации.
Вот, собственно и все. С помощью данных функций можно получить достаточно личностей для того, чтобы зарегистрироваться где угодно. Главное – это потом не забыть где, когда и кто.
И да, можно еще использовать данные функции не совсем стандартно. То есть, они в своем составе имеют генератор паролей и имен пользователя. А значит, можно с помощью пары строк сделать генератор логинов и паролей. Единственное, мне генератор имен пользователя из faker не понравился. Больно уж персонализированные логины он генерит. Поэтому установил библиотеку random-username и генерировал логины с ее помощью. Установка в терминале:
А вот код скриптика генерации:
Ну и собственно, то же самое, только уже без сторонних библиотек можно сделать и в mimesis. Вот то, что у меня получилось:
А на этом все.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна.
Дисклеймер: Данная статья предоставлена для ознакомления и не призывает ни к каким действиям
Что потребуется?
Для начала давайте поработаем с библиотекой для генерации фейковых данных 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")
А на этом все.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна.
Последнее редактирование: