一、前言抖音去水印方法很简单,以前一直没有去研究,以为搞个去水印还要用到算法去除,直到动手的时候才发现这么简单,不用编程基础都能做。
二、原理与步骤其实抖音它是有一个隐藏无水印地址的,只要我们找到那个地址就可以了
1、我们在抖音找一个想要去水印的视频链接
注意:这里一定要是https开头的,不是口令
打开浏览器访问:
访问之后会重定向到这个地址,后面有一串数字,这个就是视频的id,他是根据这个唯一id来找到视频播放的
按f12查看网络请求,找到刚刚复制的那个请求地址,在响应头里有一个location链接,访问location的链接
https://www.iesdouyin.com/share/video/7064781119429807363/
在f12中有许多请求,查看众多的请求里有一个请求是:
请求太多没找到可以直接跳过,直接看:https://aweme.snssdk.com 这个就行了,把id替换一下
https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=7064781119429807363
把这个请求再次用浏览器访问,然后返回了一大串json数据,一直放下翻可以找到这个链接
https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fg10000c85i9ejc77ue0kb2vo80&ratio=720p&line=0
直接用那个链接访问,他其实是一个有水印的链接,仔细观察发现最后那里有一段/playwm,有两个字母wm其实就是watermark英语单词的缩写,去掉wm后就能得到一个无水印链接了
https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fg10000c85i9ejc77ue0kb2vo80&ratio=720p&line=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; }}
commonutils .java
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/info?item_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) { list<string> results = new arraylist<>(); pattern p = pattern.compile("video/([\\w/\\.]*)/"); matcher m = p.matcher(redirecturl); while (!m.hitend() && m.find()) { results.add(m.group(1)); } return results.get(0); } public static string hsmatchno(string redirecturl) { list<string> results = new arraylist<>(); pattern p = pattern.compile("item_id=([\\w/\\.]*)&"); matcher m = p.matcher(redirecturl); while (!m.hitend() && 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/xx?xx=xx&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怎么实现抖音去水印的详细内容。