diff --git a/app/src/main/java/com/github/catvod/spider/AppTT.java b/app/src/main/java/com/github/catvod/spider/AppTT.java new file mode 100644 index 0000000..364e2ab --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/AppTT.java @@ -0,0 +1,332 @@ +package com.github.catvod.spider; + +import static com.github.catvod.utils.Misc.CharsetUTF8; + +import android.content.Context; +import android.os.Build; +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.OkHttpUtil; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + + +/** + * Author: @SDL + */ +public class AppTT extends Spider { + private static final String KEY = "SRK#e%4UYtU#KiEo*vsPqpr0cC4bxAQW"; + private static final String IV = "o6sYmm*x5hn#rcCt"; + private static final String siteUrl = "http://110.42.1.95:7788"; + + private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")"; + + private HashMap getHeaders(String url) { + HashMap hashMap = new HashMap(); + hashMap.put("User-Agent", getUA(url)); + return hashMap; + } + + private String getUA(String str) { + if (!(str.contains("api.php/app") || str.contains("xgapp"))) { + if (!str.contains("freekan")) { + if (!(str.contains("zsb") || str.contains("fkxs") || str.contains("xays") || str.contains("xcys") || str.contains("szys") || str.contains("dxys") || str.contains("ytys"))) { + if (!str.contains("qnys")) { + return str.contains(".vod") ? "okhttp/4.1.0" : "Dalvik/2.1.0"; + } + } + return "Dart/2.15 (dart:io)"; + } + } + return "Dart/2.14 (dart:io)"; + } + + @Override + public void init(Context context) { + super.init(context); + } + + @Override + public String homeContent(boolean filter) { + try { + + JSONArray classes = new JSONArray(); + JSONObject jSONObject1 = new JSONObject(); + jSONObject1.put("type_id", 1); + jSONObject1.put("type_name", "电影"); + classes.put(jSONObject1); + + JSONObject jSONObject2 = new JSONObject(); + jSONObject2.put("type_id", 2); + jSONObject2.put("type_name", "连续剧"); + classes.put(jSONObject2); + + JSONObject jSONObject3 = new JSONObject(); + jSONObject3.put("type_id", 3); + jSONObject3.put("type_name", "动漫"); + classes.put(jSONObject3); + + JSONObject jSONObject4 = new JSONObject(); + jSONObject4.put("type_id", 4); + jSONObject4.put("type_name", "综艺"); + classes.put(jSONObject4); + + JSONObject result = new JSONObject(); + result.put("class", classes); + + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String homeVideoContent() { + try { + JSONArray videos = new JSONArray(); + try { + String url = siteUrl + "/api.php/v1.vod/curnavitemlist?type_id=0"; + + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject jsonObject = new JSONObject(decryptResponse(content)); + JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("swiperList"); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject blockObj = jsonArray.getJSONObject(i); + JSONObject v = new JSONObject(); + v.put("vod_id", blockObj.getString("vod_id")); + v.put("vod_name", blockObj.getString("vod_name")); + v.put("vod_pic", blockObj.getString("vod_pic")); + v.put("vod_remarks", blockObj.getString("vod_remarks")); + videos.put(v); + } + } catch (Exception e) { + } + 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 { + String url = siteUrl + "/api.php/v1.vod?type=" + tid + "&page=" + pg + "&pagesize=20"; +// Set keys = extend.keySet(); +// for (String key : keys) { +// String val = extend.get(key).trim(); +// if (val.length() == 0) +// continue; +// url += "&" + key + "=" + URLEncoder.encode(val); +// } + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data"); + JSONArray jsonArray = dataObject.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("vod_id")); + v.put("vod_name", vObj.getString("vod_name")); + v.put("vod_pic", vObj.getString("vod_pic")); + v.put("vod_remarks", vObj.getString("vod_remarks")); + videos.put(v); + } + JSONObject result = new JSONObject(); + int limit = 20; + int page = dataObject.getInt("page"); + int total = dataObject.getInt("total"); + int pageCount = videos.length(); + result.put("page", page); + result.put("pagecount", total / 20); + 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 { + String url = siteUrl + "/api.php/v1.vod/detilldata?vod_id=" + ids.get(0); + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject dataObject = new JSONObject(decryptResponse(content)); + JSONObject vObj = dataObject.getJSONObject("data"); + JSONObject result = new JSONObject(); + JSONArray list = new JSONArray(); + + JSONObject videoInfo = vObj.getJSONObject("videoInfo"); + + JSONObject vodAtom = new JSONObject(); + String title = videoInfo.getString("vod_name"); + vodAtom.put("vod_id", videoInfo.getString("vod_id")); + vodAtom.put("vod_name", videoInfo.getString("vod_name")); + vodAtom.put("vod_pic", videoInfo.getString("vod_pic")); + // vodAtom.put("type_name", videoInfo.getString("subCategory")); + vodAtom.put("vod_year", videoInfo.getString("vod_year")); + vodAtom.put("vod_area", videoInfo.getString("vod_area")); + vodAtom.put("vod_remarks", videoInfo.getString("vod_remarks")); + vodAtom.put("vod_actor", videoInfo.getString("vod_actor")); + vodAtom.put("vod_director", videoInfo.getString("vod_director")); + vodAtom.put("vod_content", videoInfo.getString("vod_content").trim()); + + + JSONArray episodes = vObj.getJSONArray("source"); + LinkedHashMap> playlist = new LinkedHashMap<>(); + String show = null; + String parse = null; + for (int i = 0; i < episodes.length(); i++) { + JSONArray playurls = episodes.getJSONObject(i).getJSONArray("list"); + + show = episodes.getJSONObject(i).getJSONObject("player_info").getString("show"); + parse = episodes.getJSONObject(i).getJSONObject("player_info").getString("parse"); + ArrayList urls = playlist.get(show); + if (urls == null) { + urls = new ArrayList<>(); + playlist.put(show, urls); + } + + for (int j = 0; j < playurls.length(); j++) { + if (playurls.get(j).toString().contains(".m3u8") || playurls.get(j).toString().contains(".mp4")) { + urls.add(playurls.get(j).toString()); + } else { + String name = playurls.get(j).toString().split("\\$")[0]; + String pid = playurls.get(j).toString().split("\\$")[1]; + + urls.add(name + "$" + parse + pid); + } + + + } + } + + + String vod_play_from = TextUtils.join("$$$", playlist.keySet()); + StringBuilder sb = new StringBuilder(); + Iterator> iter = playlist.values().iterator(); + short fromSize = (short) playlist.size(); + while (iter.hasNext()) { + fromSize--; + ArrayList urls = iter.next(); + sb.append(TextUtils.join("#", urls)); + if (fromSize > 0) + sb.append("$$$"); + } + vodAtom.put("vod_play_from", vod_play_from); + vodAtom.put("vod_play_url", sb.toString()); + list.put(vodAtom); + result.put("list", list); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String playerContent(String flag, String id, List vipFlags) { + try { + String jxurl = null; + if (id.contains(".m3u8") || id.toString().contains(".mp4")) { + jxurl = id; + } else { + String url = id + "&sc=1&token=" + getToken(); + String content = OkHttpUtil.string(url, getHeaders(url)); + String decryptcontent = decrypt(content, "UTF-8", KEY, IV); + jxurl = new JSONObject(decryptcontent).getString("url"); + } + + + JSONObject result = new JSONObject(); + result.put("parse", 0); + result.put("playUrl", ""); + result.put("url", jxurl); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + @Override + public String searchContent(String key, boolean quick) { + try { + String url = siteUrl + "/api.php/v1.vod?wd=" + URLEncoder.encode(key); + String content = OkHttpUtil.string(url, getHeaders(url)); + JSONObject dataObject = new JSONObject(decryptResponse(content)); + JSONArray jsonArray = dataObject.getJSONObject("data").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("vod_id")); + v.put("vod_name", vObj.getString("vod_name")); + v.put("vod_pic", vObj.getString("vod_pic")); + v.put("vod_remarks", vObj.getString("vod_remarks")); + videos.put(v); + } + JSONObject result = new JSONObject(); + result.put("list", videos); + return result.toString(); + } catch (Throwable th) { + + } + return ""; + } + + protected String decryptResponse(String src) { + return src; + } + + public String decrypt(String str, String str2, String str3, String str4) { + try { + SecretKeySpec secretKeySpec = new SecretKeySpec(str3.getBytes("UTF-8"), "AES"); + Cipher instance = Cipher.getInstance("AES/CTR/PKCS5Padding"); + instance.init(2, secretKeySpec, new IvParameterSpec(str4.getBytes())); + return new String(instance.doFinal(Base64.decode(str, 0)), str2); + } catch (Exception unused) { + return null; + } + } + + public String encrypt(String str, String str2, String str3, String str4) { + try { + Cipher instance = Cipher.getInstance("AES/CTR/PKCS5Padding"); + instance.init(1, new SecretKeySpec(str3.getBytes(), "AES"), new IvParameterSpec(str4.getBytes())); + return Base64.encodeToString(instance.doFinal(str.getBytes(str2)), 0); + } catch (Exception unused) { + return null; + } + } + + public String getToken() { + return encrypt(Long.valueOf(new Date().getTime()).toString(), "UTF-8", KEY, IV); + } +} \ No newline at end of file