package com.yeshi.buwan.videos.tencent; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.yeshi.buwan.util.StringUtil; import com.yeshi.buwan.util.video.web.TencentWebUtil; import com.yeshi.buwan.videos.tencent.vo.TencentCoverInfoVO; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.lang.reflect.Type; import java.util.*; public class TencentVideoApiUtil { static ScriptEngine jsEngine = null; static Logger loggerDebug = LoggerFactory.getLogger("debug"); // static { // if (jdGoodsJs == null) // jdGoodsJs = getJDGoodsJS(); // ScriptEngineManager manager = new ScriptEngineManager(); // jsEngine = manager.getEngineByName("javascript"); // try { // jsEngine.eval(jdGoodsJs); // } catch (ScriptException e) { // e.printStackTrace(); // } // // if (jsEngine instanceof Invocable) { // Invocable in = (Invocable) jsEngine; // Object goodsId = in.invokeFunction("getGoodsId", link); // if (goodsId != null) // return goodsId.toString().trim(); // } // // } private static List objToArray(JSONObject root, String key) { if (root.optJSONObject(key) == null) { return null; } Gson gson = new Gson(); List directors = new ArrayList<>(); if (root.optJSONObject(key).isArray()) { Type type = new TypeToken>() { }.getType(); directors = gson.fromJson(root.optJSONArray(key).toString(), type); } else { JSONObject director = root.optJSONObject(key); for (Iterator its = director.keys(); its.hasNext(); ) { String p = its.next(); directors.add(director.optString(p)); } } root.remove(key); return directors; } private static List getPageData(String cid, String page_context) { List voList = new ArrayList<>(); Map headers = new HashMap<>(); headers.put("Content-Type", "application/json; charset=utf-8"); headers.put("Referer", "https://v.qq.com/"); String text = "{\"page_params\":{\"req_from\":\"web_vsite\",\"page_id\":\"vsite_episode_list\",\"page_type\":\"detail_operation\",\"id_type\":\"1\",\"page_size\":\"\",\"cid\":\"mzc002007j7p5hn\",\"vid\":\"\",\"lid\":\"\",\"page_num\":\"\",\"page_context\":\"chapter_name=&cid=mzc002007j7p5hn&detail_page_type=1&episode_begin=31&episode_end=60&episode_step=30&filter_rule_id=&id_type=1&is_nocopyright=false&is_skp_style=false&lid=&list_page_context=&need_tab=1&order=&page_num=1&page_size=30&req_from=web_vsite&req_from_second_type=&req_type=0&siteName=&tab_type=1&title_style=&ui_type=null&un_strategy_id=13dc6f30819942eb805250fb671fb082&watch_together_pay_status=0&year=\",\"detail_page_type\":\"1\"},\"has_cache\":1}"; JSONObject params = JSONObject.fromObject(text); params.optJSONObject("page_params").put("cid", cid + ""); params.optJSONObject("page_params").put("page_context", page_context + ""); String result = com.yeshi.buwan.util.HttpUtil.post("https://pbaccess.video.qq.com/trpc.universal_backend_service.page_server_rpc.PageServer/GetPageData?video_appid=3000010&vplatform=2&vversion_name=8.2.96", params.toString(), headers); System.out.println(result); JSONObject root = JSONObject.fromObject(result); JSONArray items = root.optJSONObject("data").optJSONArray("module_list_datas").optJSONObject(0).optJSONArray("module_datas").optJSONObject(0).optJSONObject("item_data_lists").optJSONArray("item_datas"); for (int i = 0; i < items.size(); i++) { JSONObject item = items.optJSONObject(i); if(item.optInt("item_type")!=1){ continue; } JSONObject item_params = item.optJSONObject("item_params"); TencentCoverInfoVO.EpisodeVO vo = new TencentCoverInfoVO.EpisodeVO(); vo.setCid(item_params.optString("cid")); vo.setDuration(item_params.optInt("duration")); vo.setEpIndex(item_params.optInt("title") - 1); vo.setFullTitle(item_params.optString("union_title")); vo.setIndex(item_params.optInt("title") - 1); vo.setIsNoStoreWatchHistory(item_params.optInt("is_no_store_watch_history") > 0); vo.setItemType(item.optString("item_type")); vo.setPic(item_params.optString("image_url")); vo.setPlayTitle(item_params.optString("play_title")); vo.setTitle(item_params.optString("title")); vo.setVid(item_params.optString("vid")); if(!vo.isIsNoStoreWatchHistory()){ voList.add(vo); } } return voList; } /** * @author hxh * @description 是否在线 * @date 17:39 2024/8/16 * @param: url * @return boolean **/ public static boolean isOnLine(String url) throws Exception{ Document doc = Jsoup.connect(url).timeout(10000).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36").get(); return doc.getElementsByClass("page_404").size()==0; } public static TencentCoverInfoVO getCoverInfo(String url) throws Exception { String script = null; Document doc = Jsoup.connect(url).timeout(10000).userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36").get(); Elements els = doc.getElementsByTag("script"); for (int i = 0; i < els.size(); i++) { if (els.get(i).html().indexOf("window.__PINIA__") > -1) { script = els.get(i).html(); break; } } script = script.replace("window.", "_window."); script = " var _window={};" + "var document={getElementsByTagName:function(tag){return [''];}};" + script; script += "\n function getCoverInfo(){return _window.__PINIA__.global.coverInfo;}; function getVideoInfo(){return _window.__PINIA__.episodeMain.listData;}";//episodeMain.listData[0].list[0]; ScriptEngineManager manager = new ScriptEngineManager(); 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 coverInfo = in.invokeFunction("getCoverInfo"); JSONObject root = JSONObject.fromObject(gson.toJson(coverInfo)); System.out.println(root.toString()); List vipIdsBeans = new ArrayList<>(); Object videoInfo = in.invokeFunction("getVideoInfo"); Object tabs = null; if (videoInfo instanceof Map) { Map videoInfoMap = (Map) videoInfo; String key = videoInfoMap.keySet().iterator().next().toString(); videoInfoMap = (Map) videoInfoMap.get(key); tabs = videoInfoMap.get("tabs"); videoInfoMap = (Map) videoInfoMap.get("list"); key = videoInfoMap.keySet().iterator().next().toString(); videoInfo = videoInfoMap.get(key); } else if (videoInfo instanceof List) { List tempList = (List) videoInfo; tabs = ((Map) tempList.get(0)).get("tabs"); tempList = (List) (((Map) tempList.get(0)).get("list")); videoInfo = tempList.get(0); } tabs = toList(tabs); TencentCoverInfoVO coverInfoBean = gson.fromJson(root.toString(), TencentCoverInfoVO.class); if (tabs != null&&((List) tabs).size()>0) { // 需要获取集 JSONArray tabArrays = JSONArray.fromObject(gson.toJson(tabs)); for (int i = 0; i < tabArrays.size(); i++) { String pageContext = tabArrays.optJSONObject(i).optString("pageContext"); List epList = getPageData(coverInfoBean.getCover_id(), pageContext); if (epList != null) { vipIdsBeans.addAll(epList); } } } else { System.out.printf(gson.toJson(videoInfo)); JSONObject episodeObj = JSONObject.fromObject(gson.toJson(videoInfo)); for (Object k : episodeObj.keySet()) { JSONObject item = episodeObj.optJSONObject(k.toString()); if (item.optBoolean("isNoStoreWatchHistory")) { continue; } vipIdsBeans.add(gson.fromJson(item.toString(), TencentCoverInfoVO.EpisodeVO.class)); } } try { coverInfoBean.setEpisodes(vipIdsBeans); return coverInfoBean; } catch (Exception e) { e.printStackTrace(); } } return null; } public static List getVideoList(int channelId, int pageIndex, Integer areaId) throws Exception { List coverInfoList = new ArrayList<>(); List list = TencentWebUtil.getVideoList(channelId, pageIndex,areaId); loggerDebug.info("腾讯视频:获取视频列表-{}:{}",channelId,list.size()); for (TencentWebUtil.TencentWebVideoInfo info : list) { try { TencentCoverInfoVO coverInfo = getCoverInfo(info.getPlayUrl()); if(StringUtil.isNullOrEmpty(coverInfo.getPublish_date())){ coverInfo.setPublish_date(info.getEpsodePubtime().substring(0,10)); } coverInfo.setEpisode_update(info.getTag()); coverInfo.setNew_pic_vt(info.getPicture()); coverInfoList.add(coverInfo); } catch (Exception e) { e.printStackTrace(); loggerDebug.error("腾讯视频:获取详情出错-"+info.getTitle(),e); }finally { Thread.sleep(2000); } } return coverInfoList; } private static List toList(Object data){ if(data instanceof Map){ List list=new ArrayList(); Map map=(Map) data; for(Object key:map.keySet()){ list.add(map.get(key)); } return list; }else if(data instanceof List){ return (List) data; } return null; } public static List getVideoListByCategory(String channel, int page,Integer areaId) { try { return getVideoList(TencentWebUtil.CHANNEL_ID_MAP.get(channel), page - 1, areaId); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) throws Exception { // getPageData("mzc002007j7p5hn", "chapter_name=&cid=mzc002007j7p5hn&detail_page_type=1&episode_begin=1&episode_end=30&episode_step=30&filter_rule_id=&id_type=1&is_nocopyright=false&is_skp_style=false&lid=&list_page_context=&need_tab=1&order=&page_num=0&page_size=30&req_from=web_vsite&req_from_second_type=&req_type=0&siteName=&tab_type=1&title_style=&ui_type=null&un_strategy_id=13dc6f30819942eb805250fb671fb082&watch_together_pay_status=0&year="); List voList = getVideoListByCategory("电视剧",1, null); // for(TencentCoverInfoVO vo:voList){ // System.out.println(vo.getTitle()); // } // System.out.printf(voList.toString()); // getCoverInfo("https://v.qq.com/x/cover/mzc002007j7p5hn/z0047b7g57k.html"); getCoverInfo("https://v.qq.com/x/cover/mcv8hkc8zk8lnov/r0048jp1a5e.html"); } }