Как создать базу данных при команде /start в Telegram боте
При разработке Telegram-бота на Python часто возникает необходимость сразу после команды /start сохранить данные пользователя: его ID, имя, количество монет (по умолчанию 1) и количество рефералов (по умолчанию 0). Ввод от пользователя не требуется - всё должно происходить автоматически. В этой статье мы разберём готовое решение с использованием SQLite и библиотеки python-telegram-bot.
Подготовка окружения и подключение библиотек
Для работы вам понадобятся библиотеки python-telegram-bot и встроенная sqlite3. Установите их через pip:
pip install python-telegram-botИмпортируем необходимые модули и создаём подключение к базе данных:
import sqlite3
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
# Подключение к БД (файл users.db)
conn = sqlite3.connect('users.db', check_same_thread=False)
cursor = conn.cursor()Создание таблицы пользователей
Перед первым использованием нужно создать таблицу, если её ещё нет. Выполните этот код один раз (например, при запуске бота):
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
first_name TEXT,
coins INTEGER DEFAULT 1,
referrals INTEGER DEFAULT 0
)
''')
conn.commit()Здесь user_id - уникальный идентификатор пользователя из Telegram, first_name - его имя, coins и referrals - числовые поля со значениями по умолчанию 1 и 0 соответственно.
Обработчик команды /start с добавлением в БД
Теперь напишем функцию, которая будет вызываться при команде /start. Она проверяет, есть ли пользователь в базе, и если нет - добавляет его:
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.effective_user
user_id = user.id
first_name = user.first_name or "Пользователь"
# Проверяем, существует ли уже запись
cursor.execute('SELECT user_id FROM users WHERE user_id = ?', (user_id,))
if cursor.fetchone() is None:
# Добавляем нового пользователя со значениями по умолчанию
cursor.execute('''
INSERT INTO users (user_id, first_name, coins, referrals)
VALUES (?, ?, 1, 0)
''', (user_id, first_name))
conn.commit()
await update.message.reply_text(f"Привет, {first_name}! Твой профиль создан.")
else:
await update.message.reply_text(f"С возвращением, {first_name}!")Обратите внимание: мы используем update.effective_user, чтобы получить ID и имя пользователя даже в группах или каналах. После успешной вставки бот отправляет приветственное сообщение.
Запуск бота и регистрация хендлера
Осталось создать экземпляр приложения и добавить обработчик команды:
def main():
app = Application.builder().token("ВАШ_ТОКЕН_БОТА").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
if __name__ == '__main__':
main()Замените ВАШ_ТОКЕН_БОТА на реальный токен, полученный от BotFather. После запуска бот будет автоматически сохранять каждого нового пользователя в таблицу users.
Проверка работы и возможные ошибки
Чтобы убедиться, что данные записываются корректно, можно добавить команду для просмотра статистики:
async def stats(update: Update, context: ContextTypes.DEFAULT_TYPE):
cursor.execute('SELECT COUNT(*), SUM(coins), SUM(referrals) FROM users')
count, total_coins, total_refs = cursor.fetchone()
await update.message.reply_text(
f"Всего пользователей: {count}\n"
f"Общее количество монет: {total_coins}\n"
f"Общее количество рефералов: {total_refs}"
)Не забудьте добавить в main() обработчик CommandHandler("stats", stats). Если возникают ошибки, проверьте права на запись в директорию с ботом и корректность токена.
Заключение
Мы рассмотрели простой и надёжный способ автоматического создания записи в базе данных при команде /start. Используя SQLite и python-telegram-bot, вы можете легко расширить функционал: добавить поле для баланса, логирование действий или интеграцию с реферальной системой. Главное - не забывайте про обработку ошибок и закрытие соединения с БД при завершении работы бота.