今天有个盆友让我帮忙采集一个网站数据,我发现登录口竟然无法抓包,MD真是见了鬼了,在费时半小时后,在客户端JS中找到个关键词 WebSocket,这是什么鬼,百度查了查,大概知道了那么点用法。赶紧做一下笔记,避免自己忘记了,这玩意做防爬也不错啊。在登陆口一些位置,如果是网站,在展现数据GetList一类的方法不建议用这个技术,不利于SEO。但用来做反扒却真心不错。至少网络上一些脚本小子可以挡一挡。
下面做一个WebSocket技术的实战,各位看官看好了!其实非常简单。
【服务器端】创建 ASP.NET Core 项目
dotnet new web -n WebSocketExample
cd WebSocketExample
【服务器端】添加 WebSocket 支持
在 Startup.cs 中配置 WebSocket 服务:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 添加必要的服务
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//这句话 重点!!!!!!
app.UseWebSockets(); // 启用 WebSocket 支持
app.Use(async (context, next) =>
{
if (context.WebSockets.IsWebSocketRequest)
{
var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await HandleWebSocketConnection(webSocket);
}
else
{
await next();
}
});
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("WebSocket server is running.");
});
});
}
//解析传上来的数据
private async Task HandleWebSocketConnection(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
while (!result.CloseStatus.HasValue)
{
// 处理接收到的消息
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
Console.WriteLine($"Received: {message}");
// 发送回消息
var responseMessage = $"Echo: {message}";
var responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
await webSocket.SendAsync(new ArraySegment(responseBuffer), result.MessageType, result.EndOfMessage, CancellationToken.None);
result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
}
【客户端】创建一个简单的前端页面
在 wwwroot 文件夹中创建一个 HTML 文件,例如 index.html:
WebSocket Example
WebSocket Example
运行项目
在项目目录中运行以下命令启动应用:
dotnet run
访问 WebSocket
这个时候,你打开自己电脑上随便一款浏览器,访问
http://localhost:5000/index.html,你可以在输入框中输入消息并发送,服务器会回显你发送的消息, WebSocket 进行实时通信还是挺简单的,由于大多数爬虫不支持 WebSocket,因此使用这种方式可以降低被抓取的风险。你可以根据需要扩展此示例,添加更多功能和安全措施。如果还有更牛叉的方法,一定留言说说哈。
又花了半小时看了点其他资料,感觉这技术除了用于实时数据传输外,还有许多其他应用场景,第一个想到的是网页实时聊天工具,我感觉WebSocket 这东西非常适合构建实时聊天应用,因为它允许在客户端和服务器之间保持持久连接,实时发送和接收消息。第二个是客户端主动连接上后,好像服务器端可以主动一直发消息给客户端啊,这不就内网穿透了?我记得好像.NET 又出了一个基于webassembly技术的blazor,好像是这东西,那是不是都可以做木马了?不知道权限够不够,第三个想到股票和金融数据,我有炒股,感觉WebSocket 天生就可以用于实时传输股票价格、金融市场数据等信息,确保用户能够及时获取最新的市场动态。还有一个就是远程时评直播流传输,感觉用这技术快很多吧?暂时就想到这么多,应该快要凑足2000字了吧。哈哈哈哈哈。