Heim > Java > JavaBase > Hauptteil

Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

coldplay.xixi
Freigeben: 2020-11-27 17:02:30
nach vorne
12113 Leute haben es durchsucht

Verwandte Lernempfehlungen: Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

Java-GrundlagenJede Ursache muss ihre Wirkung haben

Lassen Sie mich Ihnen sagen, warum ich ein Douyin-Video-Wasserzeichen-Entfernungstool erstellen möchte Sandskulpturen-Freundin. Sie hat mich tatsächlich gerade getroffen~Eines Abends sah sie ein sehr lehrreiches Video über Douyin, „Ein Mann, der seine Frau liebt, sollte die ganze Hausarbeit machen“, und dann wollte sie es herunterladen das Video, das sie mit der Gruppe ihrer Schwestern geteilt hat, um Erfahrungen zum Thema Controlling Husband auszutauschen.

Aber jeder weiß, dass die von Douyin heruntergeladenen Videos mit einem Wasserzeichen versehen sind. Wenn das nicht möglich ist, dann suchen Sie nach einem Tool zum Entfernen von Wasserzeichen Entweder kann es nicht heruntergeladen werden und das Lächeln auf dem Gesicht des Meisters verschwindet allmählich.

Ich habe nebenbei gescherzt: Es ist gar nicht so schwer, wie wäre es, wenn ich eins für dich mache! „Geht es dir gut?“ Dann warf er einen verächtlichen Blick zu. 教育意义 的视频,“男人疼媳妇就该承包全部家务活”,然后它就想把视频下载下来,分享到她的姐妹群交流 驭夫 心得。

可是大家都知道抖音下载的视频是带水印,作为一个重度强迫症选手这是不被允许的,没办法那就找找有没有去水印工具吧,找了一圈要不就是收费,要么下载不下来,主上脸上的笑容也在逐渐消失。

我在边上调侃了一句:也没多难,要不我给你做一个!“你行吗?” 然后投来了一个不屑的眼神。

Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

哎呀!本来就开个玩笑,居然说我不行,这就不能忍了,我得证明给你看看!男人嘛,就受不了这话

先看下我做的去水印工具线上预览效果: 47.93.6.5:8888/index

Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

下边和大家一起分析下做这个去水印工具的思路,很多人乍一听 去水印 ,下意识的觉得是一种什么牛比的算法,其实这是一种假象~

刨根问底

虽说要争口气,可刚开始做的时候我也真是一脸懵逼,因为根本不知道该从哪入手,去水印什么原理啊?难不成我还要写个算法?

找了一个抖音视频的分享链接,一点点分析,不难发现这是个经过处理的短链接,那这个短链接一定会重定向到真实的视频地址 URL

https://v.douyin.com/JSkuhE4/
Nach dem Login kopieren

浏览器中输入短链接得到了下边这个 URL ,以我的经验判断URL中的 6820792802394262795 很有可能是视频的唯一ID,而唯一ID通常用来作为获取详情接口的入参,哎嘿~ 好像有点头绪了。

https://www.iesdouyin.com/share/video/6820792802394262795/
Nach dem Login kopieren

Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

赶紧祭出 F12 大法打开控制台,在众多请求中发现这么一个接口,它居然用到了上边的唯一ID。

https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6820792802394262795
Nach dem Login kopieren


更惊喜的是接口返回的数据那叫一个详细,作者信息、音频地址、视频地址、平面图都有。但唯独没有无水印的视频 URL

只找到一个有水印的视频 URL,有点小失落,我又看了看这个地址,发现 wm 和我项目名有点像啊,不就是watermark 水印的缩写吗?

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f030000bqk54kg2saj3lso3oh20&ratio=720p&line=0
Nach dem Login kopieren


好像又看到了一丝希望,我赶紧修改URL在浏览器中又试了一下,果然真的没水印了。

https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200f030000bqk54kg2saj3lso3oh20&ratio=720p&line=0
Nach dem Login kopieren

Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen
到这才发现抖音去水印 简单的让人感动,哈哈哈~

身体力行

既然原理都清晰了,剩下的就是一步一步实现功能了,原理看着挺简单的,但实现中还是遇到一点点小坑,浪费了不少时间。

实现过程只有简单的三步:

  • 1、从输入框中过滤取出视频短连接
  • 2、短连接传到后端解析出无水印的视频 URL
  • 3、视频 URL传递给前端预览、下载

后端并没有什么难度,一步一步按照上边分析的流程解析真实视频 URL

Bildbeschreibung hier einfügen🎜🎜Ups! Es war nur ein Scherz, aber du hast tatsächlich gesagt, dass ich nicht gut bin. Das muss ich dir beweisen. Männer, ich kann das nicht ertragen 🎜
🎜 Schauen Sie sich zunächst den Online-Vorschaueffekt des Tools zum Entfernen von Wasserzeichen an, das ich erstellt habe: 47.93.6.5:8888/index🎜
🎜Vorschau der Wasserzeichenentfernung🎜🎜 Lassen Sie uns die Idee dieser Wasserzeichenentfernung analysieren Viele Leute haben das gerade bemerkt. Als ich Wasserzeichenentfernung hörte, dachte ich unbewusst, es sei eine Art großartiger Algorithmus ~ 🎜🎜🎜🎜Ich habe mir mehr gewünscht Informationen🎜🎜Obwohl ich mit Ihnen streiten muss, war ich wirklich verwirrt, als ich damit anfing, weil ich nicht wusste, wo ich anfangen soll. Was ist das Prinzip der Wasserzeichenentfernung? Ist es möglich, dass ich noch einen Algorithmus schreiben muss? 🎜🎜Ich habe einen Freigabelink für ein Douyin-Video gefunden. Nach einer kleinen Analyse war es nicht schwer herauszufinden, dass es sich um einen verarbeiteten Kurzlink handelte. Dann würde dieser Kurzlink definitiv zur echten Videoadresse URLweiterleiten >. 🎜
/**
* @param url
* @author xiaofu
* @description 获取当前链接重定向后的url
* @date 2020/9/15 12:43
*/public static String getLocation(String url) {
        try {
            URL serverUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();
            conn.setRequestMethod("GET");
            conn.setInstanceFollowRedirects(false);
            conn.setRequestProperty("User-agent", "ua");//模拟手机连接
            conn.connect();
            String location = conn.getHeaderField("Location");
            return location;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Geben Sie den kurzen Link in den Browser ein und erhalten Sie die URL unten. Aufgrund meiner Erfahrung halte ich das für 6820792802394262795 in URL wahrscheinlich ein Video Die eindeutige ID, und die eindeutige ID wird normalerweise als Eingabeparameter der Schnittstelle zum Abrufen von Details verwendet. Hehe ~ Ich habe anscheinend einige Hinweise. 🎜
/**
 * @author xiaofu-公众号:程序员内点事
 * @description 抖音无水印视频下载
 * @date 2020/9/15 18:44
 */@Slf4j
@Controllerpublic class DYController {
    public static String DOU_YIN_BASE_URL = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=";
    /**
     * @param url
     * @author xiaofu
     * @description 解析抖音无水印视频
     * @date 2020/9/15 12:43
     */
    @RequestMapping("/parseVideoUrl")
    @ResponseBody    public String parseVideoUrl(@RequestBody String url) throws Exception {
        DYDto dyDto = new DYDto();
        try {
            url = URLDecoder.decode(url).replace("url=", "");
            /**
             * 1、短连接重定向后的 URL
             */
            String redirectUrl = CommonUtils.getLocation(url);

            /**
             * 2、拿到视频对应的 ItemId
             */
            String videoUrl = "";
            String musicUrl = "";
            String videoPic = "";
            String desc = "";
            if (!StringUtils.isEmpty(redirectUrl)) {
                /**
                 * 3、用 ItemId 拿视频的详细信息,包括无水印视频url
                 */
                String itemId = CommonUtils.matchNo(redirectUrl);
                StringBuilder sb = new StringBuilder();
                sb.append(DOU_YIN_BASE_URL).append(itemId);
                String videoResult = CommonUtils.httpGet(sb.toString());
                DYResult dyResult = JSON.parseObject(videoResult, DYResult.class);
                /**
                 * 4、无水印视频 url
                 */
                videoUrl = dyResult.getItem_list().get(0)
                        .getVideo().getPlay_addr().getUrl_list().get(0)
                        .replace("playwm", "play");
                String videoRedirectUrl = CommonUtils.getLocation(videoUrl);
                dyDto.setVideoUrl(videoRedirectUrl);
                /**
                 * 5、音频 url
                 */
                musicUrl = dyResult.getItem_list().get(0).getMusic().getPlay_url().getUri();
                dyDto.setMusicUrl(musicUrl);
                /**
                 * 6、封面
                 */
                videoPic = dyResult.getItem_list().get(0).getVideo().getDynamic_cover().getUrl_list().get(0);
                dyDto.setVideoPic(videoPic);
                /**
                 * 7、视频文案
                 */
                desc = dyResult.getItem_list().get(0).getDesc();
                dyDto.setDesc(desc);
            }
        } catch (Exception e) {
            log.error("去水印异常 {}", e);
        }
        return JSON.toJSONString(dyDto);
    }}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Link mit Wasserzeichen🎜🎜Beeilen Sie sich F12 Dafa öffnete die Konsole und fand unter vielen Anfragen eine solche Schnittstelle. Sie verwendete tatsächlich die obige eindeutige ID. 🎜
$.ajax({
    url: '/parseVideoUrl',
    type: 'POST',
    data: {"url": link},
    success: function (data) {
        $('.qsy-submit').attr('disabled', false);
        try {
            var rows = JSON.parse(data);
            layer.close(index);
            layer.open({
                type: 1,
                title: false,
                closeBtn: 1,
                shadeClose: true,
                skin: 'yourclass',
                content: `<p></p><p></p><p><a><button>下载视频</button></a></p><p><textarea>${rows['videoUrl']}</textarea><button>复制链接</button></p><p><a><button>下载音频</button></a></p><video><source> </source></video>`
                //content: `<video><source> </source></video>`
            });

        } catch (error) {
            layer.alert('错误信息:' + error, {
                title: '异常',
                skin: 'layui-layer-lan',
                closeBtn: 0,
                anim: 4 //动画类型
            });
            return false;
        }
    },
    error: function (err) {
        console.log(err);
        layer.close(index);
        $('.qsy-submit').attr('disabled', false);
    },
    done: function () {
        layer.close(index);
    }})})
Nach dem Login kopieren
Nach dem Login kopieren
🎜
Was noch überraschender ist die Schnittstelle Rückkehr Die Daten werden detailliert aufgerufen, einschließlich Autoreninformationen, Audioadresse, Videoadresse und Grundriss. Aber es gibt kein Video ohne Wasserzeichen URL.

Nur eines mit Wasserzeichen gefunden Die URL des Videos war etwas enttäuschend. Ich schaute mir die Adresse noch einmal an und stellte fest, dass wm dem Namen meines Projekts ähnelte. Es war nur watermark. Die Abkürzung für Wasserzeichen? 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> &lt;!-- 解决访问视频url 请求403异常 --&gt;  &lt;meta&gt;</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜<img src="https://img.php.cn/upload/article/000/000/052/f753acc2c65475f5e8ea8e4bbd4e253f-5.png" alt=""><br>Es scheint, als gäbe es noch einen anderen Hoffnungsschimmer, ich habe schnell die <code>URL geändert und es noch einmal im Browser versucht, und tatsächlich war da wirklich kein Wasserzeichen. 🎜rrreee🎜Kein Wasserzeichen-Link
Das war's Ich habe festgestellt, dass die Wasserzeichenentfernung von Douyin so einfach und berührend ist, hahaha~🎜🎜🎜🎜Üben Sie es selbst🎜🎜Jetzt, da die Prinzipien klar sind, müssen Sie nur noch die Funktion Schritt für Schritt implementieren Scheint recht einfach zu sein, aber wir sind bei der Implementierung auf einige kleine Fallstricke gestoßen und haben viel Zeit verschwendet. 🎜🎜Der Implementierungsprozess umfasst nur drei einfache Schritte: 🎜
  • 1. Filtern Sie den kurzen Videolink aus dem Eingabefeld
  • 2. Übergeben Sie den kurzen Link an das Backend, um ihn zu analysieren das Video ohne WasserzeichenURL
  • 3. Die Video-URL wird zur Vorschau und zum Download an das Frontend übergeben
  • 🎜Das Backend ist nicht schwierig, folgen Sie Schritt für Schritt. Der oben analysierte Prozess reicht aus, um die echte Video-URL zu analysieren. 🎜

    注意 :我们想得到的地址URL,都是当前短连接URL 经过重定向后的URL。而抖音有些链接是不支持浏览器访问的,所以要手动修改 User-agent 属性模拟移动端访问才可以。

    /**
    * @param url
    * @author xiaofu
    * @description 获取当前链接重定向后的url
    * @date 2020/9/15 12:43
    */public static String getLocation(String url) {
            try {
                URL serverUrl = new URL(url);
                HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();
                conn.setRequestMethod("GET");
                conn.setInstanceFollowRedirects(false);
                conn.setRequestProperty("User-agent", "ua");//模拟手机连接
                conn.connect();
                String location = conn.getHeaderField("Location");
                return location;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }
    Nach dem Login kopieren
    Nach dem Login kopieren

    下边是完整的后端实现,可以看到代码量非常的少。

    /**
     * @author xiaofu-公众号:程序员内点事
     * @description 抖音无水印视频下载
     * @date 2020/9/15 18:44
     */@Slf4j
    @Controllerpublic class DYController {
        public static String DOU_YIN_BASE_URL = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=";
        /**
         * @param url
         * @author xiaofu
         * @description 解析抖音无水印视频
         * @date 2020/9/15 12:43
         */
        @RequestMapping("/parseVideoUrl")
        @ResponseBody    public String parseVideoUrl(@RequestBody String url) throws Exception {
            DYDto dyDto = new DYDto();
            try {
                url = URLDecoder.decode(url).replace("url=", "");
                /**
                 * 1、短连接重定向后的 URL
                 */
                String redirectUrl = CommonUtils.getLocation(url);
    
                /**
                 * 2、拿到视频对应的 ItemId
                 */
                String videoUrl = "";
                String musicUrl = "";
                String videoPic = "";
                String desc = "";
                if (!StringUtils.isEmpty(redirectUrl)) {
                    /**
                     * 3、用 ItemId 拿视频的详细信息,包括无水印视频url
                     */
                    String itemId = CommonUtils.matchNo(redirectUrl);
                    StringBuilder sb = new StringBuilder();
                    sb.append(DOU_YIN_BASE_URL).append(itemId);
                    String videoResult = CommonUtils.httpGet(sb.toString());
                    DYResult dyResult = JSON.parseObject(videoResult, DYResult.class);
                    /**
                     * 4、无水印视频 url
                     */
                    videoUrl = dyResult.getItem_list().get(0)
                            .getVideo().getPlay_addr().getUrl_list().get(0)
                            .replace("playwm", "play");
                    String videoRedirectUrl = CommonUtils.getLocation(videoUrl);
                    dyDto.setVideoUrl(videoRedirectUrl);
                    /**
                     * 5、音频 url
                     */
                    musicUrl = dyResult.getItem_list().get(0).getMusic().getPlay_url().getUri();
                    dyDto.setMusicUrl(musicUrl);
                    /**
                     * 6、封面
                     */
                    videoPic = dyResult.getItem_list().get(0).getVideo().getDynamic_cover().getUrl_list().get(0);
                    dyDto.setVideoPic(videoPic);
                    /**
                     * 7、视频文案
                     */
                    desc = dyResult.getItem_list().get(0).getDesc();
                    dyDto.setDesc(desc);
                }
            } catch (Exception e) {
                log.error("去水印异常 {}", e);
            }
            return JSON.toJSONString(dyDto);
        }}
    Nach dem Login kopieren
    Nach dem Login kopieren

    前端实现也比较简单,拿到后端解析出来的视频URL 预览播放、下载就OK了。

    Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

    为快速实现我用了老古董JQuery,我这个年纪的人对它感情还是很深厚的,UI 框架用的 layer.js。源码后边会分享给大家,就不全贴出来了。

    $.ajax({
        url: '/parseVideoUrl',
        type: 'POST',
        data: {"url": link},
        success: function (data) {
            $('.qsy-submit').attr('disabled', false);
            try {
                var rows = JSON.parse(data);
                layer.close(index);
                layer.open({
                    type: 1,
                    title: false,
                    closeBtn: 1,
                    shadeClose: true,
                    skin: 'yourclass',
                    content: `<p></p><p></p><p><a><button>下载视频</button></a></p><p><textarea>${rows['videoUrl']}</textarea><button>复制链接</button></p><p><a><button>下载音频</button></a></p><video><source> </source></video>`
                    //content: `<video><source> </source></video>`
                });
    
            } catch (error) {
                layer.alert('错误信息:' + error, {
                    title: '异常',
                    skin: 'layui-layer-lan',
                    closeBtn: 0,
                    anim: 4 //动画类型
                });
                return false;
            }
        },
        error: function (err) {
            console.log(err);
            layer.close(index);
            $('.qsy-submit').attr('disabled', false);
        },
        done: function () {
            layer.close(index);
        }})})
    Nach dem Login kopieren
    Nach dem Login kopieren

    注意:我们在自己的网站中引用其它网站的资源URL,由于不在同一个域名下referrer 不同,通常会遇到三方网站的防盗链拦截,所以要想正常访问三方资源,必须要隐藏请求的referrer,页面中设置如下参数。

     <!-- 解决访问视频url 请求403异常 -->
     <meta>
    Nach dem Login kopieren
    Nach dem Login kopieren

    还简单做了下移动端适配,样式看着还可以,但是功能使用起来有点差强人意,后边在做优化了。

    Java-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen

    总结

    很多东西就是这样,没认真研究之前总感觉深不可测,可一旦接触到技术的本质,又开始笑自己之前好蠢,懂与不懂有时就查那么一层窗户纸。

    Das obige ist der detaillierte Inhalt vonJava-Programmierer schreiben von Hand ein Tool zum Entfernen von Douyin-Video-Wasserzeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:learnku.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!