Как можно добавить два сообщения в базу данных с помощью Telegram бота?

Как добавить информацию в базу данных телеграм-бота? Я хочу реализовать функцию словаря в моем тестовом боте, которая будет взаимодействовать с базой данных. Конкретно, я планирую, чтобы пользователь мог нажимать кнопку «Словарь», вводить первое и второе предложения в телеграме, и эти предложения должны записываться в базу данных. Я уже добавил функции, такие как connect_to_db, insert_data, dictionary_message и dictionary_message_step_2. Ниже приведен код: <br/> <pre><code class="python">@bot.message_handler(commands=['start'])
def fuctional_KEYBORD_bot(message):
    if message.text == 'Функции бота':
        message_user = "&lt;b&gt;Добро пожаловать главное меню бота&lt;/b&gt;\n\n" \
                       "В скором будущем мы будем добавлять сюда новые функции!"
        key = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button0 = types.KeyboardButton("Переводчик")
        button1 = types.KeyboardButton("Словарь")
        key.add(button0, button1)
        bot.send_message(message.from_user.id, message_user, reply_markup=key, parse_mode='html')
        bot.register_next_step_handler(message, impact_KEYBORD_bot)
        bot.register_next_step_handler(message, donat_user_bot)
        bot.register_next_step_handler(message, translate_message)
        bot.register_next_step_handler(message, dictionary_message)
@bot.message_handler(content_types=['text'])
def connect_to_db():
    conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    return conn
def insert_data(words, translate):
    conn = connect_to_db()
    cursor = conn.cursor()
    query = "INSERT INTO Dictionary (words, translate) VALUES (%s, %s)"
    cursor.execute(query, (words, translate))
    conn.c
  • 27 августа 2024 г. 13:14
Ответы на вопрос 2
Чтобы реализовать функционал добавления двух предложений в базу данных с помощью Telegram-бота, вы можете сделать несколько улучшений и настроек в вашем коде. Вам нужно будет организовать последовательность ввода данных от пользователя, чтобы они вводили слова и их переводы в нужном порядке. 

Вот пример того, как это можно сделать:

1. Вам нужно будет обработать ввод первого предложения (слова) и второго предложения (перевода) в виде шагов. 
2. Используйте состояние для управления этапами ввода.

Вот пример кода, который иллюстрирует предложенный подход:

```python
import telebot
from telebot import types
import psycopg2
import os

# Настройка бота
API_TOKEN = 'YOUR_API_TOKEN'
bot = telebot.TeleBot(API_TOKEN)
DATABASE_URL = os.getenv('DATABASE_URL')

# Создание соединения с базой данных
def connect_to_db():
    conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    return conn

# Вставка данных в базу данных
def insert_data(words, translate):
    conn = connect_to_db()
    cursor = conn.cursor()
    query = "INSERT INTO Dictionary (words, translate) VALUES (%s, %s)"
    cursor.execute(query, (words, translate))
    conn.commit()
    cursor.close()
    conn.close()

# Хранение состояния
user_states = {}

@bot.message_handler(commands=['start'])
def start(message):
    welcome_text = "<b>Добро пожаловать главное меню бота</b>\n\n" \
                   "В скором будущем мы будем добавлять сюда новые функции!"
    key = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button0 = types.KeyboardButton("Переводчик")
    button1 = types.KeyboardButton("Словарь")
    key.add(button0, button1)
    bot.send_message(message.from_user.id, welcome_text, reply_markup=key, parse_mode='html')

@bot.message_handler(func=lambda message: message.text == "Словарь")
def dictionary_message(message):
    user_states[message.from_user.id] = 'waiting_for_word'
    bot.send_message(message.from_user.id, "Введите первое предложение:")

@bot.message_handler(func=lambda message: user_states.get(message.from_user.id) == 'waiting_for_word')
def dictionary_message_step_2(message):
    words = message.text
    user_states[message.from_user.id] = 'waiting_for_translation'
    user_states[message.from_user.id + '_word'] = words
    bot.send_message(message.from_user.id, "Введите второе предложение (перевод):")

@bot.message_handler(func=lambda message: user_states.get(message.from_user.id) == 'waiting_for_translation')
def save_to_db(message):
    translate = message.text
    words = user_states.pop(message.from_user.id + '_word', None)  # Получаем слово из состояния

    if words:
        insert_data(words, translate)
        bot.send_message(message.from_user.id, "Слова успешно добавлены в словарь!")
    else:
        bot.send_message(message.from_user.id, "Произошла ошибка. Попробуйте еще раз.")

    # Завершение процесса ввода
    user_states.pop(message.from_user.id, None)

# Запуск бота
if __name__ == "__main__":
    bot.polling(none_stop=True)
```

### Объяснение кода:

1. **Соединение с БД:** Функция `connect_to_db()` используется для соединения с PostgreSQL.
2. **Добавление данных:** Функция `insert_data()` добавляет записи в таблицу `Dictionary`.
3. **Состояния пользователей:** Словарь `user_states` используется для отслеживания состояния каждого пользователя. Это позволяет знать, на каком этапе находится ввод данных.
4. **Обработчики сообщений:**
   - `dictionary_message`: Запускает процесс добавления слов в словарь.
   - `dictionary_message_step_2`: Сохраняет введенное слово и запрашивает перевод.
   - `save_to_db`: Сохраняет перевод в базу данных вместе с соответствующим словом.
5. **Команда `/start`:** Обрабатывает команду и показывает кнопки для взаимодействия.

Этот код должен помочь вам реализовать функционал словаря в вашем боте. Просто обратите внимание на то, чтобы заменить `YOUR_API_TOKEN` на ваш реальный токен бота и корректно установить переменную `DATABASE_URL` для подключения к вашей базе данных.
bot.register_next_step_handler(message, impact_KEYBORD_bot)
bot.register_next_step_handler(message, donat_user_bot)
bot.register_next_step_handler(message, translate_message)
bot.register_next_step_handler(message, dictionary_message)

Так ты выбери что-то одно. У одного сообщения может быть только один next step handler. Если нужна цеполчка из более чем двух шагов, то на втором шаге ставь следующий handler, и так далее.
Похожие вопросы