@szjyakgf

Как в боте сделать нажатие кнопки только 1 раз?

Бот на aiogram. Бот выставляет пост в канал. Для поста добавлены кнопки лайк и дизлайк. Но 1 пользователь может ставить сколько угодно лайков и дизлайков. Как этого избежать? При повторном нажатии: await call.answer(text="Ты уже поставил лайк", show_alert=True)
@dp.message_handler(commands=['test'])
async def test(message: types.Message):
    user_id = message.from_user.id
    keyboard = types.InlineKeyboardMarkup()
    callback_button1 = types.InlineKeyboardButton(text="лайк", callback_data=f"{user_id}|test1")
    callback_button2 = types.InlineKeyboardButton(text="дизлайк", callback_data=f"{user_id}|test2")
    keyboard.add(callback_button1, callback_button2)
    await bot.send_message(chat_id= '@channel_name',  text='текст поста', parse_mode="Markdown", reply_markup=keyboard)

@dp.callback_query_handler(lambda call: True)
async def callback_inline1(call):
    conn = sqlite3.connect('db.db')
    cur = conn.cursor()
    user_id = call.from_user.id
    with suppress(MessageNotModified):
        if call.message:
            mandm, data = call.data.split('|')
            if data == "test1":
                cur.execute("UPDATE users SET like = like + ? WHERE user_id = ?", (1, mandm))
                conn.commit()
                await call.answer(text="Лайкнул", show_alert=True)
            elif data == "test2":
                cur.execute("UPDATE users SET dislike = dislike + ? WHERE user_id = ?", (1, mandm))
                conn.commit()
                await call.answer(text="Дизлайкнул", show_alert=True)
  • Вопрос задан
  • 571 просмотр
Решения вопроса 1
@twistfire92
Python backend developer
вы в кнопку заносите чей user_id? Бота? Канала? И у всех пользователей при нажатии один и тот же id (mandm) заносится в базу данных.

Вам надо при нажатии на кнопку сначала делать запрос в БД, проверять ставил ли этот пользователь (call.from_user.id) лайк или дизлайк этому сообщению (call.message.id). Если такая запись есть, то выводить сообщение о том, что уже были лайки/дизлайки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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