Airtable & Telegram Bot — рецепт быстрого запуска
- среда, 25 мая 2022 г. в 00:34:50
В данной статье рассмотрим интеграцию no-code базы данных с телеграмм ботом. Благодаря хорошему API и читабельной документации Airtable удобно использовать разработчику. При этом человеку, не знакомому с программированием, подвластно создание базы данных с нуля и аналитика без единой строчки кода. Airtable совмещает в себе удобный пользовательский интерфейс табличек и всевозможные БД фичи. Однако в отрыве от интерфейса для непосредственного взаимодействия с пользователем/клиентом не очень ценно. Поэтому добавляем в нашу колоду телеграмм бота и получаем неплохой набор для быстрого решения несложных бизнес задач. Фактически в данной статье получим готовый для быстрого запуска рецепт, включающий стек сервисов для разработки, ссылки и примеры.
Поставим задачу. Требуется создать систему, которая будет:
давать возможность создавать и редактировать БД без программирования;
сбирать и хранить клиентскую базу;
рассылать информацию группам из одного и более клиентов;
администрироваться (разделять права доступа пользователя и администратора).
Решаем данную задачу с помощью трех инструментов. Airtable, Telegram Bot и VPS.
Цель/contribution данной статьи — знакомство читателя с экономичным способом запуска системы, решающей довольно распространенную задачу из бизнеса.
Для того, чтобы более подробно пощупать каждый инструмент, предлагается следующий workflow. Пользователь заходит в телеграмм бота и регистрируется. Запись о пользователе попадает в базу данных в Airtable. В какой-то момент администратору нужно разослать информацию по некоторой группе пользователей, например тех, кто работает в IT. Для рассылки администратор создает текст сообщения в Airtable, а затем, с помощью команды в боте, доступной только ему, рассылает информацию по выбранной группе.
В этой части рассмотрим как администратор взаимодействует с используемыми инструментами. Для нашего простого сценария достаточно базы пользователей такого вида:
Заметим, что со стороны администратора, работающего с базой данных несложно реализуется разделение прав доступа. Доступ непосредственно к Airtable также настраивается(просмотр, редактирование). Переходя по настроенным фильтрам отображения слева, можно посмотреть либо всех пользователей, либо только сотрудников IT и тд. Комбинации фильтров позволяют гибко настроить отображение содержимого базы.
В решаемой нами задаче разделение прав пользователей применяем следующим образом. Только пользователь с полем Admin = True может посылать боту команды рассылки сообщений. Сообщения в нашем случае составляются без участия разработчика. Кроме того, рассылку можно автоматизировать.
В заключение раздела про Airtable отмечу, администратор может работать с базой данных полностью самостоятельно. В этом есть большая ценность и для разработчика, и для администратора с точки зрения разделения задач и скорости реализации проекта. Теперь можем перейти под капот нашей небольшой системы и обсудить реализацию.
aiogram — фреймворк для Telegram Bot API;
pyairtable (бывший Airtable Python Wrapper) — Python клиент для Airtable API.
При первом запуске бота, пользователь проходит регистрацию. О том, как спросить у пользователя как его зовут с помощью aiogram скорее всего есть статьи и примеры на страничке документации aiogram. В нашем сценарии, при регистрации пользователя мы извлекаем следующую информацию: полное имя, телеграмм id, работает ли в IT.
Далее уже понадобится pyairtable
, а вот тут с примерами.
Подключаем базу данных:
api_key = 'AIRTABLE_API_KEY'
base_id = 'base_id'
users_table = Table(api_key, base_id, 'Users')
messages_table = Table(api_key, base_id, 'Messages')
base_id достается прямо из ссылки на базу данных, например для https://airtable.com/appab1CDefGhiJkLm/###
base_id = 'appab1CDefGhiJkLm'
, api_key
находится в разделе Account -> Overview -> Api
После того как мы подключили базу данных, можем записать в нее информацию о пользователе (полное имя, телеграмм id, работает ли в IT).
user_info = [{'FullName': 'Иван Иванов',
'TelegramID': int('12345678'),
'ITworker': True}]
users_table.batch_insert(user_info)
В нашей базе появилась запись, причем Airtable поддерживает типизацию данных, вплоть до записи файлов, поэтому мы сохраняем содержимое user_info
как str
, int
и bool
.
Если пользователь уже есть в базе и повторно запускает бота, его не нужно регистрировать. Для этого предположим, что мы уже достали telegram_id
пользователя, и добавим проверку:
user = users_table.search('TelegramID', telegram_id)
if len(user) != 0:
###
Здесь мы по users_table нашли(или не нашли) запись в табличке с пользователями. Добавлю, что если сделать users_table.search('ITworker', True)
то нам вернется ответ со всеми подходящими записями.
Перейдем к рассылке сообщений. Допустим у нас есть telegram_id
, также допустим, что админов может быть несколько. Для команды рассылки, проверка на админа делается аналогично проверке пользователя по базе:
admins = users_air.search('Admin', True)
admin_ids = []
for admin in admins:
admin_ids.append(admins['fields']['TelegramID’])
if in admin_ids:
###
Далее достаем из airtable содержание всей таблицы с сообщениями:
messages = messages_table.get_all()
for msg in messages:
msg_id = msg['fields'].get(‘msg_id’)
content = msg['fields'].get(‘content’)
###
Дальнейшие действия уже из aiogram. Аналогично проверке на админа можем достать TelegramID всех IT сотрудников и разослать сообщения им.
В данном разделе мы обсудили, как с помощью pyairtable решить задачи регистрации пользователей и рассылки сообщений. То, о чем мы говорили в данном разделе реализуемо на локальной машине, однако, полноценный сценарий подразумевает бесперебойной работы бота.
Финальная стадия, когда все отлажено на локальной машине, можно приступать к деплою. Сервер нам нужен для того, чтобы обеспечить работу бота 24/7. Арендовать сервер под ubuntu можно на webtropia за 300 — 700р в месяц и оплатить с QIWI, что ценно во времена блокировок российских Visa и Master Card. Цены и конфигурации тут. Предполагается, что полезные данные хранятся в Airtable и от сервера нам нужна только постоянная работа бота и обработка запросов/ответов. Для этого вполне хватит сервера 4 cores 8 Gb RAM, а может и еще меньше.
Когда мы подключились к серверу, есть как минимум два варианта запуска бота. Первый описан в шаге 5 здесь, второй здесь в разделе "Деплой на сервер".
Постарался описать простой сценарий использования тандема Airtable и телеграмм бота. Данные инструменты имеют весь необходимый функционал для создания более сложных решений, например запись на услуги, продажа товаров, организация мероприятий и тд. Также, можно рассматривать интеграцию Airtable и Slack, благо для Slack есть API для Python, а API для Airtable мы уже рассмотрели.
Если у вас есть идеи по улучшению предложенного решения, предлагайте в комментах, с интересом прочитаю😊