Свой мессенджер на python: аккаунты, сообщения, файлы
Привет! Хочу поделиться своим проектом, который решил возродить пару недель назад — мессенджер на Python. Не сомневаюсь, что такие штуки уже есть на просторах интернета и могут быть лучше того, что делаю я, но меня это не интересует. Мне нравится делать что-то самому, разбираться и по возможности «не зависеть» от чего-то.
Что это вообще такое
Это чат с клиентской и серверной частью, который работает через сокеты. На данный момент всё происходит в консоли, но в планах GUI на PyQt5. Сервер поднимается локально, клиенты подключаются к нему и начинают взаимодействовать с помощью различных команд. Клиент должен иметь аккаунт на сервере для ряда функций, поэтому первым делом он регистрируется либо входит в аккаунт. Показываю команды пользователя ниже.
Команды пользователя
🔐 Авторизация и регистрация
/reg <юзернейм> <пароль> <пароль> — зарегистрироваться на сервере
/auth <юзернейм> <пароль> — аутентифицироваться на сервере
👤 Профиль и общение
/set_nick <никнейм> — установить отображаемый никнейм
/msg <никнейм> <сообщение> — отправить личное сообщение
/offline_sms — получить сообщения, пришедшие в ваше отсутствие
/get_users — посмотреть список пользователей
📂 Файлы
/all_files [количество] — показать последние файлы (все, если число не указано)
/send_file <никнейм> <имя_файла> [текст] — отправить файл из папки data/files
/load_file <имя_файла> — скачать файл, присланный вам
🛠️ Системные
/help — показать эту справку
/exit — выход из программы
Сервер
На сервере я сделал CLI-команды для админа:
/users_dict — посмотреть словарь с пользователями
/close_server — безопасное закрытие сервера
/help — эта справка
Что было сложного
Если честно, всё было в меру сложно. Конечно, чем больше папок и файлов, тем больше нужно помнить в голове и сложнее организовывать что-либо. Но всё же трудненько было сделать систему для обмена файлами, потому что пришлось параллельно думать об очереди сообщений, и в моменте я вообще ничё не понимал. Я ожидал, что придётся дебажить, но на удивление пришлось этим заниматься не очень-то и долго — всего день.
Про технологии и логику
Хочу также затронуть некоторые технологии, которые я применял. Одна из них — хэширование (hashlib + secrets). Я применял его для регистрации и аутентификации пользователей, чтобы по сети не гуляли пароли. Однако всё равно можно перехватить запрос на авторизацию:
request = self.encode({
'type': 'auth',
'username': parts[0],
'hash': hash_b64
})
И по сути войти в чужой аккаунт, скопировав этот запрос и отправив на сервер от себя. Типа да, пароль никто не узнает, но хэш-то стырить можно. В общем, не всё идеально.
Ещё я использую потоки (threading) для параллельных задач. Например, приём и отправка запросов идут в разных потоках на клиенте. А на сервере вообще под каждого клиента свой поток запускается.
Также недавно узнал про классную штуку в Python — декораторы. Очень хорошо очищают код и местами упрощают логику. Ещё датаклассы — аналогично упрощают жизнь, особенно при перекрёстных передачах параметров в экземпляры классов, коих у меня немало.
Планы на будущее
Как уже говорил, буду делать GUI, ещё хочу уведомления о сообщениях, локальную историю переписок и шифрование. Шифрование буду делать симметричное — самый незапарный вариант, для чата с друзьями за глаза.
Кстати, я не просто так это всё делаю: хочу в будущем купить Raspberry Pi и поднять свой сервер для этого мессенджера. Ну и по мелочи: группы (может и не добавлю, так как на 10 человек незачем), мобильная версия, если прям будет желание, ну и оптимизация, безопасность и так далее.
GitHub и Telegram
Кто хочет посмотреть — велкам, можно даже пулл-реквесты делать)
И мой Telegram-канал, где рассказываю и про другие проекты:


Комментарии