首页 > 解决方案 > 如果 API 页面无效,如何关闭 websocket 连接

问题描述

我正在使用币安 API。我正在连接他们的 API 并尝试评估 Binance 是否在他们的平台上有资产列表。资产清单如下:

assets = ['tribe', 'pax']

我通过将资产名称插入 SOCKET 链接将其传递给他们的 API:

SOCKET = f"wss://stream.binance.com:9443/ws/{asset}usdt@ticker"

如果调用 on_message,我知道该资产确实存在于他们的网站上,因为那时我已经完成了与他们的 API 的一致连接,除非我关闭连接(我这样做),否则它将继续打印消息。但是,如果在 n 时间内没有收到任何消息,我知道他们没有我正在寻找的资产。在这种情况下,Binance 确实有部落,但没有 pax。如果资产在 n 时间后不在他们的网站上,我想关闭连接,我该怎么做?

import ssl
import websocket

def on_open(ws):
    print('connection: successful')


def on_close(ws, *args):
    print('connection: lost')
    print("---------------------------------------------------")
    ws.close()


def on_message(ws, message):
    print("message received")
    print()
    ws.close()


def on_error(ws, message):
    print(message)
    print()


assets = ['tribe', 'pax']
for asset in assets:
    print(asset)
    SOCKET = f"wss://stream.binance.com:9443/ws/{asset}usdt@ticker"


    ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message,
                                on_error=on_error)

    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

我试图写:

if on_message == False:
    ws.close()

但是,这不起作用,因为据我所知,甚至没有调用 on_message 。

这是 Binance API 文档: https ://github.com/binance/binance-spot-api-docs/blob/master/web-socket-streams.md#klinecandlestick-streams 这是 websocket-client 文档: https: //websocket-client.readthedocs.io/en/latest/examples.html

标签: pythonapicryptocurrency

解决方案


试试这个:-

import websocket
import ssl
import time
from threading import Thread


class Binance():
    def __init__(self, asset, timeout=5):
        self.url = f'wss://stream.binance.com:9443/ws/{asset}usdt@ticker'
        self.ws = None
        self.mr = False
        self.timeout = timeout

    def start(self):
        self.ws = websocket.WebSocketApp(self.url, on_message=self.on_message)
        Thread(target=self.monitor).start()
        self.ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

    def on_message(self, ws, message):
        self.mr = True
        print(message)

    def stop(self):
        if self.ws:
            self.ws.close()
            self.ws = None

    def monitor(self):
        while True:
            time.sleep(self.timeout)
            if not self.mr:
                self.stop()
                break
            self.mr = False


def runner(asset):
    Binance(asset).start()


for asset in ['pax', 'tribe']:
    Thread(target=runner, args=(asset,)).start()

推荐阅读