Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных

Содержание:


Данное решение описывает начальный фрагмент сценария работы с какой-либо системой посредством отправки сообщений в Telegram-бот. Чтобы бот не позволял любому пользователю осуществлять работу с данными, перед запуском основного сценария взаимодействия будет производиться проверка наличия ID аккаунта Telegram в базе данных, реализованной на платформе Google Sheets, а при отсутствии ID в базе - запрашивание пароля и внесение ID в таблицу после получения верного пароля от пользователя.


1. Подготовка к обмену данными


1.1.1 Настройка Google Sheets API в Google


Настройку Google Sheets API будем выполнять в соответствии с пунктом 1 этого решения по интеграции с Google-таблицами.


В результате выполненных действий получим:


  • значение Client ID;
  • значение Secret ID.

1.1.2 Настройка подключения к Google Sheets в APInita


Используя значения, полученные в предыдущем пункте, настроим подключение в соответствии с пунктом 3 этого решения по интеграции с Google-таблицами.


Результатом выполненных действий для данной интеграции станет подключение, которое будет передаваться в запросах к данным таблицы.


1.2 Создание бота в Telegram и подключения в APInita


Создадим в APInita новый сценарий, назовем его, к примеру, "My Project (Sheets DB)", и добавим модуль Webhook:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Скопированный URL используем в настройке Telegram-бота, которую будем выполнять в соответствии с пунктами 1-4 решения по созданию Telegram-бота.


Результатом выполненных действий для данной интеграции станет:


  • входящий вебхук, являющийся первым шагом (триггером) сценария;
  • подключение к боту, которое будет передаваться в запросах на отправку сообщений в последующих шагах.

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных



2. Создание таблицы и листа


Создадим в Google таблицу и выделим отдельный лист под базу данных. Основные манипуляции будут производиться в столбцах B и C, и косвенно будет задействован столбец A - в первой строке для наглядности пропишем заголовки этих трех столбцов. В столбец C будут записываться значения 0 или 1 - в зависимости от того, был ли отправлен от соответствующего ID чата корректный пароль.


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


В адресной строке находим ID таблицы (spreadsheet_ID) и прописываем название листа (sheet_name) - в нашем примере лист называется "cooperators". На следующем шаге мы скопируем их.


3. Настройка сценария в APInita


3.1 Переменные сценария


Для того, чтобы некоторые глобальные значения не приходилось прописывать/изменять в нескольких местах, удобнее создать переменные и в дальнейшем обращаться к ним.


Например, пароль (pass_phrase) можно будет изменить, присвоив новое значение переменной. Также можно будет привязать сценарий к другой таблице, изменив значения переменных spreadsheet_ID и sheet_name.


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


"pass_phrase" : "пароль42",
"spreadsheet_ID": "{ID таблицы из адресной строки}",
"sheet_name": "{название листа}"

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


3.2 Получение строк таблицы в виде массива (модуль HTTP)


После получения сообщения Telegram-ботом определим, существует ли в базе данных доступ для данного ID чата. Для этого осуществим HTTP-запрос к методу Google Sheets API: spreadsheets.values.get (получение значений ячеек заданного диапазона в виде массива).


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


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


URL запроса:


https://sheets.googleapis.com/v4/spreadsheets/{{ scenario.spreadsheet_ID }}/values/{{ scenario.sheet_name }}!B:C

Метод: GET, формат: application/json


В заголовке передаем подключение, созданное в пункте 1.1.2


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Данные в таблицу будут записываться в таком виде. Для примера заполним одну строку:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Затем временно включим сценарий:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


и отправим в бот тестовое сообщение, чтобы сценарий сработал. В выходных данных модуля видим строки в виде вложенных массивов:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


3.3 Обработка данных в PHP-модуле


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


  • "exist": 1 - ID чата уже существует в базе данных, 0 - не существует
  • "access": параметр доступа, 1 - разрешен (был получен верный пароль), 0 - не разрешен (запись этих значений в таблицу будет реализована через данный сценарий)
  • "row": номер строки таблицы, полученный путем увеличения номера элемента массива на 1, потому как номера элементов массива начинаются с 0, а строк - с 1

Осуществим итерацию по массиву, содержащему данные строк, сопоставим значение каждого элемента с ID чата входящего сообщения и возвратим ключи с присвоенными значениями.


Следующим после HTTP-запроса поместим (выключив сценарий для получения возможности редактирования) модуль PHP - назовем его "обработка информации из базы данных" - и пропишем в нем следующий код:


