• 游客 你好!
    ✿ MoeBBS 全部交流群公示 ✿
    诋毁本身就是一种仰望👑
  • 论坛资源声明
    1.本论坛所有资源均由用户自行发布,版权归原作者所有,未经允许,禁止非法转载、复制或用于商业用途。
    2.若您认为论坛中的任何资源侵犯了您的合法权益(如版权、肖像权等),请提供相关证明材料通过站内信,邮箱或工单与我们联系,我们将在核实后尽快处理或移除相关内容。
    3.本论坛无法100%保证用户发布内容的准确性、完整性或合法性,使用相关资源前请您自行甄别其风险与适用性,后果由使用者自行承担。
java实现短视频去水印 支持 某音 某手 某书 支持视频 图片解析

java实现短视频去水印 支持 某音 某手 某书 支持视频 图片解析

✅ Mengta 论坛官方售卖站点
[td]
最后由 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;
    }


前端页面可以自己去写

我这边是小程序效果图
图片类
1757740564252.webp
视频类


1757740541829.webp
[/td]
 
后退
顶部 底部