Как связать определенную функцию с кнопкой в Telegram-боте?

Как можно настроить вызов функции "func1" при нажатии на кнопку "yomoneyy"? Код: <br/> <br/> <pre><code class="python">if message.text == " 999 G | 999₽":
        markup = types.InlineKeyboardMarkup()
        yomoneyy = types.InlineKeyboardButton('⚜️ YoMoney', callback_data='yomoneyy') 
        markup.row(yomoneyy)
        bot.send_message(
            message.chat.id,
            text=" Выберите наиболее удобный для вас способ оплаты ⤵️".format(message.from_user),
            reply_markup=markup)        


@bot.message_handler(content_types=['photo'])
def func1(message: types.Message):
     if message.content_type == 'photo':                
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        true = types.KeyboardButton("✅ Правильный")
        false = types.KeyboardButton("❌ Я ошибся")
        markup.add(true, false)

        bot.send_message(
            message.chat.id,
            "❗️ &lt;b&gt;Проверьте, правильнй ли вы отправили скриншот.&lt;/b&gt;\n\n⚠️ &lt;i&gt;После подтверждения данный скриншот будет отправлен на обработку оплаты.&lt;/i&gt;",
            reply_markup=markup
    )
@bot.callback_query_handler(func=lambda call:True)
def teh_callback(call):
    
  if call.data == 'yomoneyy':  
    bot.delete_message(call.message.chat.id, call.message.message_id-0)
    bot.send_message(call.message.chat.id, f" Отправьте деньги по реквизитам на ⚜️ &lt;i&gt;....:&lt;/i&gt;\n♣️ Карта: &lt;code&gt;4000000000000000&lt;/code&gt;\n\n&lt;i&gt;Получатель:&lt;/i&gt; .....\n\n Сумма к оплате: 999₽\n Получаете: 999 G \n\n После оплаты, отправь сюда, в чат, скриншот оплаты") 
  bot.answer_callback_query(callback_query_id=call.id)</code></pre>
  • 22 января 2025 г. 14:14
Ответы на вопрос 2
Связать определенную функцию с кнопкой в Telegram-боте можно с помощью обработчика callback-запросов. У вас уже есть такой обработчик под названием `teh_callback`, который реагирует на нажатие кнопки `yomoneyy`. 

Однако, чтобы вызвать функцию `func1`, когда пользователь нажимает на кнопку, вам нужно убедиться, что вы вызываете `func1` внутри `teh_callback` или вызываете `func1` непосредственно через другой обработчик или функцию, передавая в нее необходимый контекст.

Вот пример, как вы можете это сделать, изменив ваш код:

```python
from telebot import TeleBot, types

bot = TeleBot('YOUR_TELEGRAM_BOT_API_TOKEN')

# Обработчик сообщений
@bot.message_handler(content_types=['photo'])
def func1(message: types.Message):
    if message.content_type == 'photo':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        true_button = types.KeyboardButton("✅ Правильный")
        false_button = types.KeyboardButton("❌ Я ошибся")
        markup.add(true_button, false_button)

        bot.send_message(
            message.chat.id,
            "❗️ Проверьте, правильный ли вы отправили скриншот.\n\n⚠️ После подтверждения данный скриншот будет отправлен на обработку оплаты.",
            reply_markup=markup
        )

# Обработчик callback-запросов
@bot.callback_query_handler(func=lambda call: True)
def teh_callback(call):
    if call.data == 'yomoneyy':
        bot.delete_message(call.message.chat.id, call.message.message_id)
        bot.send_message(call.message.chat.id, f"Отправьте деньги по реквизитам на ⚜️ ...:\n♣️ Карта: <code>4000000000000000</code>\n\n<i>Получатель:</i> ...\n\nСумма к оплате: 999₽\nПолучаете: 999 G\n\nПосле оплаты, отправь сюда, в чат, скриншот оплаты.")

        # Здесь мы вызываем функцию func1, отправив "пустое" сообщение для примера
        bot.register_next_step_handler(
            bot.send_message(call.message.chat.id, "Пожалуйста, отправьте ваш скриншот:"), 
            func1
        )

@bot.message_handler(content_types=['text'])
def echo_all(message):
    bot.reply_to(message, "Я вас не понимаю, пожалуйста, отправьте фото.")

bot.polling()
```

В этом примере мы используем функцию `bot.register_next_step_handler` для регистрации следующего шага (отправка фото) после того, как пользователь нажал на кнопку `yomoneyy`. После того, как пользователь отправит фото, оно будет обработано функцией `func1`.

Обратите внимание, что функция `func1` обрабатывает только сообщения с фотографиями. Убедитесь, что вы импортировали необходимые компоненты из библиотеки `telebot` и заменили `YOUR_TELEGRAM_BOT_API_TOKEN` на ваш токен API бота.
Сейчас в чем проблема? В обработке call.data == 'yomoneyy' вызывайте нужную функцию.
Похожие вопросы