網(wǎng)頁(yè)版陌陌直播彈幕協(xié)議抓取和發(fā)送
基于 websocket協(xié)議
具體分析過(guò)程就不說(shuō)了 大家自己F12抓包分析下一目了然 沒(méi)有什么難度
我直接上源碼例程
socket協(xié)議連接
彈幕抓取
彈幕發(fā)送
心跳包
各個(gè)地方我都備注了
代碼塊
static ClientWebSocket _webSocket = new ClientWebSocket();
async static Task Main(string[] args)
{
_webSocket = new ClientWebSocket();
Connect();
Console.ReadLine();
}
/// <summary>
/// WebSocket客戶端連接
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static async Task Connect()
{
CancellationTokenSource t = new CancellationTokenSource();
try
{
Uri uri = new Uri("wss://live-ws.immomo.com/ws/im");
//var config=new ServerConfig
await _webSocket.ConnectAsync(uri, t.Token);
Thread.Sleep(300);
Console.WriteLine($"鏈接websocket:[{uri}] 完成");
Task s1 = new Task(Receive, t, t.Token, TaskCreationOptions.LongRunning);
s1.Start();
var client_time = "1666113617240";//時(shí)間戳 毫秒級(jí)
var momoid = "256654841";//自己的陌陌ID
var roomid = "1476810196216";//直播間ID
var token = "236a4f4899725a8e63dc70babfacb936";//登陸憑證 登陸完成在 cookie的 live_web_session_im
var data = "{\"msg_id\":1,\"client_time\":" + client_time + ",\"type\":\"Sauth\",\"data\":{\"momoid\":\"" + 256654841 + "\",\"roomid\":\"" + roomid + "\",\"role\":6,\"isVisitor\":false,\"token\":\"" + token + "\",\"ua\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\"}}";
var bs = Encoding.Default.GetBytes(data);
await _webSocket.SendAsync(new ArraySegment<byte>(bs), WebSocketMessageType.Text, true, CancellationToken.None);
//{"msg_id":3,"client_time":1666196718270,"type":"Ping","data":{}} 心跳包內(nèi)容
//{"msg_id":2,"client_time":1666196713852,"type":"Bili","data":{"text":"6666666666666666666666666666666666666"}} 發(fā)送彈幕包 內(nèi)容
Console.WriteLine("Send Hello");
}
catch (Exception ex)
{
Console.WriteLine($"鏈接websocket:[] 失敗", ex.Message);
}
}
private static void Receive(object obj)
{
CancellationTokenSource ts = obj as CancellationTokenSource;
byte[] bs = new byte[1024];
while (!ts.Token.IsCancellationRequested)
{
try
{
ArraySegment<byte> buff = new ArraySegment<byte>(bs, 0, bs.Length);
Task<WebSocketReceiveResult> res = _webSocket.ReceiveAsync(buff, ts.Token);
if (ts.Token.IsCancellationRequested)
{
return;
}
if (WebSocketCloseStatus.NormalClosure == res.Result.CloseStatus)
{
Console.WriteLine($"websocket:與服務(wù)器斷開(kāi)鏈接:{res.Result.CloseStatus} --> Desc :{res.Result.CloseStatusDescription}");
ts.Cancel();
return;
}
string strData = Encoding.UTF8.GetString(bs, 0, res.Result.Count);
Console.WriteLine("收到消息=>" + strData);
}
catch (Exception ex)
{
Console.WriteLine("解析或執(zhí)行 websocket:命令失敗", ex);
}
}
}
image.png
代碼一目了然 大家可以自己試試
如果不是用c# 大家用自己會(huì)的語(yǔ)言實(shí)現(xiàn)即可 代碼格式基本都差不多