Bot happens. Telegram bot + Google Sheets (on webhooks)
Друзья, привет!
Сегодня создаем Telegram бота, связанного с Google Таблицей.
Наш бот по команде от пользователя отправит ему в Telegram последний пост из оглавления нашего канала.
После того, как вы поймете, как работает код — вы сможете адаптировать его под свои нужды. Например, пишете боту в Telegram и он отправляет письмо с данными из Таблицы работнику, или начинает собирать несколько Таблиц в одну и конвертирует её в PDF, в общем — все, что вы сможете придумать :)
Какой у нас план:
- Создадим бота в Telegram и получим токен авторизации.
- Напишем Google Apps Script, управляющий ботом. Вставим в него токен.
- Развернем скрипт как веб-приложение.
- Зарегистрируем вебхук.
- Всё, будем пользоваться 😎
Пост написан по мотивам статьи: Telegram Bot with Apps Script (Create a Telegram Bot without a server)
Создаем нового бота в Telegram
- Для начала — находим @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);
Полный код с комментариями — здесь.
Сохраняем проект и разворачиваем как веб-приложение:
- Сохраняем код: Файл > Сохранить
- В редакторе скриптов: Публикация > Развернуть как веб-приложение
- Версия проекта: выбираем Новый
- Как запускать приложение: выбираем себя
- Кто имеет доступ: все, вкл. анонимных пользователей
- Обновить
После того, как вы кликните Обновить — откроется диалоговое окно авторизации скрипта, кликаем Разрешить.
После этого вы увидите окно, что ваш проект успешно развернут. Скопируйте из этого диалогового окна Текущий 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