最新抖y 去水印 解析视频or图集 「Java」

抖y解析视频or图集 「Java」

找遍了全网都没有最新的接口,找到居然还有收费的。

image-20240203190624855

public static void main(String[] args) {
  String content = "https://v.douyin.com/iLwxgYHE/";
  JSONObject douYData = extractDouYinData(content);
  if (douYData != null) {
    System.out.println(douYData);
  } else {
    System.out.println(1);
  }
}
private static JSONObject extractDouYinData(String content) {
  String url = extractUrl(content);

  if (url != null) {
    if (content.contains("douyin.com")) {
      if (content.contains("live.douyin.com")) {
        System.out.println("直播");
        return null;
      } else {
        String dyUrlOrId = processContent(content);
        String videoId = isNumeric(dyUrlOrId) ? dyUrlOrId : extractVideoId(dyUrlOrId);
        if (videoId!=null){
          JSONArray dyData = serverGetDy(videoId);

          if (dyData != null && dyData.size() > 0) {
            JSONObject jsonData = dyData.getJSONObject(0);
            return buildDouYinData(jsonData);
          }
        }
      }
    }
  }
  return null;
}
private static JSONObject buildDouYinData(JSONObject jsonData) {
  JSONObject douYData = new JSONObject();
  douYData.put("desc", jsonData.getString("desc"));

  JSONObject author = jsonData.getJSONObject("author");
  douYData.put("nickname", author.getString("nickname"));

  JSONObject videoJson = jsonData.getJSONObject("video");
  JSONObject coverJson = videoJson.getJSONObject("cover");
  String coverUrl = coverJson.getJSONArray("url_list").getString(0);
  douYData.put("coverUrl", coverUrl);

  if (jsonData.getJSONArray("images") != null) {
    JSONArray images = jsonData.getJSONArray("images");
    JSONArray imageArray = new JSONArray();

    for (int i = 0; i < images.size(); i++) {
      JSONObject image = images.getJSONObject(i);
      JSONArray urlList = image.getJSONArray("url_list");
      imageArray.add(urlList.get(0));
    }

    douYData.put("type", 2);
    douYData.put("data", imageArray);
  } else {
    JSONObject playAddr = videoJson.getJSONObject("play_addr");
    String uri = playAddr.getString("uri");
    String videoUrl = "https://www.iesdouyin.com/aweme/v1/play/?video_id=" + uri + "&ratio=1080p&line=0";
    douYData.put("type", 1);
    douYData.put("data", videoUrl);
  }

  return douYData;
}
public static String processContent(String content) {
  String douyinUrl = extractMatch(content, "v\\.douyin\\.com/[a-zA-Z0-9]+");
  if (douyinUrl != null) {
    return "https://" + douyinUrl;
  }
  String digit = extractMatch(content, "\\d{19}");
  return digit;
}
private static String extractMatch(String content, String regex) {
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(content);
  return matcher.find() ? matcher.group(0) : null;
}
public static boolean isNumeric(String str) {
  return str.matches("\\d+");
}
private static String extractUrl(String text) {
  // 匹配网址的正则表达式
  String regex = "https?://\\S+";
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(text);

  // 查找匹配的链接
  if (matcher.find()) {
    return matcher.group();
  }

  return null;
}
public static String extractVideoId(String link) {
  String redirectLink = getRedirectUrl(link);
  Pattern patternVideo = Pattern.compile("/video/(\\d+)");
  Pattern patternNote = Pattern.compile("/note/(\\d+)");

  Matcher matcherVideo = patternVideo.matcher(redirectLink);
  Matcher matcherNote = patternNote.matcher(redirectLink);

  if (matcherVideo.find()) {
    return matcherVideo.group(1);
  } else if (matcherNote.find()) {
    return matcherNote.group(1);
  } else {
    return null;
  }
}
public static String getRedirectUrl(String url) {
  OkHttpClient client = new OkHttpClient();
  try {
    Request request = new Request.Builder()
      .url(url)
      .get()
      .build();
    Response response = client.newCall(request).execute();
    return response.request().url().toString();

  } catch (IOException e) {
    e.printStackTrace();
  }

  return null;
}
private static JSONArray serverGetDy(String itemIds){
  OkHttpClient client = new OkHttpClient().newBuilder().build();
  Request Request = new Request.Builder()
    //不知道这个a_bogus是啥 可能是个算法 随便填写或空即可
    .url("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?reflow_source=reflow_page&item_ids="+itemIds+"&a_bogus=")
    .addHeader("content-type", "application/x-www-form-urlencoded")
    .get()
    .build();
  try {
    Response response = client.newCall(Request).execute();
    JSONObject jsonObject=JSONObject.parseObject(response.body().string());
    if (jsonObject.getInteger("status_code").equals(0)){
      return jsonObject.getJSONArray("item_list");
    }
    return null;

  } catch (IOException e) {
    e.printStackTrace();
    return null;
  }
}

