Android开发经验谈@产品技术干货

利用android解析抖音链接

2019-05-17  本文已影响17人  ldoublem

抖音已经占据了一部分人大多的休息时间,纯粹是技术探索关于抖音的连接中提取原始视频内容。一开始发现如果从网页中去深挖后可以得到去掉水印的视频,抖音在架构上的失误。当时就在想他们什么时候能修复,果然几个月后,在网页上不断去解析后得到的永远就是加了水印的视频。难道就没有办法了么。为什么网页很多小工具还是可以下载,就这样我就去第三方的解析网站上去找答应,结果是解析的过程都写到了服务器端。
总觉得抖音这个视频加的水印是一层视图,不会将视频运算压力都交给抖音服务器。最后网上看到利用伪装手机浏览器请求头能获取原始视频连接,就这样子摸索出了结果。关键代码如下。
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
下载地址
源码私信我,我会单独发哦。

上一篇下一篇

猜你喜欢

热点阅读