Как прослушивать локальный трафик через сервер веб-сокетов в python?

Я пытаюсь реализовать сокращение URL-адресов в Python очень простым способом, не используя какие-либо веб-фреймворки, такие как FLASK или Django, чтобы лучше понять, как работают веб-сокеты. Я создал клиентский скрипт, который подключается к серверу через сокет, который прослушивает локальный хост на порту 80. Затем сервер сокращает URL-адрес с помощью алгоритма, который сокращает URL-адрес до https://127.0.0.1/something и отправляет клиенту, а также сохраняет в базе данных. На данный момент это самый простой обмен сообщениями между клиентом и сервером с использованием сокетов.

Теперь то, что я хочу сделать, это всякий раз, когда я ввожу сокращенный URL-адрес в браузере, т.е. https://127.0.0.1/something, он должен быть захвачен сокетом сервера, работающим на локальном хосте. Является ли это возможным? Если да, то как? Мне нужно только представление о том, что я могу сделать, но псевдокоды также могут быть полезны.

~ С уважением


person Priyansh Gupta    schedule 16.06.2021    source источник


Ответы (1)


Да, это возможно. сервер можно сделать на питоне с сокетами и вот код.

import socket

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)

PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

s.bind((HOST, PORT))

s.listen()

conn, addr = s.accept()

with conn:

print('Connected by', addr)

while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)

этот код работает так, как вы хотите, и его можно редактировать. сначала мы определяем хост и порт с IP-адресом локального хоста и портом, который вы хотите слушать. затем он создает сокет для прослушивания этого адреса: порт, и когда приходит соединение, он печатает IP-адрес подключенного клиента, а затем прослушивает сообщение от клиента. после того, как он получит сообщение, вы можете запустить алгоритм и вернуть свое значение обратно клиенту. Примечание: это неполный код для вас, поэтому вам нужно добавить свой алгоритм и возвращаемые значения, но, кроме того, он прекрасно работает.

person Antoine Zayyat    schedule 16.06.2021
comment
Итак, я попробовал ваш код, запустил сервер, но когда я пытаюсь открыть 127.0.0.1:65432 в Google Chrome , он говорит: Подключен через ('127.0.0.1', 1031) Трассировка (последний последний вызов): Файл server.py, строка 18, в ‹module› data = conn.recv(1024) OSError: [WinError 10038] An операция была предпринята на чем-то, что не является сокетом - person Priyansh Gupta; 16.06.2021
comment
да. он соединился нормально, НО это сокеты TCP, прослушивающие простые данные, ошибка, которую вы получили, означает, что Google Chrome использует его в режиме HTTP, который несовместим с этим типом сервера. - person Antoine Zayyat; 16.06.2021
comment
Я немного изменил код, теперь я могу перехватывать входящий запрос. Запрос http работает нормально, но запрос https, похоже, закодирован таким образом, что я не могу его декодировать. Я пробовал msg.decode(Latin-1), msg.decode(Ascii), msg.decode(unicode_escape), но все еще не смог прочитать запрос https. Любые предложения были бы замечательными! - person Priyansh Gupta; 16.06.2021
comment
по большей части вы не можете декодировать трафик https, чтобы он был полностью простым текстом, НО вы можете поиграть с ним достаточно, как только вы получите сообщение, попробуйте msg.decode(utf-8), а затем распечатайте вывод, и вы должны увидеть некоторые http (с) заголовки - person Antoine Zayyat; 17.06.2021