diff --git a/app/src/main/java/com/github/catvod/spider/Ikanbot.java b/app/src/main/java/com/github/catvod/spider/Ikanbot.java new file mode 100644 index 00000000..b446c6ed --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Ikanbot.java @@ -0,0 +1,210 @@ +package com.github.catvod.spider; + +import com.github.catvod.bean.Class; +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.ProxyVideo; +import com.github.catvod.utils.Util; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Ikanbot extends Spider { + + private static final String siteUrl = "https://v.ikanbot.com"; + private static final String cateUrl = siteUrl + "/hot"; + private static final String detailUrl = siteUrl + "/play/"; + private static final String searchUrl = siteUrl + "/search?q="; + + private HashMap getHeaders() { + HashMap headers = new HashMap<>(); + headers.put("User-Agent", Util.CHROME); + return headers; + } + + private List parseVods(Document doc) { + List list = new ArrayList<>(); + for (Element element : doc.select("a.item")) { + String pic = element.select("img").attr("data-src"); + String url = element.attr("href"); + String name = element.select("img").attr("alt"); + String id = url.split("/")[2]; + list.add(new Vod(id, name, ProxyVideo.buildCommonProxyUrl(pic, Util.webHeaders(pic)))); + } + return list; + } + + @Override + public String homeContent(boolean filter) throws Exception { + List classes = new ArrayList<>(); + String[] typeIdList = {"/index-movie-热门", "/index-tv-热门", "/index-tv-国产剧", "/index-tv-韩剧"}; + String[] typeNameList = {"热门电影", "热门剧集", "国产剧", "韩剧"}; + for (int i = 0; i < typeNameList.length; i++) { + classes.add(new Class(typeIdList[i], typeNameList[i])); + } + Document doc = Jsoup.parse(OkHttp.string(siteUrl + "/billboard.html", getHeaders())); + List list = new ArrayList<>(); + for (Element element : doc.select("div.item-root")) { + String pic = element.select("img").attr("data-src"); + String url = element.select("a").attr("href"); + String name = element.select("img").attr("alt"); + try { + String id = url.split("/")[2]; + list.add(new Vod(id, name, ProxyVideo.buildCommonProxyUrl(pic, Util.webHeaders(pic)))); + } catch (Exception e) { + + } + } + return Result.string(classes, list); + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { + String target = cateUrl + tid; + if (!"1".equals(pg)) { + target = target + "-p-" + pg; + } + Document doc = Jsoup.parse(OkHttp.string(target.concat(".html"), getHeaders())); + List list = parseVods(doc); + Integer total = (Integer.parseInt(pg) + 1) * 24; + return Result.get().vod(list).page(Integer.parseInt(pg), Integer.parseInt(pg) + 1, 24, total).string(); + } + + @Override + public String detailContent(List ids) throws Exception { + Document doc = Jsoup.parse(OkHttp.string(detailUrl.concat(ids.get(0)), getHeaders())); + String name = doc.select("h1").text(); + String pic = doc.select("meta[property=og:image]").attr("content"); + Elements desc = doc.select("div.detail > h3"); + String year = desc.get(1).text(); + String area = desc.get(2).text(); + String actor = desc.get(3).text(); + + String current_id = doc.select("input#current_id").attr("value"); + String e_token = doc.select("input#e_token").attr("value"); + String mtype = doc.select("input#mtype").attr("value"); + String tks = get_tks(current_id, e_token); + String url = siteUrl + "/api/getResN?videoId=" + ids.get(0) + "&mtype=" + mtype + " &token=" + tks; + String data = OkHttp.string(url, getHeaders()); + Gson gson = new Gson(); + JsonObject jsonObject = gson.fromJson(data, JsonObject.class); + JsonArray array = jsonObject.getAsJsonObject("data").getAsJsonArray("list"); + String PlayFrom = ""; + String PlayUrl = ""; + for (JsonElement element : array) { + + // 使用正则表达式匹配 "flag" 和 "url" + Pattern pattern = Pattern.compile("\\\"flag\\\":\\\"(.*?)\\\",\\\"url\\\":\\\"(.*?)\\\""); + Matcher matcher = pattern.matcher(String.valueOf(element.getAsJsonObject().get("resData")).replace("\\", "")); + String flag = ""; + String liUrl = ""; + // 提取匹配到的内容 + if (matcher.find()) { + flag = matcher.group(1); + liUrl = matcher.group(2); + } + if (!"".equals(PlayFrom)) { + PlayFrom = PlayFrom + "$$$" + flag; + } else { + PlayFrom = PlayFrom + flag; + } + if (!"".equals(PlayUrl)) { + PlayUrl = PlayUrl + "$$$" + liUrl.replace("$" + flag, ""); + } else { + PlayUrl = PlayUrl + liUrl.replace("$" + flag, ""); + } + +// PlayUrl += String.valueOf(element.getAsJsonObject().get("resData")).replace("\\","").replace("\\\"","\""); + } + Vod vod = new Vod(); + vod.setVodId(ids.get(0)); + vod.setVodPic(ProxyVideo.buildCommonProxyUrl(pic, Util.webHeaders(pic))); + vod.setVodYear(year); + vod.setVodActor(actor); + vod.setVodArea(area); + vod.setVodName(name); + vod.setVodPlayFrom(PlayFrom); + vod.setVodPlayUrl(PlayUrl.replace("##", "#").replace("#$$$", "$$$")); + return Result.string(vod); + } + + @Override + public String searchContent(String key, boolean quick) throws Exception { + Document doc = Jsoup.parse(OkHttp.string(searchUrl.concat(URLEncoder.encode(key)), getHeaders())); + List list = new ArrayList<>(); + for (Element element : doc.select("a.cover-link")) { + String pic = element.select("img").attr("data-src"); + String url = element.attr("href"); + String name = element.select("img").attr("alt"); + String id = url.split("/")[2]; + + list.add(new Vod(id, name, ProxyVideo.buildCommonProxyUrl(pic, Util.webHeaders(pic)))); + } + return Result.string(list); + } + + @Override + public String playerContent(String flag, String id, List vipFlags) throws Exception { + return Result.get().url(id).header(getHeaders()).string(); + } + + +// function get_tks() { +// const _0xf07220 = _0xf746; +// let _0x35162d = document['getElementById'] ('current_id').value 'current_id' +// , _0xf25678 = document['getElementById'] ('e_token').value; +// 'e_token' +// if (!_0x35162d || !_0xf25678) +// return; +// let _0x3882a3 = _0x35162d['length'], _0x52a097 = _0x35162d['substring'] +// (_0x3882a3 - 4, _0x3882a3) +// ,_0x2d9d1b = []; +// for (let _0x570711 = 0x0; _0x570711 < _0x52a097['length']; _0x570711++) { +// let _0x23e537 = parseInt(_0x52a097[_0x570711]), _0x48b93d = _0x23e537 % 0x3 + 0x1; +// _0x2d9d1b[_0x570711] = _0xf25678['substring'] (_0x48b93d, _0x48b93d + 0x8), +// _0xf25678 = _0xf25678['substring'] (_0x48b93d + 0x8, _0xf25678['length']); +// } +// v_tks = _0x2d9d1b['join'] (''); +// } + + public String get_tks(String current_id, String e_token) { +// String current_id = "798347"; +// String e_token = "mre0530ce88964487488y67d38c0a1uj7fd15cb8"; + System.out.printf("current_id " + current_id); + System.out.printf("e_token " + e_token); + if ("".equals(current_id) || "".equals(e_token)) { + return ""; + } + String[] list = new String[4]; + int idLength = current_id.length(); + String subString = current_id.substring(idLength - 4, idLength); + for (int i = 0; i < subString.length(); i++) { + int num = Character.getNumericValue(subString.charAt(i)); + int begin = num % 3 + 1; + list[i] = e_token.substring(begin, begin + 8); + e_token = e_token.substring(begin + 8); + } + + StringBuilder v_tks = new StringBuilder(); + for (String string : list) { + v_tks.append(string); + } + return v_tks.toString(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/utils/Util.java b/app/src/main/java/com/github/catvod/utils/Util.java index d6b74f18..8ab14eae 100644 --- a/app/src/main/java/com/github/catvod/utils/Util.java +++ b/app/src/main/java/com/github/catvod/utils/Util.java @@ -16,13 +16,20 @@ import com.github.catvod.spider.Init; import org.mozilla.universalchardet.UniversalDetector; import java.math.BigInteger; +import java.net.URI; import java.security.MessageDigest; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import okhttp3.Cookie; +import okhttp3.Headers; +import okhttp3.internal.http.HttpHeaders; +import okhttp3.internal.http2.Header; + public class Util { public static final Pattern RULE = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)|http((?!http).)*?video/tos*"); @@ -31,6 +38,7 @@ public class Util { public static final String ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; public static final List MEDIA = Arrays.asList("mp4", "mkv", "wmv", "flv", "avi", "iso", "mpg", "ts", "mp3", "aac", "flac", "m4a", "ape", "ogg"); public static final List SUB = Arrays.asList("srt", "ass", "ssa", "vtt"); + private static HashMap webHttpHeaderMap; public static boolean isVip(String url) { List hosts = Arrays.asList("iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com"); @@ -53,7 +61,8 @@ public class Util { } public static boolean isVideoFormat(String url) { - if (url.contains("url=http") || url.contains(".js") || url.contains(".css") || url.contains(".html")) return false; + if (url.contains("url=http") || url.contains(".js") || url.contains(".css") || url.contains(".html")) + return false; return RULE.matcher(url).find(); } @@ -213,4 +222,36 @@ public class Util { return ""; } } + + + /** + * @param referer + * @param cookie 多个cookie name=value;name2=value2 + * @return + */ + public static HashMap webHeaders(String referer, String cookie) { + HashMap map = webHeaders(referer); + map.put("Cookie", cookie); + return map; + } + + public static HashMap webHeaders(String referer) { + if (webHttpHeaderMap == null || webHttpHeaderMap.isEmpty()) { + synchronized (Util.class) { + if (webHttpHeaderMap == null || webHttpHeaderMap.isEmpty()) { + webHttpHeaderMap = new HashMap<>(); + webHttpHeaderMap.put("Content-Type", "text/plain;charset=UTF-8"); + webHttpHeaderMap.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); + webHttpHeaderMap.put("Connection", "keep-alive"); + webHttpHeaderMap.put("User-Agent", CHROME); + webHttpHeaderMap.put("Accept", "*/*"); + } + } + } + URI uri = URI.create(referer); + String u = uri.getScheme() + "://" + uri.getHost(); + webHttpHeaderMap.put("Referer", u); + webHttpHeaderMap.put("Origin", u); + return webHttpHeaderMap; + } } diff --git a/app/src/test/java/IkanbotTest.java b/app/src/test/java/IkanbotTest.java new file mode 100644 index 00000000..7cfa4e34 --- /dev/null +++ b/app/src/test/java/IkanbotTest.java @@ -0,0 +1,96 @@ +import android.app.Application; + +import com.github.catvod.spider.DaGongRen; +import com.github.catvod.spider.Ikanbot; +import com.github.catvod.spider.Init; +import com.github.catvod.utils.Json; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.Arrays; + +@RunWith(RobolectricTestRunner.class) +public class IkanbotTest { + // @Mock + private Application mockContext; + + private Ikanbot spider; + + @org.junit.Before + public void setUp() throws Exception { + mockContext = RuntimeEnvironment.application; + Init.init(mockContext); + spider = new Ikanbot(); + spider.init(mockContext, ""); + } + + @org.junit.Test + public void homeContent() throws Exception { + String content = spider.homeContent(true); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void homeVideoContent() throws Exception { + String content = spider.homeVideoContent(); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeVideoContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void categoryContent() throws Exception { + String content = spider.categoryContent("/index-movie-热门", "2", true, null); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("categoryContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void detailContent() throws Exception { + + String content = spider.detailContent(Arrays.asList("853785")); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("detailContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void playerContent() throws Exception { + String froms = "gsm3u8$$$xlm3u8$$$jsm3u8$$$tpm3u8$$$wolong$$$bfzym3u8$$$lzm3u8$$$1080zyk$$$kcm3u8$$$kuaikan$$$tkm3u8$$$sdm3u8$$$wjm3u8$$$hhm3u8$$$ikm3u8$$$snm3u8$$$hym3u8$$$ffm3u8$$$fsm3u8$$$zuidam3u8$$$jinyingm3u8$$$ukm3u8$$$bjm3u8$$$360zy$$$hw8$$$subm3u8$$$yhm3u8"; + String urls = "正片$https://v.gsuus.com/play/5eVR4Qoe/index.m3u8$$$正片$https://play.xluuss.com/play/NbWV5qoa/index.m3u8$$$正片$https://vv.jisuzyv.com/play/QeZ1k0gd/index.m3u8$$$犯罪都市4$https://sd8.taopianplay1.com:43333/c56b1bc09da3/HD/2024-07-19/1/de5459c7a07b/ff4eb0c51ec7/playlist.m3u8$$$正片$https://cdn.wlcdn99.com:777/6c7f15f2/index.m3u8$$$中字$https://s3.bfengbf.com/video/fanzuidushi4/中字/index.m3u8$$$HD中字$https://v.cdnlz21.com/20240701/790_6dc95607/index.m3u8$$$HD人工中文$https://svip.high22-playback.com/20240701/4372_9052ee7b/index.m3u8$$$中字$https://v1.longshengtea.com/yyv1/202405/18/FLxwP9Hqmp1/video/index.m3u8#HD$https://v8.longshengtea.com/yyv8/202407/01/3XNQBep5ix14/video/index.m3u8$$$俄版机翻中字$https://vip.kuaikan-play3.com/20240710/BainGasF/index.m3u8#俄语机翻中字$https://vip.kuaikan-play2.com/20240522/BAEnKmHY/index.m3u8#正片$https://vip.kuaikan-play3.com/20240710/EmydKWIH/index.m3u8$$$HD$https://v10.dious.cc/20240716/9M2dnF2Z/index.m3u8$$$中字$https://v1.fentvoss.com/sdv1/202405/18/FLxwP9Hqmp1/video/index.m3u8#HD$https://v8.fentvoss.com/sdv8/202407/01/3XNQBep5ix14/video/index.m3u8$$$HD$https://v11.tlkqc.com/wjv11/202407/02/H9pYM8zuu383/video/index.m3u8$$$正片$https://play.hhuus.com/play/QbY8j5Ya/index.m3u8$$$正片$https://bfikuncdn.com/20240716/i9cQ7Ayr/index.m3u8$$$HD$https://v8.mzxay.com/202407/01/3XNQBep5ix14/video/index.m3u8$$$正片$https://1080p.huyall.com/play/BeXWg5Vd/index.m3u8$$$HD中字$https://super.ffzy-online6.com/20240702/33974_183d0e8f/index.m3u8$$$HD$https://s10.fsvod1.com/20240716/PqZ8bfiD/index.m3u8$$$中字$https://v1.daayee.com/yyv1/202405/18/FLxwP9Hqmp1/video/index.m3u8#HD$https://v8.daayee.com/yyv8/202407/01/3XNQBep5ix14/video/index.m3u8$$$正片$https://hd.ijycnd.com/play/BeXWg5Vd/index.m3u8$$$720P$https://ukzy.ukubf3.com/20240702/rrroUpHe/index.m3u8$$$HD$https://v1.hdslb.pro/share/ydXlDNTEWgM46Bmx$$$犯罪都市4$https://vod.lyhuicheng.com/20240606/8w8PDkzh/index.m3u8$$$俄版机翻中字$https://m3u.nikanba.live/share/f3533edd778d62b756c4d2278c8252a6.m3u8#正片$https://m3u.nikanba.live/share/725902890b41ec1e1ea688afb0adf555.m3u8$$$正片$https://play.subokk.com/play/NbWV5qoa/index.m3u8$$$HD$https://vod12.wgslsw.com/20240708/H9pYM8zuu383/index.m3u8#"; + for (int i = 0; i < urls.split("\\$\\$\\$").length; i++) { + String content = spider.playerContent(froms.split("\\$\\$\\$")[i], urls.split("\\$\\$\\$")[i].split("\\$")[1], new ArrayList<>()); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("playerContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonPrimitive("url").getAsString().isEmpty()); + } + } + + @org.junit.Test + public void searchContent() throws Exception { + String content = spider.searchContent("红海", false); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("searchContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } +} \ No newline at end of file diff --git a/app/src/test/java/YsjTest.java b/app/src/test/java/YsjTest.java new file mode 100644 index 00000000..96696294 --- /dev/null +++ b/app/src/test/java/YsjTest.java @@ -0,0 +1,96 @@ +import android.app.Application; + +import com.github.catvod.spider.DaGongRen; +import com.github.catvod.spider.Init; +import com.github.catvod.spider.Ysj; +import com.github.catvod.utils.Json; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.ArrayList; +import java.util.Arrays; + +@RunWith(RobolectricTestRunner.class) +public class YsjTest { + // @Mock + private Application mockContext; + + private Ysj spider; + + @org.junit.Before + public void setUp() throws Exception { + mockContext = RuntimeEnvironment.application; + Init.init(mockContext); + spider = new Ysj(); + spider.init(mockContext, ""); + } + + @org.junit.Test + public void homeContent() throws Exception { + String content = spider.homeContent(true); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void homeVideoContent() throws Exception { + String content = spider.homeVideoContent(); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + System.out.println("homeVideoContent--" + gson.toJson(map)); + + //Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void categoryContent() throws Exception { + String content = spider.categoryContent("943.html", "2", true, null); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("categoryContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void detailContent() throws Exception { + + String content = spider.detailContent(Arrays.asList("92856-1-1.html")); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("detailContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } + + @org.junit.Test + public void playerContent() throws Exception { + String froms = "\uE62F 闪电资源"; + String urls = "HD$92856-1-1.html"; + for (int i = 0; i < urls.split("\\$\\$\\$").length; i++) { + String content = spider.playerContent(froms.split("\\$\\$\\$")[i], urls.split("\\$\\$\\$")[i].split("\\$")[1], new ArrayList<>()); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("playerContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonPrimitive("url").getAsString().isEmpty()); + } + } + + @org.junit.Test + public void searchContent() throws Exception { + String content = spider.searchContent("红海", false); + JsonObject map = Json.safeObject(content); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + System.out.println("searchContent--" + gson.toJson(map)); + Assert.assertFalse(map.getAsJsonArray("list").isEmpty()); + } +} \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 560a3bfa..11b6ac1c 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 a66b66f1..84cb9e4a 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -438408397ac27c14336f47bc41b743fb +01e1c90f1873a3e193bc494b9eab2d83 diff --git a/json/index.json b/json/index.json index ff0ca419..002ef7e2 100644 --- a/json/index.json +++ b/json/index.json @@ -1,5 +1,5 @@ { - "spider": "../jar/custom_spider.jar;md5;438408397ac27c14336f47bc41b743fb", + "spider": "../jar/custom_spider.jar;md5;01e1c90f1873a3e193bc494b9eab2d83", "lives": [ { "name": "直播ipv6", @@ -113,20 +113,13 @@ }, { - "key": "Ysj", - "name": "\uD83C\uDF0F\uFE0F 异世界动漫 | 动漫", + "key": "ikanbot", + "name": "🤖┃爱看机器人┃🤖", + "type": 3, - "api": "csp_Ysj", - "searchable": 1, - "filterable": 1 - }, - { - "key": "FirstAid", - "name": "\uD83D\uDCAA 健康 | 视频", - "type": 3, - "api": "csp_FirstAid", - "searchable": 1, - "filterable": 1 + "api": "csp_Ikanbot", + + "ext": "{\"box\": \"TVBox\", \"danmu\": false}" }, { "key": "nangua", @@ -137,15 +130,16 @@ "timeout": 30, "ext": "{\"box\": \"TVBox\", \"danmu\": false}" }, + { - "key": "ikanbot", - "name": "🤖┃爱看机器人┃🤖", - "playerType": 0, + "key": "Ysj", + "name": "\uD83C\uDF0F\uFE0F 异世界动漫 | 动漫(不稳定)", "type": 3, - "api": "./js/ikanbot.js", - "timeout": 30, - "ext": "{\"box\": \"TVBox\", \"danmu\": false}" - }, { + "api": "csp_Ysj", + "searchable": 1, + "filterable": 1 + }, + { "key": "QxiTv", "name": "\uD83E\uDD70 7喜 | 影视(不稳定)", "type": 3,