Создаём телеграм бота для подсчета расходов
Друзья, сегодня статья-урок. Попробуем считать наши расходы лучше, экономить больше. Ну либо просто научимся соединять Телеграм бота и Google Таблицу :)
Концепция такая — мы создаём приватный Телеграм канал, чтобы отправлять в него расходы. Помимо вас, расходы смогут отправлять любые люди, которых вы добавите к каналу.
А причём тут Таблицы, спросите вы? А мы добавим в этот канал Телеграм бота и пусть все расходы отправляет в Таблицу, добавляя к ним дату и время.
Сообщение в канал будем отправлять одним сообщением [сумма] / [на что пошли кровные], а наш бот в канале будет ловить это сообщение и делить его по / и число помещать в одну колонку, а предмет расхода в другую.
1) Создавайте Телеграм бота в t.me/botfather и получайте его токен
2) Создавайте канал в Телеграм и добавляйте бота в него как администратора
3) Копируйте нашу Таблицу с кодом и открывайте в копии редактор скриптов.
4) Вставьте в переменную botToken токен вашего Телеграм бота, который вы получили от @botfather
Собственно весь наш код с комментариями (их лучше читать в вашей Таблице)
/* 1) вставляем токен бота 2) публикуем код как веб-приложение (начать развертывание > новое развертывание > веб-приложение > от моего имени (ваш аккаунт) > доступ для всех пользователей) 3) получаем ссылку приложения, вставляем её в webAppUrl 4) запускаем скрипт setWebhook() 5) при любом изменении кода публикуем веб-приложение под новой версией, setWebhook() повторно запускать не надо */ const botToken = ''; const webAppUrl = ''; const telegramUrl = 'https://api.telegram.org/bot' + botToken; /* setWebhook просто соединяет 'https://api.telegram.org/bot', токен вашего бота, '/setWebhook?url=' и адрес вашего развернутого приложения в одну ссылку и запрашивает её, тем самым регистрируя отправку всего от вашего бота в адрес вашего приложения */ function setWebhook() { var response = UrlFetchApp.fetch(telegramUrl + '/setWebhook?url=' + webAppUrl); Logger.log(response.getContentText()); }; /* doPost будет принимать сообщение от телеграм и либо логировать на листе "расходы", либо падать с какой-нибудь ошибкой на листе "ошибки" */ function doPost(e) { try { log(e); } catch (err) { error(err); } }; /* LOG принимает объект от doPost, парсит, достаёт сообщение и автора далее делит сообщение на две части по '/', собирает это всё, добавляет дату и вставляет на лист "расходы" в новую строку, если листа с таким названием нет - скрипт его создаст */ function log(r) { r = JSON.parse(r.postData.contents); const message = r.channel_post.text; const author_signature = r.channel_post.author_signature; const values = [[new Date, author_signature, message, message.split('/')[0], message.split('/')?.[1]]]; const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("расходы") || ss.insertSheet("расходы"); sheet.insertRowBefore(2) .getRange(2, 1, 1, values[0].length) .setValues(values); }; /* если при попытке распарсить и вставить сообщение происходит что-то не то, то вы увидите эту ошибку на листе "ошибки" */ function error(err) { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("ошибки") || ss.insertSheet("ошибки"); const data = [[new Date(), err.message]]; sheet.getRange(sheet.getLastRow() + 1, 1, data.length, data[0].length).setValues(values); };
5) Разворачиваем наш код как веб-приложение и вставляем ссылку в webAppUrl
Если не знаете как развернуть код как приложение, вот короткая гифка со звуком.
doPost будет принимать сообщение от вашего Телеграм бота и отправлять либо на лист 'расходы', либо на лист 'ошибки'. Чтобы doPost работал, мы должны развернуть наш скрипт в Таблице как веб-приложение.
6) Запускаем скрипт setWebhook, этот скрипт свяжет адрес нашего веб-приложения и токен бота и Телеграм будет отправлять все, что получит бот в адрес нашего приложения.
Если все ок, то увидите что-то такое:
Объект с сообщением, который будет приходить от Телеграм выглядит как-то так:
{ channel_post: { date: 1.688566918E9, author_signature: 'Eugeny Namokonov', chat: { type: channel, title: speedsheets, id: -1.0019, username: '' }, sender_chat: { title: speedsheets, type: channel, id: -1.001933, username: '' }, text: '134 / хлебушек', message_id: 7.0 }, update_id: 6.64 }
Мы берём из него в функции log только имя автора и само сообщение, но вы можете брать и другие поля.
Всё, теперь пишем в канал сообщения и видим их в Таблице, которую вы развернули как веб-приложение. За это отвечают скрипты doPost + log.
Либо, если что-то пошло не так, то видим в Таблице ошибку на листе "ошибки", за это отвечает doPost + error :)
PS Чтобы увидеть автора сообщения - в настройках Телеграм канала выберите "Sign Messages".
PPS Ну и как обычно - при любом изменении уже опубликованного кода, чтобы новый код попал в веб-приложение и начал работать - приложение надо публиковать под новой (следующей) версией, вебхук при этом пересоздавать не надо.
Канал “Google Таблицы” в Телеграме