潇洒更新 202508060355

This commit is contained in:
github-actions[bot]
2025-08-06 03:55:51 +00:00
parent 64bfc124df
commit 888a1d9dd0
9 changed files with 3777 additions and 3293 deletions
+32 -36
View File
@@ -10,42 +10,38 @@
{"key": "闪雷","name": "闪雷┃MP4","type": 3,"api": "./FTY/drpy2.min.js","ext": "./js/678.js","header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"}}, {"key": "闪雷","name": "闪雷┃MP4","type": 3,"api": "./FTY/drpy2.min.js","ext": "./js/678.js","header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"}},
{"key": "fyyy","name": "飞宇影院","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "http://ntfeiyu.com/nt/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$1#电视剧$2#综艺$3#动漫$4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"}, {"key": "fyyy","name": "飞宇影院","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "http://ntfeiyu.com/nt/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$1#电视剧$2#综艺$3#动漫$4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"},
{"key": "cbh","name": "茶杯狐","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "https://www.bnjxjd.com/movie/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$fenlei1#电视剧$fenlei2#综艺$fenlei3#动漫$fenlei4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"}, {"key": "cbh","name": "茶杯狐","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "https://www.bnjxjd.com/movie/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$fenlei1#电视剧$fenlei2#综艺$fenlei3#动漫$fenlei4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"},
{"key": "热播影视","name": "热播|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.rbotv.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "热播影视","name": "热播|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.rbotv.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "天天影视","name": "天天|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://tt.ysdqjs.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "天天影视","name": "天天|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://tt.ysdqjs.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "浪酷影视","name": "浪酷|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.lkuys.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "浪酷影视","name": "浪酷|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.lkuys.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "星河","name": "星河|APP","type": 3,"quickSearch": 1,"api": "csp_AppSy","ext": {"url": "http://192.140.161.171:2563","key1": "aassddwwxxllsx1x","key2": "aassddwwxxllsx1x","key3": "aassddwwxxllsx1x"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "星河","name": "星河|APP","type": 3,"quickSearch": 1,"api": "csp_AppSy","ext": {"url": "http://192.140.161.171:2563","key1": "aassddwwxxllsx1x","key2": "aassddwwxxllsx1x","key3": "aassddwwxxllsx1x"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "云云","name": "云云APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/1.txt","dataKey": "staraugust123456","dataIv": "staraugust123456","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "乐达","name": "乐达APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://ledayy.com","site": "","dataKey": "hjjp68c2okw12345","dataIv": "hjjp68c2okw12345","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "光影","name": "光影APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.guangyingmi.com","dataKey": "230fnsodfsdhfon2","dataIv": "230fnsodfsdhfon2","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "灵虎","name": "灵虎APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://bind.315999.xyz/89.txt","dataKey": "#getapp@TMD@2025","dataIv": "#getapp@TMD@2025","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "魔方","name": "魔方APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.snysw.xyz/mfys.txt","dataKey": "1234567887654321","dataIv": "1234567887654321","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "旗星","name": "旗星APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://ys.qist.top","site": "","dataKey": "2SWSPFxugBLPPOKo","dataIv": "2SWSPFxugBLPPOKo","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "冬天","name": "冬天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.152.97:5211","dataKey": "685bf108bc47b67d","dataIv": "685bf108bc47b67d","deviceId": "685bf108bc47b67d","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "云云","name": "云云APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/1.txt","dataKey": "staraugust123456","dataIv": "staraugust123456","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "火猫","name": "火猫丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://cunchu8.obs.cn-north-4.myhuaweicloud.com/03.txt","dataKey": "J6AIORKJ3PQOJKM9","dataIv": "J6AIORKJ3PQOJKM9","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "光影","name": "光影|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.guangyingmi.com","dataKey": "230fnsodfsdhfon2","dataIv": "230fnsodfsdhfon2","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "若雪","name": "若雪丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://appcms.rx4k.top","site": "","dataKey": "ZX10ysTYZWtIJCTU","dataIv": "ZX10ysTYZWtIJCTU","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "火猫","name": "火猫丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://cunchu8.obs.cn-north-4.myhuaweicloud.com/03.txt","dataKey": "J6AIORKJ3PQOJKM9","dataIv": "J6AIORKJ3PQOJKM9","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "海豚","name": "海豚丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://qjappcms.htsp4k.top","site": "","dataKey": "R69yVluzg6yLpjp0","dataIv": "R69yVluzg6yLpjp0","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "若雪","name": "若雪丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://appcms.rx4k.top","site": "","dataKey": "ZX10ysTYZWtIJCTU","dataIv": "ZX10ysTYZWtIJCTU","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "哔滴","name": "哔滴丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ooxooxooxooxoo-1259561579.cos.ap-chengdu.myqcloud.com/ip.json","dataKey": "5ae8ee4bb95ea0ce","dataIv": "5ae8ee4bb95ea0ce","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "哔滴","name": "哔滴丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ooxooxooxooxoo-1259561579.cos.ap-chengdu.myqcloud.com/ip.json","dataKey": "5ae8ee4bb95ea0ce","dataIv": "5ae8ee4bb95ea0ce","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "丫丫","name": "丫丫|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://tv.yy-fun.cc","dataKey": "qkxnwkfjwpcnwycl","dataIv": "qkxnwkfjwpcnwycl","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "丫丫","name": "丫丫|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://tv.yy-fun.cc","dataKey": "qkxnwkfjwpcnwycl","dataIv": "qkxnwkfjwpcnwycl","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "小野","name": "小野|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://appcms.xy4k.com","site": "","dataKey": "7SDWjknU34zqFbVr","dataIv": "7SDWjknU34zqFbVr","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "爱看","name": "爱看丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.220.65","dataKey": "uI1TkPJC8B46AyN3","dataIv": "uI1TkPJC8B46AyN3","deviceId": "2112fc5eac600314ba95c4d65da9286b3","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "爱看","name": "爱看丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.220.65","dataKey": "uI1TkPJC8B46AyN3","dataIv": "uI1TkPJC8B46AyN3","deviceId": "2112fc5eac600314ba95c4d65da9286b3","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "稀饭","name": "稀饭|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://app.xifanys.com","dataKey": "HM6Ly9yeS4ya3dvL","dataIv": "HM6Ly9yeS4ya3dvL","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "稀饭","name": "稀饭APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://app.xifanys.com","dataKey": "HM6Ly9yeS4ya3dvL","dataIv": "HM6Ly9yeS4ya3dvL","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "蓝光","name": "蓝光APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://122.228.193.2:9654","dataKey": "ca94b06ca3c7d80e","dataIv": "ca94b06ca3c7d80e","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "蓝光","name": "蓝光APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://122.228.193.2:9654","dataKey": "ca94b06ca3c7d80e","dataIv": "ca94b06ca3c7d80e","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "豆丁","name": "豆丁APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://vip.123pan.cn/1848451100/zl/xfdd.txt","dataKey": "xasdasdqwertyuio","dataIv": "xasdasdqwertyuio","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "豆丁","name": "豆丁APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://vip.123pan.cn/1848451100/zl/xfdd.txt","dataKey": "xasdasdqwertyuio","dataIv": "xasdasdqwertyuio","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "蓝鹰","name": "蓝鹰APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://lanyinghz.oss-cn-hangzhou.aliyuncs.com/lanyingxmy.txt","dataKey": "ca94b06ca359d80e","dataIv": "ca94b06ca359d80e","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "蓝鹰","name": "蓝鹰APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://lanyinghz.oss-cn-hangzhou.aliyuncs.com/lanyingxmy.txt","dataKey": "ca94b06ca359d80e","dataIv": "ca94b06ca359d80e","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "仓鼠","name": "仓鼠APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/csurl.txt","dataKey": "Z98KXaLtO2wC1Pte","dataIv": "Z98KXaLtO2wC1Pte","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "榴莲","name": "榴莲APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://qjappcms.ll4k.xyz","dataKey": "1yGA85sJ5STtE7uj","dataIv": "1yGA85sJ5STtE7uj","deviceId": "","version": "50000"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "鲸鱼","name": "鲸鱼APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json","dataKey": "AAdgrdghjfgswerA","dataIv": "AAdgrdghjfgswerA","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "仓鼠","name": "仓鼠APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/csurl.txt","dataKey": "Z98KXaLtO2wC1Pte","dataIv": "Z98KXaLtO2wC1Pte","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "米诺","name": "米诺APP","type": 3,"api": "csp_AppGet","ext": {"url": "http://www.milkidc.cn","dataKey": "20c79c979da8db0f","dataIv": "20c79c979da8db0f","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "鲸鱼","name": "鲸鱼APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json","dataKey": "AAdgrdghjfgswerA","dataIv": "AAdgrdghjfgswerA","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "云速","name": "云速APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://59.153.167.137:7788/1.json","dataKey": "4d83b87c4c5ea111","dataIv": "4d83b87c4c5ea111","deviceId": "","version": "105"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "米诺","name": "米诺APP","type": 3,"api": "csp_AppGet","ext": {"url": "http://www.milkidc.cn","dataKey": "20c79c979da8db0f","dataIv": "20c79c979da8db0f","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "瓜萌","name": "瓜萌APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.guahd.com/1.txt","dataKey": "f2A7D4B9E8C16531","dataIv": "f2A7D4B9E8C16531","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "云速","name": "云速APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://59.153.167.137:7788/1.json","dataKey": "4d83b87c4c5ea111","dataIv": "4d83b87c4c5ea111","deviceId": "","version": "105"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "晴天","name": "晴天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://qjappcms.sun4k.top","dataKey": "sBxqXVF5pAHbGzrH","dataIv": "sBxqXVF5pAHbGzrH","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "瓜萌","name": "瓜萌APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.guahd.com/1.txt","dataKey": "f2A7D4B9E8C16531","dataIv": "f2A7D4B9E8C16531","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "橘子","name": "橘子APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://t.bffree.cn/1.txt","dataKey": "2015692015692015","dataIv": "2015692015692015","deviceId": "","version": "300"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "溜溜","name": "溜溜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://appcms.ll4k.xyz","dataKey": "NiDGaKiVnkO3QX1Q","dataIv": "NiDGaKiVnkO3QX1Q","deviceId": "2fbaf48ee97783260bc907e3ab0bd40c3","version": "200"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "萝卜","name": "萝卜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://apiapplbys.lbys.app:5678","dataKey": "apiapplbyskey168","dataIv": "apiapplbyskey168","deviceId": "","version": "107"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "晴天","name": "晴天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://qjappcms.sun4k.top","dataKey": "sBxqXVF5pAHbGzrH","dataIv": "sBxqXVF5pAHbGzrH","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "米兔","name": "米兔APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://new.tkbot.fun","dataKey": "d032c12876bc6848","dataIv": "d032c12876bc6848","deviceId": "","version": "200"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "橘子","name": "橘子APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://t.bffree.cn/1.txt","dataKey": "2015692015692015","dataIv": "2015692015692015","deviceId": "","version": "300"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "小红","name": "小红APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.xiaohys.com","dataKey": "ENonBHeVBoYZhVUV","dataIv": "ENonBHeVBoYZhVUV","deviceId": "298e5fe29c74b35aabb9836ee2f6f449f","version": "166"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "萝卜","name": "萝卜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://apiapplbys.lbys.app:5678","dataKey": "apiapplbyskey168","dataIv": "apiapplbyskey168","deviceId": "","version": "107"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "白蛇","name": "白蛇APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://tengxunyunaliyun.oss-cn-shanghai.aliyuncs.com/tengxunyun.txt","dataKey": "n3l2tx5jdkp9s2c8","dataIv": "n3l2tx5jdkp9s2c8","deviceId": "","version": "361"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "米兔","name": "米兔APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://new.tkbot.fun","dataKey": "d032c12876bc6848","dataIv": "d032c12876bc6848","deviceId": "","version": "200"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "若惜","name": "若惜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://110.40.59.188:9527","dataKey": "ebad3f1a58b13933","dataIv": "ebad3f1a58b13933","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "小红","name": "小红APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.xiaohys.com","dataKey": "ENonBHeVBoYZhVUV","dataIv": "ENonBHeVBoYZhVUV","deviceId": "298e5fe29c74b35aabb9836ee2f6f449f","version": "166"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "外剧","name": "外剧APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://guowaiju.com","dataKey": "7xv16h7qgkrs9b1p","dataIv": "7xv16h7qgkrs9b1p","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "白蛇","name": "白蛇APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://tengxunyunaliyun.oss-cn-shanghai.aliyuncs.com/tengxunyun.txt","dataKey": "n3l2tx5jdkp9s2c8","dataIv": "n3l2tx5jdkp9s2c8","deviceId": "","version": "361"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "移动","name": "移动APP","type": 3,"api": "csp_YD","searchable": 1,"quickSearch": 1,"style": {"type": "list"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "若惜","name": "若惜|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://110.40.59.188:9527","dataKey": "ebad3f1a58b13933","dataIv": "ebad3f1a58b13933","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "外剧","name": "外剧|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://guowaiju.com","dataKey": "7xv16h7qgkrs9b1p","dataIv": "7xv16h7qgkrs9b1p","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "诺映","name": "诺映|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.noad.top","dataKey": "708FA298F0855840","dataIv": "708FA298F0855840","deviceId": "2129ec9e6e5703cb0aeeddd79554e38f8","version": "103"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "移动","name": "移动|APP","type": 3,"api": "csp_YD","searchable": 1,"quickSearch": 1,"style": {"type": "list"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "玩偶","name": "👽玩偶哥哥┃4K弹幕","type": 3,"api": "csp_WoGGGuard","timeout": 30,"searchable": 1,"quickSearch": 1,"changeable": 0,"ext": {"Cloud-drive": "tvfan/Cloud-drive.txt","from": "4k|auto","siteUrl": "https://www.wogg.com/","danMu": "弹"}}, {"key": "玩偶","name": "👽玩偶哥哥┃4K弹幕","type": 3,"api": "csp_WoGGGuard","timeout": 30,"searchable": 1,"quickSearch": 1,"changeable": 0,"ext": {"Cloud-drive": "tvfan/Cloud-drive.txt","from": "4k|auto","siteUrl": "https://www.wogg.com/","danMu": "弹"}},
{"key": "YGP","name": "🚀叨观荐影┃预告片","type": 3,"api": "csp_YGPGuard","searchable": 0,"quickSearch": 0,"changeable": 0}, {"key": "YGP","name": "🚀叨观荐影┃预告片","type": 3,"api": "csp_YGPGuard","searchable": 0,"quickSearch": 0,"changeable": 0},
{"key": "alllive","name": "📽️一直播┃直播","type": 3,"api": "csp_AllliveGuard","playerType": 2,"searchable": 0,"quickSearch": 0,"changeable": 0}, {"key": "alllive","name": "📽️一直播┃直播","type": 3,"api": "csp_AllliveGuard","playerType": 2,"searchable": 0,"quickSearch": 0,"changeable": 0},
+32 -36
View File
@@ -12,42 +12,38 @@
{"key": "闪雷","name": "闪雷┃MP4","type": 3,"api": "./FTY/drpy2.min.js","ext": "./js/678.js","header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"}}, {"key": "闪雷","name": "闪雷┃MP4","type": 3,"api": "./FTY/drpy2.min.js","ext": "./js/678.js","header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"}},
{"key": "fyyy","name": "飞宇影院","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "http://ntfeiyu.com/nt/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$1#电视剧$2#综艺$3#动漫$4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"}, {"key": "fyyy","name": "飞宇影院","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "http://ntfeiyu.com/nt/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$1#电视剧$2#综艺$3#动漫$4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"},
{"key": "cbh","name": "茶杯狐","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "https://www.bnjxjd.com/movie/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$fenlei1#电视剧$fenlei2#综艺$fenlei3#动漫$fenlei4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"}, {"key": "cbh","name": "茶杯狐","type": 3,"api": "csp_XBPQ","searchable": 1,"quickSearch": 1,"filterable": 1,"changeable": 1,"ext": {"分类url": "https://www.bnjxjd.com/movie/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html","分类": "电影$fenlei1#电视剧$fenlei2#综艺$fenlei3#动漫$fenlei4"},"header": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"},"jar": "./jar/sx.jar;md5;6186f490eadf878ba5de21a7fa29e594"},
{"key": "热播影视","name": "热播|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.rbotv.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "热播影视","name": "热播|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.rbotv.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "天天影视","name": "天天|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://tt.ysdqjs.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "天天影视","name": "天天|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://tt.ysdqjs.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "浪酷影视","name": "浪酷|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.lkuys.cn"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "浪酷影视","name": "浪酷|APP","type": 3,"api": "csp_AppRJ","searchable": 1,"quickSearch": 1,"filterable": 0,"ext": {"url": "http://v.lkuys.cn"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "星河","name": "星河|APP","type": 3,"quickSearch": 1,"api": "csp_AppSy","ext": {"url": "http://192.140.161.171:2563","key1": "aassddwwxxllsx1x","key2": "aassddwwxxllsx1x","key3": "aassddwwxxllsx1x"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "星河","name": "星河|APP","type": 3,"quickSearch": 1,"api": "csp_AppSy","ext": {"url": "http://192.140.161.171:2563","key1": "aassddwwxxllsx1x","key2": "aassddwwxxllsx1x","key3": "aassddwwxxllsx1x"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "云云","name": "云云APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/1.txt","dataKey": "staraugust123456","dataIv": "staraugust123456","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "乐达","name": "乐达APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://ledayy.com","site": "","dataKey": "hjjp68c2okw12345","dataIv": "hjjp68c2okw12345","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "光影","name": "光影APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.guangyingmi.com","dataKey": "230fnsodfsdhfon2","dataIv": "230fnsodfsdhfon2","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "灵虎","name": "灵虎APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://bind.315999.xyz/89.txt","dataKey": "#getapp@TMD@2025","dataIv": "#getapp@TMD@2025","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "魔方","name": "魔方APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.snysw.xyz/mfys.txt","dataKey": "1234567887654321","dataIv": "1234567887654321","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "旗星","name": "旗星APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://ys.qist.top","site": "","dataKey": "2SWSPFxugBLPPOKo","dataIv": "2SWSPFxugBLPPOKo","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "冬天","name": "冬天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.152.97:5211","dataKey": "685bf108bc47b67d","dataIv": "685bf108bc47b67d","deviceId": "685bf108bc47b67d","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "云云","name": "云云APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/1.txt","dataKey": "staraugust123456","dataIv": "staraugust123456","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "火猫","name": "火猫丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://cunchu8.obs.cn-north-4.myhuaweicloud.com/03.txt","dataKey": "J6AIORKJ3PQOJKM9","dataIv": "J6AIORKJ3PQOJKM9","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "光影","name": "光影|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.guangyingmi.com","dataKey": "230fnsodfsdhfon2","dataIv": "230fnsodfsdhfon2","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "若雪","name": "若雪丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://appcms.rx4k.top","site": "","dataKey": "ZX10ysTYZWtIJCTU","dataIv": "ZX10ysTYZWtIJCTU","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "火猫","name": "火猫丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://cunchu8.obs.cn-north-4.myhuaweicloud.com/03.txt","dataKey": "J6AIORKJ3PQOJKM9","dataIv": "J6AIORKJ3PQOJKM9","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "海豚","name": "海豚丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://qjappcms.htsp4k.top","site": "","dataKey": "R69yVluzg6yLpjp0","dataIv": "R69yVluzg6yLpjp0","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "若雪","name": "若雪丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://appcms.rx4k.top","site": "","dataKey": "ZX10ysTYZWtIJCTU","dataIv": "ZX10ysTYZWtIJCTU","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "哔滴","name": "哔滴丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ooxooxooxooxoo-1259561579.cos.ap-chengdu.myqcloud.com/ip.json","dataKey": "5ae8ee4bb95ea0ce","dataIv": "5ae8ee4bb95ea0ce","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "哔滴","name": "哔滴丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ooxooxooxooxoo-1259561579.cos.ap-chengdu.myqcloud.com/ip.json","dataKey": "5ae8ee4bb95ea0ce","dataIv": "5ae8ee4bb95ea0ce","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "丫丫","name": "丫丫|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://tv.yy-fun.cc","dataKey": "qkxnwkfjwpcnwycl","dataIv": "qkxnwkfjwpcnwycl","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "丫丫","name": "丫丫|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://tv.yy-fun.cc","dataKey": "qkxnwkfjwpcnwycl","dataIv": "qkxnwkfjwpcnwycl","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "小野","name": "小野|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://appcms.xy4k.com","site": "","dataKey": "7SDWjknU34zqFbVr","dataIv": "7SDWjknU34zqFbVr","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "爱看","name": "爱看丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.220.65","dataKey": "uI1TkPJC8B46AyN3","dataIv": "uI1TkPJC8B46AyN3","deviceId": "2112fc5eac600314ba95c4d65da9286b3","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "爱看","name": "爱看丨APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://154.37.220.65","dataKey": "uI1TkPJC8B46AyN3","dataIv": "uI1TkPJC8B46AyN3","deviceId": "2112fc5eac600314ba95c4d65da9286b3","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "稀饭","name": "稀饭|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://app.xifanys.com","dataKey": "HM6Ly9yeS4ya3dvL","dataIv": "HM6Ly9yeS4ya3dvL","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "稀饭","name": "稀饭APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://app.xifanys.com","dataKey": "HM6Ly9yeS4ya3dvL","dataIv": "HM6Ly9yeS4ya3dvL","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "蓝光","name": "蓝光APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://122.228.193.2:9654","dataKey": "ca94b06ca3c7d80e","dataIv": "ca94b06ca3c7d80e","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "蓝光","name": "蓝光APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://122.228.193.2:9654","dataKey": "ca94b06ca3c7d80e","dataIv": "ca94b06ca3c7d80e","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "豆丁","name": "豆丁APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://vip.123pan.cn/1848451100/zl/xfdd.txt","dataKey": "xasdasdqwertyuio","dataIv": "xasdasdqwertyuio","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "豆丁","name": "豆丁APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://vip.123pan.cn/1848451100/zl/xfdd.txt","dataKey": "xasdasdqwertyuio","dataIv": "xasdasdqwertyuio","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "蓝鹰","name": "蓝鹰APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://lanyinghz.oss-cn-hangzhou.aliyuncs.com/lanyingxmy.txt","dataKey": "ca94b06ca359d80e","dataIv": "ca94b06ca359d80e","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "蓝鹰","name": "蓝鹰APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://lanyinghz.oss-cn-hangzhou.aliyuncs.com/lanyingxmy.txt","dataKey": "ca94b06ca359d80e","dataIv": "ca94b06ca359d80e","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "仓鼠","name": "仓鼠APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/csurl.txt","dataKey": "Z98KXaLtO2wC1Pte","dataIv": "Z98KXaLtO2wC1Pte","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "榴莲","name": "榴莲APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "https://qjappcms.ll4k.xyz","dataKey": "1yGA85sJ5STtE7uj","dataIv": "1yGA85sJ5STtE7uj","deviceId": "","version": "50000"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "鲸鱼","name": "鲸鱼APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json","dataKey": "AAdgrdghjfgswerA","dataIv": "AAdgrdghjfgswerA","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "仓鼠","name": "仓鼠APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/csurl.txt","dataKey": "Z98KXaLtO2wC1Pte","dataIv": "Z98KXaLtO2wC1Pte","deviceId": "","version": "120"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "米诺","name": "米诺APP","type": 3,"api": "csp_AppGet","ext": {"url": "http://www.milkidc.cn","dataKey": "20c79c979da8db0f","dataIv": "20c79c979da8db0f","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "鲸鱼","name": "鲸鱼APP","type": 3,"quickSearch": 1,"api": "csp_AppGet2","ext": {"url": "","site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json","dataKey": "AAdgrdghjfgswerA","dataIv": "AAdgrdghjfgswerA","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "云速","name": "云速APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://59.153.167.137:7788/1.json","dataKey": "4d83b87c4c5ea111","dataIv": "4d83b87c4c5ea111","deviceId": "","version": "105"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "米诺","name": "米诺APP","type": 3,"api": "csp_AppGet","ext": {"url": "http://www.milkidc.cn","dataKey": "20c79c979da8db0f","dataIv": "20c79c979da8db0f","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "瓜萌","name": "瓜萌APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.guahd.com/1.txt","dataKey": "f2A7D4B9E8C16531","dataIv": "f2A7D4B9E8C16531","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "云速","name": "云速APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://59.153.167.137:7788/1.json","dataKey": "4d83b87c4c5ea111","dataIv": "4d83b87c4c5ea111","deviceId": "","version": "105"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "晴天","name": "晴天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://qjappcms.sun4k.top","dataKey": "sBxqXVF5pAHbGzrH","dataIv": "sBxqXVF5pAHbGzrH","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "瓜萌","name": "瓜萌APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "https://www.guahd.com/1.txt","dataKey": "f2A7D4B9E8C16531","dataIv": "f2A7D4B9E8C16531","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "橘子","name": "橘子APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://t.bffree.cn/1.txt","dataKey": "2015692015692015","dataIv": "2015692015692015","deviceId": "","version": "300"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "溜溜","name": "溜溜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://appcms.ll4k.xyz","dataKey": "NiDGaKiVnkO3QX1Q","dataIv": "NiDGaKiVnkO3QX1Q","deviceId": "2fbaf48ee97783260bc907e3ab0bd40c3","version": "200"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "萝卜","name": "萝卜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://apiapplbys.lbys.app:5678","dataKey": "apiapplbyskey168","dataIv": "apiapplbyskey168","deviceId": "","version": "107"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "晴天","name": "晴天APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://qjappcms.sun4k.top","dataKey": "sBxqXVF5pAHbGzrH","dataIv": "sBxqXVF5pAHbGzrH","deviceId": "","version": "119"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "米兔","name": "米兔APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://new.tkbot.fun","dataKey": "d032c12876bc6848","dataIv": "d032c12876bc6848","deviceId": "","version": "200"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "橘子","name": "橘子APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://t.bffree.cn/1.txt","dataKey": "2015692015692015","dataIv": "2015692015692015","deviceId": "","version": "300"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "小红","name": "小红APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.xiaohys.com","dataKey": "ENonBHeVBoYZhVUV","dataIv": "ENonBHeVBoYZhVUV","deviceId": "298e5fe29c74b35aabb9836ee2f6f449f","version": "166"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "萝卜","name": "萝卜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://apiapplbys.lbys.app:5678","dataKey": "apiapplbyskey168","dataIv": "apiapplbyskey168","deviceId": "","version": "107"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "白蛇","name": "白蛇APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://tengxunyunaliyun.oss-cn-shanghai.aliyuncs.com/tengxunyun.txt","dataKey": "n3l2tx5jdkp9s2c8","dataIv": "n3l2tx5jdkp9s2c8","deviceId": "","version": "361"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "米兔","name": "米兔APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://new.tkbot.fun","dataKey": "d032c12876bc6848","dataIv": "d032c12876bc6848","deviceId": "","version": "200"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "若惜","name": "若惜APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://110.40.59.188:9527","dataKey": "ebad3f1a58b13933","dataIv": "ebad3f1a58b13933","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "小红","name": "小红APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.xiaohys.com","dataKey": "ENonBHeVBoYZhVUV","dataIv": "ENonBHeVBoYZhVUV","deviceId": "298e5fe29c74b35aabb9836ee2f6f449f","version": "166"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "外剧","name": "外剧APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://guowaiju.com","dataKey": "7xv16h7qgkrs9b1p","dataIv": "7xv16h7qgkrs9b1p","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "白蛇","name": "白蛇APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "","site": "http://tengxunyunaliyun.oss-cn-shanghai.aliyuncs.com/tengxunyun.txt","dataKey": "n3l2tx5jdkp9s2c8","dataIv": "n3l2tx5jdkp9s2c8","deviceId": "","version": "361"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"}, {"key": "移动","name": "移动APP","type": 3,"api": "csp_YD","searchable": 1,"quickSearch": 1,"style": {"type": "list"},"jar": "./xiaosa/spider.jar;md5;d4f2eaed9337ce6ac41577d6ae3d0041"},
{"key": "若惜","name": "若惜|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "http://110.40.59.188:9527","dataKey": "ebad3f1a58b13933","dataIv": "ebad3f1a58b13933","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "外剧","name": "外剧|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://guowaiju.com","dataKey": "7xv16h7qgkrs9b1p","dataIv": "7xv16h7qgkrs9b1p","deviceId": "","version": ""},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "诺映","name": "诺映|APP","type": 3,"quickSearch": 1,"api": "csp_AppGet","ext": {"url": "https://www.noad.top","dataKey": "708FA298F0855840","dataIv": "708FA298F0855840","deviceId": "2129ec9e6e5703cb0aeeddd79554e38f8","version": "103"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "移动","name": "移动|APP","type": 3,"api": "csp_YD","searchable": 1,"quickSearch": 1,"style": {"type": "list"},"jar": "./xiaosa/spider.jar;md5;a08cb06afc9186e0b048914462671d1c"},
{"key": "玩偶","name": "👽玩偶哥哥┃4K弹幕","type": 3,"api": "csp_WoGGGuard","timeout": 30,"searchable": 1,"quickSearch": 1,"changeable": 0,"ext": {"Cloud-drive": "tvfan/Cloud-drive.txt","from": "4k|auto","siteUrl": "https://www.wogg.com/","danMu": "弹"}}, {"key": "玩偶","name": "👽玩偶哥哥┃4K弹幕","type": 3,"api": "csp_WoGGGuard","timeout": 30,"searchable": 1,"quickSearch": 1,"changeable": 0,"ext": {"Cloud-drive": "tvfan/Cloud-drive.txt","from": "4k|auto","siteUrl": "https://www.wogg.com/","danMu": "弹"}},
{"key": "YGP","name": "🚀叨观荐影┃预告片","type": 3,"api": "csp_YGPGuard","searchable": 0,"quickSearch": 0,"changeable": 0}, {"key": "YGP","name": "🚀叨观荐影┃预告片","type": 3,"api": "csp_YGPGuard","searchable": 0,"quickSearch": 0,"changeable": 0},
{"key": "alllive","name": "📽️一直播┃直播","type": 3,"api": "csp_AllliveGuard","playerType": 2,"searchable": 0,"quickSearch": 0,"changeable": 0}, {"key": "alllive","name": "📽️一直播┃直播","type": 3,"api": "csp_AllliveGuard","playerType": 2,"searchable": 0,"quickSearch": 0,"changeable": 0},
+63 -138
View File
@@ -85,6 +85,51 @@
"key3": "aassddwwxxllsx1x" "key3": "aassddwwxxllsx1x"
} }
}, },
{
"key": "乐达",
"name": "乐达|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://ledayy.com",
"site": "",
"dataKey": "hjjp68c2okw12345",
"dataIv": "hjjp68c2okw12345",
"deviceId": "",
"version": ""
}
},
{
"key": "灵虎",
"name": "灵虎|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "",
"site": "https://bind.315999.xyz/89.txt",
"dataKey": "#getapp@TMD@2025",
"dataIv": "#getapp@TMD@2025",
"deviceId": "",
"version": "120"
}
},
{
"key": "旗星",
"name": "旗星|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://ys.qist.top",
"site": "",
"dataKey": "2SWSPFxugBLPPOKo",
"dataIv": "2SWSPFxugBLPPOKo",
"deviceId": "",
"version": "120"
}
},
{ {
"key": "云云", "key": "云云",
"name": "云云|APP", "name": "云云|APP",
@@ -114,35 +159,6 @@
"version": "" "version": ""
} }
}, },
{
"key": "魔方",
"name": "魔方|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "",
"site": "https://www.snysw.xyz/mfys.txt",
"dataKey": "1234567887654321",
"dataIv": "1234567887654321",
"deviceId": "",
"version": ""
}
},
{
"key": "冬天",
"name": "冬天|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://154.37.152.97:5211",
"dataKey": "685bf108bc47b67d",
"dataIv": "685bf108bc47b67d",
"deviceId": "685bf108bc47b67d",
"version": ""
}
},
{ {
"key": "火猫", "key": "火猫",
"name": "火猫丨APP", "name": "火猫丨APP",
@@ -173,21 +189,6 @@
"version": "120" "version": "120"
} }
}, },
{
"key": "海豚",
"name": "海豚丨APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet2",
"ext": {
"url": "https://qjappcms.htsp4k.top",
"site": "",
"dataKey": "R69yVluzg6yLpjp0",
"dataIv": "R69yVluzg6yLpjp0",
"deviceId": "",
"version": ""
}
},
{ {
"key": "哔滴", "key": "哔滴",
"name": "哔滴丨APP", "name": "哔滴丨APP",
@@ -217,21 +218,6 @@
"version": "" "version": ""
} }
}, },
{
"key": "小野",
"name": "小野|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://appcms.xy4k.com",
"site": "",
"dataKey": "7SDWjknU34zqFbVr",
"dataIv": "7SDWjknU34zqFbVr",
"deviceId": "",
"version": ""
}
},
{ {
"key": "爱看", "key": "爱看",
"name": "爱看丨APP", "name": "爱看丨APP",
@@ -304,20 +290,6 @@
"version": "120" "version": "120"
} }
}, },
{
"key": "榴莲",
"name": "榴莲|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet2",
"ext": {
"url": "https://qjappcms.ll4k.xyz",
"dataKey": "1yGA85sJ5STtE7uj",
"dataIv": "1yGA85sJ5STtE7uj",
"deviceId": "",
"version": "50000"
}
},
{ {
"key": "仓鼠", "key": "仓鼠",
"name": "仓鼠|APP", "name": "仓鼠|APP",
@@ -391,20 +363,6 @@
"version": "" "version": ""
} }
}, },
{
"key": "溜溜",
"name": "溜溜|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://appcms.ll4k.xyz",
"dataKey": "NiDGaKiVnkO3QX1Q",
"dataIv": "NiDGaKiVnkO3QX1Q",
"deviceId": "2fbaf48ee97783260bc907e3ab0bd40c3",
"version": "200"
}
},
{ {
"key": "晴天", "key": "晴天",
"name": "晴天|APP", "name": "晴天|APP",
@@ -519,20 +477,6 @@
"version": "" "version": ""
} }
}, },
{
"key": "诺映",
"name": "诺映|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.noad.top",
"dataKey": "708FA298F0855840",
"dataIv": "708FA298F0855840",
"deviceId": "2129ec9e6e5703cb0aeeddd79554e38f8",
"version": "103"
}
},
{ {
"key": "移动", "key": "移动",
"name": "移动|APP", "name": "移动|APP",
@@ -865,16 +809,6 @@
"type": "list" "type": "list"
} }
}, },
{
"key": "爱搜",
"name": "爱搜|4K弹幕",
"type": 3,
"api": "./js/cloud.min.js",
"ext": "./js/爱搜.js",
"style": {
"type": "list"
}
},
{ {
"key": "糖果", "key": "糖果",
"name": "糖果|搜索", "name": "糖果|搜索",
@@ -889,16 +823,6 @@
"type": 3, "type": 3,
"api": "csp_MiSou" "api": "csp_MiSou"
}, },
{
"key": "人人分享站",
"name": "人人|搜索",
"type": 3,
"api": "./js/cloud.min.js",
"ext": "./js/人人分享站.js",
"style": {
"type": "list"
}
},
{ {
"key": "全盘", "key": "全盘",
"name": "全盘|搜索", "name": "全盘|搜索",
@@ -926,8 +850,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "偷乐短剧", "key": "偷乐短剧",
@@ -937,8 +860,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "爱看短剧", "key": "爱看短剧",
@@ -948,8 +870,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "锦鲤短剧", "key": "锦鲤短剧",
@@ -959,8 +880,17 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2 },
{
"key": "剧王短剧",
"name": "剧王|短剧",
"type": 3,
"api": "./py/剧王短剧.py",
"searchable": 1,
"changeable": 1,
"quickSearch": 1,
"filterable": 1
}, },
{ {
"key": "短剧屋", "key": "短剧屋",
@@ -996,7 +926,6 @@
"searchable": 1, "searchable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1,
"playerType": 2,
"ext": { "ext": {
"site": "https://m.hkybqufgh.com,https://m.sizhengxt.com,https://m.9zhoukj.com,https://m.sizhengxt.com,https://m.jiabaide.cn" "site": "https://m.hkybqufgh.com,https://m.sizhengxt.com,https://m.9zhoukj.com,https://m.sizhengxt.com,https://m.jiabaide.cn"
} }
@@ -1009,8 +938,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "零度影视", "key": "零度影视",
@@ -1020,8 +948,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "追星影视", "key": "追星影视",
@@ -1031,8 +958,7 @@
"searchable": 1, "searchable": 1,
"changeable": 1, "changeable": 1,
"quickSearch": 1, "quickSearch": 1,
"filterable": 1, "filterable": 1
"playerType": 2
}, },
{ {
"key": "厂长影视", "key": "厂长影视",
@@ -1085,8 +1011,7 @@
"key": "饺子影视", "key": "饺子影视",
"name": "饺子|影视", "name": "饺子|影视",
"type": 3, "type": 3,
"api": "csp_Jiaozi", "api": "csp_Jiaozi"
"playerType": 2
}, },
{ {
"key": "鸭梨影视", "key": "鸭梨影视",
+3200 -3056
View File
@@ -1,3057 +1,3201 @@
import cheerio from "assets://js/lib/cheerio.min.js"; import {
import "assets://js/lib/crypto-js.js"; cheerio,
import "./jsencrypt.js"; 模板
import "./node-rsa.js"; } from "./drpy-core-lite.min.js";
import "./pako.min.js"; let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
import 模板 from "./模板.js"; const VERSION = vercode + " 3.9.52beta3 20250801";
import { const UpdateInfo = [{
gbkTool date: "20250801",
} from "./gbk.js"; title: "drpy依赖更新,使用drpy-core-lite.min.js",
import "./json5.js"; version: "3.9.52beta3 20250801",
import "./jinja.js"; msg: `
const _jinja2 = cheerio.jinja2; drpy-core.min.js 更换为更小的drpy-core-lite.min.js
cheerio.jinja2 = function(template, obj) {
try { `
return jinja.render(template, obj) }, {
} catch (e) { date: "20250729",
console.log("新的jinja2库渲染失败,换回原始cheerio:" + e.message); title: "drpy更新,所有依赖打包成一个js文件",
return _jinja2(template, obj) version: "3.9.52beta2 20250729",
} msg: `
}; 1. wasm支持
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2"; 2. 引入 TextEncoder、TextDecoder对象
const VERSION = vercode + " 3.9.51beta5 20241104"; 3. 引入 WXXH 加解密库
const UpdateInfo = [{ 4. 所有依赖打包成一个js
date: "20241104", 5. 增加 buildQueryString
title: "drpy更新,增加新特性",
version: "3.9.51beta5 20241104", `
msg: ` }, {
1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码' date: "20250728",
2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能,超过1页直接返回空 title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
` version: "3.9.52beta1 20250728",
}]; msg: `
1. 增加tab_order线路模糊排序
function getUpdateInfo() { 2. 优化解密算法支持文件头
return UpdateInfo.map(_o => { 3. wasm支持
_o.msg = _o.msg.trim().split("\n").map(_it => _it.trim()).join("\n"); 4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
return _o 5. 引入 TextEncoder、TextDecoder对象
}) 6. 引入 WXXH 加解密库
} `
}, {
function init_test() { date: "20241126",
console.log("init_test_start"); title: "drpy更新,优化去广告算法",
console.log("当前版本号:" + VERSION); version: "3.9.51beta6 20241126",
console.log("本地代理地址:" + getProxyUrl()); msg: `
console.log(RKEY); 1. 更新龙头大佬提供的去广告算法
console.log(JSON.stringify(rule)); `
console.log("init_test_end") }, {
} date: "20241104",
title: "drpy更新,增加新特性",
function ocr_demo_test() { version: "3.9.51beta5 20241104",
let img_base64 = `iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`; msg: `
OcrApi.api = OCR_API; 1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码'
let code = OcrApi.classification(img_base64); 2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能,超过1页直接返回空
log("测试验证码图片的ocr识别结果为:" + code) `
} }];
function rsa_demo_test() { function getUpdateInfo() {
let t1 = (new Date).getTime(); return UpdateInfo.map(_o => {
let pkcs1_public = ` _o.msg = _o.msg.trim().split("\n").map(_it => _it.trim()).join("\n");
-----BEGIN RSA PUBLIC KEY----- return _o
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy })
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= }
-----END RSA PUBLIC KEY-----
`.trim(); function init_test() {
let pkcs1_public_pem = ` console.log("init_test_start");
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy console.log("当前版本号:" + VERSION);
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE= console.log("本地代理地址:" + getProxyUrl());
`.trim(); console.log(RKEY);
let pkcs8_public = ` console.log(JSON.stringify(rule));
-----BEGIN PUBLIC KEY----- console.log("init_test_end")
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ }
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
-----END PUBLIC KEY-----`.trim(); function ocr_demo_test() {
let pkcs8_public_pem = ` let img_base64 = `iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`;
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/ OcrApi.api = OCR_API;
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ== let code = OcrApi.classification(img_base64);
`.trim(); log("测试验证码图片的ocr识别结果为:" + code)
let pkcs1_private = ` }
-----BEGIN RSA PRIVATE KEY-----
MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7 function rsa_demo_test() {
ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt let t1 = (new Date).getTime();
0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ let pkcs1_public = `
AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA -----BEGIN RSA PUBLIC KEY-----
hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+ MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q== -----END RSA PUBLIC KEY-----
-----END RSA PRIVATE KEY----- `.trim();
`.trim(); let pkcs1_public_pem = `
let pkcs8_private = ` MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
-----BEGIN PRIVATE KEY----- lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf `.trim();
dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v let pkcs8_public = `
YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8 -----BEGIN PUBLIC KEY-----
KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8 MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3 -----END PUBLIC KEY-----`.trim();
rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6 let pkcs8_public_pem = `
lPxDjezd MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
-----END PRIVATE KEY----- nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
`.trim(); `.trim();
let data = ` let pkcs1_private = `
NodeRsa -----BEGIN RSA PRIVATE KEY-----
这是node-rsa 现在修改集成在drpy里使用`.trim(); MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7
let encryptedWithPublic = NODERSA.encryptRSAWithPublicKey(data, pkcs1_public, { ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt
outputEncoding: "base64", 0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ
options: { AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA
environment: "browser", hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+
encryptionScheme: "pkcs1_oaep" 5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS
} EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q==
}); -----END RSA PRIVATE KEY-----
console.log("公钥加密"); `.trim();
console.log(encryptedWithPublic); let pkcs8_private = `
let decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, { -----BEGIN PRIVATE KEY-----
options: { MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf
environment: "browser", dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v
encryptionScheme: "pkcs1_oaep" YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8
} KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8
}); s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl
console.log("私钥解密"); AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3
console.log(decryptedWithPrivate); rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6
let pkcs1_sha256_sign = NODERSA.sign("1", pkcs1_private, { lPxDjezd
outputEncoding: "base64", -----END PRIVATE KEY-----
options: { `.trim();
environment: "browser", let data = `
encryptionScheme: "pkcs1", NodeRsa
signingScheme: "pkcs1-sha256" 这是node-rsa 现在修改集成在drpy里使用`.trim();
} let encryptedWithPublic = NODERSA.encryptRSAWithPublicKey(data, pkcs1_public, {
}); outputEncoding: "base64",
console.log("pkcs1_sha256_sign"); options: {
console.log(pkcs1_sha256_sign); environment: "browser",
let pkcs1_sha256_sign_verify = NODERSA.verify("1", "Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==", pkcs1_private, { encryptionScheme: "pkcs1_oaep"
options: { }
environment: "browser", });
encryptionScheme: "pkcs1", console.log("公钥加密");
signingScheme: "pkcs1-sha256" console.log(encryptedWithPublic);
} let decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, {
}); options: {
console.log("pkcs1_sha256_sign_verify"); environment: "browser",
console.log(pkcs1_sha256_sign_verify); encryptionScheme: "pkcs1_oaep"
let pkcs1_oaep_sha256 = NODERSA.encryptRSAWithPublicKey(data, `-----BEGIN RSA PUBLIC KEY----- }
MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du });
SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm console.log("私钥解密");
kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8 console.log(decryptedWithPrivate);
PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m let pkcs1_sha256_sign = NODERSA.sign("1", pkcs1_private, {
PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb outputEncoding: "base64",
Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB options: {
-----END RSA PUBLIC KEY----- environment: "browser",
`, { encryptionScheme: "pkcs1",
outputEncoding: "base64", signingScheme: "pkcs1-sha256"
options: { }
environment: "browser", });
encryptionScheme: { console.log("pkcs1_sha256_sign");
scheme: "pkcs1_oaep", console.log(pkcs1_sha256_sign);
hash: "sha256" let pkcs1_sha256_sign_verify = NODERSA.verify("1", "Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==", pkcs1_private, {
} options: {
} environment: "browser",
}); encryptionScheme: "pkcs1",
console.log("pkcs1_oaep_sha256"); signingScheme: "pkcs1-sha256"
console.log(pkcs1_oaep_sha256); }
decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==", `-----BEGIN RSA PRIVATE KEY----- });
MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is console.log("pkcs1_sha256_sign_verify");
T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S console.log(pkcs1_sha256_sign_verify);
xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy let pkcs1_oaep_sha256 = NODERSA.encryptRSAWithPublicKey(data, `-----BEGIN RSA PUBLIC KEY-----
3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+ MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du
HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm
ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/ kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8
zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31 PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m
iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb
QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB
eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ -----END RSA PUBLIC KEY-----
8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9 `, {
l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC outputEncoding: "base64",
WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J options: {
NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0 environment: "browser",
o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3 encryptionScheme: {
ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ scheme: "pkcs1_oaep",
I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i hash: "sha256"
tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P }
vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p }
yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC });
8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87 console.log("pkcs1_oaep_sha256");
HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN console.log(pkcs1_oaep_sha256);
QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51 decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==", `-----BEGIN RSA PRIVATE KEY-----
MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is
m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA== T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S
-----END RSA PRIVATE KEY-----`, { xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy
options: { 3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+
environment: "browser", HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA
encryptionScheme: "pkcs1_oaep" ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/
} zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31
}); iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l
console.log("decryptedWithPrivate"); QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu
console.log(decryptedWithPrivate); eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ
(() => { 8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9
let key = new NODERSA.NodeRSA({ l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC
b: 1024 WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J
}); NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0
key.setOptions({ o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3
encryptionScheme: "pkcs1" ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ
}); I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i
let text = `你好drpy node-ras`; tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P
let encrypted = key.encrypt(text, "base64"); vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p
console.log("encrypted: ", encrypted); yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC
const decrypted = key.decrypt(encrypted, "utf8"); 8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87
console.log("decrypted: ", decrypted) HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN
})(); QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51
let t2 = (new Date).getTime(); MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw
console.log("rsa_demo_test 测试耗时:" + (t2 - t1) + "毫秒") m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA==
} -----END RSA PRIVATE KEY-----`, {
options: {
function pre() { environment: "browser",
if (typeof rule.预处理 === "string" && rule.预处理 && rule.预处理.trim()) { encryptionScheme: "pkcs1_oaep"
let code = rule.预处理.trim(); }
console.log("执行预处理代码:" + code); });
if (code.startsWith("js:")) { console.log("decryptedWithPrivate");
code = code.replace("js:", "") console.log(decryptedWithPrivate);
} (() => {
try { let key = new NODERSA.NodeRSA({
eval(code) b: 1024
} catch (e) { });
console.log(`预处理执行失败:${e.message}`) key.setOptions({
} encryptionScheme: "pkcs1"
} });
} let text = `你好drpy node-ras`;
let rule = {}; let encrypted = key.encrypt(text, "base64");
const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"; console.log("encrypted: ", encrypted);
const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"; const decrypted = key.decrypt(encrypted, "utf8");
const UA = "Mozilla/5.0"; console.log("decrypted: ", decrypted)
const UC_UA = "Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36"; })();
const IOS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"; let t2 = (new Date).getTime();
const RULE_CK = "cookie"; console.log("rsa_demo_test 测试耗时:" + (t2 - t1) + "毫秒")
const CATE_EXCLUDE = "首页|留言|APP|下载|资讯|新闻|动态"; }
const TAB_EXCLUDE = "猜你|喜欢|下载|剧情|榜|评论";
const OCR_RETRY = 3; function pre() {
const OCR_API = "https://api.nn.ci/ocr/b64/text"; if (typeof rule.预处理 === "string" && rule.预处理 && rule.预处理.trim()) {
if (typeof MY_URL === "undefined") { let code = rule.预处理.trim();
var MY_URL console.log("执行预处理代码:" + code);
} if (code.startsWith("js:")) {
var HOST; code = code.replace("js:", "")
var RKEY; }
var fetch; try {
var print; eval(code)
var log; } catch (e) {
var rule_fetch_params; console.log(`预处理执行失败:${e.message}`)
var fetch_params; }
var oheaders; }
var _pdfh; }
var _pdfa; let rule = {};
var _pd; const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/; const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";
const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/; const UA = "Mozilla/5.0";
const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/; const UC_UA = "Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";
const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)/; const IOS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
const SELECT_REGEX = /:eq|:lt|:gt|#/g; const RULE_CK = "cookie";
const SELECT_REGEX_A = /:eq|:lt|:gt/g; const CATE_EXCLUDE = "首页|留言|APP|下载|资讯|新闻|动态";
const $js = { const TAB_EXCLUDE = "猜你|喜欢|下载|剧情|榜|评论";
toString(func) { const OCR_RETRY = 3;
let strfun = func.toString(); const OCR_API = "https://api.nn.ci/ocr/b64/text";
return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/, "js:").replace(/\}$/, "") if (typeof MY_URL === "undefined") {
} var MY_URL
}; }
var HOST;
function window_b64() { var RKEY;
let b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var fetch;
let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1); var print;
var log;
function btoa(str) { var rule_fetch_params;
var out, i, len; var fetch_params;
var c1, c2, c3; var oheaders;
len = str.length; var _pdfh;
i = 0; var _pdfa;
out = ""; var _pd;
while (i < len) { const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
c1 = str.charCodeAt(i++) & 255; const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
if (i == len) { const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/;
out += b64map.charAt(c1 >> 2); const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)/;
out += b64map.charAt((c1 & 3) << 4); const SELECT_REGEX = /:eq|:lt|:gt|#/g;
out += "=="; const SELECT_REGEX_A = /:eq|:lt|:gt/g;
break const $js = {
} toString(func) {
c2 = str.charCodeAt(i++); let strfun = func.toString();
if (i == len) { return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/, "js:").replace(/\}$/, "")
out += b64map.charAt(c1 >> 2); }
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4); };
out += b64map.charAt((c2 & 15) << 2);
out += "="; function window_b64() {
break let b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
} let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
c3 = str.charCodeAt(i++);
out += b64map.charAt(c1 >> 2); function btoa(str) {
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4); var out, i, len;
out += b64map.charAt((c2 & 15) << 2 | (c3 & 192) >> 6); var c1, c2, c3;
out += b64map.charAt(c3 & 63) len = str.length;
} i = 0;
return out out = "";
} while (i < len) {
c1 = str.charCodeAt(i++) & 255;
function atob(str) { if (i == len) {
var c1, c2, c3, c4; out += b64map.charAt(c1 >> 2);
var i, len, out; out += b64map.charAt((c1 & 3) << 4);
len = str.length; out += "==";
i = 0; break
out = ""; }
while (i < len) { c2 = str.charCodeAt(i++);
do { if (i == len) {
c1 = base64DecodeChars[str.charCodeAt(i++) & 255] out += b64map.charAt(c1 >> 2);
} while (i < len && c1 == -1); out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
if (c1 == -1) break; out += b64map.charAt((c2 & 15) << 2);
do { out += "=";
c2 = base64DecodeChars[str.charCodeAt(i++) & 255] break
} while (i < len && c2 == -1); }
if (c2 == -1) break; c3 = str.charCodeAt(i++);
out += String.fromCharCode(c1 << 2 | (c2 & 48) >> 4); out += b64map.charAt(c1 >> 2);
do { out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
c3 = str.charCodeAt(i++) & 255; out += b64map.charAt((c2 & 15) << 2 | (c3 & 192) >> 6);
if (c3 == 61) return out; out += b64map.charAt(c3 & 63)
c3 = base64DecodeChars[c3] }
} while (i < len && c3 == -1); return out
if (c3 == -1) break; }
out += String.fromCharCode((c2 & 15) << 4 | (c3 & 60) >> 2);
do { function atob(str) {
c4 = str.charCodeAt(i++) & 255; var c1, c2, c3, c4;
if (c4 == 61) return out; var i, len, out;
c4 = base64DecodeChars[c4] len = str.length;
} while (i < len && c4 == -1); i = 0;
if (c4 == -1) break; out = "";
out += String.fromCharCode((c3 & 3) << 6 | c4) while (i < len) {
} do {
return out c1 = base64DecodeChars[str.charCodeAt(i++) & 255]
} } while (i < len && c1 == -1);
return { if (c1 == -1) break;
atob: atob, do {
btoa: btoa c2 = base64DecodeChars[str.charCodeAt(i++) & 255]
} } while (i < len && c2 == -1);
} if (c2 == -1) break;
if (typeof atob !== "function" || typeof btoa !== "function") { out += String.fromCharCode(c1 << 2 | (c2 & 48) >> 4);
var { do {
atob, c3 = str.charCodeAt(i++) & 255;
btoa if (c3 == 61) return out;
} = window_b64() c3 = base64DecodeChars[c3]
} } while (i < len && c3 == -1);
if (typeof Object.assign !== "function") { if (c3 == -1) break;
Object.assign = function() { out += String.fromCharCode((c2 & 15) << 4 | (c3 & 60) >> 2);
let target = arguments[0]; do {
for (let i = 1; i < arguments.length; i++) { c4 = str.charCodeAt(i++) & 255;
let source = arguments[i]; if (c4 == 61) return out;
for (let key in source) { c4 = base64DecodeChars[c4]
if (Object.prototype.hasOwnProperty.call(source, key)) { } while (i < len && c4 == -1);
target[key] = source[key] if (c4 == -1) break;
} out += String.fromCharCode((c3 & 3) << 6 | c4)
} }
} return out
return target }
} return {
} atob: atob,
if (!String.prototype.includes) { btoa: btoa
String.prototype.includes = function(search, start) { }
if (typeof start !== "number") { }
start = 0 if (typeof atob !== "function" || typeof btoa !== "function") {
} var {
if (start + search.length > this.length) { atob,
return false btoa
} else { } = window_b64()
return this.indexOf(search, start) !== -1 }
} if (typeof Object.assign !== "function") {
} Object.assign = function() {
} let target = arguments[0];
if (!Array.prototype.includes) { for (let i = 1; i < arguments.length; i++) {
Object.defineProperty(Array.prototype, "includes", { let source = arguments[i];
value: function(searchElement, fromIndex) { for (let key in source) {
if (this == null) { if (Object.prototype.hasOwnProperty.call(source, key)) {
throw new TypeError('"this" is null or not defined') target[key] = source[key]
} }
var o = Object(this); }
var len = o.length >>> 0; }
if (len === 0) { return target
return false }
} }
var n = fromIndex | 0; if (!String.prototype.includes) {
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); String.prototype.includes = function(search, start) {
while (k < len) { if (typeof start !== "number") {
if (o[k] === searchElement) { start = 0
return true }
} if (start + search.length > this.length) {
k++ return false
} } else {
return false return this.indexOf(search, start) !== -1
}, }
enumerable: false }
}) }
} if (!Array.prototype.includes) {
if (typeof String.prototype.startsWith !== "function") { Object.defineProperty(Array.prototype, "includes", {
String.prototype.startsWith = function(prefix) { value: function(searchElement, fromIndex) {
return this.slice(0, prefix.length) === prefix if (this == null) {
} throw new TypeError('"this" is null or not defined')
} }
if (typeof String.prototype.endsWith !== "function") { var o = Object(this);
String.prototype.endsWith = function(suffix) { var len = o.length >>> 0;
return this.indexOf(suffix, this.length - suffix.length) !== -1 if (len === 0) {
} return false
} }
Object.defineProperty(Object.prototype, "myValues", { var n = fromIndex | 0;
value: function(obj) { var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
if (obj == null) { while (k < len) {
throw new TypeError("Cannot convert undefined or null to object") if (o[k] === searchElement) {
} return true
var res = []; }
for (var k in obj) { k++
if (obj.hasOwnProperty(k)) { }
res.push(obj[k]) return false
} },
} enumerable: false
return res })
}, }
enumerable: false if (typeof String.prototype.startsWith !== "function") {
}); String.prototype.startsWith = function(prefix) {
if (typeof Object.prototype.values !== "function") { return this.slice(0, prefix.length) === prefix
Object.defineProperty(Object.prototype, "values", { }
value: function(obj) { }
if (obj == null) { if (typeof String.prototype.endsWith !== "function") {
throw new TypeError("Cannot convert undefined or null to object") String.prototype.endsWith = function(suffix) {
} return this.indexOf(suffix, this.length - suffix.length) !== -1
var res = []; }
for (var k in obj) { }
if (obj.hasOwnProperty(k)) { Object.defineProperty(Object.prototype, "myValues", {
res.push(obj[k]) value: function(obj) {
} if (obj == null) {
} throw new TypeError("Cannot convert undefined or null to object")
return res }
}, var res = [];
enumerable: false for (var k in obj) {
}) if (obj.hasOwnProperty(k)) {
} res.push(obj[k])
if (typeof Array.prototype.join !== "function") { }
Object.defineProperty(Array.prototype, "join", { }
value: function(emoji) { return res
emoji = emoji || ""; },
let self = this; enumerable: false
let str = ""; });
let i = 0; if (typeof Object.prototype.values !== "function") {
if (!Array.isArray(self)) { Object.defineProperty(Object.prototype, "values", {
throw String(self) + "is not Array" value: function(obj) {
} if (obj == null) {
if (self.length === 0) { throw new TypeError("Cannot convert undefined or null to object")
return "" }
} var res = [];
if (self.length === 1) { for (var k in obj) {
return String(self[0]) if (obj.hasOwnProperty(k)) {
} res.push(obj[k])
i = 1; }
str = this[0]; }
for (; i < self.length; i++) { return res
str += String(emoji) + String(self[i]) },
} enumerable: false
return str })
}, }
enumerable: false if (typeof Array.prototype.join !== "function") {
}) Object.defineProperty(Array.prototype, "join", {
} value: function(emoji) {
if (typeof Array.prototype.toReversed !== "function") { emoji = emoji || "";
Object.defineProperty(Array.prototype, "toReversed", { let self = this;
value: function() { let str = "";
const clonedList = this.slice(); let i = 0;
const reversedList = clonedList.reverse(); if (!Array.isArray(self)) {
return reversedList throw String(self) + "is not Array"
}, }
enumerable: false if (self.length === 0) {
}) return ""
} }
Object.defineProperty(Array.prototype, "append", { if (self.length === 1) {
value: Array.prototype.push, return String(self[0])
enumerable: false }
}); i = 1;
Object.defineProperty(String.prototype, "strip", { str = this[0];
value: String.prototype.trim, for (; i < self.length; i++) {
enumerable: false str += String(emoji) + String(self[i])
}); }
Object.defineProperty(String.prototype, "rstrip", { return str
value: function(chars) { },
let regex = new RegExp(chars + "$"); enumerable: false
return this.replace(regex, "") })
}, }
enumerable: false if (typeof Array.prototype.toReversed !== "function") {
}); Object.defineProperty(Array.prototype, "toReversed", {
value: function() {
function 是否正版(vipUrl) { const clonedList = this.slice();
let flag = new RegExp("qq.com|iqiyi.com|youku.com|mgtv.com|bilibili.com|sohu.com|ixigua.com|pptv.com|miguvideo.com|le.com|1905.com|fun.tv"); const reversedList = clonedList.reverse();
return flag.test(vipUrl) return reversedList
} },
enumerable: false
function urlDeal(vipUrl) { })
if (!vipUrl) { }
return "" Object.defineProperty(Array.prototype, "append", {
} value: Array.prototype.push,
if (!是否正版(vipUrl)) { enumerable: false
return vipUrl });
} Object.defineProperty(String.prototype, "strip", {
if (!/miguvideo/.test(vipUrl)) { value: String.prototype.trim,
vipUrl = vipUrl.split("#")[0].split("?")[0] enumerable: false
} });
return vipUrl Object.defineProperty(String.prototype, "rstrip", {
} value: function(chars) {
let regex = new RegExp(chars + "$");
function setResult(d) { return this.replace(regex, "")
if (!Array.isArray(d)) { },
return [] enumerable: false
} });
VODS = [];
d.forEach(function(it) { function 是否正版(vipUrl) {
let obj = { let flag = new RegExp("qq.com|iqiyi.com|youku.com|mgtv.com|bilibili.com|sohu.com|ixigua.com|pptv.com|miguvideo.com|le.com|1905.com|fun.tv");
vod_id: it.url || "", return flag.test(vipUrl)
vod_name: it.title || "", }
vod_remarks: it.desc || "",
vod_content: it.content || "", function urlDeal(vipUrl) {
vod_pic: it.pic_url || it.img || "" if (!vipUrl) {
}; return ""
let keys = Object.keys(it); }
if (keys.includes("tname")) { if (!是否正版(vipUrl)) {
obj.type_name = it.tname || "" return vipUrl
} }
if (keys.includes("tid")) { if (!/miguvideo/.test(vipUrl)) {
obj.type_id = it.tid || "" vipUrl = vipUrl.split("#")[0].split("?")[0]
} }
if (keys.includes("year")) { return vipUrl
obj.vod_year = it.year || "" }
}
if (keys.includes("actor")) { function setResult(d) {
obj.vod_actor = it.actor || "" if (!Array.isArray(d)) {
} return []
if (keys.includes("director")) { }
obj.vod_director = it.director || "" VODS = [];
} d.forEach(function(it) {
if (keys.includes("area")) { let obj = {
obj.vod_area = it.area || "" vod_id: it.url || "",
} vod_name: it.title || "",
VODS.push(obj) vod_remarks: it.desc || "",
}); vod_content: it.content || "",
return VODS vod_pic: it.pic_url || it.img || ""
} };
let keys = Object.keys(it);
function setResult2(res) { if (keys.includes("tname")) {
VODS = res.list || []; obj.type_name = it.tname || ""
return VODS }
} if (keys.includes("tid")) {
obj.type_id = it.tid || ""
function setHomeResult(res) { }
if (!res || typeof res !== "object") { if (keys.includes("year")) {
return [] obj.vod_year = it.year || ""
} }
return setResult(res.list) if (keys.includes("actor")) {
} obj.vod_actor = it.actor || ""
}
function rc(js) { if (keys.includes("director")) {
if (js === "maomi_aes.js") { obj.vod_director = it.director || ""
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d"); }
var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330"); if (keys.includes("area")) {
return { obj.vod_area = it.area || ""
De: function(word) { }
word = CryptoJS.enc.Hex.parse(word); VODS.push(obj)
return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, { });
iv: t, return VODS
mode: CryptoJS.mode.CBC, }
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8) function setResult2(res) {
}, VODS = res.list || [];
En: function(word) { return VODS
var Encrypted = CryptoJS.AES.encrypt(word, a, { }
iv: t,
mode: CryptoJS.mode.CBC, function setHomeResult(res) {
padding: CryptoJS.pad.Pkcs7 if (!res || typeof res !== "object") {
}); return []
return Encrypted.ciphertext.toString() }
} return setResult(res.list)
} }
}
return {} function rc(js) {
} if (js === "maomi_aes.js") {
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
function maoss(jxurl, ref, key) { var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); return {
eval(getCryptoJS()); De: function(word) {
try { word = CryptoJS.enc.Hex.parse(word);
var getVideoInfo = function(text) { return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
return CryptoJS.AES.decrypt(text, key, { iv: t,
iv: iv, mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7 padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8) }).toString(CryptoJS.enc.Utf8)
}; },
var token_key = key == undefined ? "dvyYRQlnPRCMdQSe" : key; En: function(word) {
if (ref) { var Encrypted = CryptoJS.AES.encrypt(word, a, {
var html = request(jxurl, { iv: t,
headers: { mode: CryptoJS.mode.CBC,
Referer: ref padding: CryptoJS.pad.Pkcs7
} });
}) return Encrypted.ciphertext.toString()
} else { }
var html = request(jxurl) }
} }
if (html.indexOf("&btwaf=") != -1) { return {}
html = request(jxurl + "&btwaf" + html.match(/&btwaf(.*?)"/)[1], { }
headers: {
Referer: ref function maoss(jxurl, ref, key) {
} fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
}) eval(getCryptoJS());
} try {
var token_iv = html.split('_token = "')[1].split('"')[0]; var getVideoInfo = function(text) {
var key = CryptoJS.enc.Utf8.parse(token_key); return CryptoJS.AES.decrypt(text, key, {
var iv = CryptoJS.enc.Utf8.parse(token_iv); iv: iv,
eval(html.match(/var config = {[\s\S]*?}/)[0] + ""); padding: CryptoJS.pad.Pkcs7
if (!config.url.startsWith("http")) { }).toString(CryptoJS.enc.Utf8)
config.url = CryptoJS.AES.decrypt(config.url, key, { };
iv: iv, var token_key = key == undefined ? "dvyYRQlnPRCMdQSe" : key;
padding: CryptoJS.pad.Pkcs7 if (ref) {
}).toString(CryptoJS.enc.Utf8) var html = request(jxurl, {
} headers: {
return config.url Referer: ref
} catch (e) { }
return "" })
} } else {
} var html = request(jxurl)
}
function urlencode(str) { if (html.indexOf("&btwaf=") != -1) {
str = (str + "").toString(); html = request(jxurl + "&btwaf" + html.match(/&btwaf(.*?)"/)[1], {
return encodeURIComponent(str).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/%20/g, "+") headers: {
} Referer: ref
}
function encodeUrl(str) { })
if (typeof encodeURI == "function") { }
return encodeURI(str) var token_iv = html.split('_token = "')[1].split('"')[0];
} else { var key = CryptoJS.enc.Utf8.parse(token_key);
str = (str + "").toString(); var iv = CryptoJS.enc.Utf8.parse(token_iv);
return encodeURIComponent(str).replace(/%2F/g, "/").replace(/%3F/g, "?").replace(/%3A/g, ":").replace(/%40/g, "@").replace(/%3D/g, "=").replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/%2B/g, "+").replace(/%24/g, "$") eval(html.match(/var config = {[\s\S]*?}/)[0] + "");
} if (!config.url.startsWith("http")) {
} config.url = CryptoJS.AES.decrypt(config.url, key, {
iv: iv,
function base64Encode(text) { padding: CryptoJS.pad.Pkcs7
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text)) }).toString(CryptoJS.enc.Utf8)
} }
return config.url
function base64Decode(text) { } catch (e) {
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text)) return ""
} }
}
function md5(text) {
return CryptoJS.MD5(text).toString() function urlencode(str) {
} str = (str + "").toString();
return encodeURIComponent(str).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/%20/g, "+")
function uint8ArrayToBase64(uint8Array) { }
let binaryString = String.fromCharCode.apply(null, Array.from(uint8Array));
return btoa(binaryString) function encodeUrl(str) {
} if (typeof encodeURI == "function") {
return encodeURI(str)
function Utf8ArrayToStr(array) { } else {
var out, i, len, c; str = (str + "").toString();
var char2, char3; return encodeURIComponent(str).replace(/%2F/g, "/").replace(/%3F/g, "?").replace(/%3A/g, ":").replace(/%40/g, "@").replace(/%3D/g, "=").replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/%2B/g, "+").replace(/%24/g, "$")
out = ""; }
len = array.length; }
i = 0;
while (i < len) { function base64Encode(text) {
c = array[i++]; return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))
switch (c >> 4) { }
case 0:
case 1: function base64Decode(text) {
case 2: return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))
case 3: }
case 4:
case 5: function md5(text) {
case 6: return CryptoJS.MD5(text).toString()
case 7: }
out += String.fromCharCode(c);
break; function uint8ArrayToBase64(uint8Array) {
case 12: let binaryString = String.fromCharCode.apply(null, Array.from(uint8Array));
case 13: return btoa(binaryString)
char2 = array[i++]; }
out += String.fromCharCode((c & 31) << 6 | char2 & 63);
break; function Utf8ArrayToStr(array) {
case 14: var out, i, len, c;
char2 = array[i++]; var char2, char3;
char3 = array[i++]; out = "";
out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0); len = array.length;
break i = 0;
} while (i < len) {
} c = array[i++];
return out switch (c >> 4) {
} case 0:
case 1:
function gzip(str) { case 2:
let arr = pako.gzip(str, {}); case 3:
return uint8ArrayToBase64(arr) case 4:
} case 5:
case 6:
function ungzip(b64Data) { case 7:
let strData = atob(b64Data); out += String.fromCharCode(c);
const charData = strData.split("").map(function(x) { break;
return x.charCodeAt(0) case 12:
}); case 13:
const binData = new Uint8Array(charData); char2 = array[i++];
const data = pako.inflate(binData); out += String.fromCharCode((c & 31) << 6 | char2 & 63);
return Utf8ArrayToStr(data) break;
} case 14:
char2 = array[i++];
function encodeStr(input, encoding) { char3 = array[i++];
encoding = encoding || "gbk"; out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0);
if (encoding.startsWith("gb")) { break
const strTool = gbkTool(); }
input = strTool.encode(input) }
} return out
return input }
}
function gzip(str) {
function decodeStr(input, encoding) { let arr = pako.gzip(str, {});
encoding = encoding || "gbk"; return uint8ArrayToBase64(arr)
if (encoding.startsWith("gb")) { }
const strTool = gbkTool();
input = strTool.decode(input) function ungzip(b64Data) {
} let strData = atob(b64Data);
return input const charData = strData.split("").map(function(x) {
} return x.charCodeAt(0)
});
function getCryptoJS() { const binData = new Uint8Array(charData);
return 'console.log("CryptoJS已装载");' const data = pako.inflate(binData);
} return Utf8ArrayToStr(data)
const RSA = { }
decode: function(data, key, option) {
option = option || {}; function encodeStr(input, encoding) {
if (typeof JSEncrypt === "function") { encoding = encoding || "gbk";
let chunkSize = option.chunkSize || 117; if (encoding.startsWith("gb")) {
let privateKey = this.getPrivateKey(key); input = gbkTool.encode(input)
const decryptor = new JSEncrypt; }
decryptor.setPrivateKey(privateKey); return input
let uncrypted = ""; }
uncrypted = decryptor.decryptUnicodeLong(data);
return uncrypted function decodeStr(input, encoding) {
} else { encoding = encoding || "gbk";
return false if (encoding.startsWith("gb")) {
} input = gbkTool.decode(input)
}, }
encode: function(data, key, option) { return input
option = option || {}; }
if (typeof JSEncrypt === "function") {
let chunkSize = option.chunkSize || 117; function getCryptoJS() {
let publicKey = this.getPublicKey(key); return 'console.log("CryptoJS已装载");'
const encryptor = new JSEncrypt; }
encryptor.setPublicKey(publicKey); const RSA = {
let encrypted = ""; decode: function(data, key, option) {
encrypted = encryptor.encryptUnicodeLong(data); option = option || {};
return encrypted if (typeof JSEncrypt === "function") {
} else { let chunkSize = option.chunkSize || 117;
return false let privateKey = this.getPrivateKey(key);
} const decryptor = new JSEncrypt;
}, decryptor.setPrivateKey(privateKey);
fixKey(key, prefix, endfix) { let uncrypted = "";
if (!key.includes(prefix)) { uncrypted = decryptor.decryptUnicodeLong(data);
key = prefix + key return uncrypted
} } else {
if (!key.includes(endfix)) { return false
key += endfix }
} },
return key encode: function(data, key, option) {
}, option = option || {};
getPrivateKey(key) { if (typeof JSEncrypt === "function") {
let prefix = "-----BEGIN RSA PRIVATE KEY-----"; let chunkSize = option.chunkSize || 117;
let endfix = "-----END RSA PRIVATE KEY-----"; let publicKey = this.getPublicKey(key);
return this.fixKey(key, prefix, endfix) const encryptor = new JSEncrypt;
}, encryptor.setPublicKey(publicKey);
getPublicKey(key) { let encrypted = "";
let prefix = "-----BEGIN PUBLIC KEY-----"; encrypted = encryptor.encryptUnicodeLong(data);
let endfix = "-----END PUBLIC KEY-----"; return encrypted
return this.fixKey(key, prefix, endfix) } else {
} return false
}; }
},
function getProxyUrl() { fixKey(key, prefix, endfix) {
if (typeof getProxy === "function") { if (!key.includes(prefix)) {
return getProxy(true) key = prefix + key
} else { }
return "http://127.0.0.1:9978/proxy?do=js" if (!key.includes(endfix)) {
} key += endfix
} }
return key
function fixAdM3u8(m3u8_text, m3u8_url, ad_remove) { },
if (!m3u8_text && !m3u8_url || !m3u8_text && m3u8_url && !m3u8_url.startsWith("http")) { getPrivateKey(key) {
return "" let prefix = "-----BEGIN RSA PRIVATE KEY-----";
} let endfix = "-----END RSA PRIVATE KEY-----";
if (!m3u8_text) { return this.fixKey(key, prefix, endfix)
log("m3u8_url:" + m3u8_url); },
m3u8_text = request(m3u8_url) getPublicKey(key) {
} let prefix = "-----BEGIN PUBLIC KEY-----";
log("len(m3u8_text):" + m3u8_text.length); let endfix = "-----END PUBLIC KEY-----";
if (!ad_remove) { return this.fixKey(key, prefix, endfix)
return m3u8_text }
} };
if (ad_remove.startsWith("reg:")) {
ad_remove = ad_remove.slice(4) function getProxyUrl() {
} else if (ad_remove.startsWith("js:")) { if (typeof getProxy === "function") {
ad_remove = ad_remove.slice(3) return getProxy(true)
} } else {
let m3u8_start = m3u8_text.slice(0, m3u8_text.indexOf("#EXTINF")).trim(); return "http://127.0.0.1:9978/proxy?do=js"
let m3u8_body = m3u8_text.slice(m3u8_text.indexOf("#EXTINF"), m3u8_text.indexOf("#EXT-X-ENDLIST")).trim(); }
let m3u8_end = m3u8_text.slice(m3u8_text.indexOf("#EXT-X-ENDLIST")).trim(); }
let murls = [];
let m3_body_list = m3u8_body.split("\n"); function fixAdM3u8(m3u8_text, m3u8_url, ad_remove) {
let m3_len = m3_body_list.length; if (!m3u8_text && !m3u8_url || !m3u8_text && m3u8_url && !m3u8_url.startsWith("http")) {
let i = 0; return ""
while (i < m3_len) { }
let mi = m3_body_list[i]; if (!m3u8_text) {
let mi_1 = m3_body_list[i + 1]; log("m3u8_url:" + m3u8_url);
if (mi.startsWith("#EXTINF")) { m3u8_text = request(m3u8_url)
murls.push([mi, mi_1].join("&")); }
i += 2 log("len(m3u8_text):" + m3u8_text.length);
} else if (mi.startsWith("#EXT-X-DISCONTINUITY")) { if (!ad_remove) {
let mi_2 = m3_body_list[i + 2]; return m3u8_text
murls.push([mi, mi_1, mi_2].join("&")); }
i += 3 if (ad_remove.startsWith("reg:")) {
} else { ad_remove = ad_remove.slice(4)
break } else if (ad_remove.startsWith("js:")) {
} ad_remove = ad_remove.slice(3)
} }
let new_m3u8_body = []; let m3u8_start = m3u8_text.slice(0, m3u8_text.indexOf("#EXTINF")).trim();
for (let murl of murls) { let m3u8_body = m3u8_text.slice(m3u8_text.indexOf("#EXTINF"), m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
if (ad_remove && new RegExp(ad_remove).test(murl)) {} else { let m3u8_end = m3u8_text.slice(m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
let murl_list = murl.split("&"); let murls = [];
if (!murl_list[murl_list.length - 1].startsWith("http") && m3u8_url.startsWith("http")) { let m3_body_list = m3u8_body.split("\n");
murl_list[murl_list.length - 1] = urljoin(m3u8_url, murl_list[murl_list.length - 1]) let m3_len = m3_body_list.length;
} let i = 0;
murl_list.forEach(it => { while (i < m3_len) {
new_m3u8_body.push(it) let mi = m3_body_list[i];
}) let mi_1 = m3_body_list[i + 1];
} if (mi.startsWith("#EXTINF")) {
} murls.push([mi, mi_1].join("&"));
new_m3u8_body = new_m3u8_body.join("\n").trim(); i += 2
m3u8_text = [m3u8_start, new_m3u8_body, m3u8_end].join("\n").trim(); } else if (mi.startsWith("#EXT-X-DISCONTINUITY")) {
return m3u8_text let mi_2 = m3_body_list[i + 2];
} murls.push([mi, mi_1, mi_2].join("&"));
i += 3
function fixAdM3u8Ai(m3u8_url, headers) { } else {
let ts = (new Date).getTime(); break
let option = headers ? { }
headers: headers }
} : {}; let new_m3u8_body = [];
for (let murl of murls) {
function b(s1, s2) { if (ad_remove && new RegExp(ad_remove).test(murl)) {} else {
let i = 0; let murl_list = murl.split("&");
while (i < s1.length) { if (!murl_list[murl_list.length - 1].startsWith("http") && m3u8_url.startsWith("http")) {
if (s1[i] !== s2[i]) { murl_list[murl_list.length - 1] = urljoin(m3u8_url, murl_list[murl_list.length - 1])
break }
} murl_list.forEach(it => {
i++ new_m3u8_body.push(it)
} })
return i }
} }
new_m3u8_body = new_m3u8_body.join("\n").trim();
function reverseString(str) { m3u8_text = [m3u8_start, new_m3u8_body, m3u8_end].join("\n").trim();
return str.split("").reverse().join("") return m3u8_text
} }
let m3u8 = request(m3u8_url, option);
m3u8 = m3u8.trim().split("\n").map(it => it.startsWith("#") ? it : urljoin(m3u8_url, it)).join("\n"); function fixAdM3u8Ai(m3u8_url, headers) {
m3u8 = m3u8.replace(/\n\n/gi, "\n"); let ts = (new Date).getTime();
let last_url = m3u8.split("\n").slice(-1)[0]; let option = headers ? {
if (last_url.length < 5) { headers: headers
last_url = m3u8.split("\n").slice(-2)[0] } : {};
}
if (last_url.includes(".m3u8") && last_url !== m3u8_url) { function b(s1, s2) {
m3u8_url = urljoin2(m3u8_url, last_url); let i = 0;
log("嵌套的m3u8_url:" + m3u8_url); while (i < s1.length) {
m3u8 = request(m3u8_url, option) if (s1[i] !== s2[i]) {
} break
let s = m3u8.trim().split("\n").filter(it => it.trim()).join("\n"); }
let ss = s.split("\n"); i++
let firststr = ""; }
let maxl = 0; return i
let kk = 0; }
let kkk = 2;
let secondstr = ""; function reverseString(str) {
for (let i = 0; i < ss.length; i++) { return str.split("").reverse().join("")
let s = ss[i]; }
if (!s.startsWith("#")) { let m3u8 = request(m3u8_url, option);
if (kk == 0) firststr = s; m3u8 = m3u8.trim().split("\n").map(it => it.startsWith("#") ? it : urljoin(m3u8_url, it)).join("\n");
if (kk == 1) maxl = b(firststr, s); m3u8 = m3u8.replace(/\n\n/gi, "\n");
if (kk > 1) { let last_url = m3u8.split("\n").slice(-1)[0];
if (maxl > b(firststr, s)) { if (last_url.length < 5) {
if (secondstr.length < 5) secondstr = s; last_url = m3u8.split("\n").slice(-2)[0]
kkk = kkk + 2 }
} else { if (last_url.includes(".m3u8") && last_url !== m3u8_url) {
maxl = b(firststr, s); m3u8_url = urljoin2(m3u8_url, last_url);
kkk++ log("嵌套的m3u8_url:" + m3u8_url);
} m3u8 = request(m3u8_url, option)
} }
kk++; let s = m3u8.trim().split("\n").filter(it => it.trim()).join("\n");
if (kk >= 20) break let ss = s.split("\n");
} if (m3u8_url.indexOf("ffzy") > 0) {
} let j = 0,
if (kkk > 30) firststr = secondstr; k1 = 0,
let firststrlen = firststr.length; m = 0,
let ml = Math.round(ss.length / 2).toString().length; n = 0,
let maxc = 0; t = 0;
let laststr = ss.toReversed().find(x => { let s2 = "";
if (!x.startsWith("#")) { for (let i = 0; i < ss.length; i++) {
let k = b(reverseString(firststr), reverseString(x)); let s = ss[i];
maxl = b(firststr, x); let s1 = "";
maxc++; if (s.startsWith("#EXTINF")) {
if (firststrlen - maxl <= ml + k || maxc > 10) { s1 = s.slice(8);
return true n++;
} if (n == 1) k1 = i;
} if (s2.indexOf(s1) == -1) {
return false s2 = s2 + s1;
}); m++
log("最后一条切片:" + laststr); }
let ad_urls = []; t = t + parseFloat(s1);
for (let i = 0; i < ss.length; i++) { i++;
let s = ss[i]; s = ss[i]
if (!s.startsWith("#")) { }
if (b(firststr, s) < maxl) { if (s.startsWith("#EXT-X-DISCONTINUITY")) {
ad_urls.push(s); if (n == 5) {
ss.splice(i - 1, 2); log("n:" + n);
i = i - 2 log("m:" + m);
} else { for (let j = k1; j < k1 + n * 2; j++) {
ss[i] = urljoin(m3u8_url, s) log(ss[j])
} }
} else { log("广告位置:" + k1);
ss[i] = s.replace(/URI=\"(.*)\"/, 'URI="' + urljoin(m3u8_url, "$1") + '"') log("数据条数:" + n);
} log("数据种类:" + m);
} log("广告时间:" + t.toFixed(5));
log("处理的m3u8地址:" + m3u8_url); ss.splice(k1, 2 * n + 1);
log("----广告地址----"); i = i - 2 * n + 1
log(ad_urls); }
m3u8 = ss.join("\n"); t = 0;
log("处理耗时:" + ((new Date).getTime() - ts).toString()); m = 0;
return m3u8 n = 0;
} s2 = ""
}
function forceOrder(lists, key, option) { }
let start = Math.floor(lists.length / 2); }
let end = Math.min(lists.length - 1, start + 1); let firststr = "";
if (start >= end) { let maxl = 0;
return lists let kk = 0;
} let kkk1 = 1;
let first = lists[start]; let kkk2 = 0;
let second = lists[end]; let secondstr = "";
if (key) { for (let i = 0; i < ss.length; i++) {
try { let s = ss[i];
first = first[key]; if (!s.startsWith("#")) {
second = second[key] if (kk == 0) firststr = s;
} catch (e) {} if (kk > 0) {
} if (maxl > b(firststr, s) + 1) {
if (option && typeof option === "function") { if (secondstr.length < 5) secondstr = s;
try { kkk2++
first = option(first); } else {
second = option(second) maxl = b(firststr, s);
} catch (e) {} kkk1++
} }
first += ""; }
second += ""; kk++;
if (first.match(/(\d+)/) && second.match(/(\d+)/)) { if (kk >= 30) break
let num1 = Number(first.match(/(\d+)/)[1]); }
let num2 = Number(second.match(/(\d+)/)[1]); }
if (num1 > num2) { if (kkk2 > kkk1) firststr = secondstr;
lists.reverse() let firststrlen = firststr.length;
} let ml = Math.round(ss.length / 2).toString().length;
} let maxc = 0;
return lists let laststr = ss.toReversed().find(x => {
} if (!x.startsWith("#")) {
let VODS = []; let k = b(reverseString(firststr), reverseString(x));
let VOD = {}; maxl = b(firststr, x);
let TABS = []; maxc++;
let LISTS = []; if (firststrlen - maxl <= ml + k || maxc > 10) {
return true
function getQuery(url) { }
try { }
if (url.indexOf("?") > -1) { return false
url = url.slice(url.indexOf("?") + 1) });
} log("最后一条切片:" + laststr);
let arr = url.split("#")[0].split("&"); let ad_urls = [];
const resObj = {}; for (let i = 0; i < ss.length; i++) {
arr.forEach(item => { let s = ss[i];
let arr1 = item.split("="); if (!s.startsWith("#")) {
let key = arr1[0]; if (b(firststr, s) < maxl) {
let value = arr1.slice(1).join("="); ad_urls.push(s);
resObj[key] = value ss.splice(i - 1, 2);
}); i = i - 2
return resObj } else {
} catch (err) { ss[i] = urljoin(m3u8_url, s)
log(`getQuery发生错误:${e.message}`); }
return {} } else {
} ss[i] = s.replace(/URI=\"(.*)\"/, 'URI="' + urljoin(m3u8_url, "$1") + '"')
} }
}
function urljoin(fromPath, nowPath) { log("处理的m3u8地址:" + m3u8_url);
fromPath = fromPath || ""; log("----广告地址----");
nowPath = nowPath || ""; log(ad_urls);
return joinUrl(fromPath, nowPath) m3u8 = ss.join("\n");
} log("处理耗时:" + ((new Date).getTime() - ts).toString());
var urljoin2 = urljoin; log(m3u8);
const defaultParser = { return m3u8
pdfh: pdfh, }
pdfa: pdfa,
pd: pd function forceOrder(lists, key, option) {
}; let start = Math.floor(lists.length / 2);
let end = Math.min(lists.length - 1, start + 1);
function pdfh2(html, parse) { if (start >= end) {
let html2 = html; return lists
try { }
if (typeof html !== "string") { let first = lists[start];
html2 = html.rr(html.ele).toString() let second = lists[end];
} if (key) {
} catch (e) { try {
print(`html对象转文本发生了错误:${e.message}`) first = first[key];
} second = second[key]
let result = defaultParser.pdfh(html2, parse); } catch (e) {}
let option = parse.includes("&&") ? parse.split("&&").slice(-1)[0] : parse.split(" ").slice(-1)[0]; }
if (/style/.test(option.toLowerCase()) && /url\(/.test(result)) { if (option && typeof option === "function") {
try { try {
result = result.match(/url\((.*?)\)/)[1]; first = option(first);
result = result.replace(/^['|"](.*)['|"]$/, "$1") second = option(second)
} catch (e) {} } catch (e) {}
} }
return result first += "";
} second += "";
if (first.match(/(\d+)/) && second.match(/(\d+)/)) {
function pdfa2(html, parse) { let num1 = Number(first.match(/(\d+)/)[1]);
let html2 = html; let num2 = Number(second.match(/(\d+)/)[1]);
try { if (num1 > num2) {
if (typeof html !== "string") { lists.reverse()
html2 = html.rr(html.ele).toString() }
} }
} catch (e) { return lists
print(`html对象转文本发生了错误:${e.message}`) }
} let VODS = [];
return defaultParser.pdfa(html2, parse) let VOD = {};
} let TABS = [];
let LISTS = [];
function pd2(html, parse, uri) {
let ret = pdfh2(html, parse); function getQuery(url) {
if (typeof uri === "undefined" || !uri) { try {
uri = "" if (url.indexOf("?") > -1) {
} url = url.slice(url.indexOf("?") + 1)
if (DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)) { }
if (/http/.test(ret)) { let arr = url.split("#")[0].split("&");
ret = ret.slice(ret.indexOf("http")) const resObj = {};
} else { arr.forEach(item => {
ret = urljoin(MY_URL, ret) let arr1 = item.split("=");
} let key = arr1[0];
} let value = arr1.slice(1).join("=");
return ret resObj[key] = value
} });
const parseTags = { return resObj
jsp: { } catch (err) {
pdfh: pdfh2, log(`getQuery发生错误:${e.message}`);
pdfa: pdfa2, return {}
pd: pd2 }
}, }
json: {
pdfh(html, parse) { function urljoin(fromPath, nowPath) {
if (!parse || !parse.trim()) { fromPath = fromPath || "";
return "" nowPath = nowPath || "";
} return joinUrl(fromPath, nowPath)
if (typeof html === "string") { }
html = JSON.parse(html) var urljoin2 = urljoin;
} const defaultParser = {
parse = parse.trim(); pdfh: pdfh,
if (!parse.startsWith("$.")) { pdfa: pdfa,
parse = "$." + parse pd: pd
} };
parse = parse.split("||");
for (let ps of parse) { function pdfh2(html, parse) {
let ret = cheerio.jp(ps, html); let html2 = html;
if (Array.isArray(ret)) { try {
ret = ret[0] || "" if (typeof html !== "string") {
} else { html2 = html.rr(html.ele).toString()
ret = ret || "" }
} } catch (e) {
if (ret && typeof ret !== "string") { print(`html对象转文本发生了错误:${e.message}`)
ret = ret.toString() }
} let result = defaultParser.pdfh(html2, parse);
if (ret) { let option = parse.includes("&&") ? parse.split("&&").slice(-1)[0] : parse.split(" ").slice(-1)[0];
return ret if (/style/.test(option.toLowerCase()) && /url\(/.test(result)) {
} try {
} result = result.match(/url\((.*?)\)/)[1];
return "" result = result.replace(/^['|"](.*)['|"]$/, "$1")
}, } catch (e) {}
pdfa(html, parse) { }
if (!parse || !parse.trim()) { return result
return "" }
}
if (typeof html === "string") { function pdfa2(html, parse) {
html = JSON.parse(html) let html2 = html;
} try {
parse = parse.trim(); if (typeof html !== "string") {
if (!parse.startsWith("$.")) { html2 = html.rr(html.ele).toString()
parse = "$." + parse }
} } catch (e) {
let ret = cheerio.jp(parse, html); print(`html对象转文本发生了错误:${e.message}`)
if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1) { }
return ret[0] || [] return defaultParser.pdfa(html2, parse)
} }
return ret || []
}, function pd2(html, parse, uri) {
pd(html, parse) { let ret = pdfh2(html, parse);
let ret = parseTags.json.pdfh(html, parse); if (typeof uri === "undefined" || !uri) {
if (ret) { uri = ""
return urljoin(MY_URL, ret) }
} if (DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)) {
return ret if (/http/.test(ret)) {
} ret = ret.slice(ret.indexOf("http"))
}, } else {
jq: { ret = urljoin(MY_URL, ret)
pdfh(html, parse) { }
if (!html || !parse || !parse.trim()) { }
return "" return ret
} }
parse = parse.trim(); const parseTags = {
let result = defaultParser.pdfh(html, parse); jsp: {
return result pdfh: pdfh2,
}, pdfa: pdfa2,
pdfa(html, parse) { pd: pd2
if (!html || !parse || !parse.trim()) { },
return [] json: {
} pdfh(html, parse) {
parse = parse.trim(); if (!parse || !parse.trim()) {
let result = defaultParser.pdfa(html, parse); return ""
print(`pdfa解析${parse}=>${result.length}`); }
return result if (typeof html === "string") {
}, html = JSON.parse(html)
pd(html, parse, base_url) { }
if (!html || !parse || !parse.trim()) { parse = parse.trim();
return "" if (!parse.startsWith("$.")) {
} parse = "$." + parse
parse = parse.trim(); }
base_url = base_url || MY_URL; parse = parse.split("||");
return defaultParser.pd(html, parse, base_url) for (let ps of parse) {
} let ret = cheerio.jp(ps, html);
}, if (Array.isArray(ret)) {
getParse(p0) { ret = ret[0] || ""
if (p0.startsWith("jsp:")) { } else {
return this.jsp ret = ret || ""
} else if (p0.startsWith("json:")) { }
return this.json if (ret && typeof ret !== "string") {
} else if (p0.startsWith("jq:")) { ret = ret.toString()
return this.jq }
} else { if (ret) {
return this.jq return ret
} }
} }
}; return ""
const stringify = JSON.stringify; },
const jsp = parseTags.jsp; pdfa(html, parse) {
const jq = parseTags.jq; if (!parse || !parse.trim()) {
return ""
function readFile(filePath) { }
filePath = filePath || "./uri.min.js"; if (typeof html === "string") {
var fd = os.open(filePath); html = JSON.parse(html)
var buffer = new ArrayBuffer(1024); }
var len = os.read(fd, buffer, 0, 1024); parse = parse.trim();
console.log(len); if (!parse.startsWith("$.")) {
let text = String.fromCharCode.apply(null, new Uint8Array(buffer)); parse = "$." + parse
console.log(text); }
return text let ret = cheerio.jp(parse, html);
} if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1) {
return ret[0] || []
function dealJson(html) { }
try { return ret || []
html = html.trim(); },
if (!(html.startsWith("{") && html.endsWith("}") || html.startsWith("[") && html.endsWith("]"))) { pd(html, parse) {
html = "{" + html.match(/.*?\{(.*)\}/m)[1] + "}" let ret = parseTags.json.pdfh(html, parse);
} if (ret) {
} catch (e) {} return urljoin(MY_URL, ret)
try { }
html = JSON.parse(html) return ret
} catch (e) {} }
return html },
} jq: {
var OcrApi = { pdfh(html, parse) {
api: OCR_API, if (!html || !parse || !parse.trim()) {
classification: function(img) { return ""
let code = ""; }
try { parse = parse.trim();
log("通过drpy_ocr验证码接口过验证..."); let result = defaultParser.pdfh(html, parse);
let html = ""; return result
if (this.api.endsWith("drpy/text")) { },
html = request(this.api, { pdfa(html, parse) {
data: { if (!html || !parse || !parse.trim()) {
img: img return []
}, }
headers: { parse = parse.trim();
"User-Agent": PC_UA let result = defaultParser.pdfa(html, parse);
}, print(`pdfa解析${parse}=>${result.length}`);
method: "POST" return result
}, true) },
} else { pd(html, parse, base_url) {
html = post(this.api, { if (!html || !parse || !parse.trim()) {
body: img return ""
}) }
} parse = parse.trim();
code = html || "" base_url = base_url || MY_URL;
} catch (e) { return defaultParser.pd(html, parse, base_url)
log(`OCR识别验证码发生错误:${e.message}`) }
} },
return code getParse(p0) {
} if (p0.startsWith("jsp:")) {
}; return this.jsp
} else if (p0.startsWith("json:")) {
function verifyCode(url) { return this.json
let cnt = 0; } else if (p0.startsWith("jq:")) {
let host = getHome(url); return this.jq
let cookie = ""; } else {
while (cnt < OCR_RETRY) { return this.jq
try { }
let yzm_url = `${host}/index.php/verify/index.html`; }
console.log(`验证码链接:${yzm_url}`); };
let hhtml = request(yzm_url, { const stringify = JSON.stringify;
withHeaders: true, const jsp = parseTags.jsp;
toBase64: true const jq = parseTags.jq;
}, true);
let json = JSON.parse(hhtml); function readFile(filePath) {
if (!cookie) { filePath = filePath || "./uri.min.js";
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie"); var fd = os.open(filePath);
cookie = setCk ? json[setCk].split(";")[0] : "" var buffer = new ArrayBuffer(1024);
} var len = os.read(fd, buffer, 0, 1024);
console.log("cookie:" + cookie); console.log(len);
let img = json.body; let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
let code = OcrApi.classification(img); console.log(text);
console.log(`${cnt+1}次验证码识别结果:${code}`); return text
let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`; }
console.log(submit_url);
let html = request(submit_url, { function dealJson(html) {
headers: { try {
Cookie: cookie html = html.trim();
}, if (!(html.startsWith("{") && html.endsWith("}") || html.startsWith("[") && html.endsWith("]"))) {
method: "POST" html = "{" + html.match(/.*?\{(.*)\}/m)[1] + "}"
}); }
html = JSON.parse(html); } catch (e) {}
if (html.msg === "ok") { try {
console.log(`${cnt+1}次验证码提交成功`); html = JSON.parse(html)
return cookie } catch (e) {}
} else if (html.msg !== "ok" && cnt + 1 >= OCR_RETRY) { return html
cookie = "" }
} var OcrApi = {
} catch (e) { api: OCR_API,
console.log(`${cnt+1}次验证码提交失败:${e.message}`); classification: function(img) {
if (cnt + 1 >= OCR_RETRY) { let code = "";
cookie = "" try {
} log("通过drpy_ocr验证码接口过验证...");
} let html = "";
cnt += 1 if (this.api.endsWith("drpy/text")) {
} html = request(this.api, {
return cookie data: {
} img: img
},
function setItem(k, v) { headers: {
local.set(RKEY, k, v); "User-Agent": PC_UA
console.log(`规则${RKEY}设置${k} => ${v}`) },
} method: "POST"
}, true)
function getItem(k, v) { } else {
return local.get(RKEY, k) || v html = post(this.api, {
} body: img
})
function clearItem(k) { }
local.delete(RKEY, k) code = html || ""
} } catch (e) {
log(`OCR识别验证码发生错误:${e.message}`)
function getHome(url) { }
if (!url) { return code
return "" }
} };
let tmp = url.split("//");
url = tmp[0] + "//" + tmp[1].split("/")[0]; function verifyCode(url) {
try { let cnt = 0;
url = decodeURIComponent(url) let host = getHome(url);
} catch (e) {} let cookie = "";
return url while (cnt < OCR_RETRY) {
} try {
let yzm_url = `${host}/index.php/verify/index.html`;
function buildUrl(url, obj) { console.log(`验证码链接:${yzm_url}`);
obj = obj || {}; let hhtml = request(yzm_url, {
if (url.indexOf("?") < 0) { withHeaders: true,
url += "?" toBase64: true
} }, true);
let param_list = []; let json = JSON.parse(hhtml);
let keys = Object.keys(obj); if (!cookie) {
keys.forEach(it => { let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
param_list.push(it + "=" + obj[it]) cookie = setCk ? json[setCk].split(";")[0] : ""
}); }
let prs = param_list.join("&"); console.log("cookie:" + cookie);
if (keys.length > 0 && !url.endsWith("?")) { let img = json.body;
url += "&" let code = OcrApi.classification(img);
} console.log(`${cnt+1}次验证码识别结果:${code}`);
url += prs; let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
return url console.log(submit_url);
} let html = request(submit_url, {
headers: {
function $require(url) { Cookie: cookie
eval(request(url)) },
} method: "POST"
});
function keysToLowerCase(obj) { html = JSON.parse(html);
return Object.keys(obj).reduce((result, key) => { if (html.msg === "ok") {
const newKey = key.toLowerCase(); console.log(`${cnt+1}次验证码提交成功`);
result[newKey] = obj[key]; return cookie
return result } else if (html.msg !== "ok" && cnt + 1 >= OCR_RETRY) {
}, {}) cookie = ""
} }
} catch (e) {
function parseQueryString(query) { console.log(`${cnt+1}次验证码提交失败:${e.message}`);
const params = {}; if (cnt + 1 >= OCR_RETRY) {
query.split("&").forEach(function(part) { cookie = ""
const regex = /^(.*?)=(.*)/; }
const match = part.match(regex); }
if (match) { cnt += 1
const key = decodeURIComponent(match[1]); }
const value = decodeURIComponent(match[2]); return cookie
params[key] = value }
}
}); function setItem(k, v) {
return params local.set(RKEY, k, v);
} console.log(`规则${RKEY}设置${k} => ${v}`)
}
function encodeIfContainsSpecialChars(value) {
const specialChars = ":/?#[]@!$'()*+,;=%"; function getItem(k, v) {
if (specialChars.split("").some(char => value.includes(char))) { return local.get(RKEY, k) || v
return encodeURIComponent(value) }
}
return value function clearItem(k) {
} local.delete(RKEY, k)
}
function objectToQueryString(obj) {
const encoded = []; function getHome(url) {
for (let key in obj) { if (!url) {
if (obj.hasOwnProperty(key)) { return ""
encoded.push(encodeURIComponent(key) + "=" + encodeIfContainsSpecialChars(obj[key])) }
} let tmp = url.split("//");
} url = tmp[0] + "//" + tmp[1].split("/")[0];
return encoded.join("&") try {
} url = decodeURIComponent(url)
} catch (e) {}
function request(url, obj, ocr_flag) { return url
ocr_flag = ocr_flag || false; }
if (typeof obj === "undefined" || !obj || obj === {}) {
if (!fetch_params || !fetch_params.headers) { function buildUrl(url, obj) {
let headers = { obj = obj || {};
"User-Agent": MOBILE_UA if (url.indexOf("?") < 0) {
}; url += "?"
if (rule.headers) { }
Object.assign(headers, rule.headers) let param_list = [];
} let keys = Object.keys(obj);
if (!fetch_params) { keys.forEach(it => {
fetch_params = {} param_list.push(it + "=" + obj[it])
} });
fetch_params.headers = headers let prs = param_list.join("&");
} if (keys.length > 0 && !url.endsWith("?")) {
if (!fetch_params.headers.Referer) { url += "&"
fetch_params.headers.Referer = getHome(url) }
} url += prs;
obj = fetch_params return url
} else { }
let headers = obj.headers || {};
let keys = Object.keys(headers).map(it => it.toLowerCase()); function $require(url) {
if (!keys.includes("user-agent")) { eval(request(url))
headers["User-Agent"] = MOBILE_UA; }
if (typeof fetch_params === "object" && fetch_params && fetch_params.headers) {
let fetch_headers = keysToLowerCase(fetch_params.headers); function keysToLowerCase(obj) {
if (fetch_headers["user-agent"]) { return Object.keys(obj).reduce((result, key) => {
headers["User-Agent"] = fetch_headers["user-agent"] const newKey = key.toLowerCase();
} result[newKey] = obj[key];
} return result
} }, {})
if (!keys.includes("referer")) { }
headers["Referer"] = getHome(url)
} function buildQueryString(params) {
obj.headers = headers const queryArray = [];
} for (const key in params) {
if (rule.encoding && rule.encoding !== "utf-8" && !ocr_flag) { if (params.hasOwnProperty(key)) {
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) { let value = params[key];
obj.headers["Content-Type"] = "text/html; charset=" + rule.encoding if (value === undefined || value === null) {
} value = ""
} } else {
if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "string") { value = value.toString()
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) { }
obj.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=" + rule.encoding const encodedKey = encodeURIComponent(key);
} const encodedValue = encodeURIComponent(value);
} else if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "object") { queryArray.push(encodedKey + "=" + encodedValue)
obj.data = obj.body; }
delete obj.body }
} return queryArray.join("&")
if (!url) { }
return obj.withHeaders ? "{}" : ""
} function parseQueryString(query) {
if (obj.toBase64) { const params = {};
obj.buffer = 2; query.split("&").forEach(function(part) {
delete obj.toBase64 const regex = /^(.*?)=(.*)/;
} const match = part.match(regex);
if (obj.redirect === false) { if (match) {
obj.redirect = 0 const key = decodeURIComponent(match[1]);
} const value = decodeURIComponent(match[2]);
if (obj.headers.hasOwnProperty("Content-Type") || obj.headers.hasOwnProperty("content-type")) { params[key] = value
let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || ""; }
if (_contentType.includes("application/x-www-form-urlencoded")) { });
log("custom body is application/x-www-form-urlencoded"); return params
if (typeof obj.body == "string") { }
let temp_obj = parseQueryString(obj.body);
console.log(JSON.stringify(temp_obj)) function encodeIfContainsSpecialChars(value) {
} const specialChars = ":/?#[]@!$'()*+,;=%";
} if (specialChars.split("").some(char => value.includes(char))) {
} return encodeURIComponent(value)
console.log(JSON.stringify(obj.headers)); }
console.log("request:" + url + `|method:${obj.method||"GET"}|body:${obj.body||""}`); return value
let res = req(url, obj); }
let html = res.content || "";
if (obj.withHeaders) { function objectToQueryString(obj) {
let htmlWithHeaders = res.headers; const encoded = [];
htmlWithHeaders.body = html; for (let key in obj) {
return JSON.stringify(htmlWithHeaders) if (obj.hasOwnProperty(key)) {
} else { encoded.push(encodeURIComponent(key) + "=" + encodeIfContainsSpecialChars(obj[key]))
return html }
} }
} return encoded.join("&")
}
function post(url, obj) {
obj = obj || {}; function request(url, obj, ocr_flag) {
obj.method = "POST"; ocr_flag = ocr_flag || false;
return request(url, obj) if (typeof obj === "undefined" || !obj || obj === {}) {
} if (!fetch_params || !fetch_params.headers) {
let headers = {
function reqCookie(url, obj, all_cookie) { "User-Agent": MOBILE_UA
obj = obj || {}; };
obj.withHeaders = true; if (rule.headers) {
all_cookie = all_cookie || false; Object.assign(headers, rule.headers)
let html = request(url, obj); }
let json = JSON.parse(html); if (!fetch_params) {
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie"); fetch_params = {}
let cookie = setCk ? json[setCk] : ""; }
if (Array.isArray(cookie)) { fetch_params.headers = headers
cookie = cookie.join(";") }
} if (!fetch_params.headers.Referer) {
if (!all_cookie) { fetch_params.headers.Referer = getHome(url)
cookie = cookie.split(";")[0] }
} obj = fetch_params
html = json.body; } else {
return { let headers = obj.headers || {};
cookie: cookie, let keys = Object.keys(headers).map(it => it.toLowerCase());
html: html if (!keys.includes("user-agent")) {
} headers["User-Agent"] = MOBILE_UA;
} if (typeof fetch_params === "object" && fetch_params && fetch_params.headers) {
fetch = request; let fetch_headers = keysToLowerCase(fetch_params.headers);
print = function(data) { if (fetch_headers["user-agent"]) {
data = data || ""; headers["User-Agent"] = fetch_headers["user-agent"]
if (typeof data == "object" && Object.keys(data).length > 0) { }
try { }
data = JSON.stringify(data); }
console.log(data) if (!keys.includes("referer")) {
} catch (e) { headers["Referer"] = getHome(url)
console.log(typeof data + ":" + data.length); }
return obj.headers = headers
} }
} else if (typeof data == "object" && Object.keys(data).length < 1) { if (rule.encoding && rule.encoding !== "utf-8" && !ocr_flag) {
console.log("null object") if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
} else { obj.headers["Content-Type"] = "text/html; charset=" + rule.encoding
console.log(data) }
} }
}; if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "string") {
log = print; if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
obj.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=" + rule.encoding
function checkHtml(html, url, obj) { }
if (/\?btwaf=/.test(html)) { } else if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "object") {
let btwaf = html.match(/btwaf(.*?)"/)[1]; obj.data = obj.body;
url = url.split("#")[0] + "?btwaf" + btwaf; delete obj.body
print("宝塔验证访问链接:" + url); }
html = request(url, obj) if (!url) {
} return obj.withHeaders ? "{}" : ""
return html }
} if (obj.toBase64) {
obj.buffer = 2;
function getCode(url, obj) { delete obj.toBase64
let html = request(url, obj); }
html = checkHtml(html, url, obj); if (obj.redirect === false) {
return html obj.redirect = 0
} }
if (obj.headers.hasOwnProperty("Content-Type") || obj.headers.hasOwnProperty("content-type")) {
function getHtml(url) { let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || "";
let obj = {}; if (_contentType.includes("application/x-www-form-urlencoded")) {
if (rule.headers) { log("custom body is application/x-www-form-urlencoded");
obj.headers = rule.headers if (typeof obj.body == "string") {
} let temp_obj = parseQueryString(obj.body);
let cookie = getItem(RULE_CK, ""); console.log(JSON.stringify(temp_obj))
if (cookie) { }
if (obj.headers && !Object.keys(obj.headers).map(it => it.toLowerCase()).includes("cookie")) { }
log("历史无cookie,新增过验证后的cookie"); }
obj.headers["Cookie"] = cookie console.log(JSON.stringify(obj.headers));
} else if (obj.headers && obj.headers.cookie && obj.headers.cookie !== cookie) { console.log("request:" + url + `|method:${obj.method||"GET"}|body:${obj.body||""}`);
obj.headers["Cookie"] = cookie; let res = req(url, obj);
log("历史有小写过期的cookie,更新过验证后的cookie") let html = res.content || "";
} else if (obj.headers && obj.headers.Cookie && obj.headers.Cookie !== cookie) { if (obj.withHeaders) {
obj.headers["Cookie"] = cookie; let htmlWithHeaders = res.headers;
log("历史有大写过期的cookie,更新过验证后的cookie") htmlWithHeaders.body = html;
} else if (!obj.headers) { return JSON.stringify(htmlWithHeaders)
obj.headers = { } else {
Cookie: cookie return html
}; }
log("历史无headers,更新过验证后的含cookie的headers") }
}
} function post(url, obj) {
let html = getCode(url, obj); obj = obj || {};
return html obj.method = "POST";
} return request(url, obj)
}
function homeParse(homeObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); function reqCookie(url, obj, all_cookie) {
let classes = []; obj = obj || {};
if (homeObj.class_name && homeObj.class_url) { obj.withHeaders = true;
let names = homeObj.class_name.split("&"); all_cookie = all_cookie || false;
let urls = homeObj.class_url.split("&"); let html = request(url, obj);
let cnt = Math.min(names.length, urls.length); let json = JSON.parse(html);
for (let i = 0; i < cnt; i++) { let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
classes.push({ let cookie = setCk ? json[setCk] : "";
type_id: urls[i], if (Array.isArray(cookie)) {
type_name: names[i] cookie = cookie.join(";")
}) }
} if (!all_cookie) {
} cookie = cookie.split(";")[0]
if (homeObj.class_parse) { }
if (homeObj.class_parse.startsWith("js:")) { html = json.body;
var input = homeObj.MY_URL; return {
try { cookie: cookie,
eval(homeObj.class_parse.replace("js:", "")); html: html
if (Array.isArray(input)) { }
classes = input }
} fetch = request;
} catch (e) { print = function(data) {
log(`通过js动态获取分类发生了错误:${e.message}`) data = data || "";
} if (typeof data == "object" && Object.keys(data).length > 0) {
} else { try {
let p = homeObj.class_parse.split(";"); data = JSON.stringify(data);
let p0 = p[0]; console.log(data)
let _ps = parseTags.getParse(p0); } catch (e) {
let is_json = p0.startsWith("json:"); console.log(typeof data + ":" + data.length);
_pdfa = _ps.pdfa; return
_pdfh = _ps.pdfh; }
_pd = _ps.pd; } else if (typeof data == "object" && Object.keys(data).length < 1) {
MY_URL = rule.url; console.log("null object")
if (is_json) { } else {
try { console.log(data)
let cms_cate_url = homeObj.MY_URL.replace("ac=detail", "ac=list"); }
let html = homeObj.home_html || getHtml(cms_cate_url); };
if (html) { log = print;
if (cms_cate_url === homeObj.MY_URL) {
homeHtmlCache = html function checkHtml(html, url, obj) {
} if (/\?btwaf=/.test(html)) {
let list = _pdfa(html, p0.replace("json:", "")); let btwaf = html.match(/btwaf(.*?)"/)[1];
if (list && list.length > 0) { url = url.split("#")[0] + "?btwaf" + btwaf;
classes = list print("宝塔验证访问链接:" + url);
} html = request(url, obj)
} }
} catch (e) { return html
console.log(e.message) }
}
} else if (p.length >= 3 && !is_json) { function getCode(url, obj) {
try { let html = request(url, obj);
let html = homeObj.home_html || getHtml(homeObj.MY_URL); html = checkHtml(html, url, obj);
if (html) { return html
homeHtmlCache = html; }
let list = _pdfa(html, p0);
if (list && list.length > 0) { function getHtml(url) {
list.forEach((it, idex) => { let obj = {};
try { if (rule.headers) {
let name = _pdfh(it, p[1]); obj.headers = rule.headers
if (homeObj.cate_exclude && new RegExp(homeObj.cate_exclude).test(name)) { }
return let cookie = getItem(RULE_CK, "");
} if (cookie) {
let url = _pd(it, p[2]); if (obj.headers && !Object.keys(obj.headers).map(it => it.toLowerCase()).includes("cookie")) {
if (p.length > 3 && p[3] && !homeObj.home_html) { log("历史无cookie,新增过验证后的cookie");
let exp = new RegExp(p[3]); obj.headers["Cookie"] = cookie
url = url.match(exp)[1] } else if (obj.headers && obj.headers.cookie && obj.headers.cookie !== cookie) {
} obj.headers["Cookie"] = cookie;
classes.push({ log("历史有小写过期的cookie,更新过验证后的cookie")
type_id: url.trim(), } else if (obj.headers && obj.headers.Cookie && obj.headers.Cookie !== cookie) {
type_name: name.trim() obj.headers["Cookie"] = cookie;
}) log("历史有大写过期的cookie,更新过验证后的cookie")
} catch (e) { } else if (!obj.headers) {
console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`) obj.headers = {
} Cookie: cookie
}) };
} log("历史无headers,更新过验证后的含cookie的headers")
} }
} catch (e) { }
console.log(e.message) let html = getCode(url, obj);
} return html
} }
}
} function homeParse(homeObj) {
classes = classes.filter(it => !homeObj.cate_exclude || !new RegExp(homeObj.cate_exclude).test(it.type_name)); fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let resp = { let classes = [];
class: classes if (homeObj.class_name && homeObj.class_url) {
}; let names = homeObj.class_name.split("&");
if (homeObj.filter) { let urls = homeObj.class_url.split("&");
resp.filters = homeObj.filter let cnt = Math.min(names.length, urls.length);
} for (let i = 0; i < cnt; i++) {
console.log(JSON.stringify(resp)); classes.push({
return JSON.stringify(resp) type_id: urls[i],
} type_name: names[i]
})
function getPP(p, pn, pp, ppn) { }
try { }
let ps = p[pn] === "*" && pp.length > ppn ? pp[ppn] : p[pn]; if (homeObj.class_parse) {
return ps if (homeObj.class_parse.startsWith("js:")) {
} catch (e) { var input = homeObj.MY_URL;
return "" try {
} eval(homeObj.class_parse.replace("js:", ""));
} if (Array.isArray(input)) {
classes = input
function homeVodParse(homeVodObj) { }
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); } catch (e) {
let d = []; log(`通过js动态获取分类发生了错误:${e.message}`)
MY_URL = homeVodObj.homeUrl; }
console.log(MY_URL); } else {
let t1 = (new Date).getTime(); let p = homeObj.class_parse.split(";");
let p = homeVodObj.推荐; let p0 = p[0];
print("p:" + p); let _ps = parseTags.getParse(p0);
if (p === "*" && rule.一级) { let is_json = p0.startsWith("json:");
p = rule.一级; _pdfa = _ps.pdfa;
homeVodObj.double = false _pdfh = _ps.pdfh;
} _pd = _ps.pd;
if (!p || typeof p !== "string") { MY_URL = rule.url;
return "{}" if (is_json) {
} try {
p = p.trim(); let cms_cate_url = homeObj.MY_URL.replace("ac=detail", "ac=list");
let pp = rule.一级 ? rule.一级.split(";") : []; let html = homeObj.home_html || getHtml(cms_cate_url);
if (p.startsWith("js:")) { if (html) {
const TYPE = "home"; if (cms_cate_url === homeObj.MY_URL) {
var input = MY_URL; homeHtmlCache = html
HOST = rule.host; }
eval(p.replace("js:", "")); let list = _pdfa(html, p0.replace("json:", ""));
d = VODS if (list && list.length > 0) {
} else { classes = list
p = p.split(";"); }
if (!homeVodObj.double && p.length < 5) { }
return "{}" } catch (e) {
} else if (homeVodObj.double && p.length < 6) { console.log(e.message)
return "{}" }
} } else if (p.length >= 3 && !is_json) {
let p0 = getPP(p, 0, pp, 0); try {
let _ps = parseTags.getParse(p0); let html = homeObj.home_html || getHtml(homeObj.MY_URL);
_pdfa = _ps.pdfa; if (html) {
_pdfh = _ps.pdfh; homeHtmlCache = html;
_pd = _ps.pd; let list = _pdfa(html, p0);
let is_json = p0.startsWith("json:"); if (list && list.length > 0) {
p0 = p0.replace(/^(jsp:|json:|jq:)/, ""); list.forEach((it, idex) => {
let html = homeHtmlCache || getHtml(MY_URL); try {
homeHtmlCache = undefined; let name = _pdfh(it, p[1]);
if (is_json) { if (homeObj.cate_exclude && new RegExp(homeObj.cate_exclude).test(name)) {
html = dealJson(html) return
} }
try { let url = _pd(it, p[2]);
console.log("double:" + homeVodObj.double); if (p.length > 3 && p[3] && !homeObj.home_html) {
if (homeVodObj.double) { let exp = new RegExp(p[3]);
let items = _pdfa(html, p0); url = url.match(exp)[1]
let p1 = getPP(p, 1, pp, 0); }
let p2 = getPP(p, 2, pp, 1); classes.push({
let p3 = getPP(p, 3, pp, 2); type_id: url.trim(),
let p4 = getPP(p, 4, pp, 3); type_name: name.trim()
let p5 = getPP(p, 5, pp, 4); })
let p6 = getPP(p, 6, pp, 5); } catch (e) {
for (let item of items) { console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)
let items2 = _pdfa(item, p1); }
for (let item2 of items2) { })
try { }
let title = _pdfh(item2, p2); }
let img = ""; } catch (e) {
try { console.log(e.message)
img = _pd(item2, p3) }
} catch (e) {} }
let desc = ""; }
try { }
desc = _pdfh(item2, p4) classes = classes.filter(it => !homeObj.cate_exclude || !new RegExp(homeObj.cate_exclude).test(it.type_name));
} catch (e) {} let resp = {
let links = []; class: classes
for (let _p5 of p5.split("+")) { };
let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5); if (homeObj.filter) {
links.push(link) resp.filters = homeObj.filter
} }
let content; console.log(JSON.stringify(resp));
if (p.length > 6 && p[6]) { return JSON.stringify(resp)
content = _pdfh(item2, p6) }
} else {
content = "" function getPP(p, pn, pp, ppn) {
} try {
let vid = links.join("$"); let ps = p[pn] === "*" && pp.length > ppn ? pp[ppn] : p[pn];
if (rule.二级 === "*") { return ps
vid = vid + "@@" + title + "@@" + img } catch (e) {
} return ""
let vod = { }
vod_name: title, }
vod_pic: img,
vod_remarks: desc, function homeVodParse(homeVodObj) {
vod_content: content, fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
vod_id: vid let d = [];
}; MY_URL = homeVodObj.homeUrl;
d.push(vod) console.log(MY_URL);
} catch (e) { let t1 = (new Date).getTime();
console.log(`首页列表双层定位处理发生错误:${e.message}`) let p = homeVodObj.推荐;
} print("p:" + p);
} if (p === "*" && rule.一级) {
} p = rule.一级;
} else { homeVodObj.double = false
let items = _pdfa(html, p0); }
let p1 = getPP(p, 1, pp, 1); if (!p || typeof p !== "string") {
let p2 = getPP(p, 2, pp, 2); return "{}"
let p3 = getPP(p, 3, pp, 3); }
let p4 = getPP(p, 4, pp, 4); p = p.trim();
let p5 = getPP(p, 5, pp, 5); let pp = rule.一级 ? rule.一级.split(";") : [];
for (let item of items) { if (p.startsWith("js:")) {
try { const TYPE = "home";
let title = _pdfh(item, p1); var input = MY_URL;
let img = ""; HOST = rule.host;
try { eval(p.replace("js:", ""));
img = _pd(item, p2, MY_URL) d = VODS
} catch (e) {} } else {
let desc = ""; p = p.split(";");
try { if (!homeVodObj.double && p.length < 5) {
desc = _pdfh(item, p3) return "{}"
} catch (e) {} } else if (homeVodObj.double && p.length < 6) {
let links = []; return "{}"
for (let _p5 of p4.split("+")) { }
let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5); let p0 = getPP(p, 0, pp, 0);
links.push(link) let _ps = parseTags.getParse(p0);
} _pdfa = _ps.pdfa;
let content; _pdfh = _ps.pdfh;
if (p.length > 5 && p[5]) { _pd = _ps.pd;
content = _pdfh(item, p5) let is_json = p0.startsWith("json:");
} else { p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
content = "" let html = homeHtmlCache || getHtml(MY_URL);
} homeHtmlCache = undefined;
let vid = links.join("$"); if (is_json) {
if (rule.二级 === "*") { html = dealJson(html)
vid = vid + "@@" + title + "@@" + img }
} try {
let vod = { console.log("double:" + homeVodObj.double);
vod_name: title, if (homeVodObj.double) {
vod_pic: img, let items = _pdfa(html, p0);
vod_remarks: desc, let p1 = getPP(p, 1, pp, 0);
vod_content: content, let p2 = getPP(p, 2, pp, 1);
vod_id: vid let p3 = getPP(p, 3, pp, 2);
}; let p4 = getPP(p, 4, pp, 3);
d.push(vod) let p5 = getPP(p, 5, pp, 4);
} catch (e) { let p6 = getPP(p, 6, pp, 5);
console.log(`首页列表单层定位处理发生错误:${e.message}`) for (let item of items) {
} let items2 = _pdfa(item, p1);
} for (let item2 of items2) {
} try {
} catch (e) {} let title = _pdfh(item2, p2);
} let img = "";
let t2 = (new Date).getTime(); try {
console.log("加载首页推荐耗时:" + (t2 - t1) + "毫秒"); img = _pd(item2, p3)
if (rule.图片替换) { } catch (e) {}
if (rule.图片替换.startsWith("js:")) { let desc = "";
d.forEach(it => { try {
try { desc = _pdfh(item2, p4)
var input = it.vod_pic; } catch (e) {}
eval(rule.图片替换.trim().replace("js:", "")); let links = [];
it.vod_pic = input for (let _p5 of p5.split("+")) {
} catch (e) { let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
log(`图片:${it.vod_pic}替换错误:${e.message}`) links.push(link)
} }
}) let content;
} else if (rule.图片替换.includes("=>")) { if (p.length > 6 && p[6]) {
let replace_from = rule.图片替换.split("=>")[0]; content = _pdfh(item2, p6)
let replace_to = rule.图片替换.split("=>")[1]; } else {
d.forEach(it => { content = ""
if (it.vod_pic && it.vod_pic.startsWith("http")) { }
it.vod_pic = it.vod_pic.replace(replace_from, replace_to) let vid = links.join("$");
} if (rule.二级 === "*") {
}) vid = vid + "@@" + title + "@@" + img
} }
} let vod = {
if (rule.图片来源) { vod_name: title,
d.forEach(it => { vod_pic: img,
if (it.vod_pic && it.vod_pic.startsWith("http")) { vod_remarks: desc,
it.vod_pic = it.vod_pic + rule.图片来源 vod_content: content,
} vod_id: vid
}) };
} d.push(vod)
if (d.length > 0) { } catch (e) {
print(d.slice(0, 2)) console.log(`首页列表双层定位处理发生错误:${e.message}`)
} }
return JSON.stringify({ }
list: d }
}) } else {
} let items = _pdfa(html, p0);
let p1 = getPP(p, 1, pp, 1);
function categoryParse(cateObj) { let p2 = getPP(p, 2, pp, 2);
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); let p3 = getPP(p, 3, pp, 3);
let p = cateObj.一级; let p4 = getPP(p, 4, pp, 4);
if (!p || typeof p !== "string") { let p5 = getPP(p, 5, pp, 5);
return "{}" for (let item of items) {
} try {
let d = []; let title = _pdfh(item, p1);
let url = cateObj.url.replaceAll("fyclass", cateObj.tid); let img = "";
if (cateObj.pg === 1 && url.includes("[") && url.includes("]")) { try {
url = url.split("[")[1].split("]")[0] img = _pd(item, p2, MY_URL)
} else if (cateObj.pg > 1 && url.includes("[") && url.includes("]")) { } catch (e) {}
url = url.split("[")[0] let desc = "";
} try {
if (rule.filter_url) { desc = _pdfh(item, p3)
if (!/fyfilter/.test(url)) { } catch (e) {}
if (!url.endsWith("&") && !rule.filter_url.startsWith("&")) { let links = [];
url += "&" for (let _p5 of p4.split("+")) {
} let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
url += rule.filter_url links.push(link)
} else { }
url = url.replace("fyfilter", rule.filter_url) let content;
} if (p.length > 5 && p[5]) {
url = url.replaceAll("fyclass", cateObj.tid); content = _pdfh(item, p5)
let fl = cateObj.filter ? cateObj.extend : {}; } else {
if (rule.filter_def && typeof rule.filter_def === "object") { content = ""
try { }
if (Object.keys(rule.filter_def).length > 0 && rule.filter_def.hasOwnProperty(cateObj.tid)) { let vid = links.join("$");
let self_fl_def = rule.filter_def[cateObj.tid]; if (rule.二级 === "*") {
if (self_fl_def && typeof self_fl_def === "object") { vid = vid + "@@" + title + "@@" + img
let fl_def = JSON.parse(JSON.stringify(self_fl_def)); }
fl = Object.assign(fl_def, fl) let vod = {
} vod_name: title,
} vod_pic: img,
} catch (e) { vod_remarks: desc,
print(`合并不同分类对应的默认筛选出错:${e.message}`) vod_content: content,
} vod_id: vid
} };
let new_url; d.push(vod)
new_url = cheerio.jinja2(url, { } catch (e) {
fl: fl, console.log(`首页列表单层定位处理发生错误:${e.message}`)
fyclass: cateObj.tid }
}); }
url = new_url }
} } catch (e) {}
if (/fypage/.test(url)) { }
if (url.includes("(") && url.includes(")")) { let t2 = (new Date).getTime();
let url_rep = url.match(/.*?\((.*)\)/)[1]; console.log("加载首页推荐耗时:" + (t2 - t1) + "毫秒");
let cnt_page = url_rep.replaceAll("fypage", cateObj.pg); if (rule.图片替换) {
let cnt_pg = eval(cnt_page); if (rule.图片替换.startsWith("js:")) {
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "") d.forEach(it => {
} else { try {
url = url.replaceAll("fypage", cateObj.pg) var input = it.vod_pic;
} eval(rule.图片替换.trim().replace("js:", ""));
} it.vod_pic = input
MY_URL = url; } catch (e) {
console.log(MY_URL); log(`图片:${it.vod_pic}替换错误:${e.message}`)
p = p.trim(); }
const MY_CATE = cateObj.tid; })
if (p.startsWith("js:")) { } else if (rule.图片替换.includes("=>")) {
var MY_FL = cateObj.extend; let replace_from = rule.图片替换.split("=>")[0];
const TYPE = "cate"; let replace_to = rule.图片替换.split("=>")[1];
var input = MY_URL; d.forEach(it => {
const MY_PAGE = cateObj.pg; if (it.vod_pic && it.vod_pic.startsWith("http")) {
var desc = ""; it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
eval(p.trim().replace("js:", "")); }
d = VODS })
} else { }
p = p.split(";"); }
if (p.length < 5) { if (rule.图片来源) {
return "{}" d.forEach(it => {
} if (it.vod_pic && it.vod_pic.startsWith("http")) {
let _ps = parseTags.getParse(p[0]); it.vod_pic = it.vod_pic + rule.图片来源
_pdfa = _ps.pdfa; }
_pdfh = _ps.pdfh; })
_pd = _ps.pd; }
let is_json = p[0].startsWith("json:"); if (d.length > 0) {
p[0] = p[0].replace(/^(jsp:|json:|jq:)/, ""); print(d.slice(0, 2))
try { }
let html = getHtml(MY_URL); return JSON.stringify({
if (html) { list: d
if (is_json) { })
html = dealJson(html) }
}
let list = _pdfa(html, p[0]); function categoryParse(cateObj) {
list.forEach(it => { fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let links = p[4].split("+").map(p4 => { let p = cateObj.一级;
return !rule.detailUrl ? _pd(it, p4, MY_URL) : _pdfh(it, p4) if (!p || typeof p !== "string") {
}); return "{}"
let link = links.join("$"); }
let vod_id = rule.detailUrl ? MY_CATE + "$" + link : link; let d = [];
let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g, "").trim(); let url = cateObj.url.replaceAll("fyclass", cateObj.tid);
let vod_pic = _pd(it, p[2], MY_URL); if (cateObj.pg === 1 && url.includes("[") && url.includes("]")) {
if (rule.二级 === "*") { url = url.split("[")[1].split("]")[0]
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic } else if (cateObj.pg > 1 && url.includes("[") && url.includes("]")) {
} url = url.split("[")[0]
d.push({ }
vod_id: vod_id, if (rule.filter_url) {
vod_name: vod_name, if (!/fyfilter/.test(url)) {
vod_pic: vod_pic, if (!url.endsWith("&") && !rule.filter_url.startsWith("&")) {
vod_remarks: _pdfh(it, p[3]).replace(/\n|\t/g, "").trim() url += "&"
}) }
}) url += rule.filter_url
} } else {
} catch (e) { url = url.replace("fyfilter", rule.filter_url)
console.log(e.message) }
} url = url.replaceAll("fyclass", cateObj.tid);
} let fl = cateObj.filter ? cateObj.extend : {};
if (rule.图片替换) { if (rule.filter_def && typeof rule.filter_def === "object") {
if (rule.图片替换.startsWith("js:")) { try {
d.forEach(it => { if (Object.keys(rule.filter_def).length > 0 && rule.filter_def.hasOwnProperty(cateObj.tid)) {
try { let self_fl_def = rule.filter_def[cateObj.tid];
var input = it.vod_pic; if (self_fl_def && typeof self_fl_def === "object") {
eval(rule.图片替换.trim().replace("js:", "")); let fl_def = JSON.parse(JSON.stringify(self_fl_def));
it.vod_pic = input fl = Object.assign(fl_def, fl)
} catch (e) { }
log(`图片:${it.vod_pic}替换错误:${e.message}`) }
} } catch (e) {
}) print(`合并不同分类对应的默认筛选出错:${e.message}`)
} else if (rule.图片替换.includes("=>")) { }
let replace_from = rule.图片替换.split("=>")[0]; }
let replace_to = rule.图片替换.split("=>")[1]; let new_url;
d.forEach(it => { new_url = cheerio.jinja2(url, {
if (it.vod_pic && it.vod_pic.startsWith("http")) { fl: fl,
it.vod_pic = it.vod_pic.replace(replace_from, replace_to) fyclass: cateObj.tid
} });
}) url = new_url
} }
} if (/fypage/.test(url)) {
if (rule.图片来源) { if (url.includes("(") && url.includes(")")) {
d.forEach(it => { let url_rep = url.match(/.*?\((.*)\)/)[1];
if (it.vod_pic && it.vod_pic.startsWith("http")) { let cnt_page = url_rep.replaceAll("fypage", cateObj.pg);
it.vod_pic = it.vod_pic + rule.图片来源 let cnt_pg = eval(cnt_page);
} url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
}) } else {
} url = url.replaceAll("fypage", cateObj.pg)
if (d.length > 0) { }
print(d.slice(0, 2)) }
} MY_URL = url;
let pagecount = 0; console.log(MY_URL);
if (rule.pagecount && typeof rule.pagecount === "object" && rule.pagecount.hasOwnProperty(MY_CATE)) { p = p.trim();
print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`); const MY_CATE = cateObj.tid;
pagecount = parseInt(rule.pagecount[MY_CATE]) if (p.startsWith("js:")) {
} var MY_FL = cateObj.extend;
let nodata = { const TYPE = "cate";
list: [{ var input = MY_URL;
vod_name: "无数据,防无限请求", const MY_PAGE = cateObj.pg;
vod_id: "no_data", var desc = "";
vod_remarks: "不要点,会崩的", eval(p.trim().replace("js:", ""));
vod_pic: "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg" d = VODS
}], } else {
total: 1, p = p.split(";");
pagecount: 1, if (p.length < 5) {
page: 1, return "{}"
limit: 1 }
}; let _ps = parseTags.getParse(p[0]);
let vod = d.length < 1 ? JSON.stringify(nodata) : JSON.stringify({ _pdfa = _ps.pdfa;
page: parseInt(cateObj.pg), _pdfh = _ps.pdfh;
pagecount: pagecount || 999, _pd = _ps.pd;
limit: 20, let is_json = p[0].startsWith("json:");
total: 999, p[0] = p[0].replace(/^(jsp:|json:|jq:)/, "");
list: d try {
}); let html = getHtml(MY_URL);
return vod if (html) {
} if (is_json) {
html = dealJson(html)
function searchParse(searchObj) { }
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); let list = _pdfa(html, p[0]);
let d = []; list.forEach(it => {
if (!searchObj.searchUrl) { let links = p[4].split("+").map(p4 => {
return "{}" return !rule.detailUrl ? _pd(it, p4, MY_URL) : _pdfh(it, p4)
} });
if (rule.searchNoPage && Number(searchObj.pg) > 1) { let link = links.join("$");
return "{}" let vod_id = rule.detailUrl ? MY_CATE + "$" + link : link;
} let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g, "").trim();
let p = searchObj.搜索 === "*" && rule.一级 ? rule.一级 : searchObj.搜索; let vod_pic = _pd(it, p[2], MY_URL);
if (!p || typeof p !== "string") { if (rule.二级 === "*") {
return "{}" vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
} }
p = p.trim(); d.push({
let pp = rule.一级 ? rule.一级.split(";") : []; vod_id: vod_id,
let url = searchObj.searchUrl.replaceAll("**", searchObj.wd); vod_name: vod_name,
if (searchObj.pg === 1 && url.includes("[") && url.includes("]") && !url.includes("#")) { vod_pic: vod_pic,
url = url.split("[")[1].split("]")[0] vod_remarks: _pdfh(it, p[3]).replace(/\n|\t/g, "").trim()
} else if (searchObj.pg > 1 && url.includes("[") && url.includes("]") && !url.includes("#")) { })
url = url.split("[")[0] })
} }
if (/fypage/.test(url)) { } catch (e) {
if (url.includes("(") && url.includes(")")) { console.log(e.message)
let url_rep = url.match(/.*?\((.*)\)/)[1]; }
let cnt_page = url_rep.replaceAll("fypage", searchObj.pg); }
let cnt_pg = eval(cnt_page); if (rule.图片替换) {
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "") if (rule.图片替换.startsWith("js:")) {
} else { d.forEach(it => {
url = url.replaceAll("fypage", searchObj.pg) try {
} var input = it.vod_pic;
} eval(rule.图片替换.trim().replace("js:", ""));
MY_URL = url; it.vod_pic = input
console.log(MY_URL); } catch (e) {
if (p.startsWith("js:")) { log(`图片:${it.vod_pic}替换错误:${e.message}`)
const TYPE = "search"; }
const MY_PAGE = searchObj.pg; })
const KEY = searchObj.wd; } else if (rule.图片替换.includes("=>")) {
var input = MY_URL; let replace_from = rule.图片替换.split("=>")[0];
var detailUrl = rule.detailUrl || ""; let replace_to = rule.图片替换.split("=>")[1];
eval(p.trim().replace("js:", "")); d.forEach(it => {
d = VODS if (it.vod_pic && it.vod_pic.startsWith("http")) {
} else { it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
p = p.split(";"); }
if (p.length < 5) { })
return "{}" }
} }
let p0 = getPP(p, 0, pp, 0); if (rule.图片来源) {
let _ps = parseTags.getParse(p0); d.forEach(it => {
_pdfa = _ps.pdfa; if (it.vod_pic && it.vod_pic.startsWith("http")) {
_pdfh = _ps.pdfh; it.vod_pic = it.vod_pic + rule.图片来源
_pd = _ps.pd; }
let is_json = p0.startsWith("json:"); })
p0 = p0.replace(/^(jsp:|json:|jq:)/, ""); }
try { if (d.length > 0) {
let req_method = MY_URL.split(";").length > 1 ? MY_URL.split(";")[1].toLowerCase() : "get"; print(d.slice(0, 2))
let html; }
if (req_method === "post") { let pagecount = 0;
let rurls = MY_URL.split(";")[0].split("#"); if (rule.pagecount && typeof rule.pagecount === "object" && rule.pagecount.hasOwnProperty(MY_CATE)) {
let rurl = rurls[0]; print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
let params = rurls.length > 1 ? rurls[1] : ""; pagecount = parseInt(rule.pagecount[MY_CATE])
print(`post=》rurl:${rurl},params:${params}`); }
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); let nodata = {
let postData = { list: [{
body: params vod_name: "无数据,防无限请求",
}; vod_id: "no_data",
Object.assign(_fetch_params, postData); vod_remarks: "不要点,会崩的",
html = post(rurl, _fetch_params) vod_pic: "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"
} else if (req_method === "postjson") { }],
let rurls = MY_URL.split(";")[0].split("#"); total: 1,
let rurl = rurls[0]; pagecount: 1,
let params = rurls.length > 1 ? rurls[1] : ""; page: 1,
print(`postjson-》rurl:${rurl},params:${params}`); limit: 1
try { };
params = JSON.parse(params) let vod = d.length < 1 ? JSON.stringify(nodata) : JSON.stringify({
} catch (e) { page: parseInt(cateObj.pg),
params = "{}" pagecount: pagecount || 999,
} limit: 20,
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); total: 999,
let postData = { list: d
body: params });
}; return vod
Object.assign(_fetch_params, postData); }
html = post(rurl, _fetch_params)
} else { function searchParse(searchObj) {
html = getHtml(MY_URL) fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
} let d = [];
if (html) { if (!searchObj.searchUrl) {
let search_tag = rule.搜索验证标识 || "系统安全验证|输入验证码"; return "{}"
if (new RegExp(search_tag).test(html)) { }
let cookie = verifyCode(MY_URL); if (rule.searchNoPage && Number(searchObj.pg) > 1) {
if (cookie) { return "{}"
console.log(`本次成功过验证,cookie:${cookie}`); }
setItem(RULE_CK, cookie) let p = searchObj.搜索 === "*" && rule.一级 ? rule.一级 : searchObj.搜索;
} else { if (!p || typeof p !== "string") {
console.log(`本次自动过搜索验证失败,cookie:${cookie}`) return "{}"
} }
html = getHtml(MY_URL) p = p.trim();
} let pp = rule.一级 ? rule.一级.split(";") : [];
if (!html.includes(searchObj.wd)) { let url = searchObj.searchUrl.replaceAll("**", searchObj.wd);
console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码"); if (searchObj.pg === 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
console.log(html) url = url.split("[")[1].split("]")[0]
} } else if (searchObj.pg > 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
if (is_json) { url = url.split("[")[0]
html = dealJson(html) }
} if (/fypage/.test(url)) {
let list = _pdfa(html, p0); if (url.includes("(") && url.includes(")")) {
let p1 = getPP(p, 1, pp, 1); let url_rep = url.match(/.*?\((.*)\)/)[1];
let p2 = getPP(p, 2, pp, 2); let cnt_page = url_rep.replaceAll("fypage", searchObj.pg);
let p3 = getPP(p, 3, pp, 3); let cnt_pg = eval(cnt_page);
let p4 = getPP(p, 4, pp, 4); url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
let p5 = getPP(p, 5, pp, 5); } else {
list.forEach(it => { url = url.replaceAll("fypage", searchObj.pg)
let links = p4.split("+").map(_p4 => { }
return !rule.detailUrl ? _pd(it, _p4, MY_URL) : _pdfh(it, _p4) }
}); MY_URL = url;
let link = links.join("$"); console.log(MY_URL);
let content; if (p.startsWith("js:")) {
if (p.length > 5 && p[5]) { const TYPE = "search";
content = _pdfh(it, p5) const MY_PAGE = searchObj.pg;
} else { const KEY = searchObj.wd;
content = "" var input = MY_URL;
} var detailUrl = rule.detailUrl || "";
let vod_id = link; eval(p.trim().replace("js:", ""));
let vod_name = _pdfh(it, p1).replace(/\n|\t/g, "").trim(); d = VODS
let vod_pic = _pd(it, p2, MY_URL); } else {
if (rule.二级 === "*") { p = p.split(";");
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic if (p.length < 5) {
} return "{}"
let ob = { }
vod_id: vod_id, let p0 = getPP(p, 0, pp, 0);
vod_name: vod_name, let _ps = parseTags.getParse(p0);
vod_pic: vod_pic, _pdfa = _ps.pdfa;
vod_remarks: _pdfh(it, p3).replace(/\n|\t/g, "").trim(), _pdfh = _ps.pdfh;
vod_content: content.replace(/\n|\t/g, "").trim() _pd = _ps.pd;
}; let is_json = p0.startsWith("json:");
d.push(ob) p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
}) try {
} let req_method = MY_URL.split(";").length > 1 ? MY_URL.split(";")[1].toLowerCase() : "get";
} catch (e) { let html;
print(`搜索发生错误:${e.message}`); if (req_method === "post") {
return "{}" let rurls = MY_URL.split(";")[0].split("#");
} let rurl = rurls[0];
} let params = rurls.length > 1 ? rurls[1] : "";
if (rule.图片替换) { print(`post=》rurl:${rurl},params:${params}`);
if (rule.图片替换.startsWith("js:")) { let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
d.forEach(it => { let postData = {
try { body: params
var input = it.vod_pic; };
eval(rule.图片替换.trim().replace("js:", "")); Object.assign(_fetch_params, postData);
it.vod_pic = input html = post(rurl, _fetch_params)
} catch (e) { } else if (req_method === "postjson") {
log(`图片:${it.vod_pic}替换错误:${e.message}`) let rurls = MY_URL.split(";")[0].split("#");
} let rurl = rurls[0];
}) let params = rurls.length > 1 ? rurls[1] : "";
} else if (rule.图片替换.includes("=>")) { print(`postjson-》rurl:${rurl},params:${params}`);
let replace_from = rule.图片替换.split("=>")[0]; try {
let replace_to = rule.图片替换.split("=>")[1]; params = JSON.parse(params)
d.forEach(it => { } catch (e) {
if (it.vod_pic && it.vod_pic.startsWith("http")) { params = "{}"
it.vod_pic = it.vod_pic.replace(replace_from, replace_to) }
} let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
}) let postData = {
} body: params
} };
if (rule.图片来源) { Object.assign(_fetch_params, postData);
d.forEach(it => { html = post(rurl, _fetch_params)
if (it.vod_pic && it.vod_pic.startsWith("http")) { } else {
it.vod_pic = it.vod_pic + rule.图片来源 html = getHtml(MY_URL)
} }
}) if (html) {
} let search_tag = rule.搜索验证标识 || "系统安全验证|输入验证码";
return JSON.stringify({ if (new RegExp(search_tag).test(html)) {
page: parseInt(searchObj.pg), let cookie = verifyCode(MY_URL);
pagecount: 10, if (cookie) {
limit: 20, console.log(`本次成功过验证,cookie:${cookie}`);
total: 100, setItem(RULE_CK, cookie)
list: d } else {
}) console.log(`本次自动过搜索验证失败,cookie:${cookie}`)
} }
html = getHtml(MY_URL)
function detailParse(detailObj) { }
let t1 = (new Date).getTime(); if (!html.includes(searchObj.wd)) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");
let orId = detailObj.orId; console.log(html)
let vod_name = "片名"; }
let vod_pic = ""; if (is_json) {
let vod_id = orId; html = dealJson(html)
if (rule.二级 === "*") { }
let extra = orId.split("@@"); let list = _pdfa(html, p0);
vod_name = extra.length > 1 ? extra[1] : vod_name; let p1 = getPP(p, 1, pp, 1);
vod_pic = extra.length > 2 ? extra[2] : vod_pic let p2 = getPP(p, 2, pp, 2);
} let p3 = getPP(p, 3, pp, 3);
let vod = { let p4 = getPP(p, 4, pp, 4);
vod_id: vod_id, let p5 = getPP(p, 5, pp, 5);
vod_name: vod_name, list.forEach(it => {
vod_pic: vod_pic, let links = p4.split("+").map(_p4 => {
type_name: "类型", return !rule.detailUrl ? _pd(it, _p4, MY_URL) : _pdfh(it, _p4)
vod_year: "年份", });
vod_area: "地区", let link = links.join("$");
vod_remarks: "更新信息", let content;
vod_actor: "主演", if (p.length > 5 && p[5]) {
vod_director: "导演", content = _pdfh(it, p5)
vod_content: "简介" } else {
}; content = ""
let p = detailObj.二级; }
let url = detailObj.url; let vod_id = link;
let detailUrl = detailObj.detailUrl; let vod_name = _pdfh(it, p1).replace(/\n|\t/g, "").trim();
let fyclass = detailObj.fyclass; let vod_pic = _pd(it, p2, MY_URL);
let tab_exclude = detailObj.tab_exclude; if (rule.二级 === "*") {
let html = detailObj.html || ""; vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
MY_URL = url; }
if (detailObj.二级访问前) { let ob = {
try { vod_id: vod_id,
print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`); vod_name: vod_name,
eval(detailObj.二级访问前.trim().replace("js:", "")) vod_pic: vod_pic,
} catch (e) { vod_remarks: _pdfh(it, p3).replace(/\n|\t/g, "").trim(),
print(`二级访问前执行代码出现错误:${e.message}`) vod_content: content.replace(/\n|\t/g, "").trim()
} };
} d.push(ob)
if (p === "*") { })
vod.vod_play_from = "云盘"; }
vod.vod_remarks = detailUrl; } catch (e) {
vod.vod_actor = "没有二级,只有一级链接直接嗅探播放"; print(`搜索发生错误:${e.message}`);
vod.vod_content = MY_URL; return "{}"
vod.vod_play_url = "嗅探播放$" + MY_URL.split("@@")[0] }
} else if (typeof p === "string" && p.trim().startsWith("js:")) { }
const TYPE = "detail"; if (rule.图片替换) {
var input = MY_URL; if (rule.图片替换.startsWith("js:")) {
var play_url = ""; d.forEach(it => {
eval(p.trim().replace("js:", "")); try {
vod = VOD; var input = it.vod_pic;
console.log(JSON.stringify(vod)) eval(rule.图片替换.trim().replace("js:", ""));
} else if (p && typeof p === "object") { it.vod_pic = input
let tt1 = (new Date).getTime(); } catch (e) {
if (!html) { log(`图片:${it.vod_pic}替换错误:${e.message}`)
html = getHtml(MY_URL) }
} })
print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`); } else if (rule.图片替换.includes("=>")) {
let _ps; let replace_from = rule.图片替换.split("=>")[0];
if (p.is_json) { let replace_to = rule.图片替换.split("=>")[1];
print("二级是json"); d.forEach(it => {
_ps = parseTags.json; if (it.vod_pic && it.vod_pic.startsWith("http")) {
html = dealJson(html) it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
} else if (p.is_jsp) { }
print("二级是jsp"); })
_ps = parseTags.jsp }
} else if (p.is_jq) { }
print("二级是jq"); if (rule.图片来源) {
_ps = parseTags.jq d.forEach(it => {
} else { if (it.vod_pic && it.vod_pic.startsWith("http")) {
print("二级默认jq"); it.vod_pic = it.vod_pic + rule.图片来源
_ps = parseTags.jq }
} })
let tt2 = (new Date).getTime(); }
print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`); return JSON.stringify({
_pdfa = _ps.pdfa; page: parseInt(searchObj.pg),
_pdfh = _ps.pdfh; pagecount: 10,
_pd = _ps.pd; limit: 20,
if (p.title) { total: 100,
let p1 = p.title.split(";"); list: d
vod.vod_name = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim(); })
let type_name = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").replace(/ /g, "").trim() : ""; }
vod.type_name = type_name || vod.type_name
} function detailParse(detailObj) {
if (p.desc) { let t1 = (new Date).getTime();
try { fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let p1 = p.desc.split(";"); let orId = detailObj.orId;
vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim(); let vod_name = "片名";
vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").trim() : ""; let vod_pic = "";
vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g, "").trim() : ""; let vod_id = orId;
vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g, "").trim() : ""; if (rule.二级 === "*") {
vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g, "").trim() : "" let extra = orId.split("@@");
} catch (e) {} vod_name = extra.length > 1 ? extra[1] : vod_name;
} vod_pic = extra.length > 2 ? extra[2] : vod_pic
if (p.content) { }
try { let vod = {
let p1 = p.content.split(";"); vod_id: vod_id,
vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim() vod_name: vod_name,
} catch (e) {} vod_pic: vod_pic,
} type_name: "类型",
if (p.img) { vod_year: "年份",
try { vod_area: "地区",
let p1 = p.img.split(";"); vod_remarks: "更新信息",
vod.vod_pic = _pd(html, p1[0], MY_URL) vod_actor: "主演",
} catch (e) {} vod_director: "导演",
} vod_content: "简介"
let vod_play_from = "$$$"; };
let playFrom = []; let p = detailObj.二级;
if (p.重定向 && p.重定向.startsWith("js:")) { let url = detailObj.url;
print("开始执行重定向代码:" + p.重定向); let detailUrl = detailObj.detailUrl;
html = eval(p.重定向.replace("js:", "")) let fyclass = detailObj.fyclass;
} let tab_exclude = detailObj.tab_exclude;
if (p.tabs) { let html = detailObj.html || "";
if (p.tabs.startsWith("js:")) { MY_URL = url;
print("开始执行tabs代码:" + p.tabs); if (detailObj.二级访问前) {
var input = MY_URL; try {
eval(p.tabs.replace("js:", "")); print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
playFrom = TABS eval(detailObj.二级访问前.trim().replace("js:", ""))
} else { } catch (e) {
let p_tab = p.tabs.split(";")[0]; print(`二级访问前执行代码出现错误:${e.message}`)
let vHeader = _pdfa(html, p_tab); }
console.log(vHeader.length); }
let tab_text = p.tab_text || "body&&Text"; if (p === "*") {
let new_map = {}; vod.vod_play_from = "兵哥视界";
for (let v of vHeader) { vod.vod_remarks = detailUrl;
let v_title = _pdfh(v, tab_text).trim(); vod.vod_actor = "没有二级,只有一级链接直接嗅探播放";
if (!v_title) { vod.vod_content = MY_URL;
v_title = "线路空" vod.vod_play_url = "嗅探播放$" + MY_URL.split("@@")[0]
} } else if (typeof p === "string" && p.trim().startsWith("js:")) {
console.log(v_title); const TYPE = "detail";
if (tab_exclude && new RegExp(tab_exclude).test(v_title)) { var input = MY_URL;
continue var play_url = "";
} eval(p.trim().replace("js:", ""));
if (!new_map.hasOwnProperty(v_title)) { vod = VOD;
new_map[v_title] = 1 console.log(JSON.stringify(vod))
} else { } else if (p && typeof p === "object") {
new_map[v_title] += 1 let tt1 = (new Date).getTime();
} if (!html) {
if (new_map[v_title] > 1) { html = getHtml(MY_URL)
v_title += Number(new_map[v_title] - 1) }
} print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);
playFrom.push(v_title) let _ps;
} if (p.is_json) {
} print("二级是json");
console.log(JSON.stringify(playFrom)) _ps = parseTags.json;
} else { html = dealJson(html)
playFrom = ["云盘"] } else if (p.is_jsp) {
} print("二级是jsp");
vod.vod_play_from = playFrom.join(vod_play_from); _ps = parseTags.jsp
let vod_play_url = "$$$"; } else if (p.is_jq) {
let vod_tab_list = []; print("二级是jq");
if (p.lists) { _ps = parseTags.jq
if (p.lists.startsWith("js:")) { } else {
print("开始执行lists代码:" + p.lists); print("二级默认jq");
try { _ps = parseTags.jq
var input = MY_URL; }
var play_url = ""; let tt2 = (new Date).getTime();
eval(p.lists.replace("js:", "")); print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
for (let i in LISTS) { _pdfa = _ps.pdfa;
if (LISTS.hasOwnProperty(i)) { _pdfh = _ps.pdfh;
try { _pd = _ps.pd;
LISTS[i] = LISTS[i].map(it => it.split("$").slice(0, 2).join("$")) if (p.title) {
} catch (e) { let p1 = p.title.split(";");
print(`格式化LISTS发生错误:${e.message}`) vod.vod_name = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
} let type_name = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").replace(/ /g, "").trim() : "";
} vod.type_name = type_name || vod.type_name
} }
vod_play_url = LISTS.map(it => it.join("#")).join(vod_play_url) if (p.desc) {
} catch (e) { try {
print(`js执行lists: 发生错误:${e.message}`) let p1 = p.desc.split(";");
} vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
} else { vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").trim() : "";
let list_text = p.list_text || "body&&Text"; vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g, "").trim() : "";
let list_url = p.list_url || "a&&href"; vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g, "").trim() : "";
let list_url_prefix = p.list_url_prefix || ""; vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g, "").trim() : ""
let is_tab_js = p.tabs.trim().startsWith("js:"); } catch (e) {}
for (let i = 0; i < playFrom.length; i++) { }
let tab_name = playFrom[i]; if (p.content) {
let tab_ext = p.tabs.split(";").length > 1 && !is_tab_js ? p.tabs.split(";")[1] : ""; try {
let p1 = p.lists.replaceAll("#idv", tab_name).replaceAll("#id", i); let p1 = p.content.split(";");
tab_ext = tab_ext.replaceAll("#idv", tab_name).replaceAll("#id", i); vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim()
let tabName = tab_ext ? _pdfh(html, tab_ext) : tab_name; } catch (e) {}
console.log(tabName); }
let new_vod_list = []; if (p.img) {
let tt1 = (new Date).getTime(); try {
if (typeof pdfl === "function") { let p1 = p.img.split(";");
new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL); vod.vod_pic = _pd(html, p1[0], MY_URL)
if (list_url_prefix) { } catch (e) {}
new_vod_list = new_vod_list.map(it => it.split("$")[0] + "$" + list_url_prefix + it.split("$").slice(1).join("$")) }
} let vod_play_from = "$$$";
} else { let playFrom = [];
let vodList = []; if (p.重定向 && p.重定向.startsWith("js:")) {
try { print("开始执行重定向代码:" + p.重定向);
vodList = _pdfa(html, p1); html = eval(p.重定向.replace("js:", ""))
console.log("len(vodList):" + vodList.length) }
} catch (e) {} if (p.tabs) {
for (let i = 0; i < vodList.length; i++) { if (p.tabs.startsWith("js:")) {
let it = vodList[i]; print("开始执行tabs代码:" + p.tabs);
new_vod_list.push(_pdfh(it, list_text).trim() + "$" + list_url_prefix + _pd(it, list_url, MY_URL)) var input = MY_URL;
} eval(p.tabs.replace("js:", ""));
} playFrom = TABS
if (new_vod_list.length > 0) { } else {
new_vod_list = forceOrder(new_vod_list, "", x => x.split("$")[0]); let p_tab = p.tabs.split(";")[0];
console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`) let vHeader = _pdfa(html, p_tab);
} console.log(vHeader.length);
let vlist = new_vod_list.join("#"); let tab_text = p.tab_text || "body&&Text";
vod_tab_list.push(vlist) let new_map = {};
} for (let v of vHeader) {
vod_play_url = vod_tab_list.join(vod_play_url) let v_title = _pdfh(v, tab_text).trim();
} if (!v_title) {
} v_title = "线路空"
vod.vod_play_url = vod_play_url }
} console.log(v_title);
if (rule.图片替换 && rule.图片替换.includes("=>")) { if (tab_exclude && new RegExp(tab_exclude).test(v_title)) {
let replace_from = rule.图片替换.split("=>")[0]; continue
let replace_to = rule.图片替换.split("=>")[1]; }
vod.vod_pic = vod.vod_pic.replace(replace_from, replace_to) if (!new_map.hasOwnProperty(v_title)) {
} new_map[v_title] = 1
if (rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith("http")) { } else {
vod.vod_pic = vod.vod_pic + rule.图片来源 new_map[v_title] += 1
} }
if (!vod.vod_id || vod_id.includes("$") && vod.vod_id !== vod_id) { if (new_map[v_title] > 1) {
vod.vod_id = vod_id v_title += Number(new_map[v_title] - 1)
} }
let t2 = (new Date).getTime(); playFrom.push(v_title)
console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`); }
try { }
vod = vodDeal(vod) console.log(JSON.stringify(playFrom))
} catch (e) { } else {
console.log(`vodDeal发生错误:${e.message}`) playFrom = ["兵哥视界"]
} }
return JSON.stringify({ vod.vod_play_from = playFrom.join(vod_play_from);
list: [vod] let vod_play_url = "$$$";
}) let vod_tab_list = [];
} if (p.lists) {
if (p.lists.startsWith("js:")) {
function get_tab_index(vod) { print("开始执行lists代码:" + p.lists);
let obj = {}; try {
vod.vod_play_from.split("$$$").forEach((it, index) => { var input = MY_URL;
obj[it] = index var play_url = "";
}); eval(p.lists.replace("js:", ""));
return obj for (let i in LISTS) {
} if (LISTS.hasOwnProperty(i)) {
try {
function vodDeal(vod) { LISTS[i] = LISTS[i].map(it => it.split("$").slice(0, 2).join("$"))
let vod_play_from = vod.vod_play_from.split("$$$"); } catch (e) {
let vod_play_url = vod.vod_play_url.split("$$$"); print(`格式化LISTS发生错误:${e.message}`)
let tab_removed_list = vod_play_from; }
let tab_ordered_list = vod_play_from; }
let tab_renamed_list = vod_play_from; }
let tab_list = vod_play_from; vod_play_url = LISTS.map(it => it.join("#")).join(vod_play_url)
let play_ordered_list = vod_play_url; } catch (e) {
if (rule.tab_remove && rule.tab_remove.length > 0 || rule.tab_order && rule.tab_order.length > 0) { print(`js执行lists: 发生错误:${e.message}`)
let tab_index_dict = get_tab_index(vod); }
if (rule.tab_remove && rule.tab_remove.length > 0) { } else {
tab_removed_list = vod_play_from.filter(it => !rule.tab_remove.includes(it)); let list_text = p.list_text || "body&&Text";
tab_list = tab_removed_list let list_url = p.list_url || "a&&href";
} let list_url_prefix = p.list_url_prefix || "";
if (rule.tab_order && rule.tab_order.length > 0) { let is_tab_js = p.tabs.trim().startsWith("js:");
let tab_order = rule.tab_order; for (let i = 0; i < playFrom.length; i++) {
tab_ordered_list = tab_removed_list.sort((a, b) => { let tab_name = playFrom[i];
return (tab_order.indexOf(a) === -1 ? 9999 : tab_order.indexOf(a)) - (tab_order.indexOf(b) === -1 ? 9999 : tab_order.indexOf(b)) let tab_ext = p.tabs.split(";").length > 1 && !is_tab_js ? p.tabs.split(";")[1] : "";
}); let p1 = p.lists.replaceAll("#idv", tab_name).replaceAll("#id", i);
tab_list = tab_ordered_list tab_ext = tab_ext.replaceAll("#idv", tab_name).replaceAll("#id", i);
} let tabName = tab_ext ? _pdfh(html, tab_ext) : tab_name;
play_ordered_list = tab_list.map(it => vod_play_url[tab_index_dict[it]]) console.log(tabName);
} let new_vod_list = [];
if (rule.tab_rename && typeof rule.tab_rename === "object" & Object.keys(rule.tab_rename).length > 0) { let tt1 = (new Date).getTime();
tab_renamed_list = tab_list.map(it => rule.tab_rename[it] || it); if (typeof pdfl === "function") {
tab_list = tab_renamed_list new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL);
} if (list_url_prefix) {
vod.vod_play_from = tab_list.join("$$$"); new_vod_list = new_vod_list.map(it => it.split("$")[0] + "$" + list_url_prefix + it.split("$").slice(1).join("$"))
vod.vod_play_url = play_ordered_list.join("$$$"); }
return vod } else {
} let vodList = [];
try {
function tellIsJx(url) { vodList = _pdfa(html, p1);
try { console.log("len(vodList):" + vodList.length)
let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0]) && 是否正版(url); } catch (e) {}
return is_vip ? 1 : 0 for (let i = 0; i < vodList.length; i++) {
} catch (e) { let it = vodList[i];
return 1 new_vod_list.push(_pdfh(it, list_text).trim() + "$" + list_url_prefix + _pd(it, list_url, MY_URL))
} }
} }
if (new_vod_list.length > 0) {
function playParse(playObj) { new_vod_list = forceOrder(new_vod_list, "", x => x.split("$")[0]);
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params)); console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)
MY_URL = playObj.url; }
var MY_FLAG = playObj.flag; let vlist = new_vod_list.join("#");
if (!/http/.test(MY_URL)) { vod_tab_list.push(vlist)
try { }
MY_URL = base64Decode(MY_URL) vod_play_url = vod_tab_list.join(vod_play_url)
} catch (e) {} }
} }
MY_URL = decodeURIComponent(MY_URL); vod.vod_play_url = vod_play_url
var input = MY_URL; }
var flag = MY_FLAG; if (rule.图片替换 && rule.图片替换.includes("=>")) {
let common_play = { let replace_from = rule.图片替换.split("=>")[0];
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1, let replace_to = rule.图片替换.split("=>")[1];
url: input, vod.vod_pic = vod.vod_pic.replace(replace_from, replace_to)
flag: flag, }
jx: tellIsJx(input) if (rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith("http")) {
}; vod.vod_pic = vod.vod_pic + rule.图片来源
let lazy_play; }
if (!rule.play_parse || !rule.lazy) { if (!vod.vod_id || vod_id.includes("$") && vod.vod_id !== vod_id) {
lazy_play = common_play vod.vod_id = vod_id
} else if (rule.play_parse && rule.lazy && typeof rule.lazy === "string") { }
try { let t2 = (new Date).getTime();
let lazy_code = rule.lazy.trim(); console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
if (lazy_code.startsWith("js:")) { try {
lazy_code = lazy_code.replace("js:", "").trim() vod = vodDeal(vod)
} } catch (e) {
print("开始执行js免嗅=>" + lazy_code); console.log(`vodDeal发生错误:${e.message}`)
eval(lazy_code); }
lazy_play = typeof input === "object" ? input : { return JSON.stringify({
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1, list: [vod]
jx: tellIsJx(input), })
url: input }
}
} catch (e) { function get_tab_index(vod) {
print(`js免嗅错误:${e.message}`); let obj = {};
lazy_play = common_play vod.vod_play_from.split("$$$").forEach((it, index) => {
} obj[it] = index
} else { });
lazy_play = common_play return obj
} }
if (Array.isArray(rule.play_json) && rule.play_json.length > 0) {
let web_url = lazy_play.url; function vodDeal(vod) {
for (let pjson of rule.play_json) { let vod_play_from = vod.vod_play_from.split("$$$");
if (pjson.re && (pjson.re === "*" || web_url.match(new RegExp(pjson.re)))) { let vod_play_url = vod.vod_play_url.split("$$$");
if (pjson.json && typeof pjson.json === "object") { let tab_removed_list = vod_play_from;
let base_json = pjson.json; let tab_ordered_list = vod_play_from;
lazy_play = Object.assign(lazy_play, base_json); let tab_renamed_list = vod_play_from;
break let tab_list = vod_play_from;
} let play_ordered_list = vod_play_url;
} if (rule.tab_remove && rule.tab_remove.length > 0 || rule.tab_order && rule.tab_order.length > 0) {
} let tab_index_dict = get_tab_index(vod);
} else if (rule.play_json && !Array.isArray(rule.play_json)) { if (rule.tab_remove && rule.tab_remove.length > 0) {
let base_json = { tab_removed_list = vod_play_from.filter(it => !rule.tab_remove.includes(it));
jx: 1, tab_list = tab_removed_list
parse: 1 }
}; if (rule.tab_order && rule.tab_order.length > 0) {
lazy_play = Object.assign(lazy_play, base_json) let tab_order = rule.tab_order;
} else if (!rule.play_json) { tab_ordered_list = tab_removed_list.sort((a, b) => {
let base_json = { const getOrderIndex = (tabName, orderRules) => {
jx: 0, for (let i = 0; i < orderRules.length; i++) {
parse: 1 if (tabName.includes(orderRules[i])) {
}; return i
lazy_play = Object.assign(lazy_play, base_json) }
} }
console.log(JSON.stringify(lazy_play)); return 9999
return JSON.stringify(lazy_play) };
} const indexA = getOrderIndex(a, tab_order);
const indexB = getOrderIndex(b, tab_order);
function proxyParse(proxyObj) { return indexA - indexB
var input = proxyObj.params; });
if (proxyObj.proxy_rule) { tab_list = tab_ordered_list
log("准备执行本地代理规则:\n" + proxyObj.proxy_rule); }
try { play_ordered_list = tab_list.map(it => vod_play_url[tab_index_dict[it]])
eval(proxyObj.proxy_rule); }
if (input && input !== proxyObj.params && Array.isArray(input) && input.length >= 3) { if (rule.tab_rename && typeof rule.tab_rename === "object" & Object.keys(rule.tab_rename).length > 0) {
return input tab_renamed_list = tab_list.map(it => rule.tab_rename[it] || it);
} else { tab_list = tab_renamed_list
return [404, "text/plain", "Not Found"] }
} vod.vod_play_from = tab_list.join("$$$");
} catch (e) { vod.vod_play_url = play_ordered_list.join("$$$");
return [500, "text/plain", "代理规则错误:" + e.message] return vod
} }
} else {
return [404, "text/plain", "Not Found"] function tellIsJx(url) {
} try {
} let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0]) && 是否正版(url);
return is_vip ? 1 : 0
function isVideoParse(isVideoObj) { } catch (e) {
var input = isVideoObj.url; return 1
if (!isVideoObj.t) { }
let re_matcher = new RegExp(isVideoObj.isVideo, "i"); }
return re_matcher.test(input)
} else { function playParse(playObj) {
try { fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
eval(isVideoObj.isVideo); MY_URL = playObj.url;
if (typeof input === "boolean") { var MY_FLAG = playObj.flag;
return input if (!/http/.test(MY_URL)) {
} else { try {
return false MY_URL = base64Decode(MY_URL)
} } catch (e) {}
} catch (e) { }
log(`执行嗅探规则发生错误:${e.message}`); MY_URL = decodeURIComponent(MY_URL);
return false var input = MY_URL;
} var flag = MY_FLAG;
} let common_play = {
} parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
url: input,
function getOriginalJs(js_code) { flag: flag,
let current_match = /var rule|[\u4E00-\u9FA5]+|function|let |var |const |\(|\)|"|'/; jx: tellIsJx(input)
if (current_match.test(js_code)) { };
return js_code let lazy_play;
} if (!rule.play_parse || !rule.lazy) {
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs="; lazy_play = common_play
let decode_content = ""; } else if (rule.play_parse && rule.lazy && typeof rule.lazy === "string") {
try {
function aes_decrypt(data) { let lazy_code = rule.lazy.trim();
let key = CryptoJS.enc.Hex.parse("686A64686E780A0A0A0A0A0A0A0A0A0A"); if (lazy_code.startsWith("js:")) {
let iv = CryptoJS.enc.Hex.parse("647A797964730A0A0A0A0A0A0A0A0A0A"); lazy_code = lazy_code.replace("js:", "").trim()
let encrypted = CryptoJS.AES.decrypt({ }
ciphertext: CryptoJS.enc.Base64.parse(data) print("开始执行js免嗅=>" + lazy_code);
}, key, { eval(lazy_code);
iv: iv, lazy_play = typeof input === "object" ? input : {
mode: CryptoJS.mode.CBC, parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
padding: CryptoJS.pad.Pkcs7 jx: tellIsJx(input),
}).toString(CryptoJS.enc.Utf8); url: input
return encrypted }
} } catch (e) {
let error_log = false; print(`js免嗅错误:${e.message}`);
lazy_play = common_play
function logger(text) { }
if (error_log) { } else {
log(text) lazy_play = common_play
} }
} if (Array.isArray(rule.play_json) && rule.play_json.length > 0) {
let decode_funcs = [text => { let web_url = lazy_play.url;
try { for (let pjson of rule.play_json) {
return ungzip(text) if (pjson.re && (pjson.re === "*" || web_url.match(new RegExp(pjson.re)))) {
} catch (e) { if (pjson.json && typeof pjson.json === "object") {
logger("非gzip加密"); let base_json = pjson.json;
return "" lazy_play = Object.assign(lazy_play, base_json);
} break
}, text => { }
try { }
return base64Decode(text) }
} catch (e) { } else if (rule.play_json && !Array.isArray(rule.play_json)) {
logger("非b64加密"); let base_json = {
return "" jx: 1,
} parse: 1
}, text => { };
try { lazy_play = Object.assign(lazy_play, base_json)
return aes_decrypt(text) } else if (!rule.play_json) {
} catch (e) { let base_json = {
logger("非aes加密"); jx: 0,
return "" parse: 1
} };
}, text => { lazy_play = Object.assign(lazy_play, base_json)
try { }
return RSA.decode(text, rsa_private_key, null) console.log(JSON.stringify(lazy_play));
} catch (e) { return JSON.stringify(lazy_play)
logger("非rsa加密"); }
return ""
} function proxyParse(proxyObj) {
}]; var input = proxyObj.params;
let func_index = 0; if (proxyObj.proxy_rule) {
while (!current_match.test(decode_content)) { log("准备执行本地代理规则:\n" + proxyObj.proxy_rule);
decode_content = decode_funcs[func_index](js_code); try {
func_index++; eval(proxyObj.proxy_rule);
if (func_index >= decode_funcs.length) { if (input && input !== proxyObj.params && Array.isArray(input) && input.length >= 3) {
break return input
} } else {
} return [404, "text/plain", "Not Found"]
return decode_content }
} } catch (e) {
return [500, "text/plain", "代理规则错误:" + e.message]
function runMain(main_func_code, arg) { }
let mainFunc = function() { } else {
return "" return [404, "text/plain", "Not Found"]
}; }
try { }
eval(main_func_code + "\nmainFunc=main;");
return mainFunc(arg) function isVideoParse(isVideoObj) {
} catch (e) { var input = isVideoObj.url;
log(`执行main_funct发生了错误:${e.message}`); if (!isVideoObj.t) {
return "" let re_matcher = new RegExp(isVideoObj.isVideo, "i");
} return re_matcher.test(input)
} } else {
try {
function init(ext) { eval(isVideoObj.isVideo);
console.log("init"); if (typeof input === "boolean") {
rule = {}; return input
rule_fetch_params = {}; } else {
fetch_params = null; return false
try { }
let muban = 模板.getMubans(); } catch (e) {
if (typeof ext == "object") { log(`执行嗅探规则发生错误:${e.message}`);
rule = ext return false
} else if (typeof ext == "string") { }
let is_file = ext.startsWith("file://"); }
if (ext.startsWith("http") || is_file) { }
let query = getQuery(ext);
if (is_file) { function removeHeader(content, options = {}) {
ext = ext.split("?")[0] const {
} mode = "header-only", fileType
let js = request(ext, { } = options;
method: "GET" const COMMENT_CONFIG = {
}); ".js": {
if (js) { start: "/*",
js = getOriginalJs(js); end: "*/",
eval("(function(){" + js.replace("var rule", "rule") + "})()") regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
} headerRegex: /@header\(([\s\S]*?)\)/,
if (query.type === "url" && query.params) { topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
if (is_file && /^http/.test(query.params)) { },
rule.params = query.params ".py": {
} else { start: '"""',
rule.params = urljoin(ext, query.params) end: '"""',
} regex: /^\s*"""([\s\S]*?)"""\s*/,
} else if (query.params) { headerRegex: /@header\(([\s\S]*?)\)/,
rule.params = query.params topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
} }
} else { };
ext = getOriginalJs(ext); if (!fileType) throw new Error("fileType option is required");
eval("(function(){" + ext.replace("var rule", "rule") + "})()") const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
} const config = COMMENT_CONFIG[ext];
} else { if (!config) throw new Error(`Unsupported file type: ${ext}`);
console.log(`规则加载失败,不支持的规则类型:${typeof ext}`); if (mode === "top-comments") {
return const match = content.match(config.topCommentsRegex);
} if (match) {
rule.host = (rule.host || "").rstrip("/"); return content.substring(match[0].length).trim()
HOST = rule.host; }
if (rule.hostJs) { return content.trim()
console.log(`检测到hostJs,准备执行...`); }
try { const match = content.match(config.regex);
eval(rule.hostJs); if (!match) return content.trim();
rule.host = HOST.rstrip("/") let [fullComment, innerContent] = match;
} catch (e) { if (config.headerRegex.test(innerContent)) {
console.log(`执行${rule.hostJs}获取host发生错误:${e.message}`) innerContent = innerContent.replace(config.headerRegex, "");
} const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
} if (!cleanedInner.trim()) {
if (rule["模板"] === "自动") { return content.replace(fullComment, "").trim()
try { } else {
let host_headers = rule["headers"] || {}; const newComment = `${config.start}${cleanedInner}${config.end}`;
let host_html = getCode(HOST, { return content.replace(fullComment, newComment).trim()
headers: host_headers }
}); }
let match_muban = ""; return content.trim()
let muban_keys = Object.keys(muban).filter(it => !/默认|短视2|采集1/.test(it)); }
for (let muban_key of muban_keys) {
try { function getOriginalJs(js_code) {
let host_data = JSON.parse(home({}, host_html, muban[muban_key].class_parse)); let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
if (host_data.class && host_data.class.length > 0) { if (current_match.test(js_code)) {
match_muban = muban_key; return js_code
console.log(`自动匹配模板:【${muban_key}`); }
break js_code = removeHeader(js_code, {
} mode: "top-comments",
} catch (e) { fileType: ".js"
console.log(`自动匹配模板:【${muban_key}】错误:${e.message}`) });
} let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
} let decode_content = "";
if (match_muban) {
muban["自动"] = muban[match_muban]; function aes_decrypt(data) {
if (rule["模板修改"] && rule["模板修改"].startsWith("js:")) { let key = CryptoJS.enc.Hex.parse("686A64686E780A0A0A0A0A0A0A0A0A0A");
eval(rule["模板修改"].replace("js:", "").trim()) let iv = CryptoJS.enc.Hex.parse("647A797964730A0A0A0A0A0A0A0A0A0A");
} let encrypted = CryptoJS.AES.decrypt({
} else { ciphertext: CryptoJS.enc.Base64.parse(data)
delete rule["模板"] }, key, {
} iv: iv,
} catch (e) { mode: CryptoJS.mode.CBC,
delete rule["模板"] padding: CryptoJS.pad.Pkcs7
} }).toString(CryptoJS.enc.Utf8);
} return encrypted
if (rule.模板 && muban.hasOwnProperty(rule.模板)) { }
print("继承模板:" + rule.模板); let error_log = false;
rule = Object.assign(muban[rule.模板], rule)
} function logger(text) {
let rule_cate_excludes = (rule.cate_exclude || "").split("|").filter(it => it.trim()); if (error_log) {
let rule_tab_excludes = (rule.tab_exclude || "").split("|").filter(it => it.trim()); log(text)
rule_cate_excludes = rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it => it.trim())); }
rule_tab_excludes = rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it => it.trim())); }
rule.cate_exclude = rule_cate_excludes.join("|"); let decode_funcs = [text => {
rule.tab_exclude = rule_tab_excludes.join("|"); try {
rule.类型 = rule.类型 || "影视"; return ungzip(text)
rule.url = rule.url || ""; } catch (e) {
rule.double = rule.double || false; logger("非gzip加密");
rule.homeUrl = rule.homeUrl || ""; return ""
rule.detailUrl = rule.detailUrl || ""; }
rule.searchUrl = rule.searchUrl || ""; }, text => {
rule.homeUrl = rule.host && rule.homeUrl ? urljoin(rule.host, rule.homeUrl) : rule.homeUrl || rule.host; try {
rule.homeUrl = cheerio.jinja2(rule.homeUrl, { return base64Decode(text)
rule: rule } catch (e) {
}); logger("非b64加密");
rule.detailUrl = rule.host && rule.detailUrl ? urljoin(rule.host, rule.detailUrl) : rule.detailUrl; return ""
rule.二级访问前 = rule.二级访问前 || ""; }
if (rule.url.includes("[") && rule.url.includes("]")) { }, text => {
let u1 = rule.url.split("[")[0]; try {
let u2 = rule.url.split("[")[1].split("]")[0]; return aes_decrypt(text)
rule.url = rule.host && rule.url ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.url } catch (e) {
} else { logger("非aes加密");
rule.url = rule.host && rule.url ? urljoin(rule.host, rule.url) : rule.url return ""
} }
if (rule.searchUrl.includes("[") && rule.searchUrl.includes("]") && !rule.searchUrl.includes("#")) { }, text => {
let u1 = rule.searchUrl.split("[")[0]; try {
let u2 = rule.searchUrl.split("[")[1].split("]")[0]; return RSA.decode(text, rsa_private_key, null)
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.searchUrl } catch (e) {
} else { logger("非rsa加密");
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, rule.searchUrl) : rule.searchUrl return ""
} }
rule.timeout = rule.timeout || 5e3; }];
rule.encoding = rule.编码 || rule.encoding || "utf-8"; let func_index = 0;
rule.search_encoding = rule.搜索编码 || rule.search_encoding || ""; while (!current_match.test(decode_content)) {
rule.图片来源 = rule.图片来源 || ""; decode_content = decode_funcs[func_index](js_code);
rule.图片替换 = rule.图片替换 || ""; func_index++;
rule.play_json = rule.hasOwnProperty("play_json") ? rule.play_json : []; if (func_index >= decode_funcs.length) {
rule.pagecount = rule.hasOwnProperty("pagecount") ? rule.pagecount : {}; break
rule.proxy_rule = rule.hasOwnProperty("proxy_rule") ? rule.proxy_rule : ""; }
if (!rule.hasOwnProperty("sniffer")) { }
rule.sniffer = false return decode_content
} }
rule.sniffer = rule.hasOwnProperty("sniffer") ? rule.sniffer : "";
rule.sniffer = !!(rule.sniffer && rule.sniffer !== "0" && rule.sniffer !== "false"); function runMain(main_func_code, arg) {
rule.isVideo = rule.hasOwnProperty("isVideo") ? rule.isVideo : ""; let mainFunc = function() {
if (rule.sniffer && !rule.isVideo) { return ""
rule.isVideo = "http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*" };
} try {
rule.tab_remove = rule.hasOwnProperty("tab_remove") ? rule.tab_remove : []; eval(main_func_code + "\nmainFunc=main;");
rule.tab_order = rule.hasOwnProperty("tab_order") ? rule.tab_order : []; return mainFunc(arg)
rule.tab_rename = rule.hasOwnProperty("tab_rename") ? rule.tab_rename : {}; } catch (e) {
if (rule.headers && typeof rule.headers === "object") { log(`执行main_funct发生了错误:${e.message}`);
try { return ""
let header_keys = Object.keys(rule.headers); }
for (let k of header_keys) { }
if (k.toLowerCase() === "user-agent") {
let v = rule.headers[k]; function init(ext) {
console.log(v); console.log("init");
if (["MOBILE_UA", "PC_UA", "UC_UA", "IOS_UA", "UA"].includes(v)) { rule = {};
rule.headers[k] = eval(v) rule_fetch_params = {};
} fetch_params = null;
} else if (k.toLowerCase() === "cookie") { try {
let v = rule.headers[k]; let muban = 模板.getMubans();
if (v && v.startsWith("http")) { if (typeof ext == "object") {
console.log(v); rule = ext
try { } else if (typeof ext == "string") {
v = fetch(v); let is_file = ext.startsWith("file://");
console.log(v); if (ext.startsWith("http") || is_file) {
rule.headers[k] = v let query = getQuery(ext);
} catch (e) { if (is_file) {
console.log(`${v}获取cookie发生错误:${e.message}`) ext = ext.split("?")[0]
} }
} let js = request(ext, {
} method: "GET"
} });
} catch (e) { if (js) {
console.log(`处理headers发生错误:${e.message}`) js = getOriginalJs(js);
} eval("(function(){" + js.replace("var rule", "rule") + "})()")
} else { }
rule.headers = {} if (query.type === "url" && query.params) {
} if (is_file && /^http/.test(query.params)) {
oheaders = deepCopy(rule.headers); rule.params = query.params
rule_fetch_params = { } else {
headers: rule.headers, rule.params = urljoin(ext, query.params)
timeout: rule.timeout, }
encoding: rule.encoding } else if (query.params) {
}; rule.params = query.params
RKEY = typeof key !== "undefined" && key ? key : "drpy_" + (rule.title || rule.host); }
pre(); } else {
init_test() ext = getOriginalJs(ext);
} catch (e) { eval("(function(){" + ext.replace("var rule", "rule") + "})()")
console.log(`init_test发生错误:${e.message}`) }
} } else {
} console.log(`规则加载失败,不支持的规则类型:${typeof ext}`);
let homeHtmlCache = undefined; return
}
function home(filter, home_html, class_parse) { rule.host = (rule.host || "").rstrip("/");
console.log("home"); HOST = rule.host;
home_html = home_html || ""; if (rule.hostJs) {
class_parse = class_parse || ""; console.log(`检测到hostJs,准备执行...`);
if (typeof rule.filter === "string" && rule.filter.trim().length > 0) { try {
try { eval(rule.hostJs);
let filter_json = ungzip(rule.filter.trim()); rule.host = HOST.rstrip("/")
rule.filter = JSON.parse(filter_json) } catch (e) {
} catch (e) { console.log(`执行${rule.hostJs}获取host发生错误:${e.message}`)
rule.filter = {} }
} }
} if (rule["模板"] === "自动") {
let homeObj = { try {
filter: rule.filter || false, let host_headers = rule["headers"] || {};
MY_URL: rule.homeUrl, let host_html = getCode(HOST, {
class_name: rule.class_name || "", headers: host_headers
class_url: rule.class_url || "", });
class_parse: class_parse || rule.class_parse || "", let match_muban = "";
cate_exclude: rule.cate_exclude, let muban_keys = Object.keys(muban).filter(it => !/默认|短视2|采集1/.test(it));
home_html: home_html for (let muban_key of muban_keys) {
}; try {
return homeParse(homeObj) let host_data = JSON.parse(home({}, host_html, muban[muban_key].class_parse));
} if (host_data.class && host_data.class.length > 0) {
match_muban = muban_key;
function homeVod(params) { console.log(`自动匹配模板:【${muban_key}`);
console.log("homeVod"); break
let homeVodObj = { }
"推荐": rule.推荐, } catch (e) {
double: rule.double, console.log(`自动匹配模板:【${muban_key}】错误:${e.message}`)
homeUrl: rule.homeUrl, }
detailUrl: rule.detailUrl }
}; if (match_muban) {
return homeVodParse(homeVodObj) muban["自动"] = muban[match_muban];
} if (rule["模板修改"] && rule["模板修改"].startsWith("js:")) {
eval(rule["模板修改"].replace("js:", "").trim())
function category(tid, pg, filter, extend) { }
let cateObj = { } else {
url: rule.url, delete rule["模板"]
"一级": rule.一级, }
tid: tid, } catch (e) {
pg: parseInt(pg), delete rule["模板"]
filter: filter, }
extend: extend }
}; if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
return categoryParse(cateObj) print("继承模板:" + rule.模板);
} rule = Object.assign(muban[rule.模板], rule)
}
function detail(vod_url) { let rule_cate_excludes = (rule.cate_exclude || "").split("|").filter(it => it.trim());
let orId = vod_url; let rule_tab_excludes = (rule.tab_exclude || "").split("|").filter(it => it.trim());
let fyclass = ""; rule_cate_excludes = rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it => it.trim()));
log("orId:" + orId); rule_tab_excludes = rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it => it.trim()));
if (vod_url.indexOf("$") > -1) { rule.cate_exclude = rule_cate_excludes.join("|");
let tmp = vod_url.split("$"); rule.tab_exclude = rule_tab_excludes.join("|");
fyclass = tmp[0]; rule.类型 = rule.类型 || "影视";
vod_url = tmp[1] rule.url = rule.url || "";
} rule.double = rule.double || false;
let detailUrl = vod_url.split("@@")[0]; rule.homeUrl = rule.homeUrl || "";
let url; rule.detailUrl = rule.detailUrl || "";
if (!detailUrl.startsWith("http") && !detailUrl.includes("/")) { rule.searchUrl = rule.searchUrl || "";
url = rule.detailUrl.replaceAll("fyid", detailUrl).replaceAll("fyclass", fyclass) rule.homeUrl = rule.host && rule.homeUrl ? urljoin(rule.host, rule.homeUrl) : rule.homeUrl || rule.host;
} else if (detailUrl.includes("/")) { rule.homeUrl = cheerio.jinja2(rule.homeUrl, {
url = urljoin(rule.homeUrl, detailUrl) rule: rule
} else { });
url = detailUrl rule.detailUrl = rule.host && rule.detailUrl ? urljoin(rule.host, rule.detailUrl) : rule.detailUrl;
} rule.二级访问前 = rule.二级访问前 || "";
let detailObj = { if (rule.url.includes("[") && rule.url.includes("]")) {
orId: orId, let u1 = rule.url.split("[")[0];
url: url, let u2 = rule.url.split("[")[1].split("]")[0];
"二级": rule.二级, rule.url = rule.host && rule.url ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.url
"二级访问前": rule.二级访问前, } else {
detailUrl: detailUrl, rule.url = rule.host && rule.url ? urljoin(rule.host, rule.url) : rule.url
fyclass: fyclass, }
tab_exclude: rule.tab_exclude if (rule.searchUrl.includes("[") && rule.searchUrl.includes("]") && !rule.searchUrl.includes("#")) {
}; let u1 = rule.searchUrl.split("[")[0];
return detailParse(detailObj) let u2 = rule.searchUrl.split("[")[1].split("]")[0];
} rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.searchUrl
} else {
function play(flag, id, flags) { rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, rule.searchUrl) : rule.searchUrl
let playObj = { }
url: id, rule.timeout = rule.timeout || 5e3;
flag: flag, rule.encoding = rule.编码 || rule.encoding || "utf-8";
flags: flags rule.search_encoding = rule.搜索编码 || rule.search_encoding || "";
}; rule.图片来源 = rule.图片来源 || "";
return playParse(playObj) rule.图片替换 = rule.图片替换 || "";
} rule.play_json = rule.hasOwnProperty("play_json") ? rule.play_json : [];
rule.pagecount = rule.hasOwnProperty("pagecount") ? rule.pagecount : {};
function search(wd, quick, pg) { rule.proxy_rule = rule.hasOwnProperty("proxy_rule") ? rule.proxy_rule : "";
if (rule.search_encoding) { if (!rule.hasOwnProperty("sniffer")) {
if (rule.search_encoding.toLowerCase() !== "utf-8") { rule.sniffer = false
wd = encodeStr(wd, rule.search_encoding) }
} rule.sniffer = rule.hasOwnProperty("sniffer") ? rule.sniffer : "";
} else if (rule.encoding && rule.encoding.toLowerCase() !== "utf-8") { rule.sniffer = !!(rule.sniffer && rule.sniffer !== "0" && rule.sniffer !== "false");
wd = encodeStr(wd, rule.encoding) rule.isVideo = rule.hasOwnProperty("isVideo") ? rule.isVideo : "";
} if (rule.sniffer && !rule.isVideo) {
let searchObj = { rule.isVideo = "http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*"
searchUrl: rule.searchUrl, }
"搜索": rule.搜索, rule.tab_remove = rule.hasOwnProperty("tab_remove") ? rule.tab_remove : [];
wd: wd, rule.tab_order = rule.hasOwnProperty("tab_order") ? rule.tab_order : [];
pg: pg || 1, rule.tab_rename = rule.hasOwnProperty("tab_rename") ? rule.tab_rename : {};
quick: quick if (rule.headers && typeof rule.headers === "object") {
}; try {
return searchParse(searchObj) let header_keys = Object.keys(rule.headers);
} for (let k of header_keys) {
if (k.toLowerCase() === "user-agent") {
function proxy(params) { let v = rule.headers[k];
if (rule.proxy_rule && rule.proxy_rule.trim()) { console.log(v);
rule.proxy_rule = rule.proxy_rule.trim() if (["MOBILE_UA", "PC_UA", "UC_UA", "IOS_UA", "UA"].includes(v)) {
} rule.headers[k] = eval(v)
if (rule.proxy_rule.startsWith("js:")) { }
rule.proxy_rule = rule.proxy_rule.replace("js:", "") } else if (k.toLowerCase() === "cookie") {
} let v = rule.headers[k];
let proxyObj = { if (v && v.startsWith("http")) {
params: params, console.log(v);
proxy_rule: rule.proxy_rule try {
}; v = fetch(v);
return proxyParse(proxyObj) console.log(v);
} rule.headers[k] = v
} catch (e) {
function sniffer() { console.log(`${v}获取cookie发生错误:${e.message}`)
let enable_sniffer = rule.sniffer || false; }
if (enable_sniffer) { }
log("开始执行辅助嗅探代理规则...") }
} }
return enable_sniffer } catch (e) {
} console.log(`处理headers发生错误:${e.message}`)
}
function isVideo(url) { } else {
let t = 0; rule.headers = {}
let is_video; }
if (rule.isVideo && rule.isVideo.trim()) { oheaders = deepCopy(rule.headers);
is_video = rule.isVideo.trim() rule_fetch_params = {
} headers: rule.headers,
if (is_video.startsWith("js:")) { timeout: rule.timeout,
is_video = is_video.replace("js:", ""); encoding: rule.encoding
t = 1 };
} RKEY = typeof key !== "undefined" && key ? key : "drpy_" + (rule.title || rule.host);
let isVideoObj = { pre();
url: url, init_test()
isVideo: is_video, } catch (e) {
t: t console.log(`init_test发生错误:${e.message}`)
}; }
let result = isVideoParse(isVideoObj); }
if (result) { let homeHtmlCache = undefined;
log("成功执行辅助嗅探规则并检测到视频地址:\n" + rule.isVideo)
} function home(filter, home_html, class_parse) {
return result console.log("home");
} home_html = home_html || "";
class_parse = class_parse || "";
function getRule(key) { if (typeof rule.filter === "string" && rule.filter.trim().length > 0) {
return key ? rule[key] || "" : rule try {
} let filter_json = ungzip(rule.filter.trim());
rule.filter = JSON.parse(filter_json)
function deepCopy(_obj) { } catch (e) {
return JSON.parse(JSON.stringify(_obj)) rule.filter = {}
} }
}
function matchesAll(str, pattern, flatten) { let homeObj = {
if (!pattern.global) { filter: rule.filter || false,
pattern = new RegExp(pattern.source, "g" + (pattern.ignoreCase ? "i" : "") + (pattern.multiline ? "m" : "")) MY_URL: rule.homeUrl,
} class_name: rule.class_name || "",
var matches = []; class_url: rule.class_url || "",
var match; class_parse: class_parse || rule.class_parse || "",
while ((match = pattern.exec(str)) !== null) { cate_exclude: rule.cate_exclude,
matches.push(match) home_html: home_html
} };
return flatten ? matches.flat() : matches return homeParse(homeObj)
} }
function stringUtils() { function homeVod(params) {
Object.defineProperties(String.prototype, { console.log("homeVod");
replaceX: { let homeVodObj = {
value: function(regex, replacement) { "推荐": rule.推荐,
let matches = matchesAll(this, regex, true); double: rule.double,
if (matches && matches.length > 1) { homeUrl: rule.homeUrl,
const hasCaptureGroup = /\$\d/.test(replacement); detailUrl: rule.detailUrl
if (hasCaptureGroup) { };
return this.replace(regex, m => m.replace(regex, replacement)) return homeVodParse(homeVodObj)
} else { }
return this.replace(regex, (m, p1) => m.replace(p1, replacement))
} function category(tid, pg, filter, extend) {
} let cateObj = {
return this.replace(regex, replacement) url: rule.url,
}, "一级": rule.一级,
configurable: true, tid: tid,
enumerable: false, pg: parseInt(pg),
writable: true filter: filter,
}, extend: extend
parseX: { };
get: function() { return categoryParse(cateObj)
try { }
return JSON.parse(this)
} catch (e) { function detail(vod_url) {
console.log(e.message); let orId = vod_url;
return this.startsWith("[") ? [] : {} let fyclass = "";
} log("orId:" + orId);
}, if (vod_url.indexOf("$") > -1) {
configurable: true, let tmp = vod_url.split("$");
enumerable: false fyclass = tmp[0];
} vod_url = tmp[1]
}) }
} let detailUrl = vod_url.split("@@")[0];
let url;
function cut(text, start, end, method, All) { if (!detailUrl.startsWith("http") && !detailUrl.includes("/")) {
let result = ""; url = rule.detailUrl.replaceAll("fyid", detailUrl).replaceAll("fyclass", fyclass)
let c = (t, s, e) => { } else if (detailUrl.includes("/")) {
let result = ""; url = urljoin(rule.homeUrl, detailUrl)
let rs = []; } else {
let results = []; url = detailUrl
try { }
let lr = new RegExp(String.raw`${s}`.toString()); let detailObj = {
let rr = new RegExp(String.raw`${e}`.toString()); orId: orId,
const segments = t.split(lr); url: url,
if (segments.length < 2) return ""; "二级": rule.二级,
let cutSegments = segments.slice(1).map(segment => { "二级访问前": rule.二级访问前,
let splitSegment = segment.split(rr); detailUrl: detailUrl,
return splitSegment.length < 2 ? undefined : splitSegment[0] + e fyclass: fyclass,
}).filter(f => f); tab_exclude: rule.tab_exclude
if (All) { };
return `[${cutSegments.join(",")}]` return detailParse(detailObj)
} else { }
return cutSegments[0]
} function play(flag, id, flags) {
} catch (e) { let playObj = {
console.log(`Error cutting text:${e.message}`) url: id,
} flag: flag,
return result flags: flags
}; };
result = c(text, start, end); return playParse(playObj)
stringUtils(); }
if (method && typeof method === "function") {
result = method(result) function search(wd, quick, pg) {
} if (rule.search_encoding) {
return result if (rule.search_encoding.toLowerCase() !== "utf-8") {
} wd = encodeStr(wd, rule.search_encoding)
}
function DRPY() { } else if (rule.encoding && rule.encoding.toLowerCase() !== "utf-8") {
return { wd = encodeStr(wd, rule.encoding)
runMain: runMain, }
getRule: getRule, let searchObj = {
init: init, searchUrl: rule.searchUrl,
home: home, "搜索": rule.搜索,
homeVod: homeVod, wd: wd,
category: category, pg: pg || 1,
detail: detail, quick: quick
play: play, };
search: search, return searchParse(searchObj)
proxy: proxy, }
sniffer: sniffer,
isVideo: isVideo, function proxy(params) {
fixAdM3u8Ai: fixAdM3u8Ai if (rule.proxy_rule && rule.proxy_rule.trim()) {
} rule.proxy_rule = rule.proxy_rule.trim()
} }
export default { if (rule.proxy_rule.startsWith("js:")) {
runMain: runMain, rule.proxy_rule = rule.proxy_rule.replace("js:", "")
getRule: getRule, }
init: init, let proxyObj = {
home: home, params: params,
homeVod: homeVod, proxy_rule: rule.proxy_rule
category: category, };
detail: detail, return proxyParse(proxyObj)
play: play, }
search: search,
proxy: proxy, function sniffer() {
sniffer: sniffer, let enable_sniffer = rule.sniffer || false;
isVideo: isVideo, if (enable_sniffer) {
fixAdM3u8Ai: fixAdM3u8Ai, log("开始执行辅助嗅探代理规则...")
DRPY: DRPY }
return enable_sniffer
}
function isVideo(url) {
let t = 0;
let is_video;
if (rule.isVideo && rule.isVideo.trim()) {
is_video = rule.isVideo.trim()
}
if (is_video.startsWith("js:")) {
is_video = is_video.replace("js:", "");
t = 1
}
let isVideoObj = {
url: url,
isVideo: is_video,
t: t
};
let result = isVideoParse(isVideoObj);
if (result) {
log("成功执行辅助嗅探规则并检测到视频地址:\n" + rule.isVideo)
}
return result
}
function getRule(key) {
return key ? rule[key] || "" : rule
}
function deepCopy(_obj) {
return JSON.parse(JSON.stringify(_obj))
}
function matchesAll(str, pattern, flatten) {
if (!pattern.global) {
pattern = new RegExp(pattern.source, "g" + (pattern.ignoreCase ? "i" : "") + (pattern.multiline ? "m" : ""))
}
var matches = [];
var match;
while ((match = pattern.exec(str)) !== null) {
matches.push(match)
}
return flatten ? matches.flat() : matches
}
function stringUtils() {
Object.defineProperties(String.prototype, {
replaceX: {
value: function(regex, replacement) {
let matches = matchesAll(this, regex, true);
if (matches && matches.length > 1) {
const hasCaptureGroup = /\$\d/.test(replacement);
if (hasCaptureGroup) {
return this.replace(regex, m => m.replace(regex, replacement))
} else {
return this.replace(regex, (m, p1) => m.replace(p1, replacement))
}
}
return this.replace(regex, replacement)
},
configurable: true,
enumerable: false,
writable: true
},
parseX: {
get: function() {
try {
return JSON.parse(this)
} catch (e) {
console.log(e.message);
return this.startsWith("[") ? [] : {}
}
},
configurable: true,
enumerable: false
}
})
}
function cut(text, start, end, method, All) {
let result = "";
let c = (t, s, e) => {
let result = "";
let rs = [];
let results = [];
try {
let lr = new RegExp(String.raw`${s}`.toString());
let rr = new RegExp(String.raw`${e}`.toString());
const segments = t.split(lr);
if (segments.length < 2) return "";
let cutSegments = segments.slice(1).map(segment => {
let splitSegment = segment.split(rr);
return splitSegment.length < 2 ? undefined : splitSegment[0] + e
}).filter(f => f);
if (All) {
return `[${cutSegments.join(",")}]`
} else {
return cutSegments[0]
}
} catch (e) {
console.log(`Error cutting text:${e.message}`)
}
return result
};
result = c(text, start, end);
stringUtils();
if (method && typeof method === "function") {
result = method(result)
}
return result
}
function DRPY() {
return {
runMain: runMain,
getRule: getRule,
init: init,
home: home,
homeVod: homeVod,
category: category,
detail: detail,
play: play,
search: search,
proxy: proxy,
sniffer: sniffer,
isVideo: isVideo,
fixAdM3u8Ai: fixAdM3u8Ai
}
}
export default {
runMain: runMain,
getRule: getRule,
init: init,
home: home,
homeVod: homeVod,
category: category,
detail: detail,
play: play,
search: search,
proxy: proxy,
sniffer: sniffer,
isVideo: isVideo,
fixAdM3u8Ai: fixAdM3u8Ai,
DRPY: DRPY
}; };
File diff suppressed because one or more lines are too long
+119 -26
View File
@@ -1,26 +1,42 @@
import cheerio from "assets://js/lib/cheerio.min.js";
import "assets://js/lib/crypto-js.js";
import "./jsencrypt.js";
import "./node-rsa.js";
import "./pako.min.js";
import 模板 from "./模板.js";
import { import {
gbkTool cheerio,
} from "./gbk.js"; 模板
import "./json5.js"; } from "./drpy-core-lite.min.js";
import "./jinja.js";
const _jinja2 = cheerio.jinja2;
cheerio.jinja2 = function(template, obj) {
try {
return jinja.render(template, obj)
} catch (e) {
console.log("新的jinja2库渲染失败,换回原始cheerio:" + e.message);
return _jinja2(template, obj)
}
};
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2"; let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
const VERSION = vercode + " 3.9.51beta6 20241126"; const VERSION = vercode + " 3.9.52beta3 20250801";
const UpdateInfo = [{ const UpdateInfo = [{
date: "20250801",
title: "drpy依赖更新,使用drpy-core-lite.min.js",
version: "3.9.52beta3 20250801",
msg: `
drpy-core.min.js 更换为更小的drpy-core-lite.min.js
`
}, {
date: "20250729",
title: "drpy更新,所有依赖打包成一个js文件",
version: "3.9.52beta2 20250729",
msg: `
1. wasm支持
2. 引入 TextEncoder、TextDecoder对象
3. 引入 WXXH 加解密库
4. 所有依赖打包成一个js
5. 增加 buildQueryString
`
}, {
date: "20250728",
title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
version: "3.9.52beta1 20250728",
msg: `
1. 增加tab_order线路模糊排序
2. 优化解密算法支持文件头
3. wasm支持
4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
5. 引入 TextEncoder、TextDecoder对象
6. 引入 WXXH 加解密库
`
}, {
date: "20241126", date: "20241126",
title: "drpy更新,优化去广告算法", title: "drpy更新,优化去广告算法",
version: "3.9.51beta6 20241126", version: "3.9.51beta6 20241126",
@@ -708,8 +724,7 @@ function ungzip(b64Data) {
function encodeStr(input, encoding) { function encodeStr(input, encoding) {
encoding = encoding || "gbk"; encoding = encoding || "gbk";
if (encoding.startsWith("gb")) { if (encoding.startsWith("gb")) {
const strTool = gbkTool(); input = gbkTool.encode(input)
input = strTool.encode(input)
} }
return input return input
} }
@@ -717,8 +732,7 @@ function encodeStr(input, encoding) {
function decodeStr(input, encoding) { function decodeStr(input, encoding) {
encoding = encoding || "gbk"; encoding = encoding || "gbk";
if (encoding.startsWith("gb")) { if (encoding.startsWith("gb")) {
const strTool = gbkTool(); input = gbkTool.decode(input)
input = strTool.decode(input)
} }
return input return input
} }
@@ -1351,6 +1365,24 @@ function keysToLowerCase(obj) {
}, {}) }, {})
} }
function buildQueryString(params) {
const queryArray = [];
for (const key in params) {
if (params.hasOwnProperty(key)) {
let value = params[key];
if (value === undefined || value === null) {
value = ""
} else {
value = value.toString()
}
const encodedKey = encodeURIComponent(key);
const encodedValue = encodeURIComponent(value);
queryArray.push(encodedKey + "=" + encodedValue)
}
}
return queryArray.join("&")
}
function parseQueryString(query) { function parseQueryString(query) {
const params = {}; const params = {};
query.split("&").forEach(function(part) { query.split("&").forEach(function(part) {
@@ -2442,7 +2474,17 @@ function vodDeal(vod) {
if (rule.tab_order && rule.tab_order.length > 0) { if (rule.tab_order && rule.tab_order.length > 0) {
let tab_order = rule.tab_order; let tab_order = rule.tab_order;
tab_ordered_list = tab_removed_list.sort((a, b) => { tab_ordered_list = tab_removed_list.sort((a, b) => {
return (tab_order.indexOf(a) === -1 ? 9999 : tab_order.indexOf(a)) - (tab_order.indexOf(b) === -1 ? 9999 : tab_order.indexOf(b)) const getOrderIndex = (tabName, orderRules) => {
for (let i = 0; i < orderRules.length; i++) {
if (tabName.includes(orderRules[i])) {
return i
}
}
return 9999
};
const indexA = getOrderIndex(a, tab_order);
const indexB = getOrderIndex(b, tab_order);
return indexA - indexB
}); });
tab_list = tab_ordered_list tab_list = tab_ordered_list
} }
@@ -2574,11 +2616,62 @@ function isVideoParse(isVideoObj) {
} }
} }
function removeHeader(content, options = {}) {
const {
mode = "header-only", fileType
} = options;
const COMMENT_CONFIG = {
".js": {
start: "/*",
end: "*/",
regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
headerRegex: /@header\(([\s\S]*?)\)/,
topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
},
".py": {
start: '"""',
end: '"""',
regex: /^\s*"""([\s\S]*?)"""\s*/,
headerRegex: /@header\(([\s\S]*?)\)/,
topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
}
};
if (!fileType) throw new Error("fileType option is required");
const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
const config = COMMENT_CONFIG[ext];
if (!config) throw new Error(`Unsupported file type: ${ext}`);
if (mode === "top-comments") {
const match = content.match(config.topCommentsRegex);
if (match) {
return content.substring(match[0].length).trim()
}
return content.trim()
}
const match = content.match(config.regex);
if (!match) return content.trim();
let [fullComment, innerContent] = match;
if (config.headerRegex.test(innerContent)) {
innerContent = innerContent.replace(config.headerRegex, "");
const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
if (!cleanedInner.trim()) {
return content.replace(fullComment, "").trim()
} else {
const newComment = `${config.start}${cleanedInner}${config.end}`;
return content.replace(fullComment, newComment).trim()
}
}
return content.trim()
}
function getOriginalJs(js_code) { function getOriginalJs(js_code) {
let current_match = /var rule|[\u4E00-\u9FA5]+|function|let |var |const |\(|\)|"|'/; let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
if (current_match.test(js_code)) { if (current_match.test(js_code)) {
return js_code return js_code
} }
js_code = removeHeader(js_code, {
mode: "top-comments",
fileType: ".js"
});
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs="; let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
let decode_content = ""; let decode_content = "";
+1 -1
View File
@@ -31,7 +31,7 @@ var rule = {
img: 'img&&src', img: 'img&&src',
desc: '.card-text:eq(2)&&Text;;;;', desc: '.card-text:eq(2)&&Text;;;;',
content: 'body&&.semi-space-loose-vertical&&a&&href', content: 'body&&.semi-space-loose-vertical&&a&&href',
tabs: "js:TABS = ['懒盘']", tabs: "js:TABS = ['爱搜']",
lists: "js:\n LISTS = [];\n let lists1 = pdfa(html, 'body&&.semi-space-loose-vertical').map(it => {\n let _tt = pdfh(it, 'span&&title');\n let _uu = pdfh(it, 'a&&href');\n return _tt + '$' + _uu;\n });\n LISTS.push(lists1);\n ", lists: "js:\n LISTS = [];\n let lists1 = pdfa(html, 'body&&.semi-space-loose-vertical').map(it => {\n let _tt = pdfh(it, 'span&&title');\n let _uu = pdfh(it, 'a&&href');\n return _tt + '$' + _uu;\n });\n LISTS.push(lists1);\n ",
}, },
搜索: 'js:\n let html = fetch(input);\n let list = pdfa(html, "body&&.semi-space-medium-vertical");\n VODS = list.map(x => {\n let remarks = pdfh(x, "div&&img&&alt");\n // 过滤掉包含"迅雷云盘"的内容\n if(remarks.includes("迅雷云盘") || remarks.includes("115") || remarks.includes("阿里")) return null;let vodName = pdfh(x, "div&&a&&title");\n // 过滤条件:迅雷云盘、.txt后缀、空名称\n if(vodName.endsWith(".zip") || vodName.endsWith(".txt") || !vodName.trim()) return null;\n return {\n vod_name: pdfh(x, "div&&a&&title"),\n vod_pic: \'\',\n vod_remarks: remarks,\n vod_content: remarks,\n vod_id: pdfh(x, "div&&a&&href")\n }\n }).filter(x => x !== null);\n ', 搜索: 'js:\n let html = fetch(input);\n let list = pdfa(html, "body&&.semi-space-medium-vertical");\n VODS = list.map(x => {\n let remarks = pdfh(x, "div&&img&&alt");\n // 过滤掉包含"迅雷云盘"的内容\n if(remarks.includes("迅雷云盘") || remarks.includes("115") || remarks.includes("阿里")) return null;let vodName = pdfh(x, "div&&a&&title");\n // 过滤条件:迅雷云盘、.txt后缀、空名称\n if(vodName.endsWith(".zip") || vodName.endsWith(".txt") || !vodName.trim()) return null;\n return {\n vod_name: pdfh(x, "div&&a&&title"),\n vod_pic: \'\',\n vod_remarks: remarks,\n vod_content: remarks,\n vod_id: pdfh(x, "div&&a&&href")\n }\n }).filter(x => x !== null);\n ',
+329
View File
@@ -0,0 +1,329 @@
# coding=utf-8
# !/usr/bin/python
"""
作者 丢丢喵推荐 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
====================Diudiumiao====================
"""
from Crypto.Util.Padding import unpad
from Crypto.Util.Padding import pad
from urllib.parse import unquote
from Crypto.Cipher import ARC4
from urllib.parse import quote
from base.spider import Spider
from Crypto.Cipher import AES
from datetime import datetime
from bs4 import BeautifulSoup
from base64 import b64decode
import urllib.request
import urllib.parse
import datetime
import binascii
import requests
import base64
import json
import time
import sys
import re
import os
sys.path.append('..')
xurl = "https://djw1.com"
headerx = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36'
}
class Spider(Spider):
global xurl
global headerx
def getName(self):
return "首页"
def init(self, extend):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
if pl == 3:
plx = []
while True:
start_index = text.find(start_str)
if start_index == -1:
break
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
break
middle_text = text[start_index + len(start_str):end_index]
plx.append(middle_text)
text = text.replace(start_str + middle_text + end_str, '')
if len(plx) > 0:
purl = ''
for i in range(len(plx)):
matches = re.findall(start_index1, plx[i])
output = ""
for match in matches:
match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
if match3:
number = match3.group(1)
else:
number = 0
if 'http' not in match[0]:
output += f"#{match[1]}${number}{xurl}{match[0]}"
else:
output += f"#{match[1]}${number}{match[0]}"
output = output[1:]
purl = purl + output + "$$$"
purl = purl[:-3]
return purl
else:
return ""
else:
start_index = text.find(start_str)
if start_index == -1:
return ""
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
return ""
if pl == 0:
middle_text = text[start_index + len(start_str):end_index]
return middle_text.replace("\\", "")
if pl == 1:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
jg = ' '.join(matches)
return jg
if pl == 2:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
new_list = [f'{item}' for item in matches]
jg = '$$$'.join(new_list)
return jg
def homeContent(self, filter):
result = {"class": []}
detail = requests.get(url=xurl + "/all/", headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('section', class_="container items")
for soup in soups:
vods = soup.find_all('li')
for vod in vods:
id = vod.find('a')['href']
name = vod.text.strip()
result["class"].append({"type_id": id, "type_name": "" + name})
return result
def homeVideoContent(self):
pass
def categoryContent(self, cid, pg, filter, ext):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{cid}page/{str(page)}/'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('section', class_="container items")
for soup in soups:
vods = soup.find_all('li')
for vod in vods:
name = vod.find('img')['alt']
ids = vod.find('a', class_="image-line")
id = ids['href']
pic = vod.find('img')['src']
remark = self.extract_middle_text(str(vod), 'class="remarks light">', '<', 0)
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": '▶️' + remark
}
videos.append(video)
result = {'list': videos}
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
did = ids[0]
result = {}
videos = []
xianlu = ''
bofang = ''
if 'http' not in did:
did = xurl + did
res = requests.get(url=did, headers=headerx)
res.encoding = "utf-8"
res = res.text
doc = BeautifulSoup(res, "lxml")
url = 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1732707176882/jiduo.txt'
response = requests.get(url)
response.encoding = 'utf-8'
code = response.text
name = self.extract_middle_text(code, "s1='", "'", 0)
Jumps = self.extract_middle_text(code, "s2='", "'", 0)
content = '集多为您介绍剧情📢' + self.extract_middle_text(res,'class="info-detail">','<', 0)
remarks = self.extract_middle_text(res, 'class="info-mark">', '<', 0)
year = self.extract_middle_text(res, 'class="info-addtime">', '<', 0)
if name not in content:
bofang = Jumps
xianlu = '1'
else:
soups = doc.find('div', class_="ep-list-items")
soup = soups.find_all('a')
for sou in soup:
id = sou['href']
name = sou.text.strip()
bofang = bofang + name + '$' + id + '#'
bofang = bofang[:-1]
xianlu = '专线'
videos.append({
"vod_id": did,
"vod_remarks": remarks,
"vod_year": year,
"vod_content": content,
"vod_play_from": xianlu,
"vod_play_url": bofang
})
result['list'] = videos
return result
def playerContent(self, flag, id, vipFlags):
res = requests.get(url=id, headers=headerx)
res.encoding = "utf-8"
res = res.text
url = self.extract_middle_text(res, '"wwm3u8":"', '"', 0).replace('\\', '')
result = {}
result["parse"] = 0
result["playUrl"] = ''
result["url"] = url
result["header"] = headerx
return result
def searchContentPage(self, key, quick, pg):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/search/{key}/page/{str(page)}/'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('section', class_="container items")
for soup in soups:
vods = soup.find_all('li')
for vod in vods:
name = vod.find('img')['alt']
ids = vod.find('a', class_="image-line")
id = ids['href']
pic = vod.find('img')['src']
remark = self.extract_middle_text(str(vod), 'class="remarks light">', '<', 0)
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": '▶️' + remark
}
videos.append(video)
result['list'] = videos
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def searchContent(self, key, quick, pg="1"):
return self.searchContentPage(key, quick, '1')
def localProxy(self, params):
if params['type'] == "m3u8":
return self.proxyM3u8(params)
elif params['type'] == "media":
return self.proxyMedia(params)
elif params['type'] == "ts":
return self.proxyTs(params)
return None
BIN
View File
Binary file not shown.