// создание переменных
$num = 0;
$access = 0;
$exist = 0;

// объявление массива из полученных строк таблицы
$chatsArray = $s2['body']['values'];

// цикл проверяет данные каждой строки на совпадение с ID чата входящего сообщения, при совпадении переменным присваиваются новые значения
foreach ($chatsArray as $num=> $chatDetails ) {
   if ($chatDetails[0] == $s1['body']['message']['chat']['id']) {
     $exist = 1; $access = $chatDetails[1];
     break;
   }
}

// возвращение итогового ассоциативного массива
return ['exist' => $exist, 'access' => $access, 'row' => ($num)+1 ];

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


(зеленым цветом иллюстрировано обращение к доступным переменным)


3.4 Проверка условий наличия ID в таблице и соответствия текста сообщения заданному значению пароля (модули IF)


Произведем проверку имеющихся данных на соответствие следующим условиям, по каждому из которых разветвляется сценарий:


  • pass_phrase and not exist

{{ s1.body.message.text == scenario.pass_phrase and s3.body.exist != 1 }}

После проверки данного условия осуществляется внесение в таблицу нового ID с доступом = 1.


  • pass_phrase

{{ s1.body.message.text == scenario.pass_phrase and s3.body.exist == 1 }}

После проверки данного условия осуществляется изменение доступа на "1" у существующего ID.


  • message other

{{ s1.body.message.text != scenario.pass_phrase }}

Данное условие является родительским для следующих трех:


- not exist


{{ s3.body.exist != 1 }}

После проверки данного условия происходит запрашивание пароля и внесение в таблицу нового ID с доступом = 0.


- exist but no access


{{ s3.body.exist == 1 and s3.body.access != 1 }}

После проверки данного условия происходит повторное запрашивание пароля.


- exist and access


{{ s3.body.exist == 1 and s3.body.access == 1 }}

После проверки данного условия сценарий выходит на основную ветку, то есть непосредственно интеграцию данного Telegram-бота с какой-либо системой.


Создаем модули IF:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Прописываем в каждом модуле название и соответствующее условие (использование переменных иллюстрировано зелеными стрелками - в выражении можно обратиться к переменной, выбрав ее из всплывающего меню):


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Путем перетаскивания за иконку руки располагаем созданные модули IF, формируя из них такое дерево:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


3.5 Запись данных в таблицу (модули HTTP)


После прохождения условия "pass_phrase and not exist" (то есть пользователь отправил верный пароль в первом же сообщении) внесем ID чата в базу с доступом = 1. Для этого осуществим HTTP-запрос к методу Google Sheets API: spreadsheets.values.append (добавление данных в следующую строку).


URL запроса:


https://sheets.googleapis.com/v4/spreadsheets/{{ scenario.spreadsheet_ID }}/values/{{ scenario.sheet_name }}!B:C:append?valueInputOption=USER_ENTERED

Метод: POST, формат данных: text/plain


В заголовке запроса передаем:


  • {"Content-Type": "application/json"}
  • подключение, созданное в пункте 1.1.2

В теле запроса передаем следующий объект:


