思路分析
首先在抖音APP段選擇你喜歡的視頻進(jìn)行分享挑豌,一般分享鏈接都是這樣的:“http://v.douyin.com/111113/”惹恃,這并不是真的下載地址,在瀏覽器中輸入上述地址,發(fā)現(xiàn)重定向到一個(gè)新的地址柬祠,也就是帶有水印的播放地址蘸拔。
在302相應(yīng)頭中l(wèi)ocation师郑,這就是視頻重定向地址,在該地址請(qǐng)求中返回的js代碼中發(fā)現(xiàn)以下地址就是請(qǐng)求帶有水印的播放地址调窍。
只需要把地址中palywm中的wm刪掉就是視頻無水印流地址呕乎。
代碼實(shí)現(xiàn)
1、利用Jsoup抓取抖音分享鏈接陨晶,在重定向返回的網(wǎng)頁中匹配水印流播放地址猬仁,然后把palywm中的wm刪掉就是視頻無水印流地址
//1.利用Jsoup抓取抖音鏈接
? ? ? ? String htmls = Jsoup.connect(url).ignoreContentType(true).execute().body(); //抓取抖音網(wǎng)頁
? ? ? ? //System.out.println(htmls); //做測(cè)試時(shí)使用
? ? ? ? //2.利用正則匹配可以抖音下載鏈接
? ? ? ? //playAddr: "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200ffc0000bfil6o4mavffbmroeo80&line=0",
? ? ? ? //具體匹配內(nèi)容格式:「https://aweme.snssdk.com/aweme/...line=0」
? ? ? ? Pattern patternCompile = Pattern.compile("(?<=playAddr: \")https?://.+(?=\",)");
? ? ? ? //利用Pattern.compile("正則條件").matcher("匹配的字符串對(duì)象")方法可以將需要匹配的字段進(jìn)行匹配封裝 返回一個(gè)封裝了匹配的字符串Matcher對(duì)象
? ? ? ? //3.匹配后封裝成Matcher對(duì)象
? ? ? ? Matcher m = patternCompile.matcher(htmls);
? ? ? ? //4.①利用Matcher中的group方法獲取匹配的特定字符串 ②利用String的replace方法替換特定字符,得到抖音的去水印鏈接
? ? ? ? String matchUrl = "";
? ? ? ? while (m.find()) {
? ? ? ? ? ? matchUrl = m.group(0).replaceAll("playwm", "play");
? ? ? ? }
2、替換后先誉,下載無水印流視頻湿刽,需要封裝請(qǐng)求頭。
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");
? ? ? ? //6.利用Joup獲取視頻對(duì)象,并作封裝成一個(gè)輸入流對(duì)象
? ? ? ? BufferedInputStream in = Jsoup.connect(matchUrl).headers(headers).timeout(10000).ignoreContentType(true).execute().bodyStream();? ? ?
? ? ? ? //7.封裝一個(gè)保存文件的路徑對(duì)象
? ? ? ? File fileSavePath = new File("video/"+ Math.random() * 100+".mp4");
? ? ? ? //注:如果保存文件夾不存在,那么則創(chuàng)建該文件夾
? ? ? ? File fileParent = fileSavePath.getParentFile();
? ? ? ? if (!fileParent.exists()) {
? ? ? ? ? ? fileParent.mkdirs();
? ? ? ? }
? ? ? ? //8.新建一個(gè)輸出流對(duì)象
? ? ? ? OutputStream out =
? ? ? ? ? ? ? ? new BufferedOutputStream(
? ? ? ? ? ? ? ? ? ? ? ? new FileOutputStream(fileSavePath));
? ? ? ? //9.遍歷輸出文件
? ? ? ? int b;
? ? ? ? while ((b = in.read()) != -1) {
? ? ? ? ? ? out.write(b);
? ? ? ? }
? ? ? ? out.close();//關(guān)閉輸出流
? ? ? ? in.close(); //關(guān)閉輸入流