diff --git a/app/src/main/java/com/github/catvod/spider/Czsapp.java b/app/src/main/java/com/github/catvod/spider/Czsapp.java new file mode 100644 index 0000000..60f0e5a --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Czsapp.java @@ -0,0 +1,435 @@ +package com.github.catvod.spider; + +import android.text.TextUtils; +import android.util.Base64; + +import com.github.catvod.crawler.Spider; +import com.github.catvod.crawler.SpiderDebug; +import com.github.catvod.utils.AES; +import com.github.catvod.utils.CBC; +import com.github.catvod.utils.gZip; +import com.github.catvod.utils.okhttp.OKCallBack; +import com.github.catvod.utils.okhttp.OkHttpUtil; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.StringReader; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Response; +import okhttp3.ResponseBody; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +public class Czsapp extends Spider { + private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)"); + private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\""); + private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\""); + private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',"); + private static final Pattern Db = Pattern.compile("/movie/(\\d+).html"); + private static final Pattern I = Pattern.compile("/page/(\\d+)"); + private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html"); + private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]"); + private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]"); + private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]"); + private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]"); + private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]"); + private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]"); + + + private String mmd5(String str) { + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(str.getBytes()); + byte[] digest = messageDigest.digest(); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + String hexString = Integer.toHexString(b & 255); + while (hexString.length() < 2) { + hexString = "0" + hexString; + } + sb.append(hexString); + } + return sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static Object[] loadsub(String sub) { + try { + OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { + @Override + protected void onFailure(Call call, Exception e) { + + } + + @Override + protected void onResponse(Response response) { + + } + }; + OkHttpClient YM = OkHttpUtil.defaultClient(); + OkHttpUtil.get(YM, sub, null, Headers(), callBack); + Response result = callBack.getResult(); + int code = result.code(); + if (code == 404) { + return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())}; + } + ResponseBody body = result.body(); + byte[] bytes = body.bytes(); + byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16); + byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length); + byte[] KS = CBC.CBC(data, tokenkey, tokenkey); + String vtt = gZip.KS(KS); + + + vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1"); + vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3"); + vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1"); + vtt = vtt.replaceAll("&(.*);", ""); + vtt = vtt.replaceAll(".*NOTE.*", ""); + BufferedReader br = new BufferedReader(new StringReader(vtt)); + ArrayList lines = new ArrayList<>(); + int captionNumber = 1; + String line = br.readLine(); + while (line != null) { + if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) { + if (lines.get(lines.size() - 1).trim().isEmpty()) { + lines.add(captionNumber + ""); + captionNumber++; + } + } + lines.add(line); + line = br.readLine(); + } + String join = TextUtils.join("\n", lines); + + return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())}; + } catch (Exception e) { + e.printStackTrace(); + SpiderDebug.log(e); + return null; + } + } + + public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { + try { + JSONObject jSONObject = new JSONObject(); + Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/" + str + "/page/" + str2, Headers())); + int parseInt = Integer.parseInt(str2); + int parseInt2 = Integer.parseInt(str2); + Matcher matcher = I.matcher(doc.select("div.pagenavi_txt > a.extend").last().attr("href")); + if (matcher.find()) { + parseInt2 = Integer.parseInt(matcher.group(1)); + } + Elements jS = doc.select("div.mi_ne_kd > ul > li"); + JSONArray jSONArray = new JSONArray(); + for (Element next : jS) { + Matcher matcher2 = Db.matcher(next.select("a").attr("href")); + if (matcher2.find()) { + String group = matcher2.group(1); + String trim = next.select("img").attr("alt").trim(); + String trim2 = next.select("img").attr("data-original").trim(); + String trim3 = next.select("div.hdinfo > span").text().trim(); + JSONObject jSONObject2 = new JSONObject(); + jSONObject2.put("vod_id", group); + jSONObject2.put("vod_name", trim); + jSONObject2.put("vod_pic", trim2); + jSONObject2.put("vod_remarks", trim3); + jSONArray.put(jSONObject2); + } + } + jSONObject.put("list", jSONArray); + jSONObject.put("page", parseInt); + jSONObject.put("pagecount", parseInt2); + jSONObject.put("limit", 24); + jSONObject.put("total", parseInt2 <= 1 ? jSONArray.length() : parseInt2 * 24); + return jSONObject.toString(); + } catch (Exception e) { + SpiderDebug.log(e); + return ""; + } + } + + public String detailContent(List list) { + String str2 = ""; + try { + + JSONObject jSONObject = new JSONObject(); + JSONArray jSONArray = new JSONArray(); + JSONObject jSONObject2 = new JSONObject(); + Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/movie/" + list.get(0) + ".html", Headers())); + String trim = doc.select("div.moviedteail_tt > h1").text().trim(); + String pY2 = doc.select("div.dyimg > img").attr("src"); + Iterator it = doc.select("ul.moviedteail_list > li").iterator(); + String str3 = str2; + String str4 = str3; + String str5 = str4; + String str6 = str5; + String str7 = str6; + String str8 = str7; + while (it.hasNext()) { + String trim2 = it.next().text().trim(); + if (trim2.length() >= 4) { + try { + String substring = trim2.substring(0, 2); + String substring2 = trim2.substring(3); + if (substring.equals("类型")) { + str3 = substring2; + } else if (substring.equals("地区")) { + str5 = substring2; + } else if (substring.equals("年份")) { + str4 = substring2; + } else if (substring.equals("导演")) { + str8 = substring2; + } else if (substring.equals("主演")) { + str7 = substring2; + } else if (substring.equals("豆瓣")) { + str6 = substring2; + } + } catch (Exception e) { + SpiderDebug.log(e); + } + } + } + jSONObject2.put("vod_id", list.get(0)); + jSONObject2.put("vod_name", trim); + jSONObject2.put("vod_pic", pY2); + jSONObject2.put("type_name", str3); + jSONObject2.put("vod_year", str4); + jSONObject2.put("vod_area", str5); + jSONObject2.put("vod_remarks", str6); + jSONObject2.put("vod_actor", str7); + jSONObject2.put("vod_director", str8); + jSONObject2.put("vod_content", doc.select("div.yp_context").text().trim()); + jSONObject2.put("vod_play_from", "厂长资源"); + ArrayList arrayList = new ArrayList(); + for (Element next : doc.select("div.paly_list_btn > a")) { + Matcher matcher = d.matcher(next.attr("href")); + if (matcher.find()) { + arrayList.add(next.text() + "$" + matcher.group(1)); + } + } + jSONObject2.put("vod_play_url", TextUtils.join("#", arrayList)); + jSONArray.put(jSONObject2); + jSONObject.put("list", jSONArray); + return jSONObject.toString(); + } catch (Exception e3) { + }return ""; + } + + public String homeContent(boolean z) { + try { + + JSONObject jSONObject = new JSONObject(); + Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com", Headers())); + Elements jS = doc.select(".navlist > li > a"); + JSONArray jSONArray = new JSONArray(); + for (Element next : jS) { + String pY2 = next.attr("href"); + if (pY2.length() > 1) { + String substring = pY2.substring(1); + String trim = next.text().trim(); + JSONObject jSONObject2 = new JSONObject(); + jSONObject2.put("type_id", substring); + jSONObject2.put("type_name", trim); + jSONArray.put(jSONObject2); + } + } + jSONObject.put("class", jSONArray); + Elements jS2 = doc.select("div.mi_ne_kd > ul > li"); + JSONArray jSONArray2 = new JSONArray(); + for (Element next2 : jS2) { + Matcher matcher = Db.matcher(next2.select("a").attr("href")); + if (matcher.find()) { + String group = matcher.group(1); + String trim2 = next2.select("img").attr("alt").trim(); + String trim3 = next2.select("img").attr("data-original").trim(); + String trim4 = next2.select("div.hdinfo > span").text().trim(); + JSONObject jSONObject3 = new JSONObject(); + jSONObject3.put("vod_id", group); + jSONObject3.put("vod_name", trim2); + jSONObject3.put("vod_pic", trim3); + jSONObject3.put("vod_remarks", trim4); + jSONArray2.put(jSONObject3); + } + } + jSONObject.put("list", jSONArray2); + return jSONObject.toString(); + } catch (Exception e) { + SpiderDebug.log(e); + return ""; + } + } + + protected static HashMap Headers() { + HashMap hashMap = new HashMap<>(); + hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"); + return hashMap; + } + + + public String playerContent(String str, String str2, List list) { + String str3; + String str4; + Elements G8; + try { + String K2 = OkHttpUtil.string("https://czspp.com/v_play/" + str2 + ".html", Headers()); + Document UR = Jsoup.parse(K2); + Matcher matcher = Y.matcher(K2); + if (matcher.find()) { + String group = matcher.group(1); + String KEY = matcher.group(2); + String IV = matcher.group(3); + String str5 = AES.CBC(group, KEY, IV); + Matcher matcher2 = pY.matcher(str5); + str3 = matcher2.find() ? matcher2.group(1) : ""; + Matcher matcher3 = m.matcher(str5); + str4 = matcher3.find() ? matcher3.group(1) : ""; + } else { + str4 = ""; + str3 = str4; + } + if (TextUtils.isEmpty(str3) && (G8 = UR.select("iframe.viframe")) != null) { + String pY2 = G8.attr("src"); + if (pY2.contains("jx.xmflv.com")) { + String K3 = OkHttpUtil.string(pY2, Headers()); + Matcher matcher4 = X.matcher(K3); + if (!matcher4.find()) { + return ""; + } + String group2 = matcher4.group(1); + Matcher matcher5 = a.matcher(K3); + if (!matcher5.find()) { + return ""; + } + String group3 = matcher5.group(1); + String K4 = OkHttpUtil.string("https://jx.xmflv.com/player.php?time=" + group2 + "&url=" + group3, Headers()); + Matcher matcher6 = K.matcher(K4); + if (!matcher6.find()) { + return ""; + } + String group4 = matcher6.group(1); + Matcher matcher7 = Oe.matcher(K4); + if (!matcher7.find()) { + return ""; + } + String group5 = matcher7.group(1); + Matcher matcher8 = fi.matcher(K4); + if (!matcher8.find()) { + return ""; + } + String group6 = matcher8.group(1); + Matcher matcher9 = M.matcher(K4); + if (!matcher9.find()) { + return ""; + } + String group7 = matcher9.group(1); + Matcher matcher10 = X.matcher(K4); + if (!matcher10.find()) { + return ""; + } + String group8 = matcher10.group(1); + byte[] bytes3 = mmd5(group5).getBytes(); + byte[] bytes4 = "UVE1NTY4MDY2NQ==".getBytes(); + Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding"); + cipher2.init(1, new SecretKeySpec(bytes3, "AES"), new IvParameterSpec(bytes4)); + String encodeToString = Base64.encodeToString(cipher2.doFinal(group5.getBytes()), 0); + OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { + + public void onResponse(Response response) { + } + + @Override + protected void onFailure(Call call, Exception exc) { + } + }; + HashMap hashMap = new HashMap(); + hashMap.put("url", group3); + hashMap.put("time", group8); + hashMap.put("ua", group6); + hashMap.put("cip", group7); + hashMap.put("vkey", group4); + hashMap.put("fvkey", encodeToString); + OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx.xmflv.com/xmflv-1.SVG", hashMap, Headers(), callBack); + str3 = new JSONObject(callBack.getResult().body().string()).getString("url"); + } else { + Matcher matcher11 = Q.matcher(OkHttpUtil.string(pY2, Headers())); + if (matcher11.find()) { + str3 = matcher11.group(1); + } + } + } + JSONObject jSONObject = new JSONObject(); + jSONObject.put("parse", "0"); + jSONObject.put("playUrl", ""); + jSONObject.put("url", str3); + jSONObject.put("header", ""); + if (!TextUtils.isEmpty(str4)) { + jSONObject.put("subf", "/vtt/utf-8"); + jSONObject.put("subt", Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4)); + } + return jSONObject.toString(); + } catch (Exception e) { + e.printStackTrace(); + SpiderDebug.log(e); + return ""; + } + } + + public String searchContent(String str, boolean z) { + try { + JSONObject jSONObject = new JSONObject(); + Elements jS = Jsoup.parse(OkHttpUtil.string("https://czspp.com/xssearch?q=" + URLEncoder.encode(str), Headers())).select("div.mi_ne_kd > ul > li"); + JSONArray jSONArray = new JSONArray(); + for (Element next : jS) { + Matcher matcher = Db.matcher(next.select("a").attr("href")); + JSONObject jSONObject2 = new JSONObject(); + if (matcher.find()) { + String group = matcher.group(1); + String trim = next.select("img").attr("alt").trim(); + if (trim.contains(str)) { + String trim2 = next.select("img").attr("src").trim(); + if (next.hasClass(".jidi")) { + String remark = next.select(".jidi span").text(); + jSONObject2.put("vod_remarks", remark); + } else { + String id = next.select("a").attr("href"); + Document doc = Jsoup.parse(OkHttpUtil.string(id, Headers())); + String remark = doc.select("ul.moviedteail_list li span").get(0).text(); + jSONObject2.put("vod_id", group); + jSONObject2.put("vod_name", trim); + jSONObject2.put("vod_pic", trim2); + jSONObject2.put("vod_remarks", remark); + jSONArray.put(jSONObject2); + } + } + } + } + jSONObject.put("list", jSONArray); + return jSONObject.toString(); + } catch (Exception e) { + SpiderDebug.log(e); + return ""; + } + } +} \ No newline at end of file