各大短視頻平台的做法幾乎都是一樣,有兩個接口或兩類型播放視頻地址,就是無水印、帶水印的視頻,我們的目的很清楚,就是分析平台的頁面源碼,找出沒有帶水印的視頻地址,然后下載保存下來,就這么直接,下面說說我是如何拿到無水印的視頻地址的。
1、復制抖音“分享鏈接”。
隨便打開一個抖音視頻,例如:
2、將復制的地址在瀏覽器(我用的是谷歌)打開,你會看到一個重定向跳轉地址。
3、按F12打開調試窗口,切換到“NETWORK”=》“Preview”標簽欄,按F5刷新頁面,點擊我框框的這個地址。
4、展開請求的響應數據(json格式的),找到url_list節點,這個就是視頻地址。
5、復制視頻地址,然后將playwm修改為play,其他不變。
為什么要改為play呢?怎么知道的呢?這個大家可以復制抖音創作者的鏈接按照統一的方法,可以看到作品列表的地址,里面就是沒有水印的地址,這里就不展開詳細操作步驟了。
6、將修改后的地址再次打開,這個視頻就是沒有水印的視頻,可以鼠標保存到本地。
注意,這樣同樣也做了一次重定向跳轉,重定向地址才是最終的無水印視頻地址。
整個流程就完了。
這樣在PC上通過手工方式分析獲取的視頻,如果直接在手機上操作就做不到了。那么,程序上如何實現自動化獲取並且保存呢?我想是程序員都應該知道這么實現,下面說說我的實現(簡要代碼C#):
1、輸入分享鏈接,獲取重定向地址。
1 /// <summary> 2 /// 獲取重定向URL 3 /// </summary> 4 /// <returns></returns> 5 private string GetRedirectUrl(string url) 6 { 7 HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url); 8 myRequest.UserAgent = UserAgent; 9 myRequest.Referer = referer; 10 myRequest.AllowAutoRedirect = false; 11 HttpWebResponse myResponse = null; 12 13 try 14 { 15 myResponse = (HttpWebResponse)myRequest.GetResponse(); 16 } 17 catch (WebException ex) 18 { 19 if (ex.Message.Contains("302")) 20 { 21 myResponse = (HttpWebResponse)ex.Response; 22 } 23 } 24 25 if (myResponse == null) 26 { 27 return null; 28 } 29 30 var redirectUrl = string.Empty; 31 if (myResponse.Headers["Location"] != null) 32 { 33 redirectUrl = myResponse.Headers["Location"]; 34 } 35 36 return redirectUrl; 37 }
2、從頁面提取視頻ID。
1 /// <summary> 2 /// 獲取無水印視頻路徑 3 /// </summary> 4 /// <returns></returns> 5 public override Result GetResult() 6 { 7 if (!Uri.IsWellFormedUriString(this.Url, UriKind.Absolute)) return new Result("參數有誤"); 8 var redirectUrl = GetRedirectUrl(Url); 9 if (string.IsNullOrWhiteSpace(redirectUrl)) return new Result("地址有誤"); 10 Regex regex = new Regex("share/video/(?<ItemID>.+?)/", RegexOptions.IgnoreCase); 11 12 if (regex.IsMatch(redirectUrl)) 13 { 14 var itemId = regex.Match(redirectUrl).Groups["ItemID"].Value; 15 var itemUrl = $"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={itemId}"; 16 17 WebClient client = new WebClient(); 18 client.Headers[HttpRequestHeader.UserAgent] = UserAgent; 19 client.Headers[HttpRequestHeader.Referer] = referer; 20 21 var content = client.DownloadString(itemUrl); 22 var json = (JObject)JsonConvert.DeserializeObject(content); 23 var status = json["status_code"].Value<int>(); 24 if (status != 0) 25 { 26 return new Result("獲取數據失敗"); 27 } 28 else 29 { 30 var videoUrl = json.SelectToken("item_list[0].video.play_addr.url_list[0]"); 31 if (videoUrl != null && !string.IsNullOrWhiteSpace((string)videoUrl)) 32 { 33 var playUrl = ((string)videoUrl).Replace("playwm", "play"); 34 35 Result result = new Result(); 36 result.Success = true; 37 result.Message = "解析成功"; 38 result.Data = $"{GetRedirectUrl(playUrl)}"; 39 var resultUrl = GetRedirectUrl(playUrl); 40 resultUrl = resultUrl.Replace("http:", "https:"); 41 result.Data = $"{resultUrl}"; 42 43 return result; 44 } 45 } 46 } 47 48 return new Result("解析失敗"); 49 }
3、下載播放視頻的頁面內容(JSON)。
1 var itemId = regex.Match(redirectUrl).Groups["ItemID"].Value; 2 var itemUrl = $"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={itemId}"; 3 4 WebClient client = new WebClient(); 5 client.Headers[HttpRequestHeader.UserAgent] = UserAgent; 6 client.Headers[HttpRequestHeader.Referer] = referer; 7 8 var content = client.DownloadString(itemUrl);
4、分析提取視頻播放鏈接,將有水印的地址轉為無水印的地址。
1 var videoUrl = json.SelectToken("item_list[0].video.play_addr.url_list[0]"); 2 if (videoUrl != null && !string.IsNullOrWhiteSpace((string)videoUrl)) 3 { 4 var playUrl = ((string)videoUrl).Replace("playwm", "play"); 5 }
5、程序實現保存視頻文件。
我這里是在小程序里面實現的,用到小程序的API函數:wx.saveVideoToPhotosAlbum,代碼我就不貼了。
大家不一定用微信小程序實現客戶端下載,因為小程序有很多限制,很不方便,可以自己寫APP實現,這樣下載就規避很多限制(主要是域名)。
如果大家有興趣學習研究的可以聯系我,或者搜索小程序“短視頻去水印解析器工具”查看效果。
多寫原創文章,多分享,幫助他人,快樂自己。 歡迎編程界的朋友,一起學習,一起交流。 關注公眾號“程序員之事”獲取更多資源。