簡體   English   中英

如何通過 pyside6 通過 websocket 訂閱幣安?

[英]How to subscribe binance via websocket by pyside6?

我可以通過此代碼獲取流:

from PySide6.QtWebSockets import QWebSocket

...

self.websocket = QWebSocket()
self.websocket_base_url = 'wss://stream.binance.com:9443/ws'
self.websocket.open(self.websocket_base_url + '/btcusdt@kline_5m')
self.websocket.textMessageReceived.connect(self.on_message_received)

def on_message_received(self, msg):
    print(msg)

這可以正常接收流,但我想使用訂閱,所以我寫這個:

self.websocket = QWebSocket()
self.websocket_base_url = 'wss://stream.binance.com:9443/ws'
self.websocket.open(self.websocket_base_url)

info = {
    "method": "SUBSCRIBE",
     "params":
      [
           "btcusdt@aggTrade"
       ],
       "id": 1
}

ret = self.websocket.sendTextMessage(json.dumps(info))
print(str(self.websocket.state()))
self.websocket.textMessageReceived.connect(self.on_message_received)

def on_message_received(self, msg):
    print(msg)

print() 輸出: PySide6.QtNetwork.QAbstractSocket.SocketState.ConnectingState 和 self.on_message_received() 沒有收到消息。

我不知道為什么...

您必須在連接后訂閱:

import json

from PySide6.QtCore import QObject
from PySide6.QtWebSockets import QWebSocket


class Manager(QObject):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.websocket = QWebSocket()
        self.websocket.textMessageReceived.connect(self.handle_text_message_received)
        self.websocket.connected.connect(self.handle_connected)

    def start(self):
        url = "wss://stream.binance.com:9443/ws"
        self.websocket.open(url)

    def subscribe(self):
        info = {"method": "SUBSCRIBE", "params": ["btcusdt@aggTrade"], "id": 1}
        message = json.dumps(info)
        ret = self.websocket.sendTextMessage(message)
        assert ret == len(message)

    def handle_connected(self):
        self.subscribe()

    def handle_text_message_received(self, message):
        data = json.loads(message)
        print(data)


def main():
    import sys
    from PySide6.QtCore import QCoreApplication

    app = QCoreApplication(sys.argv)
    manager = Manager()
    manager.start()

    app.exec()


if __name__ == "__main__":
    main()

輸出:

{'result': None, 'id': 1}
{'e': 'aggTrade', 'E': 1634398386255, 's': 'BTCUSDT', 'a': 958023628, 'p': '60999.99000000', 'q': '0.00442000', 'f': 1100891458, 'l': 1100891458, 'T': 1634398386255, 'm': True, 'M': True}
{'e': 'aggTrade', 'E': 1634398386750, 's': 'BTCUSDT', 'a': 958023629, 'p': '61000.00000000', 'q': '0.00028000', 'f': 1100891459, 'l': 1100891459, 'T': 1634398386749, 'm': False, 'M': True}
{'e': 'aggTrade', 'E': 1634398386765, 's': 'BTCUSDT', 'a': 958023630, 'p': '61000.00000000', 'q': '0.01447000', 'f': 1100891460, 'l': 1100891461, 'T': 1634398386764, 'm': False, 'M': True}

此代碼可以獲取流:

import sys
import json

from PySide6.QtWidgets import QApplication, QDialog
from PySide6.QtWebSockets import QWebSocket

class Main_Dlg(QDialog):
    def __init__(self):
        super(Main_Dlg, self).__init__()

        self.web_socket = QWebSocket()
        self.web_socket_url = 'wss://stream.binance.com:9443/ws'
        # self.web_socket.open(self.web_socket_url)
        self.web_socket.open(self.web_socket_url + '/btcusdt@kline_5m/bnbusdt@kline_5m')

        # sub_info = {
        #     "method": "SUBSCRIBE",
        #     "params":
        #     [
        #         "btcusdt@aggTrade"
        #     ],
        #     "id": 1
        # }
        # ret = self.web_socket.sendTextMessage(json.dumps(sub_info))
        self.web_socket.textMessageReceived.connect(self.on_message_received)

    def on_message_received(self, message):
        print(message)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    dlg = Main_Dlg()
    # dlg.show()

    sys.exit(app.exec())

但替換為注釋代碼,無法發送和獲取訂閱流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM