@Nusup

Как сохранять сообщения c пометкой изменено в telegram боте?

Подскажите логику, если юзер(сделал ошибку в тексте) после изменил сообщение, сделав его с пометкой "изменено", как можно поменять user.func , чтобы во время отправки в бд это было уже измененное сообщение.
Может есть какой-нибудь метод?
Вот код:
import telebot
import mysql.connector
from telebot import types, TeleBot
from telebot.types import Message

bot = telebot.TeleBot("")

# Подключение к MySQL
 db = mysql.connector.connect(
     host="",
     user="",
     passwd="",
     port="",
     database=""
 ) 
cursor = db.cursor()

user_data = {}

# Последовательность шагов
class User:
    def __init__(self, openvisit):
        self.openvisit = openvisit
        self.name = ''
        self.email = ''
        self.phone = ''

# Убрать клавиатуру
remove_keyboard = types.ReplyKeyboardRemove()

@bot.message_handler(commands=['start'])
def send_welcome(message):

    # Меню кнопок
    reg = types.ReplyKeyboardMarkup(one_time_keyboard=True)
    reg_btn = types.KeyboardButton(text='Зарегистрироваться')
    reg.add(reg_btn)

    msg = bot.send_message(message.chat.id, "Здравствуйте, это бот-помощник, присутупим к регистрации?", reply_markup=reg)
    bot.register_next_step_handler(msg, process_openvisit_step)

def process_openvisit_step(message):
    user_id = message.from_user.id
    user_data[user_id] = User(message.text)

    msg = bot.send_message(message.chat.id, "Введите имя:",  reply_markup=remove_keyboard)
    bot.register_next_step_handler(msg, process_name_step)

def process_name_step(message):
    user_id = message.from_user.id
    user = user_data[user_id]
    user.name = message.text

    msg = bot.send_message(message.chat.id, "Введите Email:")
    bot.register_next_step_handler(msg, process_email_step)

def process_email_step(message):
    user_id = message.from_user.id
    user = user_data[user_id]
    user.email = message.text

    msg = bot.send_message(message.chat.id, 'Введите сотовый номер без "8" и "+7" (Например: 7014441122):')
    bot.edit_message_text(msg.chat.id, message.message_id, 'Введите сотовый номер без "8" и "+7" (Например: 7014441122):')

def process_phone_step(message):
    user_id = message.from_user.id
    user = user_data[user_id]
    user.phone = message.text

    # Меню кнопок
    closereg = types.ReplyKeyboardMarkup(one_time_keyboard=True)
    closereg_btn = types.KeyboardButton(text='Закончить регистрацию')
    closereg.add(closereg_btn)

     # Сохранение в БД
     sql = "INSERT INTO users (user_id,name,email,phone) \
                                                             VALUES (%s, %s, %s, %s)"
     val = (user_id, user.name, user.email, user.phone)
     cursor.execute(sql, val)
     db.commit()

    msg = bot.send_message(message.chat.id, "Спасибо за регистрацию!",reply_markup=closereg)
    bot.register_next_step_handler(msg, send_welcome)

# Enable saving next step handlers to file "./.handlers-saves/step.save".
# Delay=2 means that after any change in next step handlers (e.g. calling register_next_step_handler())
# saving will hapen after delay 2 seconds.
bot.enable_save_next_step_handlers(delay=2)

# Load next_step_handlers from save file (default "./.handlers-saves/step.save")
# WARNING It will work only if enable_save_next_step_handlers was called!
bot.load_next_step_handlers()

if __name__ == '__main__':
    bot.polling(none_stop=True)
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Используйте @bot.edited_message_handler чтобы отловить момент с измененным сообщением.
Главная проблема будет состоять в том, что вам надо будет понять что за сообщение поменялось. Первой версии сообщения вы уже не получите. Вы можете хранить ID сообщения где пользователь ввел имя, ID где фамилию, телефон и т.д. И уже по этим ID понимать что было изменено.

И это легко реализовать уже после записи данных в БД. А вот вклиниться посреди работы схемы из множества register_next_step_handler уже будет сложнее. Или нет, не пробовал. Но вы поэкспериментируйте!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы