說明
本人也是初學Java不久的小白,可能會有很多地方不規范,本程式僅供參考,功能已經實作,
程式反映有點慢,按鈕點一下就行哈
抖音短視頻去水印原理:https://blog.csdn.net/qq_29556507/article/details/106943093
大家在看程式前先用電腦手動決議一下,就會知道大體流程以及我們大致需要怎么操作,
在用電腦一步一步決議出真實無水印地址的時候,需要注意的是:找到以這個https://aweme.snssdk.com/aweme開頭的網站后,別忘了把playwm改為play再去訪問,去水印原理的那篇文章有寫的,
但是如果用電腦去訪問修改完的這個網址電腦無法加載,手機可以跳轉到真實的無水印地址,然后用谷歌瀏覽器打開下載無水印視頻即可


因此我們的Java程式在訪問的時候需要修改user-agent來實作模擬手機訪問
程式中的:
public void doGet()
private void parseResult(InputStream inStream, String charSet)
這兩個方法就是去改發送的資料實作模擬手機訪問的方法,
程式演示


通過谷歌瀏覽器下載即可

代碼區
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.net.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.*;
import java.io.InputStreamReader;
public class dy {
String str="";
String num="";
String wz="";
String strend = "";
public static void main(String [] args) {
dy dy = new dy();
//創建視窗并進行布局
JFrame f = new JFrame("02抖音去水印1.0");
f.setLayout(null);
f.setBounds(0,0,410,300);
JLabel jl1 = new JLabel("地址:");
jl1.setBounds(10,10,30,30);
f.add(jl1);
JTextField tf = new JTextField();
tf.setBounds(45,12,280,25);
f.add(tf);
JLabel jl2 = new JLabel("打開:");
jl2.setBounds(10,40,30,30);
f.add(jl2);
JTextArea ta = new JTextArea();
ta.setLineWrap(true);
ta.setBounds(45,40,280,200);
ta.setEditable(false);
JScrollPane jsp = new JScrollPane(ta);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jsp.setBounds(45,40,280,200);
f.add(jsp);
JButton b = new JButton("OK");
b.setHorizontalTextPosition(SwingConstants.CENTER);
b.setVerticalTextPosition(SwingConstants.BOTTOM);
b.setBounds(328,60,60,130);
f.add(b);
//設定按鈕點擊事件
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//獲得tf文本框輸入的需要決議的地址
String text="";
text=tf.getText();
dy.str=text;
if (text.length()==0){
ta.setText("地址為空");
return;
}else {
try {
//對地址進行決議
dy.getNum();
dy.getWZ();
dy.doGet();
ta.setText(dy.strend);
//將決議完的網址自動復制到粘貼板上
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(dy.strend);
clip.setContents(tText, null);
//在tf文本框中顯示復制成功提示
tf.setText("決議成功已復制到粘貼板,請去瀏覽器打開下載");
} catch (IOException ioException) {
ta.setText("地址錯誤");
}catch (StringIndexOutOfBoundsException e1){
ta.setText("地址錯誤");
}
}
}
});
//當tf文本框獲得焦點時,自動清空內容
tf.addFocusListener(new FocusListener() {
@Override
//獲得焦點
public void focusGained(FocusEvent e) {
tf.setText("");
}
//失去焦點
@Override
public void focusLost(FocusEvent e) {
}
});
//使視窗能正常關閉
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//顯示視窗
f.setVisible(true);
}
//獲得視頻的item_ids,也就是視頻網址上的那個19位的數字串
public void getNum()throws IOException{
URL url = null;
url = new URL(str);
HttpURLConnection conn= null;
conn = (HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
try {
conn.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}
String realUrl=conn.getURL().toString();
num=realUrl.substring(38,57);
}
//獲得視頻的地址https://aweme.snssdk.com/aweme開頭的那個網址,并將網址中的playwm改為play
public void getWZ()throws IOException{
URL url= null;
url = new URL("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids="+num);
try {
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream()));
String line;
String str="";
while((line=reader.readLine())!=null){
str+=line;
}
reader.close();
wz="https://aweme.snssdk.com/aweme/v1/play"+str.substring(str.indexOf("/?video"),str.indexOf("&line=0"))+"&line=0";
} catch (IOException e) {
e.printStackTrace();
}
}
//解決https://aweme.snssdk.com/aweme開頭的網址只能手機端訪問才能跳轉的問題
//并獲得跳轉后的真正的無水印地址
public void doGet()throws IOException{
URL obj = new URL(wz);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
// 設定請求頭
con.setRequestProperty("user-agent", "Mozilla/5.0 ");
int responseCode = con.getResponseCode();
parseResult(con.getInputStream(), "GB2312");
}
private void parseResult(InputStream inStream, String charSet) {
try {
InputStreamReader stream = new InputStreamReader(inStream, charSet);
BufferedReader br = new BufferedReader(stream);
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
String str = response.toString();
strend=str.substring(str.indexOf("http"),str.indexOf("\">F"));
System.out.println(strend);
} catch (IOException e) {
e.printStackTrace();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/101071.html
標籤:其他
