package com.github.catvod.spider;/* /** @auther lushunming */ import com.github.catvod.bean.Class; import com.github.catvod.bean.Filter; import com.github.catvod.bean.Result; import com.github.catvod.bean.Vod; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Notify; import com.github.catvod.utils.ProxyVideo; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Zxzj extends Spider { private final String siteUrl = "http://zxzj.shop"; private Map getHeader() { Map header = new HashMap<>(); header.put("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/100.0.4896.77 Mobile/15E148 Safari/604.1"); header.put("Connection", "keep-alive"); header.put("Referer", "http://zxzj.shop/"); header.put("sec-fetch-dest", "iframe"); header.put("sec-fetch-mode", "navigate"); header.put("sec-fetch-site", "cross-site"); return header; } private Map getVideoHeader() { Map header = new HashMap<>(); header.put("Accept", "*/*"); header.put("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7,de;q=0.6"); header.put("Cache-Control", "no-cache"); header.put("Connection", "keep-alive"); header.put("Pragma", "no-cache"); header.put("Sec-Fetch-Dest", "video"); header.put("Sec-Fetch-Mode", "no-cors"); header.put("Sec-Fetch-Site", "cross-site"); header.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"); /* header.put("sec-ch-ua", "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\""); header.put("sec-ch-ua-mobile", "?0"); header.put("sec-ch-ua-platform", "\"Windows\"");*/ return header; } @Override public String homeContent(boolean filter) throws Exception { List list = new ArrayList<>(); List classes = new ArrayList<>(); LinkedHashMap> filters = new LinkedHashMap<>(); Document doc = Jsoup.parse(OkHttp.string(siteUrl)); for (Element div : doc.select(".stui-header__menu > li ")) { classes.add(new Class(div.select(" a").attr("href"), div.select(" a").text())); } getVods(list, doc); return Result.string(classes, list); } private void getVods(List list, Document doc) { for (Element div : doc.select(".stui-vodlist >li")) { String id = div.select(".stui-vodlist__box > a.stui-vodlist__thumb").attr("href"); String name = div.select(".stui-vodlist__detail >h4.title > a").text(); String pic = div.select(".stui-vodlist__box > a.stui-vodlist__thumb").attr("data-original"); if (pic.isEmpty()) pic = div.select("img").attr("src"); String remark = div.select(".stui-vodlist__box > a.stui-vodlist__thumb > span").text(); list.add(new Vod(id, name, pic, remark)); } } @Override public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { List list = new ArrayList<>(); String[] arr = tid.split("\\."); String target = siteUrl + arr[0] + "-" + pg + ".html"; //String filters = extend.get("filters"); String html = OkHttp.string(target); Document doc = Jsoup.parse(html); getVods(list, doc); String total = "" + Integer.MAX_VALUE; return Result.get().vod(list).page(Integer.parseInt(pg), Integer.parseInt(total) / 12 + ((Integer.parseInt(total) % 12) > 0 ? 1 : 0), 12, Integer.parseInt(total)).string(); } @Override public String detailContent(List ids) throws Exception { Document doc = Jsoup.parse(OkHttp.string(this.siteUrl + ids.get(0), getHeader())); Elements sources = Objects.requireNonNull(doc.select("ul.stui-content__playlist").first()).children(); StringBuilder vod_play_url = new StringBuilder(); StringBuilder vod_play_from = new StringBuilder("在线之家").append("$$$"); for (int i = 0; i < sources.size(); i++) { String href = sources.get(i).select("a").attr("href"); String text = sources.get(i).text(); vod_play_url.append(text).append("$").append(href); boolean notLastEpisode = i < sources.size() - 1; vod_play_url.append(notLastEpisode ? "#" : "$$$"); } String title = doc.select(" .stui-content__detail > h1").text(); String classifyName = doc.select(".stui-content__detail > p:nth-child(1)").text(); String year = doc.select(".stui-content__detail > p:nth-child(1)").text(); String area = doc.select(".stui-content__detail > p:nth-child(1)").text(); String remark = doc.select(".stui-content__detail > p:nth-child(1)").text(); String vodPic = doc.select(" div.stui-content__thumb > a > img").attr("data-original"); String director = doc.select(".stui-content__detail > p:nth-child(3)").text(); String actor = doc.select(".stui-content__detail > p:nth-child(2)").text(); String brief = doc.select(".detail-sketch").text(); Vod vod = new Vod(); vod.setVodId(ids.get(0)); vod.setVodYear(year); vod.setVodName(title); vod.setVodArea(area); vod.setVodActor(actor); vod.setVodPic(vodPic); vod.setVodRemarks(remark); vod.setVodContent(brief); vod.setVodDirector(director); vod.setTypeName(classifyName); vod.setVodPlayFrom(vod_play_from.toString()); vod.setVodPlayUrl(vod_play_url.toString()); return Result.string(vod); } @Override public String searchContent(String key, boolean quick) throws Exception { String searchUrl = siteUrl + "/vodsearch/-------------.html?wd=" + key + "&submit="; String html = OkHttp.string(searchUrl); if (html.contains("Just a moment")) { Notify.show("在线之家资源需要人机验证"); } Document document = Jsoup.parse(html); List list = new ArrayList<>(); for (Element div : document.select(".stui-vodlist__media >li")) { String id = div.select("a.stui-vodlist__thumb").attr("href"); String name = div.select(".detail >h3.title > a").text(); String pic = div.select("a.stui-vodlist__thumb").attr("data-original"); if (pic.isEmpty()) pic = div.select("img").attr("src"); String remark = div.select("a.stui-vodlist__thumb > span.pic-text").text(); list.add(new Vod(id, name, pic, remark)); } return Result.string(list); } @Override public String playerContent(String flag, String id, List vipFlags) throws Exception { String content = OkHttp.string(this.siteUrl + id, getHeader()); Matcher matcher = Pattern.compile("player_aaaa=(.*?)").matcher(content); String json = matcher.find() ? matcher.group(1) : ""; org.json.JSONObject player = new JSONObject(json); String realUrl = player.getString("url"); if(realUrl.indexOf("m3u8")>-1){ return Result.get().url(realUrl).header(getVideoHeader()).string(); } String videoContent = OkHttp.string(realUrl, getHeader()); Matcher matcher2 = Pattern.compile("result_v2 =(.*?);").matcher(videoContent); String json2 = matcher2.find() ? matcher2.group(1) : ""; org.json.JSONObject jsonObject = new JSONObject(json2); String encodedStr = jsonObject.getString("data"); realUrl = new String(new BigInteger(StringUtils.reverse(encodedStr), 16).toByteArray()); Map header = getVideoHeader(); String temp = decodeStr(realUrl); return Result.get().url(ProxyVideo.buildCommonProxyUrl(temp, header)).header(getVideoHeader()).string(); } String decodeStr(String _0x267828) { int _0x5cd2b5 = (_0x267828.length() - 7) / 2; String _0x2191ed = _0x267828.substring(0, _0x5cd2b5); String _0x35a256 = _0x267828.substring(_0x5cd2b5 + 7); return _0x2191ed + _0x35a256; } }