02
Апр
2018

Зацикливание вызова callback в telegram боте

Столкнулся с проблемой, что при нажатии любой кнопки inline-клавиатуры telegram бота выбранная кнопка как будто залипает. То есть после нажатия, действие отрабатывается и всё хорошо – бот переходит в режим ожидания команды. Но через некоторое время (произвольное) нажатие повторяется циклично, хотя я уже ничего не нажимаю. Бот написан на python 3.6. Библиотека GitHub - pyTelegramBotAPI

Вот клавиатура:

def choose_film_markup(button=config.vote_films):
    markup_choose_film = types.InlineKeyboardMarkup(row_width=1)
    btn_in_film1 = types.InlineKeyboardButton(text=(button[0]['film_name'] + ' - ' + str(button[0]['rate'])), callback_data='film1')
    btn_in_film2 = types.InlineKeyboardButton(text=(button[1]['film_name'] + ' - ' + str(button[1]['rate'])), callback_data='film2')
    btn_in_film3 = types.InlineKeyboardButton(text=(button[2]['film_name'] + ' - ' + str(button[2]['rate'])), callback_data='film3')
    markup_choose_film.add(btn_in_film1, btn_in_film2, btn_in_film3)
    return markup_choose_film

Обработчик callback-ов:

@bot.callback_query_handler(func=lambda c: c.data)
def choose_film(c):

film_rates = functions.read_film_rates_with_id(1)

if c.data == 'film1':
    if c.from_user.id not in film_rates[1]['user_ids'] and c.from_user.id not in film_rates[2]['user_ids']:
        if c.from_user.id in film_rates[0]['user_ids']:
            film_rates[0]['user_ids'].remove(c.from_user.id)
            film_rates[0]['rate'] -= 1
            print(film_rates)
        else:
            film_rates[0]['user_ids'].append(c.from_user.id)
            film_rates[0]['rate'] += 1
            print(film_rates)

elif c.data == 'film2':
    if c.from_user.id not in film_rates[0]['user_ids'] and c.from_user.id not in film_rates[2]['user_ids']:
        if c.from_user.id in film_rates[1]['user_ids']:
            film_rates[1]['user_ids'].remove(c.from_user.id)
            film_rates[1]['rate'] -= 1
            print(film_rates)
        else:
            film_rates[1]['user_ids'].append(c.from_user.id)
            film_rates[1]['rate'] += 1
            print(film_rates)

elif c.data == 'film3':
    if c.from_user.id not in film_rates[1]['user_ids'] and c.from_user.id not in film_rates[0]['user_ids']:
        if c.from_user.id in film_rates[2]['user_ids']:
            film_rates[2]['user_ids'].remove(c.from_user.id)
            film_rates[2]['rate'] -= 1
            print(film_rates)
        else:
            film_rates[2]['user_ids'].append(c.from_user.id)
            film_rates[2]['rate'] += 1
            print(film_rates)

functions.write_film_rates_with_id(film_rates)

bot.edit_message_text(chat_id=c.message.chat.id,
                      text='Ваш выбор?',
                      message_id=c.message.message_id,
                      reply_markup=choose_film_markup(film_rates))

Источник: https://ru.stackoverflow.com/questions/808438/%D0%97%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B0-callback-%D0%B2-telegram-%D0%B1%D0%BE%D1%82%D0%B5

Тебе может это понравится...

Добавить комментарий