Al_Petrushin
@Al_Petrushin
Люблю шахматы, книги, спорт и немного программирую

Как получить доступ к Call.data на втором уровне вложенности?

Привет! Я делаю бота с pytelegrambotapi, и хочу сделать возможной отправку сообщений в заранее указанное время

import telebot 
from config import token
from datetime import datetime
from random import randint
from config import quotes
import os
from telebot import TeleBot
from telebot import types
import time
import schedule

bot=telebot.TeleBot(token,parse_mode='html')
@bot.message_handler(commands=["start"])
def start_message(message):
    bot.reply_to(message,'<i> Привет, {0.first_name}!</i>'.format(message.from_user))
    daytime= types.InlineKeyboardMarkup()
    but1= types.InlineKeyboardButton('Утром', callback_data='утро')
    but2= types.InlineKeyboardButton('Днём', callback_data= 'день')
    but3= types.InlineKeyboardButton('Вечером', callback_data= 'вечер')
    daytime.add(but1,but2,but3)
    bot.reply_to(message,'Когда ты хочешь получать мои сообщения?', reply_markup= daytime)



@bot.callback_query_handler(func=lambda call: True)
def hour_changer(call):
    if call.data == 'утро':
        keyboard_morning= types.InlineKeyboardMarkup()
        m_bt1= types.InlineKeyboardButton('06:00', callback_data ='06:00')
        m_bt2= types.InlineKeyboardButton('07:00', callback_data ='07:00')
        m_bt3= types.InlineKeyboardButton('08:00', callback_data ='08:00')
        m_bt4= types.InlineKeyboardButton('09:00', callback_data ='09:00')
        m_bt5= types.InlineKeyboardButton('10:00', callback_data ='10:00')
        m_bt6= types.InlineKeyboardButton('11:00', callback_data ='11:00')
        m_bt7= types.InlineKeyboardButton('12:00', callback_data ='12:00')
        keyboard_morning.add(m_bt1, m_bt2, m_bt3, m_bt4, m_bt5, m_bt6, m_bt7)
        bot.answer_callback_query(call.id, 'Выбери удобное время')
        bot.edit_message_text(chat_id= call.message.chat.id, message_id= call.message.message_id, text= 'Выбери удобное время', reply_markup= keyboard_morning,)
        
    
    elif call.data == 'день':
        keyboard_day= types.InlineKeyboardMarkup()
        d_bt1= types.InlineKeyboardButton('13:00', callback_data = '13:00')
        d_bt2= types.InlineKeyboardButton('14:00', callback_data = '14:00')
        d_bt3= types.InlineKeyboardButton('15:00', callback_data = '15:00')
        d_bt4= types.InlineKeyboardButton('16:00', callback_data = '16:00')
        d_bt5= types.InlineKeyboardButton('17:00', callback_data = '17:00')
        d_bt6= types.InlineKeyboardButton('18:00', callback_data = '18:00')
        keyboard_day.add(d_bt1, d_bt2, d_bt3, d_bt4, d_bt5, d_bt6)
        bot.answer_callback_query(call.id, 'Выбери удобное время')
        bot.edit_message_text(chat_id= call.message.chat.id, message_id= call.message.message_id, text= 'Выбери удобное время', reply_markup= keyboard_day)

    elif call.data == 'вечер':
        keyboard_evening= types.InlineKeyboardMarkup()
        e_bt1= types.InlineKeyboardButton('19:00', callback_data= '19:00')
        e_bt2= types.InlineKeyboardButton('20:00', callback_data= '20:00')
        e_bt3= types.InlineKeyboardButton('21:00', callback_data= '21:00')
        e_bt4= types.InlineKeyboardButton('22:00', callback_data= '22:00')
        e_bt5= types.InlineKeyboardButton('23:00', callback_data= '23:00')
        keyboard_evening.add(e_bt1, e_bt2, e_bt3, e_bt4, e_bt5)
        bot.answer_callback_query(call.id, 'Выбери удобное время')
        bot.edit_message_text(chat_id= call.message.chat.id, message_id= call.message.message_id, text= 'Выбери удобное время', reply_markup= keyboard_evening)

@bot.callback_query_handler(func=lambda call: True)
def send_qoute(call):
    if call.data == '20:00':
        bot.edit_message_text(chat_id= call.message.chat.id, message_id= call.message.message_id, text= 'Вfdgdfgdfgdfg')
                
    
#schedule.every().day.at(int(x)).do(send_quote())
#while True:
   # schedule.run_pending()
   # time.sleep(60)
        
bot.infinity_polling()


Мои вопросы в следующем:
Как сделать второй уровень вложенности?
Как вытащить значение времени и присвоить его переменной, чтобы затем использовать в модуле schedule?
Как корректно оформить отправку сообщения через данный модуль? Заранее спасибо
  • Вопрос задан
  • 343 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Как вариант, помещать в callback_data информацию об уровне на котором находитесь, а потом парсить это значение.
but1= types.InlineKeyboardButton('Утром', callback_data='daypart|утро')
but2= types.InlineKeyboardButton('Днём', callback_data= 'daypart|день')


Затем уже в либо в хендлере отлавливать нужное
@bot.callback_query_handler(func=lambda call: call.data.split('|')[0]=='daypart')

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

Может быть уже в telebot добавили такой механизм, как конечные автоматы (FSM в aiogram), давно не следил за развитием библиотеки. Если что-то подобное есть, то лучше воспользоваться этим.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы