Пишем Telegram бот для учёта расходов с Python, Asyncio/Aiogram, SQLite и Docker
Vložit
- čas přidán 9. 07. 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. :mehh:
Хахахах :)
ага, да и телеграмм уже работает :)
Уже середина 22-го а пиз**ц даже и не собирается уходить...
В конце 2022 понимаем, что 2020 оказывается был хорошим годом.
Привет из 2023!!! С рождеством христовым!!!
Спасибо за тему - очень интересно развивать тему с такими практическими решениями для жизни. Если у тебя будет возможность пожалуйста продолжай такого рода решения практических задач!
Ай ждал! Прям НГ подарок! С наступающим
Йее:) Спасибо! С Наступающим 2020м!
Спасибо, материал и его подача как всегда на высоте.
С наступающим!
Спасибооо! С Наступающим!
Отличное видео, Спасибо! С наступающим!
Спасибооо! С Наступающим!
Спасибо, с Новым годом! Удачи!
Спасибооо, счастливого 2020го!
Спасибо за все эти полезные замечания по поводу организации кода, особенно про разделении архитектуры на "клей" и бизнес-логику (можно еще добавить сюда низкоуровневый код, если он есть). Вроде и так все понятно про это разделение, но с наглядным примером намного лучше усваивается
Согласен. Спасибо!
Как интересно рассказываете! Про функции которые начинаются с нижнего подчеркивания не знала раньше, спасибо. Рассказывайте чаще)
Йее, спасибо! 🙏
С наступающим вас! Спасибо за видос под новый год!
Спасибооо, с наступающим!
Спасибо за видео и отдельно за исходники на гитхабе. Очень полезно для тех, кто уже знает основы Python и хочет сделать какой-то реальный проект.
Пожелания:
1. В видео вы говорите про ТЗ. Если вы делали ТЗ к этому проекту, можно на него взглянуть? Очень хотелось бы посмотреть на примере, как оно должно выглядить, хотя бы для личного проекта.
2. Мне лично не хватило (и, как я понял из коментов, многим остальным тоже) объяснений как задеплоить это приложение на сервер, на тот же Heroku. Как запустить на локальной машине понятно, но если действительно пользоваться этим ботом, то нужен запуск на сервере.
Спасибо и с наступающим!
С Наступающим!
Идеальный подарок на Новый Год.
Спасибо :) С Наступающим!
Смотрю видео после нового года, тоже нормально)
Нереально суперское видео! С удовольствием посмотрел бы хоть 5 часов лайв разработки, интересно понять ход мыслей опытного разработчика :)
Спасибо! Сделаем возможно:)
Спасибо за видео! Хотелось бы больше видео касающегося именно проектирования и архитектуры приложений
Буду делать материалы на эту тему обязательно
Спасибо большое, очень полезный материал
С наступающим!!!! Очень нравится канал) продолжайте в том же духе!! )))
Спасибо! Будем продолжать!
Дождался урааа!! Спасибо!!
Судя по просмотрам и комментариям тема ботов все еще популярна, но почему-то никто не снимает по ней ничего..
Боты популярны и, думаю, будут набирать ещё с ростом популярности нейросетей и лёрнига:)
Благодаря такому качественному и познавательному контенту я научился нажимать кнопку "подписаться" и лайкать видео. Это просто шок, какой ты крутой! С наступившим тебя, спасибо за видео =)
Йеее, спасибооо! Приятно:) C Наступившим!
Спасибо за видео!
Спасибо! Вынес для себя полезную информацию
Отлично!
Тоже посмотрел от начала до конца, весьма познавательно для начинающего!
Классное видео, так актуально, в голове картника сложилась по проекту и большой респект о лучших практиках программирования! 💯👍
Да неужели 👍 очень ждал
Свершилось:)
🔥🔥🔥
с наступающим, котан 🐈😎
С Новым годом! Юхуу!
Спасибо за видео
Привет
В одном из видео ты говорил, что сделаешь видео про фриланс(как брать заказ и тд) Очень нужная информация, заранее спасибо
Привет, делал опрос среди подписчиков - эта тема и вообще тема работы над проектами, управления проектами и подобные набрали мало желающих
Благодарю за отличный пример бота, лайк и подписка)
Спасибо!
В названии опечатка а так видео отличное! С наступающим новым годом!
О, спасибо, поправил:)
замечание - я думаю не стоит объяснять зачем нужно это приложение. Очень много зря времени на это ушло
@@manul7978 без тз результат хз!!!
с наступающим!)
Отличный канал. Спасибо!
Спасибооо🙏!
Спасибо! Очень классный учебный контент и пояснения.
Вот очень интересно конкретно про боты телеграмма на питоне - давайте еще про боты
С Новым годом! Успехов вам в новом году!
Очень нравится ваша подача материала. Пожалуйста, расскажите про докер. Чем отличается от виртуальной машины, как настроить окружение и как переносить контейнеры.
С Новым 2020! Спасибооо!
Расскажу про докер обязательно
Спасибо круто!
Спасибо за ролик.
Хотелось бы посмотреть на процесс написания в лайве, пусть даже это будет и несколько часов видео.
Возможно как-нибудь сделаем такой лайв. Но это действительно будет очень долго - где-то с исследованиями как что работает, где-то с исправлениями ошибок, где-то с рефекторингом
@@t0digital Хз, лично мне будет очень интересно). Как мне кажется, то многим кто активно учит Питон, тоже. Потомушо в большинстве русскоязычных видео с лайв-написанием чего-либо, авторы занимают позицию типа "Ну, вы повторяйте за мной и всё будет ок", без особых объяснений зачем в данный момент используется именно эта конструкция, что является хорошей/плохой практикой и почему и т.д. Ну и + чаще всего они пишут эхо-бота в тлг/калькулятор/что-то еще, что может поместится в короткий хронометраж.
Іван Галицький аналогично, хотелось бы посмотреть именно вариант написания в реальном режиме с объяснениями, рефакторингом, исправлениями. Интересна практика написания опытных девелоперов/администраторов. Такие примеры экономят просто огромное количество времени на наработку своего опыта.
Значит попробуем делать видео с живым кодингом. Спасибо!
@@t0digital Вам спасибо огромное, что не отказываете!
блин, если честно, зашел посмотреть именно на то как пишется проект, а тут просто его обзор. это конечно тоже хорошо, да, но интересным мне не кажется.
рад, что сейчас вы вроде начали делать серию видеороликов о написании проекта с нуля, очень жду последующие части!
досмотрит до конца! Несколько часов не беда. хотелось бы с вами это пройти и паралельно написать тоже самое, так как я новичек
Годно! Не понимаю, за что тебя хейтят)Все понятно говоришь)
Очень интересный видео ролик, понравилась подача и стиль написания кода. Было бы интересно в будущем посмотреть как с нуля пишете проект и сразу комментируете его.
Спасибо! Такое видео в живом кодинге это часов на 5. Может как-нибудь сделаю:)
Спасибо!
С наступающим, всего и побольше))
Всё пррсто и лаконично. Единственное, я бы файлик с БД вытащил из контейнера и просто маунтил при старте. А то докер пересобрал и всё пропало)
Да,, упустил этот момент, добавлю в репо:) С Наступающим!
Хорошее новогоднее поздравление =)
Спасибо!
Очень интересный канал, странно что так мало подписчиков
Спасибооо! Растём понемногу:)
Удивительно, только придумал написать себе такого бота, даже проверил в каталогах, нет такого. Или я плохо искал. И на следующий день мне CZcams предлагает вот такое.)))
Очень полезное видео, тем кто видит всё это (python, docker, sqlite) впервые видео будет очень сложным. Ну а тем, кто не пугается, и чувствует, что может разобраться, то это равносильно походу на неплохой курс по созданию телеграмм бота. Рекомендую с этим кодом плотно поработать и много полезного положите себе в голову.
С первых секунд лайк. Расскажи о своих книгах по программированию.
Расскажу в отдельном видео, спасибо!
спасибо, хороший видос. добрая критика: учить английский! :-)
Есть такой план на 2020:) Спасибо!
Я с вами мужики)
очень интересная подача, видео смотрятся на одном дыхании, но некорректные произношения и ударения прям убивают(
Про ТЗ хорошее замечание, не задумывался раньше(
Лайк не глядя)
Спасибо!
Спасибо! Чем больше смотрю, тем меньше говнокода и более читабельный код!
Подскажите пожалуйста , есть написанный скрипт, он каждый час парсит цены с одного магазина. и записывает в переменную в виде словаря, как сделать так что бы, если пользователь в телеграмме при выборе команды /мониторить ,скрипт каждый час проверял переменную и если по заданным настройкам есть данные то , пользователю присылать эти данные с словаря. У каждого пользователя свои настройки по товарам. Спасибо
У кого проблемы с кодировкой при чтении категорий.
нужно удалить файл ./db/finance.db
и в файле db.py при инициализации ДБ нужно добавить параметр - encoding='utf-8'
def _init_db():
"""Инициализирует БД"""
with open("createdb.sql", "r", encoding='utf-8') as f:
......
Спасибо!
Отлично
Спасибо!
Только нашёл твой канал, и он хороший, хороший монтаж, отличный звук, а Голос это не голос это птичка поёт, лайк подписка
Спасибооо:)!
С наступающим. Хорошее и полезное видео. Про парсинг было бы ещё что то для начинающих
Спасибооо!
Похоже, что автор канала решил сделать царский подарок своим подписчикам к Новому году. Ну что ж, спасибо.
Именно так:) С Наступающим!
@@t0digital Спасибо, уважаемый.
С наступающим Новым годом! Счастья, крепкого здоровья, любви и удачи в делах!
Неделю назад пришла в голову идея сделать такого бота, а сегодня у тебя выходит видео об этом.Что это если не подарок на НГ?)
О, отлично:)!
Лаек, коммент, подписка
Спасибооо🙏!
Отличное видео, хочется подробнее узнать про работу с переменными окружения
Спасибо! Расскажем
А можно ли поставить подобные "заглушки" (auth) для определённых команд?
То есть, допустим есть команды /reset и /stats, и я хочу, чтобы на эти команды бот реагировал только в том случае, если её отправит владелец. А остальные команды будут доступны всем пользователям.
Побольше таких видосов о программировании на Python! Например: программа измерения скорости интернета, чат, чат с шифрованием, программа - даунлоадер
Спасибо! Будем делать
С новым годом) лучше наверное выносить в отдельную табличку алиасы чем писать их через запятую)
Можно
Лучше работать над увеличением доходов, чем сокращением своего потребления когда зарплата маленькая. За видео спасибо!
Да, конечно. Просто при росте дохода всегда на столько же растут расходы и эффект большего дохода быстро сходит на нет, на большие покупки все равно надо копить:)
0:19 2020 год... Отличный повод что бы начать прививать)
Всех с праздником! 2020! Отличный год для подвигов и свершений!
Спасибо! С Новым 2020м годом!
Алексей Добрый день! Классный проект и подача подробная! Буду его пытаться сделать рабочим для множества юзеров, его логика оооочень похожа с моим задуманным ботом! Получается что почти всё уже готово осталось добавить многопользовательские возможности
Отлично, рад что полезно! Успехов с добавлением многопользовательского режима - БД я бы уже сменил на постгрес и возможно поставил какой-то ORM или просто несамописную обёртку над БД:)
@@t0digital Благодарю за направление!
Спасибо за видео! Подскажите, почему вы пишите fetchall() вместо fetch_all() ?
Это устоявшееся название, в частности оно описано в PEP 249, которое формализует API библиотек для работы к БД www.python.org/dev/peps/pep-0249/
Так в целом лучше назвать с разбивкой на слова, конечно
33:34 ну надеюсь хотя б 21 нормальный будет) А вообще надо будет посмотреть, чё там люди сделали, может тоже пулреквестик кину
мб для aiogram имеет смысл и с бд что-то асинхронное придумать? aiosqlite например
Котанизируй! Спасибо!
🤟
привет, ролик супер! не знаком особо с библой для телеги, туда можно вкрутить свои кнопки для бота? чтобы категории допустим висели и не надо было их набирать
Да, можно это сделать и в aiogram
Спасибо, отличное видео. Расскажите куда можно выложить готовое приложение; можно ли использовать телеграмм бота внутри локальной сети?
С телеграмом можно работать через long polling (бот опрашивает телеграм на наличие новых сообщений с какой-то периодичностью) и через веб-хуки (телеграм шлёт новые сообщения на указанный ему url). Для второго способа нужен свой сервер, настроенный на нем HTTPs, мы для этого простого бота используем первый вариант с long polling. То есть этот бот можно запустить откуда угодно, лишь бы был доступ к интернету. Я запускал его даже на телефоне в termux, работает.
Необходимо сделать почти тоже самое но с 2..3 кнопками в каждом сообщении после нажатия на которых расскрывались доп инфа и шла запись в google Docs кто именно нажал .. Где бы посмотреть похожий пример?
С новым годом! Отличный подарок на новый год)
Осталось парочку вопросов:
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) докер контейнер это и есть своего рода виртуальное окружение, в нём ведь только одно приложение будет крутиться, наше
Алексей, спасибо огромное за видео! Как всегда очень круто, понятно и четко) один вопрос... я сейчас посещаю курсы по Python и мне практически все преподы говорят, что если есть возможность отказаться от использования регулярок, лучше так и делать. Как ты считаешь, насколько это мнение правдиво в Python сообществе и в чем проблема с регулярками?
Регулярки часто это единственный способ решить задачу. Ещё чаще это способ решить задачу в 2 строки кода, а без них будет гораздо больше кода с кучей циклов, проверок и тд. В регулярках не вижу ничего плохого, их многие не любят, потому что не знают - ну и они сложно читаются, надо уметь с ними работать, чтобы прочесть регулярное выражение. Для простых обработок текста они могут быть медленнее, чем просто поиск и замена по строке. Не знаю, что ещё можно отнести к их минусам.
Существует такая присказка: «У программиста была проблема и он решил применить регулярные выражения..... теперь у программиста две проблемы». Разберись и пойми работу регулярных выражений и тогда для тебя они станут не вопросом, а инструментом.
@@user-bq3ll8ph5j но останутся вопросом для других членов команды))
@@user-pt6gy1uk7x пусть догоняют :) Не занижай планку из-за тех, кто не хочет\может учиться.
@@user-bq3ll8ph5j да не, будет не так - какой-нибудь коллега решит что и так все знает и на глаз там че нить поменяет. На этот конкретно этот случай не будет конечно же юнит тестов. И в самый ответственный момент оно навернется)
Спасибо за ролик! Какой шрифт используется при написании кода, если не секрет?
Monaco
Скажите, есть ли у Вас видео, раскрывающее хорошую практику работы с машиной состояний (МС)? Например, когда бот должен провести > 1 анкетирования пользователя. Как понимаю, для каждого такого анкетирования МС должна быть размещена отдельно? Спасибо.
такого видео у меня нет
Спасибо! Будет, что поковырять на выходных.
Да:)
С наступающим!! Алексей, а подскажи куда прятать бизнес логику в джанге? Обычно всё во 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 Спасибо за развернутый ответ)
Спасибо за прекрасное видео 😊 Что посоветуешь новичку, который мало знаком с питоном, но нормально освоил aiogram? Что по питону стоит пройти/прочитать, чтоб больше соображать по функциям 😃
книжки почитать нужно - любые по питону, которые понравятся, их сейчас масса
Задеплоил вашего бота на сервер, теперь изучаю структуру. Спасибо за топ-контент и комменты в коде!
PS. Может кому поможет: при запуске на удаленном сервере была ошибка: no such column: true и пришлось переписать под старую скьюэльку с 1 и 0 вместо true и false, новую поставить не удалось....
Спасибо, очень полезный ролик.
А будет видео по докеру?
Думаю, что да, будут
Привет, спасибо за видео. Только один вопрос в чём преимущества использования Docker? Ведь я могу всё просто запустить в терминале, ведь так ?
Привет, спасибо. Да, конечно, можно просто запустить в терминале. Плюс докера - быстрая переносимость контейнера с приложенькой без настройки сервера. В данной задаче не ахти какой плюс, но иногда бывает вполне себе удобно, когда надо переносить приложение, ускорить его разворачивание и подобные задачи.
Father на современном английском произносится как [ˈfaːðə], но Алексей использует произношение из древнеанглийского через æ, видимо лингвист или любитель древних языков. Спасибо большое за годный контент и отдельное спасибо за исходники на гитхабе.
Спасибо :) в этом году буду прокачивать разговорный английский :)
На 29:47 когда дополнительно запрашиваются "базовые расходы" отдельным запросом, нет проверки на наличие таких расходов в базе, как это сделано на предыдущем этапе.
Если "базовых расходов" не будет то то будет ошибка при получении данных, стоит добавить еще проверку.
UP: сорян я ошибся не дочитал код, там в ином случае присваивается 0 если таких расходов нет.
Спасибо за видео. По какой причине не была использована ORM и было потрачено время на написание своей обертки? Почему файл базы не прокинули из докера?
В актуальной версии на гитхабе базу из докера вынесли. ORM посчитал лишним для 3х таблиц, обёртки крайне простые.
Как его выложить в телеграм? Или если нужен отдельный хостинг - как его вылить туда и подключить к телеграму?
Все отлично. Немного смущает:
row_id = int(message.text[4:])
В блок try просится (это пользовательский ввод и /delAll свалит бота)
В контроллере categories_list генерируется answer_message по какой-то причине (например сам класс Categories мог бы этим заняться)?
Тестов надо написать на всё, конечно. Да, вы правы, надо обернуть в try-except, конечно. По 2 вопросу - да, можно перенести формирование в Categories. Хотя по-хорошему я бы возвращал из бизнес-логики не строки, а структуры типа dict или namedtuple, а сообщеньку всё же собирал в контроллере, это всё-таки уже его логика, контроллера. Если захотим в одном контроллере вывести один текст, а в другом другой, будет хорошо, если сам текст сообщения будет формироваться в контроллерах.
Спасибо за материал !! А случайно нет апи с Тинькофф? Чтоб не заводить расходы ручками
Не изучал - но вероятно есть, да
Пересмотрел видос спустя год. Когда прокачал docker, python и т.д. Так кайфанул при просмотре видоса :)
Спасибо больше.
Можете пожалуйста сделать видос про docker, docker-compose в духе видоса по postgresql.
Прикольная чашка. :) У меня точно такая. Я покупал в Южной Африке, а ты где?
В Hoff в Москве:)
В связи с работой с БД возник вопрос: насколько оправданно использование ORM (например, peewee)? Так сказать, плюсы-минусы-подводные камни.
19:15 А как работает foreign key между полем category_codename (integer) из таблицы expense и полем codename (varchar) из таблицы category?
Крайне странно, что оно работает))) это ошибка, конечно. Оба поля должны быть varchar. Не поменял в процессе рефакторинга
@@t0digital Ваше видео, кстати, появилось у меня в рекомендациях, чему я крайне рад, спасибо за контент
Не понятно, на полинге или на вебхуках сделано? На каком сервере запущено? Сколько это стоит?
ох это начало нового десятилетия, если бы ты знал
Что за книга у тебя лежит на столе? Она одна и та же всегда или в разных выпусках разная? Видос как обычно великолепен!
Спасибооо! Книжка по-разному, это - Python к вершинам мастерства
2022 год! Телеграм можно юзать без прокси) уииии!
Лайк за видео. Почему отдали предпочтение кастомым запросам в БД, а не с, например, SQLAlchemy?
Без большого смысла. Показалось, что несколько запросов проще послать руками, чем прикручивать еще 1 зависимость
Заметил, что метод fetchall(...) в db.py возвращает List [Dict [str, Any]]. Так и должно быть? Спасибо.
Код сейчас уже не помню, но в целом такой тайп хинтинг может быть - список словарей, ключами которых является строка, значениями любой тип