Как сделать стрелочки «вправо-влево» для бота в aiogram?

Ссылка скопирована
1 ответ

Всем привет. Не подскажите как исправить различные ошибки в этом куске кода?

Есть такая таблица из которой нужно вытащить ее данные для того, чтобы пользователь мог нажимать на соответствующие кнопки и просматривать фотографии из своей базы данных:

CREATE TABLE packs (     id                INTEGER PRIMARY KEY AUTOINCREMENT,     user_id           INTEGER,     user_tag          TEXT,     user_pack_id      INTEGER,     pack_all_info     TEXT,     pack_price        INTEGER,     pack_photo        BLOB,     message_id        INTEGER,     link   TEXT    DEFAULT NONE,     status TEXT    DEFAULT nobuy );

CREATE TABLE packs ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, user_tag TEXT, user_pack_id INTEGER, pack_all_info TEXT, pack_price INTEGER, pack_photo BLOB, message_id INTEGER, link TEXT DEFAULT NONE, status TEXT DEFAULT nobuy );

Код работает так: При получении сообщения - бот оправляет фотографию из БД и генерирует к ним инлайн-клавиатуру со стрелочками "вправо-влево", но стрелочки не работают. Ошибка:
TypeError: Object of type bytes is not JSON serializable

Код:
spoiler

connect = sqlite3.connect('INFOBOT.db') cursor = connect.cursor()   @dp.message_handler() async def handle_message(message: types.Message):      cursor.execute("SELECT * FROM packs WHERE user_id = ?", (message.from_user.id, ))     photo_data = cursor.fetchall()      if not photo_data:         await message.answer("Фото не найдено")         return      for i in cursor.execute("SELECT * FROM packs WHERE user_id = ?", (message.from_user.id, )):         items = i       photo = items[6]     keyboard = generate_keyboard(message.from_user.id, message.text, 1, cursor.execute("SELECT COUNT(*) FROM packs WHERE user_id = ?", (message.from_user.id, )).fetchone()[0])      await message.answer_photo(photo=photo, caption = items[4],reply_markup=keyboard)   @dp.callback_query_handler() async def navigate(call: types.CallbackQuery):     if call.data == 'ignore':         await call.answer()         return      if call.data == '1' or call.data == '2':         await start_photo_gallery(call.message, call.data)         await call.answer()         return      user_id, user_tag, photo_index = call.data.split(':')     photo_index = int(photo_index)     total_count = cursor.execute("SELECT COUNT(*) FROM packs WHERE user_id = ?", (user_id, )).fetchone()[0]      if photo_index < 0 or photo_index >= total_count:         await call.answer('No more photos')         return       cursor.execute("SELECT * FROM packs WHERE user_id = ?", (user_id, ))     photo_data = cursor.fetchone()      for i in cursor.execute("SELECT * FROM packs WHERE user_id = ?", (call.from_user.id, )):         items = i      photo = items[6]       keyboard = generate_keyboard(user_id, user_tag, photo_index, total_count)     await call.message.edit_media(         media=types.InputMediaPhoto(media=photo, caption=items[4]),         reply_markup=keyboard)     await call.answer()   def generate_keyboard(user_id, user_tag, photo_index, total_count):      buttons = []      if photo_index > 0:         buttons.append(types.InlineKeyboardButton(text='<<', callback_data=f'{user_id}:{user_tag}:0'))         buttons.append(types.InlineKeyboardButton(text='<', callback_data=f'{user_id}:{user_tag}:{max(0, photo_index - 1)}'))     else:         buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore'))         buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore'))      buttons.append(types.InlineKeyboardButton(text=f'{photo_index + 1}/{total_count}', callback_data=f'ignore'))      if photo_index < total_count - 1:         buttons.append(types.InlineKeyboardButton(text='>', callback_data=f'{user_id}:{user_tag}:{min(total_count - 1, photo_index + 1)}'))         buttons.append(types.InlineKeyboardButton(text='>>', callback_data=f'{user_id}:{user_tag}:{total_count - 1}'))     else:         buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore'))         buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore'))      keyboard = types.InlineKeyboardMarkup(         inline_keyboard=[buttons]     )     return keyboard

