Encryption 解码websocket接收到的数据

Encryption 解码websocket接收到的数据,encryption,websocket,protocol-buffers,decode,encode,Encryption,Websocket,Protocol Buffers,Decode,Encode,我在我自己的网站上工作的项目,我需要从目标网站使用websocket刮数据。 数据是货币和股票价格变动的实时反馈或滴答声。 我得到以下格式的输出 试穿http://websocket.org/echo.html: 位置:wss://streamer.finance.yahoo.com/ 点击连接 消息:{“订阅”:[“AMZN”]} 输出: CONNECTED SENT: {"subscribe":["AMZN"]} RECEIVED: CgRBTVpOFaQY3EQY4Kn0/99bKgN

我在我自己的网站上工作的项目,我需要从目标网站使用websocket刮数据。 数据是货币和股票价格变动的实时反馈或滴答声。 我得到以下格式的输出

试穿
http://websocket.org/echo.html

位置:
wss://streamer.finance.yahoo.com/

点击连接

消息:
{“订阅”:[“AMZN”]}

输出:

CONNECTED

SENT: {"subscribe":["AMZN"]}

RECEIVED: CgRBTVpOFaQY3EQY4Kn0/99bKgNOTVMwCDgBRYjKzDxIyvN9ZQBQ4T7YAQQ=

RECEIVED: CgRBTVpOFaQY3EQY4Kn0/99bKgNOTVMwCDgBRYnKzDxIzPV9ZQBQ4T7YAQQ=

RECEIVED: CgRBTVpOFT0a3EQYsLn0/99bKgNOTVMwCDgBRYMG5DxIkP99ZQDg+j7YAQQ=

RECEIVED: CgRBTVpOFQAY3EQYwIf1/99bKgNOTVMwCDgBRYd5wzxIxod+ZQAQ1z7YAQQ=

RECEIVED: CgRBTVpOFQAY3EQYwIf1/99bKgNOTVMwCDgBRYd5wzxIroh+ZQAQ1z7YAQQ=

RECEIVED: CgRBTVpOFRQS3EQY8PT1/99bKgNOTVMwCDgBRYC1WjxIhI5+ZQCgcD7YAQQ=

RECEIVED: CgRBTVpOFRQS3EQY8PT1/99bKgNOTVMwCDgBRYG1WjxImo5+ZQCgcD7YAQQ=

RECEIVED: CgRBTVpOFUgN3EQY4KP2/99bKgNOTVMwCDgBRSBhnjtIvpJ+ZQBArj3YAQQ=

RECEIVED: CgRBTVpOFUgN3EQY4KP2/99bKgNOTVMwCDgBRSBhnjtI9J1+ZQBArj3YAQQ=

RECEIVED: CgRBTVpOFUgN3EQY4KP2/99bKgNOTVMwCDgBRSBhnjtIsqR+ZQBArj3YAQQ=

RECEIVED: CgRBTVpOFUgN3EQY4KP2/99bKgNOTVMwCDgBRSBhnjtInq5+ZQBArj3YAQQ=
我不知道如何解码,也不知道它是什么类型的加密。 有谁能告诉我如何解码它的编码/解码类型是什么? 我将使用PHP进行解码(如果可以解码的话)


我调查过了。我不知道该怎么做才能理解工作流程 并对函数进行调试。JS不是我的强项

当您与使用protobuf的外部系统进行接口时,您不会拘泥于任何特定的语言。 Protobuf是一种开放技术,它允许在已知消息的元描述时自动为多种语言创建编组代码。 因此,不需要重用可用代码,只需要从中提取Protobuf结构。 Protobuf编译器将为您完成所有脏活

只需查看_finStreamer-proto.js文件,就可以轻松地重建proto文件

PricingData.proto

syntax=“proto3”;
消息优先级{
枚举引用类型{
无=0;
ALTSYMBOL=5;
心跳=7;
权益=8;
指数=9;
MUTUALFUND=11;
货币市场=12;
选项=13;
货币=14;
认股权证=15;
债券=17;
未来=18;
ETF=20;
商品=23;
ECNQUOTE=28;
加密货币=41;
指标=42;
行业=1000;
};
枚举选项类型{
CALL=0;
PUT=1;
};
枚举MarketHoursType{
前期市场=0;
常规市场=1;
后市场=2;
延长工时市场=3;
};
字符串id=1;
浮动价格=2;
sint64时间=3;
字符串货币=4;
字符串交换=5;
QuoteType QuoteType=6;
MarketHoursType marketHours=7;
浮动百分比=8;
第64天体积=9;
浮动日高=10;
浮动日低=11;
浮动变化=12;
字符串shortName=13;
sint64到期日=14;
浮动开放价格=15;
float-previousClose=16;
浮动罢工价格=17;
字符串underyingsymbol=18;
利息=19;
OptionType OptionType=20;
sint64最小选项=21;
sint64 lastSize=22;
浮动投标=23;
sint64 bidSize=24;
浮动ask=25;
sint64 askSize=26;
sint64=27;
sint64 vol_24小时=28;
所有货币=29;
字符串fromcurrency=30;
字符串lastMarket=31;
双循环电源=32;
双市值=33;
};
然后,您可以使用protobuf编译器从中构建php文件:

