Привет! Хочу поделиться своим проектом, который решил возродить пару недель назад — мессенджер на 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-канал, где рассказываю и про другие проекты: