C# 抖音短视频 无水印解析 原视频下载(超详细)

1,216 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

效果图:请添加图片描述

前言: 观看一些视频时,看见喜欢的想保存下来,但是又有一些烦人的水印,有一些还干脆不给保存,于是就有了本文章


接口:

www.iesdouyin.com/web/api/v2/… 重定向到视频id

解析

分析链接:

3.30 ZZz:/ 艾特世界上最可爱的女孩子来看这束浪漫的玫瑰云。%治愈系风景 v.douyin.com/RvBhSpf/ 複制此链接,答開Dou音搜索,直接觀kan视pin!

提取其中的超链接

v.douyin.com/RvBhSpf/

很明显这是一个短链接,必会重定向

然后到浏览器访问分析

浏览器重定向:

什么是重定向: 就是就是一个链接的跳转,

例:访问a a带你跳到了b 就是一个简单的跳转链接 请添加图片描述

到浏览器访问后发现重定向到了一个长链接 然后又重定向到了一个 短链接 也就是 他的官网 显然这不是视频的地址

打开浏览器的开发者模式(F12) 然后重新打开 请添加图片描述

请求 URL: v.douyin.com/RvBhSpf/ 请求方法: GET 状态代码: 302 远程地址: 183.61.241.231:443 引用站点策略: no-referrer-when-downgrade

可以看见状态码是 302 也就是链接被重定向过

重定向后链接: 请添加图片描述 这个才是视频的地址

www.iesdouyin.com/share/video…

访问还是会跳到 他的官网

浏览器切换为 手机模式 请添加图片描述 然后重新访问 请添加图片描述发现链接不在跳转

获取无水印地址: 请添加图片描述 这里发现了一个 可以直接保存的 无水印链接 请添加图片描述 经过几个视频的分析 发现是不规则链接 ...分析不了 可能是我技术原因(新手)... 请添加图片描述 于是加放弃了这个方法

这里发现了一个接口 访问后 里就有一个无水印的链接 请添加图片描述 直接访问链接

www.iesdouyin.com/web/api/v2/…

请添加图片描述 可以确定 里面包含了 视频作者的信息 和 使用的背景音乐 头像等....

但是数据 太乱了 使用JS解析 在线解析JS

请添加图片描述 一目了然 分析的数据: 请添加图片描述 作品信息: 发现 "item_list": 里就是他的作品的信息

视频ID:

"aweme_id":"7037464280307879201",

视频文案:

"desc":"艾特世界上最可爱的女孩子来看这束浪漫的玫瑰云。#治愈系风景 ",

还有其他信息等自行测试 ...

无水印视频点地址: 发现这里是他的 背景音乐 打开就可以保存 请添加图片描述 这就是的无水印链接 请添加图片描述 这是视频封面链接 请添加图片描述


编写代码

重定向后地址:

 HttpWebRequest beg = (HttpWebRequest)WebRequest.Create(richTextBox1.Text);
                beg.Method = "GET";

                beg.AllowAutoRedirect = false;             
                WebResponse response = beg.GetResponse();
                string url = response.Headers["Location"];

重定向提取视频ID: 这就是视频的id 这个链接 就是短链接重定向后的 请添加图片描述

  int n = url.IndexOf("video/");
      url = url.Substring(n + 6, 19);

使用接口得到地址: 接口:

www.iesdouyin.com/web/api/v2/… 重定向到视频id

  HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=" + url);
                request.Method = "GET";                       
                request.Timeout = 10000;
                request.AllowAutoRedirect = false;
              

                WebResponse begurl = (WebResponse)request.GetResponse();

                StreamReader reader = new StreamReader(begurl.GetResponseStream(), Encoding.UTF8);
                ss = reader.ReadToEnd();

分割视频地址:

