-
-
Save dmp40/c6ce4d0fd8cc153ea62ef5aca7ff0267 to your computer and use it in GitHub Desktop.
# версия от 14 мая 22 делаю рыбу для отработки перехода по клавиатуре бота | |
import telebot | |
import time | |
from telebot import types #для работы клавиатуры | |
from datetime import datetime | |
import gspread | |
from telebot.types import ReplyKeyboardMarkup | |
from settings import googlesheet_id, token, googlesheet_cluc | |
bot = telebot.TeleBot(token) | |
@bot.message_handler( commands = [ 'start', 'help' ]) | |
def send_welcome(message ): | |
bot.reply_to(message, 'Привет, здесь можно пройти тест на гибкость. ') | |
keyboard = types.InlineKeyboardMarkup() | |
key_yes = types.InlineKeyboardButton(text='Да', callback_data= 'yes') | |
key_no = types.InlineKeyboardButton(text='Нет', callback_data='no') | |
keyboard.add(key_yes,key_no) | |
bot.send_message(message.chat.id, 'Готовы пройти тест на гибкость?', reply_markup=keyboard) | |
@bot.callback_query_handler(func=lambda call: True) | |
def callback_worker(call): | |
if call.data == 'yes': | |
print('Вывести видео') | |
bot.send_message(call.message.chat.id, 'Здесь будет видео') | |
bot.send_message(call.message.chat.id, 'Достали до колен - 1, до щиколоток - 2, до пола - 3') | |
elif call.data == 'no': | |
print('Нажато Далее') | |
else: | |
bot.send_message(call.message.chat.id, 'https://www.youtube.com/watch?v=wDtqkdamyBM') | |
key_ball = types.ReplyKeyboardMarkup(resize_keyboard= True) | |
item_1 = types.KeyboardButton('1') | |
item_2 = types.KeyboardButton('2') | |
item_3 = types.KeyboardButton('3') | |
key_ball.add(item_1,item_2,item_3) | |
bot.send_message(call.message.chat.id, 'Выберите 1, 2 или 3', reply_markup=key_ball) | |
@bot.message_handler(content_types=['text']) | |
def bot_message(message): | |
if message.text == '1': | |
bot.send_message(message.chat.id, "Вы получили " + str(message.text)+ " баллов") | |
elif message.text == '2': | |
bot.send_message(message.chat.id, "Вы получили " + str(message.text) + " баллов") | |
elif message.text == '3': | |
bot.send_message(message.chat.id, "Вы получили " + str(message.text) + " баллов") | |
key_continue = types.ReplyKeyboardMarkup(resize_keyboard=True) | |
item = types.KeyboardButton('ДАЛЕЕ') | |
key_continue.add(item) | |
bot.send_message(message.chat.id, "Для продолжения нажмите ДАЛЕЕ ", reply_markup=key_continue) | |
@bot.message_handler(content_types=['text']) | |
def bot_message2(message): | |
if message.text == "ДАЛЕЕ": | |
print('Показать видео 2') | |
bot.polling(none_stop=True) |
Возможно это из-за того, что @bot.callback_query_handler(func=lambda call: True)
забирает в свою обработку все кнопки, включаю кнопку "Далее", для которой нет там обработки
Можно попробовать заменить на что-то такое (что будет обрабатывать определённую кнопку/кнопки). Советую почитать подробнее информацию про лямбда функции.
@bot.callback_query_handler(func=lambda call: call.data == 'Кнопка1')
def callback_inline_first(message):
# Какой-то код
@bot.callback_query_handler(func=lambda call: call.data == 'Кнопка2')
def callback_inline_second(message):
# Какой-то код
Либо можно попробовать эту функцию переместить повыше. Потому что после того, как пользователь бота шлёт запрос на API Telegram, библиотека pyTelegramBotAPI, на которой написаны все функции, идёт по всем функциям по порядку. И возможно в каком-то месте есть зацикливание (где в лямбда функциях стоит True, а не какое-нибудь сравнение). Рекомендую освоить дебаггер, если пишете код в PyCharm, там можно было бы расставить точки останова на каждую функцию и посмотреть, в какую функцию летит запрос от пользователя. Хорошее объясние того, как работает дебаггер: плейлист.
@bot.message_handler(content_types=['text'])
def bot_message2(message):
if message.text == "ДАЛЕЕ":
print('Показать видео 2')
Спасибо, большое за ответ!
Разобрался через дебаггер, что кнопка "Далее" handlerom text уже не обрабатывается.
А вот обработчик @bot.callback_query_handler(func=lambda call: True) ее смог обработать. Переделал кнопку на InlineKeyboardMarkup() и заработало.
Видимо теперь можно, постваить какой-то счетчик и по нему показывать соответствующее видео.
Нашел решение через метод register_next_step_handler
Принимает два обязательных аргументы первый это message, а второй это function.
Работает таким образом, он ждёт сообщение пользователя и потом вызывает указанную функцию с аргументом message
import telebot
from settings import googlesheet_id, token, googlesheet_clucbot = telebot.TeleBot(token)
@bot.message_handler(commands=['help', 'start'])
def start(message):
msg = bot.send_message(message.chat.id, 'Введите первое значение')
bot.register_next_step_handler(msg, start_2)def start_2(message):
msg = bot.send_message(message.chat.id, 'Введите второе значение')
bot.register_next_step_handler(msg, start_3, message.text)def start_3(message, value):
print(message.text, value)
Бот должен показать пользователю 5 упражнений на гибкость.
Результаты теста будут записываться в гугл таблицу.
С этим разобрался. В этом коде этого нет. А вот с показом видео трудности.
После каждого видео пользователь выбирает, что у него получилось и нажимает одну из трех клавиш,
Затем кнопка ДАЛЕЕ и выводится новое упражнение.
Пишу код для первого цикла и затык.
Почему-то после нажатия ДАЛЕЕ ничего не происходит.