要知道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的原因。如果不加入,獲取的彈幕文件就是這樣子的(具體原因自己查資料):
最后結果
至於為什么沒有全部的代碼,因為現在寫的太亂了,等整理之后再發吧~