python - 如果 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
解决方案
试试这个:-
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()
推荐阅读
- node.js - 玩笑测试返回未定义的自定义事件发射器
- javascript - 快递:我不懂sinon怎么用
- r - sim.data 来自 R 中的 imp4p 包
- spring-data-jpa - InvalidDataAccessApiUsageException:参数值与预期类型不匹配
- tensorflow - 用于可视化的 tensorflow 重塑卷积过滤器
- url - ASP.NET CORE 中的动态 URL 重写
- android - Flutter Android 支持库无法识别
- java - 无法解决:com.android.support:appcompat-v7:28.+,错误:多个库的包名称为“android.support.graphics.drawable”
- visual-studio-code - vscode:更改文件会修改临时文件夹中的文件,我无法更改临时文件夹之外的文件
- visual-c++ - 带有 MOVEFILE_REPLACE_EXISTING 标志的 MoveFileEx 失败,LastError = 183