python - 如何在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 的低点和高点的价格信息。我应该包括其他步骤来获取这些数据吗?我知道可能需要某种形式的授权,但我不知道工作流程。
解决方案
是的,还有更多的设置需要按顺序完成。以下用Node.js编写的示例将订阅BINANCE:BTCUSDT实时数据并获取日线图上的历史5000根柱线。
- 在连接之前,请确保您在标题部分中设置了正确的原始字段值。否则您的连接请求将被代理拒绝。我最常见的是没有办法做到这一点。改为使用
ws
faye-websocket
const WebSocket = require('faye-websocket')
const ws = new WebSocket.Client('wss://data.tradingview.com/socket.io/websocket', [], {
headers: { 'Origin': 'https://data.tradingview.com' }
});
- 连接后,您需要设置数据流。我不知道是否需要执行所有这些命令。这可能会进一步缩小,但它确实有效。基本上,您需要做的是创建新的报价和图表会话,并在这些会话中请求先前解析交易品种的数据流。
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}`) })
- 最后实现辅助方法
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))
}
推荐阅读
- python - 如何从所有熊猫列中计算成对矩阵
- html - 如何在不使用 div 标签和不使用容器的情况下更改 HTML5 中同一行中文本的字体颜色?
- angular - 从 Angular 绑定中抓取数据:数据从何而来?
- reactjs - 在道具条件下设置模态isOpen React js
- mysql - 针对长时间运行的查询的 MySQL 配置调整
- r - 具有 p.value 星的组的回归估计
- javascript - 更新状态变量而不更改在渲染时分配给它们的其他状态的值
- c# - 如何从域名中删除所有 Unicode (\u8236) 字符
- django - 使用文件系统在 django 中存储上传文件的缺点是什么?
- flutter - 我无法从 api 获取所有数据