Личный телеграм-бот за 30 минут
--
Любые идеи и решения, зарождающиеся в вашей голове — это эволюция того, что вы переварили: посмотрели, прочитали, попробовали. В одно время в моей голове оказались темы ведения личного бюджета и подход 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.