{
   "majorDimension": "ROWS",
   "values": [
     [ "{{ s1.body.message.from.first_name }}", {{ s1.body.message.chat.id }}, "1" ]
   ]
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После прохождения условия "pass_phrase and exist" (то есть пользователь Telegram, ранее внесенный в базу, отправил верный пароль только что) заменим на "1" значение в столбце C напротив соответствующего ID чата. Для этого осуществим HTTP-запрос к методу Google Sheets API: spreadsheets.values.batchUpdate (заполнение диапазона ячеек).


URL запроса:


https://sheets.googleapis.com/v4/spreadsheets/{{ scenario.spreadsheet_ID }}/values:batchUpdate

Метод: POST, формат данных: text/plain


В заголовке запроса передаем:


  • {"Content-Type": "application/json"}
  • подключение, созданное в пункте 1.1.2

В теле запроса передаем следующий объект:


{
   "valueInputOption": "USER_ENTERED",
   "data": {
     "range": "{{ scenario.sheet_name }}!C{{ s3.body.row }}:C{{ s3.body.row }}",
     "majorDimension": "ROWS",
     "values": [
       [
         "1"
       ]
     ]
   }
}

здесь в адресации диапазона таблицы используется переменная номера строки из модуля PHP


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После прохождения условия "not exist" (то есть от данного ID чата получено впервые, при этом согласно родительскому условию оно не содержит пароль) внесем ID чата в базу с доступом = 0. Для этого осуществим HTTP-запрос к методу Google Sheets API: spreadsheets.values.append (добавление данных в следующую строку).


URL запроса:


https://sheets.googleapis.com/v4/spreadsheets/{{ scenario.spreadsheet_ID }}/values/{{ scenario.sheet_name }}:append?valueInputOption=USER_ENTERED

Метод: POST, формат данных: text/plain


В заголовке запроса передаем:


  • {"Content-Type": "application/json"}
  • подключение, созданное в пункте 1.1.2

В теле запроса передаем следующий объект:


{
   "majorDimension": "ROWS",
   "values": [
     [ "{{ s1.body.message.chat.first_name }}", {{ s1.body.message.chat.id }}, "0" ]
   ]
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


3.6 Отправка сообщений (модули HTTP)


Теперь по каждой ветке настроим отправку сообщения ботом. HTTP-запросы обращаются к методу Telegram Bot API: sendMessage.


После HTTP-модуля с внесением ID чата в базу с доступом = 1:


URL запроса:


https://api.telegram.org/bot{{ connection.body.bot_id }}/sendMessage

(значение {{ connection.body.bot_id }} будет автоматически подставлено из данных подключения)


Метод: POST, формат данных: application/json


В заголовке запроса передаем подключение, созданное в пункте 1.2


В теле запроса пропишем ключи со значениями:


{
  "chat_id": {{ s1.body.message.chat.id }},
  "text": "Вы получили доступ"
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После HTTP-модуля с изменением значения доступа на "1":


URL запроса:


https://api.telegram.org/bot{{ connection.body.bot_id }}/sendMessage

Метод: POST, формат данных: application/json


В заголовке запроса передаем подключение, созданное в пункте 1.2


В теле запроса пропишем ключи со значениями:


{
   "chat_id": {{ s1.body.message.chat.id }},
   "text": "Теперь вы получили доступ"
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После HTTP-модуля с внесением ID чата в базу с доступом = 0:


URL запроса:


https://api.telegram.org/bot{{ connection.body.bot_id }}/sendMessage

Метод: POST, формат данных: application/json


В заголовке запроса передаем подключение, созданное в пункте 1.2


В теле запроса пропишем ключи со значениями:


{
  "chat_id": {{ s1.body.message.chat.id }},
  "text": "Назовите пароль"
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После прохождения условия "exist but no access":


URL запроса:


https://api.telegram.org/bot{{ connection.body.bot_id }}/sendMessage

Метод: POST, формат данных: application/json


В заголовке запроса передаем подключение, созданное в пункте 1.2


В теле запроса пропишем ключи со значениями:


{
  "chat_id": {{ s1.body.message.chat.id }},
  "text": "Назовите верный пароль"
}

Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


3.7 Дальнейшая работа


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


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


После прохождения условия "exist and access" предполагается выстраивание дальнейшего сценария интеграции Telegram-бота с какой-либо системой.


В рамках демонстрации мы добавили отправку ботом сообщения "Продолжайте работу", в каждом конкретном случае этот шаг уже будет свой.


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


4. Сценарий в действии


Включаем готовый сценарий и начинаем взаимодействие с ботом:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Бот запросил пароль, а ID чата был внесен в таблицу с доступом = 0:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


В ответ на неверный пароль бот запрашивает пароль еще раз:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Называем верный пароль:


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Бот ответил, что предоставил доступ, а значение в таблице изменилось на "1":


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных


Теперь бот будет отвечать на команды пользователя согласно дальнейшему сценарию, в рамках демонстрации бот отправляет сообщение "Продолжайте работу" в ответ на любое сообщение пользователя, для которого прописан доступ в Google-таблице.


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


Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных

Попробуйте бесплатно

При регистрации Вы бесплатно получаете 14 дней и 1.000 запусков сценариев:

Нажимая кнопку «Регистрация» Вы принимаете условия лицензионного соглашения и даете согласие на обработку своих персональных данных. Если у Вас уже есть аккаунт, войдите в систему. Сайт защищен технологией reCAPTCHA и к нему применяются Google политика конфиденциальности и условия использования.
  • Техподдержка

    Ответим на Ваши вопросы, подскажем по настройкам модулей.

  • Доступные тарифы

    От 1000р. в месяц за полный функционал без ограничений.

  • Безопасность

    Сервера расположены на территории РФ, а все подключения дополнительно шифруются.