Личный телеграм-бот за 30 минут

Alexandr Subbotin
6 min readJun 3, 2020

Любые идеи и решения, зарождающиеся в вашей голове — это эволюция того, что вы переварили: посмотрели, прочитали, попробовали. В одно время в моей голове оказались темы ведения личного бюджета и подход nocode. И вот что получилось.

💡Идея

Я пробовал вести личный бюджет просто записывая траты, анализируя выгрузки из банка, через zenmoney и в последнее время остановился на гугл-таблице из статьи в тиньков журнале.

Всё просто: не нужно стараться учитывать каждую трату и бесполезно разбивать траты по категориям. Главное — понимать текущий “баланс”. Если знать, что зарабатываешь 50к, тратишь на квартиру 10к и хочешь отложить 10к — остаётся 30к в месяц на траты, то есть по 1 000 рублей в день. Вчера потратил 300 рублей — сегодня есть 1 700, потратил 2к — сегодня 0. И так баланс со всех предыдущих дней переходит в следующие.

Как обычно, в чужом меня что-то не устраивает и я переделал таблицу под себя, получилось немного проще для ведения.

На странице «расходы» вводим траты (можно суммарно за день, можно каждую транзакцию), на странице «03.2021» видим текущий баланс.

Спустя неделю я понял, что невозможно заставить себя открывать таблицу и записывать расходы. Нужно это как-то упростить, чтобы тратить минимум времени и мыслетоплива.

Конечно, первая идея: создать мобильное приложение, впилить туда подписку, уволиться с работы и путешествовать за счёт пассивного дохода, но приложений на телефоне установлено столько, что я и так в них теряюсь. Зато я постоянно открываю телеграмм — нужно сделать бота!

🛠 Технологии

Первая идея — по-старинке написать бекенд с rest api, куда-то всё задеплоить. Но это всё поддерживать, решать проблемы с локальным дебагом, деплоить каждое изменение, за сервера платить и рано или поздно там что-то сломается и нужно будет тратить время на поддержку.

Вторая идея — использовать serverless / AWS Lamda / etc. Это ленивый вариант для обработки хуков от любых сервисов — освобождаемся от поддержки. Но опять же, что-то писать, выбирать технологии, язык… Долго.

Как раз недавно я начитался Вастрика про nocode и решил попробовать сделать бота без единой строчки кода и не пожалел, т.к. сделал рабочее решение менее, чем за 30 минут.

👨🏻‍🔧Создание

🕘 21:00

Чтобы не отвлекаться потом — подготовимся.

Регистрируем аккаунт в integromat — сервис для интеграции всего со всем без написания кода. Я пробовал раньше zapier и iftt, но integromat мне показался самым удобным.

Создаём бота в телеге через botfather — придумываем имя, отправляем боту всю необходимую информацию и в ответ получаем токен вида 1234567890:AAAaaA0AAA0aa0aAAAA0aa00Aa__0aaAaaa, который сохраняем для использования.

21:04

Создаём новый сценарий в integromat— мы будем слать сообщения телеграмм-боту, который будет записывать наши траты и в ответ будет отдавать наш баланс. Вот так:

Интегромат не умеет из коробки обрабатывать сообщения, приходящие боту, поэтому интеграцию сделаем через webhook. Итого для сценария нам будут нужны модули webhook, telegram bot и google sheets.

Началом скрипта будет получение вебхука — добавляем новый и копируем адрес.

Говорим телеграмму, чтобы все сообщения, полученные ботом он отправлял на этот адрес — используем метод setWebhook. Самый простой способ — это открыть в браузере адрес https://api.telegram.org/bot и запустить в JS-консоли:

fetch("https://api.telegram.org/bot<bot-token>/setWebhook", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({url: "https://hook.integromat.com/<integromat token>"})
}).then(console.log).catch(console.log)

Получаем подтверждение

{"ok":true,"result":true,"description":"Webhook was set"}

Для проверки шлём любое сообщение боту и видим Successfuly determined, значит integromat получил наше сообщение.

