最后由 jiandan66 于 2025-9月13日 13:15 编辑
java实现短视频去水印 支持 某音 某手 某书 支持视频 图片解析
大概思路就是根据分享链接拿到重定向的地址 再去请求重定向地址会返回一个网页 网页中script中有无水印的url
JAVA ://视频
代码:
public JSONObject parseVideo(String txt) {
JSONObject respJson = new JSONObject();
try {
String url = extractUrl(txt);
if (url == null) {
return null;
}
String redirectUrl = getRedirectUrl(url);
if (redirectUrl == null) {
return null;
}
Document document = Jsoup.connect(redirectUrl)
.userAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1")
.get();
Elements scriptElements = document.select("script");
for (Element scriptElement : scriptElements) {
String scriptContent = scriptElement.html();
if (scriptContent.contains("window._ROUTER_DATA")) {
parseRouterData(scriptContent, respJson);
} else if (scriptContent.contains("window.__INITIAL_STATE__")) {
parseInitialState(scriptContent, respJson);
} else if (scriptContent.contains("window.INIT_STATE")) {
parseInitState(scriptContent, respJson);
}
}
} catch (Exception e) {
return null;
}
return respJson.isEmpty() ? null : respJson;
}
private String extractUrl(String msg) {
String regex = "(https?://\\S+)";
Matcher matcher = Pattern.compile(regex).matcher(msg);
return matcher.find() ? matcher.group(1) : null;
}
private void parseRouterData(String scriptContent, JSONObject respJson) {
String jsonData = extractJsonData(scriptContent);
JSONObject jsonObject = JSONObject.parseObject(jsonData);
JSONObject loaderDataJson = jsonObject.getJSONObject("loaderData");
if (loaderDataJson != null) {
parsePageInfo(loaderDataJson, respJson);
}
}
private void parsePageInfo(JSONObject loaderDataJson, JSONObject respJson) {
JSONObject pageInfoJson = loaderDataJson.getJSONObject("video_(id)/page");
JSONObject notePageInfoJson = loaderDataJson.getJSONObject("note_(id)/page");
if (pageInfoJson != null) {
parseVideoInfo(pageInfoJson, respJson);
} else if (notePageInfoJson != null) {
parseNoteInfo(notePageInfoJson, respJson);
}
}
private void parseVideoInfo(JSONObject pageInfoJson, JSONObject respJson) {
JSONObject videoInfoRes = pageInfoJson.getJSONObject("videoInfoRes");
if (videoInfoRes != null) {
JSONObject itemList = videoInfoRes.getJSONArray("item_list").getJSONObject(0);
populateVideoResponse(itemList, respJson);
}
}
private void populateVideoResponse(JSONObject itemList, JSONObject respJson) {
String desc = itemList.getString("desc");
String nickName = itemList.getJSONObject("author").getString("nickname");
String videoUrl = itemList.getJSONObject("video").getJSONObject("play_addr")
.getJSONArray("url_list").get(0).toString()
.replaceAll("playwm", "play")
.replaceAll("720p", "1080p");
respJson.put("title", desc);
respJson.put("nickName", nickName);
respJson.put("type", 1);
respJson.put("videoUrl", videoUrl);
}
private void parseNoteInfo(JSONObject notePageInfoJson, JSONObject respJson) {
JSONObject videoInfoRes = notePageInfoJson.getJSONObject("videoInfoRes");
JSONObject itemList = videoInfoRes.getJSONArray("item_list").getJSONObject(0);
String desc = itemList.getString("desc");
String nickName = itemList.getJSONObject("author").getString("nickname");
JSONArray jsonArray = itemList.getJSONArray("images");
ArrayList<String> imageList = new ArrayList<>();
for (Object object : jsonArray) {
JSONObject imageJson = JSONObject.parseObject(object.toString());
String urlList = imageJson.getJSONArray("url_list").get(0).toString();
imageList.add(urlList);
}
respJson.put("title", desc);
respJson.put("nickName", nickName);
respJson.put("type", 2);
respJson.put("imageList", imageList);
}
private void parseInitialState(String scriptContent, JSONObject respJson) {
String jsonData = extractJsonData(scriptContent).replaceAll("undefined", "\"undefined\"");
JSONObject jsonObject = JSONObject.parseObject(jsonData);
JSONObject noteData = jsonObject.getJSONObject("noteData");
JSONObject data = noteData.getJSONObject("data");
JSONObject noteDataJson = data.getJSONObject("noteData");
String desc = noteDataJson.getString("desc");
String type = noteDataJson.getString("type");
String nickName = noteDataJson.getJSONObject("user").getString("nickName");
if ("video".equals(type)) {
String videoUrl = noteDataJson.getJSONObject("video").getJSONObject("media").getJSONObject("stream").getJSONArray("h265").getJSONObject(0).getString("masterUrl");
respJson.put("title", desc);
respJson.put("nickName", nickName);
respJson.put("type", 1);
respJson.put("videoUrl", videoUrl);
} else {
JSONArray jsonArray = noteDataJson.getJSONArray("imageList");
ArrayList<String> imageList = new ArrayList<>();
if (jsonArray.size() == 1) {
String url = jsonArray.getJSONObject(0).getString("url");
imageList.add(url);
} else {
for (Object object : jsonArray) {
JSONObject imageJson = JSONObject.parseObject(object.toString());
JSONObject stream = imageJson.getJSONObject("stream");
String urlList = null;
if (stream != null && !stream.isEmpty()) {
urlList = stream.getJSONArray("h264").getJSONObject(0).getString("masterUrl");
}
if (StrUtil.isEmpty(urlList)) {
urlList = imageJson.getString("url");
}
imageList.add(urlList);
}
}
respJson.put("title", desc);
respJson.put("nickName", nickName);
respJson.put("type", 2);
respJson.put("imageList", imageList);
}
}
/**
* 快手视频
*
* @Param scriptContent
* @param respJson
*/
private void parseInitState(String scriptContent, JSONObject respJson) {
String jsonData = extractJsonData(scriptContent);
JSONObject jsonObject = JSONObject.parseObject(jsonData);
String prefix = "tusjoh.0sftu0xe0vhI6Bqq0qipup0tjnqmf0jogp@lqo";
JSONObject object = findJSONObjectByPrefix(jsonObject, prefix);
if (object != null) {
JSONObject photo = object.getJSONObject("photo");
String userName = photo.getString("userName");
String caption = photo.getString("caption");
JSONArray jsonArray = photo.getJSONArray("mainMvUrls");
if (!jsonArray.isEmpty()) {
String videoUrl = jsonArray.getJSONObject(0).getString("url");
respJson.put("title", caption);
respJson.put("nickName", userName);
respJson.put("type", 1);
respJson.put("videoUrl", videoUrl);
} else {
parseAtlasPhoto(photo, respJson, caption, userName);
}
}
}
/**
* 快手图集
*
* @param photo
* @param respJson
* @param caption
* @param userName
*/
private void parseAtlasPhoto(JSONObject photo, JSONObject respJson, String caption, String userName) {
JSONObject atlasJson = photo.getJSONObject("ext_params").getJSONObject("atlas");
String http = atlasJson.getJSONArray("cdn").get(0).toString();
JSONArray atlasJsonJSONArray = atlasJson.getJSONArray("list");
ArrayList<String> imageList = new ArrayList<>();
for (Object o : atlasJsonJSONArray) {
String imagUrl = "https://" + http + o;
imageList.add(imagUrl);
}
respJson.put("title", caption);
respJson.put("nickName", userName);
respJson.put("type", 2);
respJson.put("imageList", imageList);
}
private String extractJsonData(String scriptContent) {
return scriptContent.substring(scriptContent.indexOf("{"), scriptContent.lastIndexOf("}") + 1);
}
private static JSONObject findJSONObjectByPrefix(JSONObject jsonObject, String prefix) {
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
if (entry.getKey().startsWith(prefix)) {
return (JSONObject) entry.getValue();
}
}
return null;
}
@Override
public String getRedirectUrl(String redirectUrl) {
HttpURLConnection connection = null;
try {
String ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1";
URL url = new URL(redirectUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setInstanceFollowRedirects(false);
connection.setRequestProperty("User-Agent", ua);
// 获取响应码
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP ||
responseCode == HttpURLConnection.HTTP_MOVED_PERM) {
return connection.getHeaderField("Location");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return null;
}
前端页面可以自己去写
我这边是小程序效果图
图片类