admin
2021-04-27 f3ff5ab043cf612e119fd90cd82e49b2cfc2ab5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.yeshi.buwan.videos.bilibili;
 
import com.google.gson.Gson;
import com.yeshi.buwan.videos.bilibili.entity.BilibiliMediaInfo;
import com.yeshi.buwan.videos.bilibili.entity.BilibiliVideo;
import net.sf.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
 
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.IOException;
 
public class BilibiliApiUtil {
 
    public static BilibiliVideo parseShortVideo(String url) throws Exception {
        String result = parsePageData(url);
        System.out.println(result);
        JSONObject root = JSONObject.fromObject(result);
        BilibiliVideo video = parseVideo(root);
        return video;
    }
 
 
    public static BilibiliMediaInfo parseMediaInfo(String url) throws Exception {
        String result = parsePageData(url);
        System.out.println(result);
        JSONObject root = JSONObject.fromObject(result);
        BilibiliMediaInfo mediaInfo = parseMedia(root);
        return mediaInfo;
    }
 
 
    private static String getPageData(String scriptContent) throws ScriptException, NoSuchMethodException {
        String script = "var _window={};var _document={scripts:[{parentNode:{removeChild:function(){}}}]};" + scriptContent.replace("window.", "_window.").replace("document.", "_document.");
        script += ";function getData(){return  JSON.stringify(_window.__INITIAL_STATE__);}";
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine jsEngine = manager.getEngineByName("javascript");
        try {
            jsEngine.eval(script);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
 
        Gson gson = new Gson();
        if (jsEngine instanceof Invocable) {
            Invocable in = (Invocable) jsEngine;
            Object data = in.invokeFunction("getData");
            return data.toString();
        }
        return null;
    }
 
    private static BilibiliMediaInfo parseMedia(JSONObject root) {
        if (root.optJSONObject("mediaInfo") != null) {
            JSONObject mediaJson = root.optJSONObject("mediaInfo");
            mediaJson.put("mediaRating", root.optJSONObject("mediaRating"));
            mediaJson.put("newestEp", root.optJSONObject("newestEp"));
            mediaJson.put("epList", root.optJSONArray("epList"));
            return new Gson().fromJson(mediaJson.toString(), BilibiliMediaInfo.class);
        }
        return null;
    }
 
    private static BilibiliVideo parseVideo(JSONObject root) {
        if (root.optJSONObject("video") != null) {
            JSONObject videoJson = root.optJSONObject("video");
            if (videoJson != null) {
                videoJson = videoJson.optJSONObject("viewInfo");
            }
            return new Gson().fromJson(videoJson.toString(), BilibiliVideo.class);
        }
        return null;
    }
 
    private static String parsePageData(String url) throws ScriptException, NoSuchMethodException, IOException {
        Document doc = Jsoup.connect(url).userAgent("Dalvik/2.1.0 (Linux; U; Android 9; MI 8 Lite MIUI/V10.2.3.0.PDTCNXM)").timeout(30000).get();
        Elements els = doc.getElementsByTag("script");
        for (int i = 0; i < els.size(); i++) {
            if (els.get(i).html().indexOf("window.__INITIAL_STATE__") > -1) {
                String script = els.get(i).html();
                System.out.println(script);
                String result = getPageData(script);
                return result;
            }
        }
        return null;
    }
 
 
    public static void main(String[] args) throws IOException, ScriptException, NoSuchMethodException {
 
        String[] urls = new String[]{
                "https://www.bilibili.com/bangumi/play/ss38129?theme=movie&from_spmid=666.7", "https://www.bilibili.com/bangumi/play/ss38611?theme=movie&from_spmid=666.7"
        };
        //3-记录片 5-电视剧  4-国漫 1-番剧  2-电影
        try {
            for (String url : urls) {
                BilibiliMediaInfo mediaInfo = parseMediaInfo(url);
                System.out.println("type:" + mediaInfo.getType());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}