成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

java程序員手寫一個(gè)抖音視頻去水印工具

java基礎(chǔ)欄目介紹去水印工具的方法。

java程序員手寫一個(gè)抖音視頻去水印工具

相關(guān)學(xué)習(xí)推薦:java基礎(chǔ)

百因必有果

說一下我為什么要做個(gè)抖音視頻去水印工具,其實(shí)是因?yàn)槲业纳车衽眩尤粍偽襼

有天晚上她在抖音看見一個(gè)非常具有 教育意義 的視頻,“男人疼媳婦就該承包全部家務(wù)活”,然后它就想把視頻下載下來,分享到她的姐妹群交流 馭夫 心得。

可是大家都知道抖音下載的視頻是帶水印,作為一個(gè)重度強(qiáng)迫癥選手這是不被允許的,沒辦法那就找找有沒有去水印工具吧,找了一圈要不就是收費(fèi),要么下載不下來,主上臉上的笑容也在逐漸消失。

我在邊上調(diào)侃了一句:也沒多難,要不我給你做一個(gè)!“你行嗎?” 然后投來了一個(gè)不屑的眼神。

java程序員手寫一個(gè)抖音視頻去水印工具

哎呀!本來就開個(gè)玩笑,居然說我不行,這就不能忍了,我得證明給你看看!男人嘛,就受不了這話

先看下我做的去水印工具線上預(yù)覽效果: 47.93.6.5:8888/index

java程序員手寫一個(gè)抖音視頻去水印工具

下邊和大家一起分析下做這個(gè)去水印工具的思路,很多人乍一聽 去水印 ,下意識的覺得是一種什么牛比的算法,其實(shí)這是一種假象~

刨根問底

雖說要爭口氣,可剛開始做的時(shí)候我也真是一臉懵逼,因?yàn)楦静恢涝搹哪娜胧郑ニ∈裁丛戆。侩y不成我還要寫個(gè)算法?

找了一個(gè)抖音視頻的分享鏈接,一點(diǎn)點(diǎn)分析,不難發(fā)現(xiàn)這是個(gè)經(jīng)過處理的短鏈接,那這個(gè)短鏈接一定會(huì)重定向到真實(shí)的視頻地址 URL

https://v.douyin.com/JSkuhE4/

瀏覽器中輸入短鏈接得到了下邊這個(gè) URL ,以我的經(jīng)驗(yàn)判斷URL中的 6820792802394262795 很有可能是視頻的唯一ID,而唯一ID通常用來作為獲取詳情接口的入?yún)ⅲズ賬 好像有點(diǎn)頭緒了。

https://www.iesdouyin.com/share/video/6820792802394262795/

java程序員手寫一個(gè)抖音視頻去水印工具

趕緊祭出 F12 大法打開控制臺(tái),在眾多請求中發(fā)現(xiàn)這么一個(gè)接口,它居然用到了上邊的唯一ID。

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

java程序員手寫一個(gè)抖音視頻去水印工具
更驚喜的是接口返回的數(shù)據(jù)那叫一個(gè)詳細(xì),作者信息、音頻地址、視頻地址、平面圖都有。但唯獨(dú)沒有無水印的視頻 URL
java程序員手寫一個(gè)抖音視頻去水印工具
只找到一個(gè)有水印的視頻 URL,有點(diǎn)小失落,我又看了看這個(gè)地址,發(fā)現(xiàn) wm 和我項(xiàng)目名有點(diǎn)像啊,不就是watermark 水印的縮寫嗎?

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

java程序員手寫一個(gè)抖音視頻去水印工具
好像又看到了一絲希望,我趕緊修改URL在瀏覽器中又試了一下,果然真的沒水印了。

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

java程序員手寫一個(gè)抖音視頻去水印工具
到這才發(fā)現(xiàn)抖音去水印 簡單的讓人感動(dòng),哈哈哈~

身體力行

既然原理都清晰了,剩下的就是一步一步實(shí)現(xiàn)功能了,原理看著挺簡單的,但實(shí)現(xiàn)中還是遇到一點(diǎn)點(diǎn)小坑,浪費(fèi)了不少時(shí)間。

實(shí)現(xiàn)過程只有簡單的三步:

  • 1、從輸入框中過濾取出視頻短連接
  • 2、短連接傳到后端解析出無水印的視頻 URL
  • 3、視頻 URL傳遞給前端預(yù)覽、下載

