Как отправить «Заголовки» в websocket python - PullRequest
1 голос
/ 19 февраля 2020

как я могу сделать это

Это мой код


import  websockets


async def test():
    async with websockets.connect('ws://iqoption.com') as websocket:
        response = await websocket.recv()
        print(response)
# Client async code

Вопрос заключается в том, могу ли я отправить эти заголовки для аутентификации на сервере

Заголовки

    'Host':'iqoption.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0',
    'Accept' : '*/*',
'Accept-Encoding': 'gzip, deflate',
'Sec-WebSocket-Version' : '13',
'Origin' : 'https://iqoption.com',
    'Sec-WebSocket-Key': 'iExBWv1j6sC1uee2qD+QPQ==',
'Connection' : 'keep-alive, Upgrade',
'Upgrade': 'websocket'}

Я мог бы сделать это с этим другим кодом, но сообщения все еще были зашифрованы с помощью tls

proxies = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}
urllib3.disable_warnings()

r = requests.get('https://iqoption.com/echo/websocket', stream=True,headers = Headers, proxies=proxies, verify=False)
#r = requests.get('https://iqoption.com/echo/websocket', stream=True,headers = Headers)
s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM)


def receive_and_print():
    #for message in iter(lambda: s.recv(1024).decode("utf-8", errors="replace"), ''):
    for message in iter(lambda: s.recv(1024).decode( errors="replace"), ''):
        print(":", message)
        print("")
import threading
background_thread = threading.Thread(target=receive_and_print)
background_thread.daemon = True
background_thread.start()

while 1:
    s.send(input("Please enter your message: ").encode())
    print("Sent")
    print("")

Любой совет ??

1 Ответ

0 голосов
/ 20 февраля 2020

Я думаю, что в настоящее время вам не хватает базового c понимания WebSockets, как показано в ваших предыдущих экспериментах. WebSockets не являются простыми сокетами. WebSockets - это некое подобие сокетов, созданное после HTTP-рукопожатия. Вы не можете просто извлечь сокет из соединения, как вы пытались после requests, но вы должны явно указать протокол приложения WebSocket, определенный в RF C 6455 .

сказал, что использование библиотеки типа websockets намного лучше. Но вы все равно должны использовать конечную точку WebSocket в качестве цели, а не просто какой-то произвольный URL на том же сервере. Конечной точкой в ​​этом случае является не ws://iqoption.com, а wss://iqoption.com/echo/websocket, то есть более длинный путь и wss:// вместо ws://.

Без правильного URL вы получаете сообщения об ошибках, которые вы, похоже, воспринимаете как проблемы аутентификации. Но здесь нет никакой аутентификации. Как только вы используете правильную конечную точку, она просто работает без необходимости отправлять указанные c заголовки:

async def test():
    async with websockets.connect("wss://iqoption.com/echo/websocket") as websocket:
        response = await websocket.recv()
        print(response)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...