Как стать автором
Обновить

Создаем Telegram-бота для генерации случайных пользовательских данных на Python

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров1.6K

Привет, Хабр! Сегодня я хочу поделиться опытом создания полезного инструмента для разработчиков и тестировщиков — Telegram-бота, который генерирует реалистичные пользовательские данные с учетом национальных особенностей. Такой бот может пригодиться при тестировании приложений, заполнении тестовых баз данных или при разработке прототипов.

Перед прочтением, можете протестировать бота — тут.

Что умеет наш бот?

  • Генерирует случайные, но реалистичные данные пользователей (на сколько это возможно, сами понимаете)) )

  • Поддерживает 5 стран: Россия, США, Великобритания, Германия и Франция. Список можно расширять до бесконечности

  • Выдает результаты в текстовом формате или JSON

  • Позволяет настраивать параметры генерации (пол, национальность, количество результатов)

  • Генерирует широкий спектр данных: от базовых (имя, адрес) до расширенных (образование, хобби)

Пример работы бота
Пример работы бота

Подготовка к разработке

1. Установка Python и необходимых инструментов

Если у вас еще нет Python, скачайте и установите его с официального сайта. Убедитесь, что установлена версия 3.8 или выше.

2. Создание бота в Telegram

  1. Откройте Telegram и найдите @BotFather

  2. Отправьте команду /newbot

  3. Следуйте инструкциям и получите токен бота

  4. Сохраните токен — он нам понадобится позже

Архитектура проекта

Проект построен по модульному принципу и состоит из следующих основных компонентов:

bot/
├── __init__.py
├── main.py           # Основной файл бота
├── handlers.py       # Обработчики команд
├── user_generator.py # Генератор данных
├── database.py      # Работа с БД
├── utils.py         # Вспомогательные функции
├── keyboards.py     # Клавиатуры бота
└── settings.py      # Настройки пользователей

Технический стек

python-telegram-bot==20.8
SQLAlchemy==2.0.28
aiosqlite==0.20.0
python-dotenv==1.0.1
aiohttp==3.9.3
greenlet==3.0.1 

Пошаговая реализация

1. Подготовка окружения

Создадим виртуальное окружение и установим необходимые зависимости:

python -m venv venv
source venv/bin/activate  # для Linux/macOS
# или
venv\Scripts\activate  # для Windows

pip install python-telegram-bot sqlalchemy aiosqlite

2. Основной класс для генерации данных

Ключевой компонент нашего бота — класс UserGenerator. Он отвечает за создание реалистичных данных:

class UserGenerator:
    def __init__(self):
        # Базовые данные для России (для примера)
    _first_names_male = [
        "Александр", "Дмитрий", "Максим", "Сергей", "Андрей",
        "Алексей", "Артём", "Илья", "Кирилл", "Михаил"
    ]
    
    _first_names_female = [
        "Анна", "Мария", "Елена", "Дарья", "София",
        "Алиса", "Виктория", "Полина", "Екатерина", "Ксения"
    ]
    
    _last_names_male = [
        "Иванов", "Смирнов", "Кузнецов", "Попов", "Васильев",
        "Петров", "Соколов", "Михайлов", "Новиков", "Федоров"
    ]
    
    _last_names_female = [
        "Иванова", "Смирнова", "Кузнецова", "Попова", "Васильева",
        "Петрова", "Соколова", "Михайлова", "Новикова", "Федорова"
    ]
    
    def generate_user(self, country_code="RU", gender=None):
        # Если пол не указан, выбираем случайный
        gender = gender or random.choice(["male", "female"])
        
        user_data = {
            "id": self._generate_id(),
            "gender": gender,
            "nationality": country_code,
            "birth_date": self._generate_birth_date()
        }
        
        # Добавление имени и фамилии
        if user_data["gender"] == "male":
            user_data["first_name"] = random.choice(self._first_names_male[country_code])
            user_data["last_name"] = random.choice(self._last_names_male[country_code])
        else:
            user_data["first_name"] = random.choice(self._first_names_female[country_code])
            user_data["last_name"] = random.choice(self._last_names_female[country_code])
            
        # Генерируем дату рождения (18-80 лет)
        today = datetime.now()
        days = random.randint(18*365, 80*365)
        birth_date = today - timedelta(days=days)
        
        # Формируем данные пользователя
        user_data = {
            "first_name": first_name,
            "last_name": last_name,
            "gender": "мужской" if gender == "male" else "женский",
            "birth_date": birth_date.strftime("%d.%m.%Y"),
            "email": f"{first_name.lower()}.{last_name.lower()}@example.com",
            "phone": f"+7{random.randint(900,999)}{random.randint(1000000,9999999)}"
        }
        
        return user_data

Инициализатор полностью тут не уместил, так как там большой (очень) набор данных. С этой задачей справится бесплатная версия любой языковой модели

3. Обработчики команд

Реализуем основные команды бота:

from telegram import Update
from telegram.ext import ContextTypes
from .user_generator import UserGenerator
from .database import Database
from .keyboards import get_settings_keyboard, get_gender_keyboard

