C# WebSocketSharp.WebSocketException: 不是 WebSocket 握手响应
C# WebSocketSharp.WebSocketException: Not a WebSocket handshake response
我想从网站上抓取 real-time 数据,因此我决定使用 webSocket - sharp 库。我的问题是,使用相同的代码,我可以解析来自特定网站的数据,但我不能解析来自另一个网站的数据。
程序抛出此异常: WebSocket.connect:0|WebSocketSharp.WebSocketException: 不是 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();
}
我试过有或没有自定义 headers。
我该怎么做才能进行有效的握手?
(P.S: 我可以不自定义 headers 从第一个网站解析数据)
更新
在URL里面有个uid参数wss://blabla.com/zap/?uid=5829062969032768
这个uid在每次刷新网页时都会改变。
我认为握手很有必要。有什么方法可以重现吗?
每次加载页面时,此 uid 都会更改。我发现这个网站使用了代码混淆,所以我很难理解 js 代码,所以我使用了 selenium 4 devtools,最后抓取了 real-time 数据。
首先要初始化chromedevtools
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;
}
然后
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;
}
我想从网站上抓取 real-time 数据,因此我决定使用 webSocket - sharp 库。我的问题是,使用相同的代码,我可以解析来自特定网站的数据,但我不能解析来自另一个网站的数据。
程序抛出此异常: WebSocket.connect:0|WebSocketSharp.WebSocketException: 不是 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();
}
我试过有或没有自定义 headers。
我该怎么做才能进行有效的握手?
(P.S: 我可以不自定义 headers 从第一个网站解析数据)
更新
在URL里面有个uid参数wss://blabla.com/zap/?uid=5829062969032768
这个uid在每次刷新网页时都会改变。 我认为握手很有必要。有什么方法可以重现吗?
每次加载页面时,此 uid 都会更改。我发现这个网站使用了代码混淆,所以我很难理解 js 代码,所以我使用了 selenium 4 devtools,最后抓取了 real-time 数据。
首先要初始化chromedevtools
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;
}
然后
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;
}