版权声明:本文为博主原创文章,转载请注明源地址 https://blog.csdn.net/qq_15505341/article/details/79212070
打开b站,随便点进个直播,打开chrome自带的开发者工具,抓下包
妈耶…这封包还挺多的啊…慢慢的分析一会发现了这个
表面上看好像不是我们想要的,点开数据看了一下(⓿_⓿)
哎没错了就是这个,开撸代码
负责提交post的函数
static string Post()
{
string postString = "";//要发送的数据
byte[] postData = Encoding.UTF8.GetBytes(postString);//编码,尤其是汉字,事先要看下抓取网页的编码方式
string url = @"";//地址
WebClient webClient = new WebClient();
webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可
webClient.Headers.Add("Cookie",
"填抓取到的cookie"
);
byte[] responseData = webClient.UploadData(url, "POST", postData);//得到返回字符流
string srcString = Encoding.UTF8.GetString(responseData);//解码
return srcString;
}
这里,我们主要要修改postString(对应Form Data),url(对应Request URL)这两个变量和 webClient.Headers.Add(“Cookie”,“填抓取到的cookie”);的参数(对应Cookie),把抓取的数据对号入座就行
找到postString
点开刚刚抓到的msg封包,划到最下面,有一个Form Data,再点击一下view source,就能直接复制了!
把这串文本直接复制进刚刚写的代码里,传递给postString
string postString = "roomid=83264&token=&csrf_token=我是图中的马赛克";//要发送的数据
找到url
url在最上面的Genral-Request URL
也是直接复制传递给url
string url = @"http://api.live.bilibili.com/ajax/msg";//地址
找到Cookie
一如既往的复制到代码中
(cookie中可能有登陆信息,所以可耻的打了码(o´・ェ・`o))
webClient.Headers.Add("Cookie",
"可耻的马赛克"
);
好了,修改后的代码是这样子的
static string Post(string room)
{
string postString = "roomid="+room+"&token=&csrf_token=我是图中的马赛克";//要发送的数据
byte[] postData = Encoding.UTF8.GetBytes(postString);//编码,尤其是汉字,事先要看下抓取网页的编码方式
string url = @"http://api.live.bilibili.com/ajax/msg";//地址
WebClient webClient = new WebClient();
webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可
webClient.Headers.Add("Cookie",
"可耻的马赛克"
);
byte[] responseData = webClient.UploadData(url, "POST", postData);//得到返回字符流
string srcString = Encoding.UTF8.GetString(responseData);//解码
return srcString;
}
运行一下
不错,数据出来了,拿在线Unicode转换一下发现确实是弹幕信息,现在开始处理这个又臭又长的字符串
static List<string> GetDanMu(string room)
{
string danmu = Post(room);
List<string> list = new List<string>();
//正则匹配
foreach (Match item in Regex.Matches(danmu, "text\":\".*?\""))
{
//截取字符串,将unicode码转换为中文
list.Add(Regex.Unescape(item.Value.Substring(7, item.Value.Length - 8)));
}
return list;
}
搞定