Пост

Telegram-бот для регистрации и покупки баллов

В данной статье я расскажу о том как я делал бота для telegram.

Telegram-бот для регистрации и покупки баллов

Описание

Этот Telegram-бот позволяет пользователям зарегистрироваться, проверить баланс и купить баллы с помощью QR-кода. Оплата осуществляется через систему СБП, а данные пользователей хранятся в MySQL.

Основные функции

  • Регистрация пользователей с начальным бонусом 5 баллов.
  • Проверка текущего баланса.
  • Покупка баллов через QR-код СБП.
  • Автоматическое зачисление баллов после подтверждения оплаты.
  • Простое меню управления.

Используемые технологии

  • Node.js - среда выполнения JavaScript.
  • node-telegram-bot-api - библиотека для работы с Telegram API.
  • MySQL - база данных для хранения информации о пользователях.
  • qrcode - библиотека для генерации QR-кодов.

Код бота

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const TelegramBot = require('node-telegram-bot-api');
const mysql = require('mysql2');
const QRCode = require('qrcode');
const fs = require('fs');
const path = require('path');

const TELEGRAM_BOT_TOKEN = "ВАШ_ТОКЕН";
const bot = new TelegramBot(TELEGRAM_BOT_TOKEN, { polling: true });

// Подключение к MySQL
const db = mysql.createConnection({
  host: "localhost",
  user: "sysadmin",
  password: "ВАШ_ПАРОЛЬ",
  database: "quiz_helper"
});

db.connect(err => {
  if (err) throw err;
  console.log("✅ Подключено к базе данных");
});

// Функция регистрации пользователя
const registerUser = (chatId, username) => {
  db.query("SELECT * FROM users WHERE chat_id = ?", [chatId], (err, results) => {
    if (err) throw err;
    if (results.length === 0) {
      db.query("INSERT INTO users (chat_id, username, balance) VALUES (?, ?, 5)", [chatId, username], (err) => {
        if (err) throw err;
        bot.sendMessage(chatId, "✅ Вы успешно зарегистрированы! Вам начислено 5 баллов.");
      });
    } else {
      bot.sendMessage(chatId, "⚠️ Вы уже зарегистрированы.");
    }
  });
};

// Функция проверки баланса
const getBalance = (chatId) => {
  db.query("SELECT balance FROM users WHERE chat_id = ?", [chatId], (err, results) => {
    if (err) throw err;
    if (results.length > 0) {
      bot.sendMessage(chatId, `💰 Ваш баланс: ${results[0].balance} баллов.`);
    } else {
      bot.sendMessage(chatId, "❌ Вы не зарегистрированы. Нажмите 'Зарегистрироваться'.");
    }
  });
};

// Функция для генерации QR-кода
const generateQRCode = async (chatId, amount) => {
  const paymentUrl = `https://ВАШ_ТОКЕН_ДЛЯ_ОПЛАТЫ&amount=${amount}`;
  
  QRCode.toFile('qrcode.png', paymentUrl, (err) => {
    if (err) {
      console.error("Ошибка при генерации QR-кода:", err);
      return;
    }

    bot.sendPhoto(chatId, path.join(__dirname, 'qrcode.png'), { 
      caption: `Сканируйте QR-код для оплаты ${amount} руб. через СБП.`
    }).catch((error) => {
      console.error("Ошибка при отправке фото:", error);
    });
  });
};

// Функция автоматического зачисления баллов после оплаты
const addBalanceAfterPayment = (chatId, amount) => {
  db.query("UPDATE users SET balance = balance + ? WHERE chat_id = ?", [amount / 10, chatId], (err) => {
    if (err) throw err;
    bot.sendMessage(chatId, `✅ Оплата подтверждена! Вам зачислено ${amount / 10} баллов.`);
  });
};

// Главное меню
const mainMenu = {
  reply_markup: {
    keyboard: [["Зарегистрироваться"], ["Купить баллы"], ["Узнать баланс баллов"]],
    resize_keyboard: true
  }
};

// Подменю покупки баллов
const buyMenu = {
  reply_markup: {
    keyboard: [["10 баллов - 100 руб."], ["20 баллов - 200 руб."], ["50 баллов - 500 руб."], ["Vip - 1000 руб."], ["⬅ Назад"]],
    resize_keyboard: true
  }
};

// Обработчики команд
bot.on('message', (msg) => {
  const chatId = msg.chat.id;
  const text = msg.text;

  switch (text) {
    case "Зарегистрироваться":
      registerUser(chatId, msg.chat.username || "unknown");
      break;
    case "Купить баллы":
      bot.sendMessage(chatId, "Выберите количество баллов:", buyMenu);
      break;
    case "Узнать баланс баллов":
      getBalance(chatId);
      break;
    case "10 баллов - 100 руб.":
      generateQRCode(chatId, 100);
      break;
    case "20 баллов - 200 руб.":
      generateQRCode(chatId, 200);
      break;
    case "50 баллов - 500 руб.":
      generateQRCode(chatId, 500);
      break;
    case "Vip - 1000 руб.":
      generateQRCode(chatId, 1000);
      break;
    case "⬅ Назад":
      bot.sendMessage(chatId, "Главное меню", mainMenu);
      break;
    default:
      bot.sendMessage(chatId, "🔹 Выберите действие:", mainMenu);
      break;
  }
});

bot.on('polling_error', (error) => {
  console.error("Ошибка при polling:", error);
});

console.log("🤖 Бот запущен...");

SQL к базе данных

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE DATABASE IF NOT EXISTS quiz_helper;
USE quiz_helper;

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    chat_id BIGINT UNIQUE NOT NULL,
    username VARCHAR(255),
    balance INT DEFAULT 5
);

CREATE TABLE IF NOT EXISTS answers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    question TEXT UNIQUE NOT NULL,
    correct_answer TEXT NOT NULL
);

Как запустить бота

  1. Установите Node.js и npm.
  2. Установите зависимости командой:
    1
    
    npm install node-telegram-bot-api mysql2 qrcode fs path
    
  3. Вставьте свой Telegram Bot Token в переменную TELEGRAM_BOT_TOKEN.
  4. Настройте MySQL и создайте таблицу users.
  5. Запустите бота командой:
    1
    
    node bot.js
    

Итог

Этот бот упрощает процесс регистрации и покупки баллов с оплатой через QR-код. Теперь он автоматически зачисляет баллы после подтверждения оплаты! 🚀

Скачать бота

Авторский пост защищен лицензией CC BY 4.0 .