C#WebSocket Sharp.WebSocket异常:不是WebSocket握手响应

C#WebSocket Sharp.WebSocket异常:不是WebSocket握手响应,c#,websocket-sharp,C#,Websocket Sharp,我想从一个网站上收集实时数据,我决定使用webSocket-sharp库。我的问题是,使用相同的代码,我可以解析特定网站的数据,而不能解析其他网站的数据 程序引发此异常:WebSocket.connect:0 | WebSocket Sharp.WebSocket异常:不是WebSocket握手响应 using (var wss = new WebSocket("wss://...")) { wss.SslConfiguration.EnabledSslProtoco

我想从一个网站上收集实时数据,我决定使用webSocket-sharp库。我的问题是,使用相同的代码,我可以解析特定网站的数据,而不能解析其他网站的数据

程序引发此异常:WebSocket.connect:0 | WebSocket Sharp.WebSocket异常:不是WebSocket握手响应

using (var wss = new WebSocket("wss://..."))
{
    wss.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
    wss.Origin = "https://www.blabla.com";
           
    wss.CustomHeaders = new Dictionary<string, string>
    {
        { "Accept-Encoding", "gzip, deflate, br" },
        { "Accept-Language", "el-GR,el;q=0.9,en;q=0.8" },
        { "Cache-Control", "no-cache" },
        { "Connection", "Upgrade" },
        { "Host", "blabla.com" },
        { "Origin", "https://www.bla.com" },
        { "Pragma", "no-cache" },
        //{ "Sec-WebSocket-Key", secWebSocketKey },
        //{ "Sec-WebSocket-Protocol", "zap-protocol-v1" },
        { "Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits" },
        { "Sec-WebSocket-Version", "13" },
        { "Upgrade", "websocket" },
        { "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" }
     };

     //wss.OnOpen += Ws_OnOpen;
     wss.OnMessage += (sender, e) => Console.WriteLine($"Server: {e.Data}");
     wss.OnError += (sender, e) => Console.WriteLine($"Error: {e.Message}");

     wss.Connect();

     Console.ReadKey();
 }
使用(var wss=new WebSocket(“wss://..."))
{
wss.SslConfiguration.enabledslprotocols=System.Security.Authentication.SslProtocols.Tls12;
wss.Origin=”https://www.blabla.com";
wss.CustomHeaders=新字典
{
{“接受编码”,“gzip,deflate,br”},
{“接受语言”,“el-GR,el;q=0.9,en;q=0.8”},
{“缓存控制”,“无缓存”},
{“连接”,“升级”},
{“主机”,“blabla.com”},
{“起源”https://www.bla.com" },
{“Pragma”,“无缓存”},
//{“secWebSocketKey”,secWebSocketKey},
//{“Sec-WebSocket协议”,“zap-Protocol-v1”},
{“Sec WebSocket Extensions”,“permessage deflate;client_max_window_bits”},
{“Sec WebSocket版本”,“13”},
{“升级”,“websocket”},
{“用户代理”、“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/85.0.4183.121 Safari/537.36”}
};
//wss.OnOpen+=Ws_OnOpen;
wss.OnMessage+=(sender,e)=>Console.WriteLine($“Server:{e.Data}”);
wss.OnError+=(sender,e)=>Console.WriteLine($“Error:{e.Message}”);
Connect();
Console.ReadKey();
}
我尝试过使用或不使用自定义标题

我该怎么做才能做出有效的握手

(附言:我可以解析来自第一个网站的数据,而无需自定义标题)

更新

在URL中有一个uid参数wss://blabla.com/zap/?uid=5829062969032768

此uid在每次刷新网页时都会更改。
我认为握手是必要的。有没有办法重现它?

每次加载页面时,此uid都会更改。我发现这个网站使用了代码模糊处理,所以我很难理解js代码,所以我使用了selenium 4开发工具,最终获得了实时数据

首先必须初始化chrome开发工具

public async static Task<DevToolsSession> InitializeChromeDevTools(IWebDriver driver)
{
    var devTools = driver as IDevTools;
    var output = devTools.CreateDevToolsSession();
    await output.Network.Enable(new OpenQA.Selenium.DevTools.Network.EnableCommandSettings());

    return output;
}

第二个网站是否支持websocket连接?您不能使用websocket访问任何网站上的任何随机页面-服务器还需要希望该连接是websocket,而不是普通的web请求。@James Thorpe是的,它支持。我可以从Chrome上看到小溪。客户端发送的数据和从serverOK接收的数据—在这种情况下,可能是由于您的请求在某种程度上不匹配。您是否能够看到服务器向您的代码发送的实际响应—可能会告诉您它拒绝它的原因?或者深入研究Chrome中的websocket请求——看看它是否发送了其他头文件(可能是需要的cookie等?)。或者在最坏的情况下,使用fiddler/wireshark等将您的请求与网站本身使用的请求进行比较。@JamesThorpe我使用了google chrome Inspector中显示的所有请求标题。如果出现异常,是否还有其他详细信息?它应该显示服务器的响应在我认为的某个地方。如果不是,就交给fiddler来比较……我无法使用您的InitializeChromeDevTools方法。output.Network属性不可用。我已经安装了nuget软件包Selenium.WebDriver v4.0.0-alpha07。有什么提示吗?@PetterT尝试使用-alpha05。我刚更新到alpha07,也有同样的问题。在这个新版本Excellent@ggeorge中可能发生了一些变化,这造成了不同。顺便问一下:您也可以使用devtools发送Websocket消息吗?(关于这些alpha发行版的文档不多:-))顺便说一句,output.Network.Enable方法是异步的,所以您应该等待它。@PetterT谢谢您的提示。我会更新我的答案。关于websocket消息,我不知道,因为我只使用它作为代理来捕获网络流量
var session = await ChromeDriverSettings.InitializeChromeDevTools(driver);
session.Network.WebSocketFrameReceived += Network_WebSocketFrameReceived; 

private static void Network_WebSocketFrameReceived(object sender, OpenQA.Selenium.DevTools.Network.WebSocketFrameReceivedEventArgs e)
{
    var message = e.Response.PayloadData;
}