Реализация бота для автоматизации сбора заявок из писем на почте Gmail и упаковки их в единую базу Excel. Элементом управления автоматизацией является чат-бот в Telegram
Пару слов о проекте
Основной задачей данного проекта была реализация бота-демона, который может собирать данные из писем на почте за указанный период, упаковывать их в единый Excel-файл и присылать в качестве результата
Использованные технологии
Список технологий, языков программирования, библиотек и модулей, использованных при разработке данного проекта
Язык программирования
Python 3.10
Библиотеки Telethon & Asyncio
Библиотека для Python 3.X, реализующая полный доступ к API Telegram. Необходима для создания интерфейса управления скриптом — Telegram чат-бот
Python GMail API
Библиотека от Google для языка Python дающая полный доступ к методам API почты. С помощью нее были реализованы функции поиска, фильтрации и сбора данных о заявках из писем
Модуль OS
Модуль для работы с операционной системой в Python. С помощью него был реализован доступ к файловой системе: создания, переименовывания и удаления файлов и папок
Модули base64 и datetime
Модуль base64 использовался для декодирования контента сообщений, которые представляли собой кодировку base64_url_safe
Модуль datetime необходим для проверки введенных промежутков времени и атрибута даты в письмах
Модули csv и pandas
С помощью модуля csv был реализован парсинг файлов внутри сообщений, сбора всех названий столбцов в множество и сбора данных в единую таблицу
Pandas использовался для быстрой конвертации .csv файла в .xlsx
Danila Smolyakov
Programmer
Изначально, письма приходили на почту с доменом Yandex. Однако, после тщательного изучения материала было решено настроить переадресацию на GMail и синхронизировать уже имеющиеся письма, потому что доступ к письмам на почте Yandex получить достаточно сложно, а такой подход не желателен для срочной задачи
Процесс разработки
Описание схемы превращения проекта из идеи, в реализованную программу
1
Моделирование блок-схемы
Перед началом разработки было спроектировано несколько блок-схем работы конечного продукта в качестве плана: схема интерфейса, схемы сбора, сортировки и экспорта данных из сообщений
2
Планирование разработки
Исходя из разработанных схем был распланирован рабочий процесс в таком порядке:сбор писем по датам → упаковка в один файл → интерфейс бота → реализация многопоточности → тестирование
3
Реализация в коде
Кроме GMail API, единственной новой вещью для меня стала работа с CSV файлами, однако это оказалось проще, чем я думал
Библиотека для работы с почтой оказалась достаточно понятной в купе с отличной документацией от Google, так что это не отразилось на скорости разработки
4
Тестирование
Единственный момент, который сильно влиял на скорость обработки сообщений — неправильная реализация сохранений файлов, которая была исправлена при оптимизации кода
Бэклог проекта
Ошибки, мысли, выводы, ответы на вопросы по ходу решения задачи
Моделирование
Почему именно Telegram бот в качестве интерфейса?
Библиотека Telethon, как и aiogram, предоставляют асинхронный интерфейс ответа на сообщения, что позволяет пользоваться ботом нескольким людям одновременно. Так же, сообщения с inline-клавиатурой имеют одинаковый ID при их изменении и использовании, что способствует отсутствию дополнительного контроля ввода.
Так как сообщения независимы, можно одновременно настраивать и запускать несколько потоков для сбора данных не опасаясь проблем с вводом данных не для того потока
Помимо этого, Telegram-бот — это просто. Пару кликов в приложении на телефоне — готовый .xlsx файл через несколько минут
Реализация
С какими проблемами пришлось столкнуться?
Хотя документация GMail API и библиотека для Python сейчас мне кажутся вполне понятными, первое время приходилось подолгу сидеть и разбираться, потому что методы доступа к API реализованы нестандартным способом
Реализация
Что с производительностью?
Изначально, была допущена ошибка по сохранению вложенных файлов в сообщение, из-за чего время сбора одного сообщения могло достигать больше 1-й минуты. В последствии, данная ошибка была устранена
Реализация
Немного о многопоточности
Для возможности сбора нескольких баз данных одновременно было решено создавать под каждую такую задачу свой поток. Все потоки записываются в общий "пул" для того, чтобы при вводе команды /info можно было увидеть работающие в данный момент
Это позволило как запускать несколько процессов сбора одновременно, так и отслеживать их состояния
Реализация
Какие команды есть у бота?
/start — Присылает сообщение со встроенной клавиатурой для настройки и старта сбора писем
/info — Показывает информацию по текущим запущенным процессам сбора данных. Если таковых нет, то присылает соответствующее сообщение
/users — Показывает список пользователей, у которых есть доступ для пользования ботом
/adduser @username — Добавляет пользователя в "whitelist", чтобы он смог использовать функционал бота
/deleteuser @username — Удаляет пользователя из "whitelist"