Скопированный URL используем в настройке Telegram-бота, которую будем выполнять в соответствии с пунктами 1-4 решения по созданию Telegram-бота.
Результатом выполненных действий для данной интеграции станет:
Создадим в Google таблицу и выделим отдельный лист под базу данных. Основные манипуляции будут производиться в столбцах B и C, и косвенно будет задействован столбец A - в первой строке для наглядности пропишем заголовки этих трех столбцов. В столбец C будут записываться значения 0 или 1 - в зависимости от того, был ли отправлен от соответствующего ID чата корректный пароль.
В адресной строке находим ID таблицы (spreadsheet_ID) и прописываем название листа (sheet_name) - в нашем примере лист называется "cooperators". На следующем шаге мы скопируем их.
Для того, чтобы некоторые глобальные значения не приходилось прописывать/изменять в нескольких местах, удобнее создать переменные и в дальнейшем обращаться к ним.
Например, пароль (pass_phrase) можно будет изменить, присвоив новое значение переменной. Также можно будет привязать сценарий к другой таблице, изменив значения переменных spreadsheet_ID и sheet_name.
Итак, введем в сценарий следующие переменные (в качестве пароля - по сути кодовой фразы - можно использовать любой текст):
"pass_phrase" : "пароль42",
"spreadsheet_ID": "{ID таблицы из адресной строки}",
"sheet_name": "{название листа}"
После получения сообщения 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
Данные в таблицу будут записываться в таком виде. Для примера заполним одну строку:
Затем временно включим сценарий:
и отправим в бот тестовое сообщение, чтобы сценарий сработал. В выходных данных модуля видим строки в виде вложенных массивов:
Нам потребуется создать следующие ключи, чтобы в дальнейших шагах сценария обращаться к ним:
Осуществим итерацию по массиву, содержащему данные строк, сопоставим значение каждого элемента с 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 ];
(зеленым цветом иллюстрировано обращение к доступным переменным)
Произведем проверку имеющихся данных на соответствие следующим условиям, по каждому из которых разветвляется сценарий:
{{ s1.body.message.text == scenario.pass_phrase and s3.body.exist != 1 }}
После проверки данного условия осуществляется внесение в таблицу нового ID с доступом = 1.
{{ s1.body.message.text == scenario.pass_phrase and s3.body.exist == 1 }}
После проверки данного условия осуществляется изменение доступа на "1" у существующего ID.
{{ 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, формируя из них такое дерево:
После прохождения условия "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
В заголовке запроса передаем:
В теле запроса передаем следующий объект:
{
"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
В заголовке запроса передаем:
В теле запроса передаем следующий объект:
{
"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
В заголовке запроса передаем:
В теле запроса передаем следующий объект:
{
"majorDimension": "ROWS",
"values": [
[ "{{ s1.body.message.chat.first_name }}", {{ s1.body.message.chat.id }}, "0" ]
]
}
Теперь по каждой ветке настроим отправку сообщения ботом. 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": "Назовите верный пароль"
}
Так будет выглядеть начальный фрагмент сценария, отвечающий за допуск к работе с Telegram-ботом только пользователей, для которых прописан доступ в Google-таблице:
После прохождения условия "exist and access" предполагается выстраивание дальнейшего сценария интеграции Telegram-бота с какой-либо системой.
В рамках демонстрации мы добавили отправку ботом сообщения "Продолжайте работу", в каждом конкретном случае этот шаг уже будет свой.
Включаем готовый сценарий и начинаем взаимодействие с ботом:
Бот запросил пароль, а ID чата был внесен в таблицу с доступом = 0:
В ответ на неверный пароль бот запрашивает пароль еще раз:
Называем верный пароль:
Бот ответил, что предоставил доступ, а значение в таблице изменилось на "1":
Теперь бот будет отвечать на команды пользователя согласно дальнейшему сценарию, в рамках демонстрации бот отправляет сообщение "Продолжайте работу" в ответ на любое сообщение пользователя, для которого прописан доступ в Google-таблице.
Теперь предположим, что мы изменили пароль (присвоили новое значение переменной сценария) и очистили таблицу. Теперь пользователи Telegram, у которых уже был открыт чат с ботом, могут сразу отправить новый пароль и продолжать работу:
Оставить комментарий