运维开发网

详细介绍了Java实现超简单Tik Tok水印的演示实例

运维开发网 https://www.qedev.com 2022-06-17 17:15 出处:网络
抖音去水印方法很简单,以前一直没有去研究,以为搞个去水印还要用到算法去除,直到动手的时候才发现这么简单,不用编程基础都能做。所以本文将介绍一个超简单抖音视频去水印方法,需要的可以参考一下

抖音去水印方法很简单,以前一直没有去研究,以为搞个去水印还要用到算法去除,直到动手的时候才发现这么简单,不用编程基础都能做。所以本文将介绍一个超简单抖音视频去水印方法,需要的可以参考一下


一、前言

Tik Tok的水印方法非常简单。之前没研究过,以为要用算法才能去掉。刚开始的时候才发现,太简单了,不用编程就能做到。


二、原理与步骤

实际上,Tik Tok有一个没有水印的隐藏地址,只要我们找到那个地址。

1.我们正在寻找一个Tik Tok的视频链接,我们想水印。

注意:它必须以https开头,而不是密码。

打开浏览器访问:


访问结束后,您将被重定向到这个地址,后面是一串数字。这是视频的id。他根据这个唯一的id找到了播放的视频。


按F12查看网络请求,找到刚才复制的请求地址,响应头有位置链接。请访问位置链接。

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

F12中有许多请求,其中之一是:

找不到太多请求,所以您可以跳过它们。看着:https://aweme.snssdk.com,把身份证放回去。

https://www . iesdouyin . com/web/API/v2/awe me/item info/item _ ids = 7064781119429807363

用浏览器再次访问这个请求,然后返回一堆json数据。往下翻就能找到这个链接。

https://awe me . SNS SDK . com/awe me/v1/play WM/video _ id = v 0200 fg 10000 c 85 I 9 ejc 77 UE 0 kb 2 VO 80 amp;比率= 720pamp线=0


用那个链接直接访问它,它实际上是一个带水印的链接。仔细观察,发现结尾有一段/playwm,有两个字母wm其实是水印英文单词的缩写。移除wm后,可以得到一个无水印链接。

https://awe me . SNS SDK . com/awe me/v1/play/video _ id = v 0200 fg 10000 c 85 I 9 ejc 77 UE 0 kb 2 VO 80 amp;比率= 720pamp线=0


这里没有完成水印。


三、代码实现

这里我用Java实现。这和语言无关,只要我能发出请求就行。

/** * 下载抖音无水印视频 * * @throws IOException */@GetMapping(value = "/downloadDy")public void downloadDy(String dyUrl, HttpServletResponse response) throws IOException { ResultDto resultDto = new ResultDto(); try { dyUrl = URLDecoder.decode(dyUrl).replace("dyUrl=", ""); resultDto = dyParseUrl(dyUrl); } catch (Exception e) { e.printStackTrace(); } if (resultDto.getVideoUrl().contains("http://")) { resultDto.setVideoUrl(resultDto.getVideoUrl().replace("http://", "https://")); } String videoUrl = resultDto.getVideoUrl(); response.sendRedirect(videoUrl);} public ResultDto dyParseUrl(String redirectUrl) throws Exception { redirectUrl = CommonUtils.getLocation(redirectUrl); ResultDto dyDto = new ResultDto(); if (!StringUtils.isEmpty(redirectUrl)) { /** * 1、用 ItemId 拿视频的详细信息,包括无水印视频url */ String itemId = CommonUtils.matchNo(redirectUrl); StringBuilder sb = new StringBuilder(); sb.append(CommonUtils.DOU_YIN_BASE_URL).append(itemId); String videoResult = CommonUtils.httpGet(sb.toString()); DYResult dyResult = JSON.parseObject(videoResult, DYResult.class); /** * 2、无水印视频 url */ String videoUrl = dyResult.getItem_list().get(0) .getVideo().getPlay_addr().getUrl_list().get(0) .replace("playwm", "play"); String videoRedirectUrl = CommonUtils.getLocation(videoUrl); dyDto.setVideoUrl(videoRedirectUrl); /** * 3、音频 url */ String musicUrl = dyResult.getItem_list().get(0).getMusic().getPlay_url().getUri(); dyDto.setMusicUrl(musicUrl); /** * 4、封面 */ String videoPic = dyResult.getItem_list().get(0).getVideo().getDynamic_cover().getUrl_list().get(0); dyDto.setVideoPic(videoPic); /** * 5、视频文案 */ String desc = dyResult.getItem_list().get(0).getDesc(); dyDto.setDesc(desc); } return dyDto; }

ResultDto.java

public class ResultDto { private String videoUrl; //视频 private String musicUrl; //背景音乐 private String videoPic; //无声视频 private String desc; public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getVideoUrl() { return videoUrl; } public void setVideoUrl(String videoUrl) { this.videoUrl = videoUrl; } public String getMusicUrl() { return musicUrl; } public void setMusicUrl(String musicUrl) { this.musicUrl = musicUrl; } public String getVideoPic() { return videoPic; } public void setVideoPic(String videoPic) { this.videoPic = videoPic; }}

普通工具。爪哇岛

public class CommonUtils { public static String DOU_YIN_BASE_URL = "https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/item_ids="; public static String HUO_SHAN_BASE_URL = " https://share.huoshan.com/api/item/infoitem_id="; public static String DOU_YIN_DOMAIN = "douyin"; public static String HUO_SHAN_DOMAIN = "huoshan"; 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 ""; } public static String matchNo(String redirectUrl) { Listlt;Stringgt; results = new ArrayListlt;gt;(); Pattern p = Pattern.compile("video/([\\w/\\.]*)/"); Matcher m = p.matcher(redirectUrl); while (!m.hitEnd() amp;amp; m.find()) { results.add(m.group(1)); } return results.get(0); } public static String hSMatchNo(String redirectUrl) { Listlt;Stringgt; results = new ArrayListlt;gt;(); Pattern p = Pattern.compile("item_id=([\\w/\\.]*)amp;"); Matcher m = p.matcher(redirectUrl); while (!m.hitEnd() amp;amp; m.find()) { results.add(m.group(1)); } return results.get(0); } public static String httpGet2(String urlStr) throws Exception { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "text/json;charset=utf-8"); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuffer buf = new StringBuffer(); String inputLine = in.readLine(); while (inputLine != null) { buf.append(inputLine).append("\r\n"); inputLine = in.readLine(); } in.close(); return buf.toString(); } /** * 使用Get方式获取数据 * * @param url URL包括参数,http://HOST/XXXX=XXamp;XXX=XXX * @return */ public static String httpGet(String url) { String result = ""; BufferedReader in = null; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接 connection.connect(); // 定义 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream(), "UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } public static String parseUrl(String url) { String host = ""; Pattern p = Pattern.compile("http[:|/|\\w|\\.]+"); Matcher matcher = p.matcher(url); if (matcher.find()) { host = matcher.group(); } return host.trim(); } /** * 查找域名(以 https开头 com结尾) * * @param url * @return */ public static String getDomainName(String url) { String host = ""; Pattern p = Pattern.compile("https://.*\\.com"); Matcher matcher = p.matcher(url); if (matcher.find()) { host = matcher.group(); } return host.trim(); }}


四、总结

其实只要看看第二部分的原理就知道了。不是很简单吗?

关于Java实现超简单Tik Tok水印的这篇文章到此结束。有关Java Tik Tok水印的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消