后端并沒有什么難度,一步一步按照上邊分析的流程解析真實(shí)視頻 URL 就可以了。

注意 :我們想得到的地址URL,都是當(dāng)前短連接URL 經(jīng)過重定向后的URL。而抖音有些鏈接是不支持瀏覽器訪問的,所以要手動(dòng)修改 User-agent 屬性模擬移動(dòng)端訪問才可以。

/** * @param url * @author xiaofu * @description 獲取當(dāng)前鏈接重定向后的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");//模擬手機(jī)連接             conn.connect();             String location = conn.getHeaderField("Location");             return location;         } catch (Exception e) {             e.printStackTrace();         }         return "";     }

下邊是完整的后端實(shí)現(xiàn),可以看到代碼量非常的少。

/**  * @author xiaofu-公眾號:程序員內(nèi)點(diǎn)事  * @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、拿到視頻對應(yīng)的 ItemId              */             String videoUrl = "";             String musicUrl = "";             String videoPic = "";             String desc = "";             if (!StringUtils.isEmpty(redirectUrl)) {                 /**                  * 3、用 ItemId 拿視頻的詳細(xì)信息,包括無水印視頻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);     }}

前端實(shí)現(xiàn)也比較簡單,拿到后端解析出來的視頻URL 預(yù)覽播放、下載就OK了。

java程序員手寫一個(gè)抖音視頻去水印工具

為快速實(shí)現(xiàn)我用了老古董JQuery,我這個(gè)年紀(jì)的人對它感情還是很深厚的,UI 框架用的 layer.js。源碼后邊會(huì)分享給大家,就不全貼出來了。

$.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 style="overflow:hidden;height: 580px;width: 350px;"><p><p class="popButton"><a href="###" rel="noopener nofollow noreferrer" onclick="downloadVideo('${rows['videoUrl']}','${rows['desc']}')"><button class="layui-bg-red layui-btn-sm layui-btn">下載視頻</button></a></p><p class="popButton"><textarea id="videourl" cols="1" rows="1" style="height:0;width:0;position: absolute;">${rows['videoUrl']}</textarea><button class="layui-btn-sm layui-bg-blue layui-btn" onclick="copy('videourl')">復(fù)制鏈接</button></p><p class="popButton"><a href="###" rel="noopener nofollow noreferrer" onclick="downloadVideo('${rows['musicUrl']}','${rows['desc']}')"><button class="layui-btn-sm layui-btn">下載音頻</button></a></p><video id="video" width="360px" height="500px" src="${rows['videoUrl']}" controls = "true" poster="${rows['videoPic']}" preload="auto" webkit-playsinline="true" playsinline="true" x-webkit-airplay="allow" x5-video-player-type="h5" x5-video-player-fullscreen="true" x5-video-orientation="portraint" style="object-fit:fill"><source src="${rows['videoUrl']}" type="video/mp4"> </video></p></p>`                 //content: `<video id="video" src="${rows['videoUrl']}" controls = "true" poster="${rows['videoPic']}" preload="auto" webkit-playsinline="true" playsinline="true" x-webkit-airplay="allow" x5-video-player-type="h5" x5-video-player-fullscreen="true" x5-video-orientation="portraint" style="object-fit:fill"><source src="${rows['videoUrl']}" type="video/mp4"> </video>`             });          } catch (error) {             layer.alert('錯(cuò)誤信息:' + error, {                 title: '異常',                 skin: 'layui-layer-lan',                 closeBtn: 0,                 anim: 4 //動(dòng)畫類型             });             return false;         }     },     error: function (err) {         console.log(err);         layer.close(index);         $('.qsy-submit').attr('disabled', false);     },     done: function () {         layer.close(index);     }})})

注意:我們在自己的網(wǎng)站中引用其它網(wǎng)站的資源URL,由于不在同一個(gè)域名下referrer 不同,通常會(huì)遇到三方網(wǎng)站的防盜鏈攔截,所以要想正常訪問三方資源,必須要隱藏請求的referrer,頁面中設(shè)置如下參數(shù)。

 <!-- 解決訪問視頻url 請求403異常 -->  <meta name="referrer" content="no-referrer"/>

還簡單做了下移動(dòng)端適配,樣式看著還可以,但是功能使用起來有點(diǎn)差強(qiáng)人意,后邊在做優(yōu)化了。

java程序員手寫一個(gè)抖音視頻去水印工具

總結(jié)

很多東西就是這樣,沒認(rèn)真研究之前總感覺深不可測,可一旦接觸到技術(shù)的本質(zhì),又開始笑自己之前好蠢,懂與不懂有時(shí)就查那么一層窗戶紙。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
无码人妻精品一区二区三区不卡| 午夜精品一区二区三区在线视| 深夜成人毛片天堂| 国产香蕉97碰碰视频VA碰碰看| 国产精品无码电影在线观看| 果冻国产精品麻豆成人AV电影| 东京热人妻无码人AV| 国产成人无码AⅤ| 国产一码二码三码区别| 久久久久久人妻一区二区三区| 免费又黄又爽又猛的毛片| 人人妻人人澡人人爽秒播| FUCK东北老熟女人HD叫床| 日本适合18岁以上的护肤品| 国产AV无码专区亚洲AV| 乱人伦中文字幕在线视频| 精品国产一区二区亚洲人成毛片| 久久丫线这里只精品| 欧美亚洲国产精品久久蜜芽直播 | 亚洲AV午夜福利精品一区二区 | 69日本人XXXX16-18| 成年轻人电影免费 视频| 国产精品一区二区久久| 久久久AV波多野一区二区| 欧美劲爆精品白浆视频网站| 精品国产黑色丝袜高跟鞋| 美女露胸 0无挡挡| 日韩精品一区二区亚洲AV观看| 性妇BBBB搡BBBB嗓小说| 在线无码免费网站永久| 一二三四在线观看视频韩国| 啊灬啊灬啊灬快灬少妇软件| YY8840私人影院的在线| JAPAN丰满人妻HD| 国产高清中文版HD中字| 久久精品中文騷妇女内射| 人妻中出受孕 中文字幕在线| 无码中文人妻在线一区二区三区 | 久久99精品久久久久蜜芽| 欧美黑粗大在线观看| 无码人妻精品一区二区蜜桃AV| 亚洲熟妇无码AV另类VR影视| 波多野42部无码喷潮| 好大好深好猛好爽视频| 欧美乱大交XXXXX疯狂俱乐部| 欧美极品小妇另类xXXX性| 天天综合天天爱天天做| 野兽的夜晚第四季忘不掉的前任 | 亚洲男人成人性天堂网站| wwwxxx日本黄色| 黑人大鸡吧操逼日本女人| 欧美性狂猛BBBBBBXXXX| 人妻中文字幕在线| 亚洲成在人线在线播放无码| おっさんとわたし天堂的资源| 国精无码欧精品亚洲一区| 欧美一区二区三区放荡人妇| 亚洲AV永久爆乳无码5区| 把腿张开老子臊烂你妙妙| 成人在线高清不卡免费视频| 精品亚洲一区二区三区在线观看 | 国产A V无码专区亚洲AV| 久久中文骚妇内射| 忘忧草社区在线影视| 亚洲国产成人无码电影| A级黑粗大硬长爽猛出猛进| 黑人异族XXXⅩ吊大| 日本一线产区和韩国二线产区区别| 亚洲熟妇XXXXX色黄妇| 国产CHINESE男男GAY| 美女裸身裸乳免费视频的APP| 西瓜在线看免费观看视频| JAPANESE熟女熟妇多毛毛| 久久99精品久久久久久噜噜| 天天摸天天做天天爽天天弄| 91久久精品www人人做人人爽| 国内揄拍国内精品少妇| 搡老女人P老熟妇老熟女| 在厨房抱住岳丰满大屁股韩国电影| 国产乱色国产精品免费视频| 人狗大战JAVA代码| 无翼乌之无遮全彩浩君奶| MD豆传媒APP网址| 久久久久99精品成人片试看| 性ⅩXXX搡XXXX搡| 成人无遮挡裸免费视频在线观看| 蜜臀AV在线无码国产| 亚洲精品国产成人| 国产精品免费久久久久影院仙踪林| 全部免费A级毛片| 在线观看亚洲一区| 精品噜噜噜噜久久久久久久久| 欧美精产国品一二三产品| 亚洲人成色777777在线观看| 国产裸体XXXX视频在线播放| 日韩av在线一区二区| 99久久亚洲综合精品成人网| 久久久久久亚洲综合影院| 亚洲AV无码久久寂寞少妇| 公主很忙(N)甜烟| 人人做人人爽国产视| 18禁美女裸体无遮挡免费观看国 | 国产99久久亚洲综合精品| 欧洲免费无线码在线一区| 中文手机电影在线观看| 久久国产乱子伦免费精品无码| 亚洲AV狠狠爱一区二区三区| 99RE6在线视频精品免费| 久久久久无码专区亚洲AV| 亚洲国产精品成人久久 | JULIA绝顶快感高潮在线| 麻豆亚洲AV永久无码精品久久| 亚洲婷婷五月综合狠狠爱| 狠狠色综合网站久久久久久久| 无遮挡A级毛片免费看| 国产99久久精品一区二区| 日韩精品一区二区亚洲蜜桃 | 亚洲色大18成人网站WWW| 黑人大性殖器大战欧美白妇| 亚欧美日乱码视频在线观看| 国产精品色视频ⅩXXX| 天堂中文在线最新版| 国产成 人 综合 亚洲专区| 老熟女奶头好大呀| 亚洲综合网站精品一区二区| 精品国产一区二区三区免费| 亚洲国产制服丝袜先锋| 娇小美女被黑壮汉C到喷水| 日本XXXⅩ69XXXX护土| MM131美女大尺度私密照尤果| 女人和拘做受全过程| 99久久久无码国产精品性| 欧美金妇欧美乱妇XXXX| JAPAN丰满人妻VIDEOS| 啪啪男女爱高潮GIF| 爸爸10岁幼儿TREE小学生| 日本午夜精品一区二区三区电影| 成人爽A毛片免费网站| 色欲av蜜臀一区二区四区| 高跟丝袜AV专区| 无码国产玉足脚交久久2020| 国产精品视频永久免费播放| 亚州v不卡ww在线| 狠狠色噜噜狠狠狠狠888奇禾 | 47147人文艺术欣赏| 欧美疯狂做受XXXX高潮小说| VICTORYDAY刺激性另类| 日本熟妇色XXXXX日本免费看| 成为人视频人的APP有哪些软件| 麻豆国产成人AV在线播放欲色| 中文无码日韩欧免费视频| 欧美人与禽Z0ZO牲伦交| 波多野结衣AV一区二区全免费观看 | 亚洲色欲色欲综合网站| 老头巨大挺进莹莹的体内免费视频 | 水多多凹凸福利视频导航| 国产熟女高潮精品视频区| 亚洲精品国偷自产在线| 久久婷婷大香萑太香蕉AV人| 51精品国产人成在线观看| 日本中文字幕乱码免费| 国产精品久久福利新婚之夜| 亚洲AV无码片在线观看| 久久久久久精品免费无码| AV免费网站在线观看| 色综合久久一区二区三区| 国产精品99久久久久久WWW| 亚洲国产精品久久久久久| 蜜桃AV一区二区| 被伴郎的内捧猛烈进出H| 无码人妻丰满熟妇区毛片18| 娇妻宾馆被三根粗大的夹击| 中文字幕人妻偷伦在线视频| 日本猛少妇色XXXXX猛叫小说| 999久久久免费精品播放| 日韩GAY小鲜肉啪啪18禁| 国产欧美日韩综合精品二区| 亚洲综合小说区图片区| 欧美性猛交XXXX乱大交极品| 国产成人无码AV在线播放无广告| 亚洲精品无码你懂的网站| 男女无遮挡XX00动态图1| √天堂资源在线中文8在线最新版| 人妻少妇中文字幕乱码| 国产片AV国语在线观麻豆| 玉蒲团2之玉女心经| 日韩麻豆乱婬一区二区三区| 国产在线精品一区二区| 中文字幕一区二区人妻5566| 男男GV白嫩小受GV在线播放| 丰满少妇被猛烈进AV毛片| 亚洲精品无码AMM毛片| 漂亮人妻被黑人久久精品| 国产人妖视频一区二区| 再深点灬舒服灬太大了少妇| 色综合伊人色综合网站 | 免费中国最大但人文艺术| 国产丰满大屁股XXXX| 宅男66LU国产在线观看| 熟妇人妻中文字幕无码老熟妇|