admin
2021-07-30 19533a17aa55fafc70d0a385928e785cb50e1ebc
src/main/java/com/yeshi/buwan/mogotv/MogoTVApiUtil.java
@@ -2,16 +2,17 @@
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yeshi.buwan.youku.entity.YouKuShowDetail;
import com.yeshi.buwan.youku.entity.YouKuShowSimple;
import com.yeshi.buwan.youku.entity.YouKuVideo;
import org.json.JSONObject;
import com.yeshi.buwan.mogotv.entity.MogoTVClipInfo;
import com.yeshi.buwan.mogotv.entity.MogoTVVideo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.StringUtil;
import java.io.UnsupportedEncodingException;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.util.*;
public class MogoTVApiUtil {
@@ -26,109 +27,199 @@
//    https://pcweb.api.mgtv.com/episode/list?src=intelmgtv&abroad=0&_support=10000000&version=5.5.35&video_id=11026579&page=0&size=30&abroad=0&src=intelmgtv&callback=jsonp_1616648013585_27530
//
//    isIntact:1表示正片
    private static ScriptEngine jsEngine;
    private final static String APP_ID = "758bef946d0050ef";
    private final static String APP_SECRET = "e113a131d49e1f837402e2807f2daf58";
    private static String request(String action, Map<String, String> ps) {
        Map<String, String> params = new HashMap<>();
        params.put("action", action);
        params.put("client_id", APP_ID);
        params.put("format", "json");
        params.put("timestamp", System.currentTimeMillis() / 1000 + "");
        params.put("version", "3.0");
        params.put("format", "json");
        params.putAll(ps);
        List<String> list = new ArrayList<>();
        for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) {
            String key = its.next();
            try {
                list.add(key + URLEncoder.encode(params.get(key), "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        Collections.sort(list);
        String sign = StringUtil.Md5(StringUtil.concat(list, "") + APP_SECRET);
        params.put("sign", sign);
        ps.put("opensysparams", new JSONObject(params).toString());
        return HttpUtil.get("https://openapi.youku.com/router/rest.json", ps, new HashMap<>());
    }
    /**
     * 获取节目详情
     * 解析结果数据
     *
     * @param id
     * @param callback
     * @param result
     * @return
     * @throws Exception
     */
    public static YouKuShowDetail getShowDetail(String id) {
        String url = String.format("https://openapi.youku.com/v2/shows/show.json?client_id=%s&show_id=%s", APP_ID, id);
        String result = HttpUtil.get(url);
        return new Gson().fromJson(result, YouKuShowDetail.class);
    }
    /**
     * 根据分类拉取数据
     *
     * @param category
     * @param page
     */
    public static ListResultDTO getShowListByCategory(String category, int page, int pageSize) {
    private static String parseResult(String callback, String result) throws Exception {
        if (jsEngine == null) {
            ScriptEngineManager manager = new ScriptEngineManager();
            jsEngine = manager.getEngineByName("javascript");
        }
        try {
            String url = String.format("https://openapi.youku.com/v2/shows/by_category.json?client_id=%s&paid=1&category=%s&page=%s&count=" + pageSize, APP_ID, URLEncoder.encode(category, "UTF-8"), page);
            String result = HttpUtil.get(url);
            net.sf.json.JSONObject resultJson = net.sf.json.JSONObject.fromObject(result);
            int total = resultJson.optInt("total");
            Type type = new TypeToken<List<YouKuShowSimple>>() {
            }.getType();
            List<YouKuShowSimple> list = new Gson().fromJson(resultJson.optJSONArray("shows").toString(), type);
            return new ListResultDTO(list, total);
        } catch (UnsupportedEncodingException e) {
            String script = "function getData(){ return " + result + ";}\n";
            script += String.format("function %s(t){return t;}", callback);
            jsEngine.eval(script);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        if (jsEngine instanceof Invocable) {
            Invocable in = (Invocable) jsEngine;
            Object info = in.invokeFunction("getData");
            return new Gson().toJson(info);
        }
        return null;
    }
    public static ListResultDTO getVideoList(String showId, int page, int pageSize) {
        Map<String, String> params = new HashMap<>();
        params.put("show_id", showId);
        params.put("show_videotype", "正片");
        params.put("page", page + "");
        params.put("pageLength", pageSize + "");
        String result = MogoTVApiUtil.request("youku.api.video.byprogram.get", params);
        System.out.println(result);
        net.sf.json.JSONObject resultJson = net.sf.json.JSONObject.fromObject(result);
        int total = resultJson.optInt("total");
        Type type = new TypeToken<List<YouKuVideo>>() {
        }.getType();
        List<YouKuVideo> videoList = new Gson().fromJson(resultJson.optJSONArray("videos").toString(), type);
        if (videoList != null)
            for (YouKuVideo video : videoList) {
                video.setShowId(showId);
    public static String request(String url) throws Exception {
        String callback = "jsonp_" + System.currentTimeMillis();
        url += "&callback=" + callback;
        String result = HttpUtil.get(url);
        return parseResult(callback, result);
    }
    public static ListResultDTO getVideoList(String videoId, int page, int pageSize) {
        String url = String.format("https://pcweb.api.mgtv.com/episode/list?src=intelmgtv&abroad=0&_support=10000000&version=5.5.35&video_id=%s&page=%s&size=%s&abroad=0&src=intelmgtv", videoId, page, pageSize);
        String result = null;
        try {
            result = request(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject data = JSONObject.fromObject(result);
        if (data.optInt("code") == 200) {
            data = data.optJSONObject("data");
            int totalPage = data.optInt("total_page");
            JSONObject list = data.optJSONObject("list");
            JSONArray array = null;
            if (list.isArray()) {
                array = data.optJSONArray("list");
            } else {
                array = new JSONArray();
                for (Iterator<String> its = list.keys(); its.hasNext(); ) {
                    String key = its.next();
                    array.add(list.optJSONObject(key));
                }
            }
        return new ListResultDTO(videoList, total);
            Type type = new TypeToken<List<MogoTVVideo>>() {
            }.getType();
            List<MogoTVVideo> videoList = new Gson().fromJson(array.toString(), type);
            for (int i = 0; i < videoList.size(); i++) {
                if (videoList.get(i).getIsIntact() != 1) {
                    videoList.remove(i--);
                }
            }
            return new ListResultDTO(videoList, totalPage);
        }
        return null;
    }
    /**
     * 获取视频列表
     *
     * @param videoId
     * @return
     */
    public static List<MogoTVVideo> getVideoList(String videoId) {
        List<MogoTVVideo> videoList = new ArrayList<>();
        ListResultDTO dto = getVideoList(videoId, 1, 30);
        videoList.addAll(dto.getList());
        for (int i = 1; i < dto.getTotal(); i++) {
            dto = getVideoList(videoId, i + 1, 30);
            videoList.addAll(dto.getList());
        }
        Comparator<MogoTVVideo> cm = new Comparator<MogoTVVideo>() {
            @Override
            public int compare(MogoTVVideo o1, MogoTVVideo o2) {
                return o1.getT1() - o2.getT1();
            }
        };
        Collections.sort(videoList, cm);
        return videoList;
    }
    /**
     * 详情获取
     *
     * @param clipInfo
     * @return
     */
    public static MogoTVClipInfo getClipDetail(MogoTVClipInfo clipInfo) {
        String url = String.format("https://pcweb.api.mgtv.com/video/info?cid=%s&vid=%s&_support=10000000&abroad=0&src=intelmgtv", clipInfo.getClipId(), clipInfo.getPlayPartId());
        String result = null;
        try {
            result = request(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject data = JSONObject.fromObject(result);
        if (data.optInt("code") == 200) {
            data = data.optJSONObject("data");
            JSONObject info = data.optJSONObject("info");
            clipInfo.setVpicture(info.optString("clipImage2"));
            clipInfo.setHpicture(info.optString("clipImage"));
            JSONObject detail = info.optJSONObject("detail");
            clipInfo.setArea(detail.optString("area"));
            clipInfo.setUpdateInfo(detail.optString("updateInfo"));
            clipInfo.setLeader(detail.optString("leader"));
            clipInfo.setReleaseTime(detail.optString("releaseTime"));
            clipInfo.setPresenter(detail.optString("presenter"));
            clipInfo.setKind(detail.optString("kind"));
            clipInfo.setDirector(detail.optString("director"));
            clipInfo.setTelevision(detail.optString("television"));
            clipInfo.setLanguage(detail.optString("language"));
            clipInfo.setFstlvlType(detail.optString("fstlvlType"));
            clipInfo.setStory(detail.optString("story"));
            String updateInfo = detail.optString("updateInfo");
            updateInfo = updateInfo.replace("更新到", "更新至");
            if (updateInfo.contains(","))
                updateInfo = updateInfo.split(",")[updateInfo.split(",").length - 1];
            clipInfo.setUpdateInfo(updateInfo);
            return clipInfo;
        }
        return null;
    }
    /**
     * 获取专辑列表
     *
     * @param channelId
     * @param page
     * @param pageSize
     * @return
     */
    public static ListResultDTO getClipList(int channelId, int page, int pageSize) {
        String url = String.format("https://pianku.api.mgtv.com/rider/list/pcweb/v4?platform=pcweb&channelId=%s&pn=%s&pc=%s&hudong=0&_support=10000000&kind=a1&area=a1&sort=c2&abroad=0&src=intelmgtv", channelId, page, pageSize);
        String result = null;
        try {
            result = request(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject data = JSONObject.fromObject(result);
        if (data.optInt("code") == 200) {
            data = data.optJSONObject("data");
            int total = data.optInt("totalHits");
            Type type = new TypeToken<List<MogoTVClipInfo>>() {
            }.getType();
            JSONObject hitDocs = data.optJSONObject("hitDocs");
            JSONArray array = new JSONArray();
            if (!hitDocs.isArray()) {
                for (Iterator<String> its = hitDocs.keys(); its.hasNext(); ) {
                    String key = its.next();
                    array.add(hitDocs.optJSONObject(key));
                }
            } else {
                array = data.optJSONArray("hitDocs");
            }
            List<MogoTVClipInfo> clipInfos = new Gson().fromJson(array.toString(), type);
            return new ListResultDTO(clipInfos, total);
        }
        return null;
    }
    public static void main(String[] args) {
//        YouKuShowDetail detail = getShowDetail("1e61efbfbdefbfbd04ef");
//        System.out.println(detail);
        getVideoList("0a17e614d7e311e68ce4", 1, 20);
//        ListResultDTO resultDTO = getShowListByCategory("电视剧", 1);
//        System.out.println(resultDTO);
        ListResultDTO dto = getClipList(1, 1, 80);
        System.out.println(dto);
    }