Напиши динамическую клавиатуру с пагинацией для telegram-бота на библиотеках aiogram и gspread. Динамические inline-кнопки должны создаваться из списка, нужно чтобы сообщение с inline-кнопками выводило не более чем 8 кнопок со значением, которое ищет пользователь из списка, отображение следующих значений доступно при нажатии на inline-кнопку “Вперед”, обратно можно вернутся по inline-кнопке “Назад”. Кнопки “Вперед” и “Назад” находятся в той же клавиатуре и под тем же сообщением, что и кнопки с данными, которые ищет пользователь. Кнопки “Вперед” и “Назад” должны находится в самом конце Inline-клавиуатуры
python
pip install aiogram gspread
2. Создание и настройка бота в Telegram:
- Создайте нового бота в Telegram, следуя инструкциям [BotFather](https://core.telegram.org/bots#6-botfather).
- Получите токен доступа для бота.
- Настройте имя и описание бота, а также его профиль и аватарку.
3. Создание сервисного аккаунта в Google Cloud и получение файлов ключей:
- Перейдите на [Google API Console](https://console.developers.google.com/).
- Создайте новый проект или выберите существующий.
- Включите API Google Sheets.
- Создайте сервисный аккаунт и сгенерируйте файл ключа JSON.
- Предоставьте доступ к таблице Google Sheets вашему сервисному аккаунту.
4. Настройка таблицы Google Sheets:
- Создайте новую Google таблицу и заполните ее данными в формате, который вы хотите отобразить в боте.
- Запомните идентификатор таблицы или его URL.
5. Настройка бота и реализация динамической клавиатуры:
- Импортируйте необходимые модули и классы:
python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
import gspread
from google.oauth2.service_account import Credentials
import logging
- Настройте логирование:
python
logging.basicConfig(level=logging.INFO)
- Создайте экземпляр бота и диспетчера:
python
bot = Bot(token='YOUR_TELEGRAM_BOT_TOKEN')
dp = Dispatcher(bot, storage=MemoryStorage())
- Создайте функцию для обработки команды /start:
python
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
await message.reply("Привет! Введите текст для поиска:")
- Создайте функцию для обработки сообщений с текстом:
python
@dp.message_handler(content_types=types.ContentTypes.TEXT)
async def process_search_message(message: types.Message):
search_text = message.text.lower()
values = get_values_from_google_sheets(search_text)
if not values:
await message.reply("По вашему запросу ничего не найдено.")
return
await show_keyboard(message, values)
- Создайте функцию для получения данных из Google Sheets:
python
def get_values_from_google_sheets(search_text: str):
# Подключение к таблице Google Sheets
credentials = Credentials.from_service_account_file('PATH_TO_YOUR_JSON_KEY')
gc = gspread.authorize(credentials)
sheet_id = 'YOUR_GOOGLE_SHEETS_ID'
worksheet = gc.open_by_key(sheet_id).sheet1
# Получение всех значений из таблицы
all_values = worksheet.get_all_values()
# Фильтрация значений по поисковому запросу
filtered_values = [row for row in all_values if search_text in row]
return filtered_values
- Создайте функцию для отображения клавиатуры с пагинацией:
python
async def show_keyboard(message: types.Message, values: List[str], page: int = 0):
# Определение индекса первого и последнего значения на текущей странице
start_index = page * 8
end_index = min(start_index + 8, len(values))
# Создание списка кнопок для текущей страницы
buttons = []
for value in values[start_index:end_index]:
button = InlineKeyboardButton(text=value, callback_data=value)
buttons.append(button)
# Создание кнопки "Вперед"
if end_index < len(values):
next_button = InlineKeyboardButton(text='Вперед', callback_data=f'next_{page}')
buttons.append(next_button)
# Создание кнопки "Назад"
if page > 0:
prev_button = InlineKeyboardButton(text='Назад', callback_data=f'prev_{page}')
buttons.append(prev_button)
# Создание клавиатуры
keyboard = InlineKeyboardMarkup(row_width=2).add(*buttons)
# Отправка сообщения с клавиатурой
await bot.send_message(chat_id=message.chat.id, text='Результаты поиска:', reply_markup=keyboard)
- Создайте функцию для обработки callback-запросов:
python
@dp.callback_query_handler()
async def process_callback(callback_query: types.CallbackQuery):
callback_data = callback_query.data
if callback_data.startswith('next_'):
page = int(callback_data.split('_')[1])
await show_next_page(callback_query, page)
elif callback_data.startswith('prev_'):
page = int(callback_data.split('_')[1])
await show_prev_page(callback_query, page)
else:
await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали: ' + callback_data)
- Создайте функции для отображения следующей и предыдущей страницы:
python
async def show_next_page(callback_query: types.CallbackQuery, page: int):
search_text = callback_query.message.text.split(':')[1].strip()
values = get_values_from_google_sheets(search_text)
await show_keyboard(callback_query.message, values, page + 1)
await bot.answer_callback_query(callback_query.id)
async def show_prev_page(callback_query: types.CallbackQuery, page: int):
search_text = callback_query.message.text.split(':')[1].strip()
values = get_values_from_google_sheets(search_text)
await show_keyboard(callback_query.message, values, page - 1)
await bot.answer_callback_query(callback_query.id)
- Запустите бота:
python
if __name__ == '__main__':
from aiogram import executor
executor.start_polling(dp)
6. Замените `'YOUR_TELEGRAM_BOT_TOKEN'` на токен доступа для вашего бота.
7. Замените `'PATH_TO_YOUR_JSON_KEY'` на путь к файлу ключа JSON вашего сервисного аккаунта.
8. Замените `'YOUR_GOOGLE_SHEETS_ID'` на идентификатор таблицы Google Sheets.
9. Запустите бота командой `python your_bot_script.py`.
Теперь ваш Telegram-бот должен отображать динамическую клавиатуру с пагинацией, которая будет создаваться из списка значений, полученных из Google Sheets. Пользователь сможет прокручивать значения с помощью кнопок "Вперед" и "Назад". При выборе определенного значения будет выводиться сообщение с этим значением.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет