From 100cf7a90fbaee21e9109c8f8b87c361ea8c7ea8 Mon Sep 17 00:00:00 2001 From: dlgt7 <102397160+dlgt7@users.noreply.github.com> Date: Sun, 14 Aug 2022 01:36:46 +0800 Subject: [PATCH] Add files via upload --- .../java/com/github/catvod/spider/Kmys.java | 663 ++++++++++++++++++ .../java/com/github/catvod/spider/Lib.java | 4 +- .../java/com/github/catvod/spider/MixWeb.java | 178 +++++ 3 files changed, 843 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/catvod/spider/Kmys.java create mode 100644 app/src/main/java/com/github/catvod/spider/MixWeb.java diff --git a/app/src/main/java/com/github/catvod/spider/Kmys.java b/app/src/main/java/com/github/catvod/spider/Kmys.java new file mode 100644 index 0000000..e2c65d9 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Kmys.java @@ -0,0 +1,663 @@ +package com.github.catvod.spider; + +import android.content.Context; +import android.content.SharedPreferences; +import android.net.Uri; +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.Misc; +import com.github.catvod.utils.okhttp.OKCallBack; +import com.github.catvod.utils.okhttp.OkHttpUtil; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.net.URLEncoder; +import java.security.Key; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.X509EncodedKeySpec; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.crypto.Cipher; + +import okhttp3.Call; +import okhttp3.Headers; +import okhttp3.Response; + +/** + * Author: @SDL + */ +public class Kmys extends Spider { + private String apiDomain = ""; + private String staticDomain = ""; + + private String appId = "1"; // 飞瓜 1 酷猫 5 + + private String device = null; + + public static final String KEY_ALGORITHM = "RSA"; + + private static final int MAX_DECRYPT_BLOCK = 128; + + + @Override + public void init(Context context) { + super.init(context); + getkey(); + SharedPreferences sharedPreferences = context.getSharedPreferences("sp_Kmys", Context.MODE_PRIVATE); + try { + device = sharedPreferences.getString("device", null); + } catch (Throwable th) { + } finally { + if (device == null) { + device = Misc.MD5(UUID.randomUUID().toString(), Misc.CharsetUTF8).toLowerCase(); + sharedPreferences.edit().putString("device", device).commit(); + } + } + } + + private HashMap getHeaders(String url) { + HashMap headers = new HashMap<>(); + headers.put("versionNumber", "360"); + headers.put("versionName", "3.6.0"); + headers.put("device", device); + headers.put("appId", appId); + headers.put("platformId", "7"); + headers.put("User-Agent", "okhttp/3.14.7"); + return headers; + } + + private void checkDomain() { + if (staticDomain.isEmpty()) { + String url = "http://feigua2021.oss-cn-beijing.aliyuncs.com/static/config/video/" + appId + ".json"; + HashMap headers = new HashMap<>(); + headers.put("User-Agent", "okhttp/3.14.7"); + String json = OkHttpUtil.string(url, headers); + try { + JSONObject obj = new JSONObject(json); + apiDomain = obj.getString("apiDomain"); + staticDomain = obj.getString("staticDomain"); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + @Override + public String homeContent(boolean filter) { + try { + checkDomain(); + getkey(); + String url = staticDomain + "/static/" + appId + "/config/lib-new.json"; + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); + + JSONArray years = jsonObject.getJSONArray("year"); + JSONArray types = jsonObject.getJSONArray("types"); + + JSONArray classes = new JSONArray(); + JSONObject filterConfig = new JSONObject(); + + for (int i = 0; i < types.length(); i++) { + JSONObject item = types.getJSONObject(i); + String typeId = item.getString("typeId").trim(); + if (typeId.isEmpty()) + continue; + String typeName = item.getString("typeName"); + JSONObject newCls = new JSONObject(); + newCls.put("type_id", typeId); + newCls.put("type_name", typeName); + classes.put(newCls); + + JSONArray tags = item.getJSONArray("tags"); + JSONArray extendsAll = new JSONArray(); + // 类型 + JSONObject newTypeExtend = new JSONObject(); + newTypeExtend.put("key", "type"); + newTypeExtend.put("name", "类型"); + JSONArray newTypeExtendKV = new JSONArray(); + JSONObject kv = new JSONObject(); + kv.put("n", "全部"); + kv.put("v", "-1"); + newTypeExtendKV.put(kv); + for (int j = 0; j < tags.length(); j++) { + JSONObject child = tags.getJSONObject(j); + kv = new JSONObject(); + kv.put("n", child.getString("typeName")); + kv.put("v", child.getString("typeId")); + newTypeExtendKV.put(kv); + } + newTypeExtend.put("value", newTypeExtendKV); + extendsAll.put(newTypeExtend); + // 排序 + newTypeExtend = new JSONObject(); + newTypeExtend.put("key", "sort"); + newTypeExtend.put("name", "排序"); + newTypeExtendKV = new JSONArray(); + kv = new JSONObject(); + kv.put("n", "最热"); + kv.put("v", "2"); + newTypeExtendKV.put(kv); + kv = new JSONObject(); + kv.put("n", "最新"); + kv.put("v", "1"); + newTypeExtendKV.put(kv); + kv = new JSONObject(); + kv.put("n", "好评"); + kv.put("v", "3"); + newTypeExtendKV.put(kv); + newTypeExtend.put("value", newTypeExtendKV); + extendsAll.put(newTypeExtend); + // 地区 + JSONArray regions = item.getJSONArray("children"); + newTypeExtend = new JSONObject(); + newTypeExtend.put("key", "area"); + newTypeExtend.put("name", "地区"); + newTypeExtendKV = new JSONArray(); + kv = new JSONObject(); + kv.put("n", "全部"); + kv.put("v", "-1"); + newTypeExtendKV.put(kv); + for (int j = 0; j < regions.length(); j++) { + JSONObject child = regions.getJSONObject(j); + kv = new JSONObject(); + kv.put("n", child.getString("typeName")); + kv.put("v", child.getString("typeId")); + newTypeExtendKV.put(kv); + } + newTypeExtend.put("value", newTypeExtendKV); + extendsAll.put(newTypeExtend); + + // 年份 + newTypeExtend = new JSONObject(); + newTypeExtend.put("key", "year"); + newTypeExtend.put("name", "年份"); + newTypeExtendKV = new JSONArray(); + kv = new JSONObject(); + kv.put("n", "全部"); + kv.put("v", "-1"); + newTypeExtendKV.put(kv); + for (int j = 0; j < years.length(); j++) { + String year = years.getString(j).trim(); + if (year.isEmpty()) + continue; + kv = new JSONObject(); + kv.put("n", year); + kv.put("v", year); + newTypeExtendKV.put(kv); + } + newTypeExtend.put("value", newTypeExtendKV); + extendsAll.put(newTypeExtend); + filterConfig.put(typeId, extendsAll); + } + JSONObject result = new JSONObject(); + result.put("class", classes); + if (filter) { + result.put("filters", filterConfig); + } + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String homeVideoContent() { + try { + checkDomain(); + String url = staticDomain + "/static/" + appId + "/index/cloumn/1.json"; + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); + JSONArray list = jsonObject.getJSONArray("list"); + JSONArray videos = new JSONArray(); + for (int i = 0; i < list.length(); i++) { + JSONArray videoList = list.getJSONObject(i).getJSONArray("videoList"); + for (int j = 0; j < videoList.length(); j++) { + JSONObject vObj = videoList.getJSONObject(j); + JSONObject v = new JSONObject(); + v.put("vod_id", vObj.getString("id")); + v.put("vod_name", vObj.getString("vodName")); + v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); + v.put("vod_remarks", vObj.getString("lastName")); + videos.put(v); + } + } + JSONObject result = new JSONObject(); + result.put("list", videos); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { + try { + checkDomain(); + JSONObject result = new JSONObject(); + + String url = apiDomain + "/videolibrary/v2/" + appId + "/" + tid; + extend = extend == null ? new HashMap<>() : extend; + if (!extend.containsKey("area")) { + extend.put("area", "-1"); + } + if (!extend.containsKey("type")) { + extend.put("type", "-1"); + } + if (!extend.containsKey("sort")) { + extend.put("sort", "2"); + } + if (!extend.containsKey("year")) { + extend.put("year", "-1"); + } + url += "/" + extend.get("area"); + url += "/" + extend.get("type"); + url += "/" + extend.get("sort"); + url += "/-1"; + url += "/" + extend.get("year"); + url += "/-1/" + pg + ".json"; + + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); + JSONArray jsonArray = jsonObject.getJSONArray("list"); + JSONArray videos = new JSONArray(); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject vObj = jsonArray.getJSONObject(i); + JSONObject v = new JSONObject(); + v.put("vod_id", vObj.getString("id")); + v.put("vod_name", vObj.getString("vodName")); + v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); + v.put("vod_remarks", vObj.getString("lastName")); + videos.put(v); + } + + int total = jsonObject.getInt("count"); + int limit = jsonObject.getInt("pageSize"); + int totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1); + result.put("page", jsonObject.getInt("pageIndex")); + result.put("pagecount", totalPg); + result.put("limit", limit); + result.put("total", total); + result.put("list", videos); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String detailContent(List ids) { + try { + checkDomain(); + JSONObject result = new JSONObject(); + String url = staticDomain + "/static/video/detail/" + ids.get(0) + ".json"; + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); + JSONObject vodList = new JSONObject(); + vodList.put("vod_id", jsonObject.getString("id")); + vodList.put("vod_name", jsonObject.getString("vodName")); + vodList.put("vod_pic", fixUrl(jsonObject.getString("vodPic"))); + vodList.put("type_name", jsonObject.getString("typeName")); + vodList.put("vod_year", jsonObject.getString("vodYear")); + vodList.put("vod_area", jsonObject.getString("vodArea")); + vodList.put("vod_remarks", ""); + vodList.put("vod_actor", jsonObject.getString("vodActor")); + vodList.put("vod_director", ""); + vodList.put("vod_content", jsonObject.getString("vodBlurb")); + + String vodPlayUrl = jsonObject.getString("vodPlayUrl"); + vodPlayUrl = rsa(vodPlayUrl.substring(0, 10) + vodPlayUrl.substring(16)); + + ArrayList playFrom = new ArrayList<>(); + ArrayList playList = new ArrayList<>(); + + JSONArray playSource = new JSONArray(vodPlayUrl); + for (int i = 0; i < playSource.length(); i++) { + JSONObject item = playSource.getJSONObject(i); + String srcName = item.getString("name"); + boolean userProxy = srcName.equals("高速线路"); + ArrayList urls = new ArrayList<>(); + JSONArray playUrls = item.getJSONArray("list"); + for (int j = 0; j < playUrls.length(); j++) { + JSONObject urlObj = playUrls.getJSONObject(j); + if (userProxy) + urls.add(urlObj.getString("name") + "$" + Proxy.localProxyUrl() + "?do=kmys&type=m3u8&url=" + Base64.encodeToString(urlObj.getString("url").getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + ".." + urlObj.getInt("isParse")); + else + urls.add(urlObj.getString("name") + "$" + urlObj.getString("url") + ".." + urlObj.getInt("isParse")); + } + if (urls.isEmpty()) + continue; + playFrom.add(srcName); + playList.add(TextUtils.join("#", urls)); + } + + String vod_play_from = TextUtils.join("$$$", playFrom); + String vod_play_url = TextUtils.join("$$$", playList); + vodList.put("vod_play_from", vod_play_from); + vodList.put("vod_play_url", vod_play_url); + + JSONArray list = new JSONArray(); + list.put(vodList); + result.put("list", list); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String playerContent(String flag, String id, List vipFlags) { + try { + JSONObject result = new JSONObject(); + String[] info = id.split("\\.\\."); + String url = info[0]; + int isParse = Integer.parseInt(info[1]); + if (isParse == 2) { + result.put("parse", 0); + result.put("playUrl", ""); + result.put("url", url); + } else { + result.put("parse", 0); + result.put("playUrl", ""); + result.put("url", url); + } + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String searchContent(String key, boolean quick) { + + if (quick) + return ""; + try { + checkDomain(); + JSONObject result = new JSONObject(); + String url = apiDomain + "/api/v2/index/search?pageIndex=1&wd=" + URLEncoder.encode(key) + "&limit=10&type=1"; + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONArray videos = new JSONArray(); + JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); + JSONArray jsonArray = jsonObject.getJSONArray("list"); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject vObj = jsonArray.getJSONObject(i); + JSONObject v = new JSONObject(); + String title = vObj.getString("vodName"); + if (!title.contains(key)) + continue; + v.put("vod_id", vObj.getString("id")); + v.put("vod_name", title); + v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); + v.put("vod_remarks", vObj.getString("lastName")); + videos.put(v); + } + result.put("list", videos); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + protected String fixUrl(String src) { + try { + if (src.startsWith("//")) { + Uri parse = Uri.parse(staticDomain); + src = parse.getScheme() + ":" + src; + } else if (!src.contains("://")) { + Uri parse = Uri.parse(staticDomain); + if (!src.startsWith("/")) + src = "/" + src; + src = parse.getScheme() + "://" + parse.getHost() + src; + } + } catch (Exception e) { + SpiderDebug.log(e); + } + return src; + } + + String rsa(String in) { + try { + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3VLHgbkFN0ebMaR4e0D\n" + + "z6Z2mFexPBFKGqK0tuRhzu7XOrG92nKWfnublf2p1i22UN81whBLINjMttOuqW6\n" + + "fM9DCnAPTelud1zCXWYWIsv5Z19inJSG8vytJ7xg1dnfuRSRUkx11IE7bm0T/sM\n" + + "0sI4GgcktQJNSizyirHtuJjUUxxQabEhFkFeqQ5r+A69KjB5QkotCc4pG5lENyT\n" + + "ARHGSsfaiJthaiH0yJ/8tUlyMgJ9H6/jbQg0wlLcEUzdfe2KuCPrTRzIzx4Cjm1\n" + + "JogT6JV2byvXpzAMC3O48LDiekJdVztg2Cj7E0cGrOsGs+IK6F7TWsKD/cIELTF\n" + + "hLz6dExQIDAQAB", Base64.DEFAULT))); + Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, pubKey); + byte[] inData = Base64.decode(in, Base64.DEFAULT); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + if (inData.length <= 256) { + outputStream.write(cipher.doFinal(inData)); + } else { + for (int i = 0; i < inData.length; i += 256) { + outputStream.write(cipher.doFinal(inData, i, 256)); + } + } + outputStream.flush(); + String result = new String(outputStream.toByteArray(), Misc.CharsetUTF8); + outputStream.close(); + return result; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + private static HashMap kmysPlayerHeaders = null; + private static String signPlayerStr = ""; + private static final Pattern tsRex = Pattern.compile("(\\S+.ts)|(#EXT-X-KEY:\\S+\")(\\S+)(\")"); + + static String subUrl(String url) { + if (url.startsWith("http://")) { + return url.substring(0, url.substring(7).indexOf(47) + 7); + } + String tmp = url.startsWith("https://") ? url.substring(0, url.substring(8).indexOf(47) + 8) : ""; + return url.substring(tmp.length()); + } + + static Object[] getVodContent(String m3u8) { + Uri uri = Uri.parse(m3u8); + String time = String.valueOf(System.currentTimeMillis()); + String key = Misc.MD5(subUrl(m3u8) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); + String realUrl = m3u8 + "?key=" + key + "&time=" + time; + String m3u8Content = OkHttpUtil.string(realUrl, kmysPlayerHeaders); + String tsUrl = m3u8.substring(0, m3u8.indexOf(uri.getLastPathSegment())); + StringBuilder sb = new StringBuilder(); + int start = 0; + Matcher matcher = tsRex.matcher(m3u8Content); + while (matcher.find()) { + sb.append(m3u8Content, start, matcher.start()); + if (matcher.group().contains("EXT-X-KEY")) { + String keyRealUrl = Proxy.localProxyUrl() + "?do=kmys&type=key&url=" + Base64.encodeToString((tsUrl + matcher.group(3)).getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); + sb.append(matcher.group(2) + keyRealUrl + matcher.group(4)); + } else { + String tsRealUrl = Proxy.localProxyUrl() + "?do=kmys&type=ts&url=" + Base64.encodeToString((tsUrl + matcher.group(1)).getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); + sb.append(tsRealUrl); + } + start = matcher.end(); + } + sb.append(m3u8Content, start, m3u8Content.length()); + String type = "application/octet-stream"; + Object[] result = new Object[3]; + result[0] = 200; + result[1] = type; + ByteArrayInputStream baos = new ByteArrayInputStream(sb.toString().getBytes(Misc.CharsetUTF8)); + result[2] = baos; + return result; + } + + static Object[] getKeyContent(String key) { + String time = String.valueOf(System.currentTimeMillis()); + String md5 = Misc.MD5(subUrl(key) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); + String realUrl = key + "?key=" + md5 + "&time=" + time; + String keyContent = OkHttpUtil.string(realUrl, kmysPlayerHeaders); + String type = "application/octet-stream"; + Object[] result = new Object[3]; + result[0] = 200; + result[1] = type; + ByteArrayInputStream baos = new ByteArrayInputStream(keyContent.getBytes(Misc.CharsetUTF8)); + result[2] = baos; + return result; + } + + static Object[] getTsContent(String ts) { + String time = String.valueOf(System.currentTimeMillis()); + String key = Misc.MD5(subUrl(ts) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); + String realUrl = ts + "?key=" + key + "&time=" + time; + OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { + + + @Override + public void onFailure(Call call, Exception e) { + + } + + @Override + public void onResponse(Response response) { + } + }; + OkHttpUtil.get(OkHttpUtil.defaultClient(), realUrl, null, kmysPlayerHeaders, callBack); + if (callBack.getResult().code() == 200) { + Headers headers = callBack.getResult().headers(); + String type = headers.get("Content-Type"); + if (type == null) { + type = "application/octet-stream"; + } + Object[] result = new Object[3]; + result[0] = 200; + result[1] = type; + result[2] = callBack.getResult().body().byteStream(); + return result; + } + return null; + } + + public static Object[] vod(Map params) { + String type = params.get("type"); + String url = params.get("url"); + url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), Misc.CharsetUTF8); + if (kmysPlayerHeaders == null) { + kmysPlayerHeaders = new HashMap<>(); + kmysPlayerHeaders.put("User-Agent", "okhttp/3.14.7"); + kmysPlayerHeaders.put("Connection", "close"); + } + if (type.equals("m3u8")) { + return getVodContent(url); + } else if (type.equals("key")) { + return getKeyContent(url); + } else if (type.equals("ts")) { + return getTsContent(url); + } + return null; + } + + public static void getkey(){ + if (signPlayerStr.isEmpty()){ + ////https://video-api.kumaoys.cn/api/v2/b/83708861 + String url = "https://mtv.stvmts.com/api/v2/b/"+((int) (Math.random() * 100000000)); + HashMap hashMap = new HashMap(); + hashMap.put("versionNumber", "360"); + hashMap.put("versionName", "3.6.0"); + hashMap.put("device", "f6076f40ecda2adacbcefeaad22527ce1656685979546"); + //hashMap.put("appId", "5"); + hashMap.put("platformId", "7"); + hashMap.put("User-Agent", "okhttp/3.14.7"); + hashMap.put("Pragma", "Pragma:: no-cache"); + hashMap.put("Cache-Control", "no-cache"); + hashMap.put("Host", "mtv.stvmts.com"); + hashMap.put("Content-Type", "application/json; charser=utf-8"); + JSONObject jsonObject = new JSONObject(); + try { + int random = (int)(Math.random()*1.0E8d); + int time = (int)(System.currentTimeMillis()/1000); + String signBefore = "p=com.kumao.yingshi&t=" + time + "&r=" + random + "&s=36eff39894f62d333fd3f488cffbf364&pl=1"; + jsonObject.put("s",Misc.MD5(signBefore,Misc.CharsetUTF8)); + jsonObject.put("t",time); + jsonObject.put("r",random); + jsonObject.put("i",5); + jsonObject.put("p",1); + OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jsonObject.toString(), hashMap, new OKCallBack.OKCallBackString() { + @Override + public void onFailure(Call call, Exception e) { + } + + @Override + public void onResponse(String response) { + try { + + JSONObject jsonObject = new JSONObject(response).getJSONObject("data"); + String a = new String(Base64.decode(jsonObject.getString("a"),Base64.DEFAULT)); + String k = new String(Base64.decode(jsonObject.getString("k"),Base64.DEFAULT)); + String z = new String(Base64.decode(jsonObject.getString("z"),Base64.DEFAULT)); + + String sum=(k+z+a); + byte[] byte_sum=Base64.decode(sum,Base64.DEFAULT); + byte[] jiemi=decryptByPublicKey(byte_sum,"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCt/dLGQj1Iimj0LIUMUXgBGUjsfrm6o1/pZjXXVLL3py2vLktNtSoJU+69v1tUXZqiU9BqMHApVmMOtOnkL5J+ENdLIX3bXnNtfNJpYX4Iz8OBMqKdDch80gN8rLkTPReFkBGsMAndKpc0iMdgd6nts/gQ3wUBNJKpmOG35UateQIDAQAB"); + String data =new String(jiemi,Misc.CharsetUTF8); + signPlayerStr = new JSONObject(data).optString("key"); + } catch (JSONException e) { + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } catch (JSONException e) { + e.printStackTrace(); + } + } + + } + + public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) throws Exception { + byte[] keyBytes = Base64.decode(publicKey,Base64.DEFAULT); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + Key publicK = keyFactory.generatePublic(x509KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicK); + int inputLen = encryptedData.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // 对数据分段解密 + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] decryptedData = out.toByteArray(); + out.close(); + return decryptedData; + } + +} diff --git a/app/src/main/java/com/github/catvod/spider/Lib.java b/app/src/main/java/com/github/catvod/spider/Lib.java index 9eb5235..25925b4 100644 --- a/app/src/main/java/com/github/catvod/spider/Lib.java +++ b/app/src/main/java/com/github/catvod/spider/Lib.java @@ -450,7 +450,7 @@ public class Lib extends Spider { @Override public String searchContent(String key, boolean quick) { try { - String url = "https://shitu.paodekuaiweixinqun.com/search?q=site%3Alibvio.me%2Fdetail+" + URLEncoder.encode(key); + String url = "https://google.1qi777.com/search?q=site%3Alibvio.me%2Fdetail+" + URLEncoder.encode(key); Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders())); JSONObject result = new JSONObject(); JSONArray videos = new JSONArray(); @@ -501,4 +501,4 @@ public class Lib extends Spider { } return src; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/github/catvod/spider/MixWeb.java b/app/src/main/java/com/github/catvod/spider/MixWeb.java new file mode 100644 index 0000000..a050d75 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/MixWeb.java @@ -0,0 +1,178 @@ +package com.github.catvod.parser; + +import android.util.Base64; +import com.github.catvod.crawler.SpiderDebug; +import com.github.catvod.utils.Misc; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; + +public class MixWeb { + + /* + "parses": [ + { + "name": "聚合", + "type": 3, + "url": "Demo" + }, + { + "name": "解析", + "type": 1, + "url": "https://192.168.10.88/jx.php?url=", + "ext": { + "flag": [ + "qq", + "iqiyi", + "qiyi", + "爱奇艺", + "腾讯", + "letv", + "sohu", + "tudou", + "pptv", + "mgtv", + "wasu", + "bilibili" + ] + } + }] + */ + + public static HashMap> flagWebJx = new HashMap<>(); + + static HashMap> configs = null; + + public static JSONObject parse(LinkedHashMap> jx, String nameMe, String flag, String url) { + try { + if (configs == null) { + configs = new HashMap<>(); + Iterator keys = jx.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + HashMap parseBean = jx.get(key); + String type = parseBean.get("type"); + if (type.equals("0")) { + try { + //取出单个解析的flags列表 + JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag"); + for (int j = 0; j < flags.length(); j++) { + //获取单个flags + String flagKey = flags.getString(j); + //取出configs中对应flags的解析 + ArrayList flagJx = configs.get(flagKey); + //如果configs中没有这个flags,则插入一个空的值 + if (flagJx == null) { + flagJx = new ArrayList<>(); + configs.put(flagKey, flagJx); + } + //如果有就在flagJx中增加解析 + flagJx.add(key); + } + } catch (Throwable th) { + + } + } + } + } + // 通过上面的配置获得解析列表 + ArrayList webJx = new ArrayList<>(); + ArrayList flagJx = configs.get(flag); + //如果flagJx不为空 + if (flagJx != null && !flagJx.isEmpty()) { + for (int i = 0; i < flagJx.size(); i++) { + String key = flagJx.get(i); + HashMap parseBean = jx.get(key); + String type = parseBean.get("type"); + if (type.equals("0")) { + //将json解析放入webJx + webJx.add(parseBean.get("url")); + } + } + } else { + Iterator keys = jx.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + HashMap parseBean = jx.get(key); + String type = parseBean.get("type"); + if (type.equals("0")) { + webJx.add(parseBean.get("url")); + } + } + } + if (!webJx.isEmpty()) { + flagWebJx.put(flag, webJx); + } + + // json解析没有得到结果 用webview解析 + if (!webJx.isEmpty()) { + JSONObject webResult = new JSONObject(); + webResult.put("url", "proxy://do=MixWeb&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP)); + webResult.put("parse", 1); + webResult.put("ua", Misc.UaWinChrome); + return webResult; + } + } catch (Throwable th) { + SpiderDebug.log(th); + } + return new JSONObject(); + } + + + public static Object[] loadHtml(String flag, String url) { + try { + url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); + String html = "\n" + + "\n" + + "\n" + + "\n" + + "解析\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""; + + StringBuilder jxs = new StringBuilder(); + if (flagWebJx.containsKey(flag)) { + ArrayList jxUrls = flagWebJx.get(flag); + for (int i = 0; i < jxUrls.size(); i++) { + jxs.append("\""); + jxs.append(jxUrls.get(i)); + jxs.append("\""); + if (i < jxUrls.size() - 1) { + jxs.append(","); + } + } + } + html = html.replace("#url#", url).replace("#jxs#", jxs.toString()); + Object[] result = new Object[3]; + result[0] = 200; + result[1] = "text/html; charset=\"UTF-8\""; + ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8")); + result[2] = baos; + return result; + } catch (Throwable th) { + th.printStackTrace(); + } + return null; + } +}