抖y解析视频or图集 「Java」
找遍了全网都没有最新的接口,找到居然还有收费的。
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
来自:原文链接