21:09

Идём попить водички

21:11

У нас есть сообщение, которое получил бот — теперь нужно забрать из него сумму и положить отдельной строкой в таблицу. Добавляем модуль Google Sheets → Add row, авторизуемся и выбираем нашу таблицу и страницу Расходы. Делаем маппинг — в какую ячейку что мы будем класть.

  • Первый столбец — дата. Она хранится в поле message.date
  • Второй столбец — сумма. Для начала будем слать в сообщении только сумму — мы же делаем MVP! Маппинг получается такой:

Нажимаем run once и пробуем послать боту любое число. Отлично, всё работает:

Но в поле дата попадает timestamp вместо конкретной даты — нам нужно сделать преобразование — из таймстемпа получить дату, а её преобразовать в строку вида 01.06.2020. Используем весь свой многолетний опыт программирования:

Запускаем, тестируем:

Бинго — расходы записываются, на странице 06.2020 видим траты по дням и баланс. Текущий — в ячейке G5

21:21

Нужно получить баланс и послать его в ответ. Добавляем модуль Google Sheets → Get a cell, выбираем нашу таблицу, страницу 06.2020 и ячейку G5.

Добавляем модуль Telegram bot → Send a text message or reply. Подключаем нашего бота, применив скопированный bot-token и конструируем наш ответ:

Запускаем, проверяем:

Поздравляю, простейший бот готов!

21:24

MVP есть, немного отполируем.

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

21:26

Если мы делаем что-то для себя или для быстрого старта — это всё равно должно выглядеть и работать приятно. Добавим описание и welcome-message.

Теперь надеваем шляпу дизайнера — открываем любой редактор и создаём картинку 512x512. Включаем креатив и накидываем аватарку для нашего бота. Я предпочитаю эмодзи. Например, вот так:

Устанавливаем аватарку через botfather.

21:28

Сейчас кто угодно может послать сообщение нашему боту — добавим фильтр, чтобы он работал только с нами. Добавляем его между вебхуком и модулем google sheets, фильтруем сообщения по отправителю

🕥 21:30

One more thing: чтобы ботом было удобно пользоваться в любой ситуации — пиним его в мессенджере. Теперь чат с ботом будет всегда наверху:

На этом всё — идём ставить кофе под Элвиса Пресли / кататься на самокате / писать статью про создание бота за 30 минут.

В следующих итерациях:

  • Добавляем waitlist, если кто-то захочет использовать нашего бота — зачем терять потенциальных лидов? Потом всё-таки сделаем прилу с подпиской и монетизируем их!
  • Наводим красоту в табличке
  • Добавляем универсальность — чтобы бот продолжал работать в следующем месяце
  • Добавляем отправку баланса раз в день, чтобы уже с утра понимать, как сегодня будешь отдыхать.

Итоги

  • MVP — это не сделать быстро и плохо, а сделать быстро работающий продукт. И даже не из говна и палок — запуская каждый новый продукт ты получаешь больше опыта и делаешь его MVP лучше предыдущего.
  • Делайте сайд-проекты: так вы можете ввести в свой арсенал новые инструменты, которые могут пригодиться для быстрого решения проблем на работе. Например, когда в следующий раз вам нужно будет отправить что-то в канал в слаке по хуку — вы реализуете это за 5 минут без разработки.
  • Делать максимально просто и релизить через 30 минут — лучший способ мотивации что-то делать. И ещё раз: просто ≠ плохо.
  • Микросервисы — это не всегда kubernetes, архитектура, поддержка и мониторинг. Гугл таблицы тоже могут быть микросервисом.

P.S. Если бот вам интересен — добавляйте. Соберётся много заявок — сделаю публичную версию.

— — —

Вопросики? Пиши в телеграмм @alexsubbotin. И подписывайтесь на канал Saturday Night Hack.

--

--

Alexandr Subbotin

CTO @ Appbooster. Full-stack developer, creator of CerebroApp. Author of Saturday Night Hack: https://t.me/sn_hack