| | |
| | | |
| | | 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 { |
| | |
| | | // 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); |
| | | } |
| | | |
| | | |