话不多说,上代码,两种方法,注意这是Java语言;
package com.video.parse.common.util;
import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONUtil;
import java.util.Optional;
public class DouYinDecodeUtil {
public static void main(String[] args) throws Exception {
String url = "一切都是最好的安排,错过的人和事都是注定好的,你认同吗 https://v.douyin.com/JuTpVxv/ 复制此链接,打开抖音,直接观看视频!";
DecodeVideo video = decode(url).orElseThrow(() -> new Exception("Parsing failed."));
System.out.println(JSONUtil.toJsonPrettyStr(video));
}
public static Optional<DecodeVideo> decode(String url) {
String locationUrl = Common.getLocationUrl(ReUtil.get(Common.RE_URLS, url, 0));
String itemId = StrUtil.subAfter(StrUtil.subBefore(StrUtil.subBefore(locationUrl, "?", false), "/", true), "/", true);
DecodeVideo video = null;
String itemInfoUrl = StrFormatter.format("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={}", itemId);
String body = HttpUtil.get(itemInfoUrl);
if (StrUtil.isNotEmpty(body)) {
JSON json = JSONUtil.parse(body);
String statusCode = JSONUtil.getByPath(json, "status_code").toString();
if (StrUtil.equals(statusCode, "0")) {
String author = JSONUtil.getByPath(json, "item_list[0].author.nickname").toString();
String avatar = JSONUtil.getByPath(json, "item_list[0].author.avatar_medium.url_list[0]").toString();
String desc = JSONUtil.getByPath(json, "item_list[0].desc").toString();
String addr = JSONUtil.getByPath(json, "item_list[0].video.play_addr.url_list[0]").toString();
String cover = JSONUtil.getByPath(json, "item_list[0].video.cover.url_list[0]").toString();
String playAddr = Common.getLocationUrl(StrUtil.replace(addr, "playwm", "play"));
video = DecodeVideo.builder().author(author).avatar(avatar).title(desc).playAddr(playAddr).coverPicture(cover).build();
}
}
return Optional.ofNullable(video);
}
}
实体类:
package com.video.parse.common.util;
import lombok.Builder;
import lombok.Data;
@Data
@Builder(toBuilder = true)
public class DecodeVideo {
/**
* 作者
*/
private String author;
/**
* 标题
*/
private String title;
/**
* 头像
*/
private String avatar;
/**
* 封面图
*/
private String coverPicture;
/**
* 播放地址
*/
private String playAddr;
}
通用工具:
package com.video.parse.common.util;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.util.HashMap;
public class Common {
public static final String RE_URLS = "(https://|http://)?([\\w-]+\\.)+[\\w-]+(:\\d+)*(/[\\w- ./?%&=]*)?";
public static Document jsonpConnect(String url, Boolean isMobile) {
Document doc = null;
if (StrUtil.isNotEmpty(url)) {
try {
Connection connect = Jsoup.connect(ReUtil.get(Common.RE_URLS, url, 0));
if (isMobile) {
connect.headers(Common.getMobileHeaders());
}
doc = connect.timeout(5000).get();
} catch (Exception e) {
e.printStackTrace();
}
}
return doc;
}
public static String getLocationUrl(String url) {
HashMap headers = getMobileHeaders();
HttpResponse execute = HttpUtil.createGet(url).addHeaders(headers).execute();
String redirectUrl = execute.header("Location");
return redirectUrl;
}
public static HashMap<String, String> getMobileHeaders() {
HashMap headers = MapUtil.newHashMap();
headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Mobile Safari/537.36");
return headers;
}
}