mkdir雅虎
protoc--php out=yahoo PricingData.proto
这里还有我们的composer.json

{
    "require": {
        "google/protobuf": "^3.11",
        "ratchet/pawl": "^0.3.4"
    },
    "autoload": {
        "classmap": [
            "yahoo"
        ]
    }
}
和php文件来提取数据:

#/usr/bin/php
您可以使用或参考(由于Maxim提供了原型文件!)

这是一种易于使用的方法

  • 安装软件包
  • 使用以下代码创建livemarket.py文件
  • import-yliveticker
    #此函数在每次ticker更新时调用
    新消息(消息)上的def:
    打印(msg)
    #在此处插入您的符号
    yliveticker.yliveticker(on_ticker=on_new_msg,ticker_名称=[
    “BTC=X”、“^GSPC”、“^DJI”、“^IXIC”、“^RUT”、“CL=F”、“GC=F”、“SI=F”、“欧元兑美元=X”、“^TNX”、“^VIX”、“英镑兑美元=X”、“日元=X”、“BTC-USD”、“^CMC200”、“^FTSE”、“^N225”])
    
  • 运行代码
  • 观察控制台输出中出现的实时市场数据

  • 如果您没有看到任何结果,请确保您在您的证券交易所内

    感谢@Maxim,我能够更好地理解它的工作原理,并制作了NodeJS版本

    下面是基本示例的代码,我将花一些时间构建基于Electron的动态订阅和最终应用程序。其想法是获取解码数据并推送到本地SocketIO服务器,在那里它可以与VueJ一起在不同的应用程序中使用

    const WebSocket = require('ws')
    var ProtoBuf = require("protobufjs");
    
    "use strict";
    let Message = ProtoBuf
    .loadProtoFile('./PricingData.proto', (err, builder)=>{
        Message = builder.build('PricingData')
        loadMessage()
    })
    
    
    
    let loadMessage = ()=> {
        const url = 'wss://streamer.finance.yahoo.com'
        const connection = new WebSocket(url)
        connection.onopen = () => {
        connection.send('{"subscribe":["TSLA","AXSM","UBER","MIRM","GRKZF","BTCUSD=X","ETHUSD=X","AUDUSD=X","^DJI","^IXIC","^RUT","^TNX","^VIX","^CMC200","^FTSE","^N225"]}') 
        }
    
        connection.onerror = (error) => {
        console.log(`WebSocket error: ${error}`)
        }
    
        connection.onmessage = (e) => {
        let msg = Message.decode(e.data)
        console.log('Decoded message', msg)
        }
    }
    
    快速更新:
    以下是我的回购协议的完整示例。所以把它解码成一个字节数组,看看解码后的内容对你来说是否有意义。第一条记录包含“Bitcon INR”和“BTC”等字符串。检查一下你知道期望值是多少吗?去检查网络上的Websocket请求。我不确定exect值,但我认为它们是价格变动。一点一点地。当某个值发生变化时,它将在套接字中提供新的数据。只需查看中的PricingData.decode(),它将执行protobuf压缩数据的解码。我不知道如何理解工作流程和调试函数。JS不是我的强项。谢谢。对我来说,这是路上的石头。现在我可以全速前进了。我真的很感谢你的支持,因为我不知道如何创建一个php版本,你会编译php版本(示例)吗。谢谢lot@Maka,很有魅力,真棒!看看我添加的回购协议。请随意添加对新的有趣特性的请求,我将尝试实现它们。肯定还会有更多。
        pip install yliveticker
    
        python livemarket.py
    
    const WebSocket = require('ws')
    var ProtoBuf = require("protobufjs");
    
    "use strict";
    let Message = ProtoBuf
    .loadProtoFile('./PricingData.proto', (err, builder)=>{
        Message = builder.build('PricingData')
        loadMessage()
    })
    
    
    
    let loadMessage = ()=> {
        const url = 'wss://streamer.finance.yahoo.com'
        const connection = new WebSocket(url)
        connection.onopen = () => {
        connection.send('{"subscribe":["TSLA","AXSM","UBER","MIRM","GRKZF","BTCUSD=X","ETHUSD=X","AUDUSD=X","^DJI","^IXIC","^RUT","^TNX","^VIX","^CMC200","^FTSE","^N225"]}') 
        }
    
        connection.onerror = (error) => {
        console.log(`WebSocket error: ${error}`)
        }
    
        connection.onmessage = (e) => {
        let msg = Message.decode(e.data)
        console.log('Decoded message', msg)
        }
    }