C# B站的彈幕提取


要知道B站的彈幕位置

如果只考慮視頻,B站的鏈接格式為:https://www.bilibili.com/video/av34042815。把av后面的數字看做是唯一標記即可。

既然能夠把彈幕加載出來,那說明一定有相關的彈幕接口。這個時候需要萬能的F12了~~

於是就發現了這樣一個鏈接:https://api.bilibili.com/x/v1/dm/list.so?oid=59624026。把oid后面的數字也看做是標記吧。當然這個接口肯定不是一直不變的,可能在不久之后就變了。

彈幕文件如何匹配

我們的重點是那這個數字到底對應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號的查詢已經在上面給出了。

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的原因。如果不加入,獲取的彈幕文件就是這樣子的(具體原因自己查資料):

 

最后結果

至於為什么沒有全部的代碼,因為現在寫的太亂了,等整理之后再發吧~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM