diff --git a/app/src/main/java/com/github/catvod/bean/uvod/Data.java b/app/src/main/java/com/github/catvod/bean/uvod/Data.java index 968ec984..df3297d1 100644 --- a/app/src/main/java/com/github/catvod/bean/uvod/Data.java +++ b/app/src/main/java/com/github/catvod/bean/uvod/Data.java @@ -14,7 +14,7 @@ import java.util.List; public class Data { @SerializedName(value = "video_latest_list", alternate = {"video_list"}) - private List videolatestlist; + private List videolatestlist; @SerializedName(value = "video", alternate = {"video_soruce"}) private Video video; @SerializedName("video_fragment_list") @@ -22,13 +22,11 @@ public class Data { public static Data objectFrom(String str) { JsonObject jsonObject = JsonParser.parseString(str).getAsJsonObject(); - if (jsonObject.has("data")) { - return new Gson().fromJson(jsonObject.get("data"), Data.class); - } + if (jsonObject.has("data")) return new Gson().fromJson(jsonObject.get("data"), Data.class); return new Data(); } - public List getVideolatest() { + public List getVideoLatest() { return videolatestlist == null ? Collections.emptyList() : videolatestlist; } @@ -40,8 +38,8 @@ public class Data { return videoFragmentList == null ? Collections.emptyList() : videoFragmentList; } + public static class VideoLatest { - public static class Videolatest { @SerializedName("id") private String id; @SerializedName("title") @@ -85,6 +83,7 @@ public class Data { } public static class Video { + @SerializedName("year") private String year; @SerializedName("region") @@ -136,6 +135,7 @@ public class Data { } public static class VideoFragmentList { + @SerializedName("id") private String id; @SerializedName("symbol") @@ -148,8 +148,5 @@ public class Data { public String getSymbol() { return TextUtils.isEmpty(symbol) ? "" : symbol; } - } - - } \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Uvod.java b/app/src/main/java/com/github/catvod/spider/Uvod.java index 21fabae4..02e7a987 100644 --- a/app/src/main/java/com/github/catvod/spider/Uvod.java +++ b/app/src/main/java/com/github/catvod/spider/Uvod.java @@ -8,7 +8,7 @@ import com.github.catvod.bean.Vod; import com.github.catvod.bean.uvod.Data; import com.github.catvod.crawler.Spider; import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.AES; +import com.github.catvod.utils.Crypto; import com.github.catvod.utils.Util; import java.net.URLEncoder; @@ -29,30 +29,8 @@ public class Uvod extends Spider { private static final String list = siteUrl + "/video/list"; private static final String detail = siteUrl + "/video/info"; private static final String play = siteUrl + "/video/source"; - - private static final String publicKeyPem = "-----BEGIN PUBLIC KEY-----\n" + - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeBQWotWOpsuPn3PAA+bcmM8YD\n" + - "fEOzPz7hb/vItV43vBJV2FcM72Hdcv3DccIFuEV9LQ8vcmuetld98eksja9vQ1Ol\n" + - "8rTnjpTpMbd4HedevSuIhWidJdMAOJKDE3AgGFcQvQePs80uXY2JhTLkRn2ICmDR\n" + - "/fb32OwWY3QGOvLcuQIDAQAB\n" + - "-----END PUBLIC KEY-----"; - private static final String privateKeyPem = - "-----BEGIN PRIVATE KEY-----\n" + - "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ4FBai1Y6my4+fc\n" + - "8AD5tyYzxgN8Q7M/PuFv+8i1Xje8ElXYVwzvYd1y/cNxwgW4RX0tDy9ya562V33x\n" + - "6SyNr29DU6XytOeOlOkxt3gd5169K4iFaJ0l0wA4koMTcCAYVxC9B4+zzS5djYmF\n" + - "MuRGfYgKYNH99vfY7BZjdAY68ty5AgMBAAECgYB1rbvHJj5wVF7Rf4Hk2BMDCi9+\n" + - "zP4F8SW88Y6KrDbcPt1QvOonIea56jb9ZCxf4hkt3W6foRBwg86oZo2FtoZcpCJ+\n" + - "rFqUM2/wyV4CuzlL0+rNNSq7bga7d7UVld4hQYOCffSMifyF5rCFNH1py/4Dvswm\n" + - "pi5qljf+dPLSlxXl2QJBAMzPJ/QPAwcf5K5nngQtbZCD3nqDFpRixXH4aUAIZcDz\n" + - "S1RNsHrT61mEwZ/thQC2BUJTQNpGOfgh5Ecd1MnURwsCQQDFhAFfmvK7svkygoKX\n" + - "t55ARNZy9nmme0StMOfdb4Q2UdJjfw8+zQNtKFOM7VhB7ijHcfFuGsE7UeXBe20n\n" + - "g/XLAkEAv9SoT2hgJaQxxUk4MCF8pgddstJlq8Z3uTA7JMa4x+kZfXTm/6TOo6I8\n" + - "2VbXZLsYYe8op0lvsoHMFvBSBljV0QJBAKhxyoYRa98dZB5qZRskciaXTlge0WJk\n" + - "kA4vvh3/o757izRlQMgrKTfng1GVfIZFqKtnBiIDWTXQw2N9cnqXtH8CQAx+CD5t\n" + - "l1iT0cMdjvlMg2two3SnpOjpo7gALgumIDHAmsUWhocLtcrnJI032VQSUkNnLq9z\n" + - "EIfmHDz0TPVNHBQ=\n" + - "-----END PRIVATE KEY-----"; + private static final String publicKeyPem = "-----BEGIN PUBLIC KEY-----\n" + "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeBQWotWOpsuPn3PAA+bcmM8YD\n" + "fEOzPz7hb/vItV43vBJV2FcM72Hdcv3DccIFuEV9LQ8vcmuetld98eksja9vQ1Ol\n" + "8rTnjpTpMbd4HedevSuIhWidJdMAOJKDE3AgGFcQvQePs80uXY2JhTLkRn2ICmDR\n" + "/fb32OwWY3QGOvLcuQIDAQAB\n" + "-----END PUBLIC KEY-----"; + private static final String privateKeyPem = "-----BEGIN PRIVATE KEY-----\n" + "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ4FBai1Y6my4+fc\n" + "8AD5tyYzxgN8Q7M/PuFv+8i1Xje8ElXYVwzvYd1y/cNxwgW4RX0tDy9ya562V33x\n" + "6SyNr29DU6XytOeOlOkxt3gd5169K4iFaJ0l0wA4koMTcCAYVxC9B4+zzS5djYmF\n" + "MuRGfYgKYNH99vfY7BZjdAY68ty5AgMBAAECgYB1rbvHJj5wVF7Rf4Hk2BMDCi9+\n" + "zP4F8SW88Y6KrDbcPt1QvOonIea56jb9ZCxf4hkt3W6foRBwg86oZo2FtoZcpCJ+\n" + "rFqUM2/wyV4CuzlL0+rNNSq7bga7d7UVld4hQYOCffSMifyF5rCFNH1py/4Dvswm\n" + "pi5qljf+dPLSlxXl2QJBAMzPJ/QPAwcf5K5nngQtbZCD3nqDFpRixXH4aUAIZcDz\n" + "S1RNsHrT61mEwZ/thQC2BUJTQNpGOfgh5Ecd1MnURwsCQQDFhAFfmvK7svkygoKX\n" + "t55ARNZy9nmme0StMOfdb4Q2UdJjfw8+zQNtKFOM7VhB7ijHcfFuGsE7UeXBe20n\n" + "g/XLAkEAv9SoT2hgJaQxxUk4MCF8pgddstJlq8Z3uTA7JMa4x+kZfXTm/6TOo6I8\n" + "2VbXZLsYYe8op0lvsoHMFvBSBljV0QJBAKhxyoYRa98dZB5qZRskciaXTlge0WJk\n" + "kA4vvh3/o757izRlQMgrKTfng1GVfIZFqKtnBiIDWTXQw2N9cnqXtH8CQAx+CD5t\n" + "l1iT0cMdjvlMg2two3SnpOjpo7gALgumIDHAmsUWhocLtcrnJI032VQSUkNnLq9z\n" + "EIfmHDz0TPVNHBQ=\n" + "-----END PRIVATE KEY-----"; private Map getHeader(String url) { String[] item = url.split("\\|"); @@ -74,7 +52,7 @@ public class Uvod extends Spider { } else if (URL.equals(play)) { text = String.format("-quality=4&video_fragment_id=%s&video_id=%s-%s", pg, tid, hm); } - String sign = AES.MD5(text); + String sign = Util.MD5(text); Map header = new HashMap<>(); header.put("User-Agent", Util.CHROME); header.put("referer", "https://www.uvod.tv/"); @@ -84,7 +62,6 @@ public class Uvod extends Spider { header.put("x-signature", sign); header.put("x-timestamp", hm); header.put("x-token", ""); - System.out.println(header); return header; } @@ -98,15 +75,13 @@ public class Uvod extends Spider { @Override public void init(Context context, String extend) throws Exception { - if (!extend.isEmpty()) { - siteUrl = extend; - } + if (!extend.isEmpty()) siteUrl = extend; } public String encrypt(String data) throws Exception { - String aesKey = AES.randomKey(32); - String aesEncryptedData = AES.aesEncrypt(data, aesKey, "abcdefghijklmnop"); - String rsaEncryptedKey = AES.rsaEncrypt(aesKey, publicKeyPem); + String aesKey = Crypto.randomKey(32); + String aesEncryptedData = Crypto.aesEncrypt(data, aesKey, "abcdefghijklmnop"); + String rsaEncryptedKey = Crypto.rsaEncrypt(aesKey, publicKeyPem); return aesEncryptedData + "." + rsaEncryptedKey; } @@ -117,9 +92,9 @@ public class Uvod extends Spider { return null; } String rsaEncryptedKey = parts[1]; - String decryptedKey = AES.decryptRSA(rsaEncryptedKey, privateKeyPem); + String decryptedKey = Crypto.rsaDecrypt(rsaEncryptedKey, privateKeyPem); String aesEncryptedData = parts[0]; - return AES.CBC(aesEncryptedData, decryptedKey, "abcdefghijklmnop"); + return Crypto.CBC(aesEncryptedData, decryptedKey, "abcdefghijklmnop"); } @Override @@ -127,15 +102,14 @@ public class Uvod extends Spider { List classes = new ArrayList<>(); List typeIds = Arrays.asList("101", "100", "106", "102", "103", "104", "105"); List typeNames = Arrays.asList("电视剧", "电影", "粤台专区", "综艺", "动漫", "体育", "纪录片"); - for (int i = 0; i < typeIds.size(); i++) - classes.add(new Class(typeIds.get(i), typeNames.get(i))); + for (int i = 0; i < typeIds.size(); i++) classes.add(new Class(typeIds.get(i), typeNames.get(i))); String param = "{\"parent_category_id\":101}"; String encryptData = encrypt(param); String content = OkHttp.post(latest, encryptData, getHeader(latest)).getBody(); String decryptData = decrypt(content); List list = new ArrayList<>(); Data data = Data.objectFrom(decryptData); - for (Data.Videolatest video : data.getVideolatest()) { + for (Data.VideoLatest video : data.getVideoLatest()) { list.add(video.vod()); } return Result.string(classes, list); @@ -149,7 +123,7 @@ public class Uvod extends Spider { String decryptData = decrypt(content); List list = new ArrayList<>(); Data data = Data.objectFrom(decryptData); - for (Data.Videolatest video : data.getVideolatest()) { + for (Data.VideoLatest video : data.getVideoLatest()) { list.add(video.vod()); } return Result.string(list); @@ -196,7 +170,7 @@ public class Uvod extends Spider { String decryptData = decrypt(content); List list = new ArrayList<>(); Data data = Data.objectFrom(decryptData); - for (Data.Videolatest video : data.getVideolatest()) { + for (Data.VideoLatest video : data.getVideoLatest()) { list.add(video.vod()); } return Result.string(list); @@ -216,5 +190,4 @@ public class Uvod extends Spider { String realUrl = video.getUrl(); return Result.get().url(realUrl).header(playHeader()).string(); } - -} +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/utils/AES.java b/app/src/main/java/com/github/catvod/utils/Crypto.java similarity index 56% rename from app/src/main/java/com/github/catvod/utils/AES.java rename to app/src/main/java/com/github/catvod/utils/Crypto.java index 61a9dcfa..22149b2a 100644 --- a/app/src/main/java/com/github/catvod/utils/AES.java +++ b/app/src/main/java/com/github/catvod/utils/Crypto.java @@ -1,30 +1,21 @@ package com.github.catvod.utils; -import android.annotation.SuppressLint; +import android.util.Base64; -import java.net.URLDecoder; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.security.Key; import java.security.KeyFactory; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; import javax.crypto.Cipher; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -public class AES { +public class Crypto { - @SuppressLint("NewApi") public static String CBC(String src, String KEY, String IV) { try { src = src.replace("\\", ""); @@ -32,84 +23,50 @@ public class AES { SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); - byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(src)); + byte[] decrypted = cipher.doFinal(Base64.decode(src, Base64.DEFAULT)); return new String(decrypted); } catch (Exception ignored) { - + return ""; } - return null; } - @SuppressLint("NewApi") public static String aesEncrypt(String data, String key, String iv) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); - return Base64.getEncoder().withoutPadding().encodeToString(encrypted); - + return Base64.encodeToString(encrypted, Base64.NO_PADDING); } - @SuppressLint("NewApi") public static String rsaEncrypt(String data, String publicKeyPem) throws Exception { - String publicKeyPEM = publicKeyPem.replace("-----BEGIN PUBLIC KEY-----", "") - .replace("-----END PUBLIC KEY-----", "") - .replaceAll("\\s+", ""); - byte[] decoded = Base64.getDecoder().decode(publicKeyPEM); + String publicKeyPEM = publicKeyPem.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replaceAll("\\s+", ""); + byte[] decoded = Base64.decode(publicKeyPEM, Base64.DEFAULT); X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(spec); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); - return Base64.getEncoder().encodeToString(encrypted); + return Base64.encodeToString(encrypted, Base64.DEFAULT); } - @SuppressLint("NewApi") - public static String decryptRSA(String encryptedKey, String privateKeyPem) throws Exception { - String privateKeyPEM = privateKeyPem.replace("-----BEGIN PRIVATE KEY-----", "") - .replace("-----END PRIVATE KEY-----", "") - .replaceAll("\\s", ""); - byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyPEM); + public static String rsaDecrypt(String encryptedKey, String privateKeyPem) throws Exception { + String privateKeyPEM = privateKeyPem.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s", ""); + byte[] privateKeyBytes = Base64.decode(privateKeyPEM, Base64.DEFAULT); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedKey)); + byte[] decrypted = cipher.doFinal(Base64.decode(encryptedKey, Base64.DEFAULT)); return new String(decrypted, StandardCharsets.UTF_8); } - public static String MD5(String src) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] bytes = md.digest(src.getBytes(Charset.forName("UTF-8"))); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - int v = bytes[i] & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - sb.append(0); - } - sb.append(hv); - } - return sb.toString().toLowerCase(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return ""; - } - public static String randomKey(int size) { - String keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; StringBuilder key = new StringBuilder(); - for (int i = 0; i < size; i++) { - int pos = (int) Math.floor(Math.random() * keys.length()); - key.append(keys.charAt(pos)); - } + String keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + for (int i = 0; i < size; i++) key.append(keys.charAt((int) Math.floor(Math.random() * keys.length()))); return key.toString(); } - } diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 678136f8..f4513768 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 5cf48cc5..ba831547 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -150642bf400eaca2938193dc2d092663 +963016ff591ca82b430d9863bc55f11f