ss = ss.Substring(ss.IndexOf("play_addr"), ss.Length - ss.IndexOf("play_addr"));

                ss = ss.Substring(0, ss.IndexOf("]}"));
                ss = ss.Substring(ss.IndexOf("url_list"), ss.Length - ss.IndexOf("url_list"));

                ss = ss.Substring(ss.IndexOf("["), ss.Length - ss.IndexOf("["));
                ss = ss.Substring(2, ss.Length - 3);
                ss = ss.Replace("playwm", "play");

预览视频:

 DialogResult dr = MessageBox.Show("是否预览视频", "提示", MessageBoxButtons.OKCancel);
                if (dr == DialogResult.OK)
                {
                    try
                    {
                        Process.Start(ss);
                    }
                    catch {
                        richTextBox1.Text = ss;
                        MessageBox.Show("调用浏览器失败,请手动查看");
                    
                    }

保存视频:

try
            {

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "请选择要保存的路径";
                sfd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
                sfd.Filter = "视频文件|*.mp4|视频文件|*.avi|所有文件|*.*";
                sfd.ShowDialog();
                //获得保存文件的路径
                string path = sfd.FileName;

                HttpWebRequest beg = (HttpWebRequest)WebRequest.Create(ss);
                HttpWebResponse fh = (HttpWebResponse)beg.GetResponse();
                FileStream file = new FileStream(sfd.FileName, FileMode.Create);
                fh.GetResponseStream().CopyTo(file);

            }
            catch { }

完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 抖音下载
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
        {
            richTextBox1.Text = e.LinkText;
           
        }
        string ss;
        private void button1_Click(object sender, EventArgs e)
        {

            try
            {
                HttpWebRequest beg = (HttpWebRequest)WebRequest.Create(richTextBox1.Text);
                beg.Method = "GET";

                beg.AllowAutoRedirect = false;
                beg.Headers.Add("Cookie:");
                beg.UserAgent = "ua";
                WebResponse response = beg.GetResponse();
                string url = response.Headers["Location"];

                int n = url.IndexOf("video/");
                url = url.Substring(n + 6, 19);

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=" + url);
                request.Method = "GET";            
                request.Accept = "*/*";
                request.Timeout = 10000;
                request.AllowAutoRedirect = false;
                request.UserAgent = "ua";

                WebResponse begurl = (WebResponse)request.GetResponse();

                StreamReader reader = new StreamReader(begurl.GetResponseStream(), Encoding.UTF8);
                ss = reader.ReadToEnd();

                ss = ss.Substring(ss.IndexOf("play_addr"), ss.Length - ss.IndexOf("play_addr"));

                ss = ss.Substring(0, ss.IndexOf("]}"));
                ss = ss.Substring(ss.IndexOf("url_list"), ss.Length - ss.IndexOf("url_list"));

                ss = ss.Substring(ss.IndexOf("["), ss.Length - ss.IndexOf("["));
                ss = ss.Substring(2, ss.Length - 3);
                ss = ss.Replace("playwm", "play");

                button2.Visible = true;
                DialogResult dr = MessageBox.Show("是否预览视频", "提示", MessageBoxButtons.OKCancel);
                if (dr == DialogResult.OK)
                {
                    try
                    {
                        Process.Start(ss);
                    }
                    catch {
                        richTextBox1.Text = ss;
                        MessageBox.Show("调用浏览器失败,请手动查看");
                    
                    }
                }

              



            }

            catch
            {
                MessageBox.Show("检测网络,或链接是否正确,不包含中文");

            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "请选择要保存的路径";
                sfd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
                sfd.Filter = "视频文件|*.mp4|视频文件|*.avi|所有文件|*.*";
                sfd.ShowDialog();
                //获得保存文件的路径
                string path = sfd.FileName;

                HttpWebRequest beg = (HttpWebRequest)WebRequest.Create(ss);
                HttpWebResponse fh = (HttpWebResponse)beg.GetResponse();
                FileStream file = new FileStream(sfd.FileName, FileMode.Create);
                fh.GetResponseStream().CopyTo(file);

            }
            catch { }

        }
    }
}

纯手打,点个赞呗~