直接运行:

{"desc":"我要实名diss一下安徽!","nickname":"北京小伙·羽铮","coverUrl":"https://p3-sign.douyinpic.com/tos-cn-i-0813/oEN48veNuCAfidwEAI1AFAAxRiDgPlpSzA96hC~c5_300x400.webp?x-expires=1708171200&x-signature=fAqzZNGU3LIPyMp4gekpOqBU4pI%3D&from=3213915784_large&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=cover&biz_tag=aweme_video&l=20240203205403086A380D2F525BBA2778","type":1,"data":"https://www.iesdouyin.com/aweme/v1/play/?video_id=v0d00fg10000cmtf193c77u92rppn4l0&ratio=1080p&line=0"}

图集的话:

{"desc":"去大理的路上只要车票和香烟就够了#大理 #洱海","nickname":"工藤新一","coverUrl":"https://p3-sign.douyinpic.com/tos-cn-i-0813/oUbEvLMDoCAewhwEAIzAPAAyFf8gwls5nA9gDC~noop.webp?x-expires=1708171200&x-signature=2HZS5StiQbRamOxLb9Q0FvUZXHU%3D&from=3213915784_large&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=cover&biz_tag=aweme_images&l=20240203205641A209FDBDD5A841B23DA8","type":2,"data":["https://p3-sign.douyinpic.com/tos-cn-i-0813/oUbEvLMDoCAewhwEAIzAPAAyFf8gwls5nA9gDC~tplv-dy-lqen-new:1440:1922:q80.webp?x-expires=1709553600&x-signature=exZOH06IRQOGhThJvNz5aArsPe4%3D&from=3213915784&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=image&biz_tag=aweme_images&l=20240203205641A209FDBDD5A841B23DA8","https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oszg5FvMAf8ALPDl9BxCAzwGwDIzEAegACAobn~tplv-dy-lqen-new:1440:1922:q80.webp?x-expires=1709553600&x-signature=oWRhwh9QeE81x5SivJxymdM40sM%3D&from=3213915784&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=image&biz_tag=aweme_images&l=20240203205641A209FDBDD5A841B23DA8","https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oQEgIAAA9vwoAznlfeC3bFF5y8PAMDAgDzLwCo~tplv-dy-lqen-new:1440:1922:q80.webp?x-expires=1709553600&x-signature=k%2F4z43dkPEZikmiEfUxlEz%2FWzKs%3D&from=3213915784&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=image&biz_tag=aweme_images&l=20240203205641A209FDBDD5A841B23DA8","https://p11-sign.douyinpic.com/tos-cn-i-0813/o4MAFAbDqgowlMzDfIC89zAnA5EyewAAnPCLvg~tplv-dy-lqen-new:1440:1920:q80.webp?x-expires=1709553600&x-signature=G2JmVl0VYt2%2BiqIzIiP6kejFjYE%3D&from=3213915784&s=PackSourceEnum_DOUYIN_REFLOW&se=false&sc=image&biz_tag=aweme_images&l=20240203205641A209FDBDD5A841B23DA8"]}

w:a634882039

来自:原文链接

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值