| | |
| | | package com.yeshi.buwan.util.video.web; |
| | | |
| | | import org.jsoup.Jsoup; |
| | | import org.jsoup.nodes.Document; |
| | | import org.jsoup.nodes.Element; |
| | | import org.jsoup.select.Elements; |
| | | import org.yeshi.utils.HttpUtil; |
| | | import net.sf.json.JSONObject; |
| | | import org.yeshi.utils.StringUtil; |
| | | |
| | | import java.io.UnsupportedEncodingException; |
| | |
| | | |
| | | public class TencentWebUtil { |
| | | |
| | | final public static Map<String,Integer> CHANNEL_ID_MAP=new HashMap<>(); |
| | | static{ |
| | | CHANNEL_ID_MAP.put("电影",100173); |
| | | CHANNEL_ID_MAP.put("电视剧",100113); |
| | | CHANNEL_ID_MAP.put("动漫",100119); |
| | | } |
| | | |
| | | public static class TencentWebVideoInfo { |
| | | private String playUrl; |
| | | private String id; |
| | | private String title; |
| | | private String picture; |
| | | private String duration; |
| | | private String tag; |
| | | private String epsodePubtime; |
| | | |
| | | public String getEpsodePubtime() { |
| | | return epsodePubtime; |
| | | } |
| | | |
| | | public void setEpsodePubtime(String epsodePubtime) { |
| | | this.epsodePubtime = epsodePubtime; |
| | | } |
| | | |
| | | public String getPlayUrl() { |
| | | return playUrl; |
| | |
| | | public void setDuration(String duration) { |
| | | this.duration = duration; |
| | | } |
| | | |
| | | public String getTag() { |
| | | return tag; |
| | | } |
| | | |
| | | public void setTag(String tag) { |
| | | this.tag = tag; |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | /** |
| | | * 获取短视频列表 |
| | | * |
| | | * @param params |
| | | * @param page |
| | | * @param channelId 100173:电影 100113:电视剧 100119:动漫 |
| | | * @param pageIndex |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public static List<TencentWebVideoInfo> getVideoList(Map<String, String> params, int page) throws Exception { |
| | | if (params == null) |
| | | throw new Exception("参数为空"); |
| | | int pageSize = 30; |
| | | params.put("append", "1"); |
| | | params.put("listpage", page + ""); |
| | | params.put("offset", (page - 1) * pageSize + ""); |
| | | params.put("pagesize", pageSize + ""); |
| | | |
| | | String url = "https://v.qq.com/x/bu/pagesheet/list"; |
| | | public static List<TencentWebVideoInfo> getVideoList(int channelId, int pageIndex, Integer areaId) throws Exception { |
| | | List<TencentWebVideoInfo> videoList=new ArrayList<>(); |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("referer", "https://v.qq.com/channel/ent"); |
| | | headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"); |
| | | String result = HttpUtil.get(url, params, headers); |
| | | Document document = Jsoup.parse(result); |
| | | Elements els = document.getElementsByClass("list_item"); |
| | | return parseVideoList(els); |
| | | } |
| | | |
| | | |
| | | public static List<TencentWebVideoInfo> getVideoList(String url) throws Exception { |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("referer", "https://v.qq.com/channel/ent"); |
| | | headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"); |
| | | String result = HttpUtil.get(url, new HashMap<>(), headers); |
| | | Document document = Jsoup.parse(result); |
| | | Elements els = document.getElementsByClass("list_item"); |
| | | return parseVideoList(els); |
| | | } |
| | | |
| | | private static List<TencentWebVideoInfo> parseVideoList(Elements els) throws UnsupportedEncodingException { |
| | | List<TencentWebVideoInfo> list = new ArrayList<>(); |
| | | for (int i = 0; i < els.size(); i++) { |
| | | Element ele = els.get(i); |
| | | String href = ele.getElementsByTag("a").get(0).attr("href"); |
| | | String id = ele.getElementsByTag("a").get(0).attr("data-float"); |
| | | String title = ele.getElementsByTag("a").get(0).attr("title"); |
| | | title = new String(title.getBytes("ISO-8859-1"), "UTF-8"); |
| | | String picture = ele.getElementsByTag("img").get(0).attr("src"); |
| | | picture = picture.startsWith("http") ? picture : "https:" + picture; |
| | | String duration = null; |
| | | try { |
| | | duration = ele.getElementsByClass("figure_caption").get(0).ownText(); |
| | | duration = duration.trim(); |
| | | for (int j = 0; j < duration.length(); j++) { |
| | | char ca = duration.charAt(j); |
| | | if (!(ca >= 48 && ca < 59)) { |
| | | duration = null; |
| | | break; |
| | | } |
| | | } |
| | | System.out.println(duration); |
| | | } catch (Exception e) { |
| | | } |
| | | TencentWebVideoInfo videoInfo = new TencentWebVideoInfo(); |
| | | videoInfo.setDuration(duration); |
| | | videoInfo.setId(id); |
| | | videoInfo.setPicture(picture); |
| | | videoInfo.setPlayUrl(href); |
| | | videoInfo.setTitle(title); |
| | | list.add(videoInfo); |
| | | headers.put("Content-Type", "application/json; charset=utf-8"); |
| | | headers.put("Referer", "https://v.qq.com/"); |
| | | String text = |
| | | "{\"page_context\":{\"page_index\":\"1\"},\"page_params\":{\"page_id\":\"channel_list_second_page\",\"page_type\":\"operation\",\"channel_id\":\"100173\",\"filter_params\":\"sort=75\",\"page\":\"1\",\"new_mark_label_enabled\":\"1\"},\"page_bypass_params\":{\"params\":{\"page_id\":\"channel_list_second_page\",\"page_type\":\"operation\",\"channel_id\":\"100173\",\"filter_params\":\"sort=75\",\"page\":\"1\",\"caller_id\":\"3000010\",\"platform_id\":\"2\",\"data_mode\":\"default\",\"user_mode\":\"default\"},\"scene\":\"operation\",\"abtest_bypass_id\":\"77fef11ab0ccd4ee\"}}"; |
| | | JSONObject params=JSONObject.fromObject(text); |
| | | params.optJSONObject("page_context").put("page_index",pageIndex+""); |
| | | params.optJSONObject("page_params").put("channel_id",channelId+""); |
| | | params.optJSONObject("page_params").put("page",pageIndex+""); |
| | | if(areaId!=null) { |
| | | params.optJSONObject("page_params").put("filter_params", params.optJSONObject("page_params").get("filter_params") + "&iarea=" + areaId); |
| | | } |
| | | return list; |
| | | params.optJSONObject("page_bypass_params").optJSONObject("params").put("page",pageIndex+""); |
| | | params.optJSONObject("page_bypass_params").optJSONObject("params").put("channel_id",channelId+""); |
| | | |
| | | String result = com.yeshi.buwan.util.HttpUtil.post("https://pbaccess.video.qq.com/trpc.vector_layout.page_view.PageService/getPage?video_appid=3000010", params.toString(), headers); |
| | | |
| | | |
| | | com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSONObject.parseObject(result); |
| | | if (resultJson.getInteger("ret") == 0) { |
| | | |
| | | com.alibaba.fastjson.JSONObject data = resultJson.getJSONObject("data"); |
| | | com.alibaba.fastjson.JSONArray array = data.getJSONArray("CardList"); |
| | | for (int i = 0; i < array.size(); i++) { |
| | | if (array.getJSONObject(i).getString("type").equalsIgnoreCase("channel_list_poster")) { |
| | | array = array.getJSONObject(i).getJSONObject("children_list").getJSONObject("list").getJSONArray("cards"); |
| | | for (int j = 0; j < array.size(); j++) { |
| | | if (array.getJSONObject(j).getString("type").equalsIgnoreCase("channel_list_poster")) { |
| | | com.alibaba.fastjson.JSONObject item = array.getJSONObject(j).getJSONObject("params"); |
| | | TencentWebVideoInfo video = parseListItem(item); |
| | | videoList.add(video); |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | return videoList; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | public static String getApiUrl(String webUrl, int page) { |
| | | Map<String, String> params = parseParams(webUrl); |
| | |
| | | return url + "?" + StringUtil.concat(paramsList, "&"); |
| | | } |
| | | |
| | | private static TencentWebVideoInfo parseListItem(com.alibaba.fastjson.JSONObject item) { |
| | | TencentWebVideoInfo videoInfo = new TencentWebVideoInfo(); |
| | | videoInfo.setId(item.getString("cid")); |
| | | videoInfo.setPicture(item.getString("new_pic_vt")); |
| | | videoInfo.setPlayUrl(String.format("https://v.qq.com/x/cover/%s.html", videoInfo.getId())); |
| | | videoInfo.setTitle(item.getString("title")); |
| | | videoInfo.setDuration(""); |
| | | if (item.getInteger("type") != 1) { |
| | | videoInfo.setTag(item.getString("timelong")); |
| | | } else { |
| | | JSONObject imgTag = JSONObject.fromObject(item.getString("uni_imgtag")); |
| | | for (Object key : imgTag.keySet()) { |
| | | JSONObject imgTagItem = imgTag.optJSONObject(key.toString()); |
| | | if (imgTagItem.optInt("id") == 28) { |
| | | videoInfo.setTag(imgTagItem.optString("text")); |
| | | } |
| | | } |
| | | if(videoInfo.getTag()==null){ |
| | | videoInfo.setTag("9.0分"); |
| | | } |
| | | } |
| | | videoInfo.setEpsodePubtime(item.getString("epsode_pubtime")); |
| | | return videoInfo; |
| | | } |
| | | |
| | | |
| | | public static void main(String[] args) throws Exception { |
| | | List<TencentWebVideoInfo> videoInfos = getVideoList(parseParams("https://v.qq.com/channel/ent?_all=1&channel=ent&iarea=2&itype=-1&listpage=1&sort=40"), 1); |
| | | System.out.println(videoInfos); |
| | | |
| | | List<TencentWebVideoInfo> list = getVideoList(100173,0, 100028); |
| | | System.out.println(list.size()); |
| | | |
| | | } |
| | | } |