Мессенджер на python
Появилась мысль создать простой чат\мессенджер на Python(+- 100 участников), в следствии чего возник вопрос. Мне придется искать сервер и платить за него, или можно это сделать как-то без него? А если можно без него, то как это реализовать? Попытки найти ответ на мой вопрос в интернете были, но либо я не понял, либо ответа на него не было. Если вы имеете представление как это сделать, прошу помочь, хотя бы книгой, роликом или статьей где будет про это говориться. (я не в коем случае не прошу готовое решение, я просто решил спросить у людей, которые понимают в программировании лучше меня)
Отслеживать
задан 22 июн 2021 в 22:30
193 1 1 серебряный знак 8 8 бронзовых знаков
Всё зависит от ваших целей, технически вам никто не мешает запустить свой мессенджер хоть на обычном телефоне, лишь бы ваши 100 участников могли подключиться к этому телефону
22 июн 2021 в 22:38
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Я пару раз выкладывал концепт p2p месенжера на стековерфлоу. работать можно без сервера вообще, но нужен ещё один месенжер чтоб обменяться контактами для соединения.
Реализуется это через udp и stun. stun пробивает udp порт во внешнюю сеть, а udp позволяет посылать сообщения без установки соединения = без сервера.
Нужно только опубликовать контакт (ip, port) одного из участников и через него получить остальные. Что-то в стиле DHT. Или использовать другой месенжер (например пуши гугла, публичный сип сервер или даже смски) для обмена контактами.
Если вы новичок в сетевом программировании — то начните с месенжера с сервером. Сервер можно найти бесплатно по акции или на начальных тарифах pythonanywhere, oracle и тп. На домашнем интернете есть шанс что у вас белый адрес — можно пробросить порт.
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
This repository has been archived by the owner on Aug 17, 2023. It is now read-only.
werryxgames / Messenger Public archive
Мессенджер на Python
License
werryxgames/Messenger
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
cdac2f9 Aug 17, 2023
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
July 2, 2022 18:15
October 16, 2022 20:48
October 18, 2022 20:17
June 29, 2022 15:58
August 17, 2023 18:12
July 13, 2022 09:58
July 12, 2022 22:07
October 18, 2022 20:24
July 12, 2022 22:07
July 12, 2022 22:07
October 16, 2022 20:43
README.md
Этот репозиторий больше не поддерживается из-за неправильно выбранного языка программирования. Сложно запустить приложение с графическим интерфейсом, написанное на Python без всяких фреймворков на мобильных устройствах. Новый репозиторий: MessengerJava.
Что такое Messenger?
Messenger — бесплатный мессенджер с открытым исходным кодом для обмена мгновенными сообщениями
Messenger написан на языке програмирования Python
Работают ли определённые версии Python:
- 3.10 — Все основные тесты происходят на этой версии
- 3.9 — Версия поддерживается Messenger и тестируется в Github
- 3.8 — Версия поддерживается Messenger и тестируется в Github
- 3.7 — Версия не поддерживается, но пока что есть возможность запустить Messenger на ней
- 3.6 — Версия не поддерживается, но пока что есть возможность запустить Messenger на ней
- 2.7 — Версия не поддерживается
Остальные версии не тестировались
Скачивание из терминала
Если у вас установлен git , то выполните команду: git clone https://github.com/werryxgames/Messenger.git
В таком случае Messenger скачается в текущую директорию
Скачивание из Github
Также вы можете скачать Messenger при помощи интерфейса Github
Нажмите на кнопку Code , а затем на Download ZIP
Необходимо распаковать скачанный архив в нужную директорию
Теперь вы можете удалить скачанный архив
Теперь вы можете создать ярлыки со следующими командами на рабочий стол:
python "путь_к_файлу_server.py" python "путь_к_файлу_main.py"
Рекомендуется обновлять версию только из релизов
Прочитайте, написано ли в релизе про изменение формата хранения данных. Если да, то необходимо будет удалить все данные, затем проделайте шаги, как в Скачивание репозитория
Если написано, что формат хранения данных не изменён, или ничего не написано, проделайте шаги, как в Скачивание из Github, но распакуйте только файлы server.py и main.py
Messenger состоит из двух частей: сервера и клиента
Сервер хранит все данные и обрабатывает запросы от клиентов
Клиент показывает информацию от сервера в графическом виде
Чтобы запустить сервер, напишите
python "путь_к_файлу_server.py"
Вы должны увидеть надпись Сервер запущен , иначе создайте проблему на вкладке Issues
Перед надписью Сервер запущен может появиться дополнительная информация ( True , False (несколько раз) и список с сообщениями). Это значит, что база данных сброшена до первоначального состояния. После этого рекомендуется выключить сервер и сделать то, что написано в Отключение сброса базы данных
Отключение сброса базы данных
Чтобы отключить сброс базы данных, необходимо зайти в файл server.py (пролистать в конец) и убрать все строки между этими (оставьте сами строки, удалите все строки, на месте которых «. «):
if __name__ == "__main__": . main()
Вам понадобиться включить сервер
Чтобы зайти в Messenger в первый раз, надо создать аккаунт. Для этого введите логин и пароль в соответствующие поля. Если всё правильно, то вы должны увидеть, как появится основной интерфейс Messenger`а
Если интерфейс не появился, посмотрите в консоли, там должно была появиться ошибка на подобии следующей:
---------------------------- | ОШИБКА: Заголовок ошибки | ---------------------------- | Описание ошибки | ----------------------------
Чтобы отправить сообщения, выберите получателя в списке слева, напишите текст сообщения справа внизу и нажмите ‘Enter’, или кнопку ‘Отправить’
Внизу вашего сообщения написан его статус
- Отправлено — Сообщение отправлено, но ещё не получено сервером
- Доставлено — Сообщение доставлено на сервер, но ещё не получено получателем
- Получено — Сообщение получено получателем, но он ещё не ответил
- Прочитано — Сообщение получено получателем, который написал что-то после вашего сообщения
Код проверяется при помощи flake8 и pytest (тесты в папке tests):
flake8 . --exclude venv,__pycache__,.git,.github python -m pytest tests
Функции и классы
server.py — Модуль сервера.
def absolute(path_: str) -> str: """Возвращает абсолютный путь из относительного.""" def encrypt_password(user_id: int, password: str) -> str: """Шифрует пароль. Аргументы: user_id: ID пользователя. password: Пароль пользователя. Возвращаемое значение: Зашифрованный пароль. """ class Database: """Класс базы данных.""" def __init__(self, filepath: str) -> None: """Инициализация базы данных. Аргументы: filepath: Путь к базе данных. """ def sql( self, sql_text: str, format_=None, noresult: bool = False ): """Выполняет SQL код. Аргументы: sql_text: SQL код. format_: Заменители '?' в SQL коде. noresult: Если включено, то результатом будет булевое значение. Возвращаемое значение: bool: Если включено noresult, возвращает True, если результат выполнения SQL кода пустой, иначе False. list: Массив с результатами. tuple: Единственный результат. """ def reset_database(self) -> bool: """Сбрасывает базу данных к начальному состоянию. Возвращаемое значение: True, если удалось сбросить, иначе False. """ def create_account(self, name: str, password: str): """Создаёт аккаунт. Аргументы: name: Логин аккаунта. password: Пароль от аккаунта. Возвращаемое значение: Статус выполнения, id в случае успеха. """ def login_account(self, name: str, password: str): """Входит в аккаунт. Аргументы: name: Логин аккаунта. password: Пароль от аккаунта. Возвращаемое значение: Статус выполнения, id в случае успеха. """ def get_account_data(self, name: str) -> (tuple, list): """Получает данные аккаунта. Аргументы: name: Логин аккаунта. Возвращаемое значение: [ Отправленные и полученные сообщения, ID пользователей, чей статус сообщений был изменён. ]. """ def send_message(self, login: str, receiver: int, message: str) -> bool: """Создаёт запись в базе данных о сообщении.""" def find_user(self, username: str): """Ищет пользователя по username. Аргументы: username: Имя пользователя. Возвращаемое значение: False: Пользователь не найден. list[int, str]: ID пользователя и его имя. """ def close(self) -> None: """Закрывает базу данных.""" class NetworkedClient: """Класс клиента.""" _instances = [] def __init__(self, sock: socket, addr) -> None: pass @staticmethod def encode_message(message) -> bytes: """Превращает объекты, преобразоваемые в JSON в байты.""" @staticmethod def decode_message(message: bytes): """Превращает байты в объекты, преобразоваемые в JSON.""" def send(self, message: list) -> None: """Отправляет сообщение клиенту. Аргументы: message: Сообщение. """ def send_account_data(self) -> None: """Отправляет данные об аккаунте.""" def receive(self, jdata: bytes) -> bool: """Получает сообщение от клиента. Аргументы: jdata: Данные от клиента. Возвращаемое значаени: Надо ли обновлять таймер сообщений? """ def close(self) -> None: """Закрывает соединение с клиентом.""" def check_idle() -> None: """Отключает неактивных клиентов. Аргументы: clients: Словарь всех клиентов. """ def main() -> None: """Основная функция."""
main.py — Мессенджер на Python (клиент).
class Window: """Класс окна.""" def __init__(self, tk_window: tk.Tk) -> None: """Инициализация окна. Аргументы: tk_window: Окно Tkinter. """ def place(self, id_: str, element, *args, **kwargs) -> None: """Размещает объект element. Аргументы: id_: Уникальный идентификатор элемента. element: Элемент, который необходимо разместить. *args: Аргументы element.place(). **kwargs: Позиционные аргументы element.place(). """ def pack(self, id_: str, element, *args, **kwargs) -> None: """Размещает объект element. Аргументы: id_: Уникальный идентификатор элемента. element: Элемент, который необходимо разместить. *args: Аргументы element.pack(). **kwargs: Позиционные аргументы element.pack(). """ def clear(self) -> None: """Очищает все элементы.""" def __getattribute__(self, id_: str): """Получает элемент по его ID. Аргументы: id_: Уникальный идентификатор элемента. Возвращаемое значение: Элемент. """ class MessengerClient: """Основной класс.""" def __init__(self) -> None: """Инициализация класса.""" @staticmethod def show_error(title: str, message: str) -> None: """Показывает ошибку. Аргументы: title: Заголовок ошибки. message: Описание ошибки. """ @staticmethod def encode_message(message) -> bytes: """Превращает объекты, преобразоваемые в JSON в байты.""" @staticmethod def decode_message(message: bytes): """Превращает байты в объекты, преобразоваемые в JSON.""" def send(self, message) -> None: """Отправляет сообщение message на сервер. Аргументы: message: Сообщение. """ @staticmethod def create_round_rectangle( cnv, px1, py1, px2, py2, radius, ign1=False, ign2=False, **kwargs ) -> int: """Создаёт скруглённый прямоугольник. Аргументы: cnv: Холст Tkinter. px1: Левая точка прямоугольника. py1: Верхняя точка прямоугольника. px2: Правая точка прямоугольника. py2: Нижняя точка прямоугольника. radius: Радиус скругления. kwargs: Дополнительные аргументы cnv.create_polygon(). Возвращаемое значение: ID Скруглённого прямоугольника на холсте. """ def user_selected(self) -> None: """Обработчик события выбора пользователя. Аргументы: wid: Виджет Listbox Tkinter. """ def resize(self, event) -> None: """Обработчик изменения размера окна.""" def send_message(self, message: str) -> None: """Отправляет сообщение на сервер. Аргументы: message: Сообщение. """ def add_user(self, username: str) -> None: """Добавляет пользователя по имени. Аргументы: username: Имя пользователя. """ def receive(self) -> None: """Получает сообщения от сервера.""" def send_idle(self) -> None: """Отправляет сообщение серверу о том, что клиент до сих пор открыт.""" def login_tab(self, clear=True) -> None: """Перемещает на начальную вкладку.""" def on_destroy(self): """Обработчик выхода из приложения.""" def main(self): """Основная функция клиента."""
Мессенджер на Python за 3 дня
Заявка не отправлена! Похоже произошла ошибка. Попробуйте отправить снова или перезагрузите страницу.
Вы пройдёте основы программирования на языке Python и напишете полезную программу для обмена сообщениями.
Python — универсальный язык программирования, на котором пишут сайты, игры, чат-боты, нейросети и проводят научные вычисления.
Примеры работ студентов

Eve Online

SciPy

Blender
Python-разработчики востребованы на рынке. Более
6 000 вакансий для разных уровней открыто на рынке труда.
- от 45 000 ₽ Без опыта
- до 250 000 ₽ 1–3 года опыта
- до 350 000 ₽ 3–6 лет опыта
Кому подойдёт интенсив
Новичкам в коде
Начинающим разработчикам
Вы научитесь
- Разбираться в различных типах данных, структурах, функциях и ООП
- Разрабатывать сервер для прослушивания подключений
- Программировать клиентскую часть для подключения и передачи сообщений
- Работать с библиотеками PyQT, Kivy, wxWidgets, Tkinter
- Понимать основы сетевого ПО
- Создавать форму через Qt Designer
Программа
Знакомимся с Python
- Разбираем основные элементы языка.
- Создаём сервер, который будет отвечать за регистрацию клиентов и передачу сообщений между ними.
Настраиваем протокол TCP для мессенджера
- Разрабатываем вторую программу.
- Делаем форму регистрации клиентов по логину и паролю.
- Настраиваем механику отправки и получения сообщений между пользователями.
Пишем интерфейс мессенджера на Python
- Работаем над интерфейсом для мессенджера.
- Ревью работ.
- Разбираем ошибки.
- Подводим итоги.
- Выбираем победителя.
- Вручаем призы.
Подарки и призы
Сертификат на скидку 10 000 рублей

Участники, которые будут онлайн на интенсиве, получат сертификаты на скидку 10 000 рублей для обучения на образовательной платформе Skillbox.
Статья «Экспекто Питонум»

Всем, кто зарегистрируется, отправим статью с полезными скриптами на Python «Экспекто Питонум».
«Разум под контролем» Роджера Сайпа и Робби Збиерски
Преподаватель

Алексей Коновалов
- Ведёт личный проект по парсингу сайта и анализу данных.
- Выпускник курса от Skillbox «Python-разработчик с нуля».
Отзывы участников интенсива
Вадим Будилин

Большое спасибо за бесплатный мастер-класс по Python! Чувствуется профессионализм лектора и ведущего. Они всегда обращали внимание на вопросы в чате и подробно на них отвечали. Три дня интенсива прошли нескучно, с юмором, но по делу. Каждое домашнее задание было прокомментировано, поэтому все участники смогли обменяться опытом. Подтверждаю честность розыгрыша приза. Я, хоть и не мгновенно, но получил выбранный курс. Ещё раз спасибо!
Виталий Власенко

Интенсивы Skillbox — отличная возможность «потрогать» новые профессии под руководством профессионалов. Можно примерить роль разработчика: увидеть, чем он занимается, какие задачи решает, и понять, интересно ли это тебе. Это почти как заглянуть в будущее и понять, хочешь ли ты в этом будущем оказаться! Skillbox удалось сделать классный интенсив, который полезен и новичкам, и тем, у кого уже есть опыт. Правда, время не очень удобное для тех, кто живёт в четырёх часовых поясах от Москвы. К счастью, можно посмотреть семинары в записи и получить консультацию в Telegram-чате. А учитывая, что интенсивы бесплатны, я рекомендую всем в них поучаствовать!
Алексей Дробяз

Интенсив понравился. Доступно изложено и всё понятно. Ответы на вопросы были полными, а возникающие проблемы решались достаточно оперативно. Чат до сих пор жив, и участники делятся успехами. Видно, что спикер в теме разбирается. Он объяснял нюансы так, что даже новички понимали, что и как делать. В профессиональном плане интенсив расширил горизонты.
Создание своего мессенджера на Python с нуля


Публиковать могут пользователи с любым рейтингом. Однако!
Приветствуется:
• уважение к читателям и авторам
• простота и информативность повествования
• тег python2 или python3, если актуально
• код публиковать в виде цитаты, либо ссылкой на специализированный сайт
Не рекомендуется:
• допускать оскорбления и провокации
• распространять вредоносное ПО
• просить решить вашу полноценную задачу за вас
2 года назад
Без текста минус нахуй.
раскрыть ветку
Лучшие посты за сегодня
21 час назад

«От неё дурно пахнет», — сказал король
Портрет невесты внесли в тронный зал. Король, чтобы получше рассмотреть потенциальную супругу, даже поднялся с трона и, сделав несколько шагов вперед, остановился у портрета, задумчиво глядя на изображение миловидной женщины в великолепном, богатом одеянии. Придворные с нетерпением ждали решения монарха. И вердикт последовал.
— Хороша! — воскликнул король. — Женюсь!
Тогда еще Его Величество не знал, что художники порой немилосердно льстят своим натурщицам.

Анна Клевская в исполнении актрисы Джосс Стоун. Сериал «Тюдоры».
Анна Клевская родилась 21 сентября 1515 года в немецком Дюссельдорфе. Принадлежала к древнему аристократическому роду Ламарков — одному из самых знатных в Германии.
Отцом Анны был герцог Клевский Иоганн III, матерью — Мария фон Юлих-Берг. Девочка провела обыкновенное для юной немецкой аристократки детство — гуляла по лесам и долам перед замком, ходила в коровник смотреть на животных, кушала вкусные колбасы без ограничения, играла со своими двумя сестрами и братом.
Мать, герцогиня Мария, обожала своих детей и сама занималась их воспитанием. Вероятно, именно это стало причиной того, что дети так и не выучили ни французский язык, ни латынь, не умели танцевать, не знали нотной грамоты, не были обучены хорошим манерам. Юные отпрыски герцога Клевского воспитывались в свободных немецких традициях, которые сильно отличались от французских и английских. Зато Анна и ее сестры были очень кроткими, послушными, и умели рукодельничать.
В 1527 году, когда Анне исполнилось двенадцать, девочку обручили с 10-летним герцогом Лотарингским Франсуа I. Помолвка была неофициальной, поэтому в 1535 году ее отменили.
Пока в далекой Германии Анна Клевская взрослела и наливалась соками, в Британии от родильной горячки скончалась королева Джейн Сеймур, супруга короля Генриха VIII. Генрих был известен всей Европе своим жестоким обращением с женами (он считается одним из прототипов Синей Бороды). До Джейн Сеймур супругами короля были Екатерина Арагонская и Анна Болейн. Первую Генрих отправил в тяжелейшую ссылку, где она и умерла. Вторую, и вовсе, казнил.
Джейн Сеймур король, и правда, любил, однако, о новой женитьбе он задумался сразу же после смерти супруги. Генрих понимал, что для сохранения династии одного наследника — рожденного Джейн Сеймур принца Эдуарда — мало. Детская смертность в те годы была очень высокой, и, чтобы избежать проблем с передачей титула, королю был нужен еще один сын.
Генрих поручил своим представителям найти ему жену во Франции. Весьма привлекательным вариантом была принцесса Маргарита, дочь короля Франциска, а также прекрасные дочери герцога де Гиза — Мари, Луиза и Рене.

Ганс Гольбейн. «Портрет короля Генриха VIII», 1540 год.
Королю Франциску было передано послание, что Генрих желает встретиться сразу с четырьмя девицами в Кале, чтобы выбрать из них наиболее достойную. Однако, ответ французского монарха был отрицательным, более того, Франциск написал, что француженок не выставляют «словно рысистых скакунов на ярмарке».
Поняв, что во Франции ему невесту не найти, Генрих обратил свой взор на Италию. Кристина Миланская, молодая вдова герцога Милана, была вполне выгодной партией. Однако, Кристина не пожелала выходить замуж за британского монарха, попросив его посланников передать Генриху следующие слова:
«Его Величество так быстро был избавлен от прежних королев, … что её советники полагают, будто её двоюродная бабушка была отравлена, а вторая жена безвинно казнена, а третья потеряла жизнь из-за неправильного ухода за ней после родов».
Также Кристина заявила, что она непременно бы вышла замуж за Генриха VIII, но лишь в том случае, если бы у нее было бы две головы, а не одна. В этом случае, когда его Милости будет угодно отрубить королеве голову, у Кристины бы осталась хотя бы одна.
Репутация британского монарха была настолько зловещей, что европейские короли и герцоги ни в какую не желали отдавать за него своих дочерей. И вот тогда-то английский посол в Брюсселе сообщил Его Величеству, что у герцога Клевского есть незамужняя дочь по имени Анна. Правда, посол уточнил, что он никогда «не слышал особой похвалы ни нраву ее, ни красоте».
Тем не менее, Генрих, которого первый советник Томас Кромвель настойчиво убеждал заключить брак с принцессой из какого-нибудь протестантского государства, заинтересовался Анной.
Ко двору герцога Клевского были отправлены два представителя Генриха — Николас Уоттон и Роберт Барнс. Им предстояло на месте изучить все достоинства потенциальной невесты.
Пока Уоттон и Барнс добирались до замка Шваненбург в Клеве, скончался 48-летний герцог Клевский Иоганн III Миролюбивый, передав титул своему сыну Вильгельму.
23-летний Вильгельм, несмотря на молодость, был ревностным христианином и человеком строгих правил. Принцесса Анна, а также ее сестра Амелия, были предъявлены британским посланникам в настолько громоздких платьях и больших головных уборах, что Уоттон и Барнс практически ничего не увидели. Уоттон намекнул Вильгельму, что девушек следует предъявить в более подходящем виде. Герцог на это удивленно вопросил:
«Разве вы хотите видеть их обнажёнными?».
Уоттон и Барнс сообщили Томасу Кромвелю, что рассмотреть принцесс как следует не удалось. Советник короля немедленно снарядил в дорогу придворного художника Ганса Гольбейна, который ранее уже писал для короля портрет Кристины Миланской.
Не дожидаясь портрета, Кромвель написал Генриху:
Все восхваляют красоту леди Анны, так как и лицо и фигура её восхитительны. Она далеко превосходит герцогиню Саксонскую, как золотое солнце превосходит серебряную луну. Все восхваляют её добродетель и честность, вместе со скромностью, которая ясно видна в её наружности.
Так, фактически, был сделан выбор между Анной и Амелией. Король стал настаивать, чтобы ему доставили, в первую очередь, портрет Анны Клевской.
Герцог Вильгельм скептически относился к идее отдать сестру за английского короля. Он был уверен, что его водят за нос, и Генрих либо потребует огромное приданное, либо в последний момент найдет другую невесту и не женится на Анне. Окончательно герцога убедило послание из Англии, в котором указывалось, что Генрих готов жениться на его сестре без приданного, но только при условии, что королю понравится портрет девушки.
И вот художник Гольбейн наконец-то закончил работу. Портрет отправился в Англию в сопровождении посланников Уоттона и Барнса.
Портрет Генриху очень понравился. Короля восхитила спокойная красота Анны, стройная фигура, ухоженные руки.

Ганс Гольбейн «Портрет Анны Клевской», 1539 год.
4 сентября 1539 года между Генрихом и герцогом Вильгельмом был подписан брачный договор. Несмотря на уверения британского монарха, что приданное ему не нужно, вместе с Анной в Англию отправлялись 100 тыс. флоринов, из которых 40 тыс. Генриху должны были быть выплачены в день свадьбы.
Анна Клевская отправилась в Англию с огромным эскортом из 263 придворных. Имущество принцессы и ее двора везли на 283 лошадях.
11 декабря Анна прибыла в Кале. Здесь принцесса встретилась с делегацией Генриха VIII, в которую входил адмирал Саутгемптон. Сразу после аудиенции адмирал отправил Генриху письмо, в котором сообщал, что Анна очень мила, и выбор короля выглядит более чем достойным.
31 декабря свита Анны Клевской высадилась в Рочестере.
И вот — судьбоносная встреча. 1 января 1540 года жених и невеста наконец-то увидели друг друга воочию. Генрих прибыл в Рочестер инкогнито, без свиты. Король горел нетерпением поскорее познакомиться с той, чей портрет так поразил его. По словам Генриха, он жаждал «взлелеять любовь в своем сердце». Однако, все получилось несколько иначе.
Король увидел грубоватую, очень крупную женщину с развитыми плечами, сильными руками, узким тазом и широким, некрасивым лицом, как у немецкой простолюдинки. Кроме того, принцесса не говорила по-английски.
По итогу встречи Генрих заявил:
Я не вижу ничего из того, что было представлено мне на картинах и в донесениях. Мне стыдно, что люди её так восхваляли, — и я её совсем не люблю!
Еще жестче король высказался по возвращению в Гринвич. Во время беседы с немедленно вызванным «на ковер» Томасом Кромвелем, Генрих прокричал, что вместо принцессы ему привезли «здоровенную фламандскую кобылу».
Анна Клевская в исполнении актрисы Джосс Стоун. Сериал «Тюдоры»
Король приказал своим юристам искать любые способы для расторжения помолвки. Но свадьба была уже назначена, и 6 января 1540 года Генриху VIII пришлось повести под венец «фламандскую кобылу». Историки считают, что монарх не смог отказаться от свадьбы из-за давления со стороны Кромвеля, убеждавшего Генриха в том, что разрыв брака окончательно похоронит его репутацию и оставит Англию без союзников перед угрозой вторжения со стороны Испании и Франции.
Для Кромвеля эта ошибка стала роковой — уже 10 июня 1540 года всесильный советник был арестован, брошен в Тауэр, а затем казнен.
После того, как пышная свадьба отгремела, молодожены отправились в опочивальню. Наутро король прилюдно заявил:
Она вовсе не мила и от неё дурно пахнет. Я оставил её такой же, какой она была до того, как я лёг с ней.
Анне Клевской очень повезло, что она не знала английского языка.
Несмотря на нападки короля и всяческие издевательства, жители Англии вскоре поняли, что из далекого герцогства к ним приехал настоящий ангел. Женщина была невероятно добра к детям своего супруга, везде и всюду держалась с исключительным, воистину королевским достоинством, старательно изучала английский язык и постигала традиции и культуру своей второй родины.
Старшая дочь Генриха, леди Мария, презрительно отзывавшаяся о «фламандской корове», вскоре привязалась к кроткой и доброй женщине, стала ее ближайшей подругой.

Бартоломеус Брейн-старший «Анна Клевская».
Королева, которая провела детство среди полей и коровников, быстро освоилась при английском дворе. Анна выучилась музыке, танцам, научилась носить модные платья.
Единственное, что тревожило королеву — равнодушие супруга. Анна прекрасно знала о судьбе своих предшественниц, прежде всего, Анны Болейн.
Весной 1540 года стало понятно, что Британия не нуждается больше в союзе с герцогством Клевским. Новой целью Генриха стала Испания, и он всячески пытался восстановить подорванные отношения с императором Карлом V.
Анна Клевская стала обузой для короля. В марте 1540 года на тайном совете монарх сообщил своим министрам, что он собирается развестись с супругой. Министры согласились с решением Генриха, и тут же нашли сразу две причины для аннулирования брака. Первая — давняя помолвка с герцогом Лотарингским. Вторая — неисполнение королевой супружеских обязанностей.
24 июня 1540 года Анне сообщили, что она должна поехать в Ричмонд — фактически, это была ссылка. Между тем, Парламент решал, как поскорее расторгнуть брак. Были найдены (либо подделаны) документы о помолвке Анны с герцогом Лотарингским, однако, решающим фактором стала позиция самой королевы: Анна безоговорочно согласилась на развод, не предъявив мужу ни малейшей претензии.
Король был счастлив. Именно в этот момент он оценил, какой драгоценный бриллиант находился рядом с ним. Анну Клевскую Генрих назвал «своей любимой сестрой», подарил ей отличные земли с замком Хивер и назначил пожизненное содержание в 4 тыс. фунтов в год.
9 июля 1540 года Генриха VIII и Анну Клевскую наконец-то развели. Король тут же женился на своей любовнице — юной фрейлине Екатерине Говард, двоюродной сестре Анны Болейн.
Жизнь показала, что Анна Клевская поступила исключительно разумно. Уже через два года Екатерина Говард взошла на эшафот и лишилась головы: король обвинил женщину в измене с пажом Томасом Калпепером.
Между тем, Анна отлично общалась с королем, который при всех называл ее «любимая сестра». Та, кого недавно презрительно обзывали «фламандской коровой», была первой дамой и при дворах дочерей Генриха, которые нежно ее любили.
Брату Вильгельму Анна писала, что совершенно счастлива и замечательно чувствует себя в Англии.
Анна была тем самым лучиком света, что озарял темный и жестокий мир английской аристократии тех времен. Ее всюду ждали, приглашали на все мероприятия.
Когда представители герцога Клевского сообщили королю Англии, что Вильгельм согласен принять сестру обратно, Генрих ответил, что свою «любимую сестру» он никому не отдаст, Анна необходима английскому народу.
Анна Клевская — уникальный пример абсолютно свободной женщины той эпохи. Она ездила на балы, путешествовала, присутствовала на пирах и самых разных мероприятиях, наслаждалась жизнью в отличном замке в окружении многочисленных обожавших ее слуг. Никто не запрещал Анне повторно выходить замуж, но она и не подумала этого сделать.
Несмотря на все удобства, жизнь Анны Клевской получилась не очень долгой — она скончалась 17 июля 1557 года в возрасте 42 лет. Тем не менее, Анна пережила и своего бывшего мужа, и его сына, короля Эдуарда VI. Более того, она намного пережила всех жен Генриха VIII, которых, помимо Анны, у Его Величества было пять.
Такова история женщины, которая прошла путь от «фламандской коровы» до «любимой сестры» короля и всеобщей любимицы британского королевского двора.
(с) Василий Гавриленко, то есть, я)


