Запись данных из бота в Google Sheets

Я пробую писать телеграм-бота на Pyhton, на библиотеке aiogram. И встала задача реализовать регистрацию пользователя в боте и чтобы потом эти данные сохранялись в гугл таблицу. То бишь у меня есть инлайн клавиатура в боте по нажатию на кнопку которой бот начинает запрашивать данные по типу имени, телеграм ID и т.п. Как мне реализовать это правильно, чтобы после того как пользователь ввел данные они сохранились в гугл таблицу?


Ответы (1 шт):

Автор решения: QWERTYZ PB

Шаги:

  1. Подготовка Google Таблицы:

    • Создайте Google Таблицу с необходимыми столбцами для хранения данных пользователей (например, имя, Telegram ID, дата регистрации и др.).
    • Откройте доступ к таблице для сервисного аккаунта (см. ниже).
  2. Создание сервисного аккаунта Google Cloud:

    • Перейдите в Google Cloud Console (https://console.cloud.google.com/).
    • Создайте новый проект или выберите существующий.
    • В разделе "IAM и администрирование" создайте сервисный аккаунт.
    • Дайте сервисному аккаунту доступ к Google Таблицам (роль "Редактор").
    • Создайте ключ сервисного аккаунта и скачайте файл JSON с ключом.
  3. Установка библиотек:

    • Установите необходимые библиотеки:
    pip install aiogram gspread oauth2client
    
  4. Код Python:

    import asyncio
    import gspread
    from aiogram import Bot, Dispatcher, executor, types
    from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
    from oauth2client.service_account import ServiceAccountCredentials
    
    # Данные для доступа к Google Таблице
    SERVICE_ACCOUNT_FILE = 'path/to/your/credentials.json'
    SCOPE = ['https://spreadsheets.google.com/feeds',
             'https://www.googleapis.com/auth/drive']
    SPREADSHEET_ID = 'your_spreadsheet_id'
    
    # Инициализация бота
    bot = Bot(token='your_bot_token')
    dp = Dispatcher(bot)
    
    # Функция для авторизации в Google Таблицах
    async def get_sheet():
        creds = ServiceAccountCredentials.from_json_keyfile_name(
            SERVICE_ACCOUNT_FILE, SCOPE)
        client = gspread.authorize(creds)
        sheet = client.open_by_key(SPREADSHEET_ID).sheet1
        return sheet
    
    # Обработчик нажатия на кнопку регистрации
    @dp.callback_query_handler(lambda c: c.data == 'register')
    async def register_user(callback_query: types.CallbackQuery):
        # Запрос имени пользователя
        await bot.send_message(callback_query.from_user.id, "Введите ваше имя:")
    
        # Ожидание ответа пользователя
        @dp.message_handler()
        async def get_name(message: types.Message):
            name = message.text
    
            # Запрос Telegram ID
            telegram_id = message.from_user.id
    
            # Сохранение данных в Google Таблицу
            sheet = await get_sheet()
            sheet.append_row([name, telegram_id])
    
            # Уведомление об успешной регистрации
            await bot.send_message(message.from_user.id, "Вы успешно зарегистрированы!")
    
    # Создание инлайн клавиатуры с кнопкой регистрации
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton("Регистрация", callback_data='register'))
    
    # Команда для запуска процесса регистрации
    @dp.message_handler(commands=['start'])
    async def start_command(message: types.Message):
        await bot.send_message(message.from_user.id, "Привет! Нажмите кнопку, чтобы зарегистрироваться:", reply_markup=keyboard)
    
    # Запуск бота
    if __name__ == '__main__':
        executor.start_polling(dp, skip_updates=True)
    

Пояснения:

  • В коде используются асинхронные функции async и await для работы с aiogram.
  • get_sheet() - асинхронная функция для авторизации в Google Таблицах и получения объекта листа.
  • register_user() - обработчик нажатия на кнопку регистрации. Он запрашивает имя пользователя и Telegram ID, а затем сохраняет данные в Google Таблицу.
  • start_command() - обработчик команды /start. Он отправляет пользователю сообщение с инлайн клавиатурой для регистрации.

Дополнительные возможности:

  • Вы можете добавить в Google Таблицу дополнительные столбцы для хранения информации о пользователе, например, дату регистрации, контактные данные и т.д.
  • Вы можете использовать библиотеку aiogram.dispatcher.filters.State для создания более сложных сценариев регистрации с несколькими этапами.
  • Вы можете расширить функционал бота, используя данные из Google Таблицы, например, для отправки персонализированных сообщений или предоставления доступа к определенным функциям.

Не забудьте заменить следующие значения в коде на свои:

  • your_bot_token - токен вашего бота, полученный от BotFather.
  • path/to/your/credentials.json - путь к файлу JSON с ключом сервисного аккаунта Google Cloud.
  • your_spreadsheet_id - ID вашей Google Таблицы.
→ Ссылка