C# B站的弹幕提取

要知道B站的弹幕位置

如果只考虑视频,B站的链接格式为:https://www.bilibili.com/video/av34042815。把av后面的数字看做是唯一标记即可。

既然能够把弹幕加载出来,那说明一定有相关的弹幕接口。这个时候需要万能的F12了~~

于是就发现了这样一个链接:https://api.bilibili.com/x/v1/dm/list.so?oid=59624026。把cid后面的数字也看做是标记吧。当然这个接口肯定不是一直不变的,可能在不久之后就变了。

弹幕文件如何匹配

我们的重点是那这个数字到底对应https://www.bilibili.com/video/av34042815的哪个元素呢?

查看源码,找到了这样一列。当然这查找方式也不可能是唯一的。下面两个图说明番剧和普通视频的cid还是有不同之处的。(https://www.bilibili.com/video/av34566552)

于是我决定写了两个匹配

Match match = Regex.Match(input, "cid=(\\d+)");
string result = "";
if (match.Success)
{
    result = match.Groups[1].Value;
}
else
{
    Match match1 = Regex.Match(input, "\"cid\":(\\d+)");
    result = match1.Groups[1].Value;
}

其实还需要两个链接

第一个str对应av号码,第二个arg对应cid号。cid号的查询已经在上面给出了。

扫描二维码关注公众号,回复: 3736106 查看本文章
string requestUri = string.Format("https://www.bilibili.com/video/{0}", str);
string requestUri = string.Format("https://api.bilibili.com/x/v1/dm/list.so?oid={0}", arg);

现在我们需要av号的过滤,再来一个规则匹配

Match match = Regex.Match(str, "av\\d+", RegexOptions.IgnoreCase);
if (!match.Success)
{
    throw new ArgumentException("地址格式不合法");
}

怎么去提取弹幕

使用HttpClient可能会简单一点点。

var httpClient = new HttpClient(new HttpClientHandler
{
    Proxy = null,
    AutomaticDecompression = DecompressionMethods.GZip,
    AllowAutoRedirect = true,
});
var httpClient = new HttpClient(new HttpClientHandler
{
    Proxy = null,
    AutomaticDecompression = DecompressionMethods.Deflate,
    AllowAutoRedirect = true,
});

为什么要使用两个基本相同的代码,仅仅只是 DecompressionMethods 不同而已。

这个时候需要看一看F12中的这个东西了

里面这个Headers我们需要带入,不然可能会出现430错误

httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");

其实上面也有另外的写法

httpClient.DefaultRequestHeaders.Add();

接下来就要解释为什么要加入 DecompressionMethods.Deflate了

因为gzip和deflate的原因。如果不加入,获取的弹幕文件就是这样子的(具体原因自己查资料):

最后结果

至于为什么没有全部的代码,因为现在写的太乱了,等整理之后再发吧~

猜你喜欢

转载自www.cnblogs.com/yinghualuowu/p/9855595.html