源碼下載:DEMO下載
首先我們可以看到手機上的APP播放的視頻是沒有水印的,如下:
這樣我們可以用Charles之類的工具抓取該地址,主要觀看他的前綴地址部分(由於配置比較麻煩,大家可以自行配置,參看https://www.jianshu.com/p/c422344798c5,手機上的應用都可以抓取)
會發現播放地址是這樣的:https://aweme.snssdk.com/aweme/v1/play/........
第二步:點擊分享,復制地址,得到鏈接 https://v.douyin.com/7SUFkb/
第三步:我們使用谷歌瀏覽器訪問(方便調試)
第四步:我們右鍵查看源碼,會發現下圖的地址
第五步:我們切換瀏覽器為手機模式,然后在看源碼變化(我們會拿到第一步播放地址的關鍵部分參數),這一步只是為了驗證PC瀏覽器模式和手機瀏覽模式的源碼是不一樣的。
第六步:在一次驗證,我們訪問第四步拿到地址(https://aweme.snssdk.com/aweme/v1/playwm/?s_vid=93f1b41336a8b7a442dbf1c29c6bbc562f1d6ac08e2f68576e6a34ac31a6790e5502ca4913dc07a83eabc3d41484e8ac7f43878815a424e99ceca999c77d5265&line=0),是可以得到視頻源的,但是有水印,如下:
第七步:對比第一步(手機)和第四步(PC)拿到的地址,發現其地址playwm和play的變化,然后替換一下訪問 https://aweme.snssdk.com/aweme/v1/play/?s_vid=93f1b41336a8b7a442dbf1c29c6bbc562f1d6ac08e2f68576e6a34ac31a6790e5502ca4913dc07a83eabc3d41484e8ac7f43878815a424e99ceca999c77d5265&line=0
得到無水印地址(提示:經驗證這里得用瀏覽器的手機模式,pc模式無法訪問)
經過上面幾步,從第二步開始,抖音地址就經過了幾次重定向才拿到真實的數據源地址
下面是C#實現的代碼:
/// <summary> /// 抖音 /// </summary> /// <param name="url"></param> /// <returns></returns> public string DouYin(string url) { var webHtml = VideoHelper.GetWebContent(url, 0); var webArr1 = Regex.Split(webHtml, "playAddr: \"", RegexOptions.IgnoreCase); var webArr2 = Regex.Split(webArr1[1], "\",", RegexOptions.IgnoreCase); var playAddr = webArr2[0].Replace("playwm", "play"); var payUrl = VideoHelper.GetMapUrl(playAddr, 1); return payUrl; }
/// <summary> /// 獲取頁面html /// </summary> /// <param name="Url">頁面路徑</param> /// <param name="type">瀏覽器類型(0PC/1手機)</param> /// <returns></returns> public static string GetWebContent(string Url, int type = 0) { string strResult = ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); //聲明一個HttpWebRequest請求 request.Method = "POST"; var UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2"; if (type > 0) {//模擬手機瀏覽器 UserAgent = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; } request.UserAgent = UserAgent; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")); strResult = sr.ReadToEnd(); response.Close(); } catch { Console.WriteLine("出錯"); } return strResult; } /// <summary> /// 獲取重定向地址 /// </summary> /// <param name="Url">原地址</param> /// <param name="type">瀏覽器類型(0PC/1手機)</param> /// <returns></returns> public static string GetMapUrl(string Url, int type = 0) { string strResult = ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; var UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2"; if (type > 0) {//模擬手機瀏覽器 UserAgent = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; } request.UserAgent = UserAgent; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; using (WebResponse response = request.GetResponse()) { strResult = response.Headers["Location"]; //重定向地址 } } catch { Console.WriteLine("出錯"); } return strResult; }
源碼下載:DEMO下載