Skip to content

Instantly share code, notes, and snippets.

@dmp40
Last active May 15, 2022 06:33
Show Gist options
  • Save dmp40/c6ce4d0fd8cc153ea62ef5aca7ff0267 to your computer and use it in GitHub Desktop.
Save dmp40/c6ce4d0fd8cc153ea62ef5aca7ff0267 to your computer and use it in GitHub Desktop.
рыба бота 15,05,22
# версия от 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)
@dmp40
Copy link
Author

dmp40 commented May 14, 2022

Бот должен показать пользователю 5 упражнений на гибкость.
Результаты теста будут записываться в гугл таблицу.
С этим разобрался. В этом коде этого нет. А вот с показом видео трудности.

После каждого видео пользователь выбирает, что у него получилось и нажимает одну из трех клавиш,
Затем кнопка ДАЛЕЕ и выводится новое упражнение.
Пишу код для первого цикла и затык.
Почему-то после нажатия ДАЛЕЕ ничего не происходит.

@alenapoliakova
Copy link

Возможно это из-за того, что @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')

@dmp40
Copy link
Author

dmp40 commented May 14, 2022

Спасибо, большое за ответ!
Разобрался через дебаггер, что кнопка "Далее" handlerom text уже не обрабатывается.
А вот обработчик @bot.callback_query_handler(func=lambda call: True) ее смог обработать. Переделал кнопку на InlineKeyboardMarkup() и заработало.
Видимо теперь можно, постваить какой-то счетчик и по нему показывать соответствующее видео.

@dmp40
Copy link
Author

dmp40 commented May 15, 2022

Нашел решение через метод register_next_step_handler

Принимает два обязательных аргументы первый это message, а второй это function.
Работает таким образом, он ждёт сообщение пользователя и потом вызывает указанную функцию с аргументом message

import telebot
from settings import googlesheet_id, token, googlesheet_cluc

bot = 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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment