抖音视频无水印下载全过程
一、分析加载过程
抖音视频通过分享获取链接如下:示例地址
抖音视频地址
访问时,浏览器调试模式查看加载信息
发现如下加载过程
发现第一次请求分享到链接后获取一个很长的url。请求这个url状态码是302,说明还有跳转。
继续请求这个地址发现返回如下
莫慌。仔细分析发现里边隐藏了原视频的地址。
分析html
html中有个loaderData是个json对象取出来分析可以找到videoInfoRes对象,里边包含了视频的所有信息包括源视频地址,用户名,视频描述,视频id等信息可以拿到以上的地址。 直接访问红框的地址是不行的,需要把playwm替换成paly。最终得到的地址类似下图
然后使用代码直接访问替换后的地址进行数据流下载即可得到无水印的视频。 核心代码如下 string pattern = @"window._ROUTER_DATA =(.*?)"; // 创建 Regex 对象并进行匹配 MatchCollection matches = Regex.Matches(html, pattern, RegexOptions.Singleline); // 输出匹配到的结果 string matchContent = ""; foreach (Match match in matches) { matchContent = match.Value; } matchContent = matchContent.Replace(@"window._ROUTER_DATA =", "").Replace("", ""); string data = HttpUtility.UrlDecode(matchContent, System.Text.Encoding.UTF8); JObject obj = JsonConvert.DeserializeObject(data);
// id = obj["loaderData"]["video_(id)\u002Fpage"]["videoInfoRes"]["item_list"][0]["video"]["play_addr"]["uri"].ToString();
// string videoUrl = string.Format("https://aweme.snssdk.com/aweme/v1/play/?{0}", id);
var videoInfoRes = obj["loaderData"]["video_(id)\u002Fpage"]["videoInfoRes"]["item_list"];
VideoInfo videoInfo = new VideoInfo();
videoInfo.urllst = new List<string>();
// videoInfo.urllst.Add(videoUrl);
videoInfo.desc = obj["loaderData"]["video_(id)\u002Fpage"]["videoInfoRes"]["item_list"][0]["desc"].ToString();
for (int k = 0; k < videoInfoRes.Count(); k++)
{
videoInfo.desc = videoInfoRes[k]["desc"].ToString();
videoInfo.nickName = videoInfoRes[k]["author"]["nickname"].ToString();
videoInfo.sec_uid = videoInfoRes[k]["author"]["sec_uid"].ToString();
var urlLst = videoInfoRes[k]["video"]["play_addr"]["url_list"];
for (int j = 0; j < urlLst.Count(); j++)
{
videoInfo.urllst.Add(HttpUtility.UrlDecode(urlLst[j].ToString().Replace("playwm", "play"), System.Text.Encoding.UTF8));
}
}
return videoInfo;
源码地址:抖音视频下载