抖音已经占据了一部分人大多的休息时间,纯粹是技术探索关于抖音的连接中提取原始视频内容。一开始发现如果从网页中去深挖后可以得到去掉水印的视频,抖音在架构上的失误。当时就在想他们什么时候能修复,果然几个月后,在网页上不断去解析后得到的永远就是加了水印的视频。难道就没有办法了么。为什么网页很多小工具还是可以下载,就这样我就去第三方的解析网站上去找答应,结果是解析的过程都写到了服务器端。
总觉得抖音这个视频加的水印是一层视图,不会将视频运算压力都交给抖音服务器。最后网上看到利用伪装手机浏览器请求头能获取原始视频连接,就这样子摸索出了结果。关键代码如下。
1,获取剪切板内容
private String getCoypUrl() {
ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData data = cm.getPrimaryClip();
ClipData.Item item = data.getItemAt(0);
String content = item.getText().toString();
return content;
}
2,获取网页html全部内容
public String getHtmlSource(String htmlUrl) {
URL url;
StringBuffer sb = new StringBuffer();
try {
url = new URL(htmlUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(
url.openStream(), "UTF-8"));// 读取网页全部内容
String temp;
while ((temp = in.readLine()) != null) {
sb.append(temp);
}
in.close();
} catch (MalformedURLException e) {
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
3,截取video_id
protected String parseTag(String html, String tag) {//tag=video_id
Pattern pattern = Pattern.compile("\\?" + tag + "(.*?)(&|\")", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
return matcher.group(1);
} else {
return "";
}
}
4,将链接封装成流。由于抖音对请求头有限制,只能设置一个伪装手机浏览器请求头才可实现去水印下载
Map<String, String> headers = new HashMap<>();
headers.put("Connection", "keep-alive");
headers.put("Host", "aweme.snssdk.com");
headers.put("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 Version/12.0 Safari/604.1");
BufferedInputStream in = Jsoup.
connect(matchUrl).headers(headers).timeout(10000).
ignoreContentType(true).execute().bodyStream();
这个时候会抛出403异常的异常,无法利用Joup获取视频对象,并作封装成一个输入流对象。但是这个时候你将Exception转成HttpStatusException就能获取到原始视频的连接。
(HttpStatusException) e).getUrl()
大功告成了就,这个是我写的客户端demo
下载地址
源码私信我,我会单独发哦。
网友评论