- APInita
- Возможности
- Сервисы
- Решения
- Рерайт статей с помощью ИИ и публикацией в Telegram
- Распознавание чеков и документов по фото с помощью APInita
- Генерация изображений с помощью ИИ и отправка в Телеграм
- Получение и передача файлов в Telegram по API
- Авторизация в Telegram-боте с использованием Google-таблицы в качестве базы данных
- Другие решения
- Начать бесплатно
- Вход
- Контакты
Авторизация в 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:


Скопированный URL используем в настройке Telegram-бота, которую будем выполнять в соответствии с пунктами 1-4 решения по созданию Telegram-бота.
Результатом выполненных действий для данной интеграции станет:
- входящий вебхук, являющийся первым шагом (триггером) сценария;
- подключение к боту, которое будет передаваться в запросах на отправку сообщений в последующих шагах.

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

В адресной строке находим ID таблицы (spreadsheet_ID) и прописываем название листа (sheet_name) - в нашем примере лист называется "cooperators". На следующем шаге мы скопируем их.
3. Настройка сценария в APInita
3.1 Переменные сценария
Для того, чтобы некоторые глобальные значения не приходилось прописывать/изменять в нескольких местах, удобнее создать переменные и в дальнейшем обращаться к ним.
Например, пароль (pass_phrase) можно будет изменить, присвоив новое значение переменной. Также можно будет привязать сценарий к другой таблице, изменив значения переменных spreadsheet_ID и sheet_name.
Итак, введем в сценарий следующие переменные (в качестве пароля - по сути кодовой фразы - можно использовать любой текст):
"pass_phrase" : "пароль42",
"spreadsheet_ID": "{ID таблицы из адресной строки}",
"sheet_name": "{название листа}"

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

URL запроса:
https://sheets.googleapis.com/v4/spreadsheets/{{ scenario.spreadsheet_ID }}/values/{{ scenario.sheet_name }}!B:CМетод: GET, формат: application/json
В заголовке передаем подключение, созданное в пункте 1.1.2

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

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

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

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 ];

(зеленым цветом иллюстрировано обращение к доступным переменным)
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:

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

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

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" ]
]
}
После прохождения условия "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

После прохождения условия "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" ]
]
}
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": "Вы получили доступ"
}
После 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": "Теперь вы получили доступ"
}
После 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": "Назовите пароль"
}

После прохождения условия "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": "Назовите верный пароль"
}
3.7 Дальнейшая работа
Так будет выглядеть начальный фрагмент сценария, отвечающий за допуск к работе с Telegram-ботом только пользователей, для которых прописан доступ в Google-таблице:

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

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

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

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

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

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


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

Похожие решения
- Создание мини чат-бота в Telegram
- Телеграм чат-бот на модуле PHP
- Добавление сделок и контактов в amoCRM при помощи Telegram-бота
- Получение и передача файлов в Telegram по API
- Интеграция amoCRM и Telegram: автоматизация бизнес-процессов
- Передача обращений из U-ON в Google таблицы
- Интеграция amoCRM и Google Таблиц: автоматизация без кода
- Как связать Google Календарь и Google Таблицы для автоматизации задач
- Интеграция Google Таблиц и Битрикс24 для автоматизации бизнес-процессов
- Как автоматизировать работу с Google Таблицами и Telegram