# Инициализируем базу данных
db = Database('bot.db')
generator = UserGenerator()

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Обработчик команды /start"""
    user = update.effective_user
    db.add_user(user.id, user.username)
    
    await update.message.reply_text(
        f"Привет, {user.first_name}! 👋\n\n"
        "Я бот для генерации случайных пользовательских данных.\n"
        "Используйте:\n"
        "/generate - генерация данных\n"
        "/settings - настройка параметров"
    )

async def generate(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Обработчик команды /generate"""
    user_data = generator.generate_user()
    
    # Форматируем ответ
    response = (
        f"👤 *Сгенерированные данные:*\n\n"
        f"*Имя:* {user_data['first_name']}\n"
        f"*Фамилия:* {user_data['last_name']}\n"
        f"*Пол:* {user_data['gender']}\n"
        f"*Дата рождения:* {user_data['birth_date']}\n"
        f"*Email:* {user_data['email']}\n"
        f"*Телефон:* {user_data['phone']}"
    )
    
    await update.message.reply_text(response, parse_mode='Markdown')

async def settings(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Обработчик команды /settings"""
    await update.message.reply_text(
        "⚙️ Настройки генерации данных:",
        reply_markup=get_settings_keyboard()
    )

4. Работа с базой данных

Для хранения настроек пользователей и статистики используем SQLite через SQLAlchemy:

from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    telegram_id = Column(Integer, unique=True)
    username = Column(String)
    is_admin = Column(Boolean, default=False)

class Settings(Base):
    __tablename__ = 'settings'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, unique=True)
    nationality = Column(String, default="RU")
    gender = Column(String, default="any")
    results_count = Column(Integer, default=1)

5. Интерфейс настроек

Реализуем удобное меню настроек с помощью Inline-клавиатур:

def get_settings_keyboard():
    return InlineKeyboardMarkup([
        [InlineKeyboardButton("🌍 Национальность", callback_data="settings_nat")],
        [InlineKeyboardButton("👤 Пол", callback_data="settings_gender")],
        [InlineKeyboardButton("🔢 Количество результатов", callback_data="settings_count")],
        [InlineKeyboardButton("🔐 Настройки пароля", callback_data="settings_password")],
        [InlineKeyboardButton("📋 Выбор полей", callback_data="settings_fields")]
    ])

6. Создание точки входа

from bot.main import main

if __name__ == "__main__":
    main()

Развертывание на сервере

1. Подготовка сервера

Арендуйте VPS с Ubuntu (подойдет самый базовый тариф) и подключитесь к нему по SSH.

2. Установка необходимого ПО

# Обновляем систему
sudo apt update
sudo apt upgrade -y

# Устанавливаем необходимые пакеты
sudo apt install -y python3 python3-pip python3-venv git supervisor

3. Настройка проекта

# Создаем пользователя для бота
sudo useradd -m -s /bin/bash tgbot
sudo su - tgbot

# Клонируем репозиторий
git clone https://github.com/ваш-репозиторий/fakenamegeneratorbot.git
cd fakenamegeneratorbot

# Создаем виртуальное окружение
python3 -m venv venv
source venv/bin/activate

# Устанавливаем зависимости
pip install -r requirements.txt

# Создаем файл с токеном
echo "BOT_TOKEN='ваш_токен_здесь'" > .env

4. Настройка Supervisor

Создайте файл конфигурации:

sudo nano /etc/supervisor/conf.d/tgbot.conf

Содержимое файла:

[program:tgbot]
directory=/home/tgbot/fakenamegeneratorbot
command=/home/tgbot/fakenamegeneratorbot/venv/bin/python run.py
user=tgbot
autostart=true
autorestart=true
stderr_logfile=/var/log/tgbot.err.log
stdout_logfile=/var/log/tgbot.out.log

Запускаем бота:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start tgbot

Основные команды для пользования ботом:

# Проверка статуса
sudo supervisorctl status tgbot

# Просмотр логов
tail -f /var/log/tgbot.out.log

# Перезапуск бота
sudo supervisorctl restart tgbot

Что дальше?

Теперь у вас есть работающий бот для генерации случайных данных! Вот несколько идей для его улучшения:

  1. Добавьте поддержку других стран

  2. Расширьте набор генерируемых данных

  3. Добавьте генерацию в формате JSON

  4. Реализуйте ограничение на количество запросов

  5. Добавьте административную панель

Частые проблемы и их решение

Бот не отвечает:

  • Проверьте логи: tail -f /var/log/tgbot.err.log

  • Убедитесь, что токен указан правильно

  • Проверьте статус бота: sudo supervisorctl status tgbot

Ошибки при установке зависимостей:

  • Обновите pip: pip install --upgrade pip

  • Установите системные зависимости: sudo apt install python3-dev

Проблемы с правами доступа:

  • Проверьте владельца файлов: ls -la

  • При необходимости измените: sudo chown -R tgbot:tgbot /home/tgbot/fakenamegeneratorbot

Заключение

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

Полный исходный код проекта доступен на GitHub.

Надеюсь, этот туториал был полезен! Если у вас возникли вопросы или предложения по улучшению бота, пишите в комментариях.


P.S. Не забудьте поставить звездочку репозиторию на GitHub, если статья оказалась полезной! 😉

Теги:
Хабы:
+3
Комментарии9

Публикации

Работа

Data Scientist
50 вакансий

Ближайшие события