Bot happens. Telegram bot + Google Sheets (on webhooks)

Eugeny Namokonov
4 min readAug 20, 2018

--

Друзья, привет!

Сегодня создаем Telegram бота, связанного с Google Таблицей.

Наш бот по команде от пользователя отправит ему в Telegram последний пост из оглавления нашего канала.

После того, как вы поймете, как работает код — вы сможете адаптировать его под свои нужды. Например, пишете боту в Telegram и он отправляет письмо с данными из Таблицы работнику, или начинает собирать несколько Таблиц в одну и конвертирует её в PDF, в общем — все, что вы сможете придумать :)

Какой у нас план:

  1. Создадим бота в Telegram и получим токен авторизации.
  2. Напишем Google Apps Script, управляющий ботом. Вставим в него токен.
  3. Развернем скрипт как веб-приложение.
  4. Зарегистрируем вебхук.
  5. Всё, будем пользоваться 😎

Пост написан по мотивам статьи: Telegram Bot with Apps Script (Create a Telegram Bot without a server)

Создаем нового бота в Telegram

  1. Для начала — находим @BotFather через строку поиска Telegram

2. Нажимаем START и выбираем /newbot

3. Придумаем имя нашему боту

Вася на вебхуках :)

4. И юзернейм (по нему бота можно будет найти). Юзернейм должен оканчиваться на bot.

главное — не ошибиться в буквах, а то Вася обидится

5. Записываем токен API доступа к Google Васе:

684873979:AAFWxHSV8QWoZUpiA9Z18EAyDHgLvrpjdkA

Наш бот создан, переходим к следующей части

Скрипт, скрипт, скрипт!

Скрипт может находиться в Таблице или в проекте, созданном в https://script.google.com/home.

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

Задача нашего скрипта — обработать этот запрос с помощью функции doPost(e) и отправить ответный, в котором будут данные из Таблицы.

Пусть наш бот, когда ему напишут в Telegram команду /lastpost откроет Таблицу с оглавлением нашего канала, возьмет в ней последний пост и отправит его пользователю

Код нашего скрипта можно разделить на три блока:

В первом — мы принимаем сигнал от бота и с помощью вложенных IF определяем, отправлена ли боту команду /lastpost

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') {

// проверяем на название команды - /lastpost
if (msg.text == '/lastpost') {

Второй блок. Если всё так и бот получил /lastpost, то запускается код после последнего IF. В нем мы мы достаем из оглавления канала последний пост и немного форматируем его.

// если все проверки пройдены - запускаем код, который ниже, 
// открываем оглавление нашего канала

var sh = SpreadsheetApp.
openById('1u0aRlwb0rQHbjE9avbgCqIJSQ3EvPfTxT-h54jTQh8I').getSheets()[0]

// достает последний пост
var lastpost = sheet.getRange(sheet.getLastRow(), 1, 1, 3).getValues()[0]
var message = ' <strong>'+lastpost[1] + '</strong> \n' + lastpost[2]

Третий блок. Формируем из последнего поста сообщение и отправляем его боту обратно, используя метод send message. Бот отобразит сообщение в чате.

(не забудьте заменить токен API на свой)

//формируем сообщение
var payload = {
'method': 'sendMessage',
'chat_id': String(chatId),
'text': message,
'parse_mode': 'HTML'
}
var data = {
"method": "post",
"payload": payload
}

// и отправляем его боту (замените токен API на свой)
var API_TOKEN = '684873979:AAFWxHSV8QWoZUpiA9Z18EAyDHgLvrpjdkA'
UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);

Полный код с комментариямиздесь.

Сохраняем проект и разворачиваем как веб-приложение:

  1. Сохраняем код: Файл > Сохранить
  2. В редакторе скриптов: Публикация > Развернуть как веб-приложение
  3. Версия проекта: выбираем Новый
  4. Как запускать приложение: выбираем себя
  5. Кто имеет доступ: все, вкл. анонимных пользователей
  6. Обновить

После того, как вы кликните Обновить — откроется диалоговое окно авторизации скрипта, кликаем Разрешить.

После этого вы увидите окно, что ваш проект успешно развернут. Скопируйте из этого диалогового окна Текущий URL веб-приложения.

Регистрация вебхука.

У нас остался последний шаг — нужно зарегистрировать вебхук, составив такой запрос следующего вида:

https://api.telegram.org/bot{API_TOKEN}/setWebHook?url={CURRENT_WEB_APP_URL}

Вставим в запрос наш API Token и ссылку на развернутое приложение.

То, что получилось у нас:

https://api.telegram.org/bot684873979:AAFWxHSV8QWoZUpiA9Z18EAyDHgLvrpjdkA/setWebHook?url=https://script.google.com/macros/s/AKfycbxdQb6Ig11wfyzubEX2kEdCz-ECuHK35nR8ElQM6SQWLcN8u9oq/exec 

Копируем запрос в адресной строку браузера и выполняем. Если вы все сделали правильно, появится такое сообщение:

Ура, мы закончили.

Теперь наш бот работает и готов к бою!

P. S. ПРИЧИНА САМОЙ ЧАСТОЙ ОШИБКИ: Любое изменение кода нужно публиковать под новой версией. Изменили код — публикуйте и выбирайте новую версию.

Код проекта с комментариями.

Бот: http://t.me/VasyaSheetsBot

P. S. Чтобы бота можно было добавить в группу — откройте BotFather, найдите вашего бота, allow in groups > turn groups on

--

--