2020-11-11抖音去水印解析获取源标题、作者、头像、封面图以及源视频地址

话不多说,上代码,两种方法,注意这是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;
    }
}

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值