Serverless telegram бот в Excel

Гуглобот в Excel

Гуглобот в Excel

Это история про камингаут телеграм-бота, у которого нет VDS и он бомжует: одной ногой — в гугло-облаке, другой — в Excel.

Да, жизнь бывает сложнее учебника по ботоводству. Например, для целей ботоводства гугло-облако все еще может выглядеть надежнее, проще и удобнее VDS. И если в мире людей не зазорно бомжевать по съемным хатам, то кто осудит бомжебота за отказ от VDS?

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

1.      Google Sheets

Предлагаемый технический вариант реализации бомжебота основан на Google Web Apps. Для непосвященных — это запуск гуглоскрипта в ответ на get или post. То есть скрипт после «публикации в качестве Web App» приобретает адрес, на который он может получать запросы. Сам скрипт может располагаться в любой табличке Google Sheets или в документе Google Docs, там он доступен в меню РасширенияApps Script. Эта табличка или документ (как и любые другие файлы на гугло-диске) могут использоваться ботом.

Собственно, это все, что нужно знать о жизни бомжебота в гугло-облаке.

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

Будем считать, что получение токена бота не является целью этого повествования. Начнем с момента, когда уже есть токен и код бота. Содержание кода будет подробнее изложено ниже. А сейчас цель наших предварительных усилий заключается в получении здорового новорожденного бомжебота, для чего потребуется опубликовать гуглокод бота как Web App, получить его адрес и зарегистрировать полученный адрес в Telegram на токен бота.

Код публикуется в меню Apps Script:

Кнопка в меню Google Apps Script

Кнопка в меню Google Apps Script

Новое развертывание выдаст новый адрес, по которому Telegram будет отправлять апдейты боту. С этим пунктом все, переходим к следующему.

Для регистрации адреса бота в Телеге есть эмейзинг гайд на 10 страницах, который в данном случае сократим до одной строки:

https://api.telegram.org/botВАШ_ТОКЕН/setwebhook? url=webApp

Подставляем в этот шаблон свой токен и адрес Web App, вставляем результат в адресную строку браузера и получаем приветственный джейсон Тележки.

Это все: бот формально жив и официально ваш.

Теперь рассмотрим его код.

Минимальный функционал бота должен позволять ему стартовать. Фактически, старт бота представляет собой не что иное, как получение id пользователя. Без этого id бот не имеет возможности адресно взаимодействовать с пользователем.

При старте бота Тележка отправляет id на зарегистрированный адрес Web App. Web App получает id, команду и прочие данные в параметрах отправленного Тележкой запроса. По заведенному в гугло-облаке порядку за это отвечает обязательная функция doPost. Функция doPost  (или doGet)  обязательно должна быть в скрипте, который опубликован как Web App.

function doPost(request) {
    let update = JSON.parse(request.postData.contents);
    route(update);
}

Из команды бота создадим вызов функции, передадим ей полученные параметры и вызовем ее из созданной on-the-fly функции.

function route(data) {
      const router = checkRouters(data.message.text); 
      let params = data.message.text.split("_");
      (new Function(["data", "params"], "return " + router.method + "(data, params);"))(data, params);
}

В нашем минимальном демонстрационном случае работаем с командой /start. Другие команды добавляются аналогично.

const routers = [
  {
    template: /^\/start$/,
    method: 'start'
  }
];

Команда /start в Тележке вернет пользователю сообщение и сохранит id для дальнейшего использования. Для примера сохраним id в Firebase Realtime Database, раз уж она с приличным бесплатным лимитом, в экосистеме Гугла и с библиотекой.

function start(data, params) {
    sendMessage(data.message.from.id, ‘Сообщение');
    db.setData(telegramBotPath + '/' + data.message.from.username, data.message.from.id)
    }
}

Сообщение отправляется на id пользователя:

function sendMessage(id, text) {
  let payload = {
    'chat_id': String(id),
    'text': text
  };
query(payload);
}

function query(payload) {
  let data = {
    'method': "post",
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };
  const fullURL = config.apiUrl + config.token + "/sendMessage";
  UrlFetchApp.fetch(fullURL, data);
}

Это все: бот готов к старту. Для наглядности изложено схематично, опущены детали.

2.      Excel

Рожденный в гугло-облаке бот будет у нас работать в Excel на ноуте.

Какие задачи может решать телеграм-бот в Excel? Те же, что и везде: основной функцией телеграм-бота является доставка информации. Если практика отправки емайлов из Excel и Word существует очень давно, то почему бы так же не отправлять информацию и в Тележку? Отличие лишь в том, что получатель должен предварительно одобрить получение сообщений от бота, т.е. вызвать команду /start.

Для отправки сообщения пользователю в Тележку необходим id пользователя. Пользователь не знает свой id, он пользуется никнеймом. Поэтому для отправки сообщения из Excel в Тележку выполним следующие действия:

1) получим никнейм пользователя в Тележке,

2) возьмем из БД соответствующий никнейму id,

3) отправим сообщение на id.

Реализовать ввод никнейма пользователем и сохранение введенных данных для дальнейшего использования можно разными способами, выбор из которых определяется предпочтениями в UI/UX. Поскольку это имеет очень косвенное отношение к нашей теме, останавливаться на возможных реализациях сейчас не станем.

Пример UI для ввода никнейма

Пример UI для ввода никнейма

Как мы помним из изложенного выше, нужный нам id хранится в Firebase RTDB, откуда его можно получить по никнейму. Здесь возможны два принципиальных подхода для получения id: обратиться напрямую в БД или использовать прокладку.

Обращение напрямую из Excel в БД само по себе может выглядеть проще, но придется уделять внимание безопасности БД, что точно не проще. Поэтому воспользуемся вторым вариантом и сделаем облачную прокладку.

Для доступа к БД используем уже знакомый нам Web App. Создадим новый файл гуглоскрипта: standalone или связанный с файлом таблички и добавим в него обязательную функцию:

function doGet(request) {
    const db = invoiceBuilder2.getDatabaseByUrl(dbKeys.baseUrl, dbKeys.secret);
    const id = db.getData(telegramBotPath + '/' + request.parameter.nickName);
    return ContentService.createTextOutput(JSON.stringify(id))
}

Адрес этого Web App прописывается в макросе Excel, который отправляет на этот адрес nickname и получает в ответ id.

После получения id Excel полностью готов к отправке сообщений в Тележку.

Способ отправки запросов из Excel не влияет на результат в виде получения пользователем сообщения в Тележке, а таких способов несколько. Поэтому вместо обзора имеющихся возможностей приведем общую схему, которая может быть доработана исходя из потребностей и предпочтений.

tgBotURLBase = 'https://api.telegram.org/bot';
tgBotURL = tgBotURLBase + telegramBotToken + '/sendMessage';
payLoad = {};
payLoad['id'] = Id;
payLoad['text'] = 'Сообщение';
sendToTelegram ('POST', tgBotURL, payLoad);

В официальной доке Тележки хорошо описаны возможности формирования и форматирования отправляемых ботом сообщений.

Практический пример бота в Excel предназначен для отправки пользователям объявлений с Авито и ЦИАН, отобранных по заданным критериям.

В этом примере Excel парсит доски объявлений недвижимости и при загрузке очередного объявления проверяет его на соответствие установленным критериям. Если данные объявления соответствуют заданным критериям, пользователю отправляется ссылка на объявление и настраиваемые данные — например, цена за 1 кв.м., адрес, номер телефона и т.п…

В данном случае парсинг силами пользователя, т.е. на его железе, позволяет использовать гибкость Excel для настройки бота в точном соответствии с потребностями пользователя. Использование формул для работы с собранными в Excel данными об объектах недвижимости снимает ограничения в быстрой реализации любых операций с данными для определения критериев отбора объявлений и составления сообщений.  Если бы бот не чувствовал себя в Excel как дома, устанавливать фильтры объявлений и составлять шаблон текста сообщений пришлось бы с привлечением стороннего специалиста-ботовода, а это совсем другая история.

В этой инструкции изложен один из самых простых способов завести телеграм-бота: не нужен не только сервер, но и телеграм-библиотеки, node.js и даже npm. Библиотеки на jscript для Telegram есть, например, telegraf.js. Но для простейших ботов даже библиотеки выглядят оверхедом.

Также, знакомых с Google Apps Script людей наверняка значительно больше, чем знакомых с node.js. Поэтому предложенный стек позволит завести бота более широкому кругу энтузиастов.

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

© Habrahabr.ru