package com.yeshi.buwan.tencent; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.yeshi.buwan.tencent.entity.TencentCoverInfo; 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; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TencentVideoApiUtil { static ScriptEngine jsEngine = null; // 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; } public static TencentCoverInfo 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("var COVER_INFO") > -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 COVER_INFO }; function getVideoInfo(){return VIDEO_INFO}"; 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<>(); if (root.optJSONObject("vip_ids").isArray()) { Type type = new TypeToken>() { }.getType(); vipIdsBeans = gson.fromJson(root.optJSONArray("vip_ids").toString(), type); } else { JSONObject vipIds = root.optJSONObject("vip_ids"); for (Iterator its = vipIds.keys(); its.hasNext(); ) { String p = its.next(); TencentCoverInfo.VipIdsBean idsBean = gson.fromJson(vipIds.optJSONObject(p).toString(), TencentCoverInfo.VipIdsBean.class); idsBean.setP(Integer.parseInt(p)); vipIdsBeans.add(idsBean); } } root.remove("vip_ids"); try { List subTypes = objToArray(root, "subtype"); List directors = objToArray(root, "director"); List leadingActor = objToArray(root, "leading_actor"); List subGenre = objToArray(root, "sub_genre"); TencentCoverInfo coverInfoBean = gson.fromJson(root.toString(), TencentCoverInfo.class); coverInfoBean.setVip_ids(vipIdsBeans); coverInfoBean.setSubtype(subTypes); coverInfoBean.setDirector(directors); coverInfoBean.setLeading_actor(leadingActor); coverInfoBean.setSub_genre(subGenre); return coverInfoBean; } catch (Exception e) { e.printStackTrace(); } // System.out.println(coverInfoBean); } return null; } private static List parseList(String url) { List coverInfoList = new ArrayList<>(); try { Document document = Jsoup.connect(url).timeout(5000).get(); Elements els = document.getElementsByAttributeValue("class", "list_item"); for (int i = 0; i < els.size(); i++) { String href = els.get(i).getElementsByTag("a").get(0).attr("href"); String img = els.get(i).getElementsByTag("img").get(0).attr("src"); img = img.startsWith("http") ? img : "http:" + img; try { TencentCoverInfo coverInfo = getCoverInfo(href); coverInfo.setVertical_pic_url(img); coverInfoList.add(coverInfo); } catch (Exception e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } return coverInfoList; } public static List getVideoListByCategory(String channel, int page) { return parseList(String.format("https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=%s&ipay=2&listpage=%s&offset=%s&pagesize=30&sort=18", channel, page, (page - 1) * 30)); } public static void main(String[] args) throws Exception { // try { TencentCoverInfo info = getCoverInfo("https://v.qq.com/x/cover/7q544xyrava3vxf.html"); System.out.println(info); // // info = getCoverInfo("https://v.qq.com/x/cover/mzc00200s0ii272/r0036xibgw2.html"); // info = getCoverInfo("https://v.qq.com/x/cover/ylgl3m6wo0sypou/w0036x9c5c7.html"); // info = getCoverInfo("https://v.qq.com/x/cover/ylgl3m6wo0sypou/w0036x9c5c7.html"); // // // info = getCoverInfo("https://v.qq.com/x/cover/mzc00200tlv15ub.html"); // System.out.println(info); // } catch (Exception e) { // e.printStackTrace(); // } int page = 1; List list = getVideoListByCategory("cartoon", 1); System.out.println(list); } }