diff --git a/0821.json b/0821.json
index b4cec9e2..1e79050d 100644
--- a/0821.json
+++ b/0821.json
@@ -21,17 +21,17 @@
{"key":"豆豆","name":"豆瓣┃搜索","type": 3, "api": "csp_DouDou","searchable": 0,"quickSearch": 0,"filterable": 0},
{"key":"drpy_js_磁力熊搜索","name":"磁力熊┃搜索[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/cilixiong.js","searchable":0,"quickSearch":0,"changeable":1},
{"key":"lf_js_search","name":"路飞┃搜索[js]","type":3,"searchable":0,"changeable":1,"quickSearch":0,"filterable":0,"api":"./lib/lf_search3_min.js"},
-{"key":"drpy_js_新片场","name":"新片┃新片场[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/新片场.js"},
-{"key":"csp_YGP","name":"新片┃预告片","type":3,"api":"csp_YGP","searchable":1,"quickSearch":1,"changeable":0},
-{"key":"csp_Bili","name":"哔哔┃合集","type":3,"api":"csp_Bili","searchable":1,"quickSearch":1,"style":{"type":"rect","ratio":1.597},"filterable":1,"changeable":0,"ext":"./json/chuqiuyu.json"},
-{"key":"csp_xuexi","name":"哔哔┃学习园地","type":"3","api":"csp_Bili","searchable":"0","quickSearch":"0","style":{"type":"rect","ratio":1.597},"filterable":"1","changeable":0,"ext":"./json/bili.json"},
+{"key":"drpy_js_新片场","name":"新片场┃新片[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/新片场.js"},
+{"key":"csp_YGP","name":"预告片┃新片","type":3,"api":"csp_YGP","searchable":1,"quickSearch":1,"changeable":0},
+{"key":"csp_Bili","name":"哔哩┃合集","type":3,"api":"csp_Bili","searchable":1,"quickSearch":1,"style":{"type":"rect","ratio":1.597},"filterable":1,"changeable":0,"ext":"./json/chuqiuyu.json"},
+{"key":"csp_xuexi","name":"哔哩┃学习园地","type":"3","api":"csp_Bili","searchable":"0","quickSearch":"0","style":{"type":"rect","ratio":1.597},"filterable":"1","changeable":0,"ext":"./json/bili.json"},
{"key":"csp_Aid","name":"急救┃指南","type":3,"api":"csp_FirstAid","searchable":1,"quickSearch":1,"changeable":0,"style": { "type": "rect", "ratio":3.8}},
{"key":"csp_WoGG","name":"玩偶哥哥┃4K","type":3,"api":"csp_WoGG","searchable":1,"quickSearch":1,"changeable":0,"ext":"http://127.0.0.1:9978/file/tvfan/token.txt+4k|fhd|auto","timeout":30},
-{"key":"小纸条_cli","name":"小纸条┃俊于","type":4,"api":"http://home.jundie.top:9520/spider/cli_gitCafe","searchable":1,"quickSearch":1,"filterable":1,"ext":"http://127.0.0.1:9978/file/tvfan/token.txt","timeout":30},
-{"key":"夸克资源","name":"夸克资源","type":1,"api":"http://kuakezy1.com/api.php/provide/vod/","searchable":1,"changeable":1},
-{"key":"csp_Sp360","name":"弹幕┃360影视","type":3,"api":"csp_Sp360","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true},"jar":"./jar/928.jar;md5;7c4e630d2991bdc5ac8089b963b0d98e"},
-{"key":"荐片","name":"弹幕┃荐片","type":3,"api":"csp_Jianpian","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true},"jar":"./jar/928.jar;md5;7c4e630d2991bdc5ac8089b963b0d98e","timeout":30},
-{"key":"玩偶","name":"弹幕┃玩偶","type":3,"api":"csp_Wogg","searchable":1,"filterable":1,"changeable":1,"ext":{"token":"http://127.0.0.1:9978/file/tvfan/token.txt","filter":"./json/wogg.json","danmu":true},"jar":"./jar/928.jar;md5;7c4e630d2991bdc5ac8089b963b0d98e","timeout":30},
+{"key":"小纸条_cli","name":"小纸条┃T4","type":4,"api":"http://home.jundie.top:9520/spider/cli_gitCafe","searchable":1,"quickSearch":1,"filterable":1,"ext":"http://127.0.0.1:9978/file/tvfan/token.txt","timeout":30},
+{"key":"csp_Sp360","name":"360影视┃弹幕","type":3,"api":"csp_Sp360","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true},"jar":"./jar/1012.jar;md5;275bf48978d1bbfd1f04d64beebbbb80"},
+{"key":"csp_Jojo","name":"JOJO影视┃弹幕","type":3,"api":"csp_Jojo","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true},"jar":"./jar/1012.jar;md5;275bf48978d1bbfd1f04d64beebbbb80"},
+{"key":"荐片","name":"荐片┃弹幕","type":3,"api":"csp_Jianpian","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true},"jar":"./jar/1012.jar;md5;275bf48978d1bbfd1f04d64beebbbb80","timeout":30},
+{"key":"玩偶","name":"玩偶┃弹幕","type":3,"api":"csp_Wogg","searchable":1,"filterable":1,"changeable":1,"ext":{"token":"http://127.0.0.1:9978/file/tvfan/token.txt","filter":"./json/wogg.json","danmu":true},"jar":"./jar/1012.jar;md5;275bf48978d1bbfd1f04d64beebbbb80","timeout":30},
{"key":"Czsapp","name":"厂长┃直连","type":3,"api":"csp_Czsapp","playerType":2,"searchable":1,"quickSearch":1,"changeable":1,"ext": "https://www.cz01.pro/"},
{"key":"Mino","name":"Mino┃App","type":3,"api":"csp_AppMao","searchable":1,"quickSearch":1,"changeable":1,"ext": "FbjDcUxPqpfNr0QF4QvE6sExbcpBF4MRDm4TvbCzxUxQS9bPrS+dwlqC+K21Byi2fnbN32ExknwkTyVnT4ZkO1NUAJnYhg/LOWYSnzESguc1X7n/JQ1wPh7lInAdzJ2qxzb2fKg8RZczmhg8lF/+BAMaZaqxv0MMB5dPInMBPwir"},
@@ -92,7 +92,7 @@
{"key":"MV_vod","name":"卡拉OK┃采集","type":1,"api":"https://tvbox-mv--leosam2048.repl.co/mv/vod","searchable":1,"style":{ "type":"oval", "ratio":1.1 },"changeable":1,"filterable":1,"changeable":0},
{"key":"lf_js_lf_live","name":"路飞┃直播[js]","type":3,"api":"./lib/lf_live_min.js","style":{ "type":"oval"},"searchable":1,"changeable":0,"quickSearch":1,"filterable":1,"ext":"./js/lf_live.txt"},
{"key":"直播转点播","name":"电视┃直播[js]","type":3,"api":"http://我不是.肥猫.love:63/JS/直播转点播2.js","style":{"type":"oval"},"ext":"http://我不是.肥猫.love:63/lives/直播仓.json","changeable":0},
-{"key":"csp_xBPQ_短视频","name":"聚合┃短视频[XBPQ]","type":3,"api":"csp_XBPQ","changeable":0,"ext":"./XBPQ/短视频.json"},
+{"key":"csp_xBPQ_短视频","name":"短视频┃聚合[XBPQ]","type":3,"api":"csp_XBPQ","changeable":0,"ext":"./XBPQ/短视频.json"},
{"key":"drpy_js_360影视","name":"官源┃360[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/360影视.js"},
{"key":"drpy_js_奇珍异兽","name":"官源┃爱奇艺[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/奇珍异兽.js"},
@@ -173,7 +173,18 @@
{"name":"zui","type":0,"url":"https://jx.zui.cm/?url="},
{"name":"看看","type":0,"url":"https://jx.m3u8.pw/?url="}
],
-"rules":[{"name":"農民嗅探","hosts":["toutiaovod.com"],"regex":["video/tos/cn"]},{"name":"proxy","hosts":["raw.githubusercontent.com","googlevideo.com","cdn.v82u1l.com","cdn.iz8qkg.com","cdn.kin6c1.com","c.biggggg.com","c.olddddd.com","haiwaikan.com","www.histar.tv","youtube.com","uhibo.com",".*boku.*",".*nivod.*",".*ulivetv.*"]},{"name":"海外看","hosts":["haiwaikan"],"regex":["8.1748","10.0099","10.3333"]},{"name":"lz","hosts":["vip.lz","hd.lz","v.cdnlz"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.433333,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},{"name":"ff","hosts":["vip.ffzy","hd.ffzy"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},{"name":"bf","hosts":["bfzy","s5.bfzycdn"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY"]},{"name":"hs","hosts":["huoshan.com"],"regex":["item_id="]},{"name":"dy","hosts":["douyin.com"],"regex":["is_play_url="]},{"name":"cl","hosts":["magnet"],"regex":["更多","社區","xuu","最新","最新","直播","更新","社区","有趣","有趣","英皇体育","全中文AV在线","澳门皇冠赌场","哥哥快来","美女荷官","裸聊","新片首发","UUE29"]}],
+"rules":[
+{"name":"農民嗅探","hosts":["toutiaovod.com"],"regex":["video/tos/cn"]},
+{"name":"proxy","hosts":["dmku.thefilehosting.com","raw.githubusercontent.com","googlevideo.com","cdn.v82u1l.com","cdn.iz8qkg.com","cdn.kin6c1.com","c.biggggg.com","c.olddddd.com","haiwaikan.com","www.histar.tv","youtube.com","uhibo.com",".*boku.*",".*nivod.*",".*ulivetv.*"]},
+{"name":"海外看","hosts":["haiwaikan"],"regex":["8.1748","10.0099","10.3333"]},
+{"name":"暴风廣告","hosts":["bfzy","s5.bfzycdn"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY"]},
+{"name":"磁力廣告","hosts":["magnet"],"regex":["更多","社區","xuu","最新","最新","直播","更新","社区","有趣","有趣","英皇体育","全中文AV在线","澳门皇冠赌场","哥哥快来","美女荷官","裸聊","新片首发","UUE29"]},
+{"name":"星星","hosts":["aws.ulivetv.net"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:8,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:9,[\\s\\S]*?#EXT-X-DISCONTINUITY"]},
+{"name":"量子廣告","hosts":["vip.lz","hd.lz","v.cdnlz"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.433333,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},
+{"name":"非凡廣告","hosts":["vip.ffzy","hd.ffzy"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},
+{"name":"火山嗅探","hosts":["huoshan.com"],"regex":["item_id="]},
+{"name":"抖音嗅探","hosts":["douyin.com"],"regex":["is_play_url="]}
+],
"flags":["youku","优酷","优 酷","优酷视频", "qq","腾讯","腾 讯","腾讯视频", "iqiyi", "qiyi","奇艺","爱奇艺","爱 奇 艺", "m1905", "xigua", "letv","leshi","乐视","乐 视", "sohu","搜狐","搜 狐","搜狐视频", "tudou", "pptv", "mgtv","芒果","imgo","芒果TV","芒 果 T V", "qiqi","kuying-qq","bilibili","哔 哩","哔 哩 哔 哩"],
"ads":["wan.51img1.com","iqiyi.hbuioo.com","vip.ffzyad.com","https://lf1-cdn-tos.bytegoofy.com/obj/tos-cn-i-dy/455ccf9e8ae744378118e4bd289288dd"]
}
diff --git a/0822.json b/0822.json
index f2f26a32..4f8fa0af 100644
--- a/0822.json
+++ b/0822.json
@@ -1,14 +1,26 @@
{
-"spider":"./jar/928.jar;md5;7c4e630d2991bdc5ac8089b963b0d98e",
+"spider":"./jar/1012.jar;md5;275bf48978d1bbfd1f04d64beebbbb80",
"lives":[{"name":"live","type":0,"url":"https://xhdwc.tk/tvlive.txt","playerType":1,"epg":"http://epg.112114.xyz/?ch={name}&date={date}","logo": "https://epg.112114.xyz/logo/{name}.png"}],
"sites":[
{"key":"lf_js_search","name":"豆瓣","type":3,"searchable":0,"changeable":1,"quickSearch":0,"filterable":1,"api":"./lib/lf_search3_min.js"},
-{"key":"荐片","name":"荐片","type":3,"api":"csp_Jianpian","searchable":1,"quickSearch":1,"filterable":1,"ext":{"danmu":true}},
-{"key":"玩偶","name":"玩偶","type":3,"api":"csp_Wogg","searchable":1,"filterable":1,"changeable":1,"ext":{"token":"http://127.0.0.1:9978/file/tvfan/token.txt","filter":"./json/wogg.json","danmu":true}},
+{"key":"荐片","name":"荐片","type":3,"api":"csp_Jianpian","searchable":1,"quickSearch":1,"filterable":1,"ext":{"danmu":true}, "timeout":30},
+{"key":"玩偶","name":"玩偶","type":3,"api":"csp_Wogg","searchable":1,"filterable":1,"changeable":1,"ext":{"token":"http://127.0.0.1:9978/file/tvfan/token.txt","filter":"./json/wogg.json","danmu":true}, "timeout":30},
+{"key":"jojo","name":"JOJO","type":3,"api":"csp_Jojo","searchable":1,"filterable":1,"changeable":1,"ext": {"danmu": true}},
+{"key":"csp_Sp360","name":"360","type":3,"api":"csp_Sp360","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":{"danmu":true}},
{"key":"小纸条_cli","name":"纸条","type":4,"api":"http://home.jundie.top:9520/spider/cli_gitCafe","searchable":1,"quickSearch":1,"filterable":1,"ext":"http://127.0.0.1:9978/file/tvfan/token.txt", "timeout":30},
{"key":"csp_Bili","name":"哔哩","type":3,"api":"csp_Bili","searchable":1,"quickSearch":1,"style":{"type":"rect","ratio":1.755},"filterable":1,"changeable":0,"ext":{"json":"./json/chuqiuyu1.json","cookie": "http://127.0.0.1:9978/file/tvfan/cookie.txt"}},
{"key":"lf_js_lf_live","name":"直播","type":3,"api":"./lib/lf_live_min.js","style":{ "type":"oval"},"searchable":1,"changeable":0,"quickSearch":0,"filterable":1,"ext":"./js/lf_live.txt"},
{"key":"push_agent","name":"推送","type":3,"searchable":0,"changeable":1,"quickSearch":0,"filterable":0,"api":"./lib/lf_pushagent_min.js","timeout":30,"ext":"http://127.0.0.1:9978/file/tvfan/token.txt"}
],
-"rules":[{"name":"海外看","hosts":["haiwaikan"],"regex":["8.1748","10.0099","10.3333"]},{"name":"lz","hosts":["vip.lz","hd.lz","v.cdnlz"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.433333,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},{"name":"ff","hosts":["vip.ffzy","hd.ffzy"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},{"name":"bf","hosts":["bfzy","s5.bfzycdn"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},{"name":"hs","hosts":["huoshan.com"],"regex":["item_id="]},{"name":"dy","hosts":["douyin.com"],"regex":["is_play_url="]},{"name":"cl","hosts":["magnet"],"regex":["更多","社區","xuu","最新","最新","直播","更新","社区","有趣","有趣","英皇体育","全中文AV在线","澳门皇冠赌场","哥哥快来","美女荷官","裸聊","新片首发","UUE29"]}]
+"parses":[
+{"name":"Json聚合","type":3,"url":"Demo"},
+{"name":"Web聚合","type":3,"url":"Web"},
+{"name":"虾米","type":0,"url":"https://jx.xmflv.com/?url="},
+{"name":"爱酷解析","type":0,"url":"https://jx.zhanlangbu.com/?url="},
+{"name":"m3u8tv","type":0,"url":"https://jx.m3u8.tv/jiexi/?url="},
+{"name":"看看","type":0,"url":"https://jx.m3u8.pw/?url="}
+],
+"rules":[
+{"name":"proxy","hosts":["dmku.thefilehosting.com"]}
+]
}
diff --git a/9918.json b/9918.json
index f35b09a4..663b2d89 100644
--- a/9918.json
+++ b/9918.json
@@ -98,7 +98,7 @@
{"key":"api.apilyzy.com","name":"成人52","type":1,"api":"https://api.apilyzy.com/api.php/provide/vod/","searchable":1,"recordable":0,"style":{"type":"rect","ratio":1.33}}
],
"rules":[
-{"name":"proxy","hosts":["raw.githubusercontent.com","googlevideo.com","cdn.v82u1l.com","cdn.iz8qkg.com","cdn.kin6c1.com","c.biggggg.com","c.olddddd.com","haiwaikan.com","www.histar.tv","youtube.com","uhibo.com",".*boku.*",".*nivod.*",".*ulivetv.*"]},
+{"name":"proxy","hosts":["d3opspehgd3862dmfdp3sdf.siauliairsavlt.org","vl05t7es.rostelekom.xyz","raw.githubusercontent.com","googlevideo.com","cdn.v82u1l.com","cdn.iz8qkg.com","cdn.kin6c1.com","c.biggggg.com","c.olddddd.com","haiwaikan.com","www.histar.tv","youtube.com","uhibo.com",".*boku.*",".*nivod.*",".*ulivetv.*"]},
{"name":"磁力廣告","hosts":["magnet"],"regex":["更多","社區","xuu","最新","最新","直播","更新","社区","有趣","有趣","英皇体育","全中文AV在线","澳门皇冠赌场","哥哥快来","美女荷官","裸聊","新片首发","UUE29"]},
{"name":"量子廣告","hosts":["vip.lz","hd.lz","v.cdnlz"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.433333,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]},
{"name":"非凡廣告","hosts":["vip.ffzy","hd.ffzy"],"regex":["#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY","#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"]}
diff --git a/XYQ.json b/XYQ.json
index 911ef16b..0fdbbc1e 100644
--- a/XYQ.json
+++ b/XYQ.json
@@ -1,6 +1,6 @@
{
"wallpaper": "https://picsum.photos/1280/720/?blur=2",
- "spider": "./jar/XYQ.jar;md5;7de6e7526f5869ba90327c15f7913a0b",
+ "spider": "./jar/XYQ.jar;md5;f91ba72d2516a995da86b7321440c653",
"lives": [
{
"name": "直播",
diff --git a/XYQHiker/极客影院.json b/XYQHiker/极客影院.json
index 0a0ac6a3..0b8199cd 100644
--- a/XYQHiker/极客影院.json
+++ b/XYQHiker/极客影院.json
@@ -6,11 +6,11 @@
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.jiketv.com",
- "首页列表数组规则": "body&&.module-main.tab-list.active",
+ "首页列表数组规则": "body&&.module-items",
"首页片单列表数组规则": ".module-item",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
- "分类链接": "https://www.jiketv.com/index.php/show/{cateId}/area/{area}/by/{by}/class/{class}/lang/{lang}/page/{catePg}/year/{year}.html",
+ "分类链接": "https://www.jiketv.com/index.php/show/{cateId}/by/{by}/class/{class}/page/{catePg}.html",
"分类名称": "电影&电视剧&综艺&动漫",
"分类名称替换词": "1&2&3&4",
//"筛选数据": {},
@@ -38,20 +38,20 @@
"分类片单是否Jsoup写法": "1",
"分类片单标题": "a&&title",
"分类片单链接": "a&&href",
- "分类片单图片": ".lazyload&&data-original",
- "分类片单副标题": ".module-item-note&&Text",
+ "分类片单图片": ".lazyloaded||.lazyload&&data-src||data-original",
+ "分类片单副标题": ".module-item-note||.module-item-text&&Text",
"分类片单链接加前缀": "https://www.jiketv.com",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
- "搜索链接": "https://www.jiketv.com/index.php/search.html?wd={wd}",
+ "搜索链接": "https://www.jiketv.com/index.php/search/page/{SearchPg}/wd/{wd}.html",
"POST请求数据": "",
"搜索截取模式": "1",
- "搜索列表数组规则": "body&&.module-item",
+ "搜索列表数组规则": "body&&.module-search-item",
"搜索片单是否Jsoup写法": "1",
- "搜索片单图片": ".lazyload&&data-original",
- "搜索片单标题": ".module-card-item-title&&Text",
+ "搜索片单图片": ".lazyload&&data-src",
+ "搜索片单标题": "h3&&Text",
"搜索片单链接": "a&&href",
- "搜索片单副标题": ".module-item-note&&Text",
+ "搜索片单副标题": ".video-serial&&Text",
"搜索片单链接加前缀": "https://www.jiketv.com",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
@@ -64,10 +64,10 @@
"地区详情": "",
"演员详情": "主演:&&",
"简介详情": "introduction\">&&
",
- "线路列表数组规则": "#y-playList&&.module-tab-item",
+ "线路列表数组规则": ".module-player-tab&&.module-tab-item",
"线路标题": "Text",
- "播放列表数组规则": "body&&.module-play-list-content",
- "选集列表数组规则": "a",
+ "播放列表数组规则": "body&&.module-player-list:has(.scroll-content)",
+ "选集列表数组规则": ".scroll-content&&a",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
diff --git a/cat/js/config_open.json b/cat/js/config_open.json
index 8daa4435..339c9506 100644
--- a/cat/js/config_open.json
+++ b/cat/js/config_open.json
@@ -1,7 +1,6 @@
{
"video": {"sites": [
-{"key":"wogg_open","name":"影视 | 玩偶1","type":3,"api":"assets://js/wogg_open.js","ext":"填自己的32位token"},
-{"key":"wogg","name":"影视 | 玩偶2","type":3,"api":"assets://js/wogg.js","ext":"填自己的32位token"},
+{"key":"wogg","name":"影视 | 玩偶","type":3,"api":"assets://js/wogg.js","ext":"填自己的32位token"},
{"key":"ytvip","name":"影视 | 影探","type":3,"api":"assets://js/yt.js","ext":"http://ytcms.lyyytv.cn/api.php/app/"},
{"key":"yqktv_open","name":"影视 | 一起看","type":3,"api":"assets://js/yqktv_open.js"},
{"key":"555dy_open","name":"影视 | 555","type":3,"api":"assets://js/555dy_open.js"},
@@ -11,25 +10,23 @@
{"key":"bulei_open","name":"影视 | 布雷","type":3,"api":"assets://js/bulei_open.js"},
{"key":"miku_open","name":"影视 | 咪咕","type":3,"api":"assets://js/miku_open"},
{"key":"tutu_open","name":"影视 | 图图","type":3,"api":"assets://js/tutu_open"},
-{"key":"kunyu77","name":"影视 | 七七1","type":3,"api":"assets://js/kunyu77_open.js"},
-{"key":"kunyu77_yz","name":"影视 | 七七2","type":3,"api":"assets://js/kunyu77.js"},
+{"key":"jojo_open","name":"影视 | jojo","type":3,"api":"assets://js/jojo_open"},
+{"key":"kunyu77_yz","name":"影视 | 七七","type":3,"api":"assets://js/kunyu77.js"},
{"key":"czzy","name":"影视 | 厂长","type":3,"api":"assets://js/czzy_open.js"},
{"key":"libvio","name":"影视 | libvio","type":3,"api":"assets://js/libvio_open.js"},
{"key":"kkys","name":"影视 | 快看","type":3,"api":"assets://js/kkys_open.js"},
-{"key":"ikanbot","name":"影视 | 爱看1","type":3,"api":"assets://js/ikanbot.js"},
-{"key":"ikanbot_open","name":"影视 | 爱看2","type":3,"api":"assets://js/ikanbot_open.js"},
+{"key":"ikanbot_open","name":"影视 | 爱看","type":3,"api":"assets://js/ikanbot_open.js"},
{"key":"ngys","name":"影视 | 南瓜","type":3,"api":"assets://js/ng_open.js"},
{"key":"nivod","name":"影视 | 泥巴","type":3,"api":"assets://js/nivod_op.js"},
-{"key":"duboku","name":"影视 | 独播库1","type":3,"api":"assets://js/duboku_open.js"},
-{"key":"duboku2_open","name":"影视 | 独播库2","type":3,"api":"assets://js/duboku2_open.js"},
+{"key":"duboku2_open","name":"影视 | 独播库","type":3,"api":"assets://js/duboku2_open.js"},
{"key":"subaibai","name":"影视 | 素白白","type":3,"api":"assets://js/subaibai_open.js"},
{"key":"drpy_js_zxzj_open","name":"影视 | 在线之家","type":3,"api":"assets://js/zxzj_open.js"},
{"key":"drpy_js_boosj_open","name":"少儿 | 童趣","type":3,"api":"assets://js/boosj_open.js"},
{"key":"drpy_js_tuxiaobei_open","name":"少儿 | 兔小贝","type":3,"api":"assets://js/tuxiaobei_open.js"},
{"key":"drpy_js_ubestkid_open","name":"少儿 | 贝乐虎","type":3,"api":"assets://js/ubestkid_open.js"},
{"key":"sharenice","name":"聚合 | 短视频","type":3,"api":"assets://js/sharenice_open.js"},
-{"key":"mybili","name":"视频 | 哔哩1","type":3,"api":"assets://js/mybili_open.js"},
-{"key":"bili_open","name":"视频 | 哔哩2","type":3,"api":"assets://js/bili_open.js","ext":{"categories":"沙雕动画#沙雕穿越#沙雕","cookie":"填自己的cookie"}},
+{"key":"mybili","name":"视频 | 哔哩综合","type":3,"api":"assets://js/mybili_open.js"},
+{"key":"bili_open","name":"视频 | 我的哔哩","type":3,"api":"assets://js/bili_open.js","ext":{"categories":"沙雕动画#健身#音乐#舞蹈#风景#美食#科普#历史#法考#医考","cookie":"填自己的cookie"}},
{"key":"kuqimv","name":"MV | 酷奇","type":3,"api":"assets://js/kuqimv_open.js"},
{"key":"drpy_js_cntv_open","name":"电视 | 视聚场","type":3,"api":"assets://js/cntv_open.js"},
{"key":"哈喽","name":"影视 | 哈喽","type":3,"api":"assets://js/appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
@@ -65,28 +62,7 @@
{"key":"kuaiche","name":"影视 | 快车","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.kczyapi.com/api.php/provide/vod/from/kcm3u8/"},
{"key":"liangzi","name":"影视 | 量子","type":3,"api":"assets://js/caiji.js","ext":"https://cj.lziapi.com/api.php/provide/vod/from/lzm3u8/"},
{"key":"qihu","name":"影视 | 奇虎","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.qhzyapi.com/api.php/provide/vod/from/qhm3u8/"},
-{"key":"guangsuapi","name":"影视 | 光速","type":3,"api":"assets://js/caiji.js","ext":"http://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
-{"key":"nivod18","name":"成人 | 泥巴","type":3,"api":"assets://js/nivod_op.js","ext":"做爱"},
-{"key":"mtsp_open","name":"成人 | 蜜桃","type":3,"api":"assets://js/mtsp_open.js"},
-{"key":"18av_open","name":"成人 | 18av","type":3,"api":"assets://js/18av_open.js"},
-{"key":"18a_open","name":"成人 | 18a","type":3,"api":"assets://js/18a_open.js"},
-{"key":"apilj","name":"成人 | 十八","type":3,"api":"assets://js/caiji.js","ext":"https://apilj.com/api.php/provide/vod/at/json/"},
-{"key":"kulunli","name":"成人 | 酷伦理","type":3,"api":"assets://js/caiji.js","ext":"https://api.kudian70.com/api.php/provide/vod/"},
-{"key":"apilj.com","name":"成人 | 成人03","type":3,"api":"assets://js/caiji.js","ext":"http://apilj.com/api.php/provide/vod/at/json/"},
-{"key":"91md.me","name":"成人 | 成人05","type":3,"api":"assets://js/caiji.js","ext":"http://91md.me/api.php/provide/vod/"},
-{"key":"api.sexnguon.com","name":"成人 | 成人08","type":3,"api":"assets://js/caiji.js","ext":"http://api.sexnguon.com/api.php/provide/vod/"},
-{"key":"feifei67.com","name":"成人 | 成人09","type":3,"api":"assets://js/caiji.js","ext":"http://www.feifei67.com/api.php/provide/vod/"},
-{"key":"fhapi9.com","name":"成人 | 成人12","type":3,"api":"assets://js/caiji.js","ext":"http://fhapi9.com/api.php/provide/vod/"},
-{"key":"madouse.la","name":"成人 | 成人27","type":3,"api":"assets://js/caiji.js","ext":"http://madouse.la/api.php/provide/vod/"},
-{"key":"api.maozyapi.com","name":"成人 | 成人33","type":3,"api":"assets://js/caiji.js","ext":"https://api.maozyapi.com/inc/apijson_vod.php"},
-{"key":"888dav.com","name":"成人 | 成人35","type":3,"api":"assets://js/caiji.js","ext":"https://www.888dav.com/api.php/provide/vod/"},
-{"key":"mgzyz1.com","name":"成人 | 成人36","type":3,"api":"assets://js/caiji.js","ext":"https://mgzyz1.com/api.php/provide/vod/"},
-{"key":"caiji.huakuiapi.com","name":"成人 | 成人37","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.huakuiapi.com/inc/apijson_vod.php"},
-{"key":"lbapi9.com","name":"成人 | 成人43","type":3,"api":"assets://js/caiji.js","ext":"https://lbapi9.com/api.php/provide/vod/"},
-{"key":"apittzy.com","name":"成人 | 成人44","type":3,"api":"assets://js/caiji.js","ext":"https://apittzy.com/api.php/provide/vod/"},
-{"key":"kkzy.me","name":"成人 | 成人45","type":3,"api":"assets://js/caiji.js","ext":"https://kkzy.me/api.php/provide/vod/"},
-{"key":"sewozyapi.com","name":"成人 | 成人50","type":3,"api":"assets://js/caiji.js","ext":"https://sewozyapi.com/api.php/provide/vod/"},
-{"key":"api.apilyzy.com","name":"成人 | 成人52","type":3,"api":"assets://js/caiji.js","ext":"https://api.apilyzy.com/api.php/provide/vod/"}
+{"key":"guangsuapi","name":"影视 | 光速","type":3,"api":"assets://js/caiji.js","ext":"http://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"}
]},
"read":{"sites":[
{"key":"230ts","name":"爱上你听书","type":10,"api":"assets://js/230ts_book_open.js"},
@@ -142,9 +118,5 @@
{"name":"👀微资·随意盘","server":"https://apps.weixinqqq.com/"},
{"name":"雨呢备用","server":"https://clun.eu.org/"},
{"name":"潇洒备用","server":"http://www.azad.asia:5244/"},
-{"name":"A大杂物库","server":"https://alist.qyide.com/"},
-{"name":"罗汉果","server":"https://lala-ofbip.run.goorm.site/"},
-{"name":"诸神小盘","server":"https://pan.zsxg.top/"},
-{"name":"福利盘","server":"http://69.161.221.160:5244/"},
-{"name":"爱豆福利","server":"https://alist.eduedu.eu.org/"}
+{"name":"A大杂物库","server":"https://alist.qyide.com/"}
]}]}}
diff --git a/cat/js/config_open99.json b/cat/js/config_open99.json
new file mode 100644
index 00000000..adaccc41
--- /dev/null
+++ b/cat/js/config_open99.json
@@ -0,0 +1,151 @@
+{
+"video": {"sites": [
+{"key":"wogg_open","name":"影视 | 玩偶1","type":3,"api":"assets://js/wogg_open.js","ext":"填自己的32位token"},
+{"key":"wogg","name":"影视 | 玩偶2","type":3,"api":"assets://js/wogg.js","ext":"填自己的32位token"},
+{"key":"ytvip","name":"影视 | 影探","type":3,"api":"assets://js/yt.js","ext":"http://ytcms.lyyytv.cn/api.php/app/"},
+{"key":"yqktv_open","name":"影视 | 一起看","type":3,"api":"assets://js/yqktv_open.js"},
+{"key":"555dy_open","name":"影视 | 555","type":3,"api":"assets://js/555dy_open.js"},
+{"key":"yrzj_open","name":"影视 | 伊人","type":3,"api":"assets://js/yrzj_open.js"},
+{"key":"yzys_open","name":"影视 | 柚子","type":3,"api":"assets://js/yzys_open.js"},
+{"key":"sssp_open","name":"影视 | 速搜","type":3,"api":"assets://js/sssp_open.js"},
+{"key":"bulei_open","name":"影视 | 布雷","type":3,"api":"assets://js/bulei_open.js"},
+{"key":"miku_open","name":"影视 | 咪咕","type":3,"api":"assets://js/miku_open"},
+{"key":"tutu_open","name":"影视 | 图图","type":3,"api":"assets://js/tutu_open"},
+{"key":"jojo_open","name":"影视 | jojo","type":3,"api":"assets://js/jojo_open"},
+{"key":"kunyu77","name":"影视 | 七七1","type":3,"api":"assets://js/kunyu77_open.js"},
+{"key":"kunyu77_yz","name":"影视 | 七七2","type":3,"api":"assets://js/kunyu77.js"},
+{"key":"czzy","name":"影视 | 厂长","type":3,"api":"assets://js/czzy_open.js"},
+{"key":"libvio","name":"影视 | libvio","type":3,"api":"assets://js/libvio_open.js"},
+{"key":"kkys","name":"影视 | 快看","type":3,"api":"assets://js/kkys_open.js"},
+{"key":"ikanbot","name":"影视 | 爱看1","type":3,"api":"assets://js/ikanbot.js"},
+{"key":"ikanbot_open","name":"影视 | 爱看2","type":3,"api":"assets://js/ikanbot_open.js"},
+{"key":"ngys","name":"影视 | 南瓜","type":3,"api":"assets://js/ng_open.js"},
+{"key":"nivod","name":"影视 | 泥巴","type":3,"api":"assets://js/nivod_op.js"},
+{"key":"duboku","name":"影视 | 独播库1","type":3,"api":"assets://js/duboku_open.js"},
+{"key":"duboku2_open","name":"影视 | 独播库2","type":3,"api":"assets://js/duboku2_open.js"},
+{"key":"subaibai","name":"影视 | 素白白","type":3,"api":"assets://js/subaibai_open.js"},
+{"key":"drpy_js_zxzj_open","name":"影视 | 在线之家","type":3,"api":"assets://js/zxzj_open.js"},
+{"key":"drpy_js_boosj_open","name":"少儿 | 童趣","type":3,"api":"assets://js/boosj_open.js"},
+{"key":"drpy_js_tuxiaobei_open","name":"少儿 | 兔小贝","type":3,"api":"assets://js/tuxiaobei_open.js"},
+{"key":"drpy_js_ubestkid_open","name":"少儿 | 贝乐虎","type":3,"api":"assets://js/ubestkid_open.js"},
+{"key":"sharenice","name":"聚合 | 短视频","type":3,"api":"assets://js/sharenice_open.js"},
+{"key":"mybili","name":"视频 | 哔哩1","type":3,"api":"assets://js/mybili_open.js"},
+{"key":"bili_open","name":"视频 | 哔哩2","type":3,"api":"assets://js/bili_open.js","ext":{"categories":"沙雕动画#健身#音乐#舞蹈#风景#美食#科普#历史#法考#医考,"cookie":"填自己的cookie"}},
+{"key":"kuqimv","name":"MV | 酷奇","type":3,"api":"assets://js/kuqimv_open.js"},
+{"key":"drpy_js_cntv_open","name":"电视 | 视聚场","type":3,"api":"assets://js/cntv_open.js"},
+{"key":"哈喽","name":"影视 | 哈喽","type":3,"api":"assets://js/appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
+{"key":"1080dyw","name":"影视 | 视界","type":3,"api":"assets://js/appysv2.js","ext":"https://www.1080dyw.cc/api.php/v1.vod"},
+{"key":"miniku","name":"影视 | 迷你","type":3,"api":"assets://js/appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
+{"key":"aidi","name":"影视 | 爱迪","type":3,"api":"assets://js/appysv2.js","ext":"https://api123.adys.app/xgapp.php/v3/"},
+{"key":"yaya","name":"影视 | 鸭鸭","type":3,"api":"assets://js/appysv2.js","ext":"https://yayayaaapp.ynf.icu/api.php/app/"},
+{"key":"kuku","name":"影视 | 酷酷","type":3,"api":"assets://js/appysv2.js","ext":"http://cms.realdou.cn:35264/api.php/app/"},
+{"key":"beijihu","name":"影视 | 极狐","type":3,"api":"assets://js/appysv2.js","ext":"https://www.kuin.one/api.php/app/"},
+{"key":"kuk","name":"影视 | 天堂","type":3,"api":"assets://js/appysv2.js","ext":"http://dytt996.com/api.php/app/"},
+{"key":"kku","name":"影视 | 酷影","type":3,"api":"assets://js/appysv2.js","ext":"https://www.gsjtlxy.top/xgapp.php/v3/"},
+{"key":"kuu","name":"影视 | 酷客","type":3,"api":"assets://js/appysv2.js","ext":"https://www.kuin.one/api.php/app/"},
+{"key":"ruidou","name":"影视 | 锐豆","type":3,"api":"assets://js/appysv2.js","ext":"http://ys.realdou.cn:2683/api.php/app/"},
+{"key":"mayi","name":"影视 | 蚂蚁","type":3,"api":"assets://js/appysv2.js","ext":"http://wushutvcms.byzz.top/api.php/app/"},
+{"key":"sukan","name":"影视 | 速看","type":3,"api":"assets://js/appysv2.js","ext":"https://sk100.tv/api.php/app/"},
+{"key":"midi","name":"影视 | 明帝","type":3,"api":"assets://js/appysv2.js","ext":"https://ys.md214.cn/api.php/app/"},
+{"key":"dadou","name":"影视 | 大豆","type":3,"api":"assets://js/appysv2.js","ext":"http://www.dadou.cm/api.php/app/"},
+{"key":"qtw","name":"影视 | 彩虹","type":3,"api":"assets://js/appysv2.js","ext":"http://ys.qtw.asia/lvdou_api.php/v1.vod"},
+{"key":"xinlang","name":"影视 | 新浪","type":3,"api":"assets://js/caiji.js","ext":"https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8"},
+{"key":"bdzy","name":"影视 | 百度","type":3,"api":"assets://js/caiji.js","ext":"https://api.apibdzy.com/api.php/provide/vod/from/dbm3u8/"},
+{"key":"bfzy","name":"影视 | 暴风","type":3,"api":"assets://js/caiji.js","ext":"https://bfzyapi.com/api.php/provide/vod/"},
+{"key":"394tv","name":"影视 | 39","type":3,"api":"assets://js/caiji.js","ext":"https://www.394tv.com/api.php/provide/vod/"},
+{"key":"languang","name":"影视 | 蓝光","type":3,"api":"assets://js/caiji.js","ext":"http://www.zzrhgg.com/api.php/provide/vod/"},
+{"key":"lehuo","name":"影视 | 乐活","type":3,"api":"assets://js/caiji.js","ext":"https://cj.vodimg.top/api.php/provide/vod/"},
+{"key":"piaoling","name":"影视 | 飘零","type":3,"api":"assets://js/caiji.js","ext":"https://p2100.net/api.php/provide/vod/"},
+{"key":"yingtu","name":"影视 | 影图","type":3,"api":"assets://js/caiji.js","ext":"https://cj.vodimg.top/api.php/provide/vod/"},
+{"key":"feifan","name":"影视 | 非凡","type":3,"api":"assets://js/caiji.js","ext":"https://cj.ffzyapi.com/api.php/provide/vod/from/ffm3u8/"},
+{"key":"feisu","name":"影视 | 飞速","type":3,"api":"assets://js/caiji.js","ext":"https://www.feisuzyapi.com/api.php/provide/vod/from/fsm3u8/"},
+{"key":"guangsu","name":"影视 | 光速","type":3,"api":"assets://js/caiji.js","ext":"https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
+{"key":"hongniu","name":"影视 | 红牛","type":3,"api":"assets://js/caiji.js","ext":"https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8/"},
+{"key":"jinying","name":"影视 | 金鹰","type":3,"api":"assets://js/caiji.js","ext":"https://jinyingzy.com/provide/vod/from/jinyingm3u8/"},
+{"key":"jisu","name":"影视 | 极速","type":3,"api":"assets://js/caiji.js","ext":"https://jszyapi.com/api.php/provide/vod/from/jsm3u8/"},
+{"key":"kuaiche","name":"影视 | 快车","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.kczyapi.com/api.php/provide/vod/from/kcm3u8/"},
+{"key":"liangzi","name":"影视 | 量子","type":3,"api":"assets://js/caiji.js","ext":"https://cj.lziapi.com/api.php/provide/vod/from/lzm3u8/"},
+{"key":"qihu","name":"影视 | 奇虎","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.qhzyapi.com/api.php/provide/vod/from/qhm3u8/"},
+{"key":"guangsuapi","name":"影视 | 光速","type":3,"api":"assets://js/caiji.js","ext":"http://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
+{"key":"nivod18","name":"成人 | 泥巴","type":3,"api":"assets://js/nivod_op.js","ext":"做爱"},
+{"key":"mtsp_open","name":"成人 | 蜜桃","type":3,"api":"assets://js/mtsp_open.js"},
+{"key":"18av_open","name":"成人 | 18av","type":3,"api":"assets://js/18av_open.js"},
+{"key":"18a_open","name":"成人 | 18a","type":3,"api":"assets://js/18a_open.js"},
+{"key":"apilj","name":"成人 | 十八","type":3,"api":"assets://js/caiji.js","ext":"https://apilj.com/api.php/provide/vod/at/json/"},
+{"key":"kulunli","name":"成人 | 酷伦理","type":3,"api":"assets://js/caiji.js","ext":"https://api.kudian70.com/api.php/provide/vod/"},
+{"key":"apilj.com","name":"成人 | 成人03","type":3,"api":"assets://js/caiji.js","ext":"http://apilj.com/api.php/provide/vod/at/json/"},
+{"key":"91md.me","name":"成人 | 成人05","type":3,"api":"assets://js/caiji.js","ext":"http://91md.me/api.php/provide/vod/"},
+{"key":"api.sexnguon.com","name":"成人 | 成人08","type":3,"api":"assets://js/caiji.js","ext":"http://api.sexnguon.com/api.php/provide/vod/"},
+{"key":"feifei67.com","name":"成人 | 成人09","type":3,"api":"assets://js/caiji.js","ext":"http://www.feifei67.com/api.php/provide/vod/"},
+{"key":"fhapi9.com","name":"成人 | 成人12","type":3,"api":"assets://js/caiji.js","ext":"http://fhapi9.com/api.php/provide/vod/"},
+{"key":"madouse.la","name":"成人 | 成人27","type":3,"api":"assets://js/caiji.js","ext":"http://madouse.la/api.php/provide/vod/"},
+{"key":"api.maozyapi.com","name":"成人 | 成人33","type":3,"api":"assets://js/caiji.js","ext":"https://api.maozyapi.com/inc/apijson_vod.php"},
+{"key":"888dav.com","name":"成人 | 成人35","type":3,"api":"assets://js/caiji.js","ext":"https://www.888dav.com/api.php/provide/vod/"},
+{"key":"mgzyz1.com","name":"成人 | 成人36","type":3,"api":"assets://js/caiji.js","ext":"https://mgzyz1.com/api.php/provide/vod/"},
+{"key":"caiji.huakuiapi.com","name":"成人 | 成人37","type":3,"api":"assets://js/caiji.js","ext":"https://caiji.huakuiapi.com/inc/apijson_vod.php"},
+{"key":"lbapi9.com","name":"成人 | 成人43","type":3,"api":"assets://js/caiji.js","ext":"https://lbapi9.com/api.php/provide/vod/"},
+{"key":"apittzy.com","name":"成人 | 成人44","type":3,"api":"assets://js/caiji.js","ext":"https://apittzy.com/api.php/provide/vod/"},
+{"key":"kkzy.me","name":"成人 | 成人45","type":3,"api":"assets://js/caiji.js","ext":"https://kkzy.me/api.php/provide/vod/"},
+{"key":"sewozyapi.com","name":"成人 | 成人50","type":3,"api":"assets://js/caiji.js","ext":"https://sewozyapi.com/api.php/provide/vod/"},
+{"key":"api.apilyzy.com","name":"成人 | 成人52","type":3,"api":"assets://js/caiji.js","ext":"https://api.apilyzy.com/api.php/provide/vod/"}
+]},
+"read":{"sites":[
+{"key":"230ts","name":"爱上你听书","type":10,"api":"assets://js/230ts_book_open.js"},
+{"key":"laobaigushi","name":"老白故事","type":10,"api":"assets://js/lbgs_open.js"},
+{"key":"bookan","name":"博看听书","type":10,"api":"assets://js/bookan_open.js"},
+{"key":"dj0898","name":"世纪DJ","type":3,"api":"assets://js/dj0898_book_open.js"}
+]},
+"pan":{"sites":[
+{"key":"alist","name":"Alist","type":40,"api":"assets://js/alist_open.js","ext":[
+{"name":"丫仙女","server":"http://alist.xiaoya.pro/","startPage":"/","showAll":false,"search":true,"headers":{"Authorization":""},"params":{"/abc":{"password":"123"},"/abc/abc":{"password":"123"}}},
+{"name":"小鸭","server":"http://shicheng.wang:555/","startPage":"/","showAll":false,"search":true,"params":{"/abc":{"password":"123"},"/abc/abc":{"password":"123"}}},
+{"name":"小猫","server":"https://nics.eu.org","startPage":"/SP1","showAll":false,"search":true,"params":{"/abc":{"password":"123"},"/abc/abc":{"password":"123"}}},
+{"name":"ECVE","server":"https://pan.ecve.cn"},
+{"name":"觸光","server":"https://pan.ichuguang.com"},
+{"name":"一只魚","server":"https://vtok.pp.ua/"},
+{"name":"七米藍","server":"https://al.chirmyram.com"},
+{"name":"神族九帝","server":"https://alist.shenzjd.com"},
+{"name":"梓澪","server":"https://zi0.cc"},
+{"name":"一只鱼","server":"https://alist.youte.ml"},
+{"name":"杜比","server":"https://dubi.tk"},
+{"name":"姬路白雪","server":"https://pan.jlbx.xyz"},
+{"name":"星梦","server":"https://pan.bashroot.top"},
+{"name":"repl","server":"https://ali.liucn.repl.co"},
+{"name":"讯维云盘","server":"https://pan.xwbeta.com"},
+{"name":"正奕合集","server":"http://www.jczyl.top:5244/"},
+{"name":"东哥","server":"http://101.34.67.237:5244/"},
+{"name":"美云","server":"https://h.dfjx.ltd/"},
+{"name":"小新盘","server":"https://pan.cdnxin.top/"},
+{"name":"白云tv","server":"http://breadmyth.asuscomm.com:22222/"},
+{"name":"小雅分类","server":"http://www.214728327.xyz:5207/"},
+{"name":"瑶瑶","server":"https://lyly.run.goorm.io/"},
+{"name":"潇洒个人","server":"https://alist.azad.asia/"},
+{"name":"鹏程","server":"https://pan.pengcheng.team/"},
+{"name":"小丫","server":"http://alist.xiaoya.pro/"},
+{"name":"神器云","server":"https://alist.ygxz.xyz/"},
+{"name":"雨呢","server":"https://pan.clun.top/"},
+{"name":"OEIO","server":"https://o.oeio.repl.co/"},
+{"name":"酷呵盘","server":"https://pan.kuhehe.top/"},
+{"name":"分享者","server":"https://melist.me/"},
+{"name":"目瞪口呆","server":"https://pan.mdgd.cc/"},
+{"name":"小陈","server":"https://ypan.cc/"},
+{"name":"动漫盘","server":"http://pan.smjc.cc"},
+{"name":"神秘小盘","server":"https://yun.ltt.zone/"},
+{"name":"SODAZ1","server":"https://pan.sodaz.xyz/"},
+{"name":"ccaa","server":"http://ww1.ccaac.xyz/"},
+{"name":"姹莱坞","server":"https://alist.agczsz.top/","passwd":"agree"},
+{"name":"老谭","server":"https://pan.cqtjy.cn/"},
+{"name":"皓星繁天","server":"https://pan.hxft.xyz/"},
+{"name":"肥灿","server":"http://43.200.153.107:55609/"},
+{"name":"悦享盘","server":"https://pity.eu.org/"},
+{"name":"小雅备用","server":"http://123.60.188.109:5678/"},
+{"name":"小黄瓜","server":"http://sbpan.tk/"},
+{"name":"👀微资·随意盘","server":"https://apps.weixinqqq.com/"},
+{"name":"雨呢备用","server":"https://clun.eu.org/"},
+{"name":"潇洒备用","server":"http://www.azad.asia:5244/"},
+{"name":"A大杂物库","server":"https://alist.qyide.com/"},
+{"name":"罗汉果","server":"https://lala-ofbip.run.goorm.site/"},
+{"name":"诸神小盘","server":"https://pan.zsxg.top/"},
+{"name":"福利盘","server":"http://69.161.221.160:5244/"},
+{"name":"爱豆福利","server":"https://alist.eduedu.eu.org/"}
+]}]}}
diff --git a/cat/js/jojo_open.js b/cat/js/jojo_open.js
new file mode 100644
index 00000000..0a9cae03
--- /dev/null
+++ b/cat/js/jojo_open.js
@@ -0,0 +1 @@
+//bbQ0FUT1CUAxhqb2pvX29wZW4uanMsYXNzZXRzOi8vanMvbGliL2NhdC5qcxxfX2pzRXZhbFJldHVybgxDcnlwdG8IbG9hZAJfCmRheWpzDl8weDM0ZmMOXzB4NTRjMxJfMHg0ODU3NzQSXzB4MTRkZGMyEl8weDI2MjY5ZBJfMHg1YjljY2YSXzB4NDQxNjY0El8weDMzZTYxYRJfMHgyNTc1YTMSXzB4MjAwYjFhEl8weDFkNTQwZRJfMHhkNWIxY2EQXzB4N2FhYTYSXzB4M2YzOWQ5El8weDNiYjRjNxJfMHgxMDgxNjASXzB4MWVjYjNjEl8weDQzMGI3YxJfMHgzNjIyNjMSXzB4Y2FhM2U0HENvbnRlbnQtTGVuZ3RoDnN0cmVhbS8OcmVwbGFjZQhkYXRhBztOFG8a/wZzcmMISGdNMwhmaW5kEHZvZF95ZWFyCnNsaWNlEnZvZF9hY3Rvcgw/cGFnZT0OL3ZpZGVvLxRjaGFyQ29kZUF0DmhlYWRlcnMoZGl2LmNvbnRlbnQtYm9keSA+IGEQdm9kX3R5cGUIVXRmOA5kZWNyeXB0GHZvZF9wbGF5X3VybBJzdHJpbmdpZnkMdmFSTWNFDCZwYWdlPQ5wLnNjb3JlJnJldHVybiAoZnVuY3Rpb24oKSAIdzcxZhomc2l6ZT0xOCZwaWQ9DHhJVVlacgxzdWJzdHIMU1FqZXRRCDltVkEGMHg0JGh0dHBzOi8vamlvaHViLnRvcAf8WxRvGv8IdGV4dApzaGlmdAhKT0pPCGhyZWZAe30uY29uc3RydWN0b3IoInJldHVybiB0aGlzIikoICkYcC5jYXJkLXRpdGxlBjB4MxAmc2l6ZT0xOAftiwCKGv8GZW5jB3Re/U4a/whjb2RlIFozdzFCTUtZS2dOYXc2WT0IaHR0cEBiYTAtZDRnNS00NWViLWMyYmEwLWQ0ZzUtNDVlYi1jcwpwYXJzZTIubmF2LWxpc3QgYVtocmVmKj0vdmlkZW9dGHZvZF9kaXJlY3RvcghNb3ppCnRvdGFsBmhscxhmcm9tQ2hhckNvZGUUc3RhcnRzV2l0aBBObnc5QWNPTwh0cmltDHlaU0RLVQcwVzpTGv8Ydzc3RHZzTzl3cTlWDmF0dHJpYnMOaW5kZXhPZghjZWlsCGh0bWwKbWF0Y2gSc3Vic3RyaW5nlgJNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzJfMyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMC4zIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xCHBvc3QGbWFwBjB4MAhOKW5sCj9waWQ9ClBrY3M3SmRpdi5jb250ZW50LWRldGFpbCBzcGFuLmRldGFpbC1za2V0Y2gSaW1nOmZpcnN0MHdxODZ3NzNDbU1PcEhjT2V3NkhDdXl3PQZwYWQIYXRvYhp2b2RfcGxheV9mcm9tEHZvZF9hcmVhEGNoaWxkcmVuDmNvbnRlbnSCAUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IGNmMmQxYS02YTRkLTllZjggdzR2Q3Q4S0R3b3pDbGc9PRhwLml0ZW0tc3BlZWQGQUVTIC92aWRlby9zZWFyY2g/cT0MamlvaHViCDB4MWEIMHg0MRBfMHg0ODVmOBJfMHgzNGZjYmISXzB4NTRjMzlhEl8weDU4NzNjOAhwdXNoEl8weDU4NTczNBJfMHgyN2NhN2ESXzB4NWM4ZDYxEl8weDZkNjI2MhJfMHgyZmFiOTQSXzB4NTE0MWMwEl8weDE2YzVkOBRVc2VyLUFnZW50CDB4MjMCOwxDb29raWUOcmVmZXJlciRlbmNvZGVVUklDb21wb25lbnQGcmVxCDB4MjAMbWV0aG9kCDB4NDIIZm9ybRBwb3N0VHlwZQgweDUwEl8weDU5OWY3YhJfMHg0YThiMzECPRJfMHgxNjNjYmUSXzB4NGE2ODY2El8weDQ2NzhmYRJfMHgxNWViOTQIc2tleQpzdHlwZQgweDRhCDB4NTMIMHgzOQgweDM1CDB4MmEIMHgyNAgweDE4BjB4MghlMGhFBjB4MQgweDQ1CDB4MTkIMHgxMggweDQ0CDB4NWQOY29uc29sZQZsb2cSXzB4NmU2ZDgyEl8weDJlOGNhNhJfMHg2MmZkMTQSXzB4MjcwNGQ5CDB4MWQSXzB4NGYwMTYwEl8weDEyN2I0YxJfMHgzMWY3ZDcSXzB4MTcwYjUxEl8weDIxYzBkNwYweGUIMHgzNwgweDE0CDB4MTYSXzB4NTk3MjIzEl8weDU1MjY0ZRJfMHg0NjRiYTYIMHg1MQgweDRjEl8weDU4ZTQyMhJfMHhmMmE4NzUIMHgxMQgweDIxBCk7DHdpbmRvdxJfMHgyYmUyMjISXzB4NTkzN2ZiEl8weDIyZWVmZhJfMHg0ZTI0ZDQSXzB4MTc3MzBkEl8weDIyMWFkMxJfMHgxZDgyYTYIMHg1OQxjaGFyQXQIMHgzYwgweDMzEl8weDU0NGFmNRJfMHgyZTlhY2MSXzB4MjQ4ZDJjEl8weDI4OWI4MRJfMHg1ZTA2NjISXzB4NDFkNGYyEl8weDUzYWYwYxJfMHgzNjAyZmQSXzB4MzBhOWU0El8weDVjMTI4ORJfMHgzYWQxMjYIMHgxNwIlBDAwCDB4M2EkZGVjb2RlVVJJQ29tcG9uZW50BjB4NhJfMHg1NjQ0NWESXzB4MmE3YzIzEl8weDI1MTI5YhJfMHg0YzUwMjMSXzB4MTBkOTYyCDB4MmUIMHg0MxJfMHgxMzk5NzcSXzB4NGU1MTEwEl8weDUyMDY0MQgweDFmCDB4M2YOdHlwZV9pZBJ0eXBlX25hbWUEe30SXzB4MWM5NzdkEl8weDRhYjZhYhJfMHg1ZGE3YmQSXzB4NDMzNWRhEl8weDQ5N2YwZhJfMHg0NGRjYzISXzB4MWU3OWIwEl8weDM0M2M4MRJfMHg0NDdkODISXzB4NDg4NTFlEl8weDJkMTQ3OBJfMHgyZDg4OGISXzB4NzNjYjAzBjB4NQgweDI1BjB4OBp1aS1wYWdpbmF0aW9uEHBhcnNlSW50CDB4M2IGMHhkCHBhZ2UIMHgzZBJwYWdlY291bnQIbGlzdBJfMHg0ZDMwZDcSXzB4MzNiN2E3El8weDE3YmUwZhJfMHg0ZmMzMTcSXzB4MWYyMmNiEl8weDU3YmY5MggweDQ5CDB4NWMIMHgyMggweDRmCDB4NTQIMHg1YQgweDEwDHZvZF9pZBB2b2RfbmFtZQ52b2RfcGljFnZvZF9yZW1hcmtzEl8weDRjNWI2OAIgEl8weDQ1MTdiMhJfMHg0MDNiOTcSXzB4M2Y3YWJkEl8weDQ2MjkwMhJfMHg0YzgxZWISXzB4MzQyMjEwEl8weDViMGNhNhJfMHgyNmYzMzgSXzB4NDliYjY2El8weDFjODliNw4vd2F0Y2gvLGRpdi5jb250ZW50LWRldGFpbCA+IHAIMHg0OAgweDNlCDB4MzYWdm9kX2NvbnRlbnQIMHgxYwgweDM0CDB4MzgIMHg0ZQgweDQwCDB4MjgHe3yLVxr/BjB4OQgweDFiCDB4MmYIMHg1YggweDI2EHZvZF9sYW5nAi8CKwgweDI3BjB4YQgweDJkCDB4NTIIMHg1NQYweGIEaXYIMHg0YggweDQ3DnBhZGRpbmcCCggweDRkCDB4MWUGMHhjAiMSXzB4M2FjZmNlEl8weDI1M2QzMBJfMHgyNTBmN2EIMHgyYwZIZXhAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAOZW5jcnlwdAxmb3JtYXQgWVlZWS1NTS1ERCBISDptbQItEl8weDM2MjQ5NxJfMHgyY2NjMjMSXzB4MjIyNzg3El8weGI1NTA0MBJfMHgzMDU3ZjQSXzB4MjJkOTZkEl8weDRmOTI5ZBJfMHgzMWM2ZDkSXzB4MzhjZDhmEl8weDhlNzkxMxJfMHg1OGRkMDkSXzB4MjU2N2YwCDB4MzIIMHgzMBBqczJQcm94eQgweDU4CDB4MTUGMHg3CDB4NTcIMHgyOQgweDQ2EGxvY2F0aW9uEl8weDIyODA3ORJfMHg0N2M4MTUSXzB4MjQyOWMwCDB4MmISXzB4NGVlODg0El8weDFhODhlOBJfMHgzZjQ1NDMSXzB4NTlhM2Q4El8weDQ0YTQ5NxJfMHgzY2ZmZjQSXzB4NWM5YjQ4El8weGQ5YThhZAZ1cmwMaGVhZGVyEl8weDVkODRkMxJfMHgxZjAxNDMSXzB4NGVmZGQ2El8weDM4NTNiZhJfMHg0NWM2MmYSXzB4NWM0MWE3El8weDQxZWJhOBJfMHhhYjIwOTYSXzB4MmIyYmRhEl8weDY0Y2FkYxJfMHgyNzEzNzMSXzB4NGI3YWIxCDB4NTYGMHhmCDB4MTMIMHgzMRJfMHg1YzczNTASXzB4MjZlY2Y2El8weDJhN2NlOBJfMHg0ODBmNTQSXzB4NGY4ODRlEl8weDUwM2MzNgU1dXFfCGluaXQIaG9tZQ5ob21lVm9kEGNhdGVnb3J5DGRldGFpbAhwbGF5DHNlYXJjaA+kAwGmAwEAGKgDAAQAqgMAAawDAAKuAwADsAMADgAGAaABAAAAIBkOmQcAqgMADKwDAQyuAwIMsAMDDLIDAA20AwENtgMCCbgDAwm6AwQJvAMFCb4DBg3AAwcNwgMIAcQDCQHGAwoByAMLAcoDDAHMAw0BzgMOAdADDwHSAxAB1AMRAdYDEgHYAxMBqAMUAQjoPr4CXw0AvgNfDgC+BF8PAL4FXxAAvgZfEQC+B18SAL4IXxMAvglfFAC+Cl8VAL4LXxYAvgxfFwC+DV8YACkE7QAAAATuAAAABO8AAAAE8AAAAATxAAAABPIAAAAE8wAAAAT0AAAABPUAAAAE9gAAAAT3AAAABPgAAAAE+QAAAAT6AAAABPsAAAAE/AAAAAT9AAAABP4AAAAE/wAAAAQAAQAABAEBAAAEAgEAAAQDAQAABAQBAAAEBQEAAAQGAQAABAcBAAAECAEAAAQJAQAABAoBAAAEMAAAAAQLAQAAJiAABAwBAABMIAAAgAQNAQAATCEAAIAEDgEAAEwiAACABA8BAABMIwAAgAQQAQAATCQAAIAEEQEAAEwlAACABBIBAABMJgAAgARBAAAATCcAAIAEEwEAAEwoAACABBQBAABMKQAAgARbAAAATCoAAIAEFQEAAEwrAACABBYBAABMLAAAgAQXAQAATC0AAIAEGAEAAEwuAACABBkBAABMLwAAgAQaAQAATDAAAIAEGwEAAEwxAACABBwBAABMMgAAgAQdAQAATDMAAIAEHgEAAEw0AACABB8BAABMNQAAgAQgAQAATDYAAIAEIQEAAEw3AACABCIBAABMOAAAgAQjAQAATDkAAIAEJAEAAEw6AACABCUBAABMOwAAgAQmAQAATDwAAIAEJwEAAEw9AACABCgBAABMPgAAgAQpAQAATD8AAIAEKgEAAExAAACABDcAAABMQQAAgAQrAQAATEIAAIAELAEAAExDAACABC0BAABMRAAAgAQuAQAATEUAAIAELwEAAExGAACABDABAABMRwAAgAQxAQAATEgAAIAEMgEAAExJAACABDMBAABMSgAAgAQ0AQAATEsAAIAENQEAAExMAACABDYBAABMTQAAgAQ3AQAATE4AAIAEOAEAAExPAACABDkBAABMUAAAgAQ6AQAATFEAAIAEOwEAAExSAACABDwBAABMUwAAgAQ9AQAATFQAAIAEPgEAAExVAACABD8BAABMVgAAgARAAQAATFcAAIAEQQEAAExYAACABEIBAABMWQAAgARDAQAATFoAAIAERAEAAExbAACABEUBAABMXAAAgARGAQAATF0AAIBfBAC+AGUEALtl7g6+AU3aAAAAXwUABEcBAABfBgBlBQAESAEAAO1fBwC/XwgAs18JAGUFAARJAQAA7V8KAAtfCwAmAACWXwwAKaQDAQQBAEACDkMGAQACAQICAAETA5QFAAFAlgUAAQCYBQEAMGEAAL4ATUwBAADHYgAA0I/Y7SmkAwEADkMGAQABAAEEAQAdAZoFAAEAlAUAA8+O1+gY2wROAQAASNsEEAEAAEgkAAAkAQAO6uUppAMBAA5DBgEAAgECAgEAEQOUBQABAJYFAAEAmAUBACCyAwQMYQAAz7Oe02UAAM9Hx2IAACikAwEADmIGAcQDBQIFBgUBpAEHngUAAQCgBQABAKIFAAEApAUAAQCmBQABAKgFAQAwqgUBASDCAwwAvgMKDK4DAgzAAwsMtAMFDGEBAGEAANvoAwYuC2UBAExWAQAAZQIABDMBAABIZQMAvgAkAgBlBAAEVwEAAO1IBFgBAAAkAQBMWQEAAMfQ6BJiAAAEWgEAAHE4WwEAANDtSThcAQAAzwvREekLDmUEAARdAQAA7UxeAQAAYgAATPsAAADSTPAAAADRZQQABF8BAADtq+gIBGABAADqAr9MYQEAAO6LyGIBAGUEAARiAQAA7UcupAMBAA5CBgEAAgACAgAACgLGBQABAMgFAAEA0ARlAQAAnc+dKKQDAQAOYgYBxgMBAwEHBAOZAgTMBQABAM4FAABA0AUAAUDSBQYAA7QDBQy6AwgIvAMJCMIDDADPBGoBAABHEWYBAA7PBGsBAABHEWYCAA5s0gAAAGUAAARsAQAA7WUAAARtAQAA7WUAAARuAQAA7WUAAARvAQAA7WUAAARwAQAA7SYFAMe+AMO7de4OvgFNaAEAAMg4igAAAMRlAAAEcQEAAO1lAAAEcgEAAO3uxARzAQAABHQBAADuSLO1JAIAR+gHJgAAlpbiOIoAAADEBHUBAABlAAAEdgEAAO3uR8RlAAAEdwEAAO1lAAAEeAEAAO3uR5boByYAAJaW4jiKAAAAxGUAAAR5AQAA7WUAAAR6AQAA7e5HlugHJgAAlpbiDuoRyWwNAAAAJgAAlpbiDuoCL97oGjiKAAAABHsBAABxC74CTXwBAABMfAEAAEkGLqQDAQAOQwYBAAIBAgIBAQ0D+gUAAUD8BQABAP4FAAAAtAMADL4ATX8BAADL0I/Y7SmkAwEADkMGAQABAAEFAgAhAYAGAAEA+gUAA7QDAAzPjtfoHNsETgEAAEjbZQEABIEBAADtSCQAACQBAA7q4SmkAwEADkMGAQACAwIEAwKoAQWEBgABAIYGAAEAiAYAAACKBgABAIwGAAIAtAMADM4FAAHQBQEBz7Oe09zPR8fdZQAABIcBAADtRzhFAAAAq+gzvgDsDr4BTYUBAADI3WUAAASIAQAA7cRJ3WUAAASJAQAA7XELSd0EAgEAAHEmAACWlkndZQAABIkBAADtR89HzThFAAAAq+hC3WUAAASKAQAA7Uc4RQAAAKvoEt1lAAAEigEAAO1xJgAAlpZJ3QQoAQAASMPQJAIAx91lAAAEiQEAAO1Hz8NJ6gPFx8MopAMBAA5DBgEAAAMABAECMwOWBgAAAJgGAAEAmgYAAkC0AwAMvgBNiwEAAMvsyGUAAASOAQAA7cnEZQAABI8BAADtRxHpEQ7EZQAABI8BAADtcb4BFkkppAMBAA5DBgEAAAIABQEAOwKgBgAAAKIGAwADtAMADGwoAAAAOJoAAABlAAAEkgEAAO1lAAAEkwEAAO2dBJQBAACd7ezHDuoRyGwNAAAAOJUBAADHDuoCL8MopAMBAA5DBgEAAQYBBwICjQEHrAYAAQCuBgAAALAGAAEAsgYAAgC0BgADALYGAAQAuAYABQC0AwAMmgYCATiTAAAAz+1lAAAEnQEAAO1IvQC9ATO/JAIAx7/Is8mzwQXDBJ4BAABIwAWRwQUkAQDCBOhX3GUAAASfAQAA7UjABCQBAMEEwASV6DzFt5zoCsa7QJrABJ3qA8AEysWRybec6CTEOJMAAABlAAAEoAEAAO1IvP8Axrv+xZq5raGtJAEAnczqArMO6pjEKKQDAQAHBj0rJAdaAAEAJgAAAAgGAAAABAf1////CwAcBAAAAAEAAAD///9/AQAAAAE9AAoGDAAKDkMGAQACCQIIAQDDAgvCBgABAMQGAAEAxgYAAADIBgABAMoGAAIAzAYAAwDOBgAEANAGAAUA0gYABgDUBgAHANYGAAgAtAMADCYAAMezyL/Kv8EEODwBAADP7dOzwQXPZQAABKwBAADtR8EGwAXABqPoQMAEBK0BAAAErgEAAM8E+gAAAEjABSQBAGUAAASvAQAA7Ui7ECQBAJ1lAAAEcwEAAO1Iu/4kAQCdncEEkwXquziwAQAAwATt07PBB8AHvAABo+gLw8AHwAdJkwfq77PBB8AHvAABo+g+xMPAB0ed0GUAAASxAQAA7UjAB9BlAAAErAEAAO1HnCQBAJ28AAGcyMPAB0fJw8AHccPER0nDxMVJkwfqvLPBB7PIs8EIwAjPBDAAAABHo+hfwAe0nbwAAZzBB8TDwAdHnbwAAZzIw8AHR8nDwAdxw8RHScPExUnGOJMAAABlAAAEoAEAAO1Iz2UAAASxAQAA7UjACCQBAMPDwAdHw8RHnbwAAZxHriQBAJ3Kkwjql8YopAMBAA5DBgEAAAAAAAAAAQAppAMBAA5iBgHIAwEEAQQFAVcF5AYAAQDmBgEAMOgGAQEw6gYBAjDsBgEDILQDBQzEAw0AuAMHCKwDAQyuAwIMYQMAYQIAYQEAYQAA3GUCAO2Lx2UDAGIAAO3IYgEAZQAABLcBAADt7cllBABlAAAEuAEAAO1IYgIAvgAkAgDKOJgAAAAEAQEAAEgLYgMATB4AAAAkAQAupAMBAA5CBgEAAQIBBAECUAPyBgABAPQGAQAg9gYBASC0AwAMYQEAYQAAzwQrAQAAR2UAAAS8AQAA7UfHYgAAZQAABL0BAADtSL0AvQEzJAEAtEfIOLABAABiAQDtEWMBAA4LYgEATL4BAABiAQBMvwEAACikAwEABx5cL3ZpZGVvXC8oLiopXD8HjAEAAgA/AAAACAYAAAAEB/X///8LAAEvAAF2AAFpAAFkAAFlAAFvAAEvAAsBHAIAAAAAAAAA////fwEAAAADCgwBAT8ADAAKDmIGAcoDAAAAAQEADADCAwwAJgAAlpbfBMABAAAupAMBAA5iBgHMAwQJBAcFAZsCDYIHAAFAhAcAAQCGBwABAIgHAAEAigcBACCMBwEBMI4HAQIwkAcBA3CSBwEEMJQHAQUglgcBBiCYBwEHMJoHBggDtAMFDLgDBwjEAw0ArAMBDK4DAgxhBwBhBgBhBQBhBABhAwBhAgBhAQBhAADQEekDDrTHYgAAs6noB7QRYwAADmUBAGUAAATOAQAA7Z3PnWUAAAQMAQAA7Z1iAACdZQAABM8BAADtncjdYgEA7YvJZQMAYgIA7cpiAwBlAAAE0AEAAO3twQRlBABlAAAEuAEAAO1IYgQAvgAkAgDBBbsSwQZiAwAE0QEAAO3BB2IHAGUAAASsAQAA7Uezpeg0bCcAAAA40gEAAGIHALNHZQAABNMBAADtRwQiAQAAR+0RYwYADg7qDMEIbAcAAAAO6gIvOJgAAABlAAAE1AEAAO1IC2IAAEzVAQAAZQQAZQAABNYBAADtSGIGALsSmyQBAEzXAQAAYgUATNgBAAAkAQAupAMBAA5CBgEAAQUBBAMCwQIGsgcAAQC0BwEAMLYHAQEwuAcBAjC6BwEDILwHAQQwkAcDDbQDAAyCBwADYQQAYQMAYQIAYQEAYQAAZQAAz+1lAQAENAEAAO1IZQEABN8BAADtJAEAs0dlAQAE0wEAAO1HZQEABOABAADtR8fPBCsBAABHZQEABLwBAADtRwQvAQAASL0AvQEzJAEAtEfIZQAAz+1lAQAENAEAAO1IZQEABOEBAADtJAEAs0dlAQAE4gEAAO1Hs0cE8AAAAEfJZQAAz+1lAQAENAEAAO1IZQEABOMBAADtJAEAs0dlAQAE4gEAAO1Hs0dlAQAE5AEAAO1HEekDDr/KZQAAz+1lAQAENAEAAO1IZQEABOUBAADtJAEAs0dlAQAE4gEAAO1Hs0dlAQAE5AEAAO1HEekDDr/BBGIDAN2p6Ae/EWMDAA4LYgEATOYBAABiAgBM5wEAAGIAAEzoAQAAYgMAEekKDmIEABHpAw6/TOkBAAAopAMBAAcaXC93YXRjaFwvKC4qKQeGAQACADwAAAAIBgAAAAQH9f///wsAAS8AAXcAAWEAAXQAAWMAAWgAAS8ACwEcAgAAAAAAAAD///9/AQAAAAMKDAEMAAoOQwYBzgMBAAEEAQY6AdQHAAEAtAMFDM8E7wAAAEi9AL0BM78kAgBlAAAEnQEAAO1IvQK9AzO/JAIAZQAABJ0BAADtSL0EvQUzBOsBAAAlAgCkAwEABxw8XC8/W14+XSsoPnwkKQe8AQECAFcAAAAIBgAAAAQH9f///wsAATwAHAQAAAAAAAAAAQAAAAEAAAABLwAKHAwAAAABAAAA////fwEAAAAVAgAAAD0APwD//woLAQkIAAAAAT4ABwEAAAAGDAEMAAoHECYuezEsNX07B2ABAQApAAAACAYAAAAEB/X///8LAAEmABwCAAAAAQAAAAUAAAABAAAAAwoBOwAMAAoHDFxzezIsfQeoAQEBAE0AAAAIBgAAAAQH9f///wsAHCwAAAACAAAA////fwEAAAAVCgAJAA0AIAAgAKAAoACAFoAWACAKICggKSAvIC8gXyBfIAAwADD//v/+CgwACg5iBgHQAwEJAQgGBr8GCtgHAAEA2gcBADDcBwEBMN4HAQIw4AcBAyDiBwIHMOQHAwUw5gcBBDDoBwAAAOoHAAgAxAMNALgDBwisAwEMzgMSALQDBQyqAwAMYQYAYQMAYQIAYQEAYQAA22UBAAT2AQAAnc+d7YvHZQIAYgAA7chiAQAE9wEAAO3JC89M5gEAAN5iAQBlBAAE+AEAAO3tZQQABPkBAADtSCQAAO1lBAAE+gEAAO1IJAAATPsBAADKYQQAYgIAfeuDAcEEYQUAYgEAYgQA7WUEAAT8AQAA7UgkAABlBAAE+gEAAO1IJAAAwQViBQBlBAAE/QEAAO1IZQQABP4BAADtJAEA6CNiAwBlBAAE/wEAAO1xYgUAZQQABAACAADtSLYkAQBJ6x4BYgUAZQQABP0BAADtSGUEAAQBAgAA7SQBAOgjYgMAZQQABHUBAADtcWIFAGUEAAQAAgAA7Ui2JAEASevhAGIFAGUEAAT9AQAA7UgEAgIAACQBAOgfYgMAZQQABAMCAADtcWIFAAQwAQAASLYkAQBJ66wAYgUAZQQABP0BAADtSGUEAAQEAgAA7SQBAOgiYgMAZQQABAUCAADtcWIFAGUEAAQAAgAA7Ui2JAEASepvYgUAZQQABP0BAADtSGUEAAQGAgAA7SQBAOgiYgMAZQQABBUBAADtcWIFAGUEAAQAAgAA7Ui2JAEASeozYgUAZQQABP0BAADtSGUEAAQHAgAA7SQBAOgYYgMABAgCAABxYgUABDABAABItiQBAEmAAGl8/v//DoNiAABlBAAEvQEAAO1IvQC9ATMkAQC0R2UEAASdAQAA7Ui9Ar0DMwQJAgAAJAIAZQQABJ0BAADtSL0EvQUzBAoCAAAkAgDBBmUFAGUEAAQLAgAA7UdlBAAEDAIAAO1HZQQABA0CAADtSGUEAAQOAgAA7SQBAMEHZQUAZQQABA8CAADtR2UEAAQQAgAA7UhiBgDABwvAB0wRAgAAZQUAZQQABBICAADtR2UEAAQTAgAA7UdMFAIAACQDAMEIZQUAZQQABAsCAADtR2UEAAQMAgAA7UdlBAAE1AEAAO1IwAgkAQAEXQAAAEgEFQIAACQBAMEIYgMAZQQABBYCAADtcWUEAAQXAgAA7UliAwBlBAAEGAIAAO1xwAgEWwAAAEgEGQIAACQBAEk4mAAAAGUEAATUAQAA7UgLYgMAJgEATNgBAAAkAQAupAMBAAcobGV0IHVybHMgPSBcIiguKilcIjsHsAEAAgBRAAAACAYAAAAEB/X///8LAAFsAAFlAAF0AAEgAAF1AAFyAAFsAAFzAAEgAAE9AAEgAAEiAAsBHAIAAAAAAAAA////fwEAAAADCgwBASIAATsADAAKBwJfBzQBAQATAAAACAYAAAAEB/X///8LAAFfAAwACgcCLQc0AQEAEwAAAAgGAAAABAf1////CwABLQAMAAoOQwYB0gMAAwAIAwK/AQO0CAAAALYIAAEAuAgAAgCqAwAMtAMFDLADAwxlAABlAQAECwIAAO1HBP4AAABHZQEABA0CAADtSGUBAAQdAgAA7SQBAMdlAABlAQAECwIAAO1HBB4CAABHZQEABA0CAADtSAQfAgAAJAEAyGUAAGUBAAQPAgAA7UcEIAIAAEhlAgDsBCECAABIBCICAAAkAQDDC8RMEQIAAGUAAGUBAAQSAgAA7UcENwEAAEdMFAIAACQDAM1lAQAErwEAAO1IJAAAZQEABJ0BAADtSL0AvQEzBCMCAAAkAgDNKKQDAQAHBFwrBzQBAQATAAAACAYAAAAEB/X///8LAAErAAwACg5iBgHUAwIKAgcEBpIDDMgIAAEAyggAAQDMCAEAIM4IAQEg0AgDAiDSCAMDINQIAAAA1ggABUDYCAAGQNoIAAcA3AgEAiDeCAQJILQDBQzSAxQAvAMJCLoDCAhhAQBhAADPs0fHOLABAADPtEftyGIAAGUAAAQwAgAA7alpIQEAAGEDAGECADiwAQAAYgEA7cnc7Mo4XAEAAGICAAQ2AQAAnWIDAJ0LC2UAAAQxAgAA7UxWAQAATPsAAADui8EEODICAAAmAACWZQIAZQMAZQAABDMCAADtCyIFAIvBBWICAGUAAAQ0AgAA7UizYgIAZQAABJ8BAADtSAQJAgAAuwokAgAkAgDBBsAEZQAABGIBAADtR8IHZQAABJ0BAADtSL0AvQEzvgIkAgDCB2UAAASdAQAA7Ui9A70EM74FJAIAwQfABGUAAAQ1AgAA7UdlAAAENgIAAO1xwAdlAAAErAEAAO1HSTiYAAAABAEBAABIC8AEZQAABDcCAADtR0waAQAAwAdMQAEAAMAEZQAABDUCAADtR0z7AAAAJAEALmEJAGEIADiwAQAAYgEA7cEI3OzBCTiYAAAABAEBAABIC7wtAUwaAQAAv0xAAQAAC2IIAGUAAAQ4AgAA7Z1iCQCdTDkCAABM+wAAACQBAC6kAwEABxYoXC90c1wvXFMrKQfQAQECAGEAAAAIBgAAAAQH9f///wsACwEBLwABdAABcwABLwAcMAAAAAEAAAD///9/AQAAABULAAAACAAOAB8AIQCfAKEAfxaBFv8fCyAnICogLiAwIF4gYCD/LwEw/v4A////CgwBDAAKDkMGAQACAQIEAwAyA/QIAAEA9ggAAQD4CAEAILQDAAzYCAYB1ggFAWEAANAEJQEAAEhlAAAEPQIAAO0kAQCW6ATc6gK/0J3H3ThbAQAAOFsBAABiAADt7Z0opAMBAAc+KCNFWFQtWC1LRVlcUytVUkk9IikoXFMrKSgiXFMrKQesBAEEAA8BAAAIBgAAAAQH9f///wsACwEBIwABRQABWAABVAABLQABWAABLQABSwABRQABWQAcMAAAAAEAAAD///9/AQAAABULAAAACAAOAB8AIQCfAKEAfxaBFv8fCyAnICogLiAwIF4gYCD/LwEw/v4A////CgFVAAFSAAFJAAE9AAEiAAwBCwIcMAAAAAEAAAD///9/AQAAABULAAAACAAOAB8AIQCfAKEAfxaBFv8fCyAnICogLiAwIF4gYCD/LwEw/v4A////CgwCCwMBIgAcMAAAAAEAAAD///9/AQAAABULAAAACAAOAB8AIQCfAKEAfxaBFv8fCyAnICogLiAwIF4gYCD/LwEw/v4A////CgwDDAAKDkMGAQAEAQQEAgAyBfwIAAEA/ggAAQCACQABAIIJAAEAhAkBACDYCAYB1ggFAWEAANEEJQEAAEgEHAEAACQBAJboBNvqAr/RncfQ3J04WwEAADhbAQAAYgAA7e2d0p0opAMBAA5iBgHWAwMAAwYDADcDhgkAAQCICQABAIoJAAEAtAMFDNIDFAC+AwoMOJgAAAAEAQEAAEgLs0weAQAA0GUAAAQ4AgAA7Z3c7J1MRgIAAAtlAgBMVgEAAExHAgAAJAEALqQDAQAOYgYB2AMDCQMHBgGSAgyQCQABAJIJAAEAlAkAAQCWCQEAIJgJAQEwmgkBAjCcCQEDcJ4JAQQwoAkBBSCiCQEGIKQJAQcwpgkGCAO0AwUMuAMHCNIDFADEAw0ArAMBDK4DAgxhBwBhBgBhBQBhBABhAwBhAgBhAQBhAADREekDDrTHYgAAs6noB7QRYwAADmUBAGUAAARUAgAA7Z3PnWUAAARVAgAA7Z1iAACdZQAABFYCAADtnd3sncjeYgEA7YvJZQQAYgIA7cpiAwAE/AAAAO3BBGUFAAQzAQAASGIEAL4AJAIAwQW7EsEGYgMABNEBAADtwQdiBwAEMAAAAEezpeg0bCcAAAA40gEAAGIHALNHBCsBAABHZQAABFcCAADtR+0RYwYADg7qDMEIbAcAAAAO6gIvOJgAAABlAAAE1AEAAO1IC2IAAEzVAQAAZQUAZQAABNYBAADtSGIGALsSmyQBAEzXAQAAYgUATNgBAAAkAQAupAMBAA5CBgEAAQUBBAICuQIGsAkAAQCyCQEAMLQJAQEwtgkBAjC4CQEDILoJAQQwnAkDDbQDAAxhBABhAwBhAgBhAQBhAABlAADP7WUBAAQ0AQAA7UgEOQEAACQBALNHBCsBAABHBPIAAABHx89lAQAE0wEAAO1HZQEABLwBAADtR2UBAAS9AQAA7Ui9AL0BMyQBALRHyGUAAM/tZQEABDQBAADtSAQUAQAAJAEAs0dlAQAE4gEAAO1Hs0dlAQAE5AEAAO1HyWUAAM/tZQEABDQBAADtSGUBAATjAQAA7SQBALNHZQEABOIBAADtR7NHBPAAAABHEekDDr/KZQAAz+1lAQAENAEAAO1IZQEABOUBAADtJAEAs0cEPwEAAEezR2UBAATkAQAA7UcR6QMOv8EEYgMABF4CAACp6Ae/EWMDAA4LYgEATOYBAABiAgBM5wEAAGIAAEzoAQAAYgMAEekKDmIEABHpAw6/TOkBAAAopAMBAAcaXC93YXRjaFwvKC4qKQeGAQACADwAAAAIBgAAAAQH9f///wsAAS8AAXcAAWEAAXQAAWMAAWgAAS8ACwEcAgAAAAAAAAD///9/AQAAAAMKDAEMAAoOQwYBqAMAAAACCAA6AMYDDgDIAw8AygMQAMwDEQDQAxMA1gMWANQDFQDYAxcAC9tMXwIAANxMYAIAAN1MYQIAAN5MYgIAAF4EAExjAgAAXgUATGQCAABeBgBMgwAAAF4HAExlAgAAKKQDAQA=
\ No newline at end of file
diff --git a/jar/1012.jar b/jar/1012.jar
new file mode 100644
index 00000000..943e46f6
Binary files /dev/null and b/jar/1012.jar differ
diff --git a/jar/928.jar b/jar/928.jar
deleted file mode 100644
index e5679f7d..00000000
Binary files a/jar/928.jar and /dev/null differ
diff --git a/jar/XYQ.jar b/jar/XYQ.jar
index 751b08b6..16427dbc 100644
Binary files a/jar/XYQ.jar and b/jar/XYQ.jar differ
diff --git a/js/4K视界[V2].js b/js/4K视界[V2].js
index 66d2e2f8..a1436013 100644
--- a/js/4K视界[V2].js
+++ b/js/4K视界[V2].js
@@ -25,29 +25,47 @@ var rule = {
class_url: '1&21&2&3&4&23&24&20',
play_parse:true,
lazy:`js:
+ let play_Url = '';
if (/\\.m3u8|\\.mp4/.test(input)) {
input = {
jx: 0,
url: input,
parse: 0
}
- } else if (/,/.test(input) && /url=/.test(input)) {
+ } else if (/,/.test(input) && /url=/.test(input)) {
+ input = input.split('url=');
+ play_Url = input[0].split(',')[0];
input = {
jx: 0,
- url: input.split(',')[1],
+ url: input[1],
+ playUrl: play_Url,
parse: 1
}
- } else if (/url=|id=/.test(input)) {
+ } else if (/url=|id=/.test(input)) {
input = {
jx: 0,
url: JSON.parse(request(input)).url,
parse: 0
}
+ } else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
+ play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
+ // play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
+ input = {
+ jx: 0,
+ url: input,
+ playUrl: play_Url,
+ parse: 1,
+ header: JSON.stringify({
+ 'user-agent': 'Mozilla/5.0',
+ }),
+ }
} else if (/^YuMi|^FEI-/.test(input)) {
let purl = JSON.parse(request("http://175.178.183.192:84/api/?key=f3913eb3f85a8298b3e6e427b8712b2e&url=" + input)).url;
input = {
jx: 0,
url: purl,
+ // url: input,
+ // playUrl: 'json:http://175.178.183.192:84/api/?key=f3913eb3f85a8298b3e6e427b8712b2e&url=',
parse: 0
}
} else {
@@ -66,22 +84,25 @@ var rule = {
} else {
jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
}
- videoList = jsondata.data.list[0].vod_list;
+ videoList = jsondata.data.list;
} else {
if(HOST.endsWith('/')){
jsondata = JSON.parse(request(HOST + 'index_video'));
} else {
jsondata = JSON.parse(request(HOST + '/index_video'));
}
- videoList = /xgapp/.test(HOST)?jsondata.data[0].vlist:jsondata.list[0].vlist;
+ videoList = /xgapp/.test(HOST) ? jsondata.data : jsondata.list;
}
// log('videoList =========> '+stringify(videoList));
- videoList.forEach(it => {
- d.push({
- url:it.vod_id,
- title:it.vod_name,
- img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
- desc:it.vod_remarks,
+ videoList.forEach((it,idex) => {
+ let vlist = /v1\\.vod/.test(HOST) ? videoList[idex].vod_list : videoList[idex].vlist ;
+ vlist.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
});
});
setResult(d);
@@ -111,67 +132,72 @@ var rule = {
setResult(d);
`,
二级:`js:
- if (/v1\\.vod/.test(HOST)) {
- input = HOST + '/'+ input.split('/')[3];
- } else {
- input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
- }
- try {
- let html = request(input);
- html = JSON.parse(html);
- let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
- VOD = {
- vod_id: node.vod_id,
- vod_name: node.vod_name,
- vod_pic: node.vod_pic,
- type_name: node.vod_class,
- vod_year: node.vod_year,
- vod_area: node.vod_area,
- vod_remarks: node.vod_remarks,
- vod_actor: node.vod_actor,
- vod_director: node.vod_director,
- vod_content: node.vod_content.strip()
- };
- let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
- let playMap = {};
- if (typeof play_url === 'undefined') {
- var play_url = ''
- }
- episodes.forEach(ep => {
- let from = [];
- if (/v1\\.vod/.test(HOST)) {
- from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
- } else {
- from = ep.code||ep.name;
- }
- if (!playMap.hasOwnProperty(from)) {
- playMap[from] = []
- }
- let parse_api = '';
- if (/v1\\.vod/.test(HOST)) {
- parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
- // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
- } else {
- parse_api = ep.parse_api;
- }
- log('parse_api =========> '+parse_api);
- if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
- parse_api = parse_api.replaceAll('..','.') ;
- ep.url = ep.url.replaceAll('$','$'+parse_api);
- }
- playMap[from].push(ep.url)
- });
- let playFrom = [];
- let playList = [];
- Object.keys(playMap).forEach(key => {
- playFrom.push(key);
- playList.push(playMap[key])
- });
- VOD.vod_play_from = playFrom.join('$$$');
- VOD.vod_play_url = playList.join('$$$');
- } catch (e) {
- log("获取二级详情页发生错误:" + e.message)
- }
+ if (/v1\\.vod/.test(HOST)) {
+ input = HOST + '/'+ input.split('/')[3];
+ } else {
+ input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
+ }
+ try {
+ let html = request(input);
+ html = JSON.parse(html);
+ let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
+ VOD = {
+ vod_id: node.vod_id,
+ vod_name: node.vod_name,
+ vod_pic: node.vod_pic,
+ type_name: node.vod_class,
+ vod_year: node.vod_year,
+ vod_area: node.vod_area,
+ vod_remarks: node.vod_remarks,
+ vod_actor: node.vod_actor,
+ vod_director: node.vod_director,
+ vod_content: node.vod_content.strip()
+ };
+ if (typeof play_url === 'undefined') {
+ var play_url = ''
+ }
+ let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
+ if (episodes != '') {
+ let playMap = {};
+ episodes.forEach(ep => {
+ let from = [];
+ if (/v1\\.vod/.test(HOST)) {
+ from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
+ } else {
+ from = ep.code||ep.name;
+ }
+ if (!playMap.hasOwnProperty(from)) {
+ playMap[from] = []
+ }
+ let parse_api = '';
+ if (/v1\\.vod/.test(HOST)) {
+ parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
+ // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
+ } else {
+ parse_api = ep.parse_api;
+ }
+ log('parse_api =========> '+parse_api);
+ if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
+ parse_api = parse_api.replaceAll('..','.') ;
+ ep.url = ep.url.replaceAll('$','$'+parse_api);
+ }
+ playMap[from].push(ep.url)
+ });
+ let playFrom = [];
+ let playList = [];
+ Object.keys(playMap).forEach(key => {
+ playFrom.push(key);
+ playList.push(playMap[key])
+ });
+ VOD.vod_play_from = playFrom.join('$$$');
+ VOD.vod_play_url = playList.join('$$$');
+ } else {
+ VOD.vod_play_from = node.vod_play_from;
+ VOD.vod_play_url = node.vod_play_url;
+ }
+ } catch (e) {
+ log("获取二级详情页发生错误:" + e.message);
+ }
`,
搜索:`js:
let d = [];
diff --git a/js/EMO蓝光[V2].js b/js/EMO蓝光[V2].js
index d1276814..473dd4c6 100644
--- a/js/EMO蓝光[V2].js
+++ b/js/EMO蓝光[V2].js
@@ -21,27 +21,43 @@ var rule = {
class_url:'1&2&3&4',
play_parse:true,
lazy:`js:
- if (/\\.m3u8|\\.mp4/.test(input)) {
- input = {
- jx: 0,
- url: input,
- parse: 0
- }
+ let play_Url = '';
+ if (/\\.m3u8|\\.mp4/.test(input)) {
+ input = {
+ jx: 0,
+ url: input,
+ parse: 0
+ }
} else if (/,/.test(input) && /url=/.test(input)) {
- input = {
- jx: 0,
- url: input.split(',')[1],
- parse: 1
- }
+ input = input.split('url=');
+ play_Url = input[0].split(',')[0];
+ input = {
+ jx: 0,
+ url: input[1],
+ playUrl: play_Url,
+ parse: 1
+ }
} else if (/url=|id=/.test(input)) {
- input = {
- jx: 0,
- url: JSON.parse(request(input)).url,
- parse: 0
- }
- } else {
+ input = {
+ jx: 0,
+ url: JSON.parse(request(input)).url,
+ parse: 0
+ }
+ } else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
+ play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
+ // play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
+ input = {
+ jx: 0,
+ url: input,
+ playUrl: play_Url,
+ parse: 1,
+ header: JSON.stringify({
+ 'user-agent': 'Mozilla/5.0',
+ }),
+ }
+ } else {
input
- }
+ }
`,
limit:6,
// 图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
@@ -55,22 +71,25 @@ var rule = {
} else {
jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
}
- videoList = jsondata.data.list[0].vod_list;
+ videoList = jsondata.data.list;
} else {
if(HOST.endsWith('/')){
jsondata = JSON.parse(request(HOST + 'index_video'));
} else {
jsondata = JSON.parse(request(HOST + '/index_video'));
}
- videoList = /xgapp/.test(HOST)?jsondata.data[0].vlist:jsondata.list[0].vlist;
+ videoList = /xgapp/.test(HOST) ? jsondata.data : jsondata.list;
}
// log('videoList =========> '+stringify(videoList));
- videoList.forEach(it => {
- d.push({
- url:it.vod_id,
- title:it.vod_name,
- img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
- desc:it.vod_remarks,
+ videoList.forEach((it,idex) => {
+ let vlist = /v1\\.vod/.test(HOST) ? videoList[idex].vod_list : videoList[idex].vlist ;
+ vlist.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
});
});
setResult(d);
@@ -121,45 +140,50 @@ var rule = {
vod_director: node.vod_director,
vod_content: node.vod_content.strip()
};
- let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
- let playMap = {};
if (typeof play_url === 'undefined') {
var play_url = ''
}
- episodes.forEach(ep => {
- let from = [];
- if (/v1\\.vod/.test(HOST)) {
- from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
- } else {
- from = ep.code||ep.name;
- }
- if (!playMap.hasOwnProperty(from)) {
- playMap[from] = []
- }
- let parse_api = '';
- if (/v1\\.vod/.test(HOST)) {
- parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
- // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
- } else {
- parse_api = ep.parse_api;
- }
- log('parse_api =========> '+parse_api);
- if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
- parse_api = parse_api.replaceAll('..','.') ;
- ep.url = ep.url.replaceAll('$','$'+parse_api);
- }
- playMap[from].push(ep.url)
- });
- let playFrom = [];
- let playList = [];
- Object.keys(playMap).forEach(key => {
- playFrom.push(key);
- playList.push(playMap[key])
- });
- VOD.vod_play_from = playFrom.join('$$$');
- VOD.vod_play_url = playList.join('$$$');
+ let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
+ if (episodes != '') {
+ let playMap = {};
+ episodes.forEach(ep => {
+ let from = [];
+ if (/v1\\.vod/.test(HOST)) {
+ from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
+ } else {
+ from = ep.code||ep.name;
+ }
+ if (!playMap.hasOwnProperty(from)) {
+ playMap[from] = []
+ }
+ let parse_api = '';
+ if (/v1\\.vod/.test(HOST)) {
+ parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
+ // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
+ } else {
+ parse_api = ep.parse_api;
+ }
+ log('parse_api =========> '+parse_api);
+ if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
+ parse_api = parse_api.replaceAll('..','.') ;
+ ep.url = ep.url.replaceAll('$','$'+parse_api);
+ }
+ playMap[from].push(ep.url)
+ });
+ let playFrom = [];
+ let playList = [];
+ Object.keys(playMap).forEach(key => {
+ playFrom.push(key);
+ playList.push(playMap[key])
+ });
+ VOD.vod_play_from = playFrom.join('$$$');
+ VOD.vod_play_url = playList.join('$$$');
+ } else {
+ VOD.vod_play_from = node.vod_play_from;
+ VOD.vod_play_url = node.vod_play_url;
+ }
} catch (e) {
- log("获取二级详情页发生错误:" + e.message)
+ log("获取二级详情页发生错误:" + e.message);
}
`,
搜索:`js:
diff --git a/js/cokemv[V2].js b/js/cokemv[V2].js
index a68a74b4..5d85d28c 100644
--- a/js/cokemv[V2].js
+++ b/js/cokemv[V2].js
@@ -21,27 +21,43 @@ var rule = {
class_url:'1&2&3&29',
play_parse:true,
lazy:`js:
- if (/\\.m3u8|\\.mp4/.test(input)) {
- input = {
- jx: 0,
- url: input,
- parse: 0
- }
+ let play_Url = '';
+ if (/\\.m3u8|\\.mp4/.test(input)) {
+ input = {
+ jx: 0,
+ url: input,
+ parse: 0
+ }
} else if (/,/.test(input) && /url=/.test(input)) {
- input = {
- jx: 0,
- url: input.split(',')[1],
- parse: 1
- }
+ input = input.split('url=');
+ play_Url = input[0].split(',')[0];
+ input = {
+ jx: 0,
+ url: input[1],
+ playUrl: play_Url,
+ parse: 1
+ }
} else if (/url=|id=/.test(input)) {
- input = {
- jx: 0,
- url: JSON.parse(request(input)).url,
- parse: 0
- }
- } else {
+ input = {
+ jx: 0,
+ url: JSON.parse(request(input)).url,
+ parse: 0
+ }
+ } else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
+ play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
+ // play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
+ input = {
+ jx: 0,
+ url: input,
+ playUrl: play_Url,
+ parse: 1,
+ header: JSON.stringify({
+ 'user-agent': 'Mozilla/5.0',
+ }),
+ }
+ } else {
input
- }
+ }
`,
limit:6,
// 图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
@@ -55,22 +71,25 @@ var rule = {
} else {
jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
}
- videoList = jsondata.data.list[0].vod_list;
+ videoList = jsondata.data.list;
} else {
if(HOST.endsWith('/')){
jsondata = JSON.parse(request(HOST + 'index_video'));
} else {
jsondata = JSON.parse(request(HOST + '/index_video'));
}
- videoList = /xgapp/.test(HOST)?jsondata.data[0].vlist:jsondata.list[0].vlist;
+ videoList = /xgapp/.test(HOST) ? jsondata.data : jsondata.list;
}
// log('videoList =========> '+stringify(videoList));
- videoList.forEach(it => {
- d.push({
- url:it.vod_id,
- title:it.vod_name,
- img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
- desc:it.vod_remarks,
+ videoList.forEach((it,idex) => {
+ let vlist = /v1\\.vod/.test(HOST) ? videoList[idex].vod_list : videoList[idex].vlist ;
+ vlist.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
});
});
setResult(d);
@@ -121,45 +140,50 @@ var rule = {
vod_director: node.vod_director,
vod_content: node.vod_content.strip()
};
- let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
- let playMap = {};
if (typeof play_url === 'undefined') {
var play_url = ''
}
- episodes.forEach(ep => {
- let from = [];
- if (/v1\\.vod/.test(HOST)) {
- from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
- } else {
- from = ep.code||ep.name;
- }
- if (!playMap.hasOwnProperty(from)) {
- playMap[from] = []
- }
- let parse_api = '';
- if (/v1\\.vod/.test(HOST)) {
- parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
- // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
- } else {
- parse_api = ep.parse_api;
- }
- log('parse_api =========> '+parse_api);
- if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
- parse_api = parse_api.replaceAll('..','.') ;
- ep.url = ep.url.replaceAll('$','$'+parse_api);
- }
- playMap[from].push(ep.url)
- });
- let playFrom = [];
- let playList = [];
- Object.keys(playMap).forEach(key => {
- playFrom.push(key);
- playList.push(playMap[key])
- });
- VOD.vod_play_from = playFrom.join('$$$');
- VOD.vod_play_url = playList.join('$$$');
+ let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
+ if (episodes != '') {
+ let playMap = {};
+ episodes.forEach(ep => {
+ let from = [];
+ if (/v1\\.vod/.test(HOST)) {
+ from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
+ } else {
+ from = ep.code||ep.name;
+ }
+ if (!playMap.hasOwnProperty(from)) {
+ playMap[from] = []
+ }
+ let parse_api = '';
+ if (/v1\\.vod/.test(HOST)) {
+ parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
+ // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
+ } else {
+ parse_api = ep.parse_api;
+ }
+ log('parse_api =========> '+parse_api);
+ if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
+ parse_api = parse_api.replaceAll('..','.') ;
+ ep.url = ep.url.replaceAll('$','$'+parse_api);
+ }
+ playMap[from].push(ep.url)
+ });
+ let playFrom = [];
+ let playList = [];
+ Object.keys(playMap).forEach(key => {
+ playFrom.push(key);
+ playList.push(playMap[key])
+ });
+ VOD.vod_play_from = playFrom.join('$$$');
+ VOD.vod_play_url = playList.join('$$$');
+ } else {
+ VOD.vod_play_from = node.vod_play_from;
+ VOD.vod_play_url = node.vod_play_url;
+ }
} catch (e) {
- log("获取二级详情页发生错误:" + e.message)
+ log("获取二级详情页发生错误:" + e.message);
}
`,
搜索:`js:
diff --git a/js/ikanbot2.js b/js/ikanbot2.js
index 6fce2480..50b74719 100644
--- a/js/ikanbot2.js
+++ b/js/ikanbot2.js
@@ -109,8 +109,7 @@ var rule = {
double:true,
tab_remove:['wjm3u8','ikm3u8','sdm3u8','M3U8','jinyingm3u8','fsm3u8','ukm3u8'],//移除某个线路及相关的选集
tab_order:['lzm3u8','gsm3u8','zuidam3u8','bjm3u8','snm3u8','wolong','ffm3u8','xlm3u8','yhm3u8'],//线路顺序,按里面的顺序优先,没写的依次排后面
- tab_rename:{'lzm3u8':'量子','1080zyk':'1080看','zuidam3u8':'最大资源','kuaikan':'快看',
- 'bfzym3u8':'暴风','ffm3u8':'非凡','snm3u8':'索尼','tpm3u8':'淘片','tkm3u8':'天空','wolong':'卧龙'},//线路名替换如:lzm3u8替换为量子资源
+ tab_rename:{'lzm3u8':'量子','1080zyk':'1080看','zuidam3u8':'最大资源','kuaikan':'快看', 'bfzym3u8':'暴风','ffm3u8':'非凡','snm3u8':'索尼','tpm3u8':'淘片','tkm3u8':'天空','wolong':'卧龙'},//线路名替换如:lzm3u8替换为量子资源
推荐:'.v-list;div.item;*;*;*;*', //这里可以为空,这样点播不会有内容
// 一级:'.v-list&&div.item;p&&Text;img&&src;;a&&href', //一级的内容是推荐或者点播时候的一级匹配
一级:'.v-list&&div.item;p&&Text;img&&data-src;;a&&href', //一级的内容是推荐或者点播时候的一级匹配
diff --git a/js/在线之家.js b/js/在线之家.js
index 04aafe71..1a6c7803 100644
--- a/js/在线之家.js
+++ b/js/在线之家.js
@@ -43,7 +43,13 @@ var rule = {
"Referer": HOST
}
});
- let code = ifrwy.match(/var url = '(.*?)'/)[1].split('').reverse().join('');
+ // let code = ifrwy.match(/var url = '(.*?)'/)[1].split('').reverse().join('');
+ let code = '';
+ if (/Cloud/.test(url)) {
+ code = ifrwy.match(/var url = '(.*?)'/)[1].split('').reverse().join('');
+ } else if (/player-v2/.test(url)) {
+ code = ifrwy.match(/data":"(.*?)"/)[1].split('').reverse().join('');
+ }
let temp = '';
for (let i = 0x0; i < code.length; i = i + 0x2) {
temp += String.fromCharCode(parseInt(code[i] + code[i + 0x1], 0x10))
diff --git a/js/影探[V2].js b/js/影探[V2].js
index 967abf2d..226d6608 100644
--- a/js/影探[V2].js
+++ b/js/影探[V2].js
@@ -1,101 +1,228 @@
-var 二级=`js:
-try {
- let html = request(input);
- html = JSON.parse(html);
- let node = html.data;
- VOD = {
- vod_id: node["vod_id"],
- vod_name: node["vod_name"],
- vod_pic: node["vod_pic"],
- type_name: node["vod_class"],
- vod_year: node["vod_year"],
- vod_area: node["vod_area"],
- vod_remarks: node["vod_remarks"],
- vod_actor: node["vod_actor"],
- vod_director: node["vod_director"],
- vod_content: node["vod_content"].strip(),
- };
- // let episodes = node.vod_url_with_player;
- // let playMap = {};
- // if (typeof play_url === "undefined") {
- // var play_url = ""
- // }
- // episodes.forEach(function(ep) {
- // let source = ep["name"];
- // if (!playMap.hasOwnProperty(source)) {
- // playMap[source] = []
- // }
- // // playMap[source].append(ep["url"])
- // playMap[source].append(ep["url"].replace(/影探lfytv.cn(.*).mp4#/,''))
- // });
- // let playFrom = [];
- // let playList = [];
- // Object.keys(playMap).forEach(function(key) {
- // playFrom.append(key);
- // playList.append(playMap[key])
- // });
- // let vod_play_from = playFrom.join("$$$");
- // let vod_play_url = playList.join("$$$");
- // VOD["vod_play_from"] = vod_play_from;
- VOD["vod_play_from"] = node["vod_play_from"];
- // VOD["vod_play_url"] = vod_play_url
- VOD["vod_play_url"] = node["vod_play_url"].replace(/影探lfytv(.*?)mp4#/g,'')
-} catch (e) {
- log("获取二级详情页发生错误:" + e.message)
-}
-`;
-
var rule = {
title: '影探[V2]', // csp_AppYsV2
- // host: 'http://long123.lfytyl.com/api.php/app/',
- host: 'https://weixine.net/ysc.json',
- // hostJs:'print(HOST);let html=JSON.parse(request(HOST,{headers:{"User-Agent":PC_UA}}));let src = html.sites[9].ext.replace("/api.php/app/","");print(src);HOST=src',//网页域名根动态抓取js代码。通过HOST=赋值
- hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src = html.match(/影探4K.*?ext":"(.*?)\\/api/)[1];print(src);HOST=src',
- homeUrl:'/api.php/app/index_video',
- url: '/api.php/app/video?tid=fyclassfyfilter&limit=18&pg=fypage',
- filter_url:'&class={{fl.class}}&area={{fl.area}}&lang={{fl.lang}}&year={{fl.year}}',
+ // host: 'http://ytcms.lyyytv.cn/api.php/app/',
+ host: 'http://vipcms.lyyytv.cn/api.php/app/',
+ url: 'video?tid=fyclassfyfilter&limit=20&pg=fypage',
+ filter_url:'&class={{fl.class}}&area={{fl.area}}&lang={{fl.lang}}&letter={{fl.letter}}&year={{fl.year}}&by={{fl.by}}',
filter: {
"32":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"篮球","v":"篮球"},{"n":"足球","v":"足球"},{"n":"网球","v":"网球"},{"n":"斯洛克","v":"斯洛克"}]}],
- "20":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "21":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "47":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "48":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "20":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "21":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]}],
+ "47":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "48":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
"50":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "51":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "5":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "45":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "44":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "49":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
"46":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "53":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "58":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "5":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "44":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "51":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"国漫","v":"国漫"},{"n":"日本","v":"日本"},{"n":"港台","v":"港台"},{"n":"欧美","v":"欧美"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "45":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "52":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
+ "4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]}],
+ "3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"选秀","v":"选秀"},{"n":"情感","v":"情感"},{"n":"访谈","v":"访谈"},{"n":"播报","v":"播报"},{"n":"旅游","v":"旅游"},{"n":"音乐","v":"音乐"},{"n":"美食","v":"美食"},{"n":"纪实","v":"纪实"},{"n":"曲艺","v":"曲艺"},{"n":"生活","v":"生活"},{"n":"游戏互动","v":"游戏互动"},{"n":"财经","v":"财经"},{"n":"求职","v":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]}],
"1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}],
- "3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"选秀","v":"选秀"},{"n":"情感","v":"情感"},{"n":"访谈","v":"访谈"},{"n":"播报","v":"播报"},{"n":"旅游","v":"旅游"},{"n":"音乐","v":"音乐"},{"n":"美食","v":"美食"},{"n":"纪实","v":"纪实"},{"n":"曲艺","v":"曲艺"},{"n":"生活","v":"生活"},{"n":"游戏互动","v":"游戏互动"},{"n":"财经","v":"财经"},{"n":"求职","v":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}]
+ "2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]}]
},
- detailUrl:'/api.php/app/video_detail?id=fyid',
- searchUrl: '/api.php/app/search?text=**&pg=fypage',
+ detailUrl:'/detail?vod_id=fyid',
+ searchUrl: '/search?text=**&pg=fypage',
searchable: 2,
quickSearch: 0,
- filterable:1,
- headers:{'User-Agent':'Dart/2.14 (dart:io)'},
+ filterable:1,//是否启用分类筛选,
+ headers:{'User-Agent':'okhttp/4.1.0'},
timeout:5000,
- class_name:'体育赛事&新电影4K&新剧4K&好莱坞4K&港台经典4k&少儿动画4K&合拍经典4K&邵氏老电影4K&明星专辑4K&六公主4K&豆瓣Top250电影4K&豆瓣Top100影视剧4K&电影综合&电视剧综合&动漫&综艺', // 分类筛选 /api.php/app/nav
- class_url:'32&20&21&47&48&50&51&5&45&44&49&46&1&2&4&3',
+ // 分类筛选 /api.php/app/nav || /xgapp.php/v1/nav || /api.php/v1.vod/types
+ class_name:'体育赛事&新电影4K&新剧4K&好莱坞4K&港台经典4k&少儿动画4K&国剧盛典4K&怀旧TVB&动漫4K&邵氏老电影4K&国产老电影4K&合拍经典4K&明星专辑4K&恐怖片精选4K&动漫&综艺&电影综合&电视剧综合',
+ class_url:'32&20&21&47&48&50&46&53&58&5&44&51&45&52&4&3&1&2',
play_parse:true,
lazy:`js:
- input = /mp4|mkv/.test(input) ? {
- jx: 0,
- url: input,
- parse: 0,
- header: JSON.stringify({
- "user-agent": "Lavf/58.12.100"
- })
- } : /m3u8/.test(input) ? input : "https://jx.jsonplayer.com/player/?url=" + input
- `,
+ let play_Url = '';
+ if (/\\.m3u8|\\.mp4/.test(input)) {
+ input = {
+ jx: 0,
+ url: input,
+ parse: 0
+ }
+ } else if (/,/.test(input) && /url=/.test(input)) {
+ input = input.split('url=');
+ play_Url = input[0].split(',')[0];
+ input = {
+ jx: 0,
+ url: input[1],
+ playUrl: play_Url,
+ parse: 1
+ }
+ } else if (/url=|id=/.test(input)) {
+ input = {
+ jx: 0,
+ url: JSON.parse(request(input)).url,
+ parse: 0
+ }
+ } else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
+ play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
+ // play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
+ input = {
+ jx: 0,
+ url: input,
+ playUrl: play_Url,
+ parse: 1,
+ header: JSON.stringify({
+ 'user-agent': 'Mozilla/5.0',
+ }),
+ }
+ } else {
+ input
+ }
+ `,
limit:6,
- 推荐:'json:list;vlist;*;*;*;*',
- double: true,
- 一级:'json:list;vod_name;vod_pic;vod_remarks||vod_score;vod_id',
- 二级:二级,
- 搜索:'*',
+ // 图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
+ 推荐:`js:
+ let d = [];
+ let jsondata = [];
+ let videoList = [];
+ if (/v1\\.vod/.test(HOST)) {
+ if(HOST.endsWith('/')){
+ jsondata = JSON.parse(request(HOST + 'vodPhbAll'));
+ } else {
+ jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
+ }
+ videoList = jsondata.data.list;
+ } else {
+ if(HOST.endsWith('/')){
+ jsondata = JSON.parse(request(HOST + 'index_video'));
+ } else {
+ jsondata = JSON.parse(request(HOST + '/index_video'));
+ }
+ videoList = /xgapp/.test(HOST) ? jsondata.data : jsondata.list;
+ }
+ // log('videoList =========> '+stringify(videoList));
+ videoList.forEach((it,idex) => {
+ let vlist = /v1\\.vod/.test(HOST) ? videoList[idex].vod_list : videoList[idex].vlist ;
+ vlist.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
+ });
+ });
+ setResult(d);
+ `,
+ 一级:`js:
+ let d = [];
+ let jsondata = [];
+ let videoList = [];
+ if (/v1\\.vod/.test(HOST)) {
+ input = input.replace('video','v1.vod').replace('tid','type').replace('pg=','page=');
+ jsondata = JSON.parse(request(input));
+ videoList = jsondata.data.list;
+ } else {
+ input = HOST + '/'+ input.split('/')[4];
+ jsondata = JSON.parse(request(input));
+ videoList = jsondata.list || jsondata.data;
+ }
+ // log('videoList =========> '+stringify(videoList));
+ videoList.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
+ });
+ setResult(d);
+ `,
+ 二级:`js:
+ if (/v1\\.vod/.test(HOST)) {
+ input = HOST + '/'+ input.split('/')[3];
+ } else {
+ input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
+ }
+ try {
+ let html = request(input);
+ html = JSON.parse(html);
+ let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
+ VOD = {
+ vod_id: node.vod_id,
+ vod_name: node.vod_name,
+ vod_pic: node.vod_pic,
+ type_name: node.vod_class,
+ vod_year: node.vod_year,
+ vod_area: node.vod_area,
+ vod_remarks: node.vod_remarks,
+ vod_actor: node.vod_actor,
+ vod_director: node.vod_director,
+ vod_content: node.vod_content.strip()
+ };
+ if (typeof play_url === 'undefined') {
+ var play_url = ''
+ }
+ let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
+ if (episodes != '') {
+ let playMap = {};
+ episodes.forEach(ep => {
+ let from = [];
+ if (/v1\\.vod/.test(HOST)) {
+ from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
+ } else {
+ from = ep.code||ep.name;
+ }
+ if (!playMap.hasOwnProperty(from)) {
+ playMap[from] = []
+ }
+ let parse_api = '';
+ if (/v1\\.vod/.test(HOST)) {
+ parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
+ // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
+ } else {
+ parse_api = ep.parse_api;
+ }
+ log('parse_api =========> '+parse_api);
+ if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
+ parse_api = parse_api.replaceAll('..','.') ;
+ ep.url = ep.url.replaceAll('$','$'+parse_api);
+ }
+ playMap[from].push(ep.url)
+ });
+ let playFrom = [];
+ let playList = [];
+ Object.keys(playMap).forEach(key => {
+ playFrom.push(key);
+ playList.push(playMap[key])
+ });
+ VOD.vod_play_from = playFrom.join('$$$');
+ VOD.vod_play_url = playList.join('$$$');
+ } else {
+ VOD.vod_play_from = node.vod_play_from;
+ VOD.vod_play_url = node.vod_play_url;
+ }
+ } catch (e) {
+ log("获取二级详情页发生错误:" + e.message);
+ }
+ `,
+ 搜索:`js:
+ let d = [];
+ let jsondata = [];
+ let videoList = [];
+ if (/v1\\.vod/.test(HOST)) {
+ input = (HOST + '/'+ input.split('/')[3]).replace('/search','').replace('text=','wd=').replace('pg=','page=');
+ jsondata = JSON.parse(request(input));
+ videoList = jsondata.data.list;
+ } else {
+ input = HOST + '/'+ input.split('/')[3]
+ jsondata = JSON.parse(request(input));
+ videoList = jsondata.list || jsondata.data;
+ }
+ // log('videoList =========> '+stringify(videoList));
+ videoList.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
+ });
+ setResult(d);
+ `,
}
\ No newline at end of file
diff --git a/js/热剧猫[V2].js b/js/热剧猫[V2].js
index 6002228b..c77cd99a 100644
--- a/js/热剧猫[V2].js
+++ b/js/热剧猫[V2].js
@@ -21,31 +21,47 @@ var rule = {
class_url:'1&2&3&4',
play_parse:true,
lazy:`js:
+ let play_Url = '';
if (/\\.m3u8|\\.mp4/.test(input)) {
input = {
jx: 0,
url: input,
parse: 0
}
- } else if (/,/.test(input) && /url=/.test(input)) {
+ } else if (/,/.test(input) && /url=/.test(input)) {
+ input = input.split('url=');
+ play_Url = input[0].split(',')[0];
input = {
jx: 0,
- url: input.split(',')[1],
+ url: input[1],
+ playUrl: play_Url,
parse: 1
}
- } else if (/url=|id=/.test(input)) {
+ } else if (/url=|id=/.test(input)) {
input = {
jx: 0,
url: JSON.parse(request(input)).url,
parse: 0
}
- } else if (/youku|iqiyi|v\\.qq\\.com|pptv|le\\.com|1905\\.com|mgtv|bilibili/.test(input)) {
- input
+ } else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
+ play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
+ // play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
+ input = {
+ jx: 0,
+ url: input,
+ playUrl: play_Url,
+ parse: 1,
+ header: JSON.stringify({
+ 'user-agent': 'Mozilla/5.0',
+ }),
+ }
} else {
let purl = JSON.parse(request("http://jx.daenys.vip:2587/tnmb.php?url=" + input)).url;
input = {
jx: 0,
url: purl,
+ // url: input,
+ // playUrl: 'json:http://jx.daenys.vip:2587/tnmb.php?url=',
parse: 0
}
}
@@ -62,22 +78,25 @@ var rule = {
} else {
jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
}
- videoList = jsondata.data.list[0].vod_list;
+ videoList = jsondata.data.list;
} else {
if(HOST.endsWith('/')){
jsondata = JSON.parse(request(HOST + 'index_video'));
} else {
jsondata = JSON.parse(request(HOST + '/index_video'));
}
- videoList = /xgapp/.test(HOST)?jsondata.data[0].vlist:jsondata.list[0].vlist;
+ videoList = /xgapp/.test(HOST) ? jsondata.data : jsondata.list;
}
// log('videoList =========> '+stringify(videoList));
- videoList.forEach(it => {
- d.push({
- url:it.vod_id,
- title:it.vod_name,
- img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
- desc:it.vod_remarks,
+ videoList.forEach((it,idex) => {
+ let vlist = /v1\\.vod/.test(HOST) ? videoList[idex].vod_list : videoList[idex].vlist ;
+ vlist.forEach(it => {
+ d.push({
+ url:it.vod_id,
+ title:it.vod_name,
+ img:it.vod_pic.startsWith('http') ? it.vod_pic : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
+ desc:it.vod_remarks,
+ });
});
});
setResult(d);
@@ -107,67 +126,72 @@ var rule = {
setResult(d);
`,
二级:`js:
- if (/v1\\.vod/.test(HOST)) {
- input = HOST + '/'+ input.split('/')[3];
- } else {
- input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
- }
- try {
- let html = request(input);
- html = JSON.parse(html);
- let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
- VOD = {
- vod_id: node.vod_id,
- vod_name: node.vod_name,
- vod_pic: node.vod_pic,
- type_name: node.vod_class,
- vod_year: node.vod_year,
- vod_area: node.vod_area,
- vod_remarks: node.vod_remarks,
- vod_actor: node.vod_actor,
- vod_director: node.vod_director,
- vod_content: node.vod_content.strip()
- };
- let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
- let playMap = {};
- if (typeof play_url === 'undefined') {
- var play_url = ''
- }
- episodes.forEach(ep => {
- let from = [];
- if (/v1\\.vod/.test(HOST)) {
- from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
- } else {
- from = ep.code||ep.name;
- }
- if (!playMap.hasOwnProperty(from)) {
- playMap[from] = []
- }
- let parse_api = '';
- if (/v1\\.vod/.test(HOST)) {
- parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
- // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
- } else {
- parse_api = ep.parse_api;
- }
- log('parse_api =========> '+parse_api);
- if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
- parse_api = parse_api.replaceAll('..','.') ;
- ep.url = ep.url.replaceAll('$','$'+parse_api);
- }
- playMap[from].push(ep.url)
- });
- let playFrom = [];
- let playList = [];
- Object.keys(playMap).forEach(key => {
- playFrom.push(key);
- playList.push(playMap[key])
- });
- VOD.vod_play_from = playFrom.join('$$$');
- VOD.vod_play_url = playList.join('$$$');
- } catch (e) {
- log("获取二级详情页发生错误:" + e.message)
- }
+ if (/v1\\.vod/.test(HOST)) {
+ input = HOST + '/'+ input.split('/')[3];
+ } else {
+ input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
+ }
+ try {
+ let html = request(input);
+ html = JSON.parse(html);
+ let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
+ VOD = {
+ vod_id: node.vod_id,
+ vod_name: node.vod_name,
+ vod_pic: node.vod_pic,
+ type_name: node.vod_class,
+ vod_year: node.vod_year,
+ vod_area: node.vod_area,
+ vod_remarks: node.vod_remarks,
+ vod_actor: node.vod_actor,
+ vod_director: node.vod_director,
+ vod_content: node.vod_content.strip()
+ };
+ if (typeof play_url === 'undefined') {
+ var play_url = ''
+ }
+ let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
+ if (episodes != '') {
+ let playMap = {};
+ episodes.forEach(ep => {
+ let from = [];
+ if (/v1\\.vod/.test(HOST)) {
+ from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
+ } else {
+ from = ep.code||ep.name;
+ }
+ if (!playMap.hasOwnProperty(from)) {
+ playMap[from] = []
+ }
+ let parse_api = '';
+ if (/v1\\.vod/.test(HOST)) {
+ parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
+ // parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
+ } else {
+ parse_api = ep.parse_api;
+ }
+ log('parse_api =========> '+parse_api);
+ if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
+ parse_api = parse_api.replaceAll('..','.') ;
+ ep.url = ep.url.replaceAll('$','$'+parse_api);
+ }
+ playMap[from].push(ep.url)
+ });
+ let playFrom = [];
+ let playList = [];
+ Object.keys(playMap).forEach(key => {
+ playFrom.push(key);
+ playList.push(playMap[key])
+ });
+ VOD.vod_play_from = playFrom.join('$$$');
+ VOD.vod_play_url = playList.join('$$$');
+ } else {
+ VOD.vod_play_from = node.vod_play_from;
+ VOD.vod_play_url = node.vod_play_url;
+ }
+ } catch (e) {
+ log("获取二级详情页发生错误:" + e.message);
+ }
`,
搜索:`js:
let d = [];
diff --git a/lib/drpy.js b/lib/drpy.js
new file mode 100644
index 00000000..4d09b509
--- /dev/null
+++ b/lib/drpy.js
@@ -0,0 +1,2637 @@
+// import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/es6py.js';
+// import {是否正版,urlDeal,setResult,setResult2,setHomeResult,maoss,urlencode} from 'http://192.168.10.103:5705/libs/es6py.js';
+// import 'http://192.168.1.124:5705/libs/es6py.js';
+import cheerio from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js';
+// import cheerio from 'http://192.168.10.103:5705/libs/cheerio.min.js';
+import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js';
+import 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js';
+import 模板 from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js';
+import {gbkTool} from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js'
+// import 'http://192.168.10.103:5705/libs/drT.js';
+// import muban from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js';
+// import muban from 'http://192.168.10.103:5705/admin/view/模板.js';
+
+// const key = 'drpy_zbk';
+// eval(req('http://192.168.1.124:5705/libs/es6py.js').content);
+function init_test(){
+ // console.log(typeof(CryptoJS));
+ console.log("init_test_start");
+ console.log("当前版本号:"+VERSION);
+ console.log(RKEY);
+ console.log(JSON.stringify(rule));
+ // console.log('123456的md5值是:'+md5('123456'));
+ // let aa = base64Encode('编码测试一下')
+ // log(aa);
+ // let bb = base64Decode(aa);
+ // log('bb:'+bb);
+ // clearItem(RULE_CK);
+ // console.log(JSON.stringify(rule));
+ // console.log(request('https://www.baidu.com',{withHeaders:true}));
+ // console.log(request('https://www.baidu.com/favicon.ico',{toBase64:true}));
+ // require('http://192.168.10.99:5705/txt/pluto/drT.js');
+ // console.log(typeof(drT));
+ // console.log(drT.renderText('{{fl.cate}},hi, {{fl}}哈哈.{{fl}}',{sort: 1,cate:'movie'},'fl'));
+ console.log("init_test_end");
+}
+
+/**
+ * 执行预处理代码
+ */
+function pre(){
+ if(typeof(rule.预处理) === 'string' && rule.预处理 && rule.预处理.trim()){
+ let code = rule.预处理.trim();
+ console.log("执行预处理代码:"+code);
+ if(code.startsWith('js:')){
+ code = code.replace('js:','');
+ }
+ try {
+ // code里可以进行get 或者 post请求cookie并改变rule.headers 里的cookie
+ // 直接操作 rule_fetch_params 这个变量 .headers.Cookie
+ eval(code);
+ }catch (e) {
+ console.log('预处理执行失败:'+e.message);
+ }
+ }
+}
+
+let rule = {};
+const VERSION = 'drpy1 3.9.48beta16 20231011';
+/** 已知问题记录
+ * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了]
+ * Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下)
+ * 2.import es6py.js但是里面的函数没有被装载进来.比如drpy规则报错setResult2 is undefiend(合并文件了可以不管了)
+ * 3.无法重复导入cheerio(怎么解决drpy和parseTag里都需要导入cheerio的问题) 无法在副文件导入cheerio (现在是全部放在drpy一个文件里了,凑合解决?)
+ * 4.有个错误不知道哪儿来的 executeScript: com.quickjs.JSObject$Undefined cannot be cast to java.lang.String 在 点击选集播放打印init_test_end后面打印(貌似不影响使用)
+ * 5.需要实现 stringify 函数,比起JSON.stringify函数,它会原封不动保留中文不会编码unicode
+ * 6.base64Encode,base64Decode,md5函数还没有实现 (抄影魔代码实现了)
+ * 7.eval(getCryptoJS());还没有实现 (可以空实现了,以后遇到能忽略)
+ * done: jsp:{pdfa,pdfh,pd},json:{pdfa,pdfh,pd},jq:{pdfa,pdfh,pd}
+ * * 电脑看日志调试
+ adb tcpip 5555
+ adb connect 192.168.10.192
+ adb devices -l
+ adb logcat -c
+ adb logcat | grep -i QuickJS
+ adb logcat -c -b events
+ adb logcat -c -b main -b events -b radio -b system
+ adb logcat > 2.log DRPY:E | grep -i QuickJS
+ * **/
+
+
+/*** 以下是内置变量和解析方法 **/
+const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
+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 UA = 'Mozilla/5.0';
+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';
+const RULE_CK = 'cookie'; // 源cookie的key值
+// const KEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host); // 源的唯一标识
+const CATE_EXCLUDE = '首页|留言|APP|下载|资讯|新闻|动态';
+const TAB_EXCLUDE = '猜你|喜欢|下载|剧情|热播';
+const OCR_RETRY = 3;//ocr验证重试次数
+// const OCR_API = 'http://dm.mudery.com:10000';//ocr在线识别接口
+// const OCR_API = 'http://192.168.3.239:5705/parse/ocr';//ocr在线识别接口
+// const OCR_API = 'http://cms.nokia.press/parse/ocr';//ocr在线识别接口
+// const OCR_API = 'http://cms.nokia.press:5707/parse/ocr';//ocr在线识别接口
+const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别接口
+if(typeof(MY_URL)==='undefined'){
+ var MY_URL; // 全局注入变量,pd函数需要
+}
+var HOST;
+var RKEY; // 源的唯一标识
+var fetch;
+var print;
+var log;
+var rule_fetch_params;
+var fetch_params; // 每个位置单独的
+var oheaders;
+// var play_url; // 二级详情页注入变量,为了适配js模式0 (不在这里定义了,直接二级里定义了个空字符串)
+var _pdfh;
+var _pdfa;
+var _pd;
+// const DOM_CHECK_ATTR = ['url', 'src', 'href', 'data-original', 'data-src'];
+const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
+// 过滤特殊链接,不走urlJoin
+const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
+const SELECT_REGEX = /:eq|:lt|:gt|#/g;
+const SELECT_REGEX_A = /:eq|:lt|:gt/g;
+
+/**
+es6py扩展
+ */
+if (typeof Object.assign != 'function') {
+ Object.assign = function () {
+ var target = arguments[0];
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+ return target;
+ };
+}
+if (!String.prototype.includes) {
+ String.prototype.includes = function (search, start) {
+ if (typeof start !== 'number') {
+ start = 0;
+ }
+
+ if (start + search.length > this.length) {
+ return false;
+ } else {
+ return this.indexOf(search, start) !== -1;
+ }
+ };
+}
+
+if (!Array.prototype.includes) {
+ Object.defineProperty(Array.prototype, 'includes', {
+ value: function (searchElement, fromIndex) {
+
+ if (this == null) {//this是空或者未定义,抛出错误
+ throw new TypeError('"this" is null or not defined');
+ }
+
+ var o = Object(this);//将this转变成对象
+ var len = o.length >>> 0;//无符号右移0位,获取对象length属性,如果未定义就会变成0
+
+ if (len === 0) {//length为0直接返回false未找到目标值
+ return false;
+ }
+
+ var n = fromIndex | 0;//查找起始索引
+ var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);//计算正确起始索引,因为有可能是负值
+
+ while (k < len) {//从起始索引处开始循环
+ if (o[k] === searchElement) {//如果某一位置与寻找目标相等,返回true,找到了
+ return true;
+ }
+ k++;
+ }
+ return false;//未找到,返回false
+ }
+ });
+}
+if (typeof String.prototype.startsWith != 'function') {
+ String.prototype.startsWith = function (prefix){
+ return this.slice(0, prefix.length) === prefix;
+ };
+}
+if (typeof String.prototype.endsWith != 'function') {
+ String.prototype.endsWith = function(suffix) {
+ return this.indexOf(suffix, this.length - suffix.length) !== -1;
+ };
+}
+Object.prototype.myValues=function(obj){
+ if(obj ==null) {
+ throw new TypeError("Cannot convert undefined or null to object");
+ }
+ var res=[]
+ for(var k in obj){
+ if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
+ res.push(obj[k]);
+ }
+ }
+ return res;
+}
+if (typeof Object.prototype.values != 'function') {
+ Object.prototype.values=function(obj){
+ if(obj ==null) {
+ throw new TypeError("Cannot convert undefined or null to object");
+ }
+ var res=[]
+ for(var k in obj){
+ if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
+ res.push(obj[k]);
+ }
+ }
+ return res;
+ }
+}
+if (typeof Array.prototype.join != 'function') {
+ Array.prototype.join = function (emoji) {
+ // emoji = emoji||',';
+ emoji = emoji||'';
+ let self = this;
+ let str = "";
+ let i = 0;
+ if (!Array.isArray(self)) {throw String(self)+'is not Array'}
+ if(self.length===0){return ''}
+ if (self.length === 1){return String(self[0])}
+ i = 1;
+ str = this[0];
+ for (; i < self.length; i++) {
+ str += String(emoji)+String(self[i]);
+ }
+ return str;
+ };
+}
+
+String.prototype.rstrip = function (chars) {
+ let regex = new RegExp(chars + "$");
+ return this.replace(regex, "");
+};
+
+Array.prototype.append = Array.prototype.push;
+String.prototype.strip = String.prototype.trim;
+function 是否正版(vipUrl){
+ 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');
+ return flag.test(vipUrl);
+}
+function urlDeal(vipUrl){
+ if(!vipUrl){
+ return ''
+ }
+ if(!是否正版(vipUrl)){
+ return vipUrl
+ }
+ if(!/miguvideo/.test(vipUrl)){
+ vipUrl=vipUrl.split('#')[0].split('?')[0];
+ }
+ return vipUrl
+}
+function setResult(d){
+ if(!Array.isArray(d)){
+ return []
+ }
+ VODS = [];
+ // print(d);
+ d.forEach(function (it){
+ let obj = {
+ vod_id:it.url||'',
+ vod_name: it.title||'',
+ vod_remarks: it.desc||'',
+ vod_content: it.content||'',
+ vod_pic: it.pic_url||it.img||'',
+ };
+ let keys = Object.keys(it);
+ if(keys.includes('tname')){
+ obj.type_name = it.tname||'';
+ }
+ if(keys.includes('tid')){
+ obj.type_id = it.tid||'';
+ }
+ if(keys.includes('year')){
+ obj.vod_year = it.year||'';
+ }
+ if(keys.includes('actor')){
+ obj.vod_actor = it.actor||'';
+ }
+ if(keys.includes('director')){
+ obj.vod_director = it.director||'';
+ }
+ if(keys.includes('area')){
+ obj.vod_area = it.area||'';
+ }
+ VODS.push(obj);
+ });
+ return VODS
+}
+function setResult2(res){
+ VODS = res.list||[];
+ return VODS
+}
+function setHomeResult(res){
+ if(!res||typeof(res)!=='object'){
+ return []
+ }
+ return setResult(res.list);
+}
+// 猫了个咪
+function rc(js) {
+ if (js === 'maomi_aes.js') {
+ var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
+ var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
+ return {
+ De: function (word) {
+ word = CryptoJS.enc.Hex.parse(word)
+ return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
+ iv: t,
+ mode: CryptoJS.mode.CBC,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString(CryptoJS.enc.Utf8)
+ },
+ En: function (word) {
+ // print(a);
+ // print(word);
+ var Encrypted = CryptoJS.AES.encrypt(word, a, {
+ iv: t,
+ mode: CryptoJS.mode.CBC,
+ padding: CryptoJS.pad.Pkcs7
+ });
+ return Encrypted.ciphertext.toString();
+ }
+ };
+ }
+ return {};
+}
+
+// 千万不要用for in 推荐 forEach (for in 会打乱顺序)
+//猫函数
+function maoss(jxurl, ref, key) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ eval(getCryptoJS());
+ try {
+ var getVideoInfo = function (text) {
+ return CryptoJS.AES.decrypt(text, key, {iv: iv, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
+ };
+ var token_key = key == undefined ? 'dvyYRQlnPRCMdQSe' : key;
+ if (ref) {
+ var html = request(jxurl, {
+ headers: {
+ 'Referer': ref
+ }
+ });
+ } else {
+ var html = request(jxurl);
+ }
+ // print(html);
+ if (html.indexOf('&btwaf=') != -1) {
+ html = request(jxurl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], {
+ headers: {
+ 'Referer': ref
+ }
+ })
+ }
+ var token_iv = html.split('_token = "')[1].split('"')[0];
+ var key = CryptoJS.enc.Utf8.parse(token_key);
+ var iv = CryptoJS.enc.Utf8.parse(token_iv);
+ // log("iv:"+iv);
+ // log(html);
+ // print(key);
+ // print(iv);
+ eval(html.match(/var config = {[\s\S]*?}/)[0] + '');
+ // config.url = config.url.replace(/,/g,'');
+ // print(config.url);
+ if (!config.url.startsWith('http')) {
+ //config.url = decodeURIComponent(AES(config.url, key, iv));
+ config.url = CryptoJS.AES.decrypt(config.url, key, {
+ iv: iv,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString(CryptoJS.enc.Utf8)
+ }
+ return config.url;
+ } catch (e) {
+ return '';
+ }
+}
+
+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 base64Encode(text){
+ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text));
+ // return text
+}
+
+function base64Decode(text){
+ return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text));
+ // return text
+}
+
+function md5(text) {
+ return CryptoJS.MD5(text).toString();
+}
+
+/**
+ * 字符串按指定编码
+ * @param input
+ * @param encoding
+ * @returns {*}
+ */
+function encodeStr(input,encoding){
+ encoding = encoding||'gbk';
+ if(encoding.startsWith('gb')){
+ const strTool = gbkTool();
+ input = strTool.encode(input);
+ }
+ return input
+}
+
+/**
+ * 字符串指定解码
+ * @param input
+ * @param encoding
+ * @returns {*}
+ */
+function decodeStr(input,encoding){
+ encoding = encoding||'gbk';
+ if(encoding.startsWith('gb')){
+ const strTool = gbkTool();
+ input = strTool.decode(input);
+ }
+ return input
+}
+
+function getCryptoJS(){
+ // return request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-hiker.js');
+ return 'console.log("CryptoJS已装载");'
+}
+
+// 封装的RSA加解密类
+const RSA = {
+ encode:function (data,key,option){
+ // log('encode');
+ if(typeof(rsaEncrypt)==='function'){
+ if(!option||typeof(option)!=='object'){
+ return rsaEncrypt(data,key);
+ }else{
+ return rsaEncrypt(data,key,option);
+ }
+ }else{
+ return false
+ }
+ },
+ decode:function (data,key,option){
+ // log('decode');
+ if(typeof(rsaDecrypt)==='function'){
+ if(!option||typeof(option)!=='object'){
+ return rsaDecrypt(data,key);
+ }else{
+ return rsaDecrypt(data,key,option);
+ }
+ }else{
+ return false
+ }
+ }
+};
+
+/**
+ * 获取壳子返回的代理地址
+ * @returns {string|*}
+ */
+function getProxyUrl(){
+ if(typeof(getProxy)==='function'){//判断壳子里有getProxy函数就执行取返回结果。否则取默认的本地
+ return getProxy(true)
+ }else{
+ return 'http://127.0.0.1:9978/proxy?do=js'
+ }
+}
+
+/**
+ * 强制正序算法
+ * @param lists 待正序列表
+ * @param key 正序键
+ * @param option 单个元素处理函数
+ * @returns {*}
+ */
+function forceOrder(lists,key,option){
+ let start = Math.floor(lists.length/2);
+ let end = Math.min(lists.length-1,start+1);
+ if(start >= end){
+ return lists;
+ }
+ let first = lists[start];
+ let second = lists[end];
+ if(key){
+ try {
+ first = first[key];
+ second = second[key];
+ }catch (e) {}
+ }
+ if(option && typeof(option)==='function'){
+ try {
+ first = option(first);
+ second = option(second);
+ }catch (e) {}
+ }
+ first+='';
+ second+='';
+ // console.log(first,second);
+ if(first.match(/(\d+)/)&&second.match(/(\d+)/)){
+ let num1 = Number(first.match(/(\d+)/)[1]);
+ let num2 = Number(second.match(/(\d+)/)[1]);
+ if (num1 > num2){
+ lists.reverse();
+ }
+ }
+ return lists
+}
+
+
+let VODS = [];// 一级或者搜索需要的数据列表
+let VOD = {};// 二级的单个数据
+let TABS = [];// 二级的自定义线路列表 如: TABS=['道长在线','道长在线2']
+let LISTS = [];// 二级的自定义选集播放列表 如: LISTS=[['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']]
+globalThis.encodeUrl = urlencode;
+globalThis.urlencode = urlencode;
+
+
+
+/**
+ * url拼接
+ * @param fromPath 初始当前页面url
+ * @param nowPath 相对当前页面url
+ * @returns {*}
+ */
+function urljoin(fromPath, nowPath) {
+ fromPath = fromPath||'';
+ nowPath = nowPath||'';
+ return joinUrl(fromPath, nowPath);
+ // try {
+ // // import Uri from './uri.min.js';
+ // // var Uri = require('./uri.min.js');
+ // // eval(request('https://cdn.bootcdn.net/ajax/libs/URI.js/1.19.11/URI.min.js'));
+ // // let new_uri = URI(nowPath, fromPath);
+
+ // let new_uri = Uri(nowPath, fromPath);
+ // new_uri = new_uri.toString();
+ // // console.log(new_uri);
+ // // return fromPath + nowPath
+ // return new_uri
+ // }
+ // catch (e) {
+ // console.log('urljoin发生错误:'+e.message);
+ // if(nowPath.startsWith('http')){
+ // return nowPath
+ // }if(nowPath.startsWith('/')){
+ // return getHome(fromPath)+nowPath
+ // }
+ // return fromPath+nowPath
+ // }
+}
+var urljoin2 = urljoin;
+
+// 内置 pdfh,pdfa,pd
+const defaultParser = {
+ pdfh:pdfh,
+ pdfa:pdfa,
+ pd(html,parse,uri){
+ let ret = this.pdfh(html,parse);
+ if(typeof(uri)==='undefined'||!uri){
+ uri = '';
+ }
+ if(DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)){
+ if(/http/.test(ret)){
+ ret = ret.substr(ret.indexOf('http'));
+ }else{
+ ret = urljoin(MY_URL,ret)
+ }
+ }
+ return ret
+ },
+};
+
+
+/**
+ * pdfh原版优化,能取style属性里的图片链接
+ * @param html 源码
+ * @param parse 解析表达式
+ * @returns {string|*}
+ */
+function pdfh2(html,parse){
+ let html2 = html;
+ try {
+ if(typeof(html)!=='string'){
+ html2 = html.rr(html.ele).toString();
+ }
+ }catch (e) {
+ print('html对象转文本发生了错误:'+e.message);
+ }
+ let result = defaultParser.pdfh(html2,parse);
+ let option = parse.includes('&&')?parse.split('&&').slice(-1)[0]:parse.split(' ').slice(-1)[0];
+ if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){
+ try {
+ result = result.match(/url\((.*?)\)/)[1];
+ // 2023/07/28新增 style取内部链接自动去除首尾单双引号
+ result = result.replace(/^['|"](.*)['|"]$/, "$1");
+ }catch (e) {}
+ }
+ return result
+}
+
+/**
+ * pdfa原版优化,可以转换jq的html对象
+ * @param html
+ * @param parse
+ * @returns {*}
+ */
+function pdfa2(html,parse){
+ let html2 = html;
+ try {
+ if(typeof(html)!=='string'){
+ html2 = html.rr(html.ele).toString();
+ }
+ }catch (e) {
+ print('html对象转文本发生了错误:'+e.message);
+ }
+ return defaultParser.pdfa(html2,parse);
+}
+
+/**
+ * pd原版方法重写-增加自动urljoin
+ * @param html
+ * @param parse
+ * @param uri
+ * @returns {*}
+ */
+function pd2(html,parse,uri){
+ let ret = pdfh2(html,parse);
+ if(typeof(uri)==='undefined'||!uri){
+ uri = '';
+ }
+ if(DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)){
+ if(/http/.test(ret)){
+ ret = ret.substr(ret.indexOf('http'));
+ }else{
+ ret = urljoin(MY_URL,ret)
+ }
+ }
+ // MY_URL = getItem('MY_URL',MY_URL);
+ // console.log(`规则${RKEY}打印MY_URL:${MY_URL},uri:${uri}`);
+ return ret
+}
+
+const parseTags = {
+ jsp:{
+ pdfh:pdfh2,
+ pdfa:pdfa2,
+ pd:pd2,
+ },
+ json:{
+ pdfh(html, parse) {
+ if (!parse || !parse.trim()){
+ return '';
+ }
+ if (typeof(html) === 'string'){
+ // print('jsonpath:pdfh字符串转dict');
+ html = JSON.parse(html);
+ }
+ parse = parse.trim();
+ if (!parse.startsWith('$.')){
+ parse = '$.' + parse;
+ }
+ parse = parse.split('||');
+ for (let ps of parse) {
+ let ret = cheerio.jp(ps, html);
+ if (Array.isArray(ret)){
+ ret = ret[0] || '';
+ } else{
+ ret = ret || ''
+ }
+ if (ret && typeof (ret) !== 'string'){
+ ret = ret.toString();
+ }
+ if(ret){
+ return ret
+ }
+ }
+ return '';
+ },
+ pdfa(html, parse) {
+ if (!parse || !parse.trim()){
+ return '';
+ }
+ if (typeof(html) === 'string'){
+ // print('jsonpath:pdfa字符串转dict');
+ html = JSON.parse(html);
+ }
+ parse = parse.trim()
+ if (!parse.startsWith('$.')){
+ parse = '$.' + parse;
+ }
+ let ret = cheerio.jp(parse, html);
+ if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1){
+ return ret[0] || []
+ }
+ return ret || []
+ },
+ pd(html,parse){
+ let ret = parseTags.json.pdfh(html,parse);
+ if(ret){
+ return urljoin(MY_URL,ret);
+ }
+ return ret
+ },
+ },
+ jq:{
+ pdfh(html, parse, base_url) {
+ if (!parse || !parse.trim()) {
+ return ''
+ }
+ let eleFind = typeof html === 'object';
+ let option = undefined;
+ if (eleFind && parse.startsWith('body&&')) {
+ parse = parse.substr(6);
+ if (parse.indexOf('&&') < 0) {
+ option = parse.trim();
+ parse = '*=*';
+ }
+ }
+ if (parse.indexOf('&&') > -1) {
+ let sp = parse.split('&&');
+ option = sp[sp.length - 1];
+ sp.splice(sp.length - 1);
+ if (sp.length > 1) {
+ for (let i in sp) {
+ //Javascript自定义Array.prototype干扰for-in循环
+ if(sp.hasOwnProperty(i)){
+ if (!SELECT_REGEX.test(sp[i])) {
+ sp[i] = sp[i] + ':eq(0)';
+ }
+ }
+ }
+ } else {
+ if (!SELECT_REGEX.test(sp[0])) {
+ sp[0] = sp[0] + ':eq(0)';
+ }
+ }
+ parse = sp.join(' ');
+ }
+ let result = '';
+ const $ = eleFind ? html.rr : cheerio.load(html);
+ let ret = eleFind ? ((parse === '*=*' || $(html.ele).is(parse)) ? html.ele : $(html.ele).find(parse)) : $(parse);
+ if (option) {
+ if (option === 'Text') {
+ result = $(ret).text();
+ }
+ else if (option === 'Html') {
+ result = $(ret).html();
+ }
+ else {
+ result = $(ret).attr(option);
+ if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){
+ try {
+ result = result.match(/url\((.*?)\)/)[1];
+ // 2023/07/28新增 style取内部链接自动去除首尾单双引号
+ result = result.replace(/^['|"](.*)['|"]$/, "$1");
+ }catch (e) {}
+ }
+ }
+ if (result && base_url && DOM_CHECK_ATTR.test(option) && !SPECIAL_URL.test(result)) {
+ if (/http/.test(result)) {
+ result = result.substr(result.indexOf('http'));
+ } else {
+ result = urljoin(base_url, result)
+ }
+ }
+ } else {
+ result = $(ret).toString();
+ }
+ return result;
+ },
+ pdfa(html, parse) {
+ if (!parse || !parse.trim()) {
+ print('!parse');
+ return [];
+ }
+ let eleFind = typeof html === 'object';
+ // print('parse前:'+parse);
+ if (parse.indexOf('&&') > -1) {
+ let sp = parse.split('&&');
+ for (let i in sp) {
+ if(sp.hasOwnProperty(i)){
+ if (!SELECT_REGEX_A.test(sp[i]) && i < sp.length - 1) {
+ if(sp[i]!=='body'){
+ // sp[i] = sp[i] + ':eq(0)';
+ sp[i] = sp[i] + ':first';
+ }
+ }
+ }
+ }
+ parse = sp.join(' ');
+ }
+ // print('parse后:'+parse);
+ const $ = eleFind ? html.rr : cheerio.load(html);
+ let ret = eleFind ? ($(html.ele).is(parse) ? html.ele : $(html.ele).find(parse)) : $(parse);
+ let result = [];
+ // print('outerHTML:');
+ // print($(ret[0]).prop("outerHTML"));
+ if (ret) {
+ ret.each(function (idx, ele) {
+ result.push({ rr: $, ele: ele });
+ // result.push({ rr: $, ele: $(ele).prop("outerHTML")}); // 性能贼差
+ });
+ }
+ return result;
+ },
+ pd(html,parse,uri){
+ return parseTags.jq.pdfh(html, parse, MY_URL);
+ },
+ },
+ getParse(p0){//非js开头的情况自动获取解析标签
+ if(p0.startsWith('jsp:')){
+ return this.jsp
+ }else if(p0.startsWith('json:')){
+ return this.json
+ }else if(p0.startsWith('jq:')){
+ return this.jq
+ }else {
+ return this.jq
+ }
+ }
+};
+
+const stringify = JSON.stringify;
+const jsp = parseTags.jsp;
+const jq = parseTags.jq;
+
+/*** 后台需要实现的java方法并注入到js中 ***/
+
+/**
+ * 读取本地文件->应用程序目录
+ * @param filePath
+ * @returns {string}
+ */
+function readFile(filePath){
+ filePath = filePath||'./uri.min.js';
+ var fd = os.open(filePath);
+ var buffer = new ArrayBuffer(1024);
+ var len = os.read(fd, buffer, 0, 1024);
+ console.log(len);
+ let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
+ console.log(text);
+ return text
+}
+
+/**
+ * 处理返回的json数据
+ * @param html
+ * @returns {*}
+ */
+function dealJson(html) {
+ try {
+ // html = html.match(/[\w|\W|\s|\S]*?(\{[\w|\W|\s|\S]*\})/).group[1];
+ html = html.trim();
+ if(!((html.startsWith('{') && html.endsWith('}'))||(html.startsWith('[') && html.endsWith(']')))){
+ html = '{'+html.match(/.*?\{(.*)\}/m)[1]+'}';
+ }
+ } catch (e) {
+ }
+ try {
+ html = JSON.parse(html);
+ }catch (e) {}
+ // console.log(typeof(html));
+ return html;
+}
+
+/**
+ * 验证码识别逻辑,需要java实现(js没有bytes类型,无法调用后端的传递图片二进制获取验证码文本的接口)
+ * @type {{api: string, classification: (function(*=): string)}}
+ */
+var OcrApi={
+ api:OCR_API,
+ classification:function (img){ // img是byte类型,这里不方便搞啊
+ let code = '';
+ try {
+ // let html = request(this.api,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
+ // html = JSON.parse(html);
+ // code = html.url||'';
+ log('通过drpy_ocr验证码接口过验证...');
+ let html = request(OCR_API,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
+ code = html||'';
+ }catch (e) {}
+ return code
+ }
+};
+/**
+ * 验证码识别,暂未实现
+ * @param url 验证码图片链接
+ * @returns {string} 验证成功后的cookie
+ */
+function verifyCode(url){
+ let cnt = 0;
+ let host = getHome(url);
+ let cookie = '';
+ while (cnt < OCR_RETRY){
+ try{
+ // let obj = {headers:headers,timeout:timeout};
+ let yzm_url = `${host}/index.php/verify/index.html`;
+ console.log(`验证码链接:${yzm_url}`);
+ let hhtml = request(yzm_url,{withHeaders:true,toBase64:true},true);
+ let json = JSON.parse(hhtml);
+ if(!cookie){
+ // print(json);
+ let setCk = Object.keys(json).find(it=>it.toLowerCase()==='set-cookie');
+ // cookie = json['set-cookie']?json['set-cookie'].split(';')[0]:'';
+ cookie = setCk?json[setCk].split(';')[0]:'';
+ }
+ // console.log(hhtml);
+ console.log('cookie:'+cookie);
+ let img = json.body;
+ // console.log(img);
+ let code = OcrApi.classification(img);
+ console.log(`第${cnt+1}次验证码识别结果:${code}`);
+ let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
+ console.log(submit_url);
+ let html = request(submit_url,{headers:{Cookie:cookie,'User-Agent':MOBILE_UA},'method':'POST'});
+ // console.log(html);
+ html = JSON.parse(html);
+ if(html.msg === 'ok'){
+ console.log(`第${cnt+1}次验证码提交成功`);
+ return cookie // 需要返回cookie
+ }else if(html.msg!=='ok'&&cnt+1>=OCR_RETRY){
+ cookie = ''; // 需要清空返回cookie
+ }
+ }catch (e) {
+ console.log(`第${cnt+1}次验证码提交失败:${e.message}`);
+ if(cnt+1>=OCR_RETRY){
+ cookie = '';
+ }
+ }
+ cnt+=1
+ }
+ return cookie
+}
+
+/**
+ * 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
+ * @param k 键
+ * @param v 值
+ */
+function setItem(k,v){
+ local.set(RKEY,k,v);
+ console.log(`规则${RKEY}设置${k} => ${v}`)
+}
+
+/**
+ * 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
+ * @param k 键
+ * @param v 值
+ * @returns {*}
+ */
+function getItem(k,v){
+ return local.get(RKEY,k) || v;
+}
+
+/**
+ * 删除数据库key对应的一条数据,并清除此key对应的内存缓存
+ * @param k
+ */
+function clearItem(k){
+ local.delete(RKEY,k);
+}
+
+/*** js自封装的方法 ***/
+
+/**
+ * 获取链接的host(带http协议的完整链接)
+ * @param url 任意一个正常完整的Url,自动提取根
+ * @returns {string}
+ */
+function getHome(url){
+ if(!url){
+ return ''
+ }
+ let tmp = url.split('//');
+ url = tmp[0] + '//' + tmp[1].split('/')[0];
+ try {
+ url = decodeURIComponent(url);
+ }catch (e) {}
+ return url
+}
+
+/**
+ * get参数编译链接,类似python params字典自动拼接
+ * @param url 访问链接
+ * @param obj 参数字典
+ * @returns {*}
+ */
+function buildUrl(url,obj){
+ obj = obj||{};
+ if(url.indexOf('?')<0){
+ url += '?'
+ }
+ let param_list = [];
+ let keys = Object.keys(obj);
+ keys.forEach(it=>{
+ param_list.push(it+'='+obj[it])
+ });
+ let prs = param_list.join('&');
+ if(keys.length > 0 && !url.endsWith('?')){
+ url += '&'
+ }
+ url+=prs;
+ return url
+}
+
+/**
+ * 远程依赖执行函数
+ * @param url 远程js地址
+ */
+function require(url){
+ eval(request(url));
+}
+/**
+ * 海阔网页请求函数完整封装
+ * @param url 请求链接
+ * @param obj 请求对象 {headers:{},method:'',timeout:5000,body:'',withHeaders:false}
+ * @param ocr_flag 标识此flag是用于请求ocr识别的,自动过滤content-type指定编码
+ * @returns {string|string|DocumentFragment|*}
+ */
+function request(url,obj,ocr_flag){
+ ocr_flag = ocr_flag||false;
+ if(typeof(obj)==='undefined'||!obj||obj==={}){
+ if(!fetch_params||!fetch_params.headers){
+ let headers = {
+ 'User-Agent':MOBILE_UA,
+ };
+ if(rule.headers){
+ Object.assign(headers,rule.headers);
+ }
+ if(!fetch_params){
+ fetch_params = {};
+ }
+ fetch_params.headers = headers;
+ }
+ if(!fetch_params.headers.Referer){
+ fetch_params.headers.Referer = getHome(url)
+ }
+ obj = fetch_params;
+ }else{
+ let headers = obj.headers||{};
+ let keys = Object.keys(headers).map(it=>it.toLowerCase());
+ if(!keys.includes('user-agent')){
+ headers['User-Agent'] = MOBILE_UA;
+ }if(!keys.includes('referer')){
+ headers['Referer'] = getHome(url);
+ }
+ obj.headers = headers;
+ }
+ if(rule.encoding&&rule.encoding!=='utf-8'&&!ocr_flag){
+ if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
+ obj.headers["Content-Type"] = 'text/html; charset='+rule.encoding;
+ }
+ }
+ if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='string'){
+ // let data = {};
+ // obj.body.split('&').forEach(it=>{
+ // data[it.split('=')[0]] = it.split('=')[1]
+ // });
+ // obj.data = data;
+ // delete obj.body
+
+ // 传body加 "Content-Type":"application/x-www-form-urlencoded;" 即可post form
+ if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
+ obj.headers["Content-Type"] = 'application/x-www-form-urlencoded; charset='+rule.encoding;
+ }
+ }else if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='object'){
+ obj.data = obj.body;
+ delete obj.body
+ }
+ if(!url){
+ return obj.withHeaders?'{}':''
+ }
+ if(obj.toBase64){ // 返回base64,用于请求图片
+ obj.buffer = 2;
+ delete obj.toBase64
+ }
+ console.log(JSON.stringify(obj.headers));
+ // console.log('request:'+url+' obj:'+JSON.stringify(obj));
+ console.log('request:'+url+`|method:${obj.method||'GET'}|body:${obj.body||''}`);
+ let res = req(url, obj);
+ let html = res.content||'';
+ // console.log(html);
+ if(obj.withHeaders){
+ let htmlWithHeaders = res.headers;
+ htmlWithHeaders.body = html;
+ return JSON.stringify(htmlWithHeaders);
+ }else{
+ return html
+ }
+}
+
+/**
+ * 快捷post请求
+ * @param url 地址
+ * @param obj 对象
+ * @returns {string|DocumentFragment|*}
+ */
+function post(url,obj){
+ obj.method = 'POST';
+ return request(url,obj);
+}
+
+fetch = request;
+print = function (data){
+ data = data||'';
+ if(typeof(data)=='object'&&Object.keys(data).length>0){
+ try {
+ data = JSON.stringify(data);
+ console.log(data);
+ }catch (e) {
+ // console.log('print:'+e.message);
+ console.log(typeof(data)+':'+data.length);
+ return
+ }
+ }else if(typeof(data)=='object'&&Object.keys(data).length<1){
+ console.log('null object');
+ }else{
+ console.log(data);
+ }
+}
+log = print;
+/**
+ * 检查宝塔验证并自动跳过获取正确源码
+ * @param html 之前获取的html
+ * @param url 之前的来源url
+ * @param obj 来源obj
+ * @returns {string|DocumentFragment|*}
+ */
+function checkHtml(html,url,obj){
+ if(/\?btwaf=/.test(html)){
+ let btwaf = html.match(/btwaf(.*?)"/)[1];
+ url = url.split('#')[0]+'?btwaf'+btwaf;
+ print('宝塔验证访问链接:'+url);
+ html = request(url,obj);
+ }
+ return html
+}
+
+/**
+ * 带一次宝塔验证的源码获取
+ * @param url 请求链接
+ * @param obj 请求参数
+ * @returns {string|DocumentFragment}
+ */
+function getCode(url,obj){
+ let html = request(url,obj);
+ html = checkHtml(html,url,obj);
+ return html
+}
+
+/**
+ * 源rule专用的请求方法,自动注入cookie
+ * @param url 请求链接
+ * @returns {string|DocumentFragment}
+ */
+function getHtml(url){
+ let obj = {};
+ if(rule.headers){
+ obj.headers = rule.headers;
+ }
+ let cookie = getItem(RULE_CK,'');
+ if(cookie){
+ // log('有cookie:'+cookie);
+ if(obj.headers && ! Object.keys(obj.headers).map(it=>it.toLowerCase()).includes('cookie')){
+ log('历史无cookie,新增过验证后的cookie');
+ obj.headers['Cookie'] = cookie;
+ }else if(obj.headers && obj.headers.cookie && obj.headers.cookie!==cookie){
+ obj.headers['Cookie'] = cookie;
+ log('历史有小写过期的cookie,更新过验证后的cookie');
+ }else if(obj.headers && obj.headers.Cookie && obj.headers.Cookie!==cookie){
+ obj.headers['Cookie'] = cookie;
+ log('历史有大写过期的cookie,更新过验证后的cookie');
+ }else if(!obj.headers){
+ obj.headers = {Cookie:cookie};
+ log('历史无headers,更新过验证后的含cookie的headers');
+ }
+ }
+ let html = getCode(url,obj);
+ return html
+}
+
+/**
+ * 首页分类解析,筛选暂未实现
+ * @param homeObj 首页传参对象
+ * @returns {string}
+ */
+function homeParse(homeObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let classes = [];
+ if (homeObj.class_name && homeObj.class_url) {
+ let names = homeObj.class_name.split('&');
+ let urls = homeObj.class_url.split('&');
+ let cnt = Math.min(names.length, urls.length);
+ for (let i = 0; i < cnt; i++) {
+ classes.push({
+ 'type_id': urls[i],
+ 'type_name': names[i]
+ });
+ }
+ }
+
+ if (homeObj.class_parse) {
+ let p = homeObj.class_parse.split(';');
+ let _ps = parseTags.getParse(p[0]);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ MY_URL = rule.url;
+ if (p.length >= 3) { // 可以不写正则
+ try {
+ let html = getHtml(homeObj.MY_URL);
+ if (html) {
+ homeHtmlCache = html;
+ let list = _pdfa(html, p[0]);
+ if (list && list.length > 0) {
+ list.forEach((it,idex) => {
+ try {
+ let name = _pdfh(it, p[1]);
+ if (homeObj.cate_exclude && (new RegExp(homeObj.cate_exclude).test(name))) {
+ return;
+ }
+ // let url = pdfh(it, p[2]);
+ let url = _pd(it, p[2]);
+ if (p.length > 3 && p[3]) {
+ let exp = new RegExp(p[3]);
+ url = url.match(exp)[1];
+ }
+
+ classes.push({
+ 'type_id': url.trim(),
+ 'type_name': name.trim()
+ });
+ } catch (e) {
+ console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`);
+ }
+ });
+ }
+ }
+ } catch (e) {
+ console.log(e.message);
+ }
+
+ }
+ }
+ // 排除分类
+ classes = classes.filter(it=>!homeObj.cate_exclude || !(new RegExp(homeObj.cate_exclude).test(it.type_name)));
+ let resp = {
+ 'class': classes
+ };
+ if(homeObj.filter){
+ resp.filters = homeObj.filter;
+ }
+ console.log(JSON.stringify(resp));
+ return JSON.stringify(resp);
+
+}
+
+/**
+ * 推荐和搜索单字段继承一级
+ * @param p 推荐或搜索的解析分割;列表
+ * @param pn 自身列表序号
+ * @param pp 一级解析分割;列表
+ * @param ppn 继承一级序号
+ * @returns {*}
+ */
+function getPP(p, pn, pp, ppn){
+ try {
+ let ps = p[pn] === '*' && pp.length > ppn ?pp[ppn]:p[pn]
+ return ps
+ }catch (e) {
+ return ''
+ }
+}
+
+/**
+ * 首页推荐列表解析
+ * @param homeVodObj
+ * @returns {string}
+ */
+function homeVodParse(homeVodObj){
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let d = [];
+ MY_URL = homeVodObj.homeUrl;
+ // setItem('MY_URL',MY_URL);
+ console.log(MY_URL);
+ let t1 = (new Date()).getTime();
+ let p = homeVodObj.推荐;
+ print('p:'+p);
+ if(p==='*' && rule.一级){
+ p = rule.一级;
+ homeVodObj.double = false;
+ }
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ p = p.trim();
+ let pp = rule.一级.split(';');
+ if(p.startsWith('js:')){
+ const TYPE = 'home';
+ var input = MY_URL;
+ HOST = rule.host;
+ eval(p.replace('js:',''));
+ d = VODS;
+ }else {
+ p = p.split(';');
+ if (!homeVodObj.double && p.length < 5) {
+ return '{}'
+ } else if (homeVodObj.double && p.length < 6) {
+ return '{}'
+ }
+ let p0 = getPP(p,0,pp,0)
+ let _ps = parseTags.getParse(p0);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p0.startsWith('json:');
+ p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
+ // print(p[0]);
+ let html = homeHtmlCache || getHtml(MY_URL);
+ homeHtmlCache = undefined;
+ if(is_json){
+ // print('是json,开始处理');
+ html = dealJson(html);
+ }
+ try {
+ console.log('double:' + homeVodObj.double);
+ if (homeVodObj.double) {
+ let items = _pdfa(html, p0);
+ // console.log(items.length);
+ let p1 = getPP(p,1,pp,0);
+ let p2 = getPP(p,2,pp,1);
+ let p3 = getPP(p,3,pp,2);
+ let p4 = getPP(p,4,pp,3);
+ let p5 = getPP(p,5,pp,4);
+ let p6 = getPP(p,6,pp,5);
+ for (let item of items) {
+ // console.log(p[1]);
+ let items2 = _pdfa(item, p1);
+ // console.log(items2.length);
+ for (let item2 of items2) {
+ try {
+ let title = _pdfh(item2, p2);
+ let img = '';
+ try {
+ img = _pd(item2, p3);
+ } catch (e) {}
+ let desc = '';
+ try {
+ desc = _pdfh(item2, p4);
+ }catch (e) {}
+ let links = [];
+ for (let _p5 of p5.split('+')) {
+ let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
+ links.push(link);
+ }
+ let content;
+ if(p.length > 6 && p[6]){
+ content = _pdfh(item2, p6);
+ } else{
+ content = '';
+ }
+ let vid = links.join('$');
+ if(rule.二级==='*'){
+ vid = vid+'@@'+title+'@@'+img;
+ }
+ let vod = {
+ vod_name: title,
+ vod_pic: img,
+ vod_remarks: desc,
+ vod_content: content,
+ vod_id: vid
+ };
+ // print(vod);
+ d.push(vod);
+ } catch (e) {
+ console.log('首页列表处理发生错误:'+e.message);
+ }
+
+ }
+
+
+ }
+
+
+ } else {
+ let items = _pdfa(html, p0);
+ let p1 = getPP(p,1,pp,1);
+ let p2 = getPP(p,2,pp,2);
+ let p3 = getPP(p,3,pp,3);
+ let p4 = getPP(p,4,pp,4);
+ let p5 = getPP(p,5,pp,5);
+ for (let item of items) {
+ try {
+ let title = _pdfh(item, p1);
+ let img = '';
+ try {
+ img = _pd(item, p2, MY_URL);
+ } catch (e) {}
+ let desc = '';
+ try {
+ desc = _pdfh(item, p3);
+ }catch (e) {}
+ let links = [];
+ for (let _p5 of p4.split('+')) {
+ let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
+ links.push(link);
+ }
+ let content;
+ if(p.length > 5 && p[5]){
+ content = _pdfh(item, p5);
+ }else{
+ content = ''
+ }
+ let vid = links.join('$');
+ if(rule.二级==='*'){
+ vid = vid+'@@'+title+'@@'+img;
+ }
+ let vod = {
+ vod_name: title,
+ vod_pic: img,
+ vod_remarks: desc,
+ vod_content: content,
+ vod_id: vid
+ };
+ d.push(vod);
+
+ } catch (e) {
+
+ }
+
+ }
+
+ }
+
+ } catch (e) {
+
+ }
+ }
+ let t2 = (new Date()).getTime();
+ console.log('加载首页推荐耗时:'+(t2-t1)+'毫秒');
+ // console.log(JSON.stringify(d));
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ if(d.length>0){
+ print(d.slice(0,2));
+ }
+ return JSON.stringify({
+ list:d
+ })
+}
+
+/**
+ * 一级分类页数据解析
+ * @param cateObj
+ * @returns {string}
+ */
+function categoryParse(cateObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let p = cateObj.一级;
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ let d = [];
+ // let url = cateObj.url.replaceAll('fyclass', cateObj.tid).replaceAll('fypage', cateObj.pg);
+ let url = cateObj.url.replaceAll('fyclass', cateObj.tid);
+ if(cateObj.pg === 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[1].split(']')[0];
+ }else if(cateObj.pg > 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[0];
+ }
+ if(rule.filter_url){
+ if(!/fyfilter/.test(url)){
+ if(!url.endsWith('&')&&!rule.filter_url.startsWith('&')){
+ url+='&'
+ }
+ url+=rule.filter_url;
+ }else{
+ url = url.replace('fyfilter', rule.filter_url);
+ }
+ // console.log('filter:'+cateObj.filter);
+ let fl = cateObj.filter?cateObj.extend:{};
+ // 自动合并 不同分类对应的默认筛选
+ if(rule.filter_def && typeof(rule.filter_def)==='object'){
+ try {
+ if(Object.keys(rule.filter_def).length>0 && rule.filter_def.hasOwnProperty(cateObj.tid)){
+ let self_fl_def = rule.filter_def[cateObj.tid];
+ if(self_fl_def && typeof(self_fl_def)==='object'){
+ // 引用传递转值传递,避免污染self变量
+ let fl_def = JSON.parse(JSON.stringify(self_fl_def));
+ fl = Object.assign(fl_def,fl);
+ }
+ }
+ }catch (e) {
+ print('合并不同分类对应的默认筛选出错:'+e.message);
+ }
+ }
+ let new_url;
+ new_url = cheerio.jinja2(url,{fl:fl});
+ // console.log('jinjia2执行后的new_url类型为:'+typeof(new_url));
+ if(/object Object/.test(new_url)){
+ new_url = drT.renderText(url,fl);
+ }
+ url = new_url;
+ }
+ if(/fypage/.test(url)){
+ if(url.includes('(')&&url.includes(')')){
+ let url_rep = url.match(/.*?\((.*)\)/)[1];
+ // console.log(url_rep);
+ let cnt_page = url_rep.replaceAll('fypage', cateObj.pg);
+ // console.log(cnt_page);
+ let cnt_pg = eval(cnt_page);
+ // console.log(cnt_pg);
+ url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
+ }else{
+ url = url.replaceAll('fypage',cateObj.pg);
+ }
+ }
+
+ MY_URL = url;
+ // setItem('MY_URL',MY_URL);
+ console.log(MY_URL);
+ p = p.trim();
+ const MY_CATE = cateObj.tid;
+ if(p.startsWith('js:')){
+ var MY_FL = cateObj.extend;
+ const TYPE = 'cate';
+ var input = MY_URL;
+ const MY_PAGE = cateObj.pg;
+ var desc = '';
+ eval(p.trim().replace('js:',''));
+ d = VODS;
+ }else {
+ p = p.split(';');
+ if (p.length < 5) {
+ return '{}'
+ }
+ let _ps = parseTags.getParse(p[0]);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p[0].startsWith('json:');
+ p[0] = p[0].replace(/^(jsp:|json:|jq:)/,'');
+ try {
+ let html = getHtml(MY_URL);
+ if (html) {
+ if(is_json){
+ html = dealJson(html);
+ }
+ let list = _pdfa(html, p[0]);
+ list.forEach(it => {
+ let links = p[4].split('+').map(p4=>{
+ return !rule.detailUrl?_pd(it, p4,MY_URL):_pdfh(it, p4);
+ });
+ let link = links.join('$');
+ let vod_id = rule.detailUrl?MY_CATE+'$'+link:link;
+
+ let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g,'').trim();
+ let vod_pic = _pd(it, p[2],MY_URL);
+
+ if(rule.二级==='*'){
+ vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
+ }
+ d.push({
+ 'vod_id': vod_id,
+ 'vod_name': vod_name,
+ 'vod_pic': vod_pic,
+ 'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(),
+ });
+ });
+ }
+ } catch (e) {
+ console.log(e.message);
+ }
+ }
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ // print(d);
+ if(d.length>0){
+ print(d.slice(0,2));
+ }
+ let pagecount = 0;
+ if(rule.pagecount && typeof(rule.pagecount) === 'object' && rule.pagecount.hasOwnProperty(MY_CATE)){
+ print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
+ pagecount = parseInt(rule.pagecount[MY_CATE]);
+ }
+ let nodata = {
+ list:[{vod_name:'无数据,防无限请求',vod_id:'no_data',vod_remarks:'不要点,会崩的',vod_pic:'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}],
+ total:1,pagecount:1,page:1,limit:1
+ };
+ let vod = d.length<1?JSON.stringify(nodata):JSON.stringify({
+ 'page': parseInt(cateObj.pg),
+ 'pagecount': pagecount||999,
+ 'limit': 20,
+ 'total': 999,
+ 'list': d,
+ });
+ // print(vod);
+ return vod
+}
+
+/**
+ * 搜索列表数据解析
+ * @param searchObj
+ * @returns {string}
+ */
+function searchParse(searchObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let d = [];
+ if(!searchObj.searchUrl){
+ return '{}'
+ }
+ let p = searchObj.搜索==='*'&&rule.一级 ? rule.一级 : searchObj.搜索;
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ p = p.trim();
+ let pp = rule.一级.split(';');
+ let url = searchObj.searchUrl.replaceAll('**', searchObj.wd);
+ if(searchObj.pg === 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[1].split(']')[0];
+ }else if(searchObj.pg > 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[0];
+ }
+ if(/fypage/.test(url)){
+ if(url.includes('(')&&url.includes(')')){
+ let url_rep = url.match(/.*?\((.*)\)/)[1];
+ // console.log(url_rep);
+ let cnt_page = url_rep.replaceAll('fypage', searchObj.pg);
+ // console.log(cnt_page);
+ let cnt_pg = eval(cnt_page);
+ // console.log(cnt_pg);
+ url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
+ }else{
+ url = url.replaceAll('fypage',searchObj.pg);
+ }
+ }
+
+ MY_URL = url;
+ console.log(MY_URL);
+ // log(searchObj.搜索);
+ // setItem('MY_URL',MY_URL);
+ if(p.startsWith('js:')){
+ const TYPE = 'search';
+ const MY_PAGE = searchObj.pg;
+ const KEY = searchObj.wd;
+ var input = MY_URL;
+ var detailUrl = rule.detailUrl||'';
+ eval(p.trim().replace('js:',''));
+ d = VODS;
+ }else{
+ p = p.split(';');
+ if (p.length < 5) {
+ return '{}'
+ }
+ let p0 = getPP(p,0,pp,0);
+ let _ps = parseTags.getParse(p0);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p0.startsWith('json:');
+ p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
+ // print('1381 p0:'+p0);
+ try {
+ let req_method = MY_URL.split(';').length>1?MY_URL.split(';')[1].toLowerCase():'get';
+ let html;
+ if(req_method==='post'){
+ let rurls = MY_URL.split(';')[0].split('#')
+ let rurl = rurls[0]
+ let params = rurls.length > 1 ?rurls[1]:'';
+ print(`post=》rurl:${rurl},params:${params}`);
+ // let new_dict = {};
+ // let new_tmp = params.split('&');
+ // new_tmp.forEach(i=>{
+ // new_dict[i.split('=')[0]] = i.split('=')[1];
+ // });
+ // html = post(rurl,{body:new_dict});
+ let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let postData = {body:params};
+ Object.assign(_fetch_params,postData);
+ html = post(rurl,_fetch_params);
+ }else if(req_method==='postjson'){
+ let rurls = MY_URL.split(';')[0].split('#')
+ let rurl = rurls[0]
+ let params = rurls.length > 1 ?rurls[1]:'';
+ print(`postjson-》rurl:${rurl},params:${params}`);
+ try{
+ params = JSON.parse(params);
+ }catch (e) {
+ params = '{}'
+ }
+ let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let postData = {body:params};
+ Object.assign(_fetch_params,postData);
+ html = post(rurl,_fetch_params);
+ }else{
+ html = getHtml(MY_URL);
+ }
+ if (html) {
+ if(/系统安全验证|输入验证码/.test(html)){
+ let cookie = verifyCode(MY_URL);
+ if(cookie){
+ console.log(`本次成功过验证,cookie:${cookie}`);
+ setItem(RULE_CK,cookie);
+ }else{
+ console.log(`本次自动过搜索验证失败,cookie:${cookie}`);
+ }
+ // obj.headers['Cookie'] = cookie;
+ html = getHtml(MY_URL);
+ }
+ if(!html.includes(searchObj.wd)){
+ console.log('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码');
+ console.log(html);
+ }
+ if(is_json){
+ // console.log(html);
+ html = dealJson(html);
+ // console.log(JSON.stringify(html));
+ }
+ // console.log(html);
+ let list = _pdfa(html, p0);
+ // print(list.length);
+ // print(list);
+ let p1 = getPP(p, 1, pp, 1);
+ let p2 = getPP(p, 2, pp, 2);
+ let p3 = getPP(p, 3, pp, 3);
+ let p4 = getPP(p, 4, pp, 4);
+ let p5 = getPP(p,5,pp,5);
+ list.forEach(it => {
+ let links = p4.split('+').map(_p4=>{
+ return !rule.detailUrl?_pd(it, _p4,MY_URL):_pdfh(it, _p4)
+ });
+ let link = links.join('$');
+ let content;
+ if(p.length > 5 && p[5]){
+ content = _pdfh(it, p5);
+ }else{
+ content = '';
+ }
+ let vod_id = link;
+ let vod_name = _pdfh(it, p1).replace(/\n|\t/g,'').trim();
+ let vod_pic = _pd(it, p2,MY_URL);
+ if(rule.二级==='*'){
+ vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
+ }
+ let ob = {
+ 'vod_id': vod_id,
+ 'vod_name': vod_name,
+ 'vod_pic': vod_pic,
+ 'vod_remarks': _pdfh(it, p3).replace(/\n|\t/g,'').trim(),
+ 'vod_content': content.replace(/\n|\t/g,'').trim(),
+ };
+ d.push(ob);
+ });
+
+ }
+ } catch (e) {
+ print('搜索发生错误:'+e.message);
+ return '{}'
+ }
+ }
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ // print(d);
+ return JSON.stringify({
+ 'page': parseInt(searchObj.pg),
+ 'pagecount': 10,
+ 'limit': 20,
+ 'total': 100,
+ 'list': d,
+ });
+}
+
+/**
+ * 二级详情页数据解析
+ * @param detailObj
+ * @returns {string}
+ */
+function detailParse(detailObj){
+ let t1 = (new Date()).getTime();
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let orId = detailObj.orId;
+ let vod_name = '片名';
+ let vod_pic = '';
+ let vod_id = orId;
+ if(rule.二级==='*'){
+ // vod_id = orId.split('@@')[0]; // 千万不能分割
+ let extra = orId.split('@@');
+ vod_name = extra.length>1?extra[1]:vod_name;
+ vod_pic = extra.length>2?extra[2]:vod_pic;
+ }
+ // print(vod_pic);
+ let vod = {
+ vod_id: vod_id, //"id",
+ vod_name: vod_name,
+ vod_pic: vod_pic,
+ type_name: "类型",
+ vod_year: "年份",
+ vod_area: "地区",
+ vod_remarks: "更新信息",
+ vod_actor: "主演",
+ vod_director: "导演",
+ vod_content: "简介"
+ };
+ let p = detailObj.二级;
+ let url = detailObj.url;
+ let detailUrl = detailObj.detailUrl;
+ let fyclass = detailObj.fyclass;
+ let tab_exclude = detailObj.tab_exclude;
+ let html = detailObj.html||'';
+ MY_URL = url;
+ if(detailObj.二级访问前){
+ try {
+ print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
+ eval(detailObj.二级访问前.trim().replace('js:',''));
+ }catch (e) {
+ print(`二级访问前执行代码出现错误:${e.message}`)
+ }
+ }
+ // console.log(MY_URL);
+ // setItem('MY_URL',MY_URL);
+ if(p==='*'){
+ vod.vod_play_from = '道长在线';
+ vod.vod_remarks = detailUrl;
+ vod.vod_actor = '没有二级,只有一级链接直接嗅探播放';
+ vod.vod_content = MY_URL;
+ vod.vod_play_url = '嗅探播放$' + MY_URL.split('@@')[0];
+ }else if(typeof(p)==='string'&&p.trim().startsWith('js:')){
+ const TYPE = 'detail';
+ var input = MY_URL;
+ var play_url = '';
+ eval(p.trim().replace('js:',''));
+ vod = VOD;
+ console.log(JSON.stringify(vod));
+ }else if(p&&typeof(p)==='object'){
+ let tt1 = (new Date()).getTime();
+ if(!html){
+ html = getHtml(MY_URL);
+ }
+ print(`二级${MY_URL}仅获取源码耗时:${(new Date()).getTime()-tt1}毫秒`);
+ let _impJQP = false;
+ let _ps;
+ if(p.is_json){
+ print('二级是json');
+ _ps = parseTags.json;
+ html = dealJson(html);
+ }else if(p.is_jsp){
+ print('二级是jsp');
+ _ps = parseTags.jsp;
+ }else if(p.is_jq){
+ print('二级是jq');
+ _ps = parseTags.jq;
+ }else{
+ print('二级默认jq');
+ _ps = parseTags.jq;
+ // print('二级默认jsp');
+ // _ps = parseTags.jsp;
+ }
+ if(_ps === parseTags.jq){ // jquery解析提前load(html)
+ _impJQP = true;
+ }
+ if (_impJQP) {
+ let ttt1 = (new Date()).getTime();
+ let c$ = cheerio.load(html);
+ // print(`二级${MY_URL}仅c$源码耗时:${(new Date()).getTime()-ttt1}毫秒`);
+ html = { rr: c$, ele: c$('html')[0] };
+ print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date()).getTime()-ttt1}毫秒`);
+ }
+ let tt2 = (new Date()).getTime();
+ print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ if(p.title){
+ let p1 = p.title.split(';');
+ 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;
+ }
+ if(p.desc){
+ try{
+ let p1 = p.desc.split(';');
+ vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g,'').trim();
+ vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g,'').trim():'';
+ vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g,'').trim():'';
+ // vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replaceAll('\n', ' ').trim():'';
+ vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g,'').trim():'';
+ vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g,'').trim():'';
+ }
+ catch (e) {
+
+ }
+ }
+ if(p.content){
+ try{
+ let p1 = p.content.split(';');
+ vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g,'').trim();
+ }
+ catch (e) {}
+ }
+ if(p.img){
+ try{
+ let p1 = p.img.split(';');
+ vod.vod_pic = _pd(html, p1[0],MY_URL);
+ }
+ catch (e) {}
+ }
+
+ let vod_play_from = '$$$';
+ let playFrom = [];
+ if(p.重定向&&p.重定向.startsWith('js:')){
+ print('开始执行重定向代码:'+p.重定向);
+ html = eval(p.重定向.replace('js:',''));
+ if (_impJQP) {
+ let c$ = cheerio.load(html);
+ html = { rr: c$, ele: c$('html')[0] }
+ }
+ }
+
+// console.log(2);
+ if(p.tabs){
+ if(p.tabs.startsWith('js:')){
+ print('开始执行tabs代码:'+p.tabs);
+ if(html&&_impJQP&&typeof (html)!=='string'){
+ try { // 假装是jq的对象拿来转换一下字符串,try为了防止json的情况报错
+ html = html.rr(html.ele).toString();
+ }catch (e) {}
+ }
+ var input = MY_URL;
+ eval(p.tabs.replace('js:',''));
+ playFrom = TABS;
+ }else{
+ let p_tab = p.tabs.split(';')[0];
+ // console.log(p_tab);
+ let vHeader = _pdfa(html, p_tab);
+ console.log(vHeader.length);
+ let tab_text = p.tab_text||'body&&Text';
+ // print('tab_text:'+tab_text);
+ let new_map = {};
+ for(let v of vHeader){
+ let v_title = _pdfh(v,tab_text).trim();
+ console.log(v_title);
+ if(tab_exclude&& (new RegExp(tab_exclude)).test(v_title)){
+ continue;
+ }
+ if(!new_map.hasOwnProperty(v_title)){
+ new_map[v_title] = 1;
+ }else{
+ new_map[v_title] += 1;
+ }
+ if(new_map[v_title]>1){
+ v_title+=Number(new_map[v_title]-1);
+ }
+ playFrom.push(v_title);
+ }
+ }
+ console.log(JSON.stringify(playFrom));
+ }else{
+ playFrom = ['道长在线']
+ }
+ vod.vod_play_from = playFrom.join(vod_play_from);
+
+// console.log(3);
+ let vod_play_url = '$$$';
+ let vod_tab_list = [];
+ if(p.lists){
+ if(p.lists.startsWith('js:')){
+ print('开始执行lists代码:'+p.lists);
+ try {
+ if(html&&_impJQP&&typeof (html)!=='string'){
+ // 假装是jq的对象拿来转换一下字符串,try为了防止json的情况报错
+ try {
+ html = html.rr(html.ele).toString();
+ }catch (e) {}
+ }
+ var input = MY_URL;
+ var play_url = '';
+ eval(p.lists.replace('js:',''));
+ for(let i in LISTS){
+ if(LISTS.hasOwnProperty(i)){
+ // print(i);
+ try {
+ LISTS[i] = LISTS[i].map(it=>it.split('$').slice(0,2).join('$'));
+ }catch (e) {
+ print('格式化LISTS发生错误:'+e.message);
+ }
+ }
+ }
+ vod_play_url = LISTS.map(it=>it.join('#')).join(vod_play_url);
+ }catch (e) {
+ print('js执行lists: 发生错误:'+e.message);
+ }
+
+ }else{
+ let list_text = p.list_text||'body&&Text';
+ let list_url = p.list_url||'a&&href';
+ // print('list_text:'+list_text);
+ // print('list_url:'+list_url);
+ // print('list_parse:'+p.lists);
+ let is_tab_js = p.tabs.trim().startsWith('js:');
+ for(let i=0;i 1 && !is_tab_js ? p.tabs.split(';')[1] : '';
+ let p1 = p.lists.replaceAll('#idv', tab_name).replaceAll('#id', i);
+ tab_ext = tab_ext.replaceAll('#idv', tab_name).replaceAll('#id', i);
+ // 测试jsp提速
+ // console.log(p1);
+ // p1 = p1.replace(':eq(0)',',0').replace(' ','&&');
+ // console.log(p1);
+ // console.log(html);
+ let vodList = [];
+ try {
+ vodList = _pdfa(html, p1);
+ console.log('len(vodList):'+vodList.length);
+ }catch (e) {
+ // console.log(e.message);
+ }
+ let new_vod_list = [];
+ // print('tab_ext:'+tab_ext);
+ let tabName = tab_ext?_pdfh(html, tab_ext):tab_name;
+ console.log(tabName);
+ // console.log('cheerio解析Text');
+ // 此处存在性能问题: pt版2000集需要650毫秒,俊版1300毫秒 特么的优化不动 主要后面定位url的我拿他没法
+ // 主要性能问题在于 _pd(it, list_url, MY_URL)
+ let tt1 = (new Date()).getTime();
+ // vodList.forEach((it,idex)=>{
+ // // 请注意,这里要固定pdfh解析body&&Text,不需要下划线,没写错
+ // // new_vod_list.push(pdfh(it,'body&&Text')+'$'+_pd(it,'a&&href',MY_URL));
+ // // new_vod_list.push(cheerio.load(it).text()+'$'+_pd(it,'a&&href',MY_URL));
+ // // new_vod_list.push(_pdfh(it, list_text).trim() + '$' + _pd(it, list_url, MY_URL));
+ // // new_vod_list.push(_pdfh(it, list_text).trim() + '$' +idex);
+ // // new_vod_list.push(idex + '$' +_pdfh(it, list_url));
+ // new_vod_list.push(_pdfh(it, list_text).trim() + '$' +_pd(it, list_url,MY_URL));
+ // });
+ if(vodList.length>0){
+ for(let i=0;ix.split('$')[0]);
+ console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date()).getTime()-tt1}毫秒`);
+ }
+ let vlist = new_vod_list.join('#');
+ vod_tab_list.push(vlist);
+ }
+ vod_play_url = vod_tab_list.join(vod_play_url);
+ }
+ }
+ vod.vod_play_url = vod_play_url;
+ }
+ if(rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith('http')){
+ vod.vod_pic = vod.vod_pic + rule.图片来源;
+ }
+ if(!vod.vod_id||(vod_id.includes('$')&&vod.vod_id!==vod_id)){
+ vod.vod_id = vod_id;
+ }
+ let t2 = (new Date()).getTime();
+ console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
+ // print(vod);
+ vod = vodDeal(vod);
+ // print(vod);
+ return JSON.stringify({
+ list: [vod]
+ })
+}
+
+/**
+ * 获取二级待返回的播放线路没处理时的索引关系
+ * @param vod
+ * @returns {{}}
+ */
+function get_tab_index(vod){
+ let obj = {};
+ vod.vod_play_from.split('$$$').forEach((it,index)=>{
+ obj[it] = index;
+ });
+ return obj
+}
+
+/**
+ * 处理待返回的vod数据|线路去除,排序,重命名
+ * @param vod
+ * @returns {*}
+ */
+function vodDeal(vod){
+ let vod_play_from = vod.vod_play_from.split('$$$');
+ let vod_play_url = vod.vod_play_url.split('$$$');
+
+ // 移除指定线路后的列表
+ 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;
+ // 选集列表根据线路排序
+ 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);
+
+ if(rule.tab_remove&&rule.tab_remove.length>0){
+ tab_removed_list = vod_play_from.filter(it=>!rule.tab_remove.includes(it));
+ tab_list = tab_removed_list;
+ }
+
+ if(rule.tab_order&&rule.tab_order.length>0){
+ let tab_order = rule.tab_order;
+ 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))
+ });
+ tab_list = tab_ordered_list;
+ }
+ play_ordered_list = tab_list.map(it=>vod_play_url[tab_index_dict[it]]);
+ }
+
+ if(rule.tab_rename&&typeof(rule.tab_rename)==='object'&Object.keys(rule.tab_rename).length>0){
+ tab_renamed_list = tab_list.map(it=>rule.tab_rename[it]||it);
+ tab_list = tab_renamed_list;
+ }
+ vod.vod_play_from = tab_list.join('$$$');
+ vod.vod_play_url = play_ordered_list.join('$$$');
+ return vod
+}
+
+/**
+ * 判断是否需要解析
+ * @param url
+ * @returns {number|number}
+ */
+function tellIsJx(url){
+ try {
+ let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split('?')[0]) && 是否正版(url);
+ return is_vip?1:0
+ }catch (e) {
+ return 1
+ }
+}
+/**
+ * 选集播放点击事件解析
+ * @param playObj
+ * @returns {string}
+ */
+function playParse(playObj){
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ MY_URL = playObj.url;
+ if(!/http/.test(MY_URL)){
+ try {
+ MY_URL = base64Decode(MY_URL);
+ }catch (e) {}
+ }
+ MY_URL = decodeURIComponent(MY_URL);
+ var input = MY_URL;//注入给免嗅js
+ let common_play = {
+ parse:1,
+ url:input,
+ // url:urlencode(input),
+ jx:tellIsJx(input)
+ };
+ let lazy_play;
+ if(!rule.play_parse||!rule.lazy){
+ lazy_play = common_play;
+ }else if(rule.play_parse&&rule.lazy&&typeof(rule.lazy)==='string'){
+ try {
+ let lazy_code = rule.lazy.replace('js:','').trim();
+ print('开始执行js免嗅=>'+lazy_code);
+ eval(lazy_code);
+ lazy_play = typeof(input) === 'object'?input:{
+ parse:1,
+ jx:tellIsJx(input),
+ url:input
+ };
+ }catch (e) {
+ print('js免嗅错误:'+e.message);
+ lazy_play = common_play;
+ }
+ }else{
+ lazy_play = common_play;
+ }
+ // print('play_json:'+typeof(rule.play_json));
+ // console.log(Array.isArray(rule.play_json));
+ if(Array.isArray(rule.play_json) && rule.play_json.length >0){ // 数组情况判断长度大于0
+ let web_url = lazy_play.url;
+ for(let pjson of rule.play_json){
+ if(pjson.re && (pjson.re==='*'||web_url.match(new RegExp(pjson.re)))){
+ if(pjson.json && typeof(pjson.json)==='object'){
+ let base_json = pjson.json;
+ // print('开始合并:');
+ // print(base_json);
+ lazy_play = Object.assign(lazy_play,base_json);
+ break;
+ }
+ }
+ }
+ }else if(rule.play_json && !Array.isArray(rule.play_json)){ // 其他情况 非[] 判断true/false
+ let base_json = {
+ jx:1,
+ parse:1,
+ };
+ lazy_play = Object.assign(lazy_play,base_json);
+ }else if(!rule.play_json){ // 不解析传0
+ let base_json = {
+ jx:0,
+ parse:1,
+ };
+ lazy_play = Object.assign(lazy_play,base_json);
+ }
+ console.log(JSON.stringify(lazy_play));
+ return JSON.stringify(lazy_play);
+}
+
+/**
+ * 本地代理解析规则
+ * @param params
+ */
+function proxyParse(proxyObj){
+ var input = proxyObj.params;
+ if(proxyObj.proxy_rule){
+ log('准备执行本地代理规则:\n'+proxyObj.proxy_rule);
+ try {
+ eval(proxyObj.proxy_rule);
+ if(input && input!== proxyObj.params && Array.isArray(input) &&input.length===3){
+ return input
+ }else{
+ return [404,'text/plain','Not Found']
+ }
+ }catch (e) {
+ return [500,'text/plain','代理规则错误:'+e.message]
+ }
+
+ }else{
+ return [404,'text/plain','Not Found']
+ }
+}
+
+/**
+ * 辅助嗅探解析规则
+ * @param isVideoObj
+ * @returns {boolean}
+ */
+function isVideoParse(isVideoObj){
+ var input = isVideoObj.url;
+ if(!isVideoObj.t){ // t为假代表默认传的正则字符串
+ let re_matcher = new RegExp(isVideoObj.isVideo,'i'); // /g匹配多个,/i不区分大小写,/m匹配多行
+ return re_matcher.test(input);
+ }else{
+ // 执行js
+ try {
+ eval(isVideoObj.isVideo);
+ if(typeof(input)==='boolean'){
+ return input
+ }else{
+ return false
+ }
+ }catch (e) {
+ log('执行嗅探规则发生错误:'+e.message);
+ return false
+ }
+ }
+}
+
+/**
+ * js源预处理特定返回对象中的函数
+ * @param ext
+ */
+ function init(ext) {
+ console.log('init');
+ try {
+ // make shared jsContext happy muban不能import,不然会造成换源继承后变量被篡改
+ // if (typeof (globalThis.mubanJs) === 'undefined') {
+ // let mubanJs = request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js', { 'User-Agent': MOBILE_UA });
+ // mubanJs = mubanJs.replace('export default', '(function() {return muban;}()) // export default');
+ // // console.log(mubanJs);
+ // globalThis.mubanJs = mubanJs;
+ // }
+ // let muban = eval(globalThis.mubanJs);
+ let muban = 模板.getMubans();
+ if (typeof ext == 'object'){
+ rule = ext;
+ } else if (typeof ext == 'string') {
+ if (ext.startsWith('http')) {
+ let js = request(ext,{'method':'GET'});
+ if (js){
+ eval(js.replace('var rule', 'rule'));
+ }
+ } else {
+ eval(ext.replace('var rule', 'rule'));
+ }
+ }
+ if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
+ print('继承模板:'+rule.模板);
+ rule = Object.assign(muban[rule.模板], rule);
+ }
+ /** 处理一下 rule规则关键字段没传递的情况 **/
+ let rule_cate_excludes = (rule.cate_exclude||'').split('|').filter(it=>it.trim());
+ let rule_tab_excludes = (rule.tab_exclude||'').split('|').filter(it=>it.trim());
+ 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('|');
+ rule.tab_exclude = rule_tab_excludes.join('|');
+ rule.host = (rule.host||'').rstrip('/');
+ HOST = rule.host;
+ if(rule.hostJs){
+ console.log(`检测到hostJs,准备执行...`);
+ try {
+ eval(rule.hostJs);
+ rule.host = HOST.rstrip('/');
+ }catch (e) {
+ console.log(`执行${rule.hostJs}获取host发生错误:`+e.message);
+ }
+ }
+ rule.url = rule.url||'';
+ rule.double = rule.double||false;
+ rule.homeUrl = rule.homeUrl||'';
+ rule.detailUrl = rule.detailUrl||'';
+ rule.searchUrl = rule.searchUrl||'';
+ rule.homeUrl = rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):(rule.homeUrl||rule.host);
+ rule.detailUrl = rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;
+ rule.二级访问前 = rule.二级访问前||'';
+ if(rule.url.includes('[')&&rule.url.includes(']')){
+ let u1 = rule.url.split('[')[0]
+ let u2 = rule.url.split('[')[1].split(']')[0]
+ rule.url = rule.host && rule.url?urljoin(rule.host,u1)+'['+urljoin(rule.host,u2)+']':rule.url;
+ }else{
+ rule.url = rule.host && rule.url ? urljoin(rule.host,rule.url) : rule.url;
+ }
+
+ if(rule.searchUrl.includes('[')&&rule.searchUrl.includes(']')){
+ let u1 = rule.searchUrl.split('[')[0]
+ 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{
+ rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host,rule.searchUrl) : rule.searchUrl;
+ }
+
+ rule.timeout = rule.timeout||5000;
+ rule.encoding = rule.编码||rule.encoding||'utf-8';
+ rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
+ rule.图片来源 = rule.图片来源||'';
+ rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
+ rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
+ rule.proxy_rule = rule.hasOwnProperty('proxy_rule')?rule.proxy_rule:'';
+ rule.sniffer = rule.hasOwnProperty('sniffer')?rule.sniffer:'';
+ rule.sniffer = !!(rule.sniffer && rule.sniffer!=='0' && rule.sniffer!=='false');
+
+ rule.isVideo = rule.hasOwnProperty('isVideo')?rule.isVideo:'';
+
+ rule.tab_remove = rule.hasOwnProperty('tab_remove')?rule.tab_remove:[];
+ rule.tab_order = rule.hasOwnProperty('tab_order')?rule.tab_order:[];
+ rule.tab_rename = rule.hasOwnProperty('tab_rename')?rule.tab_rename:{};
+
+ if(rule.headers && typeof(rule.headers) === 'object'){
+ try {
+ let header_keys = Object.keys(rule.headers);
+ for(let k of header_keys){
+ if(k.toLowerCase() === 'user-agent'){
+ let v = rule.headers[k];
+ console.log(v);
+ if(['MOBILE_UA','PC_UA','UC_UA','IOS_UA','UA'].includes(v)){
+ rule.headers[k] = eval(v);
+ }
+ }
+ }
+ }catch (e) {
+ console.log('处理headers发生错误:'+e.message);
+ }
+ }
+ // print(rule.headers);
+ rule_fetch_params = {'headers': rule.headers||false, 'timeout': rule.timeout, 'encoding': rule.encoding};
+ oheaders = rule.headers||{};
+ RKEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host);
+ pre(); // 预处理
+ init_test();
+ }catch (e) {
+ console.log('init_test发生错误:'+e.message);
+ }
+}
+
+let homeHtmlCache = undefined;
+
+/**
+ * js源获取首页分类和筛选特定返回对象中的函数
+ * @param filter 筛选条件字典对象
+ * @returns {string}
+ */
+function home(filter) {
+ console.log("home");
+ let homeObj = {
+ filter:rule.filter||false,
+ MY_URL: rule.homeUrl,
+ class_name: rule.class_name || '',
+ class_url: rule.class_url || '',
+ class_parse: rule.class_parse || '',
+ cate_exclude: rule.cate_exclude,
+ };
+ return homeParse(homeObj);
+}
+
+/**
+ * js源获取首页推荐数据列表特定返回对象中的函数
+ * @param params
+ * @returns {string}
+ */
+function homeVod(params) {
+ console.log("homeVod");
+ let homeVodObj = {
+ 推荐:rule.推荐,
+ double:rule.double,
+ homeUrl:rule.homeUrl,
+ detailUrl:rule.detailUrl
+ };
+ return homeVodParse(homeVodObj)
+ // return "{}";
+}
+
+/**
+ * js源获取分类页一级数据列表特定返回对象中的函数
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 当前选中的筛选条件
+ * @param extend 扩展
+ * @returns {string}
+ */
+function category(tid, pg, filter, extend) {
+ let cateObj = {
+ url: rule.url,
+ 一级: rule.一级,
+ tid: tid,
+ pg: parseInt(pg),
+ filter: filter,
+ extend: extend
+ };
+ // console.log(JSON.stringify(extend));
+ return categoryParse(cateObj)
+}
+
+/**
+ * js源获取二级详情页数据特定返回对象中的函数
+ * @param vod_url 一级列表中的vod_id或者是带分类的自拼接 vod_id 如 fyclass$vod_id
+ * @returns {string}
+ */
+function detail(vod_url) {
+ let orId = vod_url;
+ let fyclass = '';
+ if(vod_url.indexOf('$')>-1){
+ let tmp = vod_url.split('$');
+ fyclass = tmp[0];
+ vod_url = tmp[1];
+ }
+ let detailUrl = vod_url.split('@@')[0];
+ let url;
+ if(!detailUrl.startsWith('http')&&!detailUrl.includes('/')){
+ url = rule.detailUrl.replaceAll('fyid', detailUrl).replaceAll('fyclass',fyclass);
+ }else if(detailUrl.includes('/')){
+ url = urljoin(rule.homeUrl,detailUrl);
+ }else{
+ url = detailUrl
+ }
+ let detailObj = {
+ orId: orId,
+ url:url,
+ 二级:rule.二级,
+ 二级访问前:rule.二级访问前,
+ detailUrl:detailUrl,
+ fyclass:fyclass,
+ tab_exclude:rule.tab_exclude,
+ }
+ return detailParse(detailObj)
+}
+
+/**
+ * js源选集按钮播放点击事件特定返回对象中的函数
+ * @param flag 线路名
+ * @param id 播放按钮的链接
+ * @param flags 全局配置的flags是否需要解析的标识列表
+ * @returns {string}
+ */
+function play(flag, id, flags) {
+ let playObj = {
+ url:id,
+ flag:flag,
+ flags:flags
+ }
+ return playParse(playObj);
+}
+
+/**
+ * js源搜索返回的数据列表特定返回对象中的函数
+ * @param wd 搜索关键字
+ * @param quick 是否来自快速搜索
+ * @returns {string}
+ */
+function search(wd, quick, pg) {
+ if(rule.search_encoding){
+ if(rule.search_encoding.toLowerCase()!=='utf-8'){
+ // 按搜索编码进行编码
+ wd = encodeStr(wd,rule.search_encoding);
+ }
+ }else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
+ // 按全局编码进行编码
+ wd = encodeStr(wd,rule.encoding);
+ }
+ let searchObj = {
+ searchUrl: rule.searchUrl,
+ 搜索: rule.搜索,
+ wd: wd,
+ //pg: pg,
+ pg: pg||1,
+ quick: quick,
+ };
+ // console.log(JSON.stringify(searchObj));
+ return searchParse(searchObj)
+}
+
+/**
+ * js源本地代理返回的数据列表特定返回对象中的函数
+ * @param params 代理链接参数比如 /proxy?do=js&url=https://wwww.baidu.com => params就是 {do:'js','url':'https://wwww.baidu.com'}
+ * @returns {*}
+ */
+function proxy(params){
+ if(rule.proxy_rule&&rule.proxy_rule.trim()){
+ rule.proxy_rule = rule.proxy_rule.trim();
+ }
+ if(rule.proxy_rule.startsWith('js:')){
+ rule.proxy_rule = rule.proxy_rule.replace('js:','');
+ }
+ let proxyObj = {
+ params:params,
+ proxy_rule:rule.proxy_rule
+ };
+ return proxyParse(proxyObj)
+}
+
+/**
+ * 是否启用辅助嗅探功能,启用后可以根据isVideo函数进行手动识别为视频的链接地址。默认为false
+ * @returns {*|boolean|boolean}
+ */
+function sniffer(){
+ let enable_sniffer = rule.sniffer || false;
+ if(enable_sniffer){
+ // log('准备执行辅助嗅探代理规则:\n'+rule.isVideo);
+ log('开始执行辅助嗅探代理规则...');
+ }
+ return enable_sniffer
+}
+
+/**
+ * 启用辅助嗅探功能后根据次函数返回的值识别地址是否为视频,返回true/false
+ * @param url
+ */
+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 DRPY(){//导出函数
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ proxy:proxy,
+ sniffer:sniffer,
+ isVideo:isVideo
+ }
+}
+
+/**
+ * 导出函数无法简写成下面的形式:
+
+ export default {
+ ...DRPY,
+ DRPY
+ }
+
+ */
+
+// 导出函数对象
+export default {
+ init,
+ home,
+ homeVod,
+ category,
+ detail,
+ play,
+ search,
+ proxy,
+ sniffer,
+ isVideo,
+ DRPY,
+}
diff --git a/lib/drpy.min.js b/lib/drpy.min.js
index 9272404e..a953035a 100644
--- a/lib/drpy.min.js
+++ b/lib/drpy.min.js
@@ -1 +1 @@
-import cheerio from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js";import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";import{gbkTool}from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};const VERSION="drpy1 3.9.48beta8 20231004";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";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 UA="Mozilla/5.0";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";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd(html,parse,uri){let ret=this.pdfh(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse,base_url){if(!parse||!parse.trim()){return""}let eleFind=typeof html==="object";let option=undefined;if(eleFind&&parse.startsWith("body&&")){parse=parse.substr(6);if(parse.indexOf("&&")<0){option=parse.trim();parse="*=*"}}if(parse.indexOf("&&")>-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)&&!SPECIAL_URL.test(result)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){print("!parse");return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX_A.test(sp[i])&&iit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",searchObj.pg)}}MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _impJQP=false;let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}if(_ps===parseTags.jq){_impJQP=true}if(_impJQP){let ttt1=(new Date).getTime();let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]};print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date).getTime()-ttt1}毫秒`)}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");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}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let tt1=(new Date).getTime();if(vodList.length>0){for(let i=0;ix.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");let tab_removed_list=vod_play_from;let tab_ordered_list=vod_play_from;let tab_renamed_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);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it))}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;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))});play_ordered_list=tab_ordered_list.map(it=>vod_play_url[tab_index_dict[it]])}}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_ordered_list.map(it=>rule.tab_rename[it]||it)}vod.vod_play_from=tab_renamed_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return vod}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());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("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")){let u1=rule.searchUrl.split("[")[0];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{rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl}rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}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 DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
\ No newline at end of file
+import cheerio from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";import"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/drT.js";import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";import{gbkTool}from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};const VERSION="drpy1 3.9.48beta16 20231011";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";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 UA="Mozilla/5.0";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";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd(html,parse,uri){let ret=this.pdfh(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse,base_url){if(!parse||!parse.trim()){return""}let eleFind=typeof html==="object";let option=undefined;if(eleFind&&parse.startsWith("body&&")){parse=parse.substr(6);if(parse.indexOf("&&")<0){option=parse.trim();parse="*=*"}}if(parse.indexOf("&&")>-1){let sp=parse.split("&&");option=sp[sp.length-1];sp.splice(sp.length-1);if(sp.length>1){for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX.test(sp[i])){sp[i]=sp[i]+":eq(0)"}}}}else{if(!SELECT_REGEX.test(sp[0])){sp[0]=sp[0]+":eq(0)"}}parse=sp.join(" ")}let result="";const $=eleFind?html.rr:cheerio.load(html);let ret=eleFind?parse==="*=*"||$(html.ele).is(parse)?html.ele:$(html.ele).find(parse):$(parse);if(option){if(option==="Text"){result=$(ret).text()}else if(option==="Html"){result=$(ret).html()}else{result=$(ret).attr(option);if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}}if(result&&base_url&&DOM_CHECK_ATTR.test(option)&&!SPECIAL_URL.test(result)){if(/http/.test(result)){result=result.substr(result.indexOf("http"))}else{result=urljoin(base_url,result)}}}else{result=$(ret).toString()}return result},pdfa(html,parse){if(!parse||!parse.trim()){print("!parse");return[]}let eleFind=typeof html==="object";if(parse.indexOf("&&")>-1){let sp=parse.split("&&");for(let i in sp){if(sp.hasOwnProperty(i)){if(!SELECT_REGEX_A.test(sp[i])&&iit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});if(/object Object/.test(new_url)){new_url=drT.renderText(url,fl)}url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",searchObj.pg)}}MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _impJQP=false;let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}if(_ps===parseTags.jq){_impJQP=true}if(_impJQP){let ttt1=(new Date).getTime();let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]};print(`二级${MY_URL}仅cheerio.load源码耗时:${(new Date).getTime()-ttt1}毫秒`)}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");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}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""));if(_impJQP){let c$=cheerio.load(html);html={rr:c$,ele:c$("html")[0]}}}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{if(html&&_impJQP&&typeof html!=="string"){try{html=html.rr(html.ele).toString()}catch(e){}}var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}let new_vod_list=[];let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let tt1=(new Date).getTime();if(vodList.length>0){for(let i=0;ix.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${vodList.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");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;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);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it));tab_list=tab_removed_list}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;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))});tab_list=tab_ordered_list}play_ordered_list=tab_list.map(it=>vod_play_url[tab_index_dict[it]])}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_list.map(it=>rule.tab_rename[it]||it);tab_list=tab_renamed_list}vod.vod_play_from=tab_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return vod}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());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("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")){let u1=rule.searchUrl.split("[")[0];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{rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl}rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}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 DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
\ No newline at end of file
diff --git a/lib/drpy2.js b/lib/drpy2.js
new file mode 100644
index 00000000..d1a99d61
--- /dev/null
+++ b/lib/drpy2.js
@@ -0,0 +1,2542 @@
+import cheerio from 'assets://js/lib/cheerio.min.js';
+import 'assets://js/lib/crypto-js.js';
+import 模板 from"../js/模板.js"
+import {gbkTool} from './gbk.js'
+// import './rsa.js'
+
+// import cheerio from "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/cheerio.min.js";
+// import "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-js.js";
+// import 模板 from"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js";
+// import {gbkTool} from 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/gbk.js'
+
+function init_test(){
+ // console.log(typeof(CryptoJS));
+ console.log("init_test_start");
+ // print(模板);
+ // print(typeof(模板.getMubans));
+ console.log("当前版本号:"+VERSION);
+ console.log(RKEY);
+ console.log(JSON.stringify(rule));
+ console.log("init_test_end");
+
+ // console.log(typeof (CryptoJS));
+ // console.log(typeof (JSEncrypt));
+ // var publicKey = "-----BEGIN PUBLIC KEY-----\n" +
+ // "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTTt5d1LYtIxiW9ekKFBVonFOT\n" +
+ // "XJHv4PY4xCDLPYbHWRKa/mRO7J11OJX+cR7bqzNq6uxH1W339wV\n" +
+ // "lLP/x3Rl1RBh4prj0eYOEIsDVTvLTJONKazRtQrZ7yzSZ69o/3CQv\n" +
+ // "ex6kb4js+9zho4U9fwIDAQAB\n" +
+ // "-----END PUBLIC KEY-----";
+ // var text = '你好';
+ // const encryptor = new JSEncrypt();
+ // console.log(typeof (encryptor.setPublicKey));
+ // console.log(typeof (encryptor.encrypt));
+ // encryptor.setPublicKey(publicKey) // 设置公钥
+ // var str = encryptor.encrypt(text) // 对数据进行加密
+ // console.log("加密数据:" + str);
+ // log('rsax:'+typeof(rsax));
+ // log('rsaX:'+typeof(rsaX));
+ // let data = base64Encode('你好');
+ // let publicKey = 'dzyyds';
+ // console.log(typeof (RSA.encode));
+ // let encryptBase64Data = RSA.encode(data,publicKey);
+ // log('encryptBase64Data:'+encryptBase64Data);
+ // let str = RSA.decode(data,publicKey);
+ // log('str:'+str);
+}
+
+/**
+ * 执行预处理代码
+ */
+function pre(){
+ if(typeof(rule.预处理) === 'string' && rule.预处理 && rule.预处理.trim()){
+ let code = rule.预处理.trim();
+ console.log("执行预处理代码:"+code);
+ if(code.startsWith('js:')){
+ code = code.replace('js:','');
+ }
+ try {
+ // code里可以进行get 或者 post请求cookie并改变rule.headers 里的cookie
+ // 直接操作 rule_fetch_params 这个变量 .headers.Cookie
+ eval(code);
+ }catch (e) {
+ console.log('预处理执行失败:'+e.message);
+ }
+ }
+}
+
+let rule = {};
+let vercode = typeof(pdfl) ==='function'?'drpy2.1':'drpy2';
+const VERSION = vercode+' 3.9.48beta16 20231011';
+/** 已知问题记录
+ * 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了]
+ * Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下)
+ * 2.import es6py.js但是里面的函数没有被装载进来.比如drpy规则报错setResult2 is undefiend(合并文件了可以不管了)
+ * 3.无法重复导入cheerio(怎么解决drpy和parseTag里都需要导入cheerio的问题) 无法在副文件导入cheerio (现在是全部放在drpy一个文件里了,凑合解决?)
+ * 4.有个错误不知道哪儿来的 executeScript: com.quickjs.JSObject$Undefined cannot be cast to java.lang.String 在 点击选集播放打印init_test_end后面打印(貌似不影响使用)
+ * 5.需要实现 stringify 函数,比起JSON.strifngify函数,它会原封不动保留中文不会编码unicode
+ * 6.base64Encode,base64Decode,md5函数还没有实现 (抄影魔代码实现了)
+ * 7.eval(getCryptoJS());还没有实现 (可以空实现了,以后遇到能忽略)
+ * done: jsp:{pdfa,pdfh,pd},json:{pdfa,pdfh,pd},jq:{pdfa,pdfh,pd}
+ * 8.req函数不支持传递字符串的data参数 {'content-type':'text/plain'} 类型数据,因此无法直接调用alist的ocr接口
+ * * 电脑看日志调试
+ adb tcpip 5555
+ adb connect 192.168.10.192
+ adb devices -l
+ adb logcat -c
+ adb logcat | grep -i QuickJS
+ adb logcat -c -b events
+ adb logcat -c -b main -b events -b radio -b system
+ adb logcat > 2.log DRPY:E | grep -i QuickJS
+ * **/
+
+
+/*** 以下是内置变量和解析方法 **/
+const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
+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 UA = 'Mozilla/5.0';
+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';
+const RULE_CK = 'cookie'; // 源cookie的key值
+// const KEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host); // 源的唯一标识
+const CATE_EXCLUDE = '首页|留言|APP|下载|资讯|新闻|动态';
+const TAB_EXCLUDE = '猜你|喜欢|下载|剧情|热播';
+const OCR_RETRY = 3;//ocr验证重试次数
+// const OCR_API = 'http://dm.mudery.com:10000';//ocr在线识别接口
+// const OCR_API = 'http://192.168.3.239:5705/parse/ocr';//ocr在线识别接口
+// const OCR_API = 'http://cms.nokia.press/parse/ocr';//ocr在线识别接口
+// const OCR_API = 'http://cms.nokia.press:5707/parse/ocr';//ocr在线识别接口
+const OCR_API = 'http://drpy.nokia.press:8028/ocr/drpy/text';//ocr在线识别接口
+if(typeof(MY_URL)==='undefined'){
+ var MY_URL; // 全局注入变量,pd函数需要
+}
+var HOST;
+var RKEY; // 源的唯一标识
+var fetch;
+var print;
+var log;
+var rule_fetch_params;
+var fetch_params; // 每个位置单独的
+var oheaders;
+// var play_url; // 二级详情页注入变量,为了适配js模式0 (不在这里定义了,直接二级里定义了个空字符串)
+var _pdfh;
+var _pdfa;
+var _pd;
+// const DOM_CHECK_ATTR = ['url', 'src', 'href', 'data-original', 'data-src'];
+const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
+// 过滤特殊链接,不走urlJoin
+const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
+const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/; // 不自动加eq下标索引
+const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/; // 需要自动urljoin的属性
+const SELECT_REGEX = /:eq|:lt|:gt|#/g;
+const SELECT_REGEX_A = /:eq|:lt|:gt/g;
+
+/**
+ es6py扩展
+ */
+if (typeof Object.assign != 'function') {
+ Object.assign = function () {
+ var target = arguments[0];
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+ return target;
+ };
+}
+if (!String.prototype.includes) {
+ String.prototype.includes = function (search, start) {
+ if (typeof start !== 'number') {
+ start = 0;
+ }
+
+ if (start + search.length > this.length) {
+ return false;
+ } else {
+ return this.indexOf(search, start) !== -1;
+ }
+ };
+}
+
+if (!Array.prototype.includes) {
+ Object.defineProperty(Array.prototype, 'includes', {
+ value: function (searchElement, fromIndex) {
+
+ if (this == null) {//this是空或者未定义,抛出错误
+ throw new TypeError('"this" is null or not defined');
+ }
+
+ var o = Object(this);//将this转变成对象
+ var len = o.length >>> 0;//无符号右移0位,获取对象length属性,如果未定义就会变成0
+
+ if (len === 0) {//length为0直接返回false未找到目标值
+ return false;
+ }
+
+ var n = fromIndex | 0;//查找起始索引
+ var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);//计算正确起始索引,因为有可能是负值
+
+ while (k < len) {//从起始索引处开始循环
+ if (o[k] === searchElement) {//如果某一位置与寻找目标相等,返回true,找到了
+ return true;
+ }
+ k++;
+ }
+ return false;//未找到,返回false
+ }
+ });
+}
+if (typeof String.prototype.startsWith != 'function') {
+ String.prototype.startsWith = function (prefix){
+ return this.slice(0, prefix.length) === prefix;
+ };
+}
+if (typeof String.prototype.endsWith != 'function') {
+ String.prototype.endsWith = function(suffix) {
+ return this.indexOf(suffix, this.length - suffix.length) !== -1;
+ };
+}
+Object.prototype.myValues=function(obj){
+ if(obj ==null) {
+ throw new TypeError("Cannot convert undefined or null to object");
+ }
+ var res=[]
+ for(var k in obj){
+ if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
+ res.push(obj[k]);
+ }
+ }
+ return res;
+}
+if (typeof Object.prototype.values != 'function') {
+ Object.prototype.values=function(obj){
+ if(obj ==null) {
+ throw new TypeError("Cannot convert undefined or null to object");
+ }
+ var res=[]
+ for(var k in obj){
+ if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
+ res.push(obj[k]);
+ }
+ }
+ return res;
+ }
+}
+if (typeof Array.prototype.join != 'function') {
+ Array.prototype.join = function (emoji) {
+ // emoji = emoji||',';
+ emoji = emoji||'';
+ let self = this;
+ let str = "";
+ let i = 0;
+ if (!Array.isArray(self)) {throw String(self)+'is not Array'}
+ if(self.length===0){return ''}
+ if (self.length === 1){return String(self[0])}
+ i = 1;
+ str = this[0];
+ for (; i < self.length; i++) {
+ str += String(emoji)+String(self[i]);
+ }
+ return str;
+ };
+}
+
+String.prototype.rstrip = function (chars) {
+ let regex = new RegExp(chars + "$");
+ return this.replace(regex, "");
+};
+
+Array.prototype.append = Array.prototype.push;
+String.prototype.strip = String.prototype.trim;
+function 是否正版(vipUrl){
+ 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');
+ return flag.test(vipUrl);
+}
+function urlDeal(vipUrl){
+ if(!vipUrl){
+ return ''
+ }
+ if(!是否正版(vipUrl)){
+ return vipUrl
+ }
+ if(!/miguvideo/.test(vipUrl)){
+ vipUrl=vipUrl.split('#')[0].split('?')[0];
+ }
+ return vipUrl
+}
+function setResult(d){
+ if(!Array.isArray(d)){
+ return []
+ }
+ VODS = [];
+ // print(d);
+ d.forEach(function (it){
+ let obj = {
+ vod_id:it.url||'',
+ vod_name: it.title||'',
+ vod_remarks: it.desc||'',
+ vod_content: it.content||'',
+ vod_pic: it.pic_url||it.img||'',
+ };
+ let keys = Object.keys(it);
+ if(keys.includes('tname')){
+ obj.type_name = it.tname||'';
+ }
+ if(keys.includes('tid')){
+ obj.type_id = it.tid||'';
+ }
+ if(keys.includes('year')){
+ obj.vod_year = it.year||'';
+ }
+ if(keys.includes('actor')){
+ obj.vod_actor = it.actor||'';
+ }
+ if(keys.includes('director')){
+ obj.vod_director = it.director||'';
+ }
+ if(keys.includes('area')){
+ obj.vod_area = it.area||'';
+ }
+ VODS.push(obj);
+ });
+ return VODS
+}
+function setResult2(res){
+ VODS = res.list||[];
+ return VODS
+}
+function setHomeResult(res){
+ if(!res||typeof(res)!=='object'){
+ return []
+ }
+ return setResult(res.list);
+}
+// 猫了个咪
+function rc(js) {
+ if (js === 'maomi_aes.js') {
+ var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
+ var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
+ return {
+ De: function (word) {
+ word = CryptoJS.enc.Hex.parse(word)
+ return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
+ iv: t,
+ mode: CryptoJS.mode.CBC,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString(CryptoJS.enc.Utf8)
+ },
+ En: function (word) {
+ // print(a);
+ // print(word);
+ var Encrypted = CryptoJS.AES.encrypt(word, a, {
+ iv: t,
+ mode: CryptoJS.mode.CBC,
+ padding: CryptoJS.pad.Pkcs7
+ });
+ return Encrypted.ciphertext.toString();
+ }
+ };
+ }
+ return {};
+}
+
+// 千万不要用for in 推荐 forEach (for in 会打乱顺序)
+//猫函数
+function maoss(jxurl, ref, key) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ eval(getCryptoJS());
+ try {
+ var getVideoInfo = function (text) {
+ return CryptoJS.AES.decrypt(text, key, {iv: iv, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
+ };
+ var token_key = key == undefined ? 'dvyYRQlnPRCMdQSe' : key;
+ if (ref) {
+ var html = request(jxurl, {
+ headers: {
+ 'Referer': ref
+ }
+ });
+ } else {
+ var html = request(jxurl);
+ }
+ // print(html);
+ if (html.indexOf('&btwaf=') != -1) {
+ html = request(jxurl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], {
+ headers: {
+ 'Referer': ref
+ }
+ })
+ }
+ var token_iv = html.split('_token = "')[1].split('"')[0];
+ var key = CryptoJS.enc.Utf8.parse(token_key);
+ var iv = CryptoJS.enc.Utf8.parse(token_iv);
+ // log("iv:"+iv);
+ // log(html);
+ // print(key);
+ // print(iv);
+ eval(html.match(/var config = {[\s\S]*?}/)[0] + '');
+ // config.url = config.url.replace(/,/g,'');
+ // print(config.url);
+ if (!config.url.startsWith('http')) {
+ //config.url = decodeURIComponent(AES(config.url, key, iv));
+ config.url = CryptoJS.AES.decrypt(config.url, key, {
+ iv: iv,
+ padding: CryptoJS.pad.Pkcs7
+ }).toString(CryptoJS.enc.Utf8)
+ }
+ return config.url;
+ } catch (e) {
+ return '';
+ }
+}
+
+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 base64Encode(text){
+ return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text));
+ // return text
+}
+
+function base64Decode(text){
+ return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text));
+ // return text
+}
+
+function md5(text) {
+ return CryptoJS.MD5(text).toString();
+}
+
+/**
+ * 字符串按指定编码
+ * @param input
+ * @param encoding
+ * @returns {*}
+ */
+function encodeStr(input,encoding){
+ encoding = encoding||'gbk';
+ if(encoding.startsWith('gb')){
+ const strTool = gbkTool();
+ input = strTool.encode(input);
+ }
+ return input
+}
+
+/**
+ * 字符串指定解码
+ * @param input
+ * @param encoding
+ * @returns {*}
+ */
+function decodeStr(input,encoding){
+ encoding = encoding||'gbk';
+ if(encoding.startsWith('gb')){
+ const strTool = gbkTool();
+ input = strTool.decode(input);
+ }
+ return input
+}
+
+function getCryptoJS(){
+ // return request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/libs/crypto-hiker.js');
+ return 'console.log("CryptoJS已装载");'
+}
+
+// 封装的RSA加解密类
+const RSA = {
+ encode:function (data,key,option){
+ // log('encode');
+ if(typeof(rsaEncrypt)==='function'){
+ if(!option||typeof(option)!=='object'){
+ return rsaEncrypt(data,key);
+ }else{
+ return rsaEncrypt(data,key,option);
+ }
+ }else{
+ return false
+ }
+ },
+ decode:function (data,key,option){
+ // log('decode');
+ if(typeof(rsaDecrypt)==='function'){
+ if(!option||typeof(option)!=='object'){
+ return rsaDecrypt(data,key);
+ }else{
+ return rsaDecrypt(data,key,option);
+ }
+ }else{
+ return false
+ }
+ }
+};
+
+/**
+ * 获取壳子返回的代理地址
+ * @returns {string|*}
+ */
+function getProxyUrl(){
+ if(typeof(getProxy)==='function'){//判断壳子里有getProxy函数就执行取返回结果。否则取默认的本地
+ return getProxy(true)
+ }else{
+ return 'http://127.0.0.1:9978/proxy?do=js'
+ }
+}
+
+/**
+ * 强制正序算法
+ * @param lists 待正序列表
+ * @param key 正序键
+ * @param option 单个元素处理函数
+ * @returns {*}
+ */
+function forceOrder(lists,key,option){
+ let start = Math.floor(lists.length/2);
+ let end = Math.min(lists.length-1,start+1);
+ if(start >= end){
+ return lists;
+ }
+ let first = lists[start];
+ let second = lists[end];
+ if(key){
+ try {
+ first = first[key];
+ second = second[key];
+ }catch (e) {}
+ }
+ if(option && typeof(option)==='function'){
+ try {
+ first = option(first);
+ second = option(second);
+ }catch (e) {}
+ }
+ first+='';
+ second+='';
+ // console.log(first,second);
+ if(first.match(/(\d+)/)&&second.match(/(\d+)/)){
+ let num1 = Number(first.match(/(\d+)/)[1]);
+ let num2 = Number(second.match(/(\d+)/)[1]);
+ if (num1 > num2){
+ lists.reverse();
+ }
+ }
+ return lists
+}
+
+let VODS = [];// 一级或者搜索需要的数据列表
+let VOD = {};// 二级的单个数据
+let TABS = [];// 二级的自定义线路列表 如: TABS=['道长在线','道长在线2']
+let LISTS = [];// 二级的自定义选集播放列表 如: LISTS=[['第1集$http://1.mp4','第2集$http://2.mp4'],['第3集$http://1.mp4','第4集$http://2.mp4']]
+globalThis.encodeUrl = urlencode;
+globalThis.urlencode = urlencode;
+
+
+
+/**
+ * url拼接
+ * @param fromPath 初始当前页面url
+ * @param nowPath 相对当前页面url
+ * @returns {*}
+ */
+function urljoin(fromPath, nowPath) {
+ fromPath = fromPath||'';
+ nowPath = nowPath||'';
+ return joinUrl(fromPath, nowPath);
+ // try {
+ // // import Uri from './uri.min.js';
+ // // var Uri = require('./uri.min.js');
+ // // eval(request('https://cdn.bootcdn.net/ajax/libs/URI.js/1.19.11/URI.min.js'));
+ // // let new_uri = URI(nowPath, fromPath);
+
+ // let new_uri = Uri(nowPath, fromPath);
+ // new_uri = new_uri.toString();
+ // // console.log(new_uri);
+ // // return fromPath + nowPath
+ // return new_uri
+ // }
+ // catch (e) {
+ // console.log('urljoin发生错误:'+e.message);
+ // if(nowPath.startsWith('http')){
+ // return nowPath
+ // }if(nowPath.startsWith('/')){
+ // return getHome(fromPath)+nowPath
+ // }
+ // return fromPath+nowPath
+ // }
+}
+var urljoin2 = urljoin;
+
+// 内置 pdfh,pdfa,pd
+const defaultParser = {
+ pdfh:pdfh,
+ pdfa:pdfa,
+ pd:pd,
+};
+
+
+/**
+ * pdfh原版优化,能取style属性里的图片链接
+ * @param html 源码
+ * @param parse 解析表达式
+ * @returns {string|*}
+ */
+function pdfh2(html,parse){
+ let html2 = html;
+ try {
+ if(typeof(html)!=='string'){
+ html2 = html.rr(html.ele).toString();
+ }
+ }catch (e) {
+ print('html对象转文本发生了错误:'+e.message);
+ }
+ let result = defaultParser.pdfh(html2,parse);
+ let option = parse.includes('&&')?parse.split('&&').slice(-1)[0]:parse.split(' ').slice(-1)[0];
+ if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){
+ try {
+ result = result.match(/url\((.*?)\)/)[1];
+ // 2023/07/28新增 style取内部链接自动去除首尾单双引号
+ result = result.replace(/^['|"](.*)['|"]$/, "$1");
+ }catch (e) {}
+ }
+ return result
+}
+
+/**
+ * pdfa原版优化,可以转换jq的html对象
+ * @param html
+ * @param parse
+ * @returns {*}
+ */
+function pdfa2(html,parse){
+ let html2 = html;
+ try {
+ if(typeof(html)!=='string'){
+ html2 = html.rr(html.ele).toString();
+ }
+ }catch (e) {
+ print('html对象转文本发生了错误:'+e.message);
+ }
+ return defaultParser.pdfa(html2,parse);
+}
+
+/**
+ * pd原版方法重写-增加自动urljoin
+ * @param html
+ * @param parse
+ * @param uri
+ * @returns {*}
+ */
+function pd2(html,parse,uri){
+ let ret = pdfh2(html,parse);
+ if(typeof(uri)==='undefined'||!uri){
+ uri = '';
+ }
+ if(DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)){
+ if(/http/.test(ret)){
+ ret = ret.substr(ret.indexOf('http'));
+ }else{
+ ret = urljoin(MY_URL,ret)
+ }
+ }
+ // MY_URL = getItem('MY_URL',MY_URL);
+ // console.log(`规则${RKEY}打印MY_URL:${MY_URL},uri:${uri}`);
+ return ret
+}
+
+const parseTags = {
+ jsp:{
+ pdfh:pdfh2,
+ pdfa:pdfa2,
+ pd:pd2,
+ },
+ json:{
+ pdfh(html, parse) {
+ if (!parse || !parse.trim()){
+ return '';
+ }
+ if (typeof(html) === 'string'){
+ // print('jsonpath:pdfh字符串转dict');
+ html = JSON.parse(html);
+ }
+ parse = parse.trim();
+ if (!parse.startsWith('$.')){
+ parse = '$.' + parse;
+ }
+ parse = parse.split('||');
+ for (let ps of parse) {
+ let ret = cheerio.jp(ps, html);
+ if (Array.isArray(ret)){
+ ret = ret[0] || '';
+ } else{
+ ret = ret || ''
+ }
+ if (ret && typeof (ret) !== 'string'){
+ ret = ret.toString();
+ }
+ if(ret){
+ return ret
+ }
+ }
+ return '';
+ },
+ pdfa(html, parse) {
+ if (!parse || !parse.trim()){
+ return '';
+ }
+ if (typeof(html) === 'string'){
+ // print('jsonpath:pdfa字符串转dict');
+ html = JSON.parse(html);
+ }
+ parse = parse.trim()
+ if (!parse.startsWith('$.')){
+ parse = '$.' + parse;
+ }
+ let ret = cheerio.jp(parse, html);
+ if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1){
+ return ret[0] || []
+ }
+ return ret || []
+ },
+ pd(html,parse){
+ let ret = parseTags.json.pdfh(html,parse);
+ if(ret){
+ return urljoin(MY_URL,ret);
+ }
+ return ret
+ },
+ },
+ jq:{
+ pdfh(html, parse) {
+ if (!html||!parse || !parse.trim()) {
+ return ''
+ }
+ parse = parse.trim();
+ let result = defaultParser.pdfh(html,parse);
+ // print(`pdfh解析${parse}=>${result}`);
+ return result;
+ },
+ pdfa(html, parse) {
+ if (!html||!parse || !parse.trim()) {
+ return [];
+ }
+ parse = parse.trim();
+ let result = defaultParser.pdfa(html,parse);
+ // print(result);
+ print(`pdfa解析${parse}=>${result.length}`);
+ return result;
+ },
+ pd(html,parse,base_url){
+ if (!html||!parse || !parse.trim()) {
+ return ''
+ }
+ parse = parse.trim();
+ base_url = base_url||MY_URL;
+ return defaultParser.pd(html, parse, base_url);
+ },
+ },
+ getParse(p0){//非js开头的情况自动获取解析标签
+ if(p0.startsWith('jsp:')){
+ return this.jsp
+ }else if(p0.startsWith('json:')){
+ return this.json
+ }else if(p0.startsWith('jq:')){
+ return this.jq
+ }else {
+ return this.jq
+ }
+ }
+};
+
+const stringify = JSON.stringify;
+const jsp = parseTags.jsp;
+const jq = parseTags.jq;
+
+/*** 后台需要实现的java方法并注入到js中 ***/
+
+/**
+ * 读取本地文件->应用程序目录
+ * @param filePath
+ * @returns {string}
+ */
+function readFile(filePath){
+ filePath = filePath||'./uri.min.js';
+ var fd = os.open(filePath);
+ var buffer = new ArrayBuffer(1024);
+ var len = os.read(fd, buffer, 0, 1024);
+ console.log(len);
+ let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
+ console.log(text);
+ return text
+}
+
+/**
+ * 处理返回的json数据
+ * @param html
+ * @returns {*}
+ */
+function dealJson(html) {
+ try {
+ // html = html.match(/[\w|\W|\s|\S]*?(\{[\w|\W|\s|\S]*\})/).group[1];
+ html = html.trim();
+ if(!((html.startsWith('{') && html.endsWith('}'))||(html.startsWith('[') && html.endsWith(']')))){
+ html = '{'+html.match(/.*?\{(.*)\}/m)[1]+'}';
+ }
+ } catch (e) {
+ }
+ try {
+ html = JSON.parse(html);
+ }catch (e) {}
+ // console.log(typeof(html));
+ return html;
+}
+
+/**
+ * 验证码识别逻辑,需要java实现(js没有bytes类型,无法调用后端的传递图片二进制获取验证码文本的接口)
+ * @type {{api: string, classification: (function(*=): string)}}
+ */
+var OcrApi={
+ api:OCR_API,
+ classification:function (img){ // img是byte类型,这里不方便搞啊
+ let code = '';
+ try {
+ // let html = request(this.api,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
+ // html = JSON.parse(html);
+ // code = html.url||'';
+ log('通过drpy_ocr验证码接口过验证...');
+ let html = request(OCR_API,{data:{img:img},headers:{'User-Agent':PC_UA},'method':'POST'},true);
+ code = html||'';
+ }catch (e) {
+ log(`OCR识别验证码发生错误:${e.message}`)
+ }
+ return code
+ }
+};
+/**
+ * 验证码识别,暂未实现
+ * @param url 验证码图片链接
+ * @returns {string} 验证成功后的cookie
+ */
+function verifyCode(url){
+ let cnt = 0;
+ let host = getHome(url);
+ let cookie = '';
+ while (cnt < OCR_RETRY){
+ try{
+ // let obj = {headers:headers,timeout:timeout};
+ let yzm_url = `${host}/index.php/verify/index.html`;
+ console.log(`验证码链接:${yzm_url}`);
+ let hhtml = request(yzm_url,{withHeaders:true,toBase64:true},true);
+ let json = JSON.parse(hhtml);
+ if(!cookie){
+ // print(json);
+ let setCk = Object.keys(json).find(it=>it.toLowerCase()==='set-cookie');
+ // cookie = json['set-cookie']?json['set-cookie'].split(';')[0]:'';
+ cookie = setCk?json[setCk].split(';')[0]:'';
+ }
+ // console.log(hhtml);
+ console.log('cookie:'+cookie);
+ let img = json.body;
+ // console.log(img);
+ let code = OcrApi.classification(img);
+ console.log(`第${cnt+1}次验证码识别结果:${code}`);
+ let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
+ console.log(submit_url);
+ let html = request(submit_url,{headers:{Cookie:cookie,'User-Agent':MOBILE_UA},'method':'POST'});
+ // console.log(html);
+ html = JSON.parse(html);
+ if(html.msg === 'ok'){
+ console.log(`第${cnt+1}次验证码提交成功`);
+ return cookie // 需要返回cookie
+ }else if(html.msg!=='ok'&&cnt+1>=OCR_RETRY){
+ cookie = ''; // 需要清空返回cookie
+ }
+ }catch (e) {
+ console.log(`第${cnt+1}次验证码提交失败:${e.message}`);
+ if(cnt+1>=OCR_RETRY){
+ cookie = '';
+ }
+ }
+ cnt+=1
+ }
+ return cookie
+}
+
+/**
+ * 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
+ * @param k 键
+ * @param v 值
+ */
+function setItem(k,v){
+ local.set(RKEY,k,v);
+ console.log(`规则${RKEY}设置${k} => ${v}`)
+}
+
+/**
+ * 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
+ * @param k 键
+ * @param v 值
+ * @returns {*}
+ */
+function getItem(k,v){
+ return local.get(RKEY,k) || v;
+}
+
+/**
+ * 删除数据库key对应的一条数据,并清除此key对应的内存缓存
+ * @param k
+ */
+function clearItem(k){
+ local.delete(RKEY,k);
+}
+
+/*** js自封装的方法 ***/
+
+/**
+ * 获取链接的host(带http协议的完整链接)
+ * @param url 任意一个正常完整的Url,自动提取根
+ * @returns {string}
+ */
+function getHome(url){
+ if(!url){
+ return ''
+ }
+ let tmp = url.split('//');
+ url = tmp[0] + '//' + tmp[1].split('/')[0];
+ try {
+ url = decodeURIComponent(url);
+ }catch (e) {}
+ return url
+}
+
+/**
+ * get参数编译链接,类似python params字典自动拼接
+ * @param url 访问链接
+ * @param obj 参数字典
+ * @returns {*}
+ */
+function buildUrl(url,obj){
+ obj = obj||{};
+ if(url.indexOf('?')<0){
+ url += '?'
+ }
+ let param_list = [];
+ let keys = Object.keys(obj);
+ keys.forEach(it=>{
+ param_list.push(it+'='+obj[it])
+ });
+ let prs = param_list.join('&');
+ if(keys.length > 0 && !url.endsWith('?')){
+ url += '&'
+ }
+ url+=prs;
+ return url
+}
+
+/**
+ * 远程依赖执行函数
+ * @param url 远程js地址
+ */
+function require(url){
+ eval(request(url));
+}
+/**
+ * 海阔网页请求函数完整封装
+ * @param url 请求链接
+ * @param obj 请求对象 {headers:{},method:'',timeout:5000,body:'',withHeaders:false}
+ * @param ocr_flag 标识此flag是用于请求ocr识别的,自动过滤content-type指定编码
+ * @returns {string|string|DocumentFragment|*}
+ */
+function request(url,obj,ocr_flag){
+ ocr_flag = ocr_flag||false;
+ if(typeof(obj)==='undefined'||!obj||obj==={}){
+ if(!fetch_params||!fetch_params.headers){
+ let headers = {
+ 'User-Agent':MOBILE_UA,
+ };
+ if(rule.headers){
+ Object.assign(headers,rule.headers);
+ }
+ if(!fetch_params){
+ fetch_params = {};
+ }
+ fetch_params.headers = headers;
+ }
+ if(!fetch_params.headers.Referer){
+ fetch_params.headers.Referer = getHome(url)
+ }
+ obj = fetch_params;
+ }else{
+ let headers = obj.headers||{};
+ let keys = Object.keys(headers).map(it=>it.toLowerCase());
+ if(!keys.includes('user-agent')){
+ headers['User-Agent'] = MOBILE_UA;
+ }if(!keys.includes('referer')){
+ headers['Referer'] = getHome(url);
+ }
+ obj.headers = headers;
+ }
+ if(rule.encoding&&rule.encoding!=='utf-8'&&!ocr_flag){
+ if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
+ obj.headers["Content-Type"] = 'text/html; charset='+rule.encoding;
+ }
+ }
+ if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='string'){
+ // let data = {};
+ // obj.body.split('&').forEach(it=>{
+ // data[it.split('=')[0]] = it.split('=')[1]
+ // });
+ // obj.data = data;
+ // delete obj.body
+
+ // 传body加 "Content-Type":"application/x-www-form-urlencoded;" 即可post form
+ if(!obj.headers.hasOwnProperty('Content-Type')&&!obj.headers.hasOwnProperty('content-type')){ // 手动指定了就不管
+ obj.headers["Content-Type"] = 'application/x-www-form-urlencoded; charset='+rule.encoding;
+ }
+ }else if(typeof(obj.body)!='undefined'&&obj.body&&typeof (obj.body)==='object'){
+ obj.data = obj.body;
+ delete obj.body
+ }
+ if(!url){
+ return obj.withHeaders?'{}':''
+ }
+ if(obj.toBase64){ // 返回base64,用于请求图片
+ obj.buffer = 2;
+ delete obj.toBase64
+ }
+ console.log(JSON.stringify(obj.headers));
+ // console.log('request:'+url+' obj:'+JSON.stringify(obj));
+ console.log('request:'+url+`|method:${obj.method||'GET'}|body:${obj.body||''}`);
+ let res = req(url, obj);
+ let html = res.content||'';
+ // console.log(html);
+ if(obj.withHeaders){
+ let htmlWithHeaders = res.headers;
+ htmlWithHeaders.body = html;
+ return JSON.stringify(htmlWithHeaders);
+ }else{
+ return html
+ }
+}
+
+/**
+ * 快捷post请求
+ * @param url 地址
+ * @param obj 对象
+ * @returns {string|DocumentFragment|*}
+ */
+function post(url,obj){
+ obj.method = 'POST';
+ return request(url,obj);
+}
+
+fetch = request;
+print = function (data){
+ data = data||'';
+ if(typeof(data)=='object'&&Object.keys(data).length>0){
+ try {
+ data = JSON.stringify(data);
+ console.log(data);
+ }catch (e) {
+ // console.log('print:'+e.message);
+ console.log(typeof(data)+':'+data.length);
+ return
+ }
+ }else if(typeof(data)=='object'&&Object.keys(data).length<1){
+ console.log('null object');
+ }else{
+ console.log(data);
+ }
+}
+log = print;
+/**
+ * 检查宝塔验证并自动跳过获取正确源码
+ * @param html 之前获取的html
+ * @param url 之前的来源url
+ * @param obj 来源obj
+ * @returns {string|DocumentFragment|*}
+ */
+function checkHtml(html,url,obj){
+ if(/\?btwaf=/.test(html)){
+ let btwaf = html.match(/btwaf(.*?)"/)[1];
+ url = url.split('#')[0]+'?btwaf'+btwaf;
+ print('宝塔验证访问链接:'+url);
+ html = request(url,obj);
+ }
+ return html
+}
+
+/**
+ * 带一次宝塔验证的源码获取
+ * @param url 请求链接
+ * @param obj 请求参数
+ * @returns {string|DocumentFragment}
+ */
+function getCode(url,obj){
+ let html = request(url,obj);
+ html = checkHtml(html,url,obj);
+ return html
+}
+
+/**
+ * 源rule专用的请求方法,自动注入cookie
+ * @param url 请求链接
+ * @returns {string|DocumentFragment}
+ */
+function getHtml(url){
+ let obj = {};
+ if(rule.headers){
+ obj.headers = rule.headers;
+ }
+ let cookie = getItem(RULE_CK,'');
+ if(cookie){
+ // log('有cookie:'+cookie);
+ if(obj.headers && ! Object.keys(obj.headers).map(it=>it.toLowerCase()).includes('cookie')){
+ log('历史无cookie,新增过验证后的cookie');
+ obj.headers['Cookie'] = cookie;
+ }else if(obj.headers && obj.headers.cookie && obj.headers.cookie!==cookie){
+ obj.headers['Cookie'] = cookie;
+ log('历史有小写过期的cookie,更新过验证后的cookie');
+ }else if(obj.headers && obj.headers.Cookie && obj.headers.Cookie!==cookie){
+ obj.headers['Cookie'] = cookie;
+ log('历史有大写过期的cookie,更新过验证后的cookie');
+ }else if(!obj.headers){
+ obj.headers = {Cookie:cookie};
+ log('历史无headers,更新过验证后的含cookie的headers');
+ }
+ }
+ let html = getCode(url,obj);
+ return html
+}
+
+/**
+ * 首页分类解析,筛选暂未实现
+ * @param homeObj 首页传参对象
+ * @returns {string}
+ */
+function homeParse(homeObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let classes = [];
+ if (homeObj.class_name && homeObj.class_url) {
+ let names = homeObj.class_name.split('&');
+ let urls = homeObj.class_url.split('&');
+ let cnt = Math.min(names.length, urls.length);
+ for (let i = 0; i < cnt; i++) {
+ classes.push({
+ 'type_id': urls[i],
+ 'type_name': names[i]
+ });
+ }
+ }
+
+ if (homeObj.class_parse) {
+ let p = homeObj.class_parse.split(';');
+ let _ps = parseTags.getParse(p[0]);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ MY_URL = rule.url;
+ if (p.length >= 3) { // 可以不写正则
+ try {
+ let html = getHtml(homeObj.MY_URL);
+ if (html) {
+ homeHtmlCache = html;
+ let list = _pdfa(html, p[0]);
+ if (list && list.length > 0) {
+ list.forEach((it,idex) => {
+ try {
+ let name = _pdfh(it, p[1]);
+ if (homeObj.cate_exclude && (new RegExp(homeObj.cate_exclude).test(name))) {
+ return;
+ }
+ // let url = pdfh(it, p[2]);
+ let url = _pd(it, p[2]);
+ if (p.length > 3 && p[3]) {
+ let exp = new RegExp(p[3]);
+ url = url.match(exp)[1];
+ }
+
+ classes.push({
+ 'type_id': url.trim(),
+ 'type_name': name.trim()
+ });
+ } catch (e) {
+ console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`);
+ }
+ });
+ }
+ }
+ } catch (e) {
+ console.log(e.message);
+ }
+
+ }
+ }
+ // 排除分类
+ classes = classes.filter(it=>!homeObj.cate_exclude || !(new RegExp(homeObj.cate_exclude).test(it.type_name)));
+ let resp = {
+ 'class': classes
+ };
+ if(homeObj.filter){
+ resp.filters = homeObj.filter;
+ }
+ console.log(JSON.stringify(resp));
+ return JSON.stringify(resp);
+
+}
+
+/**
+ * 推荐和搜索单字段继承一级
+ * @param p 推荐或搜索的解析分割;列表
+ * @param pn 自身列表序号
+ * @param pp 一级解析分割;列表
+ * @param ppn 继承一级序号
+ * @returns {*}
+ */
+function getPP(p, pn, pp, ppn){
+ try {
+ let ps = p[pn] === '*' && pp.length > ppn ?pp[ppn]:p[pn]
+ return ps
+ }catch (e) {
+ return ''
+ }
+}
+
+/**
+ * 首页推荐列表解析
+ * @param homeVodObj
+ * @returns {string}
+ */
+function homeVodParse(homeVodObj){
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let d = [];
+ MY_URL = homeVodObj.homeUrl;
+ // setItem('MY_URL',MY_URL);
+ console.log(MY_URL);
+ let t1 = (new Date()).getTime();
+ let p = homeVodObj.推荐;
+ print('p:'+p);
+ if(p==='*' && rule.一级){
+ p = rule.一级;
+ homeVodObj.double = false;
+ }
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ p = p.trim();
+ let pp = rule.一级.split(';');
+ if(p.startsWith('js:')){
+ const TYPE = 'home';
+ var input = MY_URL;
+ HOST = rule.host;
+ eval(p.replace('js:',''));
+ d = VODS;
+ }else {
+ p = p.split(';');
+ if (!homeVodObj.double && p.length < 5) {
+ return '{}'
+ } else if (homeVodObj.double && p.length < 6) {
+ return '{}'
+ }
+ let p0 = getPP(p,0,pp,0)
+ let _ps = parseTags.getParse(p0);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p0.startsWith('json:');
+ p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
+ // print(p[0]);
+ let html = homeHtmlCache || getHtml(MY_URL);
+ homeHtmlCache = undefined;
+ if(is_json){
+ // print('是json,开始处理');
+ html = dealJson(html);
+ }
+ try {
+ console.log('double:' + homeVodObj.double);
+ if (homeVodObj.double) {
+ let items = _pdfa(html, p0);
+ // console.log(items.length);
+ let p1 = getPP(p,1,pp,0);
+ let p2 = getPP(p,2,pp,1);
+ let p3 = getPP(p,3,pp,2);
+ let p4 = getPP(p,4,pp,3);
+ let p5 = getPP(p,5,pp,4);
+ let p6 = getPP(p,6,pp,5);
+ for (let item of items) {
+ // console.log(p[1]);
+ let items2 = _pdfa(item, p1);
+ // console.log(items2.length);
+ for (let item2 of items2) {
+ try {
+ let title = _pdfh(item2, p2);
+ let img = '';
+ try {
+ img = _pd(item2, p3);
+ } catch (e) {}
+ let desc = '';
+ try {
+ desc = _pdfh(item2, p4);
+ }catch (e) {}
+ let links = [];
+ for (let _p5 of p5.split('+')) {
+ let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
+ links.push(link);
+ }
+ let content;
+ if(p.length > 6 && p[6]){
+ content = _pdfh(item2, p6);
+ } else{
+ content = '';
+ }
+ let vid = links.join('$');
+ if(rule.二级==='*'){
+ vid = vid+'@@'+title+'@@'+img;
+ }
+ let vod = {
+ vod_name: title,
+ vod_pic: img,
+ vod_remarks: desc,
+ vod_content: content,
+ vod_id: vid
+ };
+ // print(vod);
+ d.push(vod);
+ } catch (e) {
+ console.log('首页列表双层定位处理发生错误:'+e.message);
+ }
+
+ }
+
+
+ }
+
+
+ } else {
+ let items = _pdfa(html, p0);
+ let p1 = getPP(p,1,pp,1);
+ let p2 = getPP(p,2,pp,2);
+ let p3 = getPP(p,3,pp,3);
+ let p4 = getPP(p,4,pp,4);
+ let p5 = getPP(p,5,pp,5);
+
+ for (let item of items) {
+ try {
+ let title = _pdfh(item, p1);
+ let img = '';
+ try {
+ img = _pd(item, p2, MY_URL);
+ } catch (e) {}
+ let desc = '';
+ try {
+ desc = _pdfh(item, p3);
+ }catch (e) {}
+ let links = [];
+ for (let _p5 of p4.split('+')) {
+ let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
+ links.push(link);
+ }
+ let content;
+ if(p.length > 5 && p[5]){
+ content = _pdfh(item, p5);
+ }else{
+ content = ''
+ }
+ let vid = links.join('$');
+ if(rule.二级==='*'){
+ vid = vid+'@@'+title+'@@'+img;
+ }
+ let vod = {
+ vod_name: title,
+ vod_pic: img,
+ vod_remarks: desc,
+ vod_content: content,
+ vod_id: vid
+ };
+ d.push(vod);
+
+ } catch (e) {
+ console.log('首页列表单层定位处理发生错误:'+e.message);
+ }
+
+ }
+
+ }
+
+ } catch (e) {
+
+ }
+ }
+ let t2 = (new Date()).getTime();
+ console.log('加载首页推荐耗时:'+(t2-t1)+'毫秒');
+ // console.log(JSON.stringify(d));
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ if(d.length>0){
+ print(d.slice(0,2));
+ }
+ return JSON.stringify({
+ list:d
+ })
+}
+
+/**
+ * 一级分类页数据解析
+ * @param cateObj
+ * @returns {string}
+ */
+function categoryParse(cateObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let p = cateObj.一级;
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ let d = [];
+ // let url = cateObj.url.replaceAll('fyclass', cateObj.tid).replaceAll('fypage', cateObj.pg);
+ let url = cateObj.url.replaceAll('fyclass', cateObj.tid);
+ if(cateObj.pg === 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[1].split(']')[0];
+ }else if(cateObj.pg > 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[0];
+ }
+ if(rule.filter_url){
+ if(!/fyfilter/.test(url)){
+ if(!url.endsWith('&')&&!rule.filter_url.startsWith('&')){
+ url+='&'
+ }
+ url+=rule.filter_url;
+ }else{
+ url = url.replace('fyfilter', rule.filter_url);
+ }
+ // console.log('filter:'+cateObj.filter);
+ let fl = cateObj.filter?cateObj.extend:{};
+ // 自动合并 不同分类对应的默认筛选
+ if(rule.filter_def && typeof(rule.filter_def)==='object'){
+ try {
+ if(Object.keys(rule.filter_def).length>0 && rule.filter_def.hasOwnProperty(cateObj.tid)){
+ let self_fl_def = rule.filter_def[cateObj.tid];
+ if(self_fl_def && typeof(self_fl_def)==='object'){
+ // 引用传递转值传递,避免污染self变量
+ let fl_def = JSON.parse(JSON.stringify(self_fl_def));
+ fl = Object.assign(fl_def,fl);
+ }
+ }
+ }catch (e) {
+ print('合并不同分类对应的默认筛选出错:'+e.message);
+ }
+ }
+ let new_url;
+ new_url = cheerio.jinja2(url,{fl:fl});
+ // console.log('jinjia2执行后的new_url类型为:'+typeof(new_url));
+ url = new_url;
+ }
+ if(/fypage/.test(url)){
+ if(url.includes('(')&&url.includes(')')){
+ let url_rep = url.match(/.*?\((.*)\)/)[1];
+ // console.log(url_rep);
+ let cnt_page = url_rep.replaceAll('fypage', cateObj.pg);
+ // console.log(cnt_page);
+ let cnt_pg = eval(cnt_page);
+ // console.log(cnt_pg);
+ url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
+ }else{
+ url = url.replaceAll('fypage',cateObj.pg);
+ }
+ }
+
+ MY_URL = url;
+ // setItem('MY_URL',MY_URL);
+ console.log(MY_URL);
+ p = p.trim();
+ const MY_CATE = cateObj.tid;
+ if(p.startsWith('js:')){
+ var MY_FL = cateObj.extend;
+ const TYPE = 'cate';
+ var input = MY_URL;
+ const MY_PAGE = cateObj.pg;
+ var desc = '';
+ eval(p.trim().replace('js:',''));
+ d = VODS;
+ }else {
+ p = p.split(';');
+ if (p.length < 5) {
+ return '{}'
+ }
+ let _ps = parseTags.getParse(p[0]);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p[0].startsWith('json:');
+ p[0] = p[0].replace(/^(jsp:|json:|jq:)/,'');
+ try {
+ let html = getHtml(MY_URL);
+ if (html) {
+ if(is_json){
+ html = dealJson(html);
+ }
+ let list = _pdfa(html, p[0]);
+ list.forEach(it => {
+ let links = p[4].split('+').map(p4=>{
+ return !rule.detailUrl?_pd(it, p4,MY_URL):_pdfh(it, p4);
+ });
+ let link = links.join('$');
+ let vod_id = rule.detailUrl?MY_CATE+'$'+link:link;
+
+ let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g,'').trim();
+ let vod_pic = _pd(it, p[2],MY_URL);
+
+ if(rule.二级==='*'){
+ vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
+ }
+ d.push({
+ 'vod_id': vod_id,
+ 'vod_name': vod_name,
+ 'vod_pic': vod_pic,
+ 'vod_remarks': _pdfh(it, p[3]).replace(/\n|\t/g,'').trim(),
+ });
+ });
+ }
+ } catch (e) {
+ console.log(e.message);
+ }
+ }
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ // print(d);
+ if(d.length>0){
+ print(d.slice(0,2));
+ }
+ let pagecount = 0;
+ if(rule.pagecount && typeof(rule.pagecount) === 'object' && rule.pagecount.hasOwnProperty(MY_CATE)){
+ print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
+ pagecount = parseInt(rule.pagecount[MY_CATE]);
+ }
+ let nodata = {
+ list:[{vod_name:'无数据,防无限请求',vod_id:'no_data',vod_remarks:'不要点,会崩的',vod_pic:'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'}],
+ total:1,pagecount:1,page:1,limit:1
+ };
+ let vod = d.length<1?JSON.stringify(nodata):JSON.stringify({
+ 'page': parseInt(cateObj.pg),
+ 'pagecount': pagecount||999,
+ 'limit': 20,
+ 'total': 999,
+ 'list': d,
+ });
+ // print(vod);
+ return vod
+}
+
+/**
+ * 搜索列表数据解析
+ * @param searchObj
+ * @returns {string}
+ */
+function searchParse(searchObj) {
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let d = [];
+ if(!searchObj.searchUrl){
+ return '{}'
+ }
+ let p = searchObj.搜索==='*'&&rule.一级 ? rule.一级 : searchObj.搜索;
+ if(!p||typeof(p)!=='string'){
+ return '{}'
+ }
+ p = p.trim();
+ let pp = rule.一级.split(';');
+ let url = searchObj.searchUrl.replaceAll('**', searchObj.wd);
+ if(searchObj.pg === 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[1].split(']')[0];
+ }else if(searchObj.pg > 1 && url.includes('[')&&url.includes(']')){
+ url = url.split('[')[0];
+ }
+
+ if(/fypage/.test(url)){
+ if(url.includes('(')&&url.includes(')')){
+ let url_rep = url.match(/.*?\((.*)\)/)[1];
+ // console.log(url_rep);
+ let cnt_page = url_rep.replaceAll('fypage', searchObj.pg);
+ // console.log(cnt_page);
+ let cnt_pg = eval(cnt_page);
+ // console.log(cnt_pg);
+ url = url.replaceAll(url_rep,cnt_pg).replaceAll('(','').replaceAll(')','');
+ }else{
+ url = url.replaceAll('fypage',searchObj.pg);
+ }
+ }
+
+ MY_URL = url;
+ console.log(MY_URL);
+ // log(searchObj.搜索);
+ // setItem('MY_URL',MY_URL);
+ if(p.startsWith('js:')){
+ const TYPE = 'search';
+ const MY_PAGE = searchObj.pg;
+ const KEY = searchObj.wd;
+ var input = MY_URL;
+ var detailUrl = rule.detailUrl||'';
+ eval(p.trim().replace('js:',''));
+ d = VODS;
+ }else{
+ p = p.split(';');
+ if (p.length < 5) {
+ return '{}'
+ }
+ let p0 = getPP(p,0,pp,0);
+ let _ps = parseTags.getParse(p0);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ let is_json = p0.startsWith('json:');
+ p0 = p0.replace(/^(jsp:|json:|jq:)/,'');
+ // print('1381 p0:'+p0);
+ try {
+ let req_method = MY_URL.split(';').length>1?MY_URL.split(';')[1].toLowerCase():'get';
+ let html;
+ if(req_method==='post'){
+ let rurls = MY_URL.split(';')[0].split('#')
+ let rurl = rurls[0]
+ let params = rurls.length > 1 ?rurls[1]:'';
+ print(`post=》rurl:${rurl},params:${params}`);
+ // let new_dict = {};
+ // let new_tmp = params.split('&');
+ // new_tmp.forEach(i=>{
+ // new_dict[i.split('=')[0]] = i.split('=')[1];
+ // });
+ // html = post(rurl,{body:new_dict});
+ let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let postData = {body:params};
+ Object.assign(_fetch_params,postData);
+ html = post(rurl,_fetch_params);
+ }else if(req_method==='postjson'){
+ let rurls = MY_URL.split(';')[0].split('#')
+ let rurl = rurls[0]
+ let params = rurls.length > 1 ?rurls[1]:'';
+ print(`postjson-》rurl:${rurl},params:${params}`);
+ try{
+ params = JSON.parse(params);
+ }catch (e) {
+ params = '{}'
+ }
+ let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let postData = {body:params};
+ Object.assign(_fetch_params,postData);
+ html = post(rurl,_fetch_params);
+ }else{
+ html = getHtml(MY_URL);
+ }
+ if (html) {
+ if(/系统安全验证|输入验证码/.test(html)){
+ let cookie = verifyCode(MY_URL);
+ if(cookie){
+ console.log(`本次成功过验证,cookie:${cookie}`);
+ setItem(RULE_CK,cookie);
+ }else{
+ console.log(`本次自动过搜索验证失败,cookie:${cookie}`);
+ }
+ // obj.headers['Cookie'] = cookie;
+ html = getHtml(MY_URL);
+ }
+ if(!html.includes(searchObj.wd)){
+ console.log('搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码');
+ console.log(html);
+ }
+ if(is_json){
+ // console.log(html);
+ html = dealJson(html);
+ // console.log(JSON.stringify(html));
+ }
+ // console.log(html);
+ let list = _pdfa(html, p0);
+ // print(list.length);
+ // print(list);
+ let p1 = getPP(p, 1, pp, 1);
+ let p2 = getPP(p, 2, pp, 2);
+ let p3 = getPP(p, 3, pp, 3);
+ let p4 = getPP(p, 4, pp, 4);
+ let p5 = getPP(p,5,pp,5);
+ list.forEach(it => {
+ let links = p4.split('+').map(_p4=>{
+ return !rule.detailUrl?_pd(it, _p4,MY_URL):_pdfh(it, _p4)
+ });
+ let link = links.join('$');
+ let content;
+ if(p.length > 5 && p[5]){
+ content = _pdfh(it, p5);
+ }else{
+ content = '';
+ }
+ let vod_id = link;
+ let vod_name = _pdfh(it, p1).replace(/\n|\t/g,'').trim();
+ let vod_pic = _pd(it, p2,MY_URL);
+ if(rule.二级==='*'){
+ vod_id = vod_id+'@@'+vod_name+'@@'+vod_pic;
+ }
+ let ob = {
+ 'vod_id': vod_id,
+ 'vod_name': vod_name,
+ 'vod_pic': vod_pic,
+ 'vod_remarks': _pdfh(it, p3).replace(/\n|\t/g,'').trim(),
+ 'vod_content': content.replace(/\n|\t/g,'').trim(),
+ };
+ d.push(ob);
+ });
+
+ }
+ } catch (e) {
+ print('搜索发生错误:'+e.message);
+ return '{}'
+ }
+ }
+ if(rule.图片来源){
+ d.forEach(it=>{
+ if(it.vod_pic&&it.vod_pic.startsWith('http')){
+ it.vod_pic = it.vod_pic + rule.图片来源;
+ }
+ });
+ }
+ // print(d);
+ return JSON.stringify({
+ 'page': parseInt(searchObj.pg),
+ 'pagecount': 10,
+ 'limit': 20,
+ 'total': 100,
+ 'list': d,
+ });
+}
+
+/**
+ * 二级详情页数据解析
+ * @param detailObj
+ * @returns {string}
+ */
+function detailParse(detailObj){
+ let t1 = (new Date()).getTime();
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ let orId = detailObj.orId;
+ let vod_name = '片名';
+ let vod_pic = '';
+ let vod_id = orId;
+ if(rule.二级==='*'){
+ // vod_id = orId.split('@@')[0]; // 千万不能分割
+ let extra = orId.split('@@');
+ vod_name = extra.length>1?extra[1]:vod_name;
+ vod_pic = extra.length>2?extra[2]:vod_pic;
+ }
+ // print(vod_pic);
+ let vod = {
+ vod_id: vod_id, //"id",
+ vod_name: vod_name,
+ vod_pic: vod_pic,
+ type_name: "类型",
+ vod_year: "年份",
+ vod_area: "地区",
+ vod_remarks: "更新信息",
+ vod_actor: "主演",
+ vod_director: "导演",
+ vod_content: "简介"
+ };
+ let p = detailObj.二级;
+ let url = detailObj.url;
+ let detailUrl = detailObj.detailUrl;
+ let fyclass = detailObj.fyclass;
+ let tab_exclude = detailObj.tab_exclude;
+ let html = detailObj.html||'';
+ MY_URL = url;
+ if(detailObj.二级访问前){
+ try {
+ print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
+ eval(detailObj.二级访问前.trim().replace('js:',''));
+ }catch (e) {
+ print(`二级访问前执行代码出现错误:${e.message}`)
+ }
+ }
+ // console.log(MY_URL);
+ // setItem('MY_URL',MY_URL);
+ if(p==='*'){
+ vod.vod_play_from = '道长在线';
+ vod.vod_remarks = detailUrl;
+ vod.vod_actor = '没有二级,只有一级链接直接嗅探播放';
+ vod.vod_content = MY_URL;
+ vod.vod_play_url = '嗅探播放$' + MY_URL.split('@@')[0];
+ }else if(typeof(p)==='string'&&p.trim().startsWith('js:')){
+ const TYPE = 'detail';
+ var input = MY_URL;
+ var play_url = '';
+ eval(p.trim().replace('js:',''));
+ vod = VOD;
+ console.log(JSON.stringify(vod));
+ }else if(p&&typeof(p)==='object'){
+ let tt1 = (new Date()).getTime();
+ if(!html){
+ html = getHtml(MY_URL);
+ }
+ print(`二级${MY_URL}仅获取源码耗时:${(new Date()).getTime()-tt1}毫秒`);
+ let _ps;
+ if(p.is_json){
+ print('二级是json');
+ _ps = parseTags.json;
+ html = dealJson(html);
+ }else if(p.is_jsp){
+ print('二级是jsp');
+ _ps = parseTags.jsp;
+ }else if(p.is_jq){
+ print('二级是jq');
+ _ps = parseTags.jq;
+ }else{
+ print('二级默认jq');
+ _ps = parseTags.jq;
+ // print('二级默认jsp');
+ // _ps = parseTags.jsp;
+ }
+ let tt2 = (new Date()).getTime();
+ print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
+ _pdfa = _ps.pdfa;
+ _pdfh = _ps.pdfh;
+ _pd = _ps.pd;
+ if(p.title){
+ let p1 = p.title.split(';');
+ 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;
+ }
+ if(p.desc){
+ try{
+ let p1 = p.desc.split(';');
+ vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g,'').trim();
+ vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g,'').trim():'';
+ vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g,'').trim():'';
+ // vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replaceAll('\n', ' ').trim():'';
+ vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g,'').trim():'';
+ vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g,'').trim():'';
+ }
+ catch (e) {
+
+ }
+ }
+ if(p.content){
+ try{
+ let p1 = p.content.split(';');
+ vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g,'').trim();
+ }
+ catch (e) {}
+ }
+ if(p.img){
+ try{
+ let p1 = p.img.split(';');
+ vod.vod_pic = _pd(html, p1[0],MY_URL);
+ }
+ catch (e) {}
+ }
+
+ let vod_play_from = '$$$';
+ let playFrom = [];
+ if(p.重定向&&p.重定向.startsWith('js:')){
+ print('开始执行重定向代码:'+p.重定向);
+ html = eval(p.重定向.replace('js:',''));
+ }
+
+// console.log(2);
+ if(p.tabs){
+ if(p.tabs.startsWith('js:')){
+ print('开始执行tabs代码:'+p.tabs);
+ var input = MY_URL;
+ eval(p.tabs.replace('js:',''));
+ playFrom = TABS;
+ }else{
+ let p_tab = p.tabs.split(';')[0];
+ // console.log(p_tab);
+ let vHeader = _pdfa(html, p_tab);
+ console.log(vHeader.length);
+ let tab_text = p.tab_text||'body&&Text';
+ // print('tab_text:'+tab_text);
+ let new_map = {};
+ for(let v of vHeader){
+ let v_title = _pdfh(v,tab_text).trim();
+ console.log(v_title);
+ if(tab_exclude&& (new RegExp(tab_exclude)).test(v_title)){
+ continue;
+ }
+ if(!new_map.hasOwnProperty(v_title)){
+ new_map[v_title] = 1;
+ }else{
+ new_map[v_title] += 1;
+ }
+ if(new_map[v_title]>1){
+ v_title+=Number(new_map[v_title]-1);
+ }
+ playFrom.push(v_title);
+ }
+ }
+ console.log(JSON.stringify(playFrom));
+ }else{
+ playFrom = ['道长在线']
+ }
+ vod.vod_play_from = playFrom.join(vod_play_from);
+
+// console.log(3);
+ let vod_play_url = '$$$';
+ let vod_tab_list = [];
+ if(p.lists){
+ if(p.lists.startsWith('js:')){
+ print('开始执行lists代码:'+p.lists);
+ try {
+ var input = MY_URL;
+ var play_url = '';
+ eval(p.lists.replace('js:',''));
+ for(let i in LISTS){
+ if(LISTS.hasOwnProperty(i)){
+ // print(i);
+ try {
+ LISTS[i] = LISTS[i].map(it=>it.split('$').slice(0,2).join('$'));
+ }catch (e) {
+ print('格式化LISTS发生错误:'+e.message);
+ }
+ }
+ }
+ vod_play_url = LISTS.map(it=>it.join('#')).join(vod_play_url);
+ }catch (e) {
+ print('js执行lists: 发生错误:'+e.message);
+ }
+
+ }else{
+ let list_text = p.list_text||'body&&Text';
+ let list_url = p.list_url||'a&&href';
+ // print('list_text:'+list_text);
+ // print('list_url:'+list_url);
+ // print('list_parse:'+p.lists);
+ let is_tab_js = p.tabs.trim().startsWith('js:');
+ for(let i=0;i 1 && !is_tab_js ? p.tabs.split(';')[1] : '';
+ let p1 = p.lists.replaceAll('#idv', tab_name).replaceAll('#id', i);
+ tab_ext = tab_ext.replaceAll('#idv', tab_name).replaceAll('#id', i);
+ let tabName = tab_ext?_pdfh(html, tab_ext):tab_name;
+ console.log(tabName);
+ // print('tab_ext:'+tab_ext);
+ let new_vod_list = [];
+ let tt1 = (new Date()).getTime();
+ // print('pdfl:'+typeof (pdfl));
+ if(typeof (pdfl) ==='function'){
+ new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL);
+ }else {
+ let vodList = [];
+ try {
+ vodList = _pdfa(html, p1);
+ console.log('len(vodList):'+vodList.length);
+ }catch (e) {
+ // console.log(e.message);
+ }
+ for (let i = 0; i < vodList.length; i++) {
+ let it = vodList[i];
+ new_vod_list.push(_pdfh(it, list_text).trim() + '$' + _pd(it, list_url, MY_URL));
+ }
+ }
+ if(new_vod_list.length>0){
+ new_vod_list = forceOrder(new_vod_list,'',x=>x.split('$')[0]);
+ console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date()).getTime()-tt1}毫秒`);
+ }
+ // print(new_vod_list);
+ let vlist = new_vod_list.join('#');
+ vod_tab_list.push(vlist);
+ }
+ vod_play_url = vod_tab_list.join(vod_play_url);
+ }
+ }
+ vod.vod_play_url = vod_play_url;
+ }
+ if(rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith('http')){
+ vod.vod_pic = vod.vod_pic + rule.图片来源;
+ }
+ if(!vod.vod_id||(vod_id.includes('$')&&vod.vod_id!==vod_id)){
+ vod.vod_id = vod_id;
+ }
+ let t2 = (new Date()).getTime();
+ console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
+ // print(vod);
+ vod = vodDeal(vod);
+ // print(vod);
+ return JSON.stringify({
+ list: [vod]
+ })
+}
+
+/**
+ * 获取二级待返回的播放线路没处理时的索引关系
+ * @param vod
+ * @returns {{}}
+ */
+function get_tab_index(vod){
+ let obj = {};
+ vod.vod_play_from.split('$$$').forEach((it,index)=>{
+ obj[it] = index;
+ });
+ return obj
+}
+
+/**
+ * 处理待返回的vod数据|线路去除,排序,重命名
+ * @param vod
+ * @returns {*}
+ */
+function vodDeal(vod){
+ let vod_play_from = vod.vod_play_from.split('$$$');
+ let vod_play_url = vod.vod_play_url.split('$$$');
+
+ // 移除指定线路后的列表
+ 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;
+ // 选集列表根据线路排序
+ 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);
+
+ if(rule.tab_remove&&rule.tab_remove.length>0){
+ tab_removed_list = vod_play_from.filter(it=>!rule.tab_remove.includes(it));
+ tab_list = tab_removed_list;
+ }
+
+ if(rule.tab_order&&rule.tab_order.length>0){
+ let tab_order = rule.tab_order;
+ 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))
+ });
+ tab_list = tab_ordered_list;
+ }
+ play_ordered_list = tab_list.map(it=>vod_play_url[tab_index_dict[it]]);
+ }
+
+ if(rule.tab_rename&&typeof(rule.tab_rename)==='object'&Object.keys(rule.tab_rename).length>0){
+ tab_renamed_list = tab_list.map(it=>rule.tab_rename[it]||it);
+ tab_list = tab_renamed_list;
+ }
+ vod.vod_play_from = tab_list.join('$$$');
+ vod.vod_play_url = play_ordered_list.join('$$$');
+ return vod
+}
+
+/**
+ * 判断是否需要解析
+ * @param url
+ * @returns {number|number}
+ */
+function tellIsJx(url){
+ try {
+ let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split('?')[0]) && 是否正版(url);
+ return is_vip?1:0
+ }catch (e) {
+ return 1
+ }
+}
+/**
+ * 选集播放点击事件解析
+ * @param playObj
+ * @returns {string}
+ */
+function playParse(playObj){
+ fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
+ MY_URL = playObj.url;
+ if(!/http/.test(MY_URL)){
+ try {
+ MY_URL = base64Decode(MY_URL);
+ }catch (e) {}
+ }
+ MY_URL = decodeURIComponent(MY_URL);
+ var input = MY_URL;//注入给免嗅js
+ let common_play = {
+ parse:1,
+ url:input,
+ // url:urlencode(input),
+ jx:tellIsJx(input)
+ };
+ let lazy_play;
+ if(!rule.play_parse||!rule.lazy){
+ lazy_play = common_play;
+ }else if(rule.play_parse&&rule.lazy&&typeof(rule.lazy)==='string'){
+ try {
+ let lazy_code = rule.lazy.replace('js:','').trim();
+ print('开始执行js免嗅=>'+lazy_code);
+ eval(lazy_code);
+ lazy_play = typeof(input) === 'object'?input:{
+ parse:1,
+ jx:tellIsJx(input),
+ url:input
+ };
+ }catch (e) {
+ print('js免嗅错误:'+e.message);
+ lazy_play = common_play;
+ }
+ }else{
+ lazy_play = common_play;
+ }
+ // print('play_json:'+typeof(rule.play_json));
+ // console.log(Array.isArray(rule.play_json));
+ if(Array.isArray(rule.play_json) && rule.play_json.length >0){ // 数组情况判断长度大于0
+ let web_url = lazy_play.url;
+ for(let pjson of rule.play_json){
+ if(pjson.re && (pjson.re==='*'||web_url.match(new RegExp(pjson.re)))){
+ if(pjson.json && typeof(pjson.json)==='object'){
+ let base_json = pjson.json;
+ // print('开始合并:');
+ // print(base_json);
+ lazy_play = Object.assign(lazy_play,base_json);
+ break;
+ }
+ }
+ }
+ }else if(rule.play_json && !Array.isArray(rule.play_json)){ // 其他情况 非[] 判断true/false
+ let base_json = {
+ jx:1,
+ parse:1,
+ };
+ lazy_play = Object.assign(lazy_play,base_json);
+ }else if(!rule.play_json){ // 不解析传0
+ let base_json = {
+ jx:0,
+ parse:1,
+ };
+ lazy_play = Object.assign(lazy_play,base_json);
+ }
+ console.log(JSON.stringify(lazy_play));
+ return JSON.stringify(lazy_play);
+}
+
+/**
+ * 本地代理解析规则
+ * @param params
+ */
+function proxyParse(proxyObj){
+ var input = proxyObj.params;
+ if(proxyObj.proxy_rule){
+ log('准备执行本地代理规则:\n'+proxyObj.proxy_rule);
+ try {
+ eval(proxyObj.proxy_rule);
+ if(input && input!== proxyObj.params && Array.isArray(input) &&input.length===3){
+ return input
+ }else{
+ return [404,'text/plain','Not Found']
+ }
+ }catch (e) {
+ return [500,'text/plain','代理规则错误:'+e.message]
+ }
+
+ }else{
+ return [404,'text/plain','Not Found']
+ }
+}
+
+/**
+ * 辅助嗅探解析规则
+ * @param isVideoObj
+ * @returns {boolean}
+ */
+function isVideoParse(isVideoObj){
+ var input = isVideoObj.url;
+ if(!isVideoObj.t){ // t为假代表默认传的正则字符串
+ let re_matcher = new RegExp(isVideoObj.isVideo,'i'); // /g匹配多个,/i不区分大小写,/m匹配多行
+ return re_matcher.test(input);
+ }else{
+ // 执行js
+ try {
+ eval(isVideoObj.isVideo);
+ if(typeof(input)==='boolean'){
+ return input
+ }else{
+ return false
+ }
+ }catch (e) {
+ log('执行嗅探规则发生错误:'+e.message);
+ return false
+ }
+ }
+}
+
+/**
+ * js源预处理特定返回对象中的函数
+ * @param ext
+ */
+function init(ext) {
+ console.log('init');
+ try {
+ // make shared jsContext happy muban不能import,不然会造成换源继承后变量被篡改
+ // if (typeof (globalThis.mubanJs) === 'undefined') {
+ // let mubanJs = request('https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/js/模板.js', { 'User-Agent': MOBILE_UA });
+ // mubanJs = mubanJs.replace('export default', '(function() {return muban;}()) // export default');
+ // // console.log(mubanJs);
+ // globalThis.mubanJs = mubanJs;
+ // }
+ // let muban = eval(globalThis.mubanJs);
+
+ let muban = 模板.getMubans();
+ // print(typeof (muban));
+ // print(muban);
+ if (typeof ext == 'object'){
+ rule = ext;
+ } else if (typeof ext == 'string') {
+ if (ext.startsWith('http')) {
+ let js = request(ext,{'method':'GET'});
+ if (js){
+ eval(js.replace('var rule', 'rule'));
+ }
+ } else {
+ eval(ext.replace('var rule', 'rule'));
+ }
+ }
+ if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
+ print('继承模板:'+rule.模板);
+ rule = Object.assign(muban[rule.模板], rule);
+ }
+ /** 处理一下 rule规则关键字段没传递的情况 **/
+ let rule_cate_excludes = (rule.cate_exclude||'').split('|').filter(it=>it.trim());
+ let rule_tab_excludes = (rule.tab_exclude||'').split('|').filter(it=>it.trim());
+ 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('|');
+ rule.tab_exclude = rule_tab_excludes.join('|');
+ rule.host = (rule.host||'').rstrip('/');
+ HOST = rule.host;
+ if(rule.hostJs){
+ console.log(`检测到hostJs,准备执行...`);
+ try {
+ eval(rule.hostJs);
+ rule.host = HOST.rstrip('/');
+ }catch (e) {
+ console.log(`执行${rule.hostJs}获取host发生错误:`+e.message);
+ }
+ }
+ rule.url = rule.url||'';
+ rule.double = rule.double||false;
+ rule.homeUrl = rule.homeUrl||'';
+ rule.detailUrl = rule.detailUrl||'';
+ rule.searchUrl = rule.searchUrl||'';
+ rule.homeUrl = rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):(rule.homeUrl||rule.host);
+ rule.detailUrl = rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;
+ rule.二级访问前 = rule.二级访问前||'';
+ if(rule.url.includes('[')&&rule.url.includes(']')){
+ let u1 = rule.url.split('[')[0]
+ let u2 = rule.url.split('[')[1].split(']')[0]
+ rule.url = rule.host && rule.url?urljoin(rule.host,u1)+'['+urljoin(rule.host,u2)+']':rule.url;
+ }else{
+ rule.url = rule.host && rule.url ? urljoin(rule.host,rule.url) : rule.url;
+ }
+ if(rule.searchUrl.includes('[')&&rule.searchUrl.includes(']')){
+ let u1 = rule.searchUrl.split('[')[0]
+ 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{
+ rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host,rule.searchUrl) : rule.searchUrl;
+ }
+
+ rule.timeout = rule.timeout||5000;
+ rule.encoding = rule.编码||rule.encoding||'utf-8';
+ rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
+ rule.图片来源 = rule.图片来源||'';
+ rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
+ rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
+ rule.proxy_rule = rule.hasOwnProperty('proxy_rule')?rule.proxy_rule:'';
+ rule.sniffer = rule.hasOwnProperty('sniffer')?rule.sniffer:'';
+ rule.sniffer = !!(rule.sniffer && rule.sniffer!=='0' && rule.sniffer!=='false');
+
+ rule.isVideo = rule.hasOwnProperty('isVideo')?rule.isVideo:'';
+
+ rule.tab_remove = rule.hasOwnProperty('tab_remove')?rule.tab_remove:[];
+ rule.tab_order = rule.hasOwnProperty('tab_order')?rule.tab_order:[];
+ rule.tab_rename = rule.hasOwnProperty('tab_rename')?rule.tab_rename:{};
+
+ if(rule.headers && typeof(rule.headers) === 'object'){
+ try {
+ let header_keys = Object.keys(rule.headers);
+ for(let k of header_keys){
+ if(k.toLowerCase() === 'user-agent'){
+ let v = rule.headers[k];
+ console.log(v);
+ if(['MOBILE_UA','PC_UA','UC_UA','IOS_UA','UA'].includes(v)){
+ rule.headers[k] = eval(v);
+ }
+ }else if(k.toLowerCase() === 'cookie'){
+ let v = rule.headers[k];
+ if(v && v.startsWith('http')){
+ console.log(v);
+ try {
+ v = fetch(v);
+ console.log(v);
+ rule.headers[k] = v;
+ }catch (e) {
+ console.log(`从${v}获取cookie发生错误:`+e.message);
+ }
+ }
+ }
+ }
+ }catch (e) {
+ console.log('处理headers发生错误:'+e.message);
+ }
+ }
+ // print(rule.headers);
+ rule_fetch_params = {'headers': rule.headers||false, 'timeout': rule.timeout, 'encoding': rule.encoding};
+ oheaders = rule.headers||{};
+ RKEY = typeof(key)!=='undefined'&&key?key:'drpy_' + (rule.title || rule.host);
+ pre(); // 预处理
+ init_test();
+ }catch (e) {
+ console.log('init_test发生错误:'+e.message);
+ }
+}
+
+let homeHtmlCache = undefined;
+
+/**
+ * js源获取首页分类和筛选特定返回对象中的函数
+ * @param filter 筛选条件字典对象
+ * @returns {string}
+ */
+function home(filter) {
+ console.log("home");
+ let homeObj = {
+ filter:rule.filter||false,
+ MY_URL: rule.homeUrl,
+ class_name: rule.class_name || '',
+ class_url: rule.class_url || '',
+ class_parse: rule.class_parse || '',
+ cate_exclude: rule.cate_exclude,
+ };
+ return homeParse(homeObj);
+}
+
+/**
+ * js源获取首页推荐数据列表特定返回对象中的函数
+ * @param params
+ * @returns {string}
+ */
+function homeVod(params) {
+ console.log("homeVod");
+ let homeVodObj = {
+ 推荐:rule.推荐,
+ double:rule.double,
+ homeUrl:rule.homeUrl,
+ detailUrl:rule.detailUrl
+ };
+ return homeVodParse(homeVodObj)
+ // return "{}";
+}
+
+/**
+ * js源获取分类页一级数据列表特定返回对象中的函数
+ * @param tid 分类id
+ * @param pg 页数
+ * @param filter 当前选中的筛选条件
+ * @param extend 扩展
+ * @returns {string}
+ */
+function category(tid, pg, filter, extend) {
+ let cateObj = {
+ url: rule.url,
+ 一级: rule.一级,
+ tid: tid,
+ pg: parseInt(pg),
+ filter: filter,
+ extend: extend
+ };
+ // console.log(JSON.stringify(extend));
+ return categoryParse(cateObj)
+}
+
+/**
+ * js源获取二级详情页数据特定返回对象中的函数
+ * @param vod_url 一级列表中的vod_id或者是带分类的自拼接 vod_id 如 fyclass$vod_id
+ * @returns {string}
+ */
+function detail(vod_url) {
+ let orId = vod_url;
+ let fyclass = '';
+ log('orId:'+orId);
+ if(vod_url.indexOf('$')>-1){
+ let tmp = vod_url.split('$');
+ fyclass = tmp[0];
+ vod_url = tmp[1];
+ }
+ let detailUrl = vod_url.split('@@')[0];
+ let url;
+ if(!detailUrl.startsWith('http')&&!detailUrl.includes('/')){
+ url = rule.detailUrl.replaceAll('fyid', detailUrl).replaceAll('fyclass',fyclass);
+ }else if(detailUrl.includes('/')){
+ url = urljoin(rule.homeUrl,detailUrl);
+ }else{
+ url = detailUrl
+ }
+ let detailObj = {
+ orId: orId,
+ url:url,
+ 二级:rule.二级,
+ 二级访问前:rule.二级访问前,
+ detailUrl:detailUrl,
+ fyclass:fyclass,
+ tab_exclude:rule.tab_exclude,
+ }
+ return detailParse(detailObj)
+}
+
+/**
+ * js源选集按钮播放点击事件特定返回对象中的函数
+ * @param flag 线路名
+ * @param id 播放按钮的链接
+ * @param flags 全局配置的flags是否需要解析的标识列表
+ * @returns {string}
+ */
+function play(flag, id, flags) {
+ let playObj = {
+ url:id,
+ flag:flag,
+ flags:flags
+ }
+ return playParse(playObj);
+}
+
+/**
+ * js源搜索返回的数据列表特定返回对象中的函数
+ * @param wd 搜索关键字
+ * @param quick 是否来自快速搜索
+ * @returns {string}
+ */
+function search(wd, quick, pg) {
+ if(rule.search_encoding){
+ if(rule.search_encoding.toLowerCase()!=='utf-8'){
+ // 按搜索编码进行编码
+ wd = encodeStr(wd,rule.search_encoding);
+ }
+ }else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
+ // 按全局编码进行编码
+ wd = encodeStr(wd,rule.encoding);
+ }
+ let searchObj = {
+ searchUrl: rule.searchUrl,
+ 搜索: rule.搜索,
+ wd: wd,
+ //pg: pg,
+ pg: pg||1,
+ quick: quick,
+ };
+ // console.log(JSON.stringify(searchObj));
+ return searchParse(searchObj)
+}
+
+/**
+ * js源本地代理返回的数据列表特定返回对象中的函数
+ * @param params 代理链接参数比如 /proxy?do=js&url=https://wwww.baidu.com => params就是 {do:'js','url':'https://wwww.baidu.com'}
+ * @returns {*}
+ */
+function proxy(params){
+ if(rule.proxy_rule&&rule.proxy_rule.trim()){
+ rule.proxy_rule = rule.proxy_rule.trim();
+ }
+ if(rule.proxy_rule.startsWith('js:')){
+ rule.proxy_rule = rule.proxy_rule.replace('js:','');
+ }
+ let proxyObj = {
+ params:params,
+ proxy_rule:rule.proxy_rule
+ };
+ return proxyParse(proxyObj)
+}
+
+
+/**
+ * 是否启用辅助嗅探功能,启用后可以根据isVideo函数进行手动识别为视频的链接地址。默认为false
+ * @returns {*|boolean|boolean}
+ */
+function sniffer(){
+ let enable_sniffer = rule.sniffer || false;
+ if(enable_sniffer){
+ // log('准备执行辅助嗅探代理规则:\n'+rule.isVideo);
+ log('开始执行辅助嗅探代理规则...');
+ }
+ return enable_sniffer
+}
+
+/**
+ * 启用辅助嗅探功能后根据次函数返回的值识别地址是否为视频,返回true/false
+ * @param url
+ */
+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 DRPY(){//导出函数
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ proxy:proxy,
+ sniffer:sniffer,
+ isVideo:isVideo
+ }
+}
+
+/**
+ * 导出函数无法简写成下面的形式:
+
+ export default {
+ ...DRPY,
+ DRPY
+ }
+
+ */
+
+// 导出函数对象
+export default {
+ init,
+ home,
+ homeVod,
+ category,
+ detail,
+ play,
+ search,
+ proxy,
+ sniffer,
+ isVideo,
+ DRPY,
+}
\ No newline at end of file
diff --git a/lib/drpy2.min.js b/lib/drpy2.min.js
index 4126ae7c..1f3becaa 100644
--- a/lib/drpy2.min.js
+++ b/lib/drpy2.min.js
@@ -1 +1 @@
-import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"../js/模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.48beta8 20231004";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";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 UA="Mozilla/5.0";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";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;const URLJOIN_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cntit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",searchObj.pg)}}MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");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}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""))}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");let tab_removed_list=vod_play_from;let tab_ordered_list=vod_play_from;let tab_renamed_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);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it))}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;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))});play_ordered_list=tab_ordered_list.map(it=>vod_play_url[tab_index_dict[it]])}}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_ordered_list.map(it=>rule.tab_rename[it]||it)}vod.vod_play_from=tab_renamed_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return vod}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());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("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")){let u1=rule.searchUrl.split("[")[0];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{rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl}rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}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 DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
\ No newline at end of file
+import cheerio from"assets://js/lib/cheerio.min.js";import"assets://js/lib/crypto-js.js";import 模板 from"../js/模板.js";import{gbkTool}from"./gbk.js";function init_test(){console.log("init_test_start");console.log("当前版本号:"+VERSION);console.log(RKEY);console.log(JSON.stringify(rule));console.log("init_test_end")}function pre(){if(typeof rule.预处理==="string"&&rule.预处理&&rule.预处理.trim()){let code=rule.预处理.trim();console.log("执行预处理代码:"+code);if(code.startsWith("js:")){code=code.replace("js:","")}try{eval(code)}catch(e){console.log("预处理执行失败:"+e.message)}}}let rule={};let vercode=typeof pdfl==="function"?"drpy2.1":"drpy2";const VERSION=vercode+" 3.9.48beta16 20231011";const MOBILE_UA="Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36";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 UA="Mozilla/5.0";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";const RULE_CK="cookie";const CATE_EXCLUDE="首页|留言|APP|下载|资讯|新闻|动态";const TAB_EXCLUDE="猜你|喜欢|下载|剧情|热播";const OCR_RETRY=3;const OCR_API="http://drpy.nokia.press:8028/ocr/drpy/text";if(typeof MY_URL==="undefined"){var MY_URL}var HOST;var RKEY;var fetch;var print;var log;var rule_fetch_params;var fetch_params;var oheaders;var _pdfh;var _pdfa;var _pd;const DOM_CHECK_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SPECIAL_URL=/^(ftp|magnet|thunder|ws):/;const NOADD_INDEX=/:eq|:lt|:gt|:first|:last|^body$|^#/;const URLJOIN_ATTR=/(url|src|href|-original|-src|-play|-url|style)$/;const SELECT_REGEX=/:eq|:lt|:gt|#/g;const SELECT_REGEX_A=/:eq|:lt|:gt/g;if(typeof Object.assign!="function"){Object.assign=function(){var target=arguments[0];for(var i=1;ithis.length){return false}else{return this.indexOf(search,start)!==-1}}}if(!Array.prototype.includes){Object.defineProperty(Array.prototype,"includes",{value:function(searchElement,fromIndex){if(this==null){throw new TypeError('"this" is null or not defined')}var o=Object(this);var len=o.length>>>0;if(len===0){return false}var n=fromIndex|0;var k=Math.max(n>=0?n:len-Math.abs(n),0);while(k=end){return lists}let first=lists[start];let second=lists[end];if(key){try{first=first[key];second=second[key]}catch(e){}}if(option&&typeof option==="function"){try{first=option(first);second=option(second)}catch(e){}}first+="";second+="";if(first.match(/(\d+)/)&&second.match(/(\d+)/)){let num1=Number(first.match(/(\d+)/)[1]);let num2=Number(second.match(/(\d+)/)[1]);if(num1>num2){lists.reverse()}}return lists}let VODS=[];let VOD={};let TABS=[];let LISTS=[];globalThis.encodeUrl=urlencode;globalThis.urlencode=urlencode;function urljoin(fromPath,nowPath){fromPath=fromPath||"";nowPath=nowPath||"";return joinUrl(fromPath,nowPath)}var urljoin2=urljoin;const defaultParser={pdfh:pdfh,pdfa:pdfa,pd:pd};function pdfh2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}let result=defaultParser.pdfh(html2,parse);let option=parse.includes("&&")?parse.split("&&").slice(-1)[0]:parse.split(" ").slice(-1)[0];if(/style/.test(option.toLowerCase())&&/url\(/.test(result)){try{result=result.match(/url\((.*?)\)/)[1];result=result.replace(/^['|"](.*)['|"]$/,"$1")}catch(e){}}return result}function pdfa2(html,parse){let html2=html;try{if(typeof html!=="string"){html2=html.rr(html.ele).toString()}}catch(e){print("html对象转文本发生了错误:"+e.message)}return defaultParser.pdfa(html2,parse)}function pd2(html,parse,uri){let ret=pdfh2(html,parse);if(typeof uri==="undefined"||!uri){uri=""}if(DOM_CHECK_ATTR.test(parse)&&!SPECIAL_URL.test(ret)){if(/http/.test(ret)){ret=ret.substr(ret.indexOf("http"))}else{ret=urljoin(MY_URL,ret)}}return ret}const parseTags={jsp:{pdfh:pdfh2,pdfa:pdfa2,pd:pd2},json:{pdfh(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}parse=parse.split("||");for(let ps of parse){let ret=cheerio.jp(ps,html);if(Array.isArray(ret)){ret=ret[0]||""}else{ret=ret||""}if(ret&&typeof ret!=="string"){ret=ret.toString()}if(ret){return ret}}return""},pdfa(html,parse){if(!parse||!parse.trim()){return""}if(typeof html==="string"){html=JSON.parse(html)}parse=parse.trim();if(!parse.startsWith("$.")){parse="$."+parse}let ret=cheerio.jp(parse,html);if(Array.isArray(ret)&&Array.isArray(ret[0])&&ret.length===1){return ret[0]||[]}return ret||[]},pd(html,parse){let ret=parseTags.json.pdfh(html,parse);if(ret){return urljoin(MY_URL,ret)}return ret}},jq:{pdfh(html,parse){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();let result=defaultParser.pdfh(html,parse);return result},pdfa(html,parse){if(!html||!parse||!parse.trim()){return[]}parse=parse.trim();let result=defaultParser.pdfa(html,parse);print(`pdfa解析${parse}=>${result.length}`);return result},pd(html,parse,base_url){if(!html||!parse||!parse.trim()){return""}parse=parse.trim();base_url=base_url||MY_URL;return defaultParser.pd(html,parse,base_url)}},getParse(p0){if(p0.startsWith("jsp:")){return this.jsp}else if(p0.startsWith("json:")){return this.json}else if(p0.startsWith("jq:")){return this.jq}else{return this.jq}}};const stringify=JSON.stringify;const jsp=parseTags.jsp;const jq=parseTags.jq;function readFile(filePath){filePath=filePath||"./uri.min.js";var fd=os.open(filePath);var buffer=new ArrayBuffer(1024);var len=os.read(fd,buffer,0,1024);console.log(len);let text=String.fromCharCode.apply(null,new Uint8Array(buffer));console.log(text);return text}function dealJson(html){try{html=html.trim();if(!(html.startsWith("{")&&html.endsWith("}")||html.startsWith("[")&&html.endsWith("]"))){html="{"+html.match(/.*?\{(.*)\}/m)[1]+"}"}}catch(e){}try{html=JSON.parse(html)}catch(e){}return html}var OcrApi={api:OCR_API,classification:function(img){let code="";try{log("通过drpy_ocr验证码接口过验证...");let html=request(OCR_API,{data:{img:img},headers:{"User-Agent":PC_UA},method:"POST"},true);code=html||""}catch(e){log(`OCR识别验证码发生错误:${e.message}`)}return code}};function verifyCode(url){let cnt=0;let host=getHome(url);let cookie="";while(cntit.toLowerCase()==="set-cookie");cookie=setCk?json[setCk].split(";")[0]:""}console.log("cookie:"+cookie);let img=json.body;let code=OcrApi.classification(img);console.log(`第${cnt+1}次验证码识别结果:${code}`);let submit_url=`${host}/index.php/ajax/verify_check?type=search&verify=${code}`;console.log(submit_url);let html=request(submit_url,{headers:{Cookie:cookie,"User-Agent":MOBILE_UA},method:"POST"});html=JSON.parse(html);if(html.msg==="ok"){console.log(`第${cnt+1}次验证码提交成功`);return cookie}else if(html.msg!=="ok"&&cnt+1>=OCR_RETRY){cookie=""}}catch(e){console.log(`第${cnt+1}次验证码提交失败:${e.message}`);if(cnt+1>=OCR_RETRY){cookie=""}}cnt+=1}return cookie}function setItem(k,v){local.set(RKEY,k,v);console.log(`规则${RKEY}设置${k} => ${v}`)}function getItem(k,v){return local.get(RKEY,k)||v}function clearItem(k){local.delete(RKEY,k)}function getHome(url){if(!url){return""}let tmp=url.split("//");url=tmp[0]+"//"+tmp[1].split("/")[0];try{url=decodeURIComponent(url)}catch(e){}return url}function buildUrl(url,obj){obj=obj||{};if(url.indexOf("?")<0){url+="?"}let param_list=[];let keys=Object.keys(obj);keys.forEach(it=>{param_list.push(it+"="+obj[it])});let prs=param_list.join("&");if(keys.length>0&&!url.endsWith("?")){url+="&"}url+=prs;return url}function require(url){eval(request(url))}function request(url,obj,ocr_flag){ocr_flag=ocr_flag||false;if(typeof obj==="undefined"||!obj||obj==={}){if(!fetch_params||!fetch_params.headers){let headers={"User-Agent":MOBILE_UA};if(rule.headers){Object.assign(headers,rule.headers)}if(!fetch_params){fetch_params={}}fetch_params.headers=headers}if(!fetch_params.headers.Referer){fetch_params.headers.Referer=getHome(url)}obj=fetch_params}else{let headers=obj.headers||{};let keys=Object.keys(headers).map(it=>it.toLowerCase());if(!keys.includes("user-agent")){headers["User-Agent"]=MOBILE_UA}if(!keys.includes("referer")){headers["Referer"]=getHome(url)}obj.headers=headers}if(rule.encoding&&rule.encoding!=="utf-8"&&!ocr_flag){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="text/html; charset="+rule.encoding}}if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="string"){if(!obj.headers.hasOwnProperty("Content-Type")&&!obj.headers.hasOwnProperty("content-type")){obj.headers["Content-Type"]="application/x-www-form-urlencoded; charset="+rule.encoding}}else if(typeof obj.body!="undefined"&&obj.body&&typeof obj.body==="object"){obj.data=obj.body;delete obj.body}if(!url){return obj.withHeaders?"{}":""}if(obj.toBase64){obj.buffer=2;delete obj.toBase64}console.log(JSON.stringify(obj.headers));console.log("request:"+url+`|method:${obj.method||"GET"}|body:${obj.body||""}`);let res=req(url,obj);let html=res.content||"";if(obj.withHeaders){let htmlWithHeaders=res.headers;htmlWithHeaders.body=html;return JSON.stringify(htmlWithHeaders)}else{return html}}function post(url,obj){obj.method="POST";return request(url,obj)}fetch=request;print=function(data){data=data||"";if(typeof data=="object"&&Object.keys(data).length>0){try{data=JSON.stringify(data);console.log(data)}catch(e){console.log(typeof data+":"+data.length);return}}else if(typeof data=="object"&&Object.keys(data).length<1){console.log("null object")}else{console.log(data)}};log=print;function checkHtml(html,url,obj){if(/\?btwaf=/.test(html)){let btwaf=html.match(/btwaf(.*?)"/)[1];url=url.split("#")[0]+"?btwaf"+btwaf;print("宝塔验证访问链接:"+url);html=request(url,obj)}return html}function getCode(url,obj){let html=request(url,obj);html=checkHtml(html,url,obj);return html}function getHtml(url){let obj={};if(rule.headers){obj.headers=rule.headers}let cookie=getItem(RULE_CK,"");if(cookie){if(obj.headers&&!Object.keys(obj.headers).map(it=>it.toLowerCase()).includes("cookie")){log("历史无cookie,新增过验证后的cookie");obj.headers["Cookie"]=cookie}else if(obj.headers&&obj.headers.cookie&&obj.headers.cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有小写过期的cookie,更新过验证后的cookie")}else if(obj.headers&&obj.headers.Cookie&&obj.headers.Cookie!==cookie){obj.headers["Cookie"]=cookie;log("历史有大写过期的cookie,更新过验证后的cookie")}else if(!obj.headers){obj.headers={Cookie:cookie};log("历史无headers,更新过验证后的含cookie的headers")}}let html=getCode(url,obj);return html}function homeParse(homeObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let classes=[];if(homeObj.class_name&&homeObj.class_url){let names=homeObj.class_name.split("&");let urls=homeObj.class_url.split("&");let cnt=Math.min(names.length,urls.length);for(let i=0;i=3){try{let html=getHtml(homeObj.MY_URL);if(html){homeHtmlCache=html;let list=_pdfa(html,p[0]);if(list&&list.length>0){list.forEach((it,idex)=>{try{let name=_pdfh(it,p[1]);if(homeObj.cate_exclude&&new RegExp(homeObj.cate_exclude).test(name)){return}let url=_pd(it,p[2]);if(p.length>3&&p[3]){let exp=new RegExp(p[3]);url=url.match(exp)[1]}classes.push({type_id:url.trim(),type_name:name.trim()})}catch(e){console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)}})}}}catch(e){console.log(e.message)}}}classes=classes.filter(it=>!homeObj.cate_exclude||!new RegExp(homeObj.cate_exclude).test(it.type_name));let resp={class:classes};if(homeObj.filter){resp.filters=homeObj.filter}console.log(JSON.stringify(resp));return JSON.stringify(resp)}function getPP(p,pn,pp,ppn){try{let ps=p[pn]==="*"&&pp.length>ppn?pp[ppn]:p[pn];return ps}catch(e){return""}}function homeVodParse(homeVodObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];MY_URL=homeVodObj.homeUrl;console.log(MY_URL);let t1=(new Date).getTime();let p=homeVodObj.推荐;print("p:"+p);if(p==="*"&&rule.一级){p=rule.一级;homeVodObj.double=false}if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");if(p.startsWith("js:")){const TYPE="home";var input=MY_URL;HOST=rule.host;eval(p.replace("js:",""));d=VODS}else{p=p.split(";");if(!homeVodObj.double&&p.length<5){return"{}"}else if(homeVodObj.double&&p.length<6){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");let html=homeHtmlCache||getHtml(MY_URL);homeHtmlCache=undefined;if(is_json){html=dealJson(html)}try{console.log("double:"+homeVodObj.double);if(homeVodObj.double){let items=_pdfa(html,p0);let p1=getPP(p,1,pp,0);let p2=getPP(p,2,pp,1);let p3=getPP(p,3,pp,2);let p4=getPP(p,4,pp,3);let p5=getPP(p,5,pp,4);let p6=getPP(p,6,pp,5);for(let item of items){let items2=_pdfa(item,p1);for(let item2 of items2){try{let title=_pdfh(item2,p2);let img="";try{img=_pd(item2,p3)}catch(e){}let desc="";try{desc=_pdfh(item2,p4)}catch(e){}let links=[];for(let _p5 of p5.split("+")){let link=!homeVodObj.detailUrl?_pd(item2,_p5,MY_URL):_pdfh(item2,_p5);links.push(link)}let content;if(p.length>6&&p[6]){content=_pdfh(item2,p6)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表双层定位处理发生错误:"+e.message)}}}}else{let items=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);for(let item of items){try{let title=_pdfh(item,p1);let img="";try{img=_pd(item,p2,MY_URL)}catch(e){}let desc="";try{desc=_pdfh(item,p3)}catch(e){}let links=[];for(let _p5 of p4.split("+")){let link=!homeVodObj.detailUrl?_pd(item,_p5,MY_URL):_pdfh(item,_p5);links.push(link)}let content;if(p.length>5&&p[5]){content=_pdfh(item,p5)}else{content=""}let vid=links.join("$");if(rule.二级==="*"){vid=vid+"@@"+title+"@@"+img}let vod={vod_name:title,vod_pic:img,vod_remarks:desc,vod_content:content,vod_id:vid};d.push(vod)}catch(e){console.log("首页列表单层定位处理发生错误:"+e.message)}}}}catch(e){}}let t2=(new Date).getTime();console.log("加载首页推荐耗时:"+(t2-t1)+"毫秒");if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}return JSON.stringify({list:d})}function categoryParse(cateObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let p=cateObj.一级;if(!p||typeof p!=="string"){return"{}"}let d=[];let url=cateObj.url.replaceAll("fyclass",cateObj.tid);if(cateObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(cateObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(rule.filter_url){if(!/fyfilter/.test(url)){if(!url.endsWith("&")&&!rule.filter_url.startsWith("&")){url+="&"}url+=rule.filter_url}else{url=url.replace("fyfilter",rule.filter_url)}let fl=cateObj.filter?cateObj.extend:{};if(rule.filter_def&&typeof rule.filter_def==="object"){try{if(Object.keys(rule.filter_def).length>0&&rule.filter_def.hasOwnProperty(cateObj.tid)){let self_fl_def=rule.filter_def[cateObj.tid];if(self_fl_def&&typeof self_fl_def==="object"){let fl_def=JSON.parse(JSON.stringify(self_fl_def));fl=Object.assign(fl_def,fl)}}}catch(e){print("合并不同分类对应的默认筛选出错:"+e.message)}}let new_url;new_url=cheerio.jinja2(url,{fl:fl});url=new_url}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",cateObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",cateObj.pg)}}MY_URL=url;console.log(MY_URL);p=p.trim();const MY_CATE=cateObj.tid;if(p.startsWith("js:")){var MY_FL=cateObj.extend;const TYPE="cate";var input=MY_URL;const MY_PAGE=cateObj.pg;var desc="";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let _ps=parseTags.getParse(p[0]);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p[0].startsWith("json:");p[0]=p[0].replace(/^(jsp:|json:|jq:)/,"");try{let html=getHtml(MY_URL);if(html){if(is_json){html=dealJson(html)}let list=_pdfa(html,p[0]);list.forEach(it=>{let links=p[4].split("+").map(p4=>{return!rule.detailUrl?_pd(it,p4,MY_URL):_pdfh(it,p4)});let link=links.join("$");let vod_id=rule.detailUrl?MY_CATE+"$"+link:link;let vod_name=_pdfh(it,p[1]).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p[2],MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}d.push({vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p[3]).replace(/\n|\t/g,"").trim()})})}}catch(e){console.log(e.message)}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}if(d.length>0){print(d.slice(0,2))}let pagecount=0;if(rule.pagecount&&typeof rule.pagecount==="object"&&rule.pagecount.hasOwnProperty(MY_CATE)){print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);pagecount=parseInt(rule.pagecount[MY_CATE])}let nodata={list:[{vod_name:"无数据,防无限请求",vod_id:"no_data",vod_remarks:"不要点,会崩的",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}],total:1,pagecount:1,page:1,limit:1};let vod=d.length<1?JSON.stringify(nodata):JSON.stringify({page:parseInt(cateObj.pg),pagecount:pagecount||999,limit:20,total:999,list:d});return vod}function searchParse(searchObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let d=[];if(!searchObj.searchUrl){return"{}"}let p=searchObj.搜索==="*"&&rule.一级?rule.一级:searchObj.搜索;if(!p||typeof p!=="string"){return"{}"}p=p.trim();let pp=rule.一级.split(";");let url=searchObj.searchUrl.replaceAll("**",searchObj.wd);if(searchObj.pg===1&&url.includes("[")&&url.includes("]")){url=url.split("[")[1].split("]")[0]}else if(searchObj.pg>1&&url.includes("[")&&url.includes("]")){url=url.split("[")[0]}if(/fypage/.test(url)){if(url.includes("(")&&url.includes(")")){let url_rep=url.match(/.*?\((.*)\)/)[1];let cnt_page=url_rep.replaceAll("fypage",searchObj.pg);let cnt_pg=eval(cnt_page);url=url.replaceAll(url_rep,cnt_pg).replaceAll("(","").replaceAll(")","")}else{url=url.replaceAll("fypage",searchObj.pg)}}MY_URL=url;console.log(MY_URL);if(p.startsWith("js:")){const TYPE="search";const MY_PAGE=searchObj.pg;const KEY=searchObj.wd;var input=MY_URL;var detailUrl=rule.detailUrl||"";eval(p.trim().replace("js:",""));d=VODS}else{p=p.split(";");if(p.length<5){return"{}"}let p0=getPP(p,0,pp,0);let _ps=parseTags.getParse(p0);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;let is_json=p0.startsWith("json:");p0=p0.replace(/^(jsp:|json:|jq:)/,"");try{let req_method=MY_URL.split(";").length>1?MY_URL.split(";")[1].toLowerCase():"get";let html;if(req_method==="post"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`post=》rurl:${rurl},params:${params}`);let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else if(req_method==="postjson"){let rurls=MY_URL.split(";")[0].split("#");let rurl=rurls[0];let params=rurls.length>1?rurls[1]:"";print(`postjson-》rurl:${rurl},params:${params}`);try{params=JSON.parse(params)}catch(e){params="{}"}let _fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let postData={body:params};Object.assign(_fetch_params,postData);html=post(rurl,_fetch_params)}else{html=getHtml(MY_URL)}if(html){if(/系统安全验证|输入验证码/.test(html)){let cookie=verifyCode(MY_URL);if(cookie){console.log(`本次成功过验证,cookie:${cookie}`);setItem(RULE_CK,cookie)}else{console.log(`本次自动过搜索验证失败,cookie:${cookie}`)}html=getHtml(MY_URL)}if(!html.includes(searchObj.wd)){console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");console.log(html)}if(is_json){html=dealJson(html)}let list=_pdfa(html,p0);let p1=getPP(p,1,pp,1);let p2=getPP(p,2,pp,2);let p3=getPP(p,3,pp,3);let p4=getPP(p,4,pp,4);let p5=getPP(p,5,pp,5);list.forEach(it=>{let links=p4.split("+").map(_p4=>{return!rule.detailUrl?_pd(it,_p4,MY_URL):_pdfh(it,_p4)});let link=links.join("$");let content;if(p.length>5&&p[5]){content=_pdfh(it,p5)}else{content=""}let vod_id=link;let vod_name=_pdfh(it,p1).replace(/\n|\t/g,"").trim();let vod_pic=_pd(it,p2,MY_URL);if(rule.二级==="*"){vod_id=vod_id+"@@"+vod_name+"@@"+vod_pic}let ob={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,vod_remarks:_pdfh(it,p3).replace(/\n|\t/g,"").trim(),vod_content:content.replace(/\n|\t/g,"").trim()};d.push(ob)})}}catch(e){print("搜索发生错误:"+e.message);return"{}"}}if(rule.图片来源){d.forEach(it=>{if(it.vod_pic&&it.vod_pic.startsWith("http")){it.vod_pic=it.vod_pic+rule.图片来源}})}return JSON.stringify({page:parseInt(searchObj.pg),pagecount:10,limit:20,total:100,list:d})}function detailParse(detailObj){let t1=(new Date).getTime();fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));let orId=detailObj.orId;let vod_name="片名";let vod_pic="";let vod_id=orId;if(rule.二级==="*"){let extra=orId.split("@@");vod_name=extra.length>1?extra[1]:vod_name;vod_pic=extra.length>2?extra[2]:vod_pic}let vod={vod_id:vod_id,vod_name:vod_name,vod_pic:vod_pic,type_name:"类型",vod_year:"年份",vod_area:"地区",vod_remarks:"更新信息",vod_actor:"主演",vod_director:"导演",vod_content:"简介"};let p=detailObj.二级;let url=detailObj.url;let detailUrl=detailObj.detailUrl;let fyclass=detailObj.fyclass;let tab_exclude=detailObj.tab_exclude;let html=detailObj.html||"";MY_URL=url;if(detailObj.二级访问前){try{print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);eval(detailObj.二级访问前.trim().replace("js:",""))}catch(e){print(`二级访问前执行代码出现错误:${e.message}`)}}if(p==="*"){vod.vod_play_from="道长在线";vod.vod_remarks=detailUrl;vod.vod_actor="没有二级,只有一级链接直接嗅探播放";vod.vod_content=MY_URL;vod.vod_play_url="嗅探播放$"+MY_URL.split("@@")[0]}else if(typeof p==="string"&&p.trim().startsWith("js:")){const TYPE="detail";var input=MY_URL;var play_url="";eval(p.trim().replace("js:",""));vod=VOD;console.log(JSON.stringify(vod))}else if(p&&typeof p==="object"){let tt1=(new Date).getTime();if(!html){html=getHtml(MY_URL)}print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);let _ps;if(p.is_json){print("二级是json");_ps=parseTags.json;html=dealJson(html)}else if(p.is_jsp){print("二级是jsp");_ps=parseTags.jsp}else if(p.is_jq){print("二级是jq");_ps=parseTags.jq}else{print("二级默认jq");_ps=parseTags.jq}let tt2=(new Date).getTime();print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);_pdfa=_ps.pdfa;_pdfh=_ps.pdfh;_pd=_ps.pd;if(p.title){let p1=p.title.split(";");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}if(p.desc){try{let p1=p.desc.split(";");vod.vod_remarks=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim();vod.vod_year=p1.length>1?_pdfh(html,p1[1]).replace(/\n|\t/g,"").trim():"";vod.vod_area=p1.length>2?_pdfh(html,p1[2]).replace(/\n|\t/g,"").trim():"";vod.vod_actor=p1.length>3?_pdfh(html,p1[3]).replace(/\n|\t/g,"").trim():"";vod.vod_director=p1.length>4?_pdfh(html,p1[4]).replace(/\n|\t/g,"").trim():""}catch(e){}}if(p.content){try{let p1=p.content.split(";");vod.vod_content=_pdfh(html,p1[0]).replace(/\n|\t/g,"").trim()}catch(e){}}if(p.img){try{let p1=p.img.split(";");vod.vod_pic=_pd(html,p1[0],MY_URL)}catch(e){}}let vod_play_from="$$$";let playFrom=[];if(p.重定向&&p.重定向.startsWith("js:")){print("开始执行重定向代码:"+p.重定向);html=eval(p.重定向.replace("js:",""))}if(p.tabs){if(p.tabs.startsWith("js:")){print("开始执行tabs代码:"+p.tabs);var input=MY_URL;eval(p.tabs.replace("js:",""));playFrom=TABS}else{let p_tab=p.tabs.split(";")[0];let vHeader=_pdfa(html,p_tab);console.log(vHeader.length);let tab_text=p.tab_text||"body&&Text";let new_map={};for(let v of vHeader){let v_title=_pdfh(v,tab_text).trim();console.log(v_title);if(tab_exclude&&new RegExp(tab_exclude).test(v_title)){continue}if(!new_map.hasOwnProperty(v_title)){new_map[v_title]=1}else{new_map[v_title]+=1}if(new_map[v_title]>1){v_title+=Number(new_map[v_title]-1)}playFrom.push(v_title)}}console.log(JSON.stringify(playFrom))}else{playFrom=["道长在线"]}vod.vod_play_from=playFrom.join(vod_play_from);let vod_play_url="$$$";let vod_tab_list=[];if(p.lists){if(p.lists.startsWith("js:")){print("开始执行lists代码:"+p.lists);try{var input=MY_URL;var play_url="";eval(p.lists.replace("js:",""));for(let i in LISTS){if(LISTS.hasOwnProperty(i)){try{LISTS[i]=LISTS[i].map(it=>it.split("$").slice(0,2).join("$"))}catch(e){print("格式化LISTS发生错误:"+e.message)}}}vod_play_url=LISTS.map(it=>it.join("#")).join(vod_play_url)}catch(e){print("js执行lists: 发生错误:"+e.message)}}else{let list_text=p.list_text||"body&&Text";let list_url=p.list_url||"a&&href";let is_tab_js=p.tabs.trim().startsWith("js:");for(let i=0;i1&&!is_tab_js?p.tabs.split(";")[1]:"";let p1=p.lists.replaceAll("#idv",tab_name).replaceAll("#id",i);tab_ext=tab_ext.replaceAll("#idv",tab_name).replaceAll("#id",i);let tabName=tab_ext?_pdfh(html,tab_ext):tab_name;console.log(tabName);let new_vod_list=[];let tt1=(new Date).getTime();if(typeof pdfl==="function"){new_vod_list=pdfl(html,p1,list_text,list_url,MY_URL)}else{let vodList=[];try{vodList=_pdfa(html,p1);console.log("len(vodList):"+vodList.length)}catch(e){}for(let i=0;i0){new_vod_list=forceOrder(new_vod_list,"",x=>x.split("$")[0]);console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)}let vlist=new_vod_list.join("#");vod_tab_list.push(vlist)}vod_play_url=vod_tab_list.join(vod_play_url)}}vod.vod_play_url=vod_play_url}if(rule.图片来源&&vod.vod_pic&&vod.vod_pic.startsWith("http")){vod.vod_pic=vod.vod_pic+rule.图片来源}if(!vod.vod_id||vod_id.includes("$")&&vod.vod_id!==vod_id){vod.vod_id=vod_id}let t2=(new Date).getTime();console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);vod=vodDeal(vod);return JSON.stringify({list:[vod]})}function get_tab_index(vod){let obj={};vod.vod_play_from.split("$$$").forEach((it,index)=>{obj[it]=index});return obj}function vodDeal(vod){let vod_play_from=vod.vod_play_from.split("$$$");let vod_play_url=vod.vod_play_url.split("$$$");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;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);if(rule.tab_remove&&rule.tab_remove.length>0){tab_removed_list=vod_play_from.filter(it=>!rule.tab_remove.includes(it));tab_list=tab_removed_list}if(rule.tab_order&&rule.tab_order.length>0){let tab_order=rule.tab_order;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))});tab_list=tab_ordered_list}play_ordered_list=tab_list.map(it=>vod_play_url[tab_index_dict[it]])}if(rule.tab_rename&&typeof rule.tab_rename==="object"&Object.keys(rule.tab_rename).length>0){tab_renamed_list=tab_list.map(it=>rule.tab_rename[it]||it);tab_list=tab_renamed_list}vod.vod_play_from=tab_list.join("$$$");vod.vod_play_url=play_ordered_list.join("$$$");return vod}function tellIsJx(url){try{let is_vip=!/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0])&&是否正版(url);return is_vip?1:0}catch(e){return 1}}function playParse(playObj){fetch_params=JSON.parse(JSON.stringify(rule_fetch_params));MY_URL=playObj.url;if(!/http/.test(MY_URL)){try{MY_URL=base64Decode(MY_URL)}catch(e){}}MY_URL=decodeURIComponent(MY_URL);var input=MY_URL;let common_play={parse:1,url:input,jx:tellIsJx(input)};let lazy_play;if(!rule.play_parse||!rule.lazy){lazy_play=common_play}else if(rule.play_parse&&rule.lazy&&typeof rule.lazy==="string"){try{let lazy_code=rule.lazy.replace("js:","").trim();print("开始执行js免嗅=>"+lazy_code);eval(lazy_code);lazy_play=typeof input==="object"?input:{parse:1,jx:tellIsJx(input),url:input}}catch(e){print("js免嗅错误:"+e.message);lazy_play=common_play}}else{lazy_play=common_play}if(Array.isArray(rule.play_json)&&rule.play_json.length>0){let web_url=lazy_play.url;for(let pjson of rule.play_json){if(pjson.re&&(pjson.re==="*"||web_url.match(new RegExp(pjson.re)))){if(pjson.json&&typeof pjson.json==="object"){let base_json=pjson.json;lazy_play=Object.assign(lazy_play,base_json);break}}}}else if(rule.play_json&&!Array.isArray(rule.play_json)){let base_json={jx:1,parse:1};lazy_play=Object.assign(lazy_play,base_json)}else if(!rule.play_json){let base_json={jx:0,parse:1};lazy_play=Object.assign(lazy_play,base_json)}console.log(JSON.stringify(lazy_play));return JSON.stringify(lazy_play)}function proxyParse(proxyObj){var input=proxyObj.params;if(proxyObj.proxy_rule){log("准备执行本地代理规则:\n"+proxyObj.proxy_rule);try{eval(proxyObj.proxy_rule);if(input&&input!==proxyObj.params&&Array.isArray(input)&&input.length===3){return input}else{return[404,"text/plain","Not Found"]}}catch(e){return[500,"text/plain","代理规则错误:"+e.message]}}else{return[404,"text/plain","Not Found"]}}function isVideoParse(isVideoObj){var input=isVideoObj.url;if(!isVideoObj.t){let re_matcher=new RegExp(isVideoObj.isVideo,"i");return re_matcher.test(input)}else{try{eval(isVideoObj.isVideo);if(typeof input==="boolean"){return input}else{return false}}catch(e){log("执行嗅探规则发生错误:"+e.message);return false}}}function init(ext){console.log("init");try{let muban=模板.getMubans();if(typeof ext=="object"){rule=ext}else if(typeof ext=="string"){if(ext.startsWith("http")){let js=request(ext,{method:"GET"});if(js){eval(js.replace("var rule","rule"))}}else{eval(ext.replace("var rule","rule"))}}if(rule.模板&&muban.hasOwnProperty(rule.模板)){print("继承模板:"+rule.模板);rule=Object.assign(muban[rule.模板],rule)}let rule_cate_excludes=(rule.cate_exclude||"").split("|").filter(it=>it.trim());let rule_tab_excludes=(rule.tab_exclude||"").split("|").filter(it=>it.trim());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("|");rule.tab_exclude=rule_tab_excludes.join("|");rule.host=(rule.host||"").rstrip("/");HOST=rule.host;if(rule.hostJs){console.log(`检测到hostJs,准备执行...`);try{eval(rule.hostJs);rule.host=HOST.rstrip("/")}catch(e){console.log(`执行${rule.hostJs}获取host发生错误:`+e.message)}}rule.url=rule.url||"";rule.double=rule.double||false;rule.homeUrl=rule.homeUrl||"";rule.detailUrl=rule.detailUrl||"";rule.searchUrl=rule.searchUrl||"";rule.homeUrl=rule.host&&rule.homeUrl?urljoin(rule.host,rule.homeUrl):rule.homeUrl||rule.host;rule.detailUrl=rule.host&&rule.detailUrl?urljoin(rule.host,rule.detailUrl):rule.detailUrl;rule.二级访问前=rule.二级访问前||"";if(rule.url.includes("[")&&rule.url.includes("]")){let u1=rule.url.split("[")[0];let u2=rule.url.split("[")[1].split("]")[0];rule.url=rule.host&&rule.url?urljoin(rule.host,u1)+"["+urljoin(rule.host,u2)+"]":rule.url}else{rule.url=rule.host&&rule.url?urljoin(rule.host,rule.url):rule.url}if(rule.searchUrl.includes("[")&&rule.searchUrl.includes("]")){let u1=rule.searchUrl.split("[")[0];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{rule.searchUrl=rule.host&&rule.searchUrl?urljoin(rule.host,rule.searchUrl):rule.searchUrl}rule.timeout=rule.timeout||5e3;rule.encoding=rule.编码||rule.encoding||"utf-8";rule.search_encoding=rule.搜索编码||rule.search_encoding||"";rule.图片来源=rule.图片来源||"";rule.play_json=rule.hasOwnProperty("play_json")?rule.play_json:[];rule.pagecount=rule.hasOwnProperty("pagecount")?rule.pagecount:{};rule.proxy_rule=rule.hasOwnProperty("proxy_rule")?rule.proxy_rule:"";rule.sniffer=rule.hasOwnProperty("sniffer")?rule.sniffer:"";rule.sniffer=!!(rule.sniffer&&rule.sniffer!=="0"&&rule.sniffer!=="false");rule.isVideo=rule.hasOwnProperty("isVideo")?rule.isVideo:"";rule.tab_remove=rule.hasOwnProperty("tab_remove")?rule.tab_remove:[];rule.tab_order=rule.hasOwnProperty("tab_order")?rule.tab_order:[];rule.tab_rename=rule.hasOwnProperty("tab_rename")?rule.tab_rename:{};if(rule.headers&&typeof rule.headers==="object"){try{let header_keys=Object.keys(rule.headers);for(let k of header_keys){if(k.toLowerCase()==="user-agent"){let v=rule.headers[k];console.log(v);if(["MOBILE_UA","PC_UA","UC_UA","IOS_UA","UA"].includes(v)){rule.headers[k]=eval(v)}}else if(k.toLowerCase()==="cookie"){let v=rule.headers[k];if(v&&v.startsWith("http")){console.log(v);try{v=fetch(v);console.log(v);rule.headers[k]=v}catch(e){console.log(`从${v}获取cookie发生错误:`+e.message)}}}}}catch(e){console.log("处理headers发生错误:"+e.message)}}rule_fetch_params={headers:rule.headers||false,timeout:rule.timeout,encoding:rule.encoding};oheaders=rule.headers||{};RKEY=typeof key!=="undefined"&&key?key:"drpy_"+(rule.title||rule.host);pre();init_test()}catch(e){console.log("init_test发生错误:"+e.message)}}let homeHtmlCache=undefined;function home(filter){console.log("home");let homeObj={filter:rule.filter||false,MY_URL:rule.homeUrl,class_name:rule.class_name||"",class_url:rule.class_url||"",class_parse:rule.class_parse||"",cate_exclude:rule.cate_exclude};return homeParse(homeObj)}function homeVod(params){console.log("homeVod");let homeVodObj={"推荐":rule.推荐,double:rule.double,homeUrl:rule.homeUrl,detailUrl:rule.detailUrl};return homeVodParse(homeVodObj)}function category(tid,pg,filter,extend){let cateObj={url:rule.url,"一级":rule.一级,tid:tid,pg:parseInt(pg),filter:filter,extend:extend};return categoryParse(cateObj)}function detail(vod_url){let orId=vod_url;let fyclass="";log("orId:"+orId);if(vod_url.indexOf("$")>-1){let tmp=vod_url.split("$");fyclass=tmp[0];vod_url=tmp[1]}let detailUrl=vod_url.split("@@")[0];let url;if(!detailUrl.startsWith("http")&&!detailUrl.includes("/")){url=rule.detailUrl.replaceAll("fyid",detailUrl).replaceAll("fyclass",fyclass)}else if(detailUrl.includes("/")){url=urljoin(rule.homeUrl,detailUrl)}else{url=detailUrl}let detailObj={orId:orId,url:url,"二级":rule.二级,"二级访问前":rule.二级访问前,detailUrl:detailUrl,fyclass:fyclass,tab_exclude:rule.tab_exclude};return detailParse(detailObj)}function play(flag,id,flags){let playObj={url:id,flag:flag,flags:flags};return playParse(playObj)}function search(wd,quick,pg){if(rule.search_encoding){if(rule.search_encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.search_encoding)}}else if(rule.encoding&&rule.encoding.toLowerCase()!=="utf-8"){wd=encodeStr(wd,rule.encoding)}let searchObj={searchUrl:rule.searchUrl,"搜索":rule.搜索,wd:wd,pg:pg||1,quick:quick};return searchParse(searchObj)}function proxy(params){if(rule.proxy_rule&&rule.proxy_rule.trim()){rule.proxy_rule=rule.proxy_rule.trim()}if(rule.proxy_rule.startsWith("js:")){rule.proxy_rule=rule.proxy_rule.replace("js:","")}let proxyObj={params:params,proxy_rule:rule.proxy_rule};return proxyParse(proxyObj)}function sniffer(){let enable_sniffer=rule.sniffer||false;if(enable_sniffer){log("开始执行辅助嗅探代理规则...")}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 DRPY(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo}}export default{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search,proxy:proxy,sniffer:sniffer,isVideo:isVideo,DRPY:DRPY};
\ No newline at end of file