Пишем Telegram бот для учёта расходов с Python, Asyncio/Aiogram, SQLite и Docker
Вставка
- Опубліковано 6 чер 2024
- Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
Telegram: t0digital.t.me
Сказать спасибо за это видео можно здесь - boosty.to/digitalize.team
В этом видео мы реализуем Телеграм бота для учёта личных расходов с бюджетом, категориями расходов и базовой статистикой. Использовать будем Python и Aiogram с Asyncio, в качестве базы данных легковесный движок SQLite, а результат работы упакуем в Docker контейнер для быстрого разворачивания на любом сервере.
Исходный код на Github: github.com/alexey-goloburdin/...
0:00 Telegram бот для учёта личных финансов
0:43 ТЗ на бота
3:01 Демонстрация работы бота
5:07 Используемые библиотеки и технологии
7:00 Aiogram
7:29 Создание бота, получение токена
8:30 Обход блокировки Telegram
9:40 Инициализация бота
10:36 Добавление расходов
12:27 Модуль expenses
18:22 Работа с категориями
19:15 Структура БД
21:49 Модуль работы с БД
24:01 Продолжение по категориям
25:35 Удаление расхода
26:33 Просмотр расходов
29:00 Статистики
30:30 Docker
33:00 Выводы
/****************** about ******************/
Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
- Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
- Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.
С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.
Telegram канал - t.me/t0digital
ВК - digitalize.team
RuTube - rutube.ru/channel/24802975/ab...
Дзен - dzen.ru/id/6235d32cb64df01e6e...
Мой курс «Хардкорная веб-разработка» - course.to.digital
Вжух!
С Новым 2020 годом, друзья! Как вам видос, узнали что-то новое-полезное? На разработку и запись ушло очень много времени, хочется верить, что материал принесёт пользу! Всем спасибо за ваши просмотры, лайки, комментарии - это очень помогает продвижению видео. До связи в Новом году!
Спасибо за то, что ты делаешь! Чувствуется уверенность опытного профессионала, много полезного у тебя подцепил.
Спасибо, Денис!
Спасибо, действительно читаемый код, есть чему поучиться
@@eugennegue3578 Спасибо!
спс
Вот это здорово... Спасибо за труд, круто делаете. Успехов в новом году!
Спасибо! С Наступающим!
Спасибо за тему - очень интересно развивать тему с такими практическими решениями для жизни. Если у тебя будет возможность пожалуйста продолжай такого рода решения практических задач!
Ай ждал! Прям НГ подарок! С наступающим
Йее:) Спасибо! С Наступающим 2020м!
Спасибо за все эти полезные замечания по поводу организации кода, особенно про разделении архитектуры на "клей" и бизнес-логику (можно еще добавить сюда низкоуровневый код, если он есть). Вроде и так все понятно про это разделение, но с наглядным примером намного лучше усваивается
Согласен. Спасибо!
Как интересно рассказываете! Про функции которые начинаются с нижнего подчеркивания не знала раньше, спасибо. Рассказывайте чаще)
Йее, спасибо! 🙏
когда в конце 2020 получаешь пожелание хорошего 2020. :mehh:
Хахахах :)
ага, да и телеграмм уже работает :)
Уже середина 22-го а пиз**ц даже и не собирается уходить...
В конце 2022 понимаем, что 2020 оказывается был хорошим годом.
Привет из 2023!!! С рождеством христовым!!!
Спасибо, материал и его подача как всегда на высоте.
С наступающим!
Спасибооо! С Наступающим!
Спасибо за видео и отдельно за исходники на гитхабе. Очень полезно для тех, кто уже знает основы Python и хочет сделать какой-то реальный проект.
Пожелания:
1. В видео вы говорите про ТЗ. Если вы делали ТЗ к этому проекту, можно на него взглянуть? Очень хотелось бы посмотреть на примере, как оно должно выглядить, хотя бы для личного проекта.
2. Мне лично не хватило (и, как я понял из коментов, многим остальным тоже) объяснений как задеплоить это приложение на сервер, на тот же Heroku. Как запустить на локальной машине понятно, но если действительно пользоваться этим ботом, то нужен запуск на сервере.
Отличное видео, Спасибо! С наступающим!
Спасибооо! С Наступающим!
Спасибо и с наступающим!
С Наступающим!
Классное видео, так актуально, в голове картника сложилась по проекту и большой респект о лучших практиках программирования! 💯👍
Нереально суперское видео! С удовольствием посмотрел бы хоть 5 часов лайв разработки, интересно понять ход мыслей опытного разработчика :)
Спасибо! Сделаем возможно:)
Дождался урааа!! Спасибо!!
Судя по просмотрам и комментариям тема ботов все еще популярна, но почему-то никто не снимает по ней ничего..
Боты популярны и, думаю, будут набирать ещё с ростом популярности нейросетей и лёрнига:)
Спасибо, с Новым годом! Удачи!
Спасибооо, счастливого 2020го!
Идеальный подарок на Новый Год.
Спасибо :) С Наступающим!
Смотрю видео после нового года, тоже нормально)
Спасибо за видео! Хотелось бы больше видео касающегося именно проектирования и архитектуры приложений
Буду делать материалы на эту тему обязательно
С наступающим вас! Спасибо за видос под новый год!
Спасибооо, с наступающим!
С наступающим!!!! Очень нравится канал) продолжайте в том же духе!! )))
Спасибо! Будем продолжать!
Благодаря такому качественному и познавательному контенту я научился нажимать кнопку "подписаться" и лайкать видео. Это просто шок, какой ты крутой! С наступившим тебя, спасибо за видео =)
Йеее, спасибооо! Приятно:) C Наступившим!
Тоже посмотрел от начала до конца, весьма познавательно для начинающего!
Спасибо большое, очень полезный материал
🔥🔥🔥
с наступающим, котан 🐈😎
С Новым годом! Юхуу!
Спасибо! Вынес для себя полезную информацию
Отлично!
Спасибо за видео!
Да неужели 👍 очень ждал
Свершилось:)
Годно! Не понимаю, за что тебя хейтят)Все понятно говоришь)
с наступающим!)
Благодарю за отличный пример бота, лайк и подписка)
Спасибо!
Спасибо! Очень классный учебный контент и пояснения.
В названии опечатка а так видео отличное! С наступающим новым годом!
О, спасибо, поправил:)
замечание - я думаю не стоит объяснять зачем нужно это приложение. Очень много зря времени на это ушло
@@manul7978 без тз результат хз!!!
Привет
В одном из видео ты говорил, что сделаешь видео про фриланс(как брать заказ и тд) Очень нужная информация, заранее спасибо
Привет, делал опрос среди подписчиков - эта тема и вообще тема работы над проектами, управления проектами и подобные набрали мало желающих
Отличный канал. Спасибо!
Спасибооо🙏!
Спасибо за видео
Вот очень интересно конкретно про боты телеграмма на питоне - давайте еще про боты
досмотрит до конца! Несколько часов не беда. хотелось бы с вами это пройти и паралельно написать тоже самое, так как я новичек
блин, если честно, зашел посмотреть именно на то как пишется проект, а тут просто его обзор. это конечно тоже хорошо, да, но интересным мне не кажется.
рад, что сейчас вы вроде начали делать серию видеороликов о написании проекта с нуля, очень жду последующие части!
С Новым годом! Успехов вам в новом году!
Очень нравится ваша подача материала. Пожалуйста, расскажите про докер. Чем отличается от виртуальной машины, как настроить окружение и как переносить контейнеры.
С Новым 2020! Спасибооо!
Расскажу про докер обязательно
Хорошее новогоднее поздравление =)
Спасибо!
Очень интересный видео ролик, понравилась подача и стиль написания кода. Было бы интересно в будущем посмотреть как с нуля пишете проект и сразу комментируете его.
Спасибо! Такое видео в живом кодинге это часов на 5. Может как-нибудь сделаю:)
Очень интересный канал, странно что так мало подписчиков
Спасибооо! Растём понемногу:)
Спасибо!
С наступающим, всего и побольше))
Всё пррсто и лаконично. Единственное, я бы файлик с БД вытащил из контейнера и просто маунтил при старте. А то докер пересобрал и всё пропало)
Да,, упустил этот момент, добавлю в репо:) С Наступающим!
Спасибо круто!
Спасибо за ролик.
Хотелось бы посмотреть на процесс написания в лайве, пусть даже это будет и несколько часов видео.
Возможно как-нибудь сделаем такой лайв. Но это действительно будет очень долго - где-то с исследованиями как что работает, где-то с исправлениями ошибок, где-то с рефекторингом
@@t0digital Хз, лично мне будет очень интересно). Как мне кажется, то многим кто активно учит Питон, тоже. Потомушо в большинстве русскоязычных видео с лайв-написанием чего-либо, авторы занимают позицию типа "Ну, вы повторяйте за мной и всё будет ок", без особых объяснений зачем в данный момент используется именно эта конструкция, что является хорошей/плохой практикой и почему и т.д. Ну и + чаще всего они пишут эхо-бота в тлг/калькулятор/что-то еще, что может поместится в короткий хронометраж.
Іван Галицький аналогично, хотелось бы посмотреть именно вариант написания в реальном режиме с объяснениями, рефакторингом, исправлениями. Интересна практика написания опытных девелоперов/администраторов. Такие примеры экономят просто огромное количество времени на наработку своего опыта.
Значит попробуем делать видео с живым кодингом. Спасибо!
@@t0digital Вам спасибо огромное, что не отказываете!
спасибо, хороший видос. добрая критика: учить английский! :-)
Есть такой план на 2020:) Спасибо!
Я с вами мужики)
очень интересная подача, видео смотрятся на одном дыхании, но некорректные произношения и ударения прям убивают(
С первых секунд лайк. Расскажи о своих книгах по программированию.
Расскажу в отдельном видео, спасибо!
Удивительно, только придумал написать себе такого бота, даже проверил в каталогах, нет такого. Или я плохо искал. И на следующий день мне UA-cam предлагает вот такое.)))
Очень полезное видео, тем кто видит всё это (python, docker, sqlite) впервые видео будет очень сложным. Ну а тем, кто не пугается, и чувствует, что может разобраться, то это равносильно походу на неплохой курс по созданию телеграмм бота. Рекомендую с этим кодом плотно поработать и много полезного положите себе в голову.
Лайк не глядя)
Спасибо!
Спасибо! Чем больше смотрю, тем меньше говнокода и более читабельный код!
Про ТЗ хорошее замечание, не задумывался раньше(
Неделю назад пришла в голову идея сделать такого бота, а сегодня у тебя выходит видео об этом.Что это если не подарок на НГ?)
О, отлично:)!
С новым годом) лучше наверное выносить в отдельную табличку алиасы чем писать их через запятую)
Можно
Отличное видео, хочется подробнее узнать про работу с переменными окружения
Спасибо! Расскажем
С наступающим. Хорошее и полезное видео. Про парсинг было бы ещё что то для начинающих
Спасибооо!
Только нашёл твой канал, и он хороший, хороший монтаж, отличный звук, а Голос это не голос это птичка поёт, лайк подписка
Спасибооо:)!
Лаек, коммент, подписка
Спасибооо🙏!
Отлично
Спасибо!
Алексей Добрый день! Классный проект и подача подробная! Буду его пытаться сделать рабочим для множества юзеров, его логика оооочень похожа с моим задуманным ботом! Получается что почти всё уже готово осталось добавить многопользовательские возможности
Отлично, рад что полезно! Успехов с добавлением многопользовательского режима - БД я бы уже сменил на постгрес и возможно поставил какой-то ORM или просто несамописную обёртку над БД:)
@@t0digital Благодарю за направление!
Спасибо, очень полезный ролик.
А будет видео по докеру?
Думаю, что да, будут
Спасибо, отличное видео. Расскажите куда можно выложить готовое приложение; можно ли использовать телеграмм бота внутри локальной сети?
С телеграмом можно работать через long polling (бот опрашивает телеграм на наличие новых сообщений с какой-то периодичностью) и через веб-хуки (телеграм шлёт новые сообщения на указанный ему url). Для второго способа нужен свой сервер, настроенный на нем HTTPs, мы для этого простого бота используем первый вариант с long polling. То есть этот бот можно запустить откуда угодно, лишь бы был доступ к интернету. Я запускал его даже на телефоне в termux, работает.
С новым годом! Отличный подарок на новый год)
Осталось парочку вопросов:
1) я так понял по коду вы не сторонник sqlalchemy (orm). Если да, то как вы в django подменяете orm модели?
2) в свое время работал с плохо оптимизированными бд под mysql, и понял что конструкции с join кушают много времени, лучше заменять их на нечитабельные where... Замечали ли вы такие баги в sqlite и postgress
3) а на докере не правильно ли было создавать и активировать свое окружение? Как в проекте?
1) Просто не хотелось ставить ORM на 3 таблицы. В Django для простых вещей использую джанговый ORM, да. Но надо понимать, какие физически в базу уходят запросы от вашего ORM - иногда там такой трэш, что мама не горюй) ORM хорош только для простых запросов, которых, впрочем, большинство, а сложные пишутся на сыром SQL.
2) Это вопрос к нормализации и денормализации базы. JOIN двух таблиц всегда работает медленнее, чем SELECT из одной таблицы, но появляются накладные расходы на поддержание целостности и актуальности данных, появляется дублирование данных. Всегда лучше начинать с нормализованной базы с JOIN'ами, не надо преждевременно оптимизировать, пока у вас нет миллионов записей и слишком долгих запросов.
3) докер контейнер это и есть своего рода виртуальное окружение, в нём ведь только одно приложение будет крутиться, наше
Похоже, что автор канала решил сделать царский подарок своим подписчикам к Новому году. Ну что ж, спасибо.
Именно так:) С Наступающим!
@@t0digital Спасибо, уважаемый.
С наступающим Новым годом! Счастья, крепкого здоровья, любви и удачи в делах!
Спасибо за прекрасное видео 😊 Что посоветуешь новичку, который мало знаком с питоном, но нормально освоил aiogram? Что по питону стоит пройти/прочитать, чтоб больше соображать по функциям 😃
книжки почитать нужно - любые по питону, которые понравятся, их сейчас масса
Лучше работать над увеличением доходов, чем сокращением своего потребления когда зарплата маленькая. За видео спасибо!
Да, конечно. Просто при росте дохода всегда на столько же растут расходы и эффект большего дохода быстро сходит на нет, на большие покупки все равно надо копить:)
Котанизируй! Спасибо!
🤟
Спасибо! Будет, что поковырять на выходных.
Да:)
Прикольная чашка. :) У меня точно такая. Я покупал в Южной Африке, а ты где?
В Hoff в Москве:)
Спасибо за видео! Подскажите, почему вы пишите fetchall() вместо fetch_all() ?
Это устоявшееся название, в частности оно описано в PEP 249, которое формализует API библиотек для работы к БД www.python.org/dev/peps/pep-0249/
Так в целом лучше назвать с разбивкой на слова, конечно
Всех с праздником! 2020! Отличный год для подвигов и свершений!
Спасибо! С Новым 2020м годом!
0:19 2020 год... Отличный повод что бы начать прививать)
привет, ролик супер! не знаком особо с библой для телеги, туда можно вкрутить свои кнопки для бота? чтобы категории допустим висели и не надо было их набирать
Да, можно это сделать и в aiogram
Побольше таких видосов о программировании на Python! Например: программа измерения скорости интернета, чат, чат с шифрованием, программа - даунлоадер
Спасибо! Будем делать
33:34 ну надеюсь хотя б 21 нормальный будет) А вообще надо будет посмотреть, чё там люди сделали, может тоже пулреквестик кину
Алексей, спасибо огромное за видео! Как всегда очень круто, понятно и четко) один вопрос... я сейчас посещаю курсы по Python и мне практически все преподы говорят, что если есть возможность отказаться от использования регулярок, лучше так и делать. Как ты считаешь, насколько это мнение правдиво в Python сообществе и в чем проблема с регулярками?
Регулярки часто это единственный способ решить задачу. Ещё чаще это способ решить задачу в 2 строки кода, а без них будет гораздо больше кода с кучей циклов, проверок и тд. В регулярках не вижу ничего плохого, их многие не любят, потому что не знают - ну и они сложно читаются, надо уметь с ними работать, чтобы прочесть регулярное выражение. Для простых обработок текста они могут быть медленнее, чем просто поиск и замена по строке. Не знаю, что ещё можно отнести к их минусам.
Существует такая присказка: «У программиста была проблема и он решил применить регулярные выражения..... теперь у программиста две проблемы». Разберись и пойми работу регулярных выражений и тогда для тебя они станут не вопросом, а инструментом.
@@user-bq3ll8ph5j но останутся вопросом для других членов команды))
@@user-pt6gy1uk7x пусть догоняют :) Не занижай планку из-за тех, кто не хочет\может учиться.
@@user-bq3ll8ph5j да не, будет не так - какой-нибудь коллега решит что и так все знает и на глаз там че нить поменяет. На этот конкретно этот случай не будет конечно же юнит тестов. И в самый ответственный момент оно навернется)
У кого проблемы с кодировкой при чтении категорий.
нужно удалить файл ./db/finance.db
и в файле db.py при инициализации ДБ нужно добавить параметр - encoding='utf-8'
def _init_db():
"""Инициализирует БД"""
with open("createdb.sql", "r", encoding='utf-8') as f:
......
Спасибо!
Скажите, есть ли у Вас видео, раскрывающее хорошую практику работы с машиной состояний (МС)? Например, когда бот должен провести > 1 анкетирования пользователя. Как понимаю, для каждого такого анкетирования МС должна быть размещена отдельно? Спасибо.
такого видео у меня нет
Привет, спасибо за видео. Только один вопрос в чём преимущества использования Docker? Ведь я могу всё просто запустить в терминале, ведь так ?
Привет, спасибо. Да, конечно, можно просто запустить в терминале. Плюс докера - быстрая переносимость контейнера с приложенькой без настройки сервера. В данной задаче не ахти какой плюс, но иногда бывает вполне себе удобно, когда надо переносить приложение, ускорить его разворачивание и подобные задачи.
Спасибо за ролик! Какой шрифт используется при написании кода, если не секрет?
Monaco
С наступающим!! Алексей, а подскажи куда прятать бизнес логику в джанге? Обычно всё во views.py кидаю
Спасибо, с наступающим! На самом деле это большая проблема джанги, что она в официальной документации не даёт рекомендаций по тому, куда писать основную логику, или даёт корявую рекомендацию писать её в models.py. Я просто создаю в модуле с Django application внутри пакет services и в нём пишу основную логику. То есть
| manage.py
| conf
| some_app
| __init__.py
| apps.py
| models.py
| services
| service1.py
| service2.py
| views.py
И из views.py уже вызываю логику, которая лежит в services. Такую логику можно вызывать и из соседних Django приложений в проекте.
@@t0digital Спасибо за развернутый ответ)
Спасибо за материал !! А случайно нет апи с Тинькофф? Чтоб не заводить расходы ручками
Не изучал - но вероятно есть, да
Что за книга у тебя лежит на столе? Она одна и та же всегда или в разных выпусках разная? Видос как обычно великолепен!
Спасибооо! Книжка по-разному, это - Python к вершинам мастерства
Спасибо за видео. По какой причине не была использована ORM и было потрачено время на написание своей обертки? Почему файл базы не прокинули из докера?
В актуальной версии на гитхабе базу из докера вынесли. ORM посчитал лишним для 3х таблиц, обёртки крайне простые.
А можно ли поставить подобные "заглушки" (auth) для определённых команд?
То есть, допустим есть команды /reset и /stats, и я хочу, чтобы на эти команды бот реагировал только в том случае, если её отправит владелец. А остальные команды будут доступны всем пользователям.
мб для aiogram имеет смысл и с бд что-то асинхронное придумать? aiosqlite например
Подскажите пожалуйста , есть написанный скрипт, он каждый час парсит цены с одного магазина. и записывает в переменную в виде словаря, как сделать так что бы, если пользователь в телеграмме при выборе команды /мониторить ,скрипт каждый час проверял переменную и если по заданным настройкам есть данные то , пользователю присылать эти данные с словаря. У каждого пользователя свои настройки по товарам. Спасибо
Отлично, а что скажешь на счёт тестов, нужны ли в подобном проекте?
Тесты нужны всегда и везде, по-хорошему стоит их написать и здесь:)
по-моему единственный автор на ютубе, который делает годный контент по коду, спасибо большое
Спасибо!
@@t0digital пожалуйста, просто о главном, без всей этой "заумной" мишуры, ака полиморфизм))
@@t0digital было бы интересно узнать от тебя, имеет ли смысл изучать алгоритмы в целом на python
Лайк за видео. Почему отдали предпочтение кастомым запросам в БД, а не с, например, SQLAlchemy?
Без большого смысла. Показалось, что несколько запросов проще послать руками, чем прикручивать еще 1 зависимость
В связи с работой с БД возник вопрос: насколько оправданно использование ORM (например, peewee)? Так сказать, плюсы-минусы-подводные камни.
Спасибо большое за полезный материал. А можно ещё в будущих видео осветить правильный способ создания диалога с ботом?
правильный это какой?
@@t0digital с читаемой структурой кода. А то я сам попробовал и вроде работает, но не нравится как реализовано. Одна функция начинает ожидание ответа, другая принимает ответ. Мне кажется что как-то можно по другому.
Все отлично. Немного смущает:
row_id = int(message.text[4:])
В блок try просится (это пользовательский ввод и /delAll свалит бота)
В контроллере categories_list генерируется answer_message по какой-то причине (например сам класс Categories мог бы этим заняться)?
Тестов надо написать на всё, конечно. Да, вы правы, надо обернуть в try-except, конечно. По 2 вопросу - да, можно перенести формирование в Categories. Хотя по-хорошему я бы возвращал из бизнес-логики не строки, а структуры типа dict или namedtuple, а сообщеньку всё же собирал в контроллере, это всё-таки уже его логика, контроллера. Если захотим в одном контроллере вывести один текст, а в другом другой, будет хорошо, если сам текст сообщения будет формироваться в контроллерах.
Можно по-подробнее о прокси для бота. Сами писали прокси сервер или брали из бесплатных анонимных?
У меня платный прокси от virty.io
На 29:47 когда дополнительно запрашиваются "базовые расходы" отдельным запросом, нет проверки на наличие таких расходов в базе, как это сделано на предыдущем этапе.
Если "базовых расходов" не будет то то будет ошибка при получении данных, стоит добавить еще проверку.
UP: сорян я ошибся не дочитал код, там в ином случае присваивается 0 если таких расходов нет.
Пересмотрел видос спустя год. Когда прокачал docker, python и т.д. Так кайфанул при просмотре видоса :)
Спасибо больше.
Можете пожалуйста сделать видос про docker, docker-compose в духе видоса по postgresql.
Спасибо за видео. А можете подробней рассказать об организации кода на реальных проектах? Меня заинтересовало это разделение контроллеров и бизнес-логики, хорошо бы посмотреть на реальный пример с использованием ORM (как будет организована транзакция и сохранение/отмена данных в бд), может посоветуете какие-нибудь книги либо проекты на github? Буду благодарен.
Слоев абстракций может быть куда больше чем MVC. Рекомендую книга Роберта Мартина "Чистая архитектура"
@@double_wrench ok, принял, почитаю. спасибо.
ох это начало нового десятилетия, если бы ты знал
Необходимо сделать почти тоже самое но с 2..3 кнопками в каждом сообщении после нажатия на которых расскрывались доп инфа и шла запись в google Docs кто именно нажал .. Где бы посмотреть похожий пример?
Привет, большое спасибо за видео.
Понравилась твоя тема в виме и его сочитание с тмуксом. Можешь залить дотфайлы?
Привет! ua-cam.com/video/xmYil6Y9X68/v-deo.html, там есть ссылка на vimrc. По tmux ua-cam.com/video/LkFtvMzMwjw/v-deo.html
@@t0digital Спасибо огромное!
Не понятно, на полинге или на вебхуках сделано? На каком сервере запущено? Сколько это стоит?