connect = sqlite3.connect('INFOBOT.db') cursor = connect.cursor() @dp.message_handler() async def handle_message(message: types.Message): cursor.execute("SELECT * FROM packs WHERE user_id = ?", (message.from_user.id, )) photo_data = cursor.fetchall() if not photo_data: await message.answer("Фото не найдено") return for i in cursor.execute("SELECT * FROM packs WHERE user_id = ?", (message.from_user.id, )): items = i photo = items[6] keyboard = generate_keyboard(message.from_user.id, message.text, 1, cursor.execute("SELECT COUNT(*) FROM packs WHERE user_id = ?", (message.from_user.id, )).fetchone()[0]) await message.answer_photo(photo=photo, caption = items[4],reply_markup=keyboard) @dp.callback_query_handler() async def navigate(call: types.CallbackQuery): if call.data == 'ignore': await call.answer() return if call.data == '1' or call.data == '2': await start_photo_gallery(call.message, call.data) await call.answer() return user_id, user_tag, photo_index = call.data.split(':') photo_index = int(photo_index) total_count = cursor.execute("SELECT COUNT(*) FROM packs WHERE user_id = ?", (user_id, )).fetchone()[0] if photo_index < 0 or photo_index >= total_count: await call.answer('No more photos') return cursor.execute("SELECT * FROM packs WHERE user_id = ?", (user_id, )) photo_data = cursor.fetchone() for i in cursor.execute("SELECT * FROM packs WHERE user_id = ?", (call.from_user.id, )): items = i photo = items[6] keyboard = generate_keyboard(user_id, user_tag, photo_index, total_count) await call.message.edit_media( media=types.InputMediaPhoto(media=photo, caption=items[4]), reply_markup=keyboard) await call.answer() def generate_keyboard(user_id, user_tag, photo_index, total_count): buttons = [] if photo_index > 0: buttons.append(types.InlineKeyboardButton(text='<<', callback_data=f'{user_id}:{user_tag}:0')) buttons.append(types.InlineKeyboardButton(text='<', callback_data=f'{user_id}:{user_tag}:{max(0, photo_index - 1)}')) else: buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore')) buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore')) buttons.append(types.InlineKeyboardButton(text=f'{photo_index + 1}/{total_count}', callback_data=f'ignore')) if photo_index < total_count - 1: buttons.append(types.InlineKeyboardButton(text='>', callback_data=f'{user_id}:{user_tag}:{min(total_count - 1, photo_index + 1)}')) buttons.append(types.InlineKeyboardButton(text='>>', callback_data=f'{user_id}:{user_tag}:{total_count - 1}')) else: buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore')) buttons.append(types.InlineKeyboardButton(text='-', callback_data=f'ignore')) keyboard = types.InlineKeyboardMarkup( inline_keyboard=[buttons] ) return keyboard

Буду крайне признателен, если вы поможете мне исправить все ошибки в коде. Спасибо!

Дополнительно:

Так вы совсем не обрабатываете нажатия кнопок. Там где у вас call_data для стрелочек добавьте имя команды и ловите его с параметрами в вашей фцнкции navigate

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Для того чтобы создать стрелочки «вправо-влево» для бота в aiogram, вам нужно использовать специальные символы Unicode, которые представляют собой стрелки. Вот пример кода на Python с использованием aiogram, который покажет вам, как это можно сделать:

from aiogram import Bot, Dispatcher, types
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
 
bot = Bot(token="YOUR_TOKEN")
dp = Dispatcher(bot)
 
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(KeyboardButton('⬅️ Назад'), KeyboardButton('Вперед ➡️'))
 
    await message.answer("Выберите направление:", reply_markup=keyboard)
 
if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp)

from aiogram import Bot, Dispatcher, types from aiogram.types import ReplyKeyboardMarkup, KeyboardButton bot = Bot(token="YOUR_TOKEN") dp = Dispatcher(bot) @dp.message_handler(commands=['start']) async def start(message: types.Message): keyboard = ReplyKeyboardMarkup(resize_keyboard=True) keyboard.add(KeyboardButton('⬅️ Назад'), KeyboardButton('Вперед ➡️')) await message.answer("Выберите направление:", reply_markup=keyboard) if __name__ == '__main__': from aiogram import executor executor.start_polling(dp)

В этом примере мы создаем клавиатуру с двумя кнопками: "⬅️ Назад" и "Вперед ➡️", которые представляют собой стрелочки влево и вправо соответственно. При нажатии на одну из этих кнопок, бот будет реагировать соответствующим образом.

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно