понедельник, 20 ноября 2017 г.

Веб приложения google, бот Telegram и все, все, все....

Веб-приложения google - ещё один замечательный инструмент, который предлагает корпорация добра. Оказывается можно запускать скрипты просто открывая ссылку в веб-браузере.
В каком случае эти приложения могут быть полезны? 


1. Представим ситуацию когда мы написали замечательно работающий скрипт для таблицы, задали для него кнопку (красивая такая). Конечно же мы всё протестировали на компьютере. Пробуем открыть таблицу в телефоне и нажимаем на кнопку (красивую такую) и ничего не происходит. Абсолютно. Не поддерживает google кнопки в телефоне.:( 
2. Пишем скрипт переноса данных из одной таблицы в другую, но хотим чтобы пользователь имел доступ только к одной таблице, а про другую даже и не знал (не то что на редактирование права имел).
3. Хотим чтобы за время выполнения какой-либо функции таблицы выполнилось сразу несколько скриптов. (сумбурно написал) Ну, например, из прошлой статьи сделать так чтобы pdf документы генерировались одной кнопкой, обходя ограничения google.

4. Ну или в моём клиническом случае:
Есть сервер подключённый к интернету, очень сильно урезанному. Подключаться извне к нему не могу (и канал узкий и проходит через множество прокси серверов).  
Автоматически сервер включается и выключается в определённое время, но не всегда.:). Хотелось бы чтобы при включении, он хоть как то меня оповещал об этом, ну и перед выключением. Если захочется, то и функционала можно будет добавить.

И тут вступает в дело бот Telegram - очень хорошая статья, и ещё

Для него необходимо написать два скрипта.

1. Для сохранения id чата. В новой таблице создаём скрипт:


var botToken='Toкen_вашего_бота'
var SSID='ID_вашей_таблицы'
var scriptURL='URL_веб_приложения'

function doPost(e) {
  var update = JSON.parse(e.postData.contents);
  if (update.hasOwnProperty('message')) {
    var msg = update.message;
    var chatId = msg.chat.id;
    if (msg.hasOwnProperty('entities') && msg.entities[0].type == 'bot_command') {
      if (msg.text == '/start') {
        var ss=SpreadsheetApp.openById(SSID);
        var userSheet=ss.getSheets()[0];
        var chatCell=userSheet.getRange('A1').setValue(chatId);
        var quote = 'Использование включено';
        var payload = {
          'method': 'sendMessage',
          'chat_id': String(chatId),
          'text': quote,
          'parse_mode': 'HTML'
        }
        var data = {
          "method": "post",
          "payload": payload
        }
        var API_TOKEN = botToken;
        UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);
      }
    }
  }
}

function setWebhook() {
  var botId = botToken;
  var scriptUrl = scriptURL;
  Logger.log(UrlFetchApp.fetch('https://api.telegram.org/bot' + botId + "/setWebhook?url=" + scriptUrl));
}

В переменную scriptURL пока ничего не пишем, botToken и SSID надо заполнить.
Публикуем скрипт как приложение с доступом для всех, включая анонимных пользователей и с запуском от Вашего имени. 
Копируем URL вашего приложения и вставляем в переменную scriptURL. Теперь можем запустить функцию setWebhook.
Находим в Telegram своего бота, и даём команду /start. Бот запишет id чата в ячейку A1 и сообщит что "Использование включено".
Наш бот готов к работе с одним пользователем, если другой пользователь даст команду /start, то сообщения будут приходить ему.
2. Для отправки сообщений. Переходим по ссылке и создаём скрипт:

var SSID='ID_таблицы'
var botToken='Token_вашего_бота'

function doGet(e){
   var quote = e.queryString;
   quote=decodeURIComponent(quote)
   var chatId=SpreadsheetApp.openById(SSID).getSheets()[0].getRange('a1').getValue();
        var payload = {
          'method': 'sendMessage',
          'chat_id': String(chatId),
          'text': quote,
          'parse_mode': 'HTML'
        }
        var data = {
          "method": "post",
          "payload": payload
        }
        var API_TOKEN = botToken;
        UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);
  return HtmlService.createHtmlOutput(quote);
}

SSID и botToken берём из первого скрипта. Публикуем как веб-приложение. Копируем URL приложения и сохраняем.
И вот оно решение моей проблемы - при включении сервера запускать команду 
wget -O file URL_веб-приложения?Копьютер_включён
перед выключением
wget -O file URL_веб-приложения?Компьютер_выключен
Можно расширять функционал  так как, в принципе, можно высылать любые сообщения. 
Да существуют и другие возможности информирования админа о существующих проблемах сервера. Эта статья всего лишь пример того что можно сделать.:) 
Буду рад комментариям.

3 комментария:

  1. Спасибо за отличную статью, хотел бы узнать как можно отправлять файлы хранящиеся на гугл диске в отдельной папке с определённым названием которое каждый день меняется по логике ddmm где dd две цифры числа и mm две цифры месяца. Если быть более точным то создаётся просто новая папка с новым названием и её нужно отправить себе в сообщении и только один раз

    ОтветитьУдалить
    Ответы
    1. По идее необходимо как то отслеживать что появилась новая папка. Например, обходить весь google диск (раз в 5 минут) и искать каталоги с датой создания не позже текущего времени минус 5 минут.
      Затем ссылку на такой каталог отправлять в сообщении как тэгированный текст html.

      Удалить
  2. superkyk@ukr.net
    не знаю чего не зафиксировался адрес.

    ОтветитьУдалить