python

Airtable & Telegram Bot — рецепт быстрого запуска

  • среда, 25 мая 2022 г. в 00:34:50
https://habr.com/ru/post/667544/
  • Мессенджеры
  • Python
  • Администрирование баз данных
  • Облачные сервисы
  • Визуальное программирование


Intro

В данной статье рассмотрим интеграцию no-code базы данных с телеграмм ботом. Благодаря хорошему API и читабельной документации Airtable удобно использовать разработчику. При этом человеку, не знакомому с программированием, подвластно создание базы данных с нуля и аналитика без единой строчки кода. Airtable совмещает в себе удобный пользовательский интерфейс табличек и всевозможные БД фичи. Однако в отрыве от интерфейса для непосредственного взаимодействия с пользователем/клиентом не очень ценно. Поэтому добавляем в нашу колоду телеграмм бота и получаем неплохой набор для быстрого решения несложных бизнес задач. Фактически в данной статье получим готовый для быстрого запуска рецепт, включающий стек сервисов для разработки, ссылки и примеры.

Немного формальностей

Поставим задачу. Требуется создать систему, которая будет:

  • давать возможность создавать и редактировать БД без программирования;

  • сбирать и хранить клиентскую базу;

  • рассылать информацию группам из одного и более клиентов;

  • администрироваться (разделять права доступа пользователя и администратора).

Решаем данную задачу с помощью трех инструментов. Airtable, Telegram Bot и VPS.

Цель/contribution данной статьи — знакомство читателя с экономичным способом запуска системы, решающей довольно распространенную задачу из бизнеса.

Для того, чтобы более подробно пощупать каждый инструмент, предлагается следующий workflow. Пользователь заходит в телеграмм бота и регистрируется. Запись о пользователе попадает в базу данных в Airtable. В какой-то момент администратору нужно разослать информацию по некоторой группе пользователей, например тех, кто работает в IT. Для рассылки администратор создает текст сообщения в Airtable, а затем, с помощью команды в боте, доступной только ему, рассылает информацию по выбранной группе.

А теперь по полочкам...

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 решить задачи регистрации пользователей и рассылки сообщений. То, о чем мы говорили в данном разделе реализуемо на локальной машине,  однако, полноценный сценарий подразумевает бесперебойной работы бота.

VPS

Финальная стадия, когда все отлажено на локальной машине, можно приступать к деплою. Сервер нам нужен для того, чтобы обеспечить работу бота 24/7. Арендовать сервер под ubuntu можно на webtropia за 300 — 700р в месяц и оплатить с QIWI, что ценно во времена блокировок российских Visa и Master Card. Цены и конфигурации тут. Предполагается, что полезные данные хранятся в Airtable и от сервера нам нужна только постоянная работа бота и обработка запросов/ответов. Для этого вполне хватит сервера 4 cores 8 Gb RAM, а может и еще меньше. 

Когда мы подключились к серверу, есть как минимум два варианта запуска бота. Первый описан в шаге 5 здесь, второй здесь в разделе "Деплой на сервер".

P.S.

Постарался описать простой сценарий использования тандема Airtable и телеграмм бота. Данные инструменты имеют весь необходимый функционал для создания более сложных решений, например запись на услуги, продажа товаров, организация мероприятий и тд. Также, можно рассматривать интеграцию Airtable и Slack, благо для Slack есть API для Python, а API для Airtable мы уже рассмотрели.

Если у вас есть идеи по улучшению предложенного решения, предлагайте в комментах, с интересом прочитаю😊