首页 > 解决方案 > 如何在python中通过websockets接收数据

问题描述

我正在尝试通过 websockets 以编程方式检索数据,但由于我对此的了解有限而失败。在访问https://www.tradingview.com/chart/?symbol=ASX:RIO的网站时, 我注意到发出的 websocket 消息之一是~m~60~m~{"m":"quote_fast_symbols","p":["qs_p089dyse9tcu","ASX:RIO"]}

我的代码如下:

from websocket import create_connection
import json 

ws = create_connection("wss://data.tradingview.com/socket.io/websocket?from=chart%2Fg0l68xay%2F&date=2019_05_27-12_19")

ws.send(json.dumps({"m":"quote_fast_symbols","p"["qs_p089dyse9tcu","ASX:RIO"]}))
result =  ws.recv()
print(result)
ws.close()

打印结果:

~m~302~m~{"session_id":"<0.25981.2547>_nyc2-charts-3-webchart-5@nyc2-compute-3_x","timestamp":1558976872,"release":"registry:5000/tvbs_release/webchart:release_201-106","studies_metadata_hash":"888cd442d24cef23a176f3b4584ebf48285fc1cd","protocol":"json","javastudies":"javastudies-3.44_955","auth_scheme_vsn":2}

无论我发出什么消息,我都会得到这个结果,从似乎发出的几乎众多消息中。我希望发回的消息之一是 RIO 的低点和高点的价格信息。我应该包括其他步骤来获取这些数据吗?我知道可能需要某种形式的授权,但我不知道工作流程。

标签: pythonwebsocket

解决方案


是的,还有更多的设置需要按顺序完成。以下用Node.js编写的示例将订阅BINANCE:BTCUSDT实时数据并获取日线图上的历史5000根柱线。

  1. 在连接之前,请确保您在标题部分中设置了正确的原始字段值。否则您的连接请求将被代理拒绝。我最常见的是没有办法做到这一点。改为使用wsfaye-websocket
const  WebSocket = require('faye-websocket')  

const  ws = new  WebSocket.Client('wss://data.tradingview.com/socket.io/websocket', [], {
  headers: { 'Origin':  'https://data.tradingview.com' }
});
  1. 连接后,您需要设置数据流。我不知道是否需要执行所有这些命令。这可能会进一步缩小,但它确实有效。基本上,您需要做的是创建新的报价和图表会话,并在这些会话中请求先前解析交易品种的数据流。

ws.on('open', () => {

  const  quote_session = 'qs_' + getRandomToken()
  const  chart_session = 'cs_' + getRandomToken()
  const  symbol = 'BINANCE:BTCUSDT'
  const  timeframe = '1D'
  const  bars = 5000

  sendMsg(ws, "set_auth_token", ["unauthorized_user_token"])
  sendMsg(ws, "chart_create_session", [chart_session, ""])
  sendMsg(ws, "quote_create_session", [quote_session])
  sendMsg(ws, "quote_set_fields", [quote_session,"ch","chp","current_session","description","local_description","language","exchange","fractional","is_tradable","lp","lp_time","minmov","minmove2","original_name","pricescale","pro_name","short_name","type","update_mode","volume","currency_code","rchp","rtc"])
  sendMsg(ws, "quote_add_symbols",[quote_session, symbol, {"flags":['force_permission']}])
  sendMsg(ws, "quote_fast_symbols", [quote_session, symbol])
  sendMsg(ws, "resolve_symbol", [chart_session,"symbol_1","={\"symbol\":\""+symbol+"\",\"adjustment\":\"splits\",\"session\":\"extended\"}"])
  sendMsg(ws, "create_series", [chart_session, "s1", "s1", "symbol_1", timeframe, bars])

});

ws.on('message', (msg) => { console.log(`RX: ${msg.data}`) })
  1. 最后实现辅助方法

const  getRandomToken = (stringLength=12) => {
  characters = 'abcdefghijklmnopqrstuvwxyz0123456789'
  const  charactersLength = characters.length;
  let  result = ''
  for ( var  i = 0; i < stringLength; i++ ) {
    result += characters.charAt(Math.floor(Math.random() * charactersLength))
  }
  return  result
}

const  createMsg = (msg_name, paramsList) => {
  const  msg_str = JSON.stringify({ m:  msg_name, p:  paramsList })
  return  `~m~${msg_str.length}~m~${msg_str}`
}

const  sendMsg = (ws, msg_name, paramsList) => {
  const  msg = createMsg(msg_name, paramsList)
  console.log(`TX: ${msg}`)
  ws.send(createMsg(msg_name, paramsList))
}

推荐阅读