Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab636537e0 | ||
|
|
dc1e29fe63 | ||
|
|
2f39cd4995 | ||
|
|
a1082d82de | ||
| 89d732fdd1 | |||
| 3742712eaa | |||
| eac8b8cbe2 | |||
| 5deea79e2a | |||
| 73b168c908 | |||
| e076add69f | |||
| 42aab01451 | |||
| 0a838f93ca | |||
| 8d0d815845 | |||
| 438ac9c768 | |||
| c74a640009 | |||
| 1e20af7a5d | |||
| 01c334e1d5 | |||
| b38afc2391 | |||
| 5543047276 | |||
| 11902683ad | |||
| 43504bc11e |
3198
18/18-2.json
Normal file
3198
18/18-2.json
Normal file
File diff suppressed because it is too large
Load Diff
36
18/18-dch.json
Normal file
36
18/18-dch.json
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"urls": [
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/18/18.json",
|
||||||
|
"name": "🇨🇳国军收集18仓库"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/188.json",
|
||||||
|
"name": "🇨🇳国军18x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/188/188.json",
|
||||||
|
"name": "🇨🇳国军188仓库"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": " https://gitee.com/ds360/ds/raw/master/pro2.json",
|
||||||
|
"name": "🇨🇳国军18pro"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/h/prox.json",
|
||||||
|
"name": "🇨🇳国军18proX"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/18js/18.json",
|
||||||
|
"name": "🇨🇳国军18js"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://gitee.com/ds360/ds/raw/master/18.json",
|
||||||
|
"name": "🇨🇳国军18"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
3028
18/18.json
Normal file
3028
18/18.json
Normal file
File diff suppressed because it is too large
Load Diff
2453
18/188.json
Normal file
2453
18/188.json
Normal file
File diff suppressed because it is too large
Load Diff
1313
18/18js.json
Normal file
1313
18/18js.json
Normal file
File diff suppressed because it is too large
Load Diff
3777
18/18pro.json
Normal file
3777
18/18pro.json
Normal file
File diff suppressed because it is too large
Load Diff
5501
18/18prox.json
Normal file
5501
18/18prox.json
Normal file
File diff suppressed because it is too large
Load Diff
6950
18/18x.json
Normal file
6950
18/18x.json
Normal file
File diff suppressed because it is too large
Load Diff
1
18/ds/18.json
Normal file
1
18/ds/18.json
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/18+.txt
Normal file
1
18/ds/18/18+.txt
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/18.json
Normal file
1
18/ds/18/18.json
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/188.txt
Normal file
1
18/ds/18/188.txt
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/288.txt
Normal file
1
18/ds/18/288.txt
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/lf_live1.txt
Normal file
1
18/ds/18/lf_live1.txt
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
格式说明: #订阅名 地址(支持m3u订阅、tvbox配置文件中live选项的直播地址订阅) 相对路径说明 以./开头,相对位置是本订阅文件 以/开头,存储卡的根目录 #18初 ./18.txt #Gather https://github.moeyy.xyz/https://raw.githubusercontent.com/YanG-1989/m3u/main/Gather.m3u #atsushi ./adult.txt #AV集 ./Tom自用.m3u #直播 ./3m5dbm.txt #18+ https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/18+.txt #MEILIN https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/meil.txt #SE https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/se.txt #setv https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/setv.txt #xiangjiao https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/xiangjiao.txt #188 https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/188.txt #288 https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/288.txt #388 https://gh.con.sh/https://raw.githubusercontent.com/kongguojun/668/main/ZB/aa.m3u
|
||||||
1
18/ds/18/lf_live_min.js
Normal file
1
18/ds/18/lf_live_min.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/meil.txt
Normal file
1
18/ds/18/meil.txt
Normal file
File diff suppressed because one or more lines are too long
BIN
18/ds/18/pg.jar
Normal file
BIN
18/ds/18/pg.jar
Normal file
Binary file not shown.
1
18/ds/18/se.txt
Normal file
1
18/ds/18/se.txt
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/18/setv.txt
Normal file
1
18/ds/18/setv.txt
Normal file
File diff suppressed because one or more lines are too long
492
18/ds/18/sex.txt
Normal file
492
18/ds/18/sex.txt
Normal file
|
|
@ -0,0 +1,492 @@
|
||||||
|
{
|
||||||
|
"spider":"https://atomgit.com/dongge/zy/raw/main/jar/zy.jar",
|
||||||
|
"lives":[
|
||||||
|
{"name":"直播","type":0,"url":"./tv/live.txt","epg":"https://epg.112114.xyz/?ch={name}&date={date}","logo":"https://epg.112114.xyz/logo/{name}.png"},
|
||||||
|
{"name":"SEX","type":0,"url":"./tv/SEX.txt","epg":"https://epg.112114.xyz/?ch={name}&date={date}","logo":"https://epg.112114.xyz/logo/{name}.png"},
|
||||||
|
{"name":"直播源","type":0,"url":"./tv/live1.txt","epg":"https://epg.112114.xyz/?ch={name}&date={date}","logo":"https://epg.112114.xyz/logo/{name}.png"}],
|
||||||
|
|
||||||
|
//"wallpaper":"https://gao.chuqiuyu.tk",
|
||||||
|
|
||||||
|
"wallpaper":"http://饭太硬.top/深色壁纸/api.php",
|
||||||
|
|
||||||
|
"sites":[
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"drpy_js_豆瓣","name":"豆瓣[搜索]","type":3,"api":"./JS/lib/drpy2.min.js","ext":"./JS/js/drpy.js"},
|
||||||
|
|
||||||
|
{"key":"csp_WoGG_玩偶哥哥","name":"玩偶哥哥[SP]","type":3,"api":"csp_WoGG","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_XYQHiker_玩偶哥哥","name":"玩偶哥哥(XYQH)","type":3,"api":"csp_XYQHikerAL","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","ext":"./XYQHiker/玩偶哥哥.json"},
|
||||||
|
|
||||||
|
//{"key":"csp_XYQHikerAL_阿里云盘","name":"阿里云盘(XYQH)","type":3,"api":"csp_XYQHikerAL","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","ext":"./XYQHiker/阿里云盘.json"},
|
||||||
|
|
||||||
|
{"key":"4KHDR","name":"4KHDR(XYQH)","type":3,"api":"csp_XYQHikerAL","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","ext":"./XYQHiker/4KHDR.json"},
|
||||||
|
|
||||||
|
{"key":"csp_YiSo_易搜","name":"易搜","type":3,"api":"csp_YiSo","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_Zhaozy_找资源","name":"找资源","type":3,"api":"csp_Zhaozy","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":"null$$$yunshuche$$$11223344","jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_PanSou_盘搜","name":"盘搜","type":3,"api":"csp_PanSou","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_UpYun_云搜","name":"云搜","type":3,"api":"csp_UpYun","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_PanSearch_网盘搜索","name":"网盘搜索","type":3,"api":"csp_PanSearch","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_Paper_纸条搜索","name":"纸条搜索","type":3,"api":"csp_Paper","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_Dovx_阿里云盘","name":"阿里云盘","type":3,"api":"csp_Dovx","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"jar":"./jar/ali.jar"},
|
||||||
|
|
||||||
|
{"key":"csp_XYQHiker_土拨鼠","name":"土拨鼠搜索(XYQH)","type":3,"api":"csp_XYQHiker","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":"./XYQHiker/土拨鼠搜索.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XYQHikerAL_我的小站","name":"小站搜索(XYQH)","type":3,"api":"csp_XYQHikerAL","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":"./XYQHiker/小站搜索.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XYQBiu_云盘分享","name":"云盘分享","type":3,"api":"csp_XYQBiu","searchable":1,"quickSearch":1,"filterable":1,"changeable":1,"ext":"./XYQBiu/云盘分享.json"},
|
||||||
|
|
||||||
|
{"key":"push_agent","name":"推送","type":3,"api":"csp_Push","searchable":0,"quickSearch":0,"filterable":0,"changeable":0},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"AList","name":"SOD","type":3,"api":"csp_AList","searchable":1,"changeable":0,"ext":{"drives":[{"name":"SOD","server":"https://a.sodaz.xyz"}]}},
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"csp_AList1","name":"AV","type":3,"api":"csp_AList","searchable":1,"changeable":0,"ext":{"drives":[{"name":"AV","server":"https://a74d291e-3b91-45a5-9ec6-9f08a9178e59.id.repl.co"}]}},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_AV一","name":"AV一","type":3,"api":"csp_XBPQ","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","playUrl":"","ext":"./sex/AV一.json"},
|
||||||
|
|
||||||
|
{"key":"drpy_js_猫了个咪","name":"猫了个咪[DRPY18]","type":3,"api":"./JS/lib/drpy2.min.js","searchable":1,"quickSearch":1,"filterable":1,"ext":"./JS/js/猫了个咪.js"},
|
||||||
|
|
||||||
|
{"key":"csp_黄仓库","name":"黄仓库[SP]","api":"csp_Hsck","type":3,"filterable":1,"quickSearch":1,"searchable":1,"ext":"https://www.javsee.men/"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_91色","name":"91色","type":3,"api":"csp_XBPQ","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","playUrl":"","ext":"./sex/91色.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_新香蕉","name":"新香蕉","type":3,"api":"csp_XBPQ","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","playUrl":"","ext":"./sex/新香蕉.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_日日夜夜","name":"日日夜夜","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/日日夜夜.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_X先生","name":"X先生","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/X先生.json"},
|
||||||
|
|
||||||
|
{"key":"csp_大炮色","name":"大炮色","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/大炮色.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_鲸鱼传媒","name":"鲸鱼传媒","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/鲸鱼传媒.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_左临诱射","name":"左临诱射","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/左临诱射.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_香蕉视频","name":"香蕉视频","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/香蕉视频.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_色花堂","name":"色花堂","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/色花堂.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_Gaoaa","name":"Gaoaa","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,
|
||||||
|
"ext":"./sex/gaoaa.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_朱古力","name":"朱古力[翻墙]","type":3,"api":"csp_XBPQ","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","playUrl":"","ext":"./sex/朱古力.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_CableAV","name":"CableAV[翻墙]","type":3,"api":"csp_XBPQ","searchable":"1","quickSearch":"1","filterable":"1","changeable":"1","playUrl":"","ext":"./sex/CableAV.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_性欲轮回","name":"性欲轮回[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/性欲轮回.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_性欲轮回[分类]","name":"性欲轮回[翻墙分类]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/性欲轮回[分类].json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_掏爱撸","name":"掏爱撸[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/掏爱撸.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_黄瓜TV","name":"黄瓜TV[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/黄瓜TV.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_banan","name":"banan[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/banan.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_爱污传媒","name":"爱污传媒[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/爱污传媒.json"},
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_78m成人视频","name":"78m成人视频[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/78m成人视频.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_18AV","name":"18AV[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/18AV.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_Miss AV","name":"Miss AV[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/Miss AV.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_伊人","name":"伊人[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/伊人.json"},
|
||||||
|
|
||||||
|
{"key":"csp_主播视频","name":"主播视频[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/主播视频.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_Jable","name":"Jable[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/Jable.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_玩偶姐姐","name":"玩偶姐姐[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/玩偶姐姐.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_朱古力","name":"朱古力[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/朱古力.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_NOWAV","name":"NOWAV[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/NOWAV.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_女优","name":"女优[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/女优.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_Hanime","name":"Hanime[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/Hanime.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_Hanime1","name":"Hanime1[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/Hanime1.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_成人在线","name":"成人在线[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/成人在线.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_美日韩女优","name":"美日韩女优[翻墙]","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/美日韩女优.json"},
|
||||||
|
|
||||||
|
{"key":"csp_XBPQ_麻豆映画","name":"麻豆映画","type":3,"api":"csp_XBPQ","searchable":1,"quickSearch":1,"filterable":1,"ext":"./sex/麻豆映画.json"},
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"色南国资源","name":"色南国资源","type":1,"api":"https://api.sexnguon.com/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"美少女资源","name":"美少女资源","type":0,"api":"https://www.msnii.com/api/xml.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"淫水机资源","name":"淫水机资源","type":0,"api":"https://www.xrbsp.com/api/xml.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"香奶儿资源","name":"香奶儿资源","type":0,"api":"https://www.gdlsp.com/api/xml.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"白嫖资源","name":"白嫖资源","type":0,"api":"https://www.kxgav.com/api/xml.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"黄AV资源","name":"黄AV资源","type":0, "api":"https://www.pgxdy.com/api/xml.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"色色资源","name":"色色资源","type":0,"api":"http://secj8.com/inc/sapi.php?ac=videolist","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"番号资源","name":"番号资源","type":1,"api":"http://fhapi9.com/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"易看资源-伦理","name":"易看资源-伦理","type":1,"api":"https://api.yikanapi.com/api.php/provide/vod/","searchable":1,"quickSearch":1},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"亚洲成人在线","name":"亚洲成人在线","type":0,"api":"https://caiji01.com/home/cjapi/cfd2/mc10/vod/xml","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"黄瓜TV资源","name":"黄瓜TV资源","type":0,"api":"https://caiji10.com/home/cjapi/cfs6/mc10/vod/xml","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"CK资源","name":"CK资源","type":1,"api":"https://ckzy.me/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"CK资源2","name":"CK资源2","type":1,"api":"http://www.feifei67.com/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"JAV名优","name":"JAV名优","type":0,"api":"http://mygzycj.com/api.php?ac=list","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"乐播资源","name":"乐播资源","type":0,"api":"https://lbapi9.com/api.php/provide/vod/at/xml","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"酷豆资源","name":"酷豆资源","type":1,"api":"https://api.kdapi.info/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"奶茶资源","name":"奶茶资源","type":1,"api":"https://caiji.naichaapi.com/inc/apijson_vod.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"环亚资源","name":"环亚资源","type":0,"api":"http://wmcj8.com/inc/sapi.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"玖玖资源","name":"玖玖资源","type":0,"api":"http://99zywcj.com/inc/sapi.php?ac=videolist","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"KK写真资源","name":"KK写真资源","type":1,"api":"https://kkzy.me/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"影库资源-伦理","name":"影库资源-伦理","type":1,"api":"https://api.ykapi.net/api.php/provide/vod/?ac=list","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
{"key":"酷伦理","name":"酷伦理-伦理","type":1,"api":"https://api.kudian70.com/api.php/provide/vod/","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
{"key":"博天","name":"博天-伦理","type":1,"api":"http://bttcj.com/inc/sapi.php","searchable":1,"quickSearch":1,"filterable":1},
|
||||||
|
|
||||||
|
{"key":"本地","name":"本地","type":3,"api":"csp_Local","searchable":0,"filterable":0,"changeable":0},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{"key":"push_agent","name":"推送","type":3,"api":"csp_PushAgent","searchable":"0","quickSearch":"0","filterable":"0","changeable":"0"}
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
"parses":[
|
||||||
|
{"name":"Json聚合","type":3,"url":"Demo"},
|
||||||
|
{"name":"Web聚合","type":3,"url":"Web"},
|
||||||
|
{"name":"并发2","type":2,"url":"Parallel"},
|
||||||
|
{"name":"轮询3","type":2,"url":"Sequence"},
|
||||||
|
|
||||||
|
{"name":"官解","type":1,"url":"https://vip.xuux.icu/home/api?type=ys&uid=1325731&key=adfgilmnpwzBDEJPY3&url="},
|
||||||
|
|
||||||
|
{"name":"默认","url":"https://vip.lianfaka.com/vip/?url=","ext":{"header":{"User-Agent":"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","Referer":"https://www.dy6g.com/"}}},
|
||||||
|
|
||||||
|
{"name":"小黄人","type":1,"url":"http://110.42.2.115:880/analysis/json/?uid=2056&my=efjkmvBGHILMSUWXY0&url=","User-Agent":"Dart/2.18 (dart:io)","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","sohu","搜狐","letv","乐视","yk","mgtv","芒果","CL4K","renrenmi","ltnb","bilibili","1905","xigua"]}},
|
||||||
|
|
||||||
|
{"name":"多多","url":"http://json.yimufund.net/jsonindex.php?url=","type":1,"ext":{"flag":["qiyi","imgo","爱奇艺","奇艺","qq","腾讯","youku","优酷","pptv","PPTV","letv","乐视","leshi","bilibili","哔哩哔哩","哔哩","mgtv","芒果","sohu","xigua","fun","风行"],"header":{"User-Agent":"LuaSocket 3.0-rc1"}},"header":{"User-Agent":"LuaSocket 3.0-rc1"}},
|
||||||
|
|
||||||
|
{"name":"爱酷","type":1,"url":"https://api.json.icu//api//?key=91fd3cbe3887f18438249c78149fa605&url=","User-Agent":"Dart/2.18 (dart:io)","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","sohu","搜狐","letv","乐视","yk","mgtv","芒果","CL4K","renrenmi","ltnb","bilibili","1905","xigua"]}},
|
||||||
|
|
||||||
|
{"name":"小书","type":1,"url":"http://27.124.4.42:4567/jhjson/ceshi.php?url=","User-Agent":"okhttp/3.12.0","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","sohu","搜狐","letv","乐视","yk","mgtv","芒果","CL4K","renrenmi","ltnb","bilibili","1905","xigua"]}},
|
||||||
|
|
||||||
|
{"name":"小女孩大佬","type":1,"url":"http://180.102.25.145:66/api/jsonindex.php/?key=vd4Kpwz3WxUEg16hmf&url="},
|
||||||
|
|
||||||
|
{"name":"测试解析","type":1,"url":"https://jx.255tv.tk/api/?key=S6kQHaE1gVEY5KAv8L&url="},
|
||||||
|
|
||||||
|
{"name":"FosiPlayer解析","type":1,"url":"https://vip.ckllk.com/API.php?appkey=404164cdd1472561b4c61f1845e0bff8&url=","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","sohu","搜狐","letv","乐视","mgtv","芒果","rx","ltnb","bilibili","1905","xigua"]}},
|
||||||
|
|
||||||
|
{"name":"91嗅探","url":"http://91fanli.top/m3u8/?url=","type":0,"ext":{"flag":["qiyi","imgo","爱奇艺","奇艺","qq","腾讯","youku","优酷","pptv","PPTV","letv","乐视","leshi","bilibili","哔哩哔哩","哔哩","mgtv","芒果","sohu","xigua","fun","风行"],"header":{"User-Agent":"Mozilla/5.0"}},"header":{"User-Agent":"Mozilla/5.0"}},
|
||||||
|
|
||||||
|
{"name":"777嗅探","type":0,"url":"https://jx.777jiexi.com/player/?url=","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","sohu","搜狐","letv","乐视","mgtv","芒果","rx","ltnb","bilibili","1905","xigua"]}},
|
||||||
|
|
||||||
|
{"name":"瞄影嗅探","type":0,"url":"http://www.miaoys.cc/vip/?url="},
|
||||||
|
|
||||||
|
{"name":"左岸嗅探","type":0,"url":"https://jx.bozrc.com:4433/player/?url=","ext":{"header":{"User-Agent":"okhttp/4.1.0"},"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","mgtv","芒果","letv","leshi","LS","乐视","sohu","搜狐","pptv","PPTV","sohu","bilibili","哔哩哔哩","哔哩","1905","xigua","rx","ltnb"]}},
|
||||||
|
|
||||||
|
{"name":"Parwix嗅探","type":0,"url":"https://jx.jsonplayer.com/player/?url="},
|
||||||
|
|
||||||
|
{"name":"菜妮丝","type":0,"url":"https://jx.cainisi.cf/?v=","ext":{"flags":["m1905","douyin","cntv","imgo","youku","qq","leshi","qiyi","xigua","iqiyi","letv","sohu","tudou","pptv","mgtv","wasu"]}},
|
||||||
|
|
||||||
|
{"name":"OK嗅探","type":0,"url":"https://okjx.cc/?url="},
|
||||||
|
|
||||||
|
{"name":"芒果腾讯专用","type":0,"url":"https://jx.xmflv.com/?url=","ext":{"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","mgtv","芒果","letv","乐视","pptv","PPTV","sohu","bilibili","哔哩哔哩","哔哩"],"header":{"User-Agent":""}}},
|
||||||
|
|
||||||
|
{"name":"综合/B站/嗅探","type":0,"url":"https://jx.jsonplayer.com/player/?url=","showType":3},
|
||||||
|
|
||||||
|
{"name":"爱酷嗅探","type":0,"url":"https://jx.zhanlangbu.com/?url=","ext":{"header":{"User-Agent":"okhttp/4.1.0"},"flag":["qq","腾讯","qiyi","爱奇艺","奇艺","youku","优酷","mgtv","芒果","letv","leshi","LS","乐视","pptv","PPTV","sohu","bilibili","哔哩哔哩","哔哩"]}},
|
||||||
|
|
||||||
|
{"name":"夜幕嗅探","url":"https://www.yemu.xyz/?url=","type":0,"ext":{"flag":["qiyi","imgo","爱奇艺","奇艺","qq","腾讯","youku","优酷","pptv","PPTV","letv","乐视","leshi","bilibili","哔哩哔哩","哔哩","mgtv","芒果","sohu","xigua","fun","风行"],"header":{"User-Agent":"Mozilla/5.0"}},"header":{"User-Agent":"Mozilla/5.0"}}
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
"flags": [
|
||||||
|
"youku",
|
||||||
|
"qq",
|
||||||
|
"iqiyi",
|
||||||
|
"imgo",
|
||||||
|
"xueren",
|
||||||
|
"m1905",
|
||||||
|
"qiyi",
|
||||||
|
"letv",
|
||||||
|
"sohu",
|
||||||
|
"tudou",
|
||||||
|
"pptv",
|
||||||
|
"dbm3u8",
|
||||||
|
"mgtv",
|
||||||
|
"wasu",
|
||||||
|
"bilibili",
|
||||||
|
"le",
|
||||||
|
"duoduozy",
|
||||||
|
"renrenmi",
|
||||||
|
"xigua",
|
||||||
|
"优酷",
|
||||||
|
"西瓜",
|
||||||
|
"乐视",
|
||||||
|
"芒果",
|
||||||
|
"腾讯",
|
||||||
|
"爱奇艺",
|
||||||
|
"奇艺",
|
||||||
|
"ltnb",
|
||||||
|
"rx",
|
||||||
|
"CL4K",
|
||||||
|
"xfyun",
|
||||||
|
"wuduzy",
|
||||||
|
"哔哩哔哩",
|
||||||
|
"哔哩"
|
||||||
|
],
|
||||||
|
"ijk": [
|
||||||
|
{
|
||||||
|
"group": "软解码",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "opensles",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "overlay-format",
|
||||||
|
"value": "842225234"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "framedrop",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "soundtouch",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "start-on-prepared",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "http-detect-range-support",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "fflags",
|
||||||
|
"value": "fastseek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 2,
|
||||||
|
"name": "skip_loop_filter",
|
||||||
|
"value": "48"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "reconnect",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "enable-accurate-seek",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-auto-rotate",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-handle-resolution-change",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-hevc",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "dns_cache_timeout",
|
||||||
|
"value": "600000000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "硬解码",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "opensles",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "overlay-format",
|
||||||
|
"value": "842225234"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "framedrop",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "soundtouch",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "start-on-prepared",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "http-detect-range-support",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "fflags",
|
||||||
|
"value": "fastseek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 2,
|
||||||
|
"name": "skip_loop_filter",
|
||||||
|
"value": "48"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "reconnect",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "enable-accurate-seek",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-auto-rotate",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-handle-resolution-change",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-hevc",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "dns_cache_timeout",
|
||||||
|
"value": "600000000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ads": [
|
||||||
|
"wan.51img1.com",
|
||||||
|
"iqiyi.hbuioo.com",
|
||||||
|
"vip.ffzyad.com",
|
||||||
|
"https://lf1-cdn-tos.bytegoofy.com/obj/tos-cn-i-dy/455ccf9e8ae744378118e4bd289288dd",
|
||||||
|
"mimg.0c1q0l.cn",
|
||||||
|
"www.googletagmanager.com",
|
||||||
|
"www.google-analytics.com",
|
||||||
|
"mc.usihnbcq.cn",
|
||||||
|
"mg.g1mm3d.cn",
|
||||||
|
"mscs.svaeuzh.cn",
|
||||||
|
"cnzz.hhttm.top",
|
||||||
|
"tp.vinuxhome.com",
|
||||||
|
"cnzz.mmstat.com",
|
||||||
|
"www.baihuillq.com",
|
||||||
|
"s23.cnzz.com",
|
||||||
|
"z3.cnzz.com",
|
||||||
|
"c.cnzz.com",
|
||||||
|
"stj.v1vo.top",
|
||||||
|
"z12.cnzz.com",
|
||||||
|
"img.mosflower.cn",
|
||||||
|
"tips.gamevvip.com",
|
||||||
|
"ehwe.yhdtns.com",
|
||||||
|
"xdn.cqqc3.com",
|
||||||
|
"www.jixunkyy.cn",
|
||||||
|
"sp.chemacid.cn",
|
||||||
|
"hm.baidu.com",
|
||||||
|
"s9.cnzz.com",
|
||||||
|
"z6.cnzz.com",
|
||||||
|
"um.cavuc.com",
|
||||||
|
"mav.mavuz.com",
|
||||||
|
"wofwk.aoidf3.com",
|
||||||
|
"z5.cnzz.com",
|
||||||
|
"xc.hubeijieshikj.cn",
|
||||||
|
"tj.tianwenhu.com",
|
||||||
|
"xg.gars57.cn",
|
||||||
|
"k.jinxiuzhilv.com",
|
||||||
|
"cdn.bootcss.com",
|
||||||
|
"ppl.xunzhuo123.com",
|
||||||
|
"xomk.jiangjunmh.top",
|
||||||
|
"img.xunzhuo123.com",
|
||||||
|
"z1.cnzz.com",
|
||||||
|
"s13.cnzz.com",
|
||||||
|
"xg.huataisangao.cn",
|
||||||
|
"z7.cnzz.com",
|
||||||
|
"z2.cnzz.com",
|
||||||
|
"s96.cnzz.com",
|
||||||
|
"q11.cnzz.com",
|
||||||
|
"thy.dacedsfa.cn",
|
||||||
|
"xg.whsbpw.cn",
|
||||||
|
"s19.cnzz.com",
|
||||||
|
"z8.cnzz.com",
|
||||||
|
"s4.cnzz.com",
|
||||||
|
"f5w.as12df.top",
|
||||||
|
"ae01.alicdn.com",
|
||||||
|
"www.92424.cn",
|
||||||
|
"k.wudejia.com",
|
||||||
|
"vivovip.mmszxc.top",
|
||||||
|
"qiu.xixiqiu.com",
|
||||||
|
"cdnjs.hnfenxun.com",
|
||||||
|
"cms.qdwght.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
1
18/ds/18/xiangjiao.txt
Normal file
1
18/ds/18/xiangjiao.txt
Normal file
File diff suppressed because one or more lines are too long
113
18/ds/18/黑料网最新国内入口.txt
Normal file
113
18/ds/18/黑料网最新国内入口.txt
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
新地址获取方法一:155dizhi@gmail.com发任意致邮箱会自动回复最新地址。备用邮箱18hlw@pm.me新地址获取方https://github.com/hlwcg
|
||||||
|
|
||||||
|
黑料网最新国内入口
|
||||||
|
https://ihlw09.com
|
||||||
|
|
||||||
|
视频卡顿异常请刷新页面或
|
||||||
|
安装黑料APP
|
||||||
|
|
||||||
|
ios APP白屏请等待或
|
||||||
|
重新点击下载
|
||||||
|
|
||||||
|
黑料回家路查看
|
||||||
|
常见问题查看
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
最新入口:
|
||||||
|
https://ihlw09.com
|
||||||
|
|
||||||
|
1.不需要翻墙,使用时请尽量关闭vpn
|
||||||
|
|
||||||
|
2.打开手机流量或者wifi
|
||||||
|
|
||||||
|
3.某些地区会被运营商限制导致无法打开,请尝试更换其他浏览器
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
永久入口:
|
||||||
|
https://155.fun
|
||||||
|
|
||||||
|
永久主页:
|
||||||
|
https://18hlw.com
|
||||||
|
|
||||||
|
需要使用vpn或梯子等科学上网方式
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
官方App下载地址:
|
||||||
|
https://8774.8mxfjl.com
|
||||||
|
|
||||||
|
官方免费微信qq吃呱群:
|
||||||
|
http://c.npawxqkyxn40.cn/s/KB36
|
||||||
|
|
||||||
|
18涩导航:
|
||||||
|
https://84bf.tlvundi.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
官方电报(telegram)群:
|
||||||
|
https://t.me/heiliao1
|
||||||
|
|
||||||
|
官方推特:
|
||||||
|
https://twitter.com/hlwcg
|
||||||
|
|
||||||
|
新地址获取方法一:
|
||||||
|
|
||||||
|
155dizhi@gmail.com
|
||||||
|
|
||||||
|
发任意致邮箱会自动回复最新地址。
|
||||||
|
|
||||||
|
由于每日自动回复最新地址数量加大会导致出现上限问题从而无法收到最新地址,可发送下面备用邮箱获取
|
||||||
|
|
||||||
|
备用自动回复最新地址邮箱
|
||||||
|
|
||||||
|
18hlw@pm.me
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
新地址获取方法二:
|
||||||
|
|
||||||
|
https://github.com/hlwcg
|
||||||
|
|
||||||
|
打开此网页快速查看最新地址
|
||||||
|
|
||||||
|
|
||||||
|
官网:
|
||||||
|
https://nbn98.jsjepo3.net/archives/8146.html
|
||||||
|
|
||||||
|
tg频道:
|
||||||
|
https://t.me/heiliao520
|
||||||
|
|
||||||
|
我们有偿收稿
|
||||||
|
|
||||||
|
邮箱投稿: hltougao@gmail.com
|
||||||
|
|
||||||
|
电报投稿:
|
||||||
|
https://t.me/hxx668
|
||||||
|
|
||||||
|
如需vx。qq投稿请和上面两个联系方式取得联系后索要
|
||||||
|
|
||||||
|
唯一商务合作电报联系:
|
||||||
|
https://t.me/nvfalao
|
||||||
|
|
||||||
|
黑料回家的路黑料回家黑料最新地址黑料入口
|
||||||
|
官方公告
|
||||||
|
|
||||||
|
黑料网官方网址,永久免费,谨防假冒
|
||||||
|
|
||||||
|
黑料网国内最新入口无需翻墙:
|
||||||
|
https://ihlw09.com
|
||||||
|
黑料网永久不迷路翻墙地址:
|
||||||
|
https://18hlw.com
|
||||||
|
黑料网app免费下载:
|
||||||
|
https://b7789ef4.8mxfjl.com
|
||||||
|
黑料网分享领现金活动:
|
||||||
|
点击查看
|
||||||
|
|
||||||
|
福利应用老司机必备:
|
||||||
|
https://480dd89.tlvundi.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1
18/ds/188.json
Normal file
1
18/ds/188.json
Normal file
File diff suppressed because one or more lines are too long
BIN
18/ds/188/00.jar
Normal file
BIN
18/ds/188/00.jar
Normal file
Binary file not shown.
1
18/ds/188/188.json
Normal file
1
18/ds/188/188.json
Normal file
File diff suppressed because one or more lines are too long
BIN
18/ds/188/lib/0606.jar
Normal file
BIN
18/ds/188/lib/0606.jar
Normal file
Binary file not shown.
92
18/ds/188/lib/GAOAA.json
Normal file
92
18/ds/188/lib/GAOAA.json
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"站名":"GAOAA",
|
||||||
|
"主页url":"https://67gaoaa.com/",
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"&&\"",
|
||||||
|
"副标题":"<div class=\"img-tag\">&&</div>",
|
||||||
|
"线路数组":"<div class=\"item line\">&&</div>",
|
||||||
|
"线路标题":">&&</a>",
|
||||||
|
"搜索url":"/gaosearch/{wd}-/page/{pg}/",
|
||||||
|
"搜索模式":"1",
|
||||||
|
"搜索副标题":"<div class=\"img-tag\">&&</div>",
|
||||||
|
"搜索链接前缀":"https://67gaoaa.com",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"搜索后缀":"/gaoplay/",
|
||||||
|
"播放数组":"class=\"item line\">&&</div>",
|
||||||
|
"影片类型":"target=\"_blank\">&&</a><i",
|
||||||
|
"导演":"class=\"data\">类型:&&</p>",
|
||||||
|
"主演":"class=\"data\">主演:&&</p>",
|
||||||
|
"简介":"<h1>&&</h1>",
|
||||||
|
"播放列表":"<a&&/a>",
|
||||||
|
"播放标题":">&&<",
|
||||||
|
"播放链接":"href=\"&&\"",
|
||||||
|
"免嗅":"0",
|
||||||
|
"分类":"GAOAA$25",
|
||||||
|
"分类url":"https://67gaoaa.com/gaotype/{cateId}_{catePg}.html",
|
||||||
|
"筛选":{
|
||||||
|
"25":[
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"AV一区",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"国产视频","v":"25"},
|
||||||
|
{"n":"日本无码","v":"20"},
|
||||||
|
{"n":"日本有码","v":"9"},
|
||||||
|
{"n":"中文字幕","v":"2"},
|
||||||
|
{"n":"三级电影","v":"1"},
|
||||||
|
{"n":"巨乳系列","v":"3"},
|
||||||
|
{"n":"人妻激情","v":"8"},
|
||||||
|
{"n":"欧美极品","v":"18"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"AV二区",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"制服诱惑","v":"16"},
|
||||||
|
{"n":"自拍偷拍","v":"17"},
|
||||||
|
{"n":"强奸乱伦","v":"14"},
|
||||||
|
{"n":"人妖视频","v":"7"},
|
||||||
|
{"n":"绝美少女","v":"13"},
|
||||||
|
{"n":"首次亮相","v":"12"},
|
||||||
|
{"n":"HEY诱惑","v":"5"},
|
||||||
|
{"n":"独家DMM","v":"4"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"AV三区",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"网红主播","v":"6"},
|
||||||
|
{"n":"日韩精品","v":"10"},
|
||||||
|
{"n":"激情口交","v":"11"},
|
||||||
|
{"n":"动漫电影","v":"15"},
|
||||||
|
{"n":"极骚萝莉","v":"19"},
|
||||||
|
{"n":"HEYZO","v":"21"},
|
||||||
|
{"n":"高潮喷吹","v":"22"},
|
||||||
|
{"n":"自慰颜射","v":"23"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"AV四区",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"波多野结衣","v":"24"},
|
||||||
|
{"n":"天使萌","v":"26"},
|
||||||
|
{"n":"深田咏美","v":"27"},
|
||||||
|
{"n":"吉泽明步","v":"47"},
|
||||||
|
{"n":"天海翼","v":"46"},
|
||||||
|
{"n":"三上悠亚","v":"45"},
|
||||||
|
{"n":"桥本有菜","v":"48"},
|
||||||
|
{"n":"苍井空","v":"49"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BIN
18/ds/188/lib/XBPQ.jar
Normal file
BIN
18/ds/188/lib/XBPQ.jar
Normal file
Binary file not shown.
BIN
18/ds/188/lib/XYQ11.jar
Normal file
BIN
18/ds/188/lib/XYQ11.jar
Normal file
Binary file not shown.
BIN
18/ds/188/lib/Yoursmile.jar
Normal file
BIN
18/ds/188/lib/Yoursmile.jar
Normal file
Binary file not shown.
13
18/ds/188/lib/fljk2.js
Normal file
13
18/ds/188/lib/fljk2.js
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
{"name": "最新合集", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/zxhj.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "古装三级", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/gzsj.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "麻豆资源", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/mdzy.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "玩偶姐姐", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/wojj.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "个人合集", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/grhj.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "暗里着迷", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/alzm.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "彩虹頻道", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/chpd.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "星星视界", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/xxsj.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
|
||||||
|
{"name": "日韩资源", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/rjzy.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"},
|
||||||
|
{"name": "欧美资源", "url": "https://bitbucket.org/qianruanhui/qrh/raw/a16431bc566c42c551d3274c89be4351ed91e319/omzy.txt&&&https://bkimg.cdn.bcebos.com/pic/9f510fb30f2442a79ec35f0adb43ad4bd013024b"}
|
||||||
|
]
|
||||||
BIN
18/ds/188/lib/fty.jar
Normal file
BIN
18/ds/188/lib/fty.jar
Normal file
Binary file not shown.
98
18/ds/188/lib/maiyoux_open.js
Normal file
98
18/ds/188/lib/maiyoux_open.js
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||||
|
/**
|
||||||
|
* 直播源
|
||||||
|
* author:Leospring
|
||||||
|
*/
|
||||||
|
|
||||||
|
let siteUrl = 'http://api.maiyoux.com:81/mf/';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let cateList = {};
|
||||||
|
async function request(reqUrl, postData, post) {
|
||||||
|
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: post ? 'post' : 'get',
|
||||||
|
data: postData || {},
|
||||||
|
postType: post ? 'form' : '',
|
||||||
|
});
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
if (cfg.ext) {
|
||||||
|
siteUrl = cfg.ext;
|
||||||
|
}
|
||||||
|
cateList = JSON.parse(await request(siteUrl + 'json.txt'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [];
|
||||||
|
Object.keys(cateList).forEach(function(key) {
|
||||||
|
classes.push({
|
||||||
|
type_id: key,
|
||||||
|
type_name: key,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
// filters: filterObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, ext) {
|
||||||
|
let videos = _.map(cateList[tid], (item) => {
|
||||||
|
return {
|
||||||
|
vod_id: item['address'],
|
||||||
|
vod_name: item['title'],
|
||||||
|
vod_pic: item['xinimg'],
|
||||||
|
vod_remarks: item['Number']
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
page: pg,
|
||||||
|
pagecount: 1,
|
||||||
|
total: videos.length
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
try {
|
||||||
|
const res = JSON.parse(await request(siteUrl + id))['zhubo'];
|
||||||
|
let playUrls = _.map(res, (vod) => {
|
||||||
|
return vod.title + '$' + vod.address;
|
||||||
|
}).join('#');
|
||||||
|
const video = {
|
||||||
|
vod_play_from: 'Leospring',
|
||||||
|
vod_play_url: playUrls,
|
||||||
|
vod_content: '作者:Leospring 军军',
|
||||||
|
};
|
||||||
|
const list = [video];
|
||||||
|
const result = { list };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
console.log('err', e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
let playUrl = id;
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
};
|
||||||
|
}
|
||||||
BIN
18/ds/188/lib/pg.jar
Normal file
BIN
18/ds/188/lib/pg.jar
Normal file
Binary file not shown.
29
18/ds/188/lib/qsz.json
Normal file
29
18/ds/188/lib/qsz.json
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"cookie": "",
|
||||||
|
"热门推荐": "1",
|
||||||
|
"直接播放": "0",
|
||||||
|
"数组": "<div class=\"embed-responsive embed-responsive-16by9 position-relative\">&&</div>",
|
||||||
|
"图片": "data-src=\"&&\"",
|
||||||
|
"标题": "alt=\"&&\"",
|
||||||
|
"链接": "href=\"&&\"",
|
||||||
|
"搜索url": "https://www.arival.space/q/{wd}?category_id=&page={pg}",
|
||||||
|
"搜索模式": "1",
|
||||||
|
"搜索数组": "<div class=\"embed-responsive embed-responsive-16by9 position-relative\">&&</div>",
|
||||||
|
"搜索图片": "data-src=\"&&\"",
|
||||||
|
"搜索标题": "alt=\"&&\"",
|
||||||
|
"搜索链接": "href=\"&&\"",
|
||||||
|
"播放二次截取": "<script type=\"application/ld+json\">&&<footer class=\"main-footer\">",
|
||||||
|
"播放数组": "if(!/bot&&</div>",
|
||||||
|
"状态": "更新:&&</span>",
|
||||||
|
"导演": "导演:&&</p >",
|
||||||
|
"主演": "主演:&&</p >",
|
||||||
|
"简介": "简介:&&</span>",
|
||||||
|
"播放列表": "document.querySelector&&;}}",
|
||||||
|
"播放标题": "第一节",
|
||||||
|
"播放链接": "com#&&\"",
|
||||||
|
"嗅探词": ".m3u8",
|
||||||
|
"播放请求头": "",
|
||||||
|
"分类": "国产自拍$263#日本五码$271#91大神$314#欧美精品$260#抖音视频$25#女同性$115#三级字幕$442#91探花$455#偷拍自拍$278#国产传媒$390#台湾涩情$412",
|
||||||
|
"分类url": "https://www.arival.space/cat/{cateId}?page={catePg}",
|
||||||
|
"筛选": "263"
|
||||||
|
}
|
||||||
BIN
18/ds/188/lib/xyq.jar
Normal file
BIN
18/ds/188/lib/xyq.jar
Normal file
Binary file not shown.
1
18/ds/188/lib/zbzdb.js
Normal file
1
18/ds/188/lib/zbzdb.js
Normal file
File diff suppressed because one or more lines are too long
27
18/ds/188/lib/新香蕉久久热.json
Normal file
27
18/ds/188/lib/新香蕉久久热.json
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"站名":"久久热",
|
||||||
|
"主页url":"https://avhh.vip/99re/",
|
||||||
|
"直接播放":"1",
|
||||||
|
"分类":"国产自拍$kdw-guochanzipai#欧美$kdw-oumei#中文字幕$kdw-zhongwenzimu#李宗瑞全集$kdw-lizongruiquanji#日本无码$kdw-ribenwuma#加勒比$kdw-jialebi#日本有码$kdw-ribenyouma#一本道$kdw-yibendao#高清$kdw-gaoqing#潮吹$kdw-chaochui#会员认证作品$kdw-jiujiurehuiyuanrenzhengzuopin#制服丝袜$kdw-zhifusiwa#口爆颜射$kdw-koubaoyanshe#肛交$kdw-gangjiao#东京热$kdw-dongjingre#$小格式综合kdw-xiaogeshizonghe#女主播系列$kdw-hanguonvzhuboxilie#成人动漫$kdw-chengrendongman#SM性虐$kdw-SMxingnue#韩国综合$kdw-hanguozonghe",
|
||||||
|
//"数组":"<div class=\"item\"&&</div>",
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/99re/dplay&&.html\"",
|
||||||
|
"副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"链接前缀":"https://avhh.vip/99re/dplay",
|
||||||
|
"链接后缀": ".html",
|
||||||
|
"线路数组":"button-rounded&&/a>",
|
||||||
|
"线路标题":">&&<",
|
||||||
|
//"搜索数组":"<div class=\"item\"&&</div>",
|
||||||
|
"搜索图片": "data-original=\"&&\"",
|
||||||
|
"搜索标题":"title=\"&&\"",
|
||||||
|
"搜索链接": "href=\"/99re/d&&.html\"",
|
||||||
|
"搜索副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"搜索模式": "1",
|
||||||
|
"搜索url":"https://avhh.vip/99re/vod/search/wd/{wd}.html",
|
||||||
|
"搜索链接前缀":"https://avhh.vip/99re/dplay",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"简介":"<p>&&</p>",
|
||||||
|
"分类url":"https://avhh.vip/99re/{cateId}-{catePg}.html",
|
||||||
|
"免嗅":"0"
|
||||||
|
}
|
||||||
27
18/ds/188/lib/新香蕉国产传媒.json
Normal file
27
18/ds/188/lib/新香蕉国产传媒.json
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"站名":"国产传媒",
|
||||||
|
"主页url":"https://avhh.vip/gccm/",
|
||||||
|
"直接播放":"1",
|
||||||
|
"分类":"麻豆原创$91-madouyuanchuang#91制片厂$91-91zhipianchang#糖心Vlgo$91-tangxinVlgo#天美传媒$91-tianmeichuanmei#蜜桃传媒$91-mitaochuanmei#皇家华人$91-huangjiahuaren#星空传媒$91-xingkongchuanmei#精东影业$91-jingdongyingye#乐播传媒$91-lebochuanmei#乌鸦传媒$91-wuyachuanmei#兔子先生$91-tuzixiansheng#杏吧原创$91-xingbayuanchuang#MINI传媒$91-minichuanmei#大象传媒$91-daxiangchuanmei#开心鬼传媒$91-kaixinguichuanmei#PsychoPorn$91-PsychoPorn",
|
||||||
|
//"数组":"<div class=\"item\"&&</div>",
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/gccm/pplay-&&.html\"",
|
||||||
|
"副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"链接前缀":"https://avhh.vip/gccm/pplay-",
|
||||||
|
"链接后缀": ".html",
|
||||||
|
"线路数组":"button-rounded&&/a>",
|
||||||
|
"线路标题":">&&<",
|
||||||
|
//"搜索数组":"<div class=\"item\"&&</div>",
|
||||||
|
"搜索图片": "data-original=\"&&\"",
|
||||||
|
"搜索标题":"title=\"&&\"",
|
||||||
|
"搜索链接": "href=\"/gccm/p-&&.html\"",
|
||||||
|
"搜索副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"搜索链接前缀":"https://avhh.vip/gccm/pplay-",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"搜索模式": "1",
|
||||||
|
"搜索url":"https://avhh.vip/gccm/vod/search/wd/{wd}.html",
|
||||||
|
"简介":"<p>&&</p>",
|
||||||
|
"分类url":"https://avhh.vip/gccm/{cateId}-{catePg}.html",
|
||||||
|
"免嗅":"0"
|
||||||
|
}
|
||||||
29
18/ds/188/lib/新香蕉废柴网.json
Normal file
29
18/ds/188/lib/新香蕉废柴网.json
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"站名":"废柴网",
|
||||||
|
"主页url":"https://avhh.vip/fcw/",
|
||||||
|
"请求头":"",
|
||||||
|
"直接播放":"1",
|
||||||
|
"图片代理":"0",
|
||||||
|
"分类":"VIP专区$ff-VIPzhuanqu#偷拍自拍$ff-toupaixilie#国产自拍$ff-guochanzipai#日本有码$ff-ribenyouma#日本无码$ff-ribenwuma#成人动漫$ff-chengrendongman#韩国综合$ff-hanguozonghe#VR专区$ff-VRzhuanqu#欧美$ff-oumei",
|
||||||
|
//"数组":"<div class=\"item\"&&</div>",
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/fcw/fplay&&.html\"",
|
||||||
|
"副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"链接前缀":"https://avhh.vip/fcw/fplay",
|
||||||
|
"链接后缀":".html",
|
||||||
|
"线路数组":"button-rounded&&/a>",
|
||||||
|
"线路标题":">&&<",
|
||||||
|
//"搜索数组":"<div class=\"item\"&&</div>",
|
||||||
|
"搜索图片":"data-original=\"&&\"",
|
||||||
|
"搜索标题":"title=\"&&\"",
|
||||||
|
"搜索链接": "href=\"/fcw/f&&.html\"",
|
||||||
|
"搜索副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"搜索模式":"1",
|
||||||
|
"搜索url":"https://avhh.vip/fcw/vod/search/wd/{wd}.html",
|
||||||
|
"搜索链接前缀":"https://avhh.vip/fcw/fplay",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"简介":"<p>&&</p>",
|
||||||
|
"分类url":"https://avhh.vip/fcw/{cateId}-{catePg}.html",
|
||||||
|
"免嗅":"0"
|
||||||
|
}
|
||||||
27
18/ds/188/lib/新香蕉超清资源.json
Normal file
27
18/ds/188/lib/新香蕉超清资源.json
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"站名":"超清资源",
|
||||||
|
"主页url":"https://avhh.vip/cq/",
|
||||||
|
"直接播放":"1",
|
||||||
|
"分类":"亚洲AV$2k-yazhou#自拍偷拍$2k-zipaitoupai#超清传媒$2k-chaoqingchuanmei#3D动漫$2k-3Ddongman#欧美AV$2k-oumei#乱伦人妻$2k-luanlunrenqi#丝袜制服$2k-siwazhifu#直播录播$2k-zhibolubo#SM另类$2k-SMlinglei#超清三级$2k-chaoqingsanji",
|
||||||
|
//"数组":"<div class=\"item\"&&</div>",
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/cq/Kplay&&.html\"",
|
||||||
|
"副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"链接前缀":"https://avhh.vip/cq/Kplay",
|
||||||
|
"链接后缀": ".html",
|
||||||
|
"线路数组":"button&&/a>",
|
||||||
|
"线路标题":">&&<",
|
||||||
|
//"搜索数组":"<div class=\"item\"&&</div>",
|
||||||
|
"搜索图片": "data-original=\"&&\"",
|
||||||
|
"搜索标题":"title=\"&&\"",
|
||||||
|
"搜索链接": "href=\"/cq/k&&.html\"",
|
||||||
|
"搜索副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"搜索模式": "1",
|
||||||
|
"搜索url":"https://avhh.vip/cq/vod/search/page/{catePg}/wd/{wd}.html",
|
||||||
|
"搜索链接前缀":"https://avhh.vip/cq/Kplay",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"简介":"<p>&&</p>",
|
||||||
|
"分类url":"https://avhh.vip/cq/{cateId}-{catePg}.html",
|
||||||
|
"免嗅":"0"
|
||||||
|
}
|
||||||
1
18/ds/188/lib/直播转点播.js
Normal file
1
18/ds/188/lib/直播转点播.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播1.js
Normal file
1
18/ds/188/lib/直播转点播1.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播3.js
Normal file
1
18/ds/188/lib/直播转点播3.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播4.js
Normal file
1
18/ds/188/lib/直播转点播4.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播5.js
Normal file
1
18/ds/188/lib/直播转点播5.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播6.js
Normal file
1
18/ds/188/lib/直播转点播6.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播7.js
Normal file
1
18/ds/188/lib/直播转点播7.js
Normal file
File diff suppressed because one or more lines are too long
1
18/ds/188/lib/直播转点播8.js
Normal file
1
18/ds/188/lib/直播转点播8.js
Normal file
File diff suppressed because one or more lines are too long
15
18/ds/188/lib/直转点本地.json
Normal file
15
18/ds/188/lib/直转点本地.json
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
[
|
||||||
|
{"name":"海洋娱乐","url":"./miaobo/list.json&&&./21.jpg"},
|
||||||
|
{"name":"海岛娱乐","url":"./miaobo/岛4K.json&&&./23.jpg"},
|
||||||
|
{"name":"海上娱乐","url":"./miaobo/xxxlist.json&&&./24.jpg"},
|
||||||
|
{"name":"快乐妹妹","url":"./miaobo/美女.json&&&./25.jpg"},
|
||||||
|
{"name":"快乐美女","url":"./miaobo/快乐.json&&&./26.jpg"},
|
||||||
|
{"name":"自娱摄影","url":"./miaobo/自乐.json&&&./27.jpg"},
|
||||||
|
{"name":"自娱拍摄","url":"./miaobo/自拍.json&&&./28.jpg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
16
18/ds/188/lib/直转点本地1.json
Normal file
16
18/ds/188/lib/直转点本地1.json
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
[
|
||||||
|
{"name":"魅力妹妹","url":"./miaobo/juru.json&&&./6.jpg"},
|
||||||
|
{"name":"魅力无限","url":"./miaobo/qjlh.json&&&./7.jpg"},
|
||||||
|
{"name":"五马影视","url":"./miaobo/wuma.json&&&./8.jpg"},
|
||||||
|
{"name":"有马影视","url":"./miaobo/youma.json&&&./9.jpg"},
|
||||||
|
{"name":"海外影视","url":"./miaobo/zwzm.json&&&./10.jpg"},
|
||||||
|
{"name":"海外有马","url":"./miaobo/rhym.json&&&./11.jpg"},
|
||||||
|
{"name":"海外五马","url":"./miaobo/rhwm.json&&&./12.jpg"},
|
||||||
|
{"name":"野外工作","url":"./miaobo/mnys.json&&&./13.jpg"}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
11
18/ds/188/lib/直转点本地3.json
Normal file
11
18/ds/188/lib/直转点本地3.json
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{"name":"自拍影视","url":"./miaobo/zplc.json&&&./13.jpg"},
|
||||||
|
{"name":"女神影视","url":"./miaobo/nsxs.json&&&./14.jpg"},
|
||||||
|
{"name":"国产影视","url":"./miaobo/gcys.json&&&./15.jpg"},
|
||||||
|
{"name":"国产视频","url":"./miaobo/gcav.json&&&./16.jpg"}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
11
18/ds/188/lib/直转点本地4.json
Normal file
11
18/ds/188/lib/直转点本地4.json
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{"name":"豆豆01","url":"./xz/MD1.json&&&./11.jpg"},
|
||||||
|
{"name":"逗逗02","url":"./xz/MD2.json&&&./2.jpg"},
|
||||||
|
{"name":"荳荳03","url":"./xz/MD3.json&&&./3.jpg"},
|
||||||
|
{"name":"梪梪04","url":"./xz/MD4.json&&&./4.jpg"},
|
||||||
|
{"name":"浢浢05","url":"./xz/MD5.json&&&./5.jpg"},
|
||||||
|
{"name":"侸侸06","url":"./xz/MD6.json&&&./6.jpg"},
|
||||||
|
{"name":"饾饾07","url":"./xz/MD7.json&&&./7.jpg"},
|
||||||
|
{"name":"䄈䄈08","url":"./xz/MD6.json&&&./8.jpg"},
|
||||||
|
{"name":"药老","url":"./fofa/药师经.json&&&./1.jpg"}
|
||||||
|
]
|
||||||
13
18/ds/188/lib/直转点本地5.json
Normal file
13
18/ds/188/lib/直转点本地5.json
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
{"name":"斗斗09","url":"./xz/MD9.json&&&./9.jpg"},
|
||||||
|
{"name":"抖抖10","url":"./xz/MD10.json&&&./10.jpg"},
|
||||||
|
{"name":"㪷㪷11","url":"./xz/MD11.json&&&./11.jpg"},
|
||||||
|
{"name":"钭钭12","url":"./xz/MD12.json&&&./12.jpg"},
|
||||||
|
{"name":"蚪蚪13","url":"./xz/MD13.json&&&./13.jpg"},
|
||||||
|
{"name":"阧阧14","url":"./xz/MD14.json&&&./14.jpg"},
|
||||||
|
{"name":"枓枓15","url":"./xz/MD15.json&&&./15.jpg"},
|
||||||
|
{"name":"鈄鈄16","url":"./xz/MD16.json&&&./16.jpg"},
|
||||||
|
{"name":"蚪蚪17","url":"./xz/MD17-20.json&&&./17.jpg"},
|
||||||
|
{"name":"唞唞18","url":"./xz/MD18.json&&&./18.jpg"},
|
||||||
|
{"name":"十二少","url":"./fofa/七十二章经.json&&&./3.jpg"}
|
||||||
|
]
|
||||||
11
18/ds/188/lib/直转点本地6.json
Normal file
11
18/ds/188/lib/直转点本地6.json
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{"name":"0201福利","url":"./miaobo/0201秒播.json&&&./18.jpg"},
|
||||||
|
{"name":"精品福利","url":"./miaobo/jingpintuijian.json&&&./19.jpg"},
|
||||||
|
{"name":"yourtv","url":"./miaobo/yourtv.json&&&./20.jpg"},
|
||||||
|
{"name":"制服魅力","url":"./miaobo/zhifu.json&&&./21.jpg"}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
7
18/ds/188/lib/直转点本地7.json
Normal file
7
18/ds/188/lib/直转点本地7.json
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
[
|
||||||
|
{"name":"小五直播","url":"./xz/5zblc.json&&&./25.jpg"},
|
||||||
|
{"name":"小酒影视","url":"./xz/91TV1.json&&&./26.jpg"},
|
||||||
|
{"name":"小果影视","url":"./xz/SGP.json&&&./5.jpg"},
|
||||||
|
{"name":"小然影视","url":"./xz/shuqing.json&&&./21.jpg"},
|
||||||
|
{"name":"小燃影视","url":"./xz/jinqing.json&&&./29.jpg"}
|
||||||
|
]
|
||||||
6
18/ds/188/lib/直转点本地8.json
Normal file
6
18/ds/188/lib/直转点本地8.json
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{"name":"小岛影视","url":"./xz/DGZW.json&&&./30.jpg"},
|
||||||
|
{"name":"小综影视","url":"./xz/zhzb.json&&&./29.jpg"},
|
||||||
|
{"name":"甜心影视","url":"./fofa/心经.json&&&./31.jpg"},
|
||||||
|
{"name":"菠萝影视","url":"./miaobo/菠萝心经.json&&&./32.jpg"}
|
||||||
|
]
|
||||||
27
18/ds/188/lib/香蕉资源.json
Normal file
27
18/ds/188/lib/香蕉资源.json
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"站名":"香蕉资源",
|
||||||
|
"主页url":"https://avss.vip/xjzy/",
|
||||||
|
"直接播放":"1",
|
||||||
|
"分类":"中文无码$cn-zhongwenwuma#中文综合$cn-zhongwenzonghe#中文近亲$cn-zhongwenjingqing#中文护士$cn-zhongwenhushi#中文师生$cn-zhongwenshisheng#中文强奸$cn-zhongwenqiangjian#国产自拍$cn-guochanzipai#美女主播$cn-meinvzhubo#三级伦理$cn-sanjizonghe",
|
||||||
|
|
||||||
|
"图片":"data-original=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/xjzy/xplay&&.html\"",
|
||||||
|
"副标题":"<div class=\"duration\">&&</div>",
|
||||||
|
"链接前缀":"https://avss.vip/xjzy/xplay",
|
||||||
|
"链接后缀": ".html",
|
||||||
|
// https://avss.vip/xjzy/xplay-cangkuzhongwenIPX981shoudaoquanlisaoraoheqiangjiantaonaimu-1-1-1-1.html
|
||||||
|
"线路数组":"button&&/a>",
|
||||||
|
"线路标题":">&&<",
|
||||||
|
"搜索数组":"<div class=\"item\"&&</div>",
|
||||||
|
"搜索图片": "data-original=\"&&\"",
|
||||||
|
"搜索标题": "title=\"&&\"",
|
||||||
|
"搜索链接": "href=\"/xjzy/xplay&&.html\"",
|
||||||
|
"搜索模式": "1",
|
||||||
|
"搜索url":"https://avss.vip/xjzy/vod/search/page/{catePg}/wd/{wd}.html",
|
||||||
|
"搜索链接前缀":"https://avss.vip/xjzy/xplay",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"分类url":"https://avss.vip/xjzy/{cateId}-{catePg}.html",
|
||||||
|
"免嗅":"0",
|
||||||
|
"嗅探词":".m3u8#.mp4#.flv#.m4a#.avi#.mkv#.mov#.3gp#.asf#.rm#.rmvb#.wmv#.mpg#.mpeg#.mpe#.ts#.vob#.mp3#.wma"
|
||||||
|
}
|
||||||
210
18/ds/188/lib/麻豆映画.json
Normal file
210
18/ds/188/lib/麻豆映画.json
Normal file
|
|
@ -0,0 +1,210 @@
|
||||||
|
{"name":"麻豆映画",
|
||||||
|
"url":"https://www.madoupj.com/",
|
||||||
|
"直接播放":"1",
|
||||||
|
"分类":"麻豆原创$mdapp1#原创伙伴$mdapp2#节目企划$mdapp3#免费视频区$mdapp72",
|
||||||
|
"数组":"<div class=\"col-sm-4\">&&</div>",
|
||||||
|
"图片":"img src=\"&&\"",
|
||||||
|
"标题":"title=\"&&\"",
|
||||||
|
"链接":"href=\"/index.php/&m=voddetail/&&.html\"",
|
||||||
|
"链接前缀":"/index.php/&m=vodplay/",
|
||||||
|
"链接后缀":"-1-1.html",
|
||||||
|
"搜索数组":"<div class=\"col-sm-4\">&&</div>",
|
||||||
|
"搜索图片":"img src=\"&&\"",
|
||||||
|
"搜索标题":"title=\"&&\"",
|
||||||
|
"搜索链接":"href=\"&&\"",
|
||||||
|
"搜索模式":"0",
|
||||||
|
"搜索url":"/vodsearch/{wd}----------{pg}---.html",
|
||||||
|
"搜索后缀":"/index.php/&m=vodplay/",
|
||||||
|
"搜索链接后缀":"-1-1.html",
|
||||||
|
"影片类型":"<div class=\"category\">&&<h1",
|
||||||
|
"导演":"导演:</span>&&</p>",
|
||||||
|
"主演":"主演:</span>&&</p>",
|
||||||
|
"简介":"<h1&&</h1>",
|
||||||
|
"分类url":"https://www.madoupj.com/index.php/&m=vodtype/{cateId}/page/{catePg}.html",
|
||||||
|
"免嗅":"0",
|
||||||
|
"嗅探词":".m3u8#.mp4#.flv#.m4a#.avi#.mkv#.mov#.3gp#.asf#.rm#.rmvb#.wmv#.mpg#.mpeg#.mpe#.ts#.vob#.mp3#.wma",
|
||||||
|
"筛选":
|
||||||
|
{
|
||||||
|
"mdapp1":[
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"MD系列","v":"mdapp4"},
|
||||||
|
{"n":"导演系列","v":"mdapp5"},
|
||||||
|
{"n":"MDS系列","v":"mdapp6"},
|
||||||
|
{"n":"MDX系列","v":"mdapp7"},
|
||||||
|
{"n":"MKY系列","v":"mdapp86"},
|
||||||
|
{"n":"MCY系列","v":"mdapp95"},
|
||||||
|
{"n":"MDXS系列","v":"mdapp8"},
|
||||||
|
{"n":"MDL系列","v":"mdapp46"},
|
||||||
|
{"n":"MMZ猫爪系列","v":"mdapp50"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"MAD爱豆系列","v":"mdapp52"},
|
||||||
|
{"n":"MDWP职场淫行系列","v":"mdapp57"},
|
||||||
|
{"n":"MLT乐天系列","v":"mdapp62"},
|
||||||
|
{"n":"MSD系列","v":"mdapp63"},
|
||||||
|
{"n":"MSM性梦者","v":"mdapp64"},
|
||||||
|
{"n":"MDM恋爱咖啡馆","v":"mdapp73"},
|
||||||
|
{"n":"BLX系列","v":"mdapp113"},
|
||||||
|
{"n":"MPG系列","v":"mdapp114"},
|
||||||
|
{"n":"MDUS系列","v":"mdapp77"},
|
||||||
|
{"n":"MXJ系列","v":"mdapp78"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"MSG系列","v":"mdapp85"},
|
||||||
|
{"n":"MAN系列","v":"mdapp88"},
|
||||||
|
{"n":"MDAG系列","v":"mdapp99"},
|
||||||
|
{"n":"MDHT系列","v":"mdapp100"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mdapp2":[
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"杏吧专区","v":"mdapp9"},
|
||||||
|
{"n":"辣椒原创","v":"mdapp79"},
|
||||||
|
{"n":"兔子先生","v":"mdapp10"},
|
||||||
|
{"n":"O-STAR","v":"mdapp80"},
|
||||||
|
{"n":"果冻传媒","v":"mdapp11"},
|
||||||
|
{"n":"91制片厂","v":"mdapp51"},
|
||||||
|
{"n":"皇家华人","v":"mdapp12"},
|
||||||
|
{"n":"天美传媒","v":"mdapp45"},
|
||||||
|
{"n":"吴梦梦专区","v":"mdapp13"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"PsychoPorn色控","v":"mdapp14"},
|
||||||
|
{"n":"叮叮映画","v":"mdapp70"},
|
||||||
|
{"n":"涩会","v":"mdapp71"},
|
||||||
|
{"n":"红斯灯影像","v":"mdapp102"},
|
||||||
|
{"n":"麻麻传媒","v":"mdapp103"},
|
||||||
|
{"n":"蝌蚪传媒","v":"mdapp104"},
|
||||||
|
{"n":"Pussy Hunter","v":"mdapp105"},
|
||||||
|
{"n":"瑷荳传媒","v":"mdapp106"},
|
||||||
|
{"n":"桃花源","v":"mdapp107"},
|
||||||
|
{"n":"蜜桃影像传媒","v":"mdapp15"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"豚豚创媒","v":"mdapp74"},
|
||||||
|
{"n":"宫美娱乐","v":"mdapp84"},
|
||||||
|
{"n":"肉肉传媒","v":"mdapp90"},
|
||||||
|
{"n":"爱妃传媒","v":"mdapp75"},
|
||||||
|
{"n":"渡边传媒","v":"mdapp94"},
|
||||||
|
{"n":"葵心娱乐","v":"mdapp96"},
|
||||||
|
{"n":"YOKUBOU","v":"mdapp97"},
|
||||||
|
{"n":"大番号番啪啪","v":"mdapp16"},
|
||||||
|
{"n":"REAL野性派","v":"mdapp29"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mdapp3":[
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"麻豆不回家","v":"mdapp41"},
|
||||||
|
{"n":"狼人插","v":"mdapp53"},
|
||||||
|
{"n":"女优擂台摔角狂热","v":"mdapp54"},
|
||||||
|
{"n":"恋爱巴士","v":"mdapp60"},
|
||||||
|
{"n":"男女优生死斗","v":"mdapp65"},
|
||||||
|
{"n":"情人劫密室逃脱","v":"mdapp66"},
|
||||||
|
{"n":"换妻","v":"mdapp67"},
|
||||||
|
{"n":"你好同学","v":"mdapp68"},
|
||||||
|
{"n":"鲍鱼的胜利","v":"mdapp83"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"性爱自修室","v":"mdapp87"},
|
||||||
|
{"n":"春游记","v":"mdapp91"},
|
||||||
|
{"n":"心动的性号","v":"mdapp92"},
|
||||||
|
{"n":"情趣大富翁","v":"mdapp93"},
|
||||||
|
{"n":"男优练习生","v":"mdapp101"},
|
||||||
|
{"n":"麻豆高校","v":"mdapp110"},
|
||||||
|
{"n":"大鸟十八","v":"mdapp17"},
|
||||||
|
{"n":"疯拍系列","v":"mdapp18"},
|
||||||
|
{"n":"创造淫2021","v":"mdapp55"},
|
||||||
|
{"n":"禁欲小屋","v":"mdapp76"},
|
||||||
|
{"n":"KISS糖果屋","v":"mdapp19"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"小鹏奇啪行","v":"mdapp20"},
|
||||||
|
{"n":"男优出征趣","v":"mdapp21"},
|
||||||
|
{"n":"麻豆达人秀","v":"mdapp69"},
|
||||||
|
{"n":"30天解密麻豆","v":"mdapp22"},
|
||||||
|
{"n":"突袭女优计划","v":"mdapp23"},
|
||||||
|
{"n":"女神羞羞研究院","v":"mdapp24"},
|
||||||
|
{"n":"淫欲游戏王","v":"mdapp40"},
|
||||||
|
{"n":"女优淫娃培训营","v":"mdapp42"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"情趣K歌房","v":"mdapp31"},
|
||||||
|
{"n":"小哥哥艾理","v":"mdapp27"},
|
||||||
|
{"n":"寻宝吧女神","v":"mdapp98"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mdapp72":[
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"全部","v":""},
|
||||||
|
{"n":"糖心","v":"mdapp72"},
|
||||||
|
{"n":"CCAV成人头条","v":"mdapp89"},
|
||||||
|
{"n":"精东影业","v":"mdapp34"},
|
||||||
|
{"n":"星空无限传媒","v":"mdapp47"},
|
||||||
|
{"n":"乐播传媒","v":"mdapp48"},
|
||||||
|
{"n":"开心鬼传媒","v":"mdapp56"},
|
||||||
|
{"n":"葫芦影业","v":"mdapp81"},
|
||||||
|
{"n":"深夜保健室","v":"mdapp35"},
|
||||||
|
{"n":"大象传媒","v":"mdapp58"},
|
||||||
|
{"n":"天马传媒","v":"mdapp82"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key":"cateId",
|
||||||
|
"name":"",
|
||||||
|
"value":[
|
||||||
|
{"n":"SWAG","v":"mdapp36"},
|
||||||
|
{"n":"HongKongDoll","v":"mdapp59"},
|
||||||
|
{"n":"国产短视频","v":"mdapp38"},
|
||||||
|
{"n":"北京天使","v":"mdapp39"},
|
||||||
|
{"n":"MINI传媒","v":"mdapp61"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
17
18/ds/188/lib/黑料.json
Normal file
17
18/ds/188/lib/黑料.json
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"主页url": "https://kb17.oneoneno8cd345.xyz/one",
|
||||||
|
"首页": "400",
|
||||||
|
"请求头": "User-Agent$PC_UA",
|
||||||
|
"数组": "<a&&</a>[不包含:91网曝黑料网#最近更新]",
|
||||||
|
"二次截取": "<div class=\"videoListBox\"&&el-pagination is-background",
|
||||||
|
"标题": "title\">&&</p>",
|
||||||
|
"副标题": "time\">&&</div>",
|
||||||
|
"链接": "https://kb17.oneoneno8cd345.xyz/v/+href=\"/voddetail/&&/\"+/sid/1/nid/1/",
|
||||||
|
"图片": "data-src=\"&&\"",
|
||||||
|
"跳转播放链接": "urlDecode(var player_*url\":\"&&\")",
|
||||||
|
"搜索url": "https://kb17.oneoneno8cd345.xyz/s/wd/{wd}/",
|
||||||
|
"分类url": "https://kb17.oneoneno8cd345.xyz/t/{cateId}-{catePg}/;;z",
|
||||||
|
"分类数组": "<a&&</a>",
|
||||||
|
"分类标题": ">&&</a>",
|
||||||
|
"分类ID": "/t/&&/"
|
||||||
|
}
|
||||||
81
18/ds/188/lib/黑料网.json
Normal file
81
18/ds/188/lib/黑料网.json
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
"规则名": "黑料网",
|
||||||
|
"规则作者": "fuck",
|
||||||
|
"请求头参数": "手机",
|
||||||
|
"网页编码格式": "UTF-8",
|
||||||
|
"图片是否需要代理": "0",
|
||||||
|
"是否开启获取首页数据": "1",
|
||||||
|
"首页推荐链接": "https://bza.wikipedia0004.com/",
|
||||||
|
"首页列表数组规则": "body&&.video-list",
|
||||||
|
"首页片单列表数组规则": "a",
|
||||||
|
"首页片单是否Jsoup写法": "1",
|
||||||
|
"分类起始页码": "1",
|
||||||
|
"分类链接": "https://bza.wikipedia0004.com/category/{cateId}/{catePg}.html",
|
||||||
|
"分类名称": "热点吃瓜&经典大瓜&今日黑料&黑料历史&每日热瓜&独家爆料&网红明星&反差女友&校园政坛&性爱课堂&奇闻异事",
|
||||||
|
"分类名称替换词": "7&8&6&10&11&9&1&4&2&12&3",
|
||||||
|
"筛选数据": {},
|
||||||
|
//"筛选数据": "ext",
|
||||||
|
//{cateId}
|
||||||
|
"筛选子分类名称": "",
|
||||||
|
"筛选子分类替换词": "",
|
||||||
|
//{class}
|
||||||
|
"筛选类型名称": "",
|
||||||
|
"筛选类型替换词": "*",
|
||||||
|
//{area}
|
||||||
|
"筛选地区名称": "",
|
||||||
|
"筛选地区替换词": "*",
|
||||||
|
//{year}
|
||||||
|
"筛选年份名称": "",
|
||||||
|
"筛选年份替换词": "*",
|
||||||
|
//{lang}
|
||||||
|
"筛选语言名称": "",
|
||||||
|
"筛选语言替换词": "*",
|
||||||
|
//{by}
|
||||||
|
"筛选排序名称": "",
|
||||||
|
"筛选排序替换词": "",
|
||||||
|
"分类截取模式": "1",
|
||||||
|
"分类列表数组规则": ".video-list&&a",
|
||||||
|
"分类片单是否Jsoup写法": "1",
|
||||||
|
"分类片单标题": ".title&&Text",
|
||||||
|
"分类片单链接": "a&&href",
|
||||||
|
"分类片单图片": ".img src&&onload",
|
||||||
|
"分类片单副标题": "",
|
||||||
|
"分类片单链接加前缀": "https://bza.wikipedia0004.com/",
|
||||||
|
"分类片单链接加后缀": "",
|
||||||
|
"搜索请求头参数": "",
|
||||||
|
"搜索链接": "",
|
||||||
|
"POST请求数据": "",
|
||||||
|
"搜索截取模式": "",
|
||||||
|
"搜索列表数组规则": "",
|
||||||
|
"搜索片单是否Jsoup写法": "",
|
||||||
|
"搜索片单图片": "",
|
||||||
|
"搜索片单标题": "",
|
||||||
|
"搜索片单链接": "",
|
||||||
|
"搜索片单副标题": "",
|
||||||
|
"搜索片单链接加前缀": "",
|
||||||
|
"搜索片单链接加后缀": "",
|
||||||
|
"链接是否直接播放": "",
|
||||||
|
"直接播放链接加前缀": "",
|
||||||
|
"直接播放链接加后缀": "",
|
||||||
|
"直接播放直链视频请求头": "",
|
||||||
|
"详情是否Jsoup写法": "1",
|
||||||
|
"类型详情": "",
|
||||||
|
"年代详情": "",
|
||||||
|
"地区详情": "",
|
||||||
|
"演员详情": "",
|
||||||
|
"简介详情": "",
|
||||||
|
"线路列表数组规则": "",
|
||||||
|
"线路标题": "",
|
||||||
|
"播放列表数组规则": "body&&.dplayer-video-wrap",
|
||||||
|
"选集列表数组规则": "",
|
||||||
|
"选集标题链接是否Jsoup写法": "1",
|
||||||
|
"选集标题": "",
|
||||||
|
"选集链接": "video&&src",
|
||||||
|
"是否反转选集序列": "0",
|
||||||
|
"选集链接加前缀": "",
|
||||||
|
"选集链接加后缀": "",
|
||||||
|
"分析MacPlayer": "0",
|
||||||
|
"是否开启手动嗅探": "0",
|
||||||
|
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||||
|
"手动嗅探视频链接过滤词": ".html#=http"
|
||||||
|
}
|
||||||
1
18/ds/18js/18.json
Normal file
1
18/ds/18js/18.json
Normal file
File diff suppressed because one or more lines are too long
145
18/ds/18js/18_open_config.json
Normal file
145
18/ds/18js/18_open_config.json
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
{
|
||||||
|
"video": {
|
||||||
|
"sites": [
|
||||||
|
{
|
||||||
|
"key": "sehuatang",
|
||||||
|
"name": "🔞┃色花堂BT┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/sehuatang.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "hscangku",
|
||||||
|
"name": "🔞┃黄色仓库┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/hscangku.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "feifan18",
|
||||||
|
"name": "🔞┃非凡资源18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/feifan18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "asianx",
|
||||||
|
"name": "🔞┃海外宅┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/asianx.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "liangzi18",
|
||||||
|
"name": "🔞┃量子资源18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/liangzi18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "jable",
|
||||||
|
"name": "🔞┃Jable┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/jable.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ciliduo",
|
||||||
|
"name": "🔞┃磁力多BT┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/ciliduo.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "doll",
|
||||||
|
"name": "🔞┃玩偶姐姐┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/doll.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "nivod_18",
|
||||||
|
"name": "🔞┃泥视频18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/nivod_18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "hanxiucao",
|
||||||
|
"name": "🔞┃含羞草┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/hanxiucao.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "push_agent",
|
||||||
|
"name": "┃推送┃",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/push_agent.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\", \"token\": \"6827db23e5474d02a07fd7431d3d5a5a\"}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"read": {
|
||||||
|
"sites": [
|
||||||
|
{
|
||||||
|
"key": "audiomack",
|
||||||
|
"name": "🎵┃音声┃🎵",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/audiomack.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\"}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "copymanga",
|
||||||
|
"name": "🧑🎨|拷贝漫画|🧑🎨",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/copymanga.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\"}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "bqg_open",
|
||||||
|
"name": "📚︎┃笔趣阁┃📚︎",
|
||||||
|
"type": 10,
|
||||||
|
"api": "./js/bqg_open.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\"}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "dj0898_book_open",
|
||||||
|
"name": "🎵┃世纪DJ音乐网┃🎵",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/dj0898_book_open.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\"}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "bookan",
|
||||||
|
"name": "🎵┃看书┃🎵",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/bookan.js",
|
||||||
|
"ext": "{\"box\": \"CatOpen\"}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pan": {
|
||||||
|
"sites": []
|
||||||
|
}
|
||||||
|
}
|
||||||
469
18/ds/18js/18_tv_config.json
Normal file
469
18/ds/18js/18_tv_config.json
Normal file
|
|
@ -0,0 +1,469 @@
|
||||||
|
{
|
||||||
|
"sites": [
|
||||||
|
{
|
||||||
|
"key": "sehuatang",
|
||||||
|
"name": "🔞┃色花堂BT┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/sehuatang.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "hscangku",
|
||||||
|
"name": "🔞┃黄色仓库┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/hscangku.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "feifan18",
|
||||||
|
"name": "🔞┃非凡资源18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/feifan18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "asianx",
|
||||||
|
"name": "🔞┃海外宅┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/asianx.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "liangzi18",
|
||||||
|
"name": "🔞┃量子资源18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/liangzi18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "jable",
|
||||||
|
"name": "🔞┃Jable┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/jable.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ciliduo",
|
||||||
|
"name": "🔞┃磁力多BT┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/ciliduo.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "doll",
|
||||||
|
"name": "🔞┃玩偶姐姐┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/doll.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "nivod_18",
|
||||||
|
"name": "🔞┃泥视频18+┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/nivod_18.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "hanxiucao",
|
||||||
|
"name": "🔞┃含羞草┃🔞",
|
||||||
|
"playerType": 0,
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/hanxiucao.js",
|
||||||
|
"timeout": 30,
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"danmu\": false}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "push_agent",
|
||||||
|
"name": "┃推送┃",
|
||||||
|
"type": 3,
|
||||||
|
"api": "./js/push_agent.js",
|
||||||
|
"ext": "{\"box\": \"TVBox\", \"token\": \"6827db23e5474d02a07fd7431d3d5a5a\"}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ijk": [
|
||||||
|
{
|
||||||
|
"group": "软解码",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "opensles",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "overlay-format",
|
||||||
|
"value": "842225234"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "framedrop",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "soundtouch",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "start-on-prepared",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "http-detect-range-support",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "fflags",
|
||||||
|
"value": "fastseek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 2,
|
||||||
|
"name": "skip_loop_filter",
|
||||||
|
"value": "48"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "reconnect",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "max-buffer-size",
|
||||||
|
"value": "5242880"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "enable-accurate-seek",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-auto-rotate",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-handle-resolution-change",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-hevc",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "dns_cache_timeout",
|
||||||
|
"value": "600000000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "硬解码",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "opensles",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "overlay-format",
|
||||||
|
"value": "842225234"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "framedrop",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "soundtouch",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "start-on-prepared",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "http-detect-range-support",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "fflags",
|
||||||
|
"value": "fastseek"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 2,
|
||||||
|
"name": "skip_loop_filter",
|
||||||
|
"value": "48"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "reconnect",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "max-buffer-size",
|
||||||
|
"value": "5242880"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "enable-accurate-seek",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-auto-rotate",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-handle-resolution-change",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 4,
|
||||||
|
"name": "mediacodec-hevc",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": 1,
|
||||||
|
"name": "dns_cache_timeout",
|
||||||
|
"value": "600000000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ads": [
|
||||||
|
"wan.51img1.com",
|
||||||
|
"iqiyi.hbuioo.com",
|
||||||
|
"vip.ffzyad.com",
|
||||||
|
"https://lf1-cdn-tos.bytegoofy.com/obj/tos-cn-i-dy/455ccf9e8ae744378118e4bd289288dd"
|
||||||
|
],
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"name": "星星",
|
||||||
|
"hosts": [
|
||||||
|
"aws.ulivetv.net"
|
||||||
|
],
|
||||||
|
"regex": [
|
||||||
|
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:8,[\\s\\S]*?#EXT-X-DISCONTINUITY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "量子廣告",
|
||||||
|
"hosts": [
|
||||||
|
"vip.lz",
|
||||||
|
"hd.lz"
|
||||||
|
],
|
||||||
|
"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="
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"doh": [
|
||||||
|
{
|
||||||
|
"name": "Google",
|
||||||
|
"url": "https://dns.google/dns-query",
|
||||||
|
"ips": [
|
||||||
|
"8.8.4.4",
|
||||||
|
"8.8.8.8"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Cloudflare",
|
||||||
|
"url": "https://cloudflare-dns.com/dns-query",
|
||||||
|
"ips": [
|
||||||
|
"1.1.1.1",
|
||||||
|
"1.0.0.1",
|
||||||
|
"2606:4700:4700::1111",
|
||||||
|
"2606:4700:4700::1001"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AdGuard",
|
||||||
|
"url": "https://dns.adguard.com/dns-query",
|
||||||
|
"ips": [
|
||||||
|
"94.140.14.140",
|
||||||
|
"94.140.14.141"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "DNSWatch",
|
||||||
|
"url": "https://resolver2.dns.watch/dns-query",
|
||||||
|
"ips": [
|
||||||
|
"84.200.69.80",
|
||||||
|
"84.200.70.40"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Quad9",
|
||||||
|
"url": "https://dns.quad9.net/dns-quer",
|
||||||
|
"ips": [
|
||||||
|
"9.9.9.9",
|
||||||
|
"149.112.112.112"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parses": [
|
||||||
|
{
|
||||||
|
"name": "聚合",
|
||||||
|
"type": 3,
|
||||||
|
"url": "Demo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路1",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.xmflv.com/?url=",
|
||||||
|
"ext": {
|
||||||
|
"header": {
|
||||||
|
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路2",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.quankan.app/?url=",
|
||||||
|
"ext": {
|
||||||
|
"header": {
|
||||||
|
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路3",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.yparse.com/index.php?url=",
|
||||||
|
"ext": {
|
||||||
|
"header": {
|
||||||
|
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路4",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.jsonplayer.com/player/?url=",
|
||||||
|
"ext": {
|
||||||
|
"header": {
|
||||||
|
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路5",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.aidouer.net/?url=",
|
||||||
|
"ext": {
|
||||||
|
"header": {
|
||||||
|
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||||
|
"referer": "https://jiejie.uk/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路6",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.777jiexi.com/player/?url="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路7",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://www.8090g.cn/?url="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路8",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.yangtu.top?url="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路9",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://jx.m3u8.tv/jiexi/?url="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "线路10",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://www.ckplayer.vip/jiexi/?url="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lives": [
|
||||||
|
{
|
||||||
|
"name": "live",
|
||||||
|
"type": 0,
|
||||||
|
"url": "https://agit.ai/fantaiying/0/raw/branch/main/tvlive.txt",
|
||||||
|
"playerType": 1,
|
||||||
|
"ua": "okhttp/3.15",
|
||||||
|
"epg": "http://epg.112114.xyz/?ch={name}&date={date}",
|
||||||
|
"logo": "https://epg.112114.xyz/logo/{name}.png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"wallpaper": "http://饭太硬.top/深色壁纸/api.php"
|
||||||
|
}
|
||||||
75
18/ds/18js/README.md
Normal file
75
18/ds/18js/README.md
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
# CatVodOpen和TvBox
|
||||||
|
|
||||||
|
## 食用前阅读
|
||||||
|
  以下资源不能保证内容的合法性、准确性、完整性和有效性,请根据情况自行判断。
|
||||||
|
仅用于测试和学习研究,禁止用于商业用途,不得将其用于违反国家、地区、组织等的法律法规或相关规定的其他用途。
|
||||||
|
使用任何第三方硬件、软件、所造成的一切后果由使用的个人或组织承担,与本文内容无关。
|
||||||
|
所有直接或间接使用本内容的个人和组织,应 24 小时内完成学习和研究,并及时删除本文内容。
|
||||||
|
所有基于本内容的源代码,进行的任何修改,为其他个人或组织的自发行为,与本内容没有任何直接或间接的关系,所造成的一切后果亦与本内容和本管理者无关。
|
||||||
|
本管理者保留随时更改或补充此免责声明的权利。一旦使用、复制、转载、发布、修改了本文内容,则视为您已接受此免责声明。否则后果自负。
|
||||||
|
本接口无公众号、无盈利、无引流、免费分享给小白使用,请勿轻信他人,谨防上当受骗。
|
||||||
|
|
||||||
|
[使用教程见Wiki](https://github.com/jadehh/TVSpider/wiki)
|
||||||
|
|
||||||
|
## TVBox互联网发布地址
|
||||||
|
[TV发布地址](https://github.com/FongMi/Release/tree/main/apk/release)
|
||||||
|
```bash
|
||||||
|
https://gh.con.sh/https://raw.githubusercontent.com/jadehh/TVSpider/js/tv_config.json
|
||||||
|
```
|
||||||
|
> 配置信息见js分支分支
|
||||||
|
|
||||||
|
|
||||||
|
## CatVodOpen
|
||||||
|
[CatVodOpen发布地址](https://github.com/catvod/CatVodOpen/releases)
|
||||||
|
|
||||||
|
> 注意使用Gitee或Github导入,并设置为私有仓库,<font color="red">CatVodOpen仅支持私有仓库</font>
|
||||||
|
|
||||||
|
V1.1.3版本以上
|
||||||
|
```bash
|
||||||
|
gitee://Token@gitee.com/jadehh_743/TVSpider/dist/index.js.md5
|
||||||
|
```
|
||||||
|
<font color="red">**改动**</font>
|
||||||
|
|
||||||
|
* quickjs改为nodejs,proxy设置修改
|
||||||
|
* 在ios上无法使用local,使用db替换local所有方法
|
||||||
|
* nodejs 的优势在于更加灵活
|
||||||
|
> 配置信息见dist分支
|
||||||
|
|
||||||
|
V1.1.2版本以下
|
||||||
|
```bash
|
||||||
|
gitee://Token@gitee.com/jadehh_743/TVSpider/js/open_config.json
|
||||||
|
```
|
||||||
|
> 配置信息见js分支分支
|
||||||
|
|
||||||
|
|
||||||
|
## config文件生成
|
||||||
|
```bash
|
||||||
|
python build.py --aliToken aliToken
|
||||||
|
```
|
||||||
|
> Token如果失效,需要重新获取阿里Token
|
||||||
|
>
|
||||||
|
> [阿里Token获取](https://alist.nn.ci/zh/guide/drivers/aliyundrive.html)
|
||||||
|
>
|
||||||
|
> nodejs 部分只生成代码,需要手动build,区分18+
|
||||||
|
|
||||||
|
## 遇到的问题
|
||||||
|
* 玩偶姐姐播放不了,需要切换VPN节点
|
||||||
|
* m3u8遇到跨域的问题可以尝试使用代理来进行加载,如果没有跨域使用代理会引起死循环
|
||||||
|
* 虎牙弹幕功能无法实现,现在并不支持WebSocket来监听弹幕
|
||||||
|
* SP360启用嗅探解析,CatVodOpen目前还不支持嗅探
|
||||||
|
* CatVodOpen Windows无法预览Jable和Doll图片,需要手动开启代理加载。
|
||||||
|
* TV影视暂不不支持哔哩哔哩DASH文件播放
|
||||||
|
|
||||||
|
|
||||||
|
## 特别说明
|
||||||
|
* 近期CatVodOpen更新移除了quickjs,导致无法使用,请尝试使用旧版本
|
||||||
|
* 或切换至nodejs目录下编译生成dist目录,dist目录发布到dist分支下
|
||||||
|
* main分支用于代码测试(不包含任何配置信息),js分支发布支持quickjs爬虫配置信息,dist分支发布支持nodejs爬虫配置信息
|
||||||
|
* 所有的配置信息都通过Github Actions发布,通过创建tag来生成新的配置信息并自动发布
|
||||||
|
* fork仓库时去掉仅复制main分支的✔,这样就可以fork所有的分支了
|
||||||
|
|
||||||
|
|
||||||
|
## 赞助
|
||||||
|
如果觉得此项目有用,可以考虑赞助我喝杯咖啡,感谢star❤
|
||||||
|
|
||||||
|
<img src="./resources/wechat.jpg" alt="微信" width="256" height="256" align="left" />
|
||||||
238
18/ds/18js/js/4kysxz.js
Normal file
238
18/ds/18js/js/4kysxz.js
Normal file
|
|
@ -0,0 +1,238 @@
|
||||||
|
/*
|
||||||
|
* @File : 4kysxz.js.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/24 16:47
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 4k高清网 (已失效)
|
||||||
|
*/
|
||||||
|
import {_} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
class YSXZSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://4kysxz.top"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return `4K高清网`
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return `🚄┃4K高清网┃🚄`
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "4kysxz"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
const cards = $('div.row.posts-wrapper >div > article > div.entry-media > div > a')
|
||||||
|
return _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['href'];
|
||||||
|
let name = $($(n).find('img')[0]).attr('alt').replaceAll('<strong>', '').replaceAll('</strong>', '').split(' ')[0];
|
||||||
|
let pic = $($(n).find('img')[0]).attr('data-src');
|
||||||
|
return {
|
||||||
|
vod_id: id, vod_name: name, vod_pic: pic, vod_remarks: '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
let vodElement = $("[class=\"entry-content u-text-format u-clearfix\"]")
|
||||||
|
let text = "";
|
||||||
|
for (const vodEle of vodElement) {
|
||||||
|
text = text + $(vodEle).text().replaceAll(":", ":") + "\n"
|
||||||
|
}
|
||||||
|
vodDetail.vod_name = $($("[class=\"article-title\"]")).text()
|
||||||
|
vodDetail.vod_pic = $($("[class=\"entry-content u-text-format u-clearfix\"]")).find("img")[0].attribs["src"]
|
||||||
|
vodDetail.vod_area = Utils.getStrByRegex(/上映地区(.*?)\n/, text).replaceAll(":", "")
|
||||||
|
vodDetail.vod_director = Utils.getStrByRegex(/导演(.*?)\n/, text).replaceAll(":", "")
|
||||||
|
vodDetail.vod_actor = Utils.getStrByRegex(/主演(.*?)\n/, text).replaceAll(":", "")
|
||||||
|
vodDetail.vod_content = Utils.getStrByRegex(/剧情简介(.*?)\n/, text).replaceAll(":", "").replaceAll("·", "")
|
||||||
|
let actors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(10) > div > span > span'), (n) => {
|
||||||
|
return $(n).text().split(' ')[0];
|
||||||
|
});
|
||||||
|
vodDetail.vod_actor = actors.join('/');
|
||||||
|
let directors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(6) > div > span'), (n) => {
|
||||||
|
return $(n).text().split(' ')[0];
|
||||||
|
});
|
||||||
|
vodDetail.vod_director = directors.join('/');
|
||||||
|
vodDetail.vod_name = $('div.site-content > section > div > header > h1').text().trim();
|
||||||
|
let playUrlStr = '';
|
||||||
|
let playFromStr = '';
|
||||||
|
//高清直播
|
||||||
|
const cards = $('div.entry-content.u-text-format.u-clearfix > custag > ul > li > a');
|
||||||
|
if (cards.length > 0) {
|
||||||
|
let playUrls = _.map(cards, (n) => {
|
||||||
|
let playUrl = n.attribs['href'];
|
||||||
|
if (playUrl.indexOf('url=') > 0) {
|
||||||
|
playUrl = playUrl.split('url=')[1].split('&name')[0];
|
||||||
|
}
|
||||||
|
return $(n).text() + '$' + playUrl;
|
||||||
|
});
|
||||||
|
playUrlStr = playUrls.join('#');
|
||||||
|
playFromStr = '高清直播';
|
||||||
|
}
|
||||||
|
if (!this.catOpenStatus) {
|
||||||
|
//磁力链接
|
||||||
|
const tbs = $('loginshow > table');
|
||||||
|
let playFrom = '';
|
||||||
|
let nameUrls = [];
|
||||||
|
for (let i = 0; i < tbs.length; i++) {
|
||||||
|
if (i % 2 == 0) {
|
||||||
|
playFrom = $(tbs[i]).find('tbody > tr >td').text().replaceAll('WEB', '磁力');
|
||||||
|
} else if (i % 2 == 1) {
|
||||||
|
const tds = $(tbs[i]).find('tbody > tr >td');
|
||||||
|
let nameUrl = '';
|
||||||
|
for (let j = 0; j < tds.length; j++) {
|
||||||
|
if (j % 2 == 0) {
|
||||||
|
nameUrl = $(tds[j]).text().split('.')[0].split(' ')[0];
|
||||||
|
} else if (j % 2 == 1) {
|
||||||
|
nameUrl = nameUrl + '$' + $(tds[j]).text().split('【')[0];
|
||||||
|
nameUrls.push(nameUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (playFromStr.length > 0) {
|
||||||
|
playFromStr += '$$$';
|
||||||
|
playUrlStr += '$$$';
|
||||||
|
}
|
||||||
|
playFromStr += playFrom;
|
||||||
|
playUrlStr += nameUrls.join('#');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = playFromStr
|
||||||
|
vodDetail.vod_play_url = playUrlStr
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = []
|
||||||
|
this.classes.push(this.getTypeDic("首页", "/#"))
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter(typeElements) {
|
||||||
|
let value_list = []
|
||||||
|
value_list.push({
|
||||||
|
"n": "全部", "v": "全部",
|
||||||
|
})
|
||||||
|
for (const typeElement of typeElements) {
|
||||||
|
value_list.push({
|
||||||
|
"n": typeElement.attribs["title"],
|
||||||
|
"v": typeElement.attribs["href"].split("/").slice(-1)[0].split(".")[0],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return [{"key": "1", "name": "类型", "value": value_list}]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let navElements = $("[class=\"navbar-item menu-item-has-children\"]")
|
||||||
|
let extent_list = []
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_name = $($(navElement).find("a")[0]).text()
|
||||||
|
if (type_name.indexOf("影视") > -1) {
|
||||||
|
let extend_dic = {"key": "1", "name": type_name, "value": []}
|
||||||
|
let type_elements = $($(navElement).find("ul")).find("a")
|
||||||
|
for (const type_element of type_elements) {
|
||||||
|
extend_dic["value"].push({"n": $(type_element).text(), "v": type_element.attribs["href"]})
|
||||||
|
}
|
||||||
|
extent_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.filterObj["/#"] = extent_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let url;
|
||||||
|
if (extend["1"] === undefined) {
|
||||||
|
url = this.siteUrl + tid
|
||||||
|
} else {
|
||||||
|
if (extend["1"].indexOf("category") > -1) {
|
||||||
|
url = this.siteUrl + extend["1"].split(".")[0] + "_" + pg + ".html"
|
||||||
|
} else {
|
||||||
|
url = this.siteUrl + extend["1"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
const $ = await this.getHtml(id);
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + '/search.php?q=' + wd)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new YSXZSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
299
18/ds/18js/js/aiyingshi.js
Normal file
299
18/ds/18js/js/aiyingshi.js
Normal file
|
|
@ -0,0 +1,299 @@
|
||||||
|
/*
|
||||||
|
* @Author: samples jadehh@live.com
|
||||||
|
* @Date: 2023-12-14 11:03:04
|
||||||
|
* @LastEditors: samples jadehh@live.com
|
||||||
|
* @LastEditTime: 2023-12-14 11:03:04
|
||||||
|
* @FilePath: js/aiyingshi.js
|
||||||
|
* @Description: 爱影视爬虫类
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
|
||||||
|
class AiYingShiSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = 'https://aiyingshis.com';
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🚀┃爱影视┃🚀"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "爱影视"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "aiyingshi"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let items = $('.module-item');
|
||||||
|
let vod_list = [];
|
||||||
|
for (const item of items) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let oneA = $(item).find('.module-item-cover .module-item-pic a').first();
|
||||||
|
vodShort.vod_id = oneA.attr('href');
|
||||||
|
vodShort.vod_name = oneA.attr('title');
|
||||||
|
let pic = $(item).find('.module-item-cover .module-item-pic img').first().attr('data-src')
|
||||||
|
if (pic.indexOf("img.php?url=") > 0) {
|
||||||
|
pic = pic.split("img.php?url=")[1]
|
||||||
|
}else if (pic.indexOf("https:") === -1 && pic.indexOf("http:") === -1){
|
||||||
|
pic = "https:" + pic
|
||||||
|
}
|
||||||
|
vodShort.vod_pic = pic
|
||||||
|
vodShort.vod_remarks = $(item).find('.module-item-text').first().text();
|
||||||
|
if (vodShort.vod_name !== undefined){
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = $('.page-title')[0].children[0].data
|
||||||
|
vodDetail.vod_pic = $($("[class=\"video-cover\"]")).find(".lazyload")[0].attribs["data-src"]
|
||||||
|
let video_info_list = $($(".video-info-aux")).text().replaceAll("\t","").split("\n")
|
||||||
|
let type_list = []
|
||||||
|
for (const video_info of video_info_list){
|
||||||
|
if (!_.isEmpty(video_info.replaceAll(" ","").replaceAll("/",""))){
|
||||||
|
type_list.push(video_info.replaceAll(" ","").replaceAll("/",""))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.type_name = type_list.slice(0,2).join("*")
|
||||||
|
let video_items = $("[class=\"video-info-items\"]")
|
||||||
|
vodDetail.vod_director = $(video_items[0]).find("a")[0].children[0].data
|
||||||
|
let vidoe_info_actor_list = $(video_items[1]).find("a")
|
||||||
|
let actor_list = []
|
||||||
|
for (const vidoe_info_actor of vidoe_info_actor_list) {
|
||||||
|
actor_list.push(vidoe_info_actor.children[0].data)
|
||||||
|
}
|
||||||
|
vodDetail.vod_actor = actor_list.join(" * ")
|
||||||
|
vodDetail.vod_year = type_list[2]
|
||||||
|
vodDetail.vod_remarks = $($(video_items[3]).find(".video-info-item")).text()
|
||||||
|
vodDetail.vod_content = $($(video_items[5]).find(".video-info-item")).text()
|
||||||
|
vodDetail.vod_area = type_list[3]
|
||||||
|
vodDetail.vod_content = vodDetail.vod_content.replace("[收起部分]", "").replace("[展开全部]", "").replaceAll("\t","").replaceAll("\n","")
|
||||||
|
|
||||||
|
let playElements = $($("[class=\"module-tab-content\"]")[0]).find("span")
|
||||||
|
let urlElements = $("[class=\"module-list module-player-list tab-list sort-list \"]")
|
||||||
|
let form_list = []
|
||||||
|
for (const playerElement of playElements){
|
||||||
|
form_list.push($(playerElement).text())
|
||||||
|
}
|
||||||
|
let play_url_list = []
|
||||||
|
for (const urlElement of urlElements){
|
||||||
|
let playUrlElements = $($(urlElement).find("[class=\"sort-item\"]")).find("a")
|
||||||
|
let vodItems = []
|
||||||
|
for (const playUrlElement of playUrlElements){
|
||||||
|
let name = $(playUrlElement).text()
|
||||||
|
let url = playUrlElement.attribs["href"]
|
||||||
|
let play_url = name + "$" + url
|
||||||
|
vodItems.push(play_url)
|
||||||
|
}
|
||||||
|
play_url_list.push(vodItems.join("#"))
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = form_list.join('$$$');
|
||||||
|
vodDetail.vod_play_url = _.values(play_url_list).join('$$$');
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let items = $('.module-search-item');
|
||||||
|
let vod_list = [];
|
||||||
|
for (const item of items) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = $(item).find(".video-serial")[0].attribs.href;
|
||||||
|
vodShort.vod_name = $(item).find(".video-serial")[0].attribs.title;
|
||||||
|
vodShort.vod_pic = $(item).find(".module-item-pic > img")[0].attribs['data-src']
|
||||||
|
vodShort.vod_remarks = '';
|
||||||
|
vod_list.push(vodShort);
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let con = await this.fetch(this.siteUrl, null, this.getHeader());
|
||||||
|
if (!_.isEmpty(con)) {
|
||||||
|
const $ = load(con);
|
||||||
|
let elements = $($("[class=\"nav-menu-items\"]")[0]).find("li")
|
||||||
|
for (const element of elements.slice(0,6)) {
|
||||||
|
let type_name = $($(element).find("span")).text()
|
||||||
|
if (type_name !== "首页"){
|
||||||
|
let type_id = $(element).find("a")[0].attribs["href"].split("/").slice(-1)[0].split(".")[0]
|
||||||
|
let type_dic = {"type_id": type_id, "type_name": type_name}
|
||||||
|
this.classes.push(type_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let elements = $("[class=\"scroll-content\"]").slice(1)
|
||||||
|
let extend_list = []
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
let extend_dic = {"key": (i + 1).toString(), "name": "", "value": []}
|
||||||
|
if (i < elements.length - 1) {
|
||||||
|
extend_dic["name"] = $($(elements[i]).find("a")[0]).text()
|
||||||
|
extend_dic["value"].push({"n": "全部", "v": "0"})
|
||||||
|
for (const ele of $(elements[i]).find("a").slice(1)) {
|
||||||
|
if ($($(elements[i]).find("a")[0]).text() === "全部类型"){
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v":ele.attribs["href"].split("/").slice(-1)[0].split(".")[0]})
|
||||||
|
}else{
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v":$(ele).text()})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
} else {
|
||||||
|
extend_dic["name"] = $($(elements[i]).find("a")[0]).text()
|
||||||
|
extend_dic["value"] = [{"n": "全部", "v": "0"}, {
|
||||||
|
"n": $($(elements[i]).find("a")[1]).text(),
|
||||||
|
"v": "hits"
|
||||||
|
}, {"n": $($(elements[i]).find("a")[2]).text(), "v": "score"}]
|
||||||
|
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const type_dic of this.classes) {
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
if (type_id !== "/" && type_id !== "最近更新") {
|
||||||
|
let url = this.siteUrl + `/vodshow/id/${type_id}.html`
|
||||||
|
let html = await this.fetch(url, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async setHomeVod() {
|
||||||
|
let con = await this.fetch(this.siteUrl, null, this.getHeader());
|
||||||
|
if (!_.isEmpty(con)) {
|
||||||
|
const $ = load(con);
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getExtend(value,defaultvalue,key = ""){
|
||||||
|
if (value !== undefined && value !== "0"){
|
||||||
|
return key + value
|
||||||
|
}else{
|
||||||
|
return defaultvalue
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCateUrl(tid,pg,extend){
|
||||||
|
tid = this.getExtend(extend["1"],tid)
|
||||||
|
let area = this.getExtend(extend["2"],"","/area/")
|
||||||
|
let lanuage = this.getExtend(extend["3"],"","/lang/")
|
||||||
|
let year = this.getExtend(extend["4"],"","/year/")
|
||||||
|
let letter = this.getExtend(extend["5"],"","/letter/")
|
||||||
|
let time = this.getExtend(extend['6'],"","/by/")
|
||||||
|
return this.siteUrl + `/vodshow${time}${area}/id/${tid}${lanuage}${letter}${year}/page/${pg}.html`
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let reqUrl = await this.getCateUrl(tid,pg,extend)
|
||||||
|
let html = await this.fetch(reqUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
let total = Utils.getStrByRegex(/\$\("\.mac_total"\)\.text\('(\d+)'\)/, html)
|
||||||
|
this.limit = 72;
|
||||||
|
if (total.length > 0) {
|
||||||
|
this.total = parseInt(total)
|
||||||
|
}
|
||||||
|
if (this.total <= this.limit) {
|
||||||
|
this.count = 1
|
||||||
|
} else {
|
||||||
|
this.count = Math.ceil(this.total / this.limit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let detailUrl = this.siteUrl + id;
|
||||||
|
let html = await this.fetch(detailUrl, null, this.getHeader());
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let html = await this.fetch(this.siteUrl + id,null,this.getHeader())
|
||||||
|
if (!_.isEmpty(html)){
|
||||||
|
let player_str = Utils.getStrByRegex(/<script type="text\/javascript">var player_aaaa=(.*?)<\/script>/,html)
|
||||||
|
let play_dic = JSON.parse(player_str)
|
||||||
|
this.playUrl = play_dic["url"]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let searchUrl = this.siteUrl + `/vodsearch/wd/${wd}.html`
|
||||||
|
let html = await this.fetch(searchUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new AiYingShiSpider()
|
||||||
|
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,proxy:proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
230
18/ds/18js/js/alipansou.js
Normal file
230
18/ds/18js/js/alipansou.js
Normal file
|
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
* @File : alipansou.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/18 13:20
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 猫狸盘搜
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {_, load} from "../lib/cat.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {detailContent, initAli, playContent} from "../lib/ali.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
class GitCafeSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.alipansou.com"
|
||||||
|
}
|
||||||
|
getSearchHeader(id) {
|
||||||
|
let headers = this.getHeader()
|
||||||
|
headers["Referer"] = id
|
||||||
|
headers["Postman-Token"] = "5f1bb291-ce30-44c7-8885-6db1f3a50785"
|
||||||
|
headers["Host"] = "www.alipansou.com"
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "😸┃阿里猫狸┃😸"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "阿里猫狸"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "alipansou"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
|
||||||
|
return {
|
||||||
|
"User-Agent":Utils.CHROME,
|
||||||
|
"Connection": "keep-alive",
|
||||||
|
"Cookie":"_ga=GA1.1.1506025676.1708225506;FCNEC=%5B%5B%22AKsRol9sCpH4JteOAAMprJLQxCHddrtkOFinxqt1cs8x3fKzbBZ5Ll76VvjATz1Ejf6NoayGSONFl2gfn6PbVAG97MlHjhp6cY5NFLQtLIUy0TuzI1_ThHnANe8fW03fHdU2-cx5yM3MftaHt4awEGBWhgtE9H_P5w%3D%3D%22%5D%5D;_cc_id=cc82bd83ea8936df45fe63c887a6f221;mysession=MTcwOTYyMjMxMHxEdi1CQkFFQ180SUFBUkFCRUFBQU1fLUNBQUVHYzNSeWFXNW5EQXdBQ25ObFlYSmphRjlyWlhrR2MzUnlhVzVuREJFQUQtV1JxT1draE9tWnBPUzRpZVd1c3c9PXyjHmLCdFvUlsW_gilBojjCq1ak-ffOud6aZKm3kxzJ4w==;Hm_lvt_02f69e0ba673e328ef49b5fb98dd4601=1708225506,1709622301,1710414091;_bid=28d3966abb8cf873ea912b715552f587;cf_clearance=6LuYs83fWIZlcwwzZkgRyYyFrP6Hndxe_CgByMe.pMs-1710414092-1.0.1.1-V44M.u7MNIozBytYixxp4Qe1OVr.CBH78.IEK2QJTWGQ7.HQBR0DoUgiSfpa23U.nxtOfhkrASpqogvz53knnw;cto_bundle=-WbYyl9VWGZjQkhzZ0gyQjE4VXNlcTJnYTNaV3dMaTdVV0xST3p5RkVnUTNxVWpxYVElMkZtNnVsaWtQSzdQU3JJY0slMkYxc3R5SXdyQlRzbkp1clVNZk84OElTR2MlMkJPeGx0bGtsUHk2VzhGdk1yYyUyRnB5eUNNblhKbWpzcjY1SVI1ODlWRGZXemgzUU51bGF5UWxFNVljcUZpd252bnVZZ1R1d0VXRmJ3S1FXQ1RCMXhVNCUzRA;Hm_lpvt_02f69e0ba673e328ef49b5fb98dd4601=1710416656;_ga_NYNC791BP2=GS1.1.1710414091.2.1.1710416656.0.0.0;_ga_0B2NFC7Z09=GS1.1.1710414091.2.1.1710416656.60.0.0;_egg=16a87a4666714be885e814217b225d50e"}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getContentHtml() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
return load(html)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit() {
|
||||||
|
this.content_html = await this.getContentHtml()
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await this.spiderInit()
|
||||||
|
await super.init(cfg);
|
||||||
|
await initAli(this.cfgObj["token"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseClassFromDoc($) {
|
||||||
|
let tap_elemets = $($("[id=\"app\"]")[0]).find("van-tab")
|
||||||
|
let index = 0
|
||||||
|
for (const tap_element of tap_elemets) {
|
||||||
|
let type_name = tap_element.attribs["title"]
|
||||||
|
if (type_name.indexOf("热搜") === -1 && type_name !== "游戏" && type_name !== "小说") {
|
||||||
|
this.classes.push({"type_name": type_name, "type_id": index})
|
||||||
|
}
|
||||||
|
index = index + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc(doc) {
|
||||||
|
let vod_list = []
|
||||||
|
let elements = this.content_html(doc).find("a")
|
||||||
|
for (const element of elements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = element.attribs["href"]
|
||||||
|
vodShort.vod_name = this.content_html(element).text().split(".").slice(-1)[0]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAliUrl(id) {
|
||||||
|
let url = this.siteUrl + id.replace("/s/", "/cv/")
|
||||||
|
let headers = this.getSearchHeader(url)
|
||||||
|
let content = await req(url,{postType:"get",headers:headers,redirect:2})
|
||||||
|
await this.jadeLog.debug(`回复内容为:${JSON.stringify(content)}`)
|
||||||
|
// let url = await this.fetch(this.siteUrl + id.replace("/s/", "/cv/"), null, headers, true)
|
||||||
|
return content.headers.location
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
vodDetail.vod_name = obj["name"]
|
||||||
|
vodDetail.vod_remarks = obj["remarks"]
|
||||||
|
let ali_url = await this.getAliUrl(obj["id"])
|
||||||
|
await this.jadeLog.debug(`阿里分享链接为:${ali_url}`)
|
||||||
|
if (!_.isEmpty(ali_url)) {
|
||||||
|
let aliVodDetail = await detailContent([ali_url])
|
||||||
|
vodDetail.vod_play_url = aliVodDetail.vod_play_url
|
||||||
|
vodDetail.vod_play_from = aliVodDetail.vod_play_from
|
||||||
|
}
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let elements = $($($("[id=\"app\"]")[0]).find("van-row")).find("a")
|
||||||
|
let vod_list = []
|
||||||
|
for (const element of elements) {
|
||||||
|
let id = element.attribs["href"]
|
||||||
|
let matches = id.match(/(\/s\/[^"])/);
|
||||||
|
if (!_.isEmpty(matches) && id.indexOf("https") === -1) {
|
||||||
|
let text = $(element).text().replaceAll("\n", "").replaceAll(" ", "")
|
||||||
|
if (text.indexOf("时间") > -1 && text.indexOf("文件夹") > -1) {
|
||||||
|
let textList = text.split("时间")
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_name = textList[0]
|
||||||
|
vodShort.vod_remarks = textList[1].split("格式")[0].replaceAll(":", "").replaceAll(" ", "").replaceAll("", "").replaceAll(" ", "")
|
||||||
|
vodShort.vod_id = JSON.stringify({
|
||||||
|
"name": vodShort.vod_name, "remarks": vodShort.vod_remarks, "id": id
|
||||||
|
})
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
await this.parseClassFromDoc(this.content_html)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let tap_elemets = this.content_html(this.content_html("[id=\"app\"]")[0]).find("van-tab")
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc(tap_elemets[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
if (id.indexOf("search") > -1) {
|
||||||
|
let url = this.siteUrl + "/search"
|
||||||
|
let params = {"k":decodeURIComponent(id.split("search?k=").slice(-1)[0]) }
|
||||||
|
let html = await this.fetch(url, params, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
let vod_list = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
if (vod_list.length > 0) {
|
||||||
|
id = vod_list[0]["vod_id"]
|
||||||
|
} else {
|
||||||
|
id = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!_.isEmpty(id)) {
|
||||||
|
let json_content = JSON.parse(id)
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(json_content)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let tap_elemets = this.content_html(this.content_html("[id=\"app\"]")[0]).find("van-tab")
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc(tap_elemets[parseInt(tid)])
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let url = this.siteUrl + "/search"
|
||||||
|
let params = {"k": wd}
|
||||||
|
let html = await this.fetch(url, params, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let playObjStr = await playContent(flag, id, flags);
|
||||||
|
this.playUrl = JSON.parse(playObjStr)["url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new GitCafeSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
226
18/ds/18js/js/aliyunpanshare.js
Normal file
226
18/ds/18js/js/aliyunpanshare.js
Normal file
|
|
@ -0,0 +1,226 @@
|
||||||
|
/*
|
||||||
|
* @File : aliyunpanshare.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/26 13:06
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 阿里云盘分享
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import {detailContent, initAli, playContent} from "../lib/ali.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {patternAli} from "../lib/utils.js";
|
||||||
|
|
||||||
|
let remark_list = ["4k", "4K"]
|
||||||
|
|
||||||
|
class AliyunpanShare extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = 'https://www.alypw.com';
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await initAli(this.cfgObj["token"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🥏┃阿里云盘分享┃🥏"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "阿里云盘分享"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "aliyunpanshare"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getRemarks(name, title) {
|
||||||
|
if (_.isEmpty(name)) {
|
||||||
|
for (const remark of remark_list) {
|
||||||
|
if (title.indexOf(remark) > -1) {
|
||||||
|
return remark
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parseVodName(name) {
|
||||||
|
let vod_name = Utils.getStrByRegex(/\[阿里云盘](.*?) /, name)
|
||||||
|
if (name.indexOf("合集") > -1) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if (_.isEmpty(vod_name)) {
|
||||||
|
vod_name = Utils.getStrByRegex(/\[阿里云盘](.*?)(/, name)
|
||||||
|
}
|
||||||
|
if (vod_name.indexOf("[") > -1) {
|
||||||
|
vod_name = vod_name.split("[")[0]
|
||||||
|
}
|
||||||
|
if (vod_name.indexOf("【") > -1) {
|
||||||
|
vod_name = vod_name.split("【")[0]
|
||||||
|
}
|
||||||
|
if (vod_name === "4K") {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return vod_name
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $($("[class=\"hometab\"]").find("[class=\"box\"]")).find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let ele = $(vodElement).find("[class=\"imgr\"]")[0]
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = $(ele).find("a")[0].attribs["href"]
|
||||||
|
let name = $(ele).find("a")[0].attribs["title"]
|
||||||
|
vodShort.vod_name = this.parseVodName(name)
|
||||||
|
vodShort.vod_pic = $(vodElement).find("img")[0].attribs["src"]
|
||||||
|
vodShort.vod_remarks = this.getRemarks(Utils.getStrByRegex(/【(.*?)】/, name), name)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let mainElement = $("[class=\"main container\"]")
|
||||||
|
let vodElements = $($(mainElement).find("[class=\"list\"]")).find("li")
|
||||||
|
if (vodElements.length === 0) {
|
||||||
|
vodElements = $(mainElement).find("li")
|
||||||
|
}
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let name = $(vodElement).find("img")[0].attribs["alt"].replaceAll("<strong>", "").replaceAll("</strong>", "")
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = $(vodElement).find("a")[0].attribs["href"]
|
||||||
|
vodShort.vod_name = this.parseVodName(name)
|
||||||
|
vodShort.vod_pic = $(vodElement).find("img")[0].attribs["src"]
|
||||||
|
vodShort.vod_remarks = this.getRemarks(Utils.getStrByRegex(/【(.*?)】/, name), name)
|
||||||
|
if (!_.isEmpty(vodShort.vod_name)) {
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let mainElements = $("[class=\"mainl\"]")
|
||||||
|
let name = $($(mainElements).find("[class=\"title\"]")[0]).text()
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
vodDetail.vod_name = Utils.getStrByRegex(/\[阿里云盘](.*?) /, name)
|
||||||
|
vodDetail.vod_remarks = this.getRemarks(Utils.getStrByRegex(/【(.*?)】/, name), name)
|
||||||
|
let articleElement = $(mainElements).find("[class=\"article_content\"]")
|
||||||
|
vodDetail.vod_pic = $(articleElement).find("p>img")[0].attribs["src"]
|
||||||
|
let articleElements = $(articleElement).find("p")
|
||||||
|
let articleContent = ""
|
||||||
|
for (const articleEle of articleElements) {
|
||||||
|
articleContent = articleContent + $(articleEle).text() + "\n"
|
||||||
|
}
|
||||||
|
let share_ali_url_list = []
|
||||||
|
let share_url_list = Utils.getStrByRegex(Utils.patternAli, articleContent).split("\n")
|
||||||
|
for (const share_url of share_url_list) {
|
||||||
|
let matches = share_url.match(Utils.patternAli);
|
||||||
|
if (!_.isEmpty(matches)) share_ali_url_list.push(matches[1])
|
||||||
|
}
|
||||||
|
let aliVodDetail = await detailContent(share_ali_url_list)
|
||||||
|
vodDetail.vod_play_url = aliVodDetail.vod_play_url
|
||||||
|
vodDetail.vod_play_from = aliVodDetail.vod_play_from
|
||||||
|
vodDetail.type_name = Utils.getStrByRegex(/标签(.*?)\n/, articleContent).replaceAll(":", "")
|
||||||
|
vodDetail.vod_content = Utils.getStrByRegex(/描述(.*?)\n/, articleContent).replaceAll(":", "")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let typeElements = $("[id^='navbar-category']").find("a")
|
||||||
|
let key_list = ["影", "剧", "4K", "视", "音", "演", "动漫"]
|
||||||
|
for (const typeElement of typeElements) {
|
||||||
|
let type_name = $(typeElement).text()
|
||||||
|
let type_id = typeElement.attribs["href"]
|
||||||
|
let is_show = false
|
||||||
|
for (const key of key_list) {
|
||||||
|
if (type_name.indexOf(key) > -1) {
|
||||||
|
is_show = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_show) {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let cateUrl = tid.split(".html")[0] + "_" + pg + ".html"
|
||||||
|
let $ = await this.getHtml(cateUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let playObjStr = await playContent(flag, id, flags);
|
||||||
|
this.playUrl = JSON.parse(playObjStr)["url"]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let url = this.siteUrl + `/search.php?q=${wd}`
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new AliyunpanShare()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
183
18/ds/18js/js/asianx.js
Normal file
183
18/ds/18js/js/asianx.js
Normal file
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* @Author: samples jadehh@live.com
|
||||||
|
* @Date: 2023-12-14 11:03:04
|
||||||
|
* @LastEditors: samples jadehh@live.com
|
||||||
|
* @LastEditTime: 2023-12-14 11:03:04
|
||||||
|
* @FilePath: js/asianx.js
|
||||||
|
* @Description: asianx
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {Crypto, _, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
class AsianXSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://cn.asianx.tube/"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃海外宅┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "海外宅"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "asianx"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let navElements = $($("[class=\"menu m-0 mb-2 mb-lg-0\"]")).find("a").slice(6)
|
||||||
|
let extend_dic = {"key": "1", "name": "分类", "value": [{"n": "全部", "v": "全部"}]}
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_name = $($(navElement).find("span")).text()
|
||||||
|
let type_id = navElement.attribs["href"]
|
||||||
|
extend_dic["value"].push({"n": type_name, "v": type_id})
|
||||||
|
}
|
||||||
|
return [extend_dic]
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($,is_home=false) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodShortElements;
|
||||||
|
if (is_home){
|
||||||
|
vodShortElements = $($("[class=\"gal-box\"]")).slice(12)
|
||||||
|
}else{
|
||||||
|
vodShortElements = $($("[class=\"gal-box\"]"))
|
||||||
|
}
|
||||||
|
for (const vodShortElement of vodShortElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let vodElements = $(vodShortElement).find("a")
|
||||||
|
vodShort.vod_id = vodElements[0].attribs["href"]
|
||||||
|
vodShort.vod_pic = $(vodElements[0]).find("img")[0].attribs["data-src"]
|
||||||
|
vodShort.vod_name = vodElements[1].attribs["title"]
|
||||||
|
vodShort.vod_remarks = $($(vodShortElement).find("[class=\"meta text-muted text-truncate\"]")).text()
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc(html) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
let content = Utils.getStrByRegex(/<script type="application\/ld\+json">(.*?)<\/script>/,html)
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let textList = content_json["name"].split(" ")
|
||||||
|
vodDetail.vod_name = textList[0]
|
||||||
|
vodDetail.vod_play_from = ["未加密线路","加密线路"].join("$$$")
|
||||||
|
let playUrl1 = content_json["contentUrl"]
|
||||||
|
let playUrl2 = content_json["embedUrl"]
|
||||||
|
vodDetail.vod_play_url = [`${textList[0]}$${playUrl1}`,`${textList[0]}$${playUrl2}`].join("$$$")
|
||||||
|
vodDetail.vod_remarks = content_json["uploadDate"]
|
||||||
|
vodDetail.vod_content = content_json["description"]
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = []
|
||||||
|
this.classes.push({"type_name": "首页", "type_id": "/"})
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
let navElements = $($("[class=\"menu m-0 mb-2 mb-lg-0\"]")).find("a").slice(0, 5)
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_name = $($(navElement).find("span")).text()
|
||||||
|
let type_id = navElement.attribs["href"]
|
||||||
|
this.classes.push({"type_name": type_name, "type_id": type_id})
|
||||||
|
}
|
||||||
|
this.filterObj[this.classes[0].type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($,true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getExtend(pg,extend){
|
||||||
|
if (extend["1"] !== undefined){
|
||||||
|
if (extend["1"] === "全部"){
|
||||||
|
return this.siteUrl
|
||||||
|
}else{
|
||||||
|
return this.siteUrl + extend["1"] + "/" + pg
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
return this.siteUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let html = await this.fetch(id,null,this.getHeader())
|
||||||
|
if (!_.isEmpty(html)){
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc(html)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let url;
|
||||||
|
if (tid === "/") {
|
||||||
|
url = this.getExtend(pg,extend)
|
||||||
|
} else {
|
||||||
|
url = this.siteUrl + tid + "/" + pg
|
||||||
|
}
|
||||||
|
let html = await this.fetch(url, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($,false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new AsianXSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
258
18/ds/18js/js/audiomack.js
Normal file
258
18/ds/18js/js/audiomack.js
Normal file
|
|
@ -0,0 +1,258 @@
|
||||||
|
/*
|
||||||
|
* @File : audiomack.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/31 15:56
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 音乐之声
|
||||||
|
*/
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {BookShort} from "../lib/book.js";
|
||||||
|
import {Crypto} from "../lib/cat.js";
|
||||||
|
|
||||||
|
function u(e) {
|
||||||
|
(this._parameters = {}), this._loadParameters(e || {});
|
||||||
|
}
|
||||||
|
|
||||||
|
u.prototype = {
|
||||||
|
_loadParameters: function (e) {
|
||||||
|
e instanceof Array ? this._loadParametersFromArray(e) : "object" == typeof e && this._loadParametersFromObject(e);
|
||||||
|
}, _loadParametersFromArray: function (e) {
|
||||||
|
var n;
|
||||||
|
for (n = 0; n < e.length; n++) this._loadParametersFromObject(e[n]);
|
||||||
|
}, _loadParametersFromObject: function (e) {
|
||||||
|
var n;
|
||||||
|
for (n in e) if (e.hasOwnProperty(n)) {
|
||||||
|
var r = this._getStringFromParameter(e[n]);
|
||||||
|
this._loadParameterValue(n, r);
|
||||||
|
}
|
||||||
|
}, _loadParameterValue: function (e, n) {
|
||||||
|
var r;
|
||||||
|
if (n instanceof Array) {
|
||||||
|
for (r = 0; r < n.length; r++) {
|
||||||
|
var i = this._getStringFromParameter(n[r]);
|
||||||
|
this._addParameter(e, i);
|
||||||
|
}
|
||||||
|
0 == n.length && this._addParameter(e, "");
|
||||||
|
} else this._addParameter(e, n);
|
||||||
|
}, _getStringFromParameter: function (e) {
|
||||||
|
var n = e || "";
|
||||||
|
try {
|
||||||
|
("number" == typeof e || "boolean" == typeof e) && (n = e.toString());
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}, _addParameter: function (e, n) {
|
||||||
|
this._parameters[e] || (this._parameters[e] = []), this._parameters[e].push(n);
|
||||||
|
}, get: function () {
|
||||||
|
return this._parameters;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function _decode(e) {
|
||||||
|
return e ? decodeURIComponent(e) : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNormalizedParams(parameters) {
|
||||||
|
const sortedKeys = [];
|
||||||
|
const normalizedParameters = [];
|
||||||
|
for (let e in parameters) {
|
||||||
|
sortedKeys.push(_encode(e));
|
||||||
|
}
|
||||||
|
sortedKeys.sort();
|
||||||
|
for (let idx = 0; idx < sortedKeys.length; idx++) {
|
||||||
|
const e = sortedKeys[idx];
|
||||||
|
var n, r, i = _decode(e), a = parameters[i];
|
||||||
|
for (a.sort(), n = 0; n < a.length; n++) (r = _encode(a[n])), normalizedParameters.push(e + "=" + r);
|
||||||
|
}
|
||||||
|
return normalizedParameters.join("&");
|
||||||
|
}
|
||||||
|
|
||||||
|
function nonce(e = 10) {
|
||||||
|
let n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", r = "";
|
||||||
|
for (let i = 0; i < e; i++) r += n.charAt(Math.floor(Math.random() * n.length));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _encode(e) {
|
||||||
|
return e ? encodeURIComponent(e)
|
||||||
|
.replace(/[!'()]/g, escape)
|
||||||
|
.replace(/\*/g, "%2A") : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignature(method, urlPath, params, secret = "f3ac5b086f3eab260520d8e3049561e6") {
|
||||||
|
urlPath = urlPath.split("?")[0];
|
||||||
|
urlPath = urlPath.startsWith("http") ? urlPath : "https://api.audiomack.com/v1" + urlPath;
|
||||||
|
const r = new u(params).get();
|
||||||
|
const httpMethod = method.toUpperCase();
|
||||||
|
const normdParams = getNormalizedParams(r);
|
||||||
|
const l = _encode(httpMethod) + "&" + _encode(urlPath) + "&" + _encode(normdParams);
|
||||||
|
return Crypto.HmacSHA1(l, secret + "&").toString(Crypto.enc.Base64);
|
||||||
|
}
|
||||||
|
|
||||||
|
class AudioMackSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://api.audiomack.com/v1";
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🎵┃音声┃🎵"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "音声"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "audiomack"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let books = []
|
||||||
|
for (const data of obj["results"]["playlists"]) {
|
||||||
|
let bookShort = new BookShort()
|
||||||
|
bookShort.book_id = data["id"]
|
||||||
|
bookShort.book_pic = data["image"]
|
||||||
|
bookShort.book_name = data["title"]
|
||||||
|
bookShort.book_remarks = data["description"]
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = [{"type_name": "推荐榜单", "type_id": "最近更新"}]
|
||||||
|
const genres = [{
|
||||||
|
title: "All Genres", url_slug: "null",
|
||||||
|
}, {
|
||||||
|
title: "Afrosounds", url_slug: "afrobeats",
|
||||||
|
}, {
|
||||||
|
title: "Hip-Hop/Rap", url_slug: "rap",
|
||||||
|
}, {
|
||||||
|
title: "Latin", url_slug: "latin",
|
||||||
|
}, {
|
||||||
|
title: "Caribbean", url_slug: "caribbean",
|
||||||
|
}, {
|
||||||
|
title: "Pop", url_slug: "pop",
|
||||||
|
}, {
|
||||||
|
title: "R&B", url_slug: "rb",
|
||||||
|
}, {
|
||||||
|
title: "Gospel", url_slug: "gospel",
|
||||||
|
}, {
|
||||||
|
title: "Electronic", url_slug: "electronic",
|
||||||
|
}, {
|
||||||
|
title: "Rock", url_slug: "rock",
|
||||||
|
}, {
|
||||||
|
title: "Punjabi", url_slug: "punjabi",
|
||||||
|
}, {
|
||||||
|
title: "Country", url_slug: "country",
|
||||||
|
}, {
|
||||||
|
title: "Instrumental", url_slug: "instrumental",
|
||||||
|
}, {
|
||||||
|
title: "Podcast", url_slug: "podcast",
|
||||||
|
},];
|
||||||
|
for (const genre of genres) {
|
||||||
|
this.classes.push(this.getTypeDic(genre["title"], genre["url_slug"]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 推荐歌单
|
||||||
|
* */
|
||||||
|
async setHomeVod() {
|
||||||
|
let tag = {id: "34", title: "What's New", url_slug: "whats-new"};
|
||||||
|
const params = {
|
||||||
|
featured: "yes",
|
||||||
|
limit: 20,
|
||||||
|
oauth_consumer_key: "audiomack-js",
|
||||||
|
oauth_nonce: nonce(32),
|
||||||
|
oauth_signature_method: "HMAC-SHA1",
|
||||||
|
oauth_timestamp: Math.round(Date.now() / 1e3),
|
||||||
|
oauth_version: "1.0",
|
||||||
|
page: 1,
|
||||||
|
slug: tag.url_slug,
|
||||||
|
};
|
||||||
|
const oauth_signature = getSignature("GET", "/playlist/categories", params);
|
||||||
|
let url = this.siteUrl + "/playlist/categories"
|
||||||
|
let content = await this.fetch(url, Object.assign(Object.assign({}, params), {oauth_signature}), this.getHeader());
|
||||||
|
this.homeVodList = await this.parseVodShortListFromJson(JSON.parse(content))
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let partialUrl;
|
||||||
|
if (tid === "null"){
|
||||||
|
partialUrl = `/music/page/${pg}`;
|
||||||
|
}else{
|
||||||
|
partialUrl = `/music/${tid}/page/${pg}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = `https://api.audiomack.com/v1${partialUrl}`;
|
||||||
|
const params = {
|
||||||
|
oauth_consumer_key: "audiomack-js",
|
||||||
|
oauth_nonce: nonce(32),
|
||||||
|
oauth_signature_method: "HMAC-SHA1",
|
||||||
|
oauth_timestamp: Math.round(Date.now() / 1e3),
|
||||||
|
oauth_version: "1.0",
|
||||||
|
type: "song",
|
||||||
|
};
|
||||||
|
const oauth_signature = getSignature("GET", partialUrl, params);
|
||||||
|
const results = await this.fetch(url, Object.assign(Object.assign({}, params), {oauth_signature}),this.getHeader())
|
||||||
|
|
||||||
|
let x = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new AudioMackSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
85
18/ds/18js/js/base_spider.js
Normal file
85
18/ds/18js/js/base_spider.js
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* @File : base_spider.js.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/4 14:13
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {JadeLogging} from "../lib/log.js";
|
||||||
|
import {Result, SpiderInit} from "../lib/spider_object.js";
|
||||||
|
const JadeLog = new JadeLogging(getAppName(), "DEBUG")
|
||||||
|
let result = new Result()
|
||||||
|
let CatOpenStatus = false
|
||||||
|
|
||||||
|
function getName() {
|
||||||
|
return `🍥┃基础┃🍥`
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAppName() {
|
||||||
|
return `基础`
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
let obj = await SpiderInit(cfg)
|
||||||
|
CatOpenStatus = obj.CatOpenStatus
|
||||||
|
// 读取缓存
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
await JadeLog.info("正在解析首页类别", true)
|
||||||
|
try{
|
||||||
|
await JadeLog.debug(`首页类别内容为:${result.home()}`)
|
||||||
|
await JadeLog.info("首页类别解析完成", true)
|
||||||
|
return result.homeVod()
|
||||||
|
}catch (e){
|
||||||
|
await this.jadeLog.error(`首页内容解析失败,失败原因为:{e}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
let vod_list = []
|
||||||
|
if (!CatOpenStatus) {
|
||||||
|
await JadeLog.info("正在解析首页内容")
|
||||||
|
}
|
||||||
|
await JadeLog.debug(`首页内容为:${JSON.stringify({"list": vod_list})}`)
|
||||||
|
return JSON.stringify({"list": vod_list})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
let url = ""
|
||||||
|
await JadeLog.info(`正在解析分类页面,tid = ${tid},pg = ${pg},filter = ${filter},extend = ${JSON.stringify(extend)},url = ${url}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return JSON.stringify({})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
|
||||||
|
return JSON.stringify({});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
let url = ""
|
||||||
|
await JadeLog.info(`正在解析搜索页面,关键词为 = ${wd},quick = ${quick},url = ${url}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
564
18/ds/18js/js/bilibili.js
Normal file
564
18/ds/18js/js/bilibili.js
Normal file
|
|
@ -0,0 +1,564 @@
|
||||||
|
/*
|
||||||
|
* @File : bilibili.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/4/3 9:27
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 哔哩哔哩
|
||||||
|
*/
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Crypto, _, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
|
||||||
|
class BilibiliSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.bilibili.com"
|
||||||
|
this.apiUrl = "https://api.bilibili.com"
|
||||||
|
this.cookie = ""
|
||||||
|
this.bili_jct = '';
|
||||||
|
this.is_login = false
|
||||||
|
this.is_vip = false
|
||||||
|
this.vod_audio_id = {
|
||||||
|
30280: 192000,
|
||||||
|
30232: 132000,
|
||||||
|
30216: 64000,
|
||||||
|
};
|
||||||
|
this.vod_codec = {
|
||||||
|
// 13: 'AV1',
|
||||||
|
12: 'HEVC',
|
||||||
|
7: 'AVC',
|
||||||
|
};
|
||||||
|
|
||||||
|
this.play_url_obj = {
|
||||||
|
80: "1080P 高清",
|
||||||
|
64: "720P 高清",
|
||||||
|
32: "420P 清晰",
|
||||||
|
16: "360P 流畅"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
const headers = super.getHeader();
|
||||||
|
if (!_.isEmpty(this.cookie)) {
|
||||||
|
headers["cookie"] = this.cookie;
|
||||||
|
}
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
initCookie(cookie) {
|
||||||
|
this.cookie = cookie
|
||||||
|
if (cookie.includes('bili_jct')) {
|
||||||
|
this.bili_jct = cookie.split('bili_jct=')[1].split(";")[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(Req) {
|
||||||
|
this.is_login = await this.checkLogin()
|
||||||
|
if (this.is_login) {
|
||||||
|
await this.jadeLog.info("哔哩哔哩登录成功", true)
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.error("哔哩哔哩登录失败", true)
|
||||||
|
}
|
||||||
|
if (Req === null) {
|
||||||
|
// dash mpd 代理
|
||||||
|
this.js2Base = await js2Proxy(true, this.siteType, this.siteKey, 'dash/', this.getHeader());
|
||||||
|
} else {
|
||||||
|
this.js2Base = await js2Proxy(Req, "dash", this.getHeader());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.initCookie(this.cfgObj["cookie"])
|
||||||
|
await this.spiderInit(null)
|
||||||
|
this.danmuStaus = true
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🏰┃哔哩哔哩┃🏰"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "哔哩哔哩"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "bilibili"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
let navElements = $("[class=\"channel-items__left\"]").find("a")
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
this.classes.push(this.getTypeDic($(navElement).text(), $(navElement).text()))
|
||||||
|
}
|
||||||
|
if (!_.isEmpty(this.bili_jct)) {
|
||||||
|
this.classes.push(this.getTypeDic("历史记录", "历史记录"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
key: 'order',
|
||||||
|
name: '排序',
|
||||||
|
value: [
|
||||||
|
{n: '综合排序', v: '0'},
|
||||||
|
{n: '最多点击', v: 'click'},
|
||||||
|
{n: '最新发布', v: 'pubdate'},
|
||||||
|
{n: '最多弹幕', v: 'dm'},
|
||||||
|
{n: '最多收藏', v: 'stow'},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'duration',
|
||||||
|
name: '时长',
|
||||||
|
value: [
|
||||||
|
{n: '全部时长', v: '0'},
|
||||||
|
{n: '60分钟以上', v: '4'},
|
||||||
|
{n: '30~60分钟', v: '3'},
|
||||||
|
{n: '10~30分钟', v: '2'},
|
||||||
|
{n: '10分钟以下', v: '1'},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const typeDic of this.classes) {
|
||||||
|
let type_id = typeDic["type_name"]
|
||||||
|
if (type_id !== "最近更新" && type_id !== "历史记录") {
|
||||||
|
this.filterObj[type_id] = await this.getFilter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getFullTime(numberSec) {
|
||||||
|
let totalSeconds = '';
|
||||||
|
try {
|
||||||
|
let timeParts = numberSec.split(":");
|
||||||
|
let min = parseInt(timeParts[0]);
|
||||||
|
let sec = parseInt(timeParts[1]);
|
||||||
|
totalSeconds = min * 60 + sec;
|
||||||
|
} catch (e) {
|
||||||
|
totalSeconds = parseInt(numberSec);
|
||||||
|
}
|
||||||
|
if (isNaN(totalSeconds)) {
|
||||||
|
return '无效输入';
|
||||||
|
}
|
||||||
|
if (totalSeconds >= 3600) {
|
||||||
|
const hours = Math.floor(totalSeconds / 3600);
|
||||||
|
const remainingSecondsAfterHours = totalSeconds % 3600;
|
||||||
|
const minutes = Math.floor(remainingSecondsAfterHours / 60);
|
||||||
|
const seconds = remainingSecondsAfterHours % 60;
|
||||||
|
return `${hours}小时 ${minutes}分钟 ${seconds}秒`;
|
||||||
|
} else {
|
||||||
|
const minutes = Math.floor(totalSeconds / 60);
|
||||||
|
const seconds = totalSeconds % 60;
|
||||||
|
return `${minutes}分钟 ${seconds}秒`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeTags(input) {
|
||||||
|
return input.replace(/<[^>]*>/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(objList) {
|
||||||
|
let vod_list = []
|
||||||
|
for (const vodData of objList) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = vodData["bvid"]
|
||||||
|
if (vodData.hasOwnProperty("rcmd_reason")) {
|
||||||
|
vodShort.vod_remarks = vodData["rcmd_reason"]["content"]
|
||||||
|
} else {
|
||||||
|
vodShort.vod_remarks = this.getFullTime(vodData["duration"])
|
||||||
|
}
|
||||||
|
|
||||||
|
vodShort.vod_name = this.removeTags(vodData["title"])
|
||||||
|
let imageUrl = vodData["pic"];
|
||||||
|
if (imageUrl.startsWith('//')) {
|
||||||
|
imageUrl = 'https:' + imageUrl;
|
||||||
|
}
|
||||||
|
vodShort.vod_pic = imageUrl
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj, bvid) {
|
||||||
|
let cd = this.getFullTime(obj["duration"]);
|
||||||
|
const aid = obj.aid;
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = obj["title"]
|
||||||
|
vodDetail.vod_pic = obj["pic"]
|
||||||
|
vodDetail.type_name = obj["tname"]
|
||||||
|
vodDetail.vod_remarks = cd
|
||||||
|
vodDetail.vod_content = obj["desc"]
|
||||||
|
|
||||||
|
let params = {"avid": aid, "cid": obj["cid"], "qn": "127", "fnval": 4048, "fourk": 1}
|
||||||
|
let playUrlDatas = JSON.parse(await this.fetch(this.apiUrl + "/x/player/playurl", params, this.getHeader()));
|
||||||
|
let playUrldDataList = playUrlDatas["data"];
|
||||||
|
const accept_quality = playUrldDataList["accept_quality"];
|
||||||
|
const accept_description = playUrldDataList["accept_description"];
|
||||||
|
const qualityList = [];
|
||||||
|
const descriptionList = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < accept_quality.length; i++) {
|
||||||
|
if (!this.is_vip) {
|
||||||
|
if (this.is_login) {
|
||||||
|
if (accept_quality[i] > 80) continue;
|
||||||
|
} else {
|
||||||
|
if (accept_quality[i] > 32) continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
descriptionList.push(Utils.base64Encode(accept_description[i]));
|
||||||
|
qualityList.push(accept_quality[i]);
|
||||||
|
}
|
||||||
|
let treeMap = {};
|
||||||
|
const jSONArray = obj["pages"];
|
||||||
|
let playList = [];
|
||||||
|
for (let j = 0; j < jSONArray.length; j++) {
|
||||||
|
const jSONObject6 = jSONArray[j];
|
||||||
|
const cid = jSONObject6.cid;
|
||||||
|
const playUrl = j + '$' + aid + '+' + cid + '+' + qualityList.join(':') + '+' + descriptionList.join(':');
|
||||||
|
playList.push(playUrl);
|
||||||
|
}
|
||||||
|
if (this.catOpenStatus) {
|
||||||
|
for (let quality of qualityList) {
|
||||||
|
treeMap[`dash - ${this.play_url_obj[quality]}`] = playList.join("#")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.warning("TV暂不支持Dash播放")
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let quality of qualityList) {
|
||||||
|
treeMap[`mp4 - ${this.play_url_obj[quality]}`] = playList.join("#")
|
||||||
|
}
|
||||||
|
let relatedParams = {"bvid": bvid}
|
||||||
|
const relatedData = JSON.parse(await this.fetch(this.apiUrl + "/x/web-interface/archive/related", relatedParams, this.getHeader())).data;
|
||||||
|
playList = [];
|
||||||
|
for (let j = 0; j < relatedData.length; j++) {
|
||||||
|
const jSONObject6 = relatedData[j];
|
||||||
|
const cid = jSONObject6.cid;
|
||||||
|
const title = jSONObject6.title;
|
||||||
|
const aaid = jSONObject6.aid;
|
||||||
|
const playUrl = title + '$' + aaid + '+' + cid + '+' + qualityList.join(':') + '+' + descriptionList.join(':');
|
||||||
|
playList.push(playUrl);
|
||||||
|
}
|
||||||
|
if (this.catOpenStatus) {
|
||||||
|
for (let quality of qualityList) {
|
||||||
|
treeMap["相关" + ` - ${this.play_url_obj[quality]}`] = playList.join("#")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.warning("TV暂不支持相关播放")
|
||||||
|
}
|
||||||
|
|
||||||
|
vodDetail.vod_play_from = Object.keys(treeMap).join("$$$");
|
||||||
|
vodDetail.vod_play_url = Object.values(treeMap).join("$$$");
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let params = {"ps": 20}
|
||||||
|
let content = await this.fetch(this.apiUrl + "/x/web-interface/popular", params, this.getHeader())
|
||||||
|
this.homeVodList = await this.parseVodShortListFromJson(JSON.parse(content)["data"]["list"])
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
const detailUrl = this.apiUrl + "/x/web-interface/view";
|
||||||
|
let params = {"bvid": id}
|
||||||
|
|
||||||
|
const detailData = JSON.parse(await this.fetch(detailUrl, params, this.getHeader())).data
|
||||||
|
// 记录历史
|
||||||
|
if (!_.isEmpty(this.bili_jct)) {
|
||||||
|
const historyReport = this.apiUrl + '/x/v2/history/report';
|
||||||
|
let dataPost = {
|
||||||
|
aid: detailData.aid,
|
||||||
|
cid: detailData.cid,
|
||||||
|
csrf: this.bili_jct,
|
||||||
|
}
|
||||||
|
await this.post(historyReport, dataPost, this.getHeader(), "form");
|
||||||
|
}
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(detailData, id)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
findKeyByValue(obj, value) {
|
||||||
|
for (const key in obj) {
|
||||||
|
if (obj[key] === value) {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
const ids = id.split('+');
|
||||||
|
const aid = ids[0];
|
||||||
|
const cid = ids[1];
|
||||||
|
let quality_name = flag.split(" - ")[1]
|
||||||
|
let quality_id = this.findKeyByValue(this.play_url_obj, quality_name)
|
||||||
|
this.danmuUrl = this.apiUrl + '/x/v1/dm/list.so?oid=' + cid;
|
||||||
|
this.result.header = this.getHeader()
|
||||||
|
if (flag.indexOf("dash") > -1 || flag.indexOf('相关') > -1) {
|
||||||
|
// dash mpd 代理
|
||||||
|
if (this.catOpenStatus) {
|
||||||
|
this.playUrl = this.js2Base + Utils.base64Encode(aid + '+' + cid + '+' + quality_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (flag.indexOf('mp4') > -1) {
|
||||||
|
// 直链
|
||||||
|
const url = this.apiUrl + `/x/player/playurl`;
|
||||||
|
let params = {"avid": aid, "cid": cid, "qn": parseInt(quality_id), "fourk": "1"}
|
||||||
|
const resp = JSON.parse(await this.fetch(url, params, this.getHeader()));
|
||||||
|
const data = resp.data;
|
||||||
|
this.playUrl = data["durl"][0].url;
|
||||||
|
} else {
|
||||||
|
// 音频外挂
|
||||||
|
let urls = [];
|
||||||
|
let audios = [];
|
||||||
|
const url = this.siteUrl + "/x/player/playurl"
|
||||||
|
let params = {"avid": aid, "cid": cid, "qn": quality_id, "fnval": 4048, "fourk": 1};
|
||||||
|
let resp = JSON.parse(await this.fetch(url, params, this.getHeader()));
|
||||||
|
const dash = resp.data.dash;
|
||||||
|
const video = dash.video;
|
||||||
|
const audio = dash.audio;
|
||||||
|
for (let j = 0; j < video.length; j++) {
|
||||||
|
const dashjson = video[j];
|
||||||
|
if (dashjson.id === quality_id) {
|
||||||
|
for (const key in this.vod_codec) {
|
||||||
|
if (dashjson["codecid"] === key) {
|
||||||
|
urls.push(Utils.base64Decode(quality_id) + ' ' + this.vod_codec[key], dashjson["baseUrl"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (audios.length === 0) {
|
||||||
|
for (let j = 0; j < audio.length; j++) {
|
||||||
|
const dashjson = audio[j];
|
||||||
|
for (const key in this.vod_audio_id) {
|
||||||
|
if (dashjson.id === key) {
|
||||||
|
audios.push({
|
||||||
|
title: _.floor(parseInt(this.vod_audio_id[key]) / 1024) + 'Kbps',
|
||||||
|
bit: this.vod_audio_id[key],
|
||||||
|
url: dashjson["baseUrl"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
audios = _.sortBy(audios, 'bit');
|
||||||
|
}
|
||||||
|
this.playUrl = urls
|
||||||
|
this.extra = {"audio": audios}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkLogin() {
|
||||||
|
let result = JSON.parse(await this.fetch('https://api.bilibili.com/x/web-interface/nav', null, this.getHeader()));
|
||||||
|
this.is_vip = result["data"]["vipStatus"]
|
||||||
|
return result["data"]["isLogin"]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let page;
|
||||||
|
if (parseInt(pg) < 1) {
|
||||||
|
page = 1;
|
||||||
|
} else {
|
||||||
|
page = parseInt(pg)
|
||||||
|
}
|
||||||
|
if (Object.keys(extend).length > 0 && extend.hasOwnProperty('tid') && extend['tid'].length > 0) {
|
||||||
|
tid = extend['tid'];
|
||||||
|
}
|
||||||
|
let url = '';
|
||||||
|
url = this.apiUrl + `/x/web-interface/search/type?search_type=video&keyword=${encodeURIComponent(tid)}`;
|
||||||
|
|
||||||
|
if (Object.keys(extend).length > 0) {
|
||||||
|
for (const k in extend) {
|
||||||
|
if (k === 'tid') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
url += `&${encodeURIComponent(k)}=${encodeURIComponent(extend[k])}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url += `&page=${encodeURIComponent(page)}`;
|
||||||
|
if (tid === "历史记录") {
|
||||||
|
url = this.apiUrl + "/x/v2/history?pn=" + page;
|
||||||
|
}
|
||||||
|
const data = JSON.parse(await this.fetch(url, null, this.getHeader())).data;
|
||||||
|
let items = data.result;
|
||||||
|
if (tid === "历史记录") {
|
||||||
|
items = data;
|
||||||
|
}
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(items)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
const ext = {
|
||||||
|
duration: '0',
|
||||||
|
};
|
||||||
|
let resp = JSON.parse(await this.category(wd, 1, true, ext));
|
||||||
|
this.vodList = resp["list"]
|
||||||
|
}
|
||||||
|
|
||||||
|
getDashMedia(dash) {
|
||||||
|
try {
|
||||||
|
let qnid = dash.id;
|
||||||
|
const codecid = dash["codecid"];
|
||||||
|
const media_codecs = dash["codecs"];
|
||||||
|
const media_bandwidth = dash["bandwidth"];
|
||||||
|
const media_startWithSAP = dash["startWithSap"];
|
||||||
|
const media_mimeType = dash.mimeType;
|
||||||
|
const media_BaseURL = dash["baseUrl"].replace(/&/g, '&');
|
||||||
|
const media_SegmentBase_indexRange = dash["SegmentBase"]["indexRange"];
|
||||||
|
const media_SegmentBase_Initialization = dash["SegmentBase"]["Initialization"];
|
||||||
|
const mediaType = media_mimeType.split('/')[0];
|
||||||
|
let media_type_params = '';
|
||||||
|
|
||||||
|
if (mediaType === 'video') {
|
||||||
|
const media_frameRate = dash.frameRate;
|
||||||
|
const media_sar = dash["sar"];
|
||||||
|
const media_width = dash.width;
|
||||||
|
const media_height = dash.height;
|
||||||
|
media_type_params = `height='${media_height}' width='${media_width}' frameRate='${media_frameRate}' sar='${media_sar}'`;
|
||||||
|
} else if (mediaType === 'audio') {
|
||||||
|
for (const key in this.vod_audio_id) {
|
||||||
|
if (qnid === key) {
|
||||||
|
const audioSamplingRate = this.vod_audio_id[key];
|
||||||
|
media_type_params = `numChannels='2' sampleRate='${audioSamplingRate}'`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qnid += '_' + codecid;
|
||||||
|
return `<AdaptationSet lang="chi">
|
||||||
|
<ContentComponent contentType="${mediaType}"/>
|
||||||
|
<Representation id="${qnid}" bandwidth="${media_bandwidth}" codecs="${media_codecs}" mimeType="${media_mimeType}" ${media_type_params} startWithSAP="${media_startWithSAP}">
|
||||||
|
<BaseURL>${media_BaseURL}</BaseURL>
|
||||||
|
<SegmentBase indexRange="${media_SegmentBase_indexRange}">
|
||||||
|
<Initialization range="${media_SegmentBase_Initialization}"/>
|
||||||
|
</SegmentBase>
|
||||||
|
</Representation>
|
||||||
|
</AdaptationSet>`;
|
||||||
|
} catch (e) {
|
||||||
|
// Handle exceptions here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getDash(ja, videoList, audioList) {
|
||||||
|
const duration = ja.data.dash["duration"];
|
||||||
|
const minBufferTime = ja.data.dash["minBufferTime"];
|
||||||
|
return `<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="static" mediaPresentationDuration="PT${duration}S" minBufferTime="PT${minBufferTime}S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
|
||||||
|
<Period duration="PT${duration}S" start="PT0S">
|
||||||
|
${videoList}
|
||||||
|
${audioList}
|
||||||
|
</Period>
|
||||||
|
</MPD>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async proxy(segments, headers) {
|
||||||
|
let what = segments[0];
|
||||||
|
let url = Utils.base64Decode(segments[1]);
|
||||||
|
if (what === 'dash') {
|
||||||
|
const ids = url.split('+');
|
||||||
|
const aid = ids[0];
|
||||||
|
const cid = ids[1];
|
||||||
|
const str5 = ids[2];
|
||||||
|
const urls = this.apiUrl + `/x/player/playurl?avid=${aid}&cid=${cid}&qn=${str5}&fnval=4048&fourk=1`;
|
||||||
|
let videoList = '';
|
||||||
|
let audioList = '';
|
||||||
|
let content = await this.fetch(urls, null, headers);
|
||||||
|
let resp = JSON.parse(content)
|
||||||
|
const dash = resp.data.dash;
|
||||||
|
const video = dash.video;
|
||||||
|
const audio = dash.audio;
|
||||||
|
for (let i = 0; i < video.length; i++) {
|
||||||
|
// if (i > 0) continue; // 只取一个
|
||||||
|
const dashjson = video[i];
|
||||||
|
if (dashjson.id.toString() === str5) {
|
||||||
|
videoList += this.getDashMedia(dashjson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < audio.length; i++) {
|
||||||
|
// if (i > 0) continue;
|
||||||
|
const ajson = audio[i];
|
||||||
|
for (const key in this.vod_audio_id) {
|
||||||
|
if (ajson.id.toString() === key) {
|
||||||
|
audioList += this.getDashMedia(ajson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mpd = this.getDash(resp, videoList, audioList);
|
||||||
|
return JSON.stringify({
|
||||||
|
code: 200,
|
||||||
|
content: mpd,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/dash+xml',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
code: 500,
|
||||||
|
content: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new BilibiliSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
152
18/ds/18js/js/bookan.js
Normal file
152
18/ds/18js/js/bookan.js
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
* @File : bookan.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/31 13:44
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_} from '../lib/cat.js';
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
function formatPlayUrl(name) {
|
||||||
|
return name
|
||||||
|
.trim()
|
||||||
|
.replace(/<|>|《|》/g, '')
|
||||||
|
.replace(/\$|#/g, ' ')
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
class BooKanSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://api.bookan.com.cn";
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🎵┃看书┃🎵"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "看书"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "bookan"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let books = [];
|
||||||
|
for (const book of obj.list) {
|
||||||
|
books.push({
|
||||||
|
book_id: book.id, book_name: book.name, book_pic: book.cover, book_remarks: book.extra.author,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
{
|
||||||
|
this.classes = [{type_id: '1305', type_name: '少年读物'}, {
|
||||||
|
type_id: '1304', type_name: '儿童文学'
|
||||||
|
}, {type_id: '1320', type_name: '国学经典'}, {type_id: '1306', type_name: '文艺少年'}, {
|
||||||
|
type_id: '1309', type_name: '育儿心经'
|
||||||
|
}, {type_id: '1310', type_name: '心理哲学'}, {type_id: '1307', type_name: '青春励志'}, {
|
||||||
|
type_id: '1312', type_name: '历史小说'
|
||||||
|
}, {type_id: '1303', type_name: '故事会'}, {type_id: '1317', type_name: '音乐戏剧'}, {
|
||||||
|
type_id: '1319', type_name: '相声评书'
|
||||||
|
},]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let content = await this.fetch(`${this.siteUrl}/voice/book/list?instance_id=25304&page=${pg}&category_id=${tid}&num=24`, null, this.getHeader());
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj) {
|
||||||
|
let book = {
|
||||||
|
audio: 1,
|
||||||
|
type_name: '',
|
||||||
|
book_year: '',
|
||||||
|
book_area: '',
|
||||||
|
book_remarks: '',
|
||||||
|
book_actor: '',
|
||||||
|
book_director: '',
|
||||||
|
book_content: '',
|
||||||
|
};
|
||||||
|
let us = _.map(obj.list, function (b) {
|
||||||
|
return formatPlayUrl(b.title) + '$' + b.file;
|
||||||
|
}).join('#');
|
||||||
|
book.volumes = '书卷';
|
||||||
|
book.urls = us;
|
||||||
|
return book
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let content = await this.fetch(`${this.siteUrl}/voice/album/units?album_id=${id}&page=1&num=200&order=1`, null, this.getHeader());
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(data)
|
||||||
|
this.vodDetail.book_id = id
|
||||||
|
}
|
||||||
|
|
||||||
|
async play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0, url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let content = await this.fetch(`https://es.bookan.com.cn/api/v3/voice/book?instanceId=25304&keyword=${wd}&pageNum=1&limitNum=20`,null,this.getHeader());
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
let spider = new BooKanSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
263
18/ds/18js/js/bqg_open.js
Normal file
263
18/ds/18js/js/bqg_open.js
Normal file
|
|
@ -0,0 +1,263 @@
|
||||||
|
/*
|
||||||
|
* @File : bqg_open.js.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/30 15:38
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_} from '../lib/cat.js';
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {BookDetail, BookShort} from "../lib/book.js";
|
||||||
|
|
||||||
|
class BQQSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://m.13bqg.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "笔趣阁"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "bqg_open"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "📚︎┃笔趣阁┃📚︎"
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq = null) {
|
||||||
|
if (inReq !== null) {
|
||||||
|
this.jsBase = await js2Proxy(inReq, "img", this.getHeader());
|
||||||
|
} else {
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getHeader());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let books = []
|
||||||
|
let bookElements = $("[class=\"block\"]")
|
||||||
|
for (const bookElement of $(bookElements[0]).find("li")) {
|
||||||
|
let bookShort = new BookShort()
|
||||||
|
let bookShortElements = $(bookElement).find("span")
|
||||||
|
bookShort.book_remarks = $(bookShortElements[0]).text()
|
||||||
|
bookShort.book_name = $(bookShortElements[1]).text()
|
||||||
|
bookShort.book_id = $(bookShortElements[1]).find("a")[0].attribs.href
|
||||||
|
bookShort.book_pic = this.jsBase + Utils.base64Encode(bookShort.book_id)
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let books = [];
|
||||||
|
for (const item of $('div.item')) {
|
||||||
|
let bookShort = new BookShort()
|
||||||
|
bookShort.book_id = $(item).find('a:first')[0].attribs.href;
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
bookShort.book_name = img.attribs.alt
|
||||||
|
bookShort.book_pic = img.attribs.src
|
||||||
|
bookShort.book_remarks = $(item).find('span:first')[0].children[0].data.trim();
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($, id) {
|
||||||
|
let bookDetail = new BookDetail()
|
||||||
|
bookDetail.book_name = $('[property$=book_name]')[0].attribs.content
|
||||||
|
bookDetail.book_year = $('[property$=update_time]')[0].attribs.content
|
||||||
|
bookDetail.book_director = $('[property$=author]')[0].attribs.content
|
||||||
|
bookDetail.book_content = $('[property$=description]')[0].attribs.content
|
||||||
|
bookDetail.book_pic = $($("[class=\"cover\"]")).find("img")[0].attribs.src
|
||||||
|
bookDetail.book_id = id
|
||||||
|
if (id !== undefined) {
|
||||||
|
$ = await this.getHtml(this.siteUrl + id + `list.html`);
|
||||||
|
let urls = [];
|
||||||
|
const links = $('dl>dd>a[href*="/html/"]');
|
||||||
|
for (const l of links) {
|
||||||
|
const name = $(l).text().trim();
|
||||||
|
const link = l.attribs.href;
|
||||||
|
urls.push(name + '$' + link);
|
||||||
|
}
|
||||||
|
bookDetail.volumes = '全卷';
|
||||||
|
bookDetail.urls = urls.join('#');
|
||||||
|
}
|
||||||
|
return bookDetail
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
for (const a of $('div.nav > ul > li > a[href!="/"]')) {
|
||||||
|
this.classes.push({
|
||||||
|
type_id: a.attribs.href.replace(/\//g, ''), type_name: a.children[0].data.trim(), tline: 2,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + `/${tid}/${pg}.html`);
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
try {
|
||||||
|
let content = '';
|
||||||
|
while (true) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
content += $('#chaptercontent')
|
||||||
|
.html()
|
||||||
|
.replace(/<br>|请收藏.*?<\/p>/g, '\n')
|
||||||
|
.trim();
|
||||||
|
id = $('a.Readpage_down')[0].attribs.href;
|
||||||
|
if (id.indexOf('_') < 0) break;
|
||||||
|
}
|
||||||
|
this.playUrl = {"content":content + '\n\n'}
|
||||||
|
} catch (e) {
|
||||||
|
this.playUrl = {"content":""}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async search(wd, quick) {
|
||||||
|
const cook = await req(`${this.siteUrl}/user/hm.html?q=${encodeURIComponent(wd)}`, {
|
||||||
|
headers: {
|
||||||
|
accept: 'application/json',
|
||||||
|
'User-Agent': Utils.MOBILEUA,
|
||||||
|
Referer: `${this.siteUrl}/s?q=${encodeURIComponent(wd)}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const set_cookie = _.isArray(cook.headers['set-cookie']) ? cook.headers['set-cookie'].join(';;;') : cook.headers['set-cookie'];
|
||||||
|
const cks = set_cookie.split(';;;');
|
||||||
|
const cookie = {};
|
||||||
|
for (const c of cks) {
|
||||||
|
const tmp = c.trim();
|
||||||
|
const idx = tmp.indexOf('=');
|
||||||
|
const k = tmp.substr(0, idx);
|
||||||
|
cookie[k] = tmp.substr(idx + 1, tmp.indexOf(';') - idx - 1);
|
||||||
|
}
|
||||||
|
const resp = await req(`${this.siteUrl}/user/search.html?q=${encodeURIComponent(wd)}&so=undefined`, {
|
||||||
|
headers: {
|
||||||
|
accept: 'application/json',
|
||||||
|
'User-Agent': Utils.MOBILEUA,
|
||||||
|
cookie: 'hm=' + cookie['hm'],
|
||||||
|
Referer: `${this.siteUrl}/s?q=${encodeURIComponent(wd)}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
let data = JSON.parse(resp.content);
|
||||||
|
let books = [];
|
||||||
|
for (const book of data) {
|
||||||
|
books.push({
|
||||||
|
book_id: book["url_list"],
|
||||||
|
book_name: book["articlename"],
|
||||||
|
book_pic: book["url_img"],
|
||||||
|
book_remarks: book["author"],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
tline: 2, list: books,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async proxy(segments, headers) {
|
||||||
|
await this.jadeLog.debug(`正在设置反向代理 segments = ${segments.join(",")},headers = ${JSON.stringify(headers)}`)
|
||||||
|
let what = segments[0];
|
||||||
|
let url = Utils.base64Decode(segments[1]);
|
||||||
|
if (what === 'img') {
|
||||||
|
await this.jadeLog.debug(`反向代理ID为:${url}`)
|
||||||
|
let $ = await this.getHtml(this.siteUrl + url)
|
||||||
|
let bookDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
let resp;
|
||||||
|
if (!_.isEmpty(headers)) {
|
||||||
|
resp = await req(bookDetail.book_pic, {
|
||||||
|
buffer: 2, headers: headers
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resp = await req(bookDetail.book_pic, {
|
||||||
|
buffer: 2, headers: {
|
||||||
|
Referer: url, 'User-Agent': Utils.CHROME,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
code: resp.code, buffer: 2, content: resp.content, headers: resp.headers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
code: 500, content: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new BQQSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
347
18/ds/18js/js/changzhang.js
Normal file
347
18/ds/18js/js/changzhang.js
Normal file
|
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* @File : changzhang.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/2/2 16:02
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {_, Crypto, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {detailContent, initAli, playContent} from "../lib/ali.js";
|
||||||
|
|
||||||
|
function cryptJs(text, key, iv, type) {
|
||||||
|
let key_value = Crypto.enc.Utf8.parse(key || 'PBfAUnTdMjNDe6pL');
|
||||||
|
let iv_value = Crypto.enc.Utf8.parse(iv || 'sENS6bVbwSfvnXrj');
|
||||||
|
let content
|
||||||
|
if (type) {
|
||||||
|
content = Crypto.AES.encrypt(text, key_value, {
|
||||||
|
iv: iv_value, mode: Crypto.mode.CBC, padding: Crypto.pad.Pkcs7
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
content = Crypto.AES.decrypt(text, key_value, {
|
||||||
|
iv: iv_value, padding: Crypto.pad.Pkcs7
|
||||||
|
}).toString(Crypto.enc.Utf8)
|
||||||
|
}
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ChangZhangSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.czzy88.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await initAli(this.cfgObj["token"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🏭️┃厂长直连┃🏭️"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "厂长直连"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "changzhang"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtml(url = this.siteUrl, headers = this.getHeader()) {
|
||||||
|
let response = await this.fetch(url, null, headers,false,true);
|
||||||
|
let html = response["content"]
|
||||||
|
if (!_.isEmpty(html) && html.indexOf("人机验证")===-1) {
|
||||||
|
return load(html)
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.error(`html获取失败`, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getSearchHeader() {
|
||||||
|
return {
|
||||||
|
"Cookie": "cf_clearance=otYZbHg1safCIxkCtZfy9DPKbf1Gs_zUskkVDc0MVKM-1707026063-1-ATOpKnTLv9+pv171YE/rzxN/nmvGN9Mucx7vpwp0kW2vZb/cbtz5e2md2/ym7EE+9dT7pPBV+kQOg9vJx2v8cks=;myannoun=1;PHPSESSID=73386nobqugs7r3pb2ljcsp5q4",
|
||||||
|
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/100.0.4896.77 Mobile/15E148 Safari/604.1",
|
||||||
|
"Connection":"keep-alive",
|
||||||
|
"Host":"www.czzy55.com"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
parseVodShortFromElement($, element) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let imgElement = $($(element).find("a")).find("img")[0]
|
||||||
|
vodShort.vod_name = imgElement.attribs.alt
|
||||||
|
vodShort.vod_pic = imgElement.attribs["data-original"]
|
||||||
|
vodShort.vod_remarks = $($($(element).find("[class='hdinfo']")).find("span")).text()
|
||||||
|
vodShort.vod_id = $(element).find("a")[0].attribs.href
|
||||||
|
return vodShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let aList = $($("[class=\"mi_cont\"]").find("ul")).find("li")
|
||||||
|
for (const a of aList) {
|
||||||
|
vod_list.push(this.parseVodShortFromElement($, a))
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let aList = $($("[class=\"mi_cont \"]").find("ul")).find("li")
|
||||||
|
for (const a of aList) {
|
||||||
|
vod_list.push(this.parseVodShortFromElement($, a))
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
let nodeElement = $("[class='dyxingq']")
|
||||||
|
vodDetail.vod_pic = $(nodeElement).find("img")[0].attribs.src
|
||||||
|
vodDetail.vod_name = $($(nodeElement).find("h1")[0]).text()
|
||||||
|
vodDetail.vod_content = $($($("[class='yp_context']")).find("p")).text()
|
||||||
|
let infoArray = $(nodeElement).find("[class='moviedteail_list']").find("li")
|
||||||
|
let x = $(infoArray).text()
|
||||||
|
for (const info of infoArray) {
|
||||||
|
let content = $(info).text()
|
||||||
|
if (content.indexOf("类型") > -1) {
|
||||||
|
vodDetail.type_name = content.replaceAll("类型", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("年份") > -1) {
|
||||||
|
vodDetail.vod_year = content.replaceAll("年份", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("地区") > -1) {
|
||||||
|
vodDetail.vod_area = content.replaceAll("地区", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("豆瓣") > -1) {
|
||||||
|
vodDetail.vod_remarks = content.replaceAll("豆瓣", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("主演") > -1) {
|
||||||
|
vodDetail.vod_actor = content.replaceAll("主演", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("导演") > -1) {
|
||||||
|
vodDetail.vod_director = content.replaceAll("导演", "").replaceAll(":", "")
|
||||||
|
} else if (content.indexOf("剧情") > -1) {
|
||||||
|
vodDetail.vod_content = content.replaceAll("剧情", "").replaceAll(":", "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let vod_play_from_list = ["厂长资源"]
|
||||||
|
|
||||||
|
let vodPlayList = $("[class='paly_list_btn']")
|
||||||
|
let vod_play_list = []
|
||||||
|
for (const v1 of vodPlayList) {
|
||||||
|
let vodItems = []
|
||||||
|
let aList = $(v1).find("a")
|
||||||
|
for (const tA of aList) {
|
||||||
|
let episodeUrl = tA.attribs.href
|
||||||
|
let episodeName = $(tA).text().replaceAll("立即播放 (", "").replaceAll(")", "")
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
}
|
||||||
|
let valify_formt_list = ["磁力链接", "阿里网盘"]
|
||||||
|
let otherPlayList = $("[class=\"ypbt_down_list\"]").find("li")
|
||||||
|
for (const otherPlay of otherPlayList) {
|
||||||
|
let form_name = $(otherPlay).text()
|
||||||
|
let is_valify = false
|
||||||
|
for (const valify_format_name of valify_formt_list) {
|
||||||
|
if (form_name.indexOf(valify_format_name) > -1) {
|
||||||
|
is_valify = true
|
||||||
|
if (form_name.indexOf("阿里网盘") === -1) {
|
||||||
|
vod_play_from_list.push(valify_format_name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_valify) {
|
||||||
|
let vodItems = []
|
||||||
|
for (const ciliPlayUrl of $(otherPlay).find("a")) {
|
||||||
|
let episodeUrl = ciliPlayUrl.attribs.href
|
||||||
|
if ($(otherPlay).text().indexOf("阿里网盘")) {
|
||||||
|
let aliVodDetail = await detailContent([episodeUrl])
|
||||||
|
let aliPlayUrlList = aliVodDetail.vod_play_url.split("$$$")
|
||||||
|
let is_exists = false
|
||||||
|
for (const aliPlayUrl of aliPlayUrlList) {
|
||||||
|
if (!_.isEmpty(aliPlayUrl)) {
|
||||||
|
is_exists = true
|
||||||
|
vod_play_list.push(aliPlayUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_exists) {
|
||||||
|
for (const aliFormatName of aliVodDetail.vod_play_from.split("$$$")) {
|
||||||
|
vod_play_from_list.push("阿里云盘-" + aliFormatName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
let episodeName = Utils.getStrByRegex(/\[(.*?)]/, $(ciliPlayUrl).text())
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
const items = $('div.search_list > ul > li');
|
||||||
|
return _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const a = $(item).find('a:first')[0];
|
||||||
|
const hdinfo = $($(item).find('div.hdinfo')[0]).text().trim();
|
||||||
|
const jidi = $($(item).find('div.jidi')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href,
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: img.attribs['data-original'],
|
||||||
|
vod_remarks: jidi || hdinfo || '',
|
||||||
|
};
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
const $ = await this.getHtml(this.siteUrl + '/movie_bt');
|
||||||
|
const series = $('div#beautiful-taxonomy-filters-tax-movie_bt_series > a[cat-url*=movie_bt_series]');
|
||||||
|
const tags = $('div#beautiful-taxonomy-filters-tax-movie_bt_tags > a');
|
||||||
|
let tag = {
|
||||||
|
key: 'tag', name: '类型', value: _.map(tags, (n) => {
|
||||||
|
let v = n.attribs['cat-url'] || '';
|
||||||
|
v = v.substring(v.lastIndexOf('/') + 1);
|
||||||
|
return {n: n.children[0].data, v: v};
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
tag['init'] = tag.value[0].v;
|
||||||
|
let classes = _.map(series, (s) => {
|
||||||
|
let typeId = s.attribs['cat-url'];
|
||||||
|
typeId = typeId.substring(typeId.lastIndexOf('/') + 1);
|
||||||
|
this.filterObj[typeId] = [tag];
|
||||||
|
return {
|
||||||
|
type_id: typeId, type_name: s.children[0].data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const sortName = ['电影', '电视剧', '国产剧', '美剧', '韩剧', '日剧', '海外剧(其他)', '华语电影', '印度电影', '日本电影', '欧美电影', '韩国电影', '动画', '俄罗斯电影', '加拿大电影'];
|
||||||
|
let sort_classes = _.sortBy(classes, (c) => {
|
||||||
|
const index = sortName.indexOf(c.type_name);
|
||||||
|
return index === -1 ? sortName.length : index;
|
||||||
|
});
|
||||||
|
for (const sort_class of sort_classes){
|
||||||
|
let type_name = sort_class["type_name"]
|
||||||
|
if (type_name!=="会员专区" && type_name !== "站长推荐"){
|
||||||
|
this.classes.push(sort_class)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
const tag = extend.tag || '';
|
||||||
|
const link = this.siteUrl + '/movie_bt' + (tag.length > 0 ? `/movie_bt_tags/${tag}` : '') + '/movie_bt_series/' + tid + (pg > 1 ? `/page/${pg}` : '');
|
||||||
|
let $ = await this.getHtml(link)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
const $ = await this.getHtml(this.siteUrl + '/xssearch?q=' + wd,this.getSearchHeader());
|
||||||
|
let html = $.html()
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
if (flag.indexOf("阿里云盘") > -1) {
|
||||||
|
flag = flag.replaceAll("阿里云盘-","")
|
||||||
|
this.playUrl = JSON.parse(await playContent(flag, id, flags))["url"];
|
||||||
|
} else {
|
||||||
|
if (id.indexOf("magnet") > -1) {
|
||||||
|
this.playUrl = id
|
||||||
|
} else {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
const iframe = $('body iframe[src*=https]');
|
||||||
|
if (iframe.length > 0) {
|
||||||
|
const iframeHtml = (await req(iframe[0].attribs.src, {
|
||||||
|
headers: {
|
||||||
|
Referer: id, 'User-Agent': Utils.CHROME,
|
||||||
|
},
|
||||||
|
})).content;
|
||||||
|
let player = Utils.getStrByRegex(/var player = "(.*?)"/, iframeHtml)
|
||||||
|
let rand = Utils.getStrByRegex(/var rand = "(.*?)"/, iframeHtml)
|
||||||
|
let content = JSON.parse(cryptJs(player, "VFBTzdujpR9FWBhe", rand))
|
||||||
|
this.playUrl = content["url"]
|
||||||
|
} else {
|
||||||
|
const js = $('script:contains(window.wp_nonce)').html();
|
||||||
|
const group = js.match(/(var.*)eval\((\w*\(\w*\))\)/);
|
||||||
|
const md5 = Crypto;
|
||||||
|
const result = eval(group[1] + group[2]);
|
||||||
|
this.playUrl = result.match(/url:.*?['"](.*?)['"]/)[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new ChangZhangSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
192
18/ds/18js/js/ciliduo.js
Normal file
192
18/ds/18js/js/ciliduo.js
Normal file
|
|
@ -0,0 +1,192 @@
|
||||||
|
/*
|
||||||
|
* @File : ciliduo.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/3/1 13:26
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 磁力多
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {detailContent} from "../lib/ali.js";
|
||||||
|
|
||||||
|
|
||||||
|
class CiliDuoSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://of.cilido.top"
|
||||||
|
this.apiUrl = ""
|
||||||
|
this.vodShortObj = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃磁力多BT┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "磁力多BT"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "ciliduo"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
getProxy(src) {
|
||||||
|
return Utils.base64Decode(src)
|
||||||
|
}
|
||||||
|
|
||||||
|
async home(filter) {
|
||||||
|
try {
|
||||||
|
await this.jadeLog.info("正在解析首页类别", true)
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let proxy_src = Utils.getStrByRegex(/var proxy = atob\('(.*?)'\)/, $.html())
|
||||||
|
this.apiUrl = this.getProxy(proxy_src)
|
||||||
|
let params = `/?host=${Utils.getHost(this.siteUrl).split("://").slice(-1)[0]}&v=1`
|
||||||
|
let homeContent = await this.fetch(this.apiUrl, params, this.getHeader())
|
||||||
|
return await this.parseVodShortListFromDoc(load(homeContent))
|
||||||
|
} catch (e) {
|
||||||
|
await this.jadeLog.error(`首页解析失败,失败原因为:${e}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let rootElemet = $("[class=\"htab\"]")
|
||||||
|
let navElements = rootElemet.find("a")
|
||||||
|
let vodElements = $("[class=\"hotwords\"]").find("ul")
|
||||||
|
for (let i = 0; i < navElements.length; i++) {
|
||||||
|
let navElement = navElements[i]
|
||||||
|
if (i !== navElements.length - 1) {
|
||||||
|
let type_name = $(navElement).text()
|
||||||
|
if (type_name === "热门") {
|
||||||
|
type_name = "最近更新"
|
||||||
|
}
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_name))
|
||||||
|
let vodElement = vodElements[i]
|
||||||
|
let vod_list = []
|
||||||
|
for (const vodShorElement of $(vodElement).find("a")) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = vodShorElement.attribs.href
|
||||||
|
vodShort.vod_name = $(vodShorElement).html()
|
||||||
|
vodShort.vod_pic = Utils.RESOURCEURL + "/resources/cili.jpg"
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
this.vodShortObj[type_name] = vod_list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.result.home(this.classes, [], this.filterObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"ssbox\"]")
|
||||||
|
for (const vodElement of vodElements.slice(0, -1)) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = $(vodElement).find("a")[0].attribs.href
|
||||||
|
vodShort.vod_name = $($(vodElement).find("a")[0]).text()
|
||||||
|
vodShort.vod_remarks = $($(vodElement).find("span")[0]).text()
|
||||||
|
vodShort.vod_pic = Utils.RESOURCEURL + "/resources/cili.jpg"
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let html = $.html()
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = $($("[class=\"bt_title\"]")).text()
|
||||||
|
vodDetail.vod_pic = Utils.RESOURCEURL + "/resources/cili.jpg"
|
||||||
|
vodDetail.vod_remarks = Utils.getStrByRegex(/<br>收录时间:<span>(.*?)<\/span>/, $.html())
|
||||||
|
vodDetail.vod_content = "下载速度:" + Utils.getStrByRegex(/下载速度:<span>(.*?)<\/span>/, $.html())
|
||||||
|
vodDetail.vod_play_from = ["磁力连接"].join("$$$")
|
||||||
|
let vodItems = []
|
||||||
|
let contentElement = $("[class=\"content\"]").find("span")[0]
|
||||||
|
let episodeUrl = contentElement.attribs.href;
|
||||||
|
let episodeName = contentElement.attribs.title;
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl);
|
||||||
|
vodDetail.vod_play_url = [vodItems.join("#")].join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
this.homeVodList = this.vodShortObj["最近更新"]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
this.vodList = this.vodShortObj[tid]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
if (id.indexOf("search") > -1) {
|
||||||
|
let content = await this.fetch(this.apiUrl + id, null, this.getHeader())
|
||||||
|
let vod_list = await this.parseVodShortListFromDocBySearch(load(content))
|
||||||
|
id = vod_list[0].vod_id
|
||||||
|
}
|
||||||
|
await this.jadeLog.debug(id)
|
||||||
|
|
||||||
|
let detailUrl = this.apiUrl + id
|
||||||
|
let detailContent = await this.fetch(detailUrl, null, this.getHeader())
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc(load(detailContent))
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let searchUrl = this.apiUrl + `search?word=${wd}`
|
||||||
|
let content = await this.fetch(searchUrl, null, this.getHeader())
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch(load(content))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new CiliDuoSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
253
18/ds/18js/js/cilixiong.js
Normal file
253
18/ds/18js/js/cilixiong.js
Normal file
|
|
@ -0,0 +1,253 @@
|
||||||
|
/*
|
||||||
|
* @File : cilixiong.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/4/13 14:52
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js"
|
||||||
|
|
||||||
|
class CiliXiongSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.cilixiong.com"
|
||||||
|
this.cateObj = {"/movie/": "1", "/drama/": "2"}
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "磁力熊"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🐻┃磁力熊┃🐻"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "cilixiong"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let navElements = $("[class=\"nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0\"]").find("li")
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let element = $(navElement).find("a")[0]
|
||||||
|
let type_name = $(element).text()
|
||||||
|
let type_id = element.attribs.href
|
||||||
|
if (type_name !== "首页" && type_name !== "榜单" && type_name !== "留言") {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let extend_list = []
|
||||||
|
let filerElements = $("[class=\"nav small\"]")
|
||||||
|
let i = 1
|
||||||
|
for (const filetElement of filerElements) {
|
||||||
|
let extend_name = $($(filetElement).find("li")[0]).text().replaceAll(":", "")
|
||||||
|
let extend_dic = {"key": (i).toString(), "name": extend_name, "value": []}
|
||||||
|
for (const typeElement of $(filetElement).find("li").slice(1)) {
|
||||||
|
let element = $(typeElement).find("a")[0]
|
||||||
|
let type_id = element.attribs.href.split("-")[i]
|
||||||
|
extend_dic["value"].push({"n": $(element).text(), "v": type_id})
|
||||||
|
}
|
||||||
|
i = i + 1
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const type_dic of this.classes) {
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
if (type_id !== "最近更新") {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + type_id)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"col\"]")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = $(vodElement).find("a")[0].attribs.href
|
||||||
|
vodShort.vod_pic = Utils.getStrByRegex(/background-image: url\('(.*?)'\)/, $(vodElement).find("[class=\"card-img\"]")[0].attribs["style"])
|
||||||
|
vodShort.vod_name = $($(vodElement).find("h2")).text()
|
||||||
|
let remarks = $($(vodElement).find("[class=\"rank bg-success p-1\"]")).text()
|
||||||
|
vodShort.vod_remarks = "评分:" + remarks
|
||||||
|
if (remarks !== "AD") {
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"card card-cover h-100 overflow-hidden text-bg-dark rounded-4 shadow-lg position-relative\"]")
|
||||||
|
for (const vodElement of vodElements){
|
||||||
|
let vodShort= new VodShort()
|
||||||
|
vodShort.vod_id = $(vodElement).find("a")[0].attribs.href
|
||||||
|
vodShort.vod_name = $($(vodElement).find("[class=\"pt-5 lh-1 pb-2 h4\"]")).text()
|
||||||
|
vodShort.vod_pic = Utils.getStrByRegex(/background-image: url\('(.*?)'\)/,$(vodElement).find("[class=\"card-img\"]")[0].attribs.style)
|
||||||
|
vodShort.vod_remarks = "评分:" + $($(vodElement).find("[class=\"rank bg-success p-1\"]")).text()
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
let vodDetailElement = $("[class=\"row row-cols-1 row-cols-lg-3 align-items-stretch g-4 p-5 text-white\"]")
|
||||||
|
vodDetail.vod_pic = $(vodDetailElement).find("img")[0].attribs.src
|
||||||
|
vodDetail.vod_name = $($(vodDetailElement).find("h1")).text()
|
||||||
|
let vodContentElements = $(vodDetailElement).find("[class=\"mb-2\"]").slice(1)
|
||||||
|
for (const contentElement of vodContentElements) {
|
||||||
|
let name = $(contentElement).text()
|
||||||
|
if (name.indexOf("豆瓣评分") > -1) {
|
||||||
|
vodDetail.vod_remarks = name
|
||||||
|
}
|
||||||
|
if (name.indexOf("类型") > -1) {
|
||||||
|
vodDetail.type_name = name.replaceAll(":", "").replace("类型", "").replaceAll(":", "")
|
||||||
|
}
|
||||||
|
if (name.indexOf("上映地区") > -1) {
|
||||||
|
vodDetail.vod_area = name.replaceAll(":", "").replace("上映地区", "").replaceAll(":", "")
|
||||||
|
}
|
||||||
|
if (name.indexOf("主演") > -1) {
|
||||||
|
vodDetail.vod_actor = name.replaceAll(":", "").replace("主演", "").replaceAll(":", "")
|
||||||
|
}
|
||||||
|
if (name.indexOf("上映日期") > -1){
|
||||||
|
vodDetail.vod_year = name.replaceAll(":", "").replace("上映日期", "").replaceAll(":", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
vodDetail.vod_content = $($(vodDetailElement).find("[class=\"mv_card_box\"]")).text()
|
||||||
|
let playerMap = {}
|
||||||
|
let emebedVideoElements = $("[class=\"row col-md-12 embed_video\"]")
|
||||||
|
let index = 1
|
||||||
|
for (const emebedVideoElement of emebedVideoElements){
|
||||||
|
let vodItems = []
|
||||||
|
let playUrl = $($(emebedVideoElement).find("iframe"))[0].attribs["src"]
|
||||||
|
vodItems.push("播放" + "$" + playUrl);
|
||||||
|
playerMap["在线播放" + index.toString()+ "第一集在线播放预览"] = vodItems.join("#")
|
||||||
|
index = index + 1
|
||||||
|
}
|
||||||
|
let mangetIndex = 1
|
||||||
|
let mangetElements = $("[class=\"row col-md-12 text-white p-3 pt-1\"]").find("[class=\"container\"]")
|
||||||
|
for (const mangenment of mangetElements){
|
||||||
|
let vodItems = []
|
||||||
|
let playElement = $($(mangenment).find("a"))[0]
|
||||||
|
let playUrl = playElement.attribs.href
|
||||||
|
let playName = $(playElement).text()
|
||||||
|
if (playUrl.startsWith("magnet")){
|
||||||
|
vodItems.push(playName + "$" + playUrl);
|
||||||
|
}
|
||||||
|
if (vodItems.length > 0){
|
||||||
|
playerMap["磁力链接" + "-" + mangetIndex] = vodItems.join("#")
|
||||||
|
mangetIndex = mangetIndex + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vodDetail.vod_play_from = Object.keys(playerMap).join("$$$");
|
||||||
|
vodDetail.vod_play_url = Object.values(playerMap).join("$$$");
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let type = extend["1"] ?? "0"
|
||||||
|
let area = extend["2"] ?? "0"
|
||||||
|
let page = parseInt(pg) - 1
|
||||||
|
let url = this.siteUrl + "/" + this.cateObj[tid] + `-${type}-${area}-${page}.html`
|
||||||
|
await this.jadeLog.debug(`分类URL:${url}`)
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
if (flag.indexOf("在线播放") > -1){
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
this.playUrl = Utils.getStrByRegex(/const source = '(.*?)'/,$.html())
|
||||||
|
}else{
|
||||||
|
this.playUrl = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let params = {"classid":"1,2","show":"title","tempid":"1","keyboard":wd}
|
||||||
|
let response = await this.post(this.siteUrl + "/e/search/index.php",params,this.getHeader())
|
||||||
|
let $ = load(response)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new CiliXiongSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
233
18/ds/18js/js/copymanga.js
Normal file
233
18/ds/18js/js/copymanga.js
Normal file
|
|
@ -0,0 +1,233 @@
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {BookDetail, BookShort} from "../lib/book.js";
|
||||||
|
import {Crypto} from "../lib/cat.js";
|
||||||
|
|
||||||
|
class CopyManhuaSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = 'https://www.copymanga.tv';
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🧑🎨|拷贝漫画|🧑🎨"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "拷贝漫画"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "copymanga"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 20
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes.push(this.getTypeDic("全部", "c1"))
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let region = {
|
||||||
|
key: 'region', name: '地區', init: '',
|
||||||
|
};
|
||||||
|
let regionValues = [];
|
||||||
|
regionValues.push({n: '全部', v: ''});
|
||||||
|
regionValues.push({n: '日漫', v: '0'});
|
||||||
|
regionValues.push({n: '韓漫', v: '1'});
|
||||||
|
regionValues.push({n: '美漫', v: '2'});
|
||||||
|
region['value'] = regionValues;
|
||||||
|
let ordering = {
|
||||||
|
key: 'ordering', name: '排序', init: '-datetime_updated',
|
||||||
|
};
|
||||||
|
let orderingValues = [];
|
||||||
|
orderingValues.push({n: '更新時間↓', v: '-datetime_updated'});
|
||||||
|
orderingValues.push({n: '更新時間↑', v: 'datetime_updated'});
|
||||||
|
orderingValues.push({n: '熱門↓', v: '-popular'});
|
||||||
|
orderingValues.push({n: '熱門↑', v: 'popular'});
|
||||||
|
ordering['value'] = orderingValues;
|
||||||
|
let status = {
|
||||||
|
key: 'sort', name: '狀態', init: '',
|
||||||
|
};
|
||||||
|
let statusValues = [];
|
||||||
|
statusValues.push({n: '全部', v: ''});
|
||||||
|
statusValues.push({n: '連載中', v: '0'});
|
||||||
|
statusValues.push({n: '已完結', v: '1'});
|
||||||
|
statusValues.push({n: '短篇', v: '2'});
|
||||||
|
status['value'] = statusValues;
|
||||||
|
let extend_list = []
|
||||||
|
let themeValues = [{n: '全部', v: ''}];
|
||||||
|
for (const a of $('div.classify-right>a[href*="theme="]')) {
|
||||||
|
themeValues.push({
|
||||||
|
n: $(a).text().trim(), v: a.attribs.href.match(/.*?theme=(.*)&/)[1],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
extend_list.push({
|
||||||
|
key: 'theme', name: '', init: '', wrap: 1, value: themeValues,
|
||||||
|
});
|
||||||
|
extend_list.push(region);
|
||||||
|
extend_list.push(status);
|
||||||
|
extend_list.push(ordering);
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + '/comics');
|
||||||
|
this.filterObj['c1'] = await this.getFilter($);
|
||||||
|
}
|
||||||
|
|
||||||
|
parseVodShortFromJson(obj) {
|
||||||
|
let bookShort = new BookShort()
|
||||||
|
bookShort.book_id = obj["path_word"]
|
||||||
|
bookShort.book_name = obj["name"]
|
||||||
|
bookShort.book_pic = obj["cover"]
|
||||||
|
bookShort.book_remarks = obj.author ? obj.author[0].name : '';
|
||||||
|
return bookShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
const list = eval($('div[class="row exemptComic-box"]')[0].attribs.list);
|
||||||
|
let books = [];
|
||||||
|
for (const book of list) {
|
||||||
|
let bookShort = this.parseVodShortFromJson(book)
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vodElements = $("[class=\"container edit\"]").find("[class=\"col-auto\"]")
|
||||||
|
let books = []
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let bookShort = new BookShort()
|
||||||
|
bookShort.book_id = $(vodElement).find("a")[0].attribs.href.split("/comic/")[1]
|
||||||
|
bookShort.book_pic = $(vodElement).find("img")[0].attribs["data-src"]
|
||||||
|
bookShort.book_name = $($(vodElement).find("p")).text()
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($, id) {
|
||||||
|
let bookDetail = new BookDetail()
|
||||||
|
bookDetail.book_pic = $("[class=\"comicParticulars-left-img loadingIcon\"]").find("img")[0].attribs["data-src"]
|
||||||
|
bookDetail.book_name = $('h6').text().trim()
|
||||||
|
bookDetail.book_director = $('span.comicParticulars-right-txt>a[href*="/author/"]')
|
||||||
|
.map((_, a) => $(a).text().trim())
|
||||||
|
.get()
|
||||||
|
.join('/')
|
||||||
|
bookDetail.book_content = $('p.intro').text().trim()
|
||||||
|
let data = JSON.parse(await this.fetch(this.siteUrl + `/comicdetail/${id}/chapters`, null, this.getHeader()))["results"]
|
||||||
|
let key = Crypto.enc.Utf8.parse('xxxmanga.woo.key');
|
||||||
|
let iv = Crypto.enc.Utf8.parse(data.substr(0, 16));
|
||||||
|
let src = Crypto.enc.Hex.parse(data.substr(16));
|
||||||
|
let dst = Crypto.AES.decrypt({ciphertext: src}, key, {iv: iv, padding: Crypto.pad.Pkcs7});
|
||||||
|
dst = Crypto.enc.Utf8.stringify(dst);
|
||||||
|
const groups = JSON.parse(dst).groups;
|
||||||
|
let urls = groups.default["chapters"]
|
||||||
|
.map((c) => {
|
||||||
|
return c.name + '$' + id + '|' + c.id;
|
||||||
|
})
|
||||||
|
.join('#');
|
||||||
|
bookDetail.volumes = '默認';
|
||||||
|
bookDetail.urls = urls;
|
||||||
|
bookDetail.book_id = id
|
||||||
|
return bookDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
const books = [];
|
||||||
|
for (const book of obj) {
|
||||||
|
books.push(this.parseVodShortFromJson(book))
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let page = pg || 1;
|
||||||
|
if (page === 0) page = 1;
|
||||||
|
let link = this.siteUrl + `/comics?theme=${extend.theme || ''}®ion=${extend.region || ''}&status=${extend.status || ''}&ordering=${extend.ordering || '-datetime_updated'}`;
|
||||||
|
if (page > 1) {
|
||||||
|
link += '&offset=' + (page - 1) * 50 + '&limit=50';
|
||||||
|
}
|
||||||
|
let $ = await this.getHtml(link)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + `/comic/${id}`)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let info = id.split('|');
|
||||||
|
let $ = await this.getHtml(this.siteUrl + `/comic/${info[0]}/chapter/${info[1]}`);
|
||||||
|
const data = $('div.imageData')[0].attribs["contentkey"];
|
||||||
|
let key = Crypto.enc.Utf8.parse('xxxmanga.woo.key');
|
||||||
|
let iv = Crypto.enc.Utf8.parse(data.substr(0, 16));
|
||||||
|
let src = Crypto.enc.Hex.parse(data.substr(16));
|
||||||
|
let dst = Crypto.AES.decrypt({ciphertext: src}, key, {iv: iv, padding: Crypto.pad.Pkcs7});
|
||||||
|
dst = Crypto.enc.Utf8.stringify(dst);
|
||||||
|
const list = JSON.parse(dst);
|
||||||
|
let content = [];
|
||||||
|
for (let index = 0; index < list.length; index++) {
|
||||||
|
const element = list[index];
|
||||||
|
content[index] = element.url;
|
||||||
|
}
|
||||||
|
this.playUrl = {
|
||||||
|
"content": content,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let page = 1
|
||||||
|
const link = `${this.siteUrl}/api/kb/web/searcha/comics?offset=${page > 1 ? ((page - 1) * 12).toString() : ''}&platform=2&limit=12&q=${wd}&q_type=`;
|
||||||
|
let list = JSON.parse(await this.fetch(link, null, this.getHeader()))["results"]["list"]
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(list)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new CopyManhuaSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
215
18/ds/18js/js/dj0898_book_open.js
Normal file
215
18/ds/18js/js/dj0898_book_open.js
Normal file
|
|
@ -0,0 +1,215 @@
|
||||||
|
/*
|
||||||
|
* @File : dj0898_book_open.js.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2023/12/22 17:00
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_} from '../lib/cat.js';
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {BookShort} from "../lib/book.js";
|
||||||
|
|
||||||
|
class DJ0898Spider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "http://m.dj0898.com";
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🎵┃世纪DJ音乐网┃🎵"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "世纪DJ音乐网"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "dj0898_book_open"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let books = []
|
||||||
|
const list = $("ul.djddv_djList > li");
|
||||||
|
for (const it of list) {
|
||||||
|
let bookShort = new BookShort();
|
||||||
|
const a = $(it).find("a")[1];
|
||||||
|
bookShort.book_id = a.attribs.href
|
||||||
|
bookShort.book_pic = $(it).find("img:first")[0].attribs.src;
|
||||||
|
const tt = $(it).find("strong:first")[0];
|
||||||
|
bookShort.book_name = tt.children[0].data
|
||||||
|
bookShort.book_remarks = "🎵" + $(it).find("font")[5].children[0].data || ""
|
||||||
|
books.push(bookShort)
|
||||||
|
}
|
||||||
|
return books
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
const list = $("ul.djddv_djList > li");
|
||||||
|
let videos = _.map(list, (it) => {
|
||||||
|
const a = $(it).find("a")[1];
|
||||||
|
const img = $(it).find("img:first")[0];
|
||||||
|
const tt = $(it).find("strong:first")[0];
|
||||||
|
const remarks = $(it).find("font")[5];
|
||||||
|
return {
|
||||||
|
book_id: a.attribs.href,
|
||||||
|
book_name: tt.children[0].data,
|
||||||
|
book_pic: img.attribs["src"],
|
||||||
|
book_remarks: "🎵" + remarks.children[0].data || "",
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0;
|
||||||
|
this.page = hasMore ? parseInt(this.page) + 1 : parseInt(this.page);
|
||||||
|
return videos
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
const list = $("ul.djddv_djList > li");
|
||||||
|
return _.map(list, (it) => {
|
||||||
|
const a = $(it).find("a")[1];
|
||||||
|
const img = $(it).find("img:first")[0];
|
||||||
|
const tt = $(it).find("strong:first")[0];
|
||||||
|
const remarks = $(it).find("font:first")[0];
|
||||||
|
return {
|
||||||
|
book_id: a.attribs.href,
|
||||||
|
book_name: tt.children[0].data,
|
||||||
|
book_pic: img.attribs["src"],
|
||||||
|
book_remarks: "🎵" + remarks.children[0].data || "",
|
||||||
|
};
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc(id) {
|
||||||
|
const vod = {
|
||||||
|
book_id: id,
|
||||||
|
audio: 1,
|
||||||
|
type_name: '',
|
||||||
|
book_year: '',
|
||||||
|
book_area: '',
|
||||||
|
book_remarks: '',
|
||||||
|
book_actor: '',
|
||||||
|
book_director: '',
|
||||||
|
book_content: '',
|
||||||
|
};
|
||||||
|
const playlist = ["点击播放" + "$" + vod.book_id];
|
||||||
|
vod.volumes = "世纪DJ音乐网";
|
||||||
|
vod.urls = playlist.join("#");
|
||||||
|
return vod
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = [{type_id: 1, type_name: "🎧串烧舞曲"}, {type_id: 2, type_name: "🎧外文舞曲"}, {
|
||||||
|
type_id: 3,
|
||||||
|
type_name: "🎧早场暖场"
|
||||||
|
}, {type_id: 4, type_name: "🎧中文舞曲"}, {type_id: 5, type_name: "🎧其他舞曲"}, {
|
||||||
|
type_id: 6,
|
||||||
|
type_name: "🎧国外电音"
|
||||||
|
}, {type_id: 8, type_name: "🎧慢歌连版"}, {type_id: 9, type_name: "🎧酒吧潮歌"}, {
|
||||||
|
type_id: 10,
|
||||||
|
type_name: "🎧中文串烧"
|
||||||
|
}, {type_id: 11, type_name: "🎧外文串烧"}, {type_id: 12, type_name: "🎧中外串烧"}, {
|
||||||
|
type_id: 13,
|
||||||
|
type_name: "🎧车载串烧"
|
||||||
|
}, {type_id: 14, type_name: "🎧越鼓串烧"}, {type_id: 40, type_name: "🎧3D/环绕"}, {
|
||||||
|
type_id: 45,
|
||||||
|
type_name: "🎧口水旋律"
|
||||||
|
}, {type_id: 46, type_name: "🎧精品收藏"}, {type_id: 47, type_name: "🎧开场舞曲"}, {
|
||||||
|
type_id: 48,
|
||||||
|
type_name: "🎧印度舞曲"
|
||||||
|
}, {type_id: 49, type_name: "🎧编排套曲"}, {type_id: 20, type_name: "🎧DuTch"}, {
|
||||||
|
type_id: 21,
|
||||||
|
type_name: "🎧Mash up"
|
||||||
|
}, {type_id: 22, type_name: "🎧ClubHouse"}, {type_id: 23, type_name: "🎧ElectroHouse"}, {
|
||||||
|
type_id: 24,
|
||||||
|
type_name: "🎧越南鼓Dj"
|
||||||
|
}, {type_id: 30, type_name: "🎧Funky"}, {type_id: 31, type_name: "🎧Reggae"}, {
|
||||||
|
type_id: 32,
|
||||||
|
type_name: "🎧Rnb"
|
||||||
|
}, {type_id: 33, type_name: "🎧Hip Hop"}, {type_id: 34, type_name: "🎧Dubstep"}, {
|
||||||
|
type_id: 8017,
|
||||||
|
type_name: "🎧Hardstyle"
|
||||||
|
}, {type_id: 8018, type_name: "🎧Hands Up"}];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + "/dance/lists/id/10/1")
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
const link = this.siteUrl + "/dance/lists/id/" + tid + "/" + pg;
|
||||||
|
let $ = await this.getHtml(link)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
const audio = $("body audio[src*=http]");
|
||||||
|
this.playUrl = audio[0].attribs.src
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + "/index.php/dance/so/key?key=" + wd + "&cid=0&p=1")
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new DJ0898Spider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
246
18/ds/18js/js/doll.js
Normal file
246
18/ds/18js/js/doll.js
Normal file
|
|
@ -0,0 +1,246 @@
|
||||||
|
/*
|
||||||
|
* @File : doll.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/4 14:15
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : doll
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {Crypto, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
class Doll extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://hongkongdollvideo.com"
|
||||||
|
}
|
||||||
|
getImgHeader(){
|
||||||
|
let headers = this.getHeader()
|
||||||
|
headers["Proxy"] = true
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq = null) {
|
||||||
|
if (inReq !== null) {
|
||||||
|
this.jsBase = await js2Proxy(inReq, "img", this.getImgHeader());
|
||||||
|
} else {
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getImgHeader());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtml(url = this.siteUrl, proxy = false, headers = this.getHeader()) {
|
||||||
|
return super.getHtml(url, true, headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃玩偶姐姐┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "玩偶姐姐"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "doll"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"row\"]").find("[class=\"video-detail\"]")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = $(vodElement).find("a")[0].attribs["href"]
|
||||||
|
let videoInfoElements = $($(vodElement).find("[class=\"video-info\"]")).find("a")
|
||||||
|
vodShort.vod_name = videoInfoElements[0].attribs["title"]
|
||||||
|
vodShort.vod_remarks = $(videoInfoElements[1]).text()
|
||||||
|
let pic = $(vodElement).find("img")[0].attribs["data-src"]
|
||||||
|
// if (this.catOpenStatus) {
|
||||||
|
// vodShort.vod_pic = this.jsBase + Utils.base64Encode(pic)
|
||||||
|
// } else {
|
||||||
|
// vodShort.vod_pic = pic
|
||||||
|
// }
|
||||||
|
vodShort.vod_pic = pic
|
||||||
|
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($, key) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
let vodElement = $("[class=\"container-fluid\"]")
|
||||||
|
vodDetail.vod_name = $($(vodElement).find("[class=\"page-title\"]")[0]).text()
|
||||||
|
vodDetail.vod_remarks = $(vodElement).find("[class=\"tag my-1 text-center\"]")[0].attribs["href"].replaceAll("/", "")
|
||||||
|
let pic = $(vodElement).find("video")[0].attribs["poster"]
|
||||||
|
// if (this.catOpenStatus) {
|
||||||
|
// vodDetail.vod_pic = this.jsBase + Utils.base64Encode(pic)
|
||||||
|
// } else {
|
||||||
|
// vodDetail.vod_pic = pic
|
||||||
|
// }
|
||||||
|
vodDetail.vod_pic = pic
|
||||||
|
let html = $.html()
|
||||||
|
let voteTag = Utils.getStrByRegex(/var voteTag="(.*?)";/g, html)
|
||||||
|
// let videoInfoStr = Utils.getStrByRegex(/<script type="application\/ld\+json">(.*?)<\/script>/g, html)
|
||||||
|
// let videoInfo = JSON.parse(videoInfoStr)
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// let play_url_1 = await this.fetch(videoInfo["contentUrl"], null, this.getHeader())
|
||||||
|
// await this.jadeLog.debug(`播放链接为:${play_url_1}`)
|
||||||
|
// } catch (e) {
|
||||||
|
// await this.jadeLog.error(e)
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
voteTag = Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(voteTag))
|
||||||
|
let code = []
|
||||||
|
for (let i = 0; i < voteTag.length; i++) {
|
||||||
|
let k = i % key.length;
|
||||||
|
code.push(String.fromCharCode(voteTag.charCodeAt(i) ^ key.charCodeAt(k)))
|
||||||
|
}
|
||||||
|
let play_url_2 = decodeURIComponent(Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(code.join(""))))
|
||||||
|
vodDetail.vod_play_from = "玩偶姐姐"
|
||||||
|
vodDetail.vod_play_url = "玩偶姐姐" + "$" + play_url_2
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
let navElements = $("[class=\"list-unstyled topnav-menu d-flex d-lg-block align-items-center justify-content-center flex-fill topnav-menu-left m-0\"]").find("li")
|
||||||
|
let index = 1
|
||||||
|
let class_id = index.toString()
|
||||||
|
this.classes = []
|
||||||
|
this.classes.push({"type_name": "首页", "type_id": "1"})
|
||||||
|
this.filterObj[class_id] = []
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_list = $(navElement).text().split("\n")
|
||||||
|
let valueElements = $(navElement).find("a")
|
||||||
|
let valueList = [{"n": "全部", "v": class_id}]
|
||||||
|
let type_id = index.toString()
|
||||||
|
for (const valueElement of valueElements) {
|
||||||
|
let title = $(valueElement).text().replaceAll("\n", "")
|
||||||
|
let href = valueElement.attribs["href"]
|
||||||
|
if (href !== undefined) {
|
||||||
|
valueList.push({"n": title, "v": href})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type_list = type_list.filter(element => element !== "");
|
||||||
|
this.filterObj[class_id].push({"key": type_id, "name": type_list[0], "value": valueList})
|
||||||
|
|
||||||
|
//下面这段是为了切割使用
|
||||||
|
// let new_value_list = []
|
||||||
|
// for (let i = 0; i < valueList.length; i++) {
|
||||||
|
// new_value_list.push(valueList[i])
|
||||||
|
// if (i % 8 === 0 && i !== 0) {
|
||||||
|
// this.filterObj[class_id].push({"key": type_id, "name": type_list[0], "value": new_value_list})
|
||||||
|
// new_value_list = []
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// this.filterObj[class_id].push({"key": type_id, "name": type_list[0], "value": new_value_list})
|
||||||
|
|
||||||
|
}
|
||||||
|
let menuElements = $("[id=\"side-menu\"]").find("li")
|
||||||
|
for (const menuElement of menuElements) {
|
||||||
|
let type_id = $(menuElement).find("a")[0].attribs["href"]
|
||||||
|
if (type_id !== undefined && type_id.indexOf(this.siteUrl) > -1) {
|
||||||
|
let type_dic = {
|
||||||
|
"type_name": $(menuElement).text(), "type_id": type_id
|
||||||
|
}
|
||||||
|
this.classes.push(type_dic)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
if (extend["1"] !== undefined) {
|
||||||
|
if (extend["1"] !== "1") {
|
||||||
|
tid = extend[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await this.jadeLog.info(`tid = ${tid}`)
|
||||||
|
let cateUrl = ""
|
||||||
|
if (tid.indexOf(this.siteUrl) > -1) {
|
||||||
|
cateUrl = tid + pg.toString() + ".html"
|
||||||
|
} else {
|
||||||
|
cateUrl = this.siteUrl
|
||||||
|
}
|
||||||
|
this.limit = 36
|
||||||
|
let $ = await this.getHtml(cateUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
let key = Utils.getStrByRegex(/video\/(\w+).html/, id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
this.playUrl = id
|
||||||
|
this.playHeader = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let searchUrl = this.siteUrl + "search/" + encodeURIComponent(wd)
|
||||||
|
let $ = await this.getHtml(searchUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async proxy(segments, headers) {
|
||||||
|
return super.proxy(segments, headers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new Doll()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
626
18/ds/18js/js/douban.js
Normal file
626
18/ds/18js/js/douban.js
Normal file
|
|
@ -0,0 +1,626 @@
|
||||||
|
/*
|
||||||
|
* @File : nivod.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2023/12/19 14:23
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {VodShort} from "../lib/vod.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {_, Crypto} from "../lib/cat.js";
|
||||||
|
|
||||||
|
|
||||||
|
class DoubanSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = 'https://frodo.douban.com/api/v2'
|
||||||
|
this.apiKey = "0ac44ae016490db2204ce0a042db2916"
|
||||||
|
this.UserAgents = ["api-client/1 com.douban.frodo/7.22.0.beta9(231) Android/23 product/Mate 40 vendor/HUAWEI model/Mate 40 brand/HUAWEI rom/android network/wifi platform/AndroidPad", "api-client/1 com.douban.frodo/7.18.0(230) Android/22 product/MI 9 vendor/Xiaomi model/MI 9 brand/Android rom/miui6 network/wifi platform/mobile nd/1", "api-client/1 com.douban.frodo/7.1.0(205) Android/29 product/perseus vendor/Xiaomi model/Mi MIX 3 rom/miui6 network/wifi platform/mobile nd/1", "api-client/1 com.douban.frodo/7.3.0(207) Android/22 product/MI 9 vendor/Xiaomi model/MI 9 brand/Android rom/miui6 network/wifi platform/mobile nd/1"]
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
return {
|
||||||
|
"Host": "frodo.douban.com",
|
||||||
|
"Connection": "Keep-Alive",
|
||||||
|
"Referer": "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html",
|
||||||
|
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getSearchHeader() {
|
||||||
|
let randomNumber = Math.floor(Math.random() * this.UserAgents.length); // 生成一个介于0到9之间的随机整数
|
||||||
|
return {
|
||||||
|
'User-Agent': this.UserAgents[randomNumber]
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🍥┃豆瓣┃🍥"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "豆瓣"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "douban"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let classes = [{
|
||||||
|
"type_name": "热门电影", "type_id": "hot_gaia"
|
||||||
|
}, {
|
||||||
|
"type_name": "热播剧集", "type_id": "tv_hot"
|
||||||
|
}, {
|
||||||
|
"type_name": "热播综艺", "type_id": "show_hot"
|
||||||
|
}, {
|
||||||
|
"type_name": "电影筛选", "type_id": "movie"
|
||||||
|
}, {
|
||||||
|
"type_name": "电视筛选", "type_id": "tv"
|
||||||
|
}, {
|
||||||
|
"type_name": "电影榜单", "type_id": "rank_list_movie"
|
||||||
|
}, {
|
||||||
|
"type_name": "电视剧榜单", "type_id": "rank_list_tv"
|
||||||
|
}]
|
||||||
|
for (const class_dic of classes) {
|
||||||
|
this.classes.push({"type_name": class_dic["type_name"], "type_id": class_dic["type_id"]})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
this.filterObj = {
|
||||||
|
"hot_gaia": [{
|
||||||
|
"key": "sort", "name": "排序", "value": [{
|
||||||
|
"n": "热度", "v": "recommend"
|
||||||
|
}, {
|
||||||
|
"n": "最新", "v": "time"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rank"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "area", "name": "地区", "value": [{
|
||||||
|
"n": "全部", "v": "全部"
|
||||||
|
}, {
|
||||||
|
"n": "华语", "v": "华语"
|
||||||
|
}, {
|
||||||
|
"n": "欧美", "v": "欧美"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "韩国"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "日本"
|
||||||
|
}]
|
||||||
|
}], "tv_hot": [{
|
||||||
|
"key": "type", "name": "分类", "value": [{
|
||||||
|
"n": "综合", "v": "tv_hot"
|
||||||
|
}, {
|
||||||
|
"n": "国产剧", "v": "tv_domestic"
|
||||||
|
}, {
|
||||||
|
"n": "欧美剧", "v": "tv_american"
|
||||||
|
}, {
|
||||||
|
"n": "日剧", "v": "tv_japanese"
|
||||||
|
}, {
|
||||||
|
"n": "韩剧", "v": "tv_korean"
|
||||||
|
}, {
|
||||||
|
"n": "动画", "v": "tv_animation"
|
||||||
|
}]
|
||||||
|
}], "show_hot": [{
|
||||||
|
"key": "type", "name": "分类", "value": [{
|
||||||
|
"n": "综合", "v": "show_hot"
|
||||||
|
}, {
|
||||||
|
"n": "国内", "v": "show_domestic"
|
||||||
|
}, {
|
||||||
|
"n": "国外", "v": "show_foreign"
|
||||||
|
}]
|
||||||
|
}], "movie": [{
|
||||||
|
"key": "类型", "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": "纪录片"
|
||||||
|
}, {
|
||||||
|
"n": "短片", "v": "短片"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "地区", "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": "巴西"
|
||||||
|
}, {
|
||||||
|
"n": "丹麦", "v": "丹麦"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "sort", "name": "排序", "value": [{
|
||||||
|
"n": "近期热度", "v": "T"
|
||||||
|
}, {
|
||||||
|
"n": "首映时间", "v": "R"
|
||||||
|
}, {
|
||||||
|
"n": "高分优先", "v": "S"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "年代", "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": "2010年代", "v": "2010年代"
|
||||||
|
}, {
|
||||||
|
"n": "2000年代", "v": "2000年代"
|
||||||
|
}, {
|
||||||
|
"n": "90年代", "v": "90年代"
|
||||||
|
}, {
|
||||||
|
"n": "80年代", "v": "80年代"
|
||||||
|
}, {
|
||||||
|
"n": "70年代", "v": "70年代"
|
||||||
|
}, {
|
||||||
|
"n": "60年代", "v": "60年代"
|
||||||
|
}, {
|
||||||
|
"n": "更早", "v": "更早"
|
||||||
|
}]
|
||||||
|
}], "tv": [{
|
||||||
|
"key": "类型", "name": "类型", "value": [{
|
||||||
|
"n": "不限", "v": ""
|
||||||
|
}, {
|
||||||
|
"n": "电视剧", "v": "电视剧"
|
||||||
|
}, {
|
||||||
|
"n": "综艺", "v": "综艺"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "电视剧形式", "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": "综艺形式", "name": "综艺形式", "value": [{
|
||||||
|
"n": "不限", "v": ""
|
||||||
|
}, {
|
||||||
|
"n": "真人秀", "v": "真人秀"
|
||||||
|
}, {
|
||||||
|
"n": "脱口秀", "v": "脱口秀"
|
||||||
|
}, {
|
||||||
|
"n": "音乐", "v": "音乐"
|
||||||
|
}, {
|
||||||
|
"n": "歌舞", "v": "歌舞"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "地区", "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": "加拿大"
|
||||||
|
}, {
|
||||||
|
"n": "爱尔兰", "v": "爱尔兰"
|
||||||
|
}, {
|
||||||
|
"n": "澳大利亚", "v": "澳大利亚"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "sort", "name": "排序", "value": [{
|
||||||
|
"n": "近期热度", "v": "T"
|
||||||
|
}, {
|
||||||
|
"n": "首播时间", "v": "R"
|
||||||
|
}, {
|
||||||
|
"n": "高分优先", "v": "S"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "年代", "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": "2010年代", "v": "2010年代"
|
||||||
|
}, {
|
||||||
|
"n": "2000年代", "v": "2000年代"
|
||||||
|
}, {
|
||||||
|
"n": "90年代", "v": "90年代"
|
||||||
|
}, {
|
||||||
|
"n": "80年代", "v": "80年代"
|
||||||
|
}, {
|
||||||
|
"n": "70年代", "v": "70年代"
|
||||||
|
}, {
|
||||||
|
"n": "60年代", "v": "60年代"
|
||||||
|
}, {
|
||||||
|
"n": "更早", "v": "更早"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "平台", "name": "平台", "value": [{
|
||||||
|
"n": "全部", "v": ""
|
||||||
|
}, {
|
||||||
|
"n": "腾讯视频", "v": "腾讯视频"
|
||||||
|
}, {
|
||||||
|
"n": "爱奇艺", "v": "爱奇艺"
|
||||||
|
}, {
|
||||||
|
"n": "优酷", "v": "优酷"
|
||||||
|
}, {
|
||||||
|
"n": "湖南卫视", "v": "湖南卫视"
|
||||||
|
}, {
|
||||||
|
"n": "Netflix", "v": "Netflix"
|
||||||
|
}, {
|
||||||
|
"n": "HBO", "v": "HBO"
|
||||||
|
}, {
|
||||||
|
"n": "BBC", "v": "BBC"
|
||||||
|
}, {
|
||||||
|
"n": "NHK", "v": "NHK"
|
||||||
|
}, {
|
||||||
|
"n": "CBS", "v": "CBS"
|
||||||
|
}, {
|
||||||
|
"n": "NBC", "v": "NBC"
|
||||||
|
}, {
|
||||||
|
"n": "tvN", "v": "tvN"
|
||||||
|
}]
|
||||||
|
}], "rank_list_movie": [{
|
||||||
|
"key": "榜单", "name": "榜单", "value": [{
|
||||||
|
"n": "实时热门电影", "v": "movie_real_time_hotest"
|
||||||
|
}, {
|
||||||
|
"n": "一周口碑电影榜", "v": "movie_weekly_best"
|
||||||
|
}, {
|
||||||
|
"n": "豆瓣电影Top250", "v": "movie_top250"
|
||||||
|
}]
|
||||||
|
}], "rank_list_tv": [{
|
||||||
|
"key": "榜单", "name": "榜单", "value": [{
|
||||||
|
"n": "实时热门电视", "v": "tv_real_time_hotest"
|
||||||
|
}, {
|
||||||
|
"n": "华语口碑剧集榜", "v": "tv_chinese_best_weekly"
|
||||||
|
}, {
|
||||||
|
"n": "全球口碑剧集榜", "v": "tv_global_best_weekly"
|
||||||
|
}, {
|
||||||
|
"n": "国内口碑综艺榜", "v": "show_chinese_best_weekly"
|
||||||
|
}, {
|
||||||
|
"n": "国外口碑综艺榜", "v": "show_global_best_weekly"
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
for (const item of obj) {
|
||||||
|
let vod_short = new VodShort()
|
||||||
|
vod_short.vod_id = "msearch:" + item["id"]
|
||||||
|
if (item["title"] === undefined) {
|
||||||
|
vod_short.vod_name = item["target"]["title"]
|
||||||
|
} else {
|
||||||
|
vod_short.vod_name = item["title"]
|
||||||
|
}
|
||||||
|
if (item["pic"] === undefined) {
|
||||||
|
vod_short.vod_pic = item["target"]["cover_url"]
|
||||||
|
} else {
|
||||||
|
vod_short.vod_pic = item["pic"]["normal"]
|
||||||
|
}
|
||||||
|
if (item["rating"] === undefined) {
|
||||||
|
vod_short.vod_remarks = "评分:" + item["target"]["rating"]["value"].toString()
|
||||||
|
} else {
|
||||||
|
vod_short.vod_remarks = "评分:" + item["rating"]["value"].toString()
|
||||||
|
}
|
||||||
|
vod_list.push(vod_short);
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
get_tags(extend) {
|
||||||
|
let tag_list = []
|
||||||
|
for (const key of Object.keys(extend)) {
|
||||||
|
if (key !== "sort") {
|
||||||
|
tag_list.push(extend[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tag_list.join(",")
|
||||||
|
}
|
||||||
|
|
||||||
|
sign(url, ts, method = 'GET') {
|
||||||
|
let _api_secret_key = "bf7dddc7c9cfe6f7"
|
||||||
|
let url_path = "%2F" + url.split("/").slice(3).join("%2F")
|
||||||
|
let raw_sign = [method.toLocaleUpperCase(), url_path, ts.toString()].join("&")
|
||||||
|
return Crypto.HmacSHA1(raw_sign, _api_secret_key).toString(Crypto.enc.Base64)
|
||||||
|
}
|
||||||
|
async setHomeVod() {
|
||||||
|
let url = this.siteUrl + "/subject_collection/subject_real_time_hotest/items"
|
||||||
|
let content = await this.fetch(url, {"apikey": this.apiKey}, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let items = content_json["subject_collection_items"]
|
||||||
|
this.homeVodList = await this.parseVodShortListFromJson(items)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let sort = extend["sort"] ?? "show_hot";
|
||||||
|
let tag_str = this.get_tags(extend)
|
||||||
|
this.count = 0
|
||||||
|
this.limit = 20;
|
||||||
|
this.total = 0;
|
||||||
|
let start = 0
|
||||||
|
if (parseInt(pg) > 1){
|
||||||
|
start = (parseInt(pg) - 1) * this.limit
|
||||||
|
}
|
||||||
|
let cateUrl = ""
|
||||||
|
let params = {"start": start.toString(), "count": this.limit.toString()}
|
||||||
|
let itemKey = "items"
|
||||||
|
switch (tid) {
|
||||||
|
case "hot_gaia":
|
||||||
|
sort = extend["sort"] ?? "recommend"
|
||||||
|
let area = extend["area"] ?? "全部"
|
||||||
|
params["sort"] = sort
|
||||||
|
params["area"] = area
|
||||||
|
cateUrl = "/movie/hot_gaia"
|
||||||
|
break
|
||||||
|
case "tv_hot":
|
||||||
|
let type = extend["type"] ?? "tv_hot"
|
||||||
|
cateUrl = "/subject_collection/" + type + "/items"
|
||||||
|
itemKey = "subject_collection_items"
|
||||||
|
break
|
||||||
|
case "show_hot":
|
||||||
|
let showType = extend["type"] ?? "show_hot"
|
||||||
|
cateUrl = "/subject_collection/" + showType + "/items"
|
||||||
|
itemKey = "subject_collection_items";
|
||||||
|
break
|
||||||
|
case "movie":
|
||||||
|
params["sort"] = sort
|
||||||
|
params["tags"] = tag_str
|
||||||
|
cateUrl = "/movie/recommend"
|
||||||
|
break
|
||||||
|
case "tv":
|
||||||
|
params["sort"] = sort
|
||||||
|
params["tags"] = tag_str
|
||||||
|
cateUrl = "/tv/recommend"
|
||||||
|
break
|
||||||
|
case "rank_list_movie":
|
||||||
|
let rankMovieType = extend["榜单"] ?? "movie_real_time_hotest"
|
||||||
|
cateUrl = "/subject_collection/" + rankMovieType + "/items"
|
||||||
|
itemKey = "subject_collection_items"
|
||||||
|
break
|
||||||
|
case "rank_list_tv":
|
||||||
|
let rankTVType = extend["榜单"] ?? "tv_real_time_hotest"
|
||||||
|
cateUrl = "/subject_collection/" + rankTVType + "/items"
|
||||||
|
itemKey = "subject_collection_items"
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
params["apikey"] = this.apiKey
|
||||||
|
let content = await this.fetch(this.siteUrl + cateUrl, params, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let items = content_json[itemKey]
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(items)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let _api_url = "https://frodo.douban.com/api/v2"
|
||||||
|
let _api_key = "0dad551ec0f84ed02907ff5c42e8ec70"
|
||||||
|
let url = _api_url + "/search/movie"
|
||||||
|
let date = new Date()
|
||||||
|
let ts = date.getFullYear().toString() + (date.getMonth() + 1).toString() + date.getDate().toString()
|
||||||
|
let params = {
|
||||||
|
'_sig': this.sign(url, ts),
|
||||||
|
'_ts': ts,
|
||||||
|
'apiKey': _api_key,
|
||||||
|
'count': 20,
|
||||||
|
'os_rom': 'android',
|
||||||
|
'q': encodeURIComponent(wd),
|
||||||
|
'start': 0
|
||||||
|
}
|
||||||
|
let content = await this.fetch(url, params, this.getSearchHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(content_json["items"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new DoubanSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
280
18/ds/18js/js/dygangs.js
Normal file
280
18/ds/18js/js/dygangs.js
Normal file
|
|
@ -0,0 +1,280 @@
|
||||||
|
/*
|
||||||
|
* @File : dygangs.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/2/21 15:06
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 电影港
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {_, load} from "../lib/cat.js";
|
||||||
|
|
||||||
|
|
||||||
|
class MoviePortSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.dygangs.xyz"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "电影港"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🏖️┃电影港┃🏖️"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "dygangs"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let navElements = $($("[class=\"top-nav\"]")[0]).find("a")
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_id = navElement.attribs.href.replaceAll(this.siteUrl, "")
|
||||||
|
let type_name = $(navElement).text()
|
||||||
|
if (type_id !== "/") {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async getFilter($, index) {
|
||||||
|
let element = $("[class=\"nav-down-2 clearfix\"]")[index]
|
||||||
|
let extend_list = []
|
||||||
|
if (element !== undefined) {
|
||||||
|
let name = "按类型"
|
||||||
|
let extend_dic = {"key": name, "name": name, "value": []}
|
||||||
|
extend_dic["name"] = name
|
||||||
|
extend_dic["value"].push({"n": "全部", "v": "0"})
|
||||||
|
for (const ele of $(element).find("a")) {
|
||||||
|
let type_name = $(ele).html()
|
||||||
|
let type_id = ele.attribs.href.split("/").slice(-2)[0]
|
||||||
|
extend_dic["value"].push({"n": type_name, "v": type_id})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
let index = 0
|
||||||
|
for (const type_dic of this.classes.slice(1, 5)) {
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
if (type_id !== "最近更新") {
|
||||||
|
let url = this.siteUrl + `${type_id}`
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($, index)
|
||||||
|
}
|
||||||
|
index = index + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parseVodShortFromElement($, element) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = element.attribs.href
|
||||||
|
vodShort.vod_name = element.attribs.title
|
||||||
|
vodShort.vod_pic = $(element).find("img")[0].attribs["data-original"]
|
||||||
|
vodShort.vod_remarks = $($(element).find("i")[0]).text().replaceAll(" ", "").replaceAll("\n", "")
|
||||||
|
if (_.isEmpty(vodShort.vod_pic)){
|
||||||
|
vodShort.vod_pic = Utils.RESOURCEURL + "/resources/dygang.jpg"
|
||||||
|
}
|
||||||
|
return vodShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"index-tj-l\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShortElement = $(vodElement).find("a")[0]
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodShortElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"index-area clearfix\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShortElement = $(vodElement).find("a")[0]
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodShortElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
let vodDetailElement = $("[ class=\"ct mb clearfix\"]")
|
||||||
|
vodDetail.vod_pic = $(vodDetailElement).find("img")[0].attribs["src"]
|
||||||
|
vodDetail.vod_name = Utils.getStrByRegex(/◎片 名 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
vodDetail.vod_area = Utils.getStrByRegex(/◎产 地 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
vodDetail.vod_year = Utils.getStrByRegex(/◎年 代 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
vodDetail.type_name = Utils.getStrByRegex(/◎类 别 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
vodDetail.vod_remarks = Utils.getStrByRegex(/◎集 数 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
let content = Utils.getStrByRegex(/◎主 演 (.*?)<\/p>/s, $(vodDetailElement).html())
|
||||||
|
if (_.isEmpty(content)) {
|
||||||
|
content = Utils.getStrByRegex(/◎演 员 (.*?)<\/p>/s, $(vodDetailElement).html())
|
||||||
|
}
|
||||||
|
let actor_list = []
|
||||||
|
for (const actor of content.split("\n")) {
|
||||||
|
actor_list.push(actor.replaceAll(" ", "").replaceAll("<br>", "").replaceAll(" ", ""))
|
||||||
|
}
|
||||||
|
vodDetail.vod_actor = actor_list.join("/")
|
||||||
|
vodDetail.vod_director = Utils.getStrByRegex(/◎导 演 (.*?)<br>/, $(vodDetailElement).html())
|
||||||
|
vodDetail.vod_content = Utils.getStrByRegex(/◎简 介<\/p>(.*?)<br>/s, $(vodDetailElement).html()).replaceAll("<p>", "").replaceAll("\n", "")
|
||||||
|
if (_.isEmpty(vodDetail.vod_content)) {
|
||||||
|
vodDetail.vod_content = Utils.getStrByRegex(/◎简 介<br>(.*?)<\/p>/s, $(vodDetailElement).html()).replaceAll("<p>", "").replaceAll("\n", "")
|
||||||
|
|
||||||
|
}
|
||||||
|
let vod_play_from_list = []
|
||||||
|
let vod_play_list = []
|
||||||
|
|
||||||
|
|
||||||
|
let playFormatElements = $("[class=\"playfrom tab8 clearfix\"]")
|
||||||
|
let playUrlElements = $("[class=\"videourl clearfix\"]")
|
||||||
|
for (let i = 0; i < playFormatElements.length; i++) {
|
||||||
|
let playFormatElement = playFormatElements[i]
|
||||||
|
let format_name = $($(playFormatElement).find("li")).html()
|
||||||
|
vod_play_from_list.push(format_name.replaceAll("<i class=\"playerico ico-Azhan\"></i> ", ""))
|
||||||
|
let vodItems = []
|
||||||
|
for (const playUrlElement of $(playUrlElements[i]).find("a")) {
|
||||||
|
let episodeName = playUrlElement.attribs.title
|
||||||
|
let episodeUrl = playUrlElement.attribs.href
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
|
||||||
|
}
|
||||||
|
let playFormatElement = $($(vodDetailElement).find("span")[0]).find("span")
|
||||||
|
if (playFormatElement.length > 0) {
|
||||||
|
let format_name = $(playFormatElement).html()
|
||||||
|
vod_play_from_list.push(Utils.getStrByRegex(/【(.*?)】/, format_name.replaceAll("下载地址", "磁力链接")))
|
||||||
|
let vodItems = []
|
||||||
|
for (const playUrlElement of $($($(vodDetailElement).find("tbody")).find("tr")).find("a")) {
|
||||||
|
let episodeName = $(playUrlElement).html().replaceAll(".mp4", "")
|
||||||
|
let episodeUrl = playUrlElement.attribs.href
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let url = this.siteUrl + tid
|
||||||
|
if (extend["按类型"] !== undefined && extend["按类型"] !== "0") {
|
||||||
|
url = url + `${extend["按类型"]}/`
|
||||||
|
}
|
||||||
|
if (parseInt(pg) > 1) {
|
||||||
|
url = url + `index_${pg}.html`
|
||||||
|
}
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let url = this.siteUrl + "/e/search/index.php"
|
||||||
|
let params = {"keyboard": wd, "submit": "搜 索", "show": "title,zhuyan", "tempid": "1"}
|
||||||
|
let resp = await this.post(url, params, this.getHeader())
|
||||||
|
let $ = load(resp)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
if (id.indexOf("http") > -1) {
|
||||||
|
let $ = await this.getHtml(id)
|
||||||
|
let url = Utils.getStrByRegex(/url: '(.*?)',/, $.html())
|
||||||
|
if (_.isEmpty(url)) {
|
||||||
|
let videoUrl = $($("[class=\"video\"]")[0]).find("iframe")[0].attribs["src"]
|
||||||
|
let html = await this.fetch(videoUrl, null, {"User-Agent": Utils.CHROME})
|
||||||
|
this.playUrl = Utils.getStrByRegex(/url: '(.*?)',/, html)
|
||||||
|
if (_.isEmpty(this.playUrl)){
|
||||||
|
let urlHost = Utils.getHost(videoUrl)
|
||||||
|
this.playUrl = urlHost + Utils.getStrByRegex(/var main = "(.*?)";/, html)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.playUrl = url
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.playUrl = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new MoviePortSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
214
18/ds/18js/js/dyttbt.js
Normal file
214
18/ds/18js/js/dyttbt.js
Normal file
|
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
* @File : freeok.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/19 10:26
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 电影天堂(已失效)
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
|
||||||
|
class DyttSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.dy2018.com"
|
||||||
|
this.dyttReconnectTimes = 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return `👼┃电影天堂BT┃👼`
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "电影天堂BT"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "dyttbt"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
// getHeader() {
|
||||||
|
// return {"User-Agent": "PostmanRuntime/7.36.1", "Host":"www.dy2018.com"};
|
||||||
|
// }
|
||||||
|
|
||||||
|
async getHtml(url = this.siteUrl, headers = this.getHeader()) {
|
||||||
|
try {
|
||||||
|
let buffer = await this.fetch(url, null, headers, false, false, 1)
|
||||||
|
let html = Utils.decode(buffer, "gb2312")
|
||||||
|
if (!_.isEmpty(html) && Utils.getStrByRegex(/<script src="(.*?)"><\/script>/, html) !== "/_guard/auto.js") {
|
||||||
|
return load(html)
|
||||||
|
} else {
|
||||||
|
if (this.dyttReconnectTimes < this.maxReconnectTimes) {
|
||||||
|
Utils.sleep(2)
|
||||||
|
this.dyttReconnectTimes = this.dyttReconnectTimes + 1
|
||||||
|
return await this.getHtml(url, headers)
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.error(`html获取失败`, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
await this.jadeLog.error(`获取html出错,出错原因为${e}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let vodShortElements = $("[class=\"title_all\"]")
|
||||||
|
for (const vodShortElement of vodShortElements) {
|
||||||
|
let spanElement = $(vodShortElement).find("span")[0]
|
||||||
|
let aElement = $(vodShortElement).find("a")[0]
|
||||||
|
let type_name = $(spanElement).text()
|
||||||
|
let type_id = aElement.attribs["href"]
|
||||||
|
if (type_id.indexOf("https:") === -1 && type_id.indexOf("http:") === -1) {
|
||||||
|
type_id = this.siteUrl + type_id
|
||||||
|
}
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
let containElements = $($("[id=\"menu\"]").find("[class=\"contain\"]")).find("a").slice(0, -3)
|
||||||
|
for (const contaElement of containElements) {
|
||||||
|
let type_name = $(contaElement).text()
|
||||||
|
let type_id = contaElement.attribs["href"]
|
||||||
|
if (type_id.indexOf("https:") === -1 && type_id.indexOf("http:") === -1) {
|
||||||
|
type_id = this.siteUrl + type_id
|
||||||
|
}
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodShortElements = $($("[class=\"co_content8\"]")[0]).find("tbody")
|
||||||
|
for (const vodShortElement of vodShortElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let vodElements = $(vodShortElement).find("tr")
|
||||||
|
vodShort.vod_name = Utils.getStrByRegex(/《(.*?)》/, $(vodElements[1]).text())
|
||||||
|
vodShort.vod_id = $(vodElements[1]).find("a").slice(-1)[0].attribs.href
|
||||||
|
vodShort.vod_remarks = "日期:" + Utils.getStrByRegex(/日期:(.*?) /, $(vodElements[2]).text()) + " 热度:" + Utils.getStrByRegex(/点击:(.*?) /, $(vodElements[2]).text())
|
||||||
|
vodShort.vod_pic = Utils.RESOURCEURL + "/resources/dytt.jpg"
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodShortElements = $($("[class=\"co_area2\"]")[0]).find("li").slice(1)
|
||||||
|
for (const vodShortElement of vodShortElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let vodElement = $(vodShortElement).find("a")[0]
|
||||||
|
vodShort.vod_id = vodElement.attribs["href"]
|
||||||
|
vodShort.vod_name = Utils.getStrByRegex(/《(.*?)》/, vodElement.attribs["title"])
|
||||||
|
vodShort.vod_remarks = $($(vodShortElement).find("span")).text().replaceAll("", "")
|
||||||
|
vodShort.vod_pic = Utils.RESOURCEURL + "/resources/dytt.jpg"
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = Utils.getStrByRegex(/《(.*?)》/, Utils.getStrByRegex(/<title>(.*?)<\/title>/, $.html()))
|
||||||
|
let zoomElement = $("[id=\"Zoom\"]")
|
||||||
|
vodDetail.vod_pic = $(zoomElement).find("img")[0].attribs.src
|
||||||
|
let content = $(zoomElement).text()
|
||||||
|
vodDetail.vod_year = Utils.getStrByRegex(/年 代 (.*?)◎/, content)
|
||||||
|
vodDetail.type_name = Utils.getStrByRegex(/类 别 (.*?)◎/, content)
|
||||||
|
vodDetail.vod_area = Utils.getStrByRegex(/产 地 (.*?)◎/, content)
|
||||||
|
vodDetail.vod_director = Utils.getStrByRegex(/导 演 (.*?)◎/, content)
|
||||||
|
vodDetail.vod_content = Utils.getStrByRegex(/简 介 (.*?)◎/, content)
|
||||||
|
vodDetail.vod_actor = Utils.getStrByRegex(/主 演(.*?)◎/, content).replaceAll(" ", "*")
|
||||||
|
vodDetail.vod_remarks = Utils.getStrByRegex(/豆瓣评分 (.*?)\//, content)
|
||||||
|
vodDetail.vod_play_from = "磁力链接"
|
||||||
|
let playList = $(zoomElement).find("[class=\"player_list\"]").find("a")
|
||||||
|
let vodItems = []
|
||||||
|
for (const playEle of playList) {
|
||||||
|
vodItems.push($(playEle).text() + "$" + playEle.attribs.href);
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_url = [vodItems.join("#")].join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let cateUrl = tid
|
||||||
|
if (tid.indexOf("index") > -1){
|
||||||
|
cateUrl = tid.split(".html")[0] + "_" + pg + ".html"
|
||||||
|
}
|
||||||
|
let $ = await this.getHtml(cateUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new DyttSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
96
18/ds/18js/js/feifan.js
Normal file
96
18/ds/18js/js/feifan.js
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* @File : feifan.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/02/06 14:58
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 非凡资源
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {VodSpider} from "./vodSpider.js";
|
||||||
|
|
||||||
|
class FeiFanSpider extends VodSpider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "http://cj.ffzyapi.com"
|
||||||
|
this.remove18 = true
|
||||||
|
this.type_id_18 = 34
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "非凡资源"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🥗┃非凡资源┃🥗"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "feifan"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq) {
|
||||||
|
await super.spiderInit(inReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new FeiFanSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
96
18/ds/18js/js/feifan18.js
Normal file
96
18/ds/18js/js/feifan18.js
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* @File : feifan.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/02/06 14:58
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 非凡资源
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {VodSpider} from "./vodSpider.js";
|
||||||
|
|
||||||
|
class FeiFan18Spider extends VodSpider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "http://cj.ffzyapi.com"
|
||||||
|
this.remove18 = false
|
||||||
|
this.type_id_18 = 34
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "非凡资源18+"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃非凡资源18+┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "feifan18"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq) {
|
||||||
|
await super.spiderInit(inReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new FeiFan18Spider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
333
18/ds/18js/js/freeok.js
Normal file
333
18/ds/18js/js/freeok.js
Normal file
|
|
@ -0,0 +1,333 @@
|
||||||
|
/*
|
||||||
|
* @File : freeok.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/19 10:26
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : OK资源网 已失效
|
||||||
|
*/
|
||||||
|
import {_} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {player} from "../lib/freeok_setttings.js";
|
||||||
|
const OCR_API = 'https://api.nn.ci/ocr/b64/text';//ocr在线识别接口
|
||||||
|
|
||||||
|
|
||||||
|
class OkSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.freeok.vip"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return `🆗┃OK资源网┃🆗`
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return `OK资源网`
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "freeok"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
async init(cfg) {
|
||||||
|
this.cookie = await this.load_cache()
|
||||||
|
await super.init(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $($("[class=\"module\"]")).find("a").slice(0, 12)
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
vod_list.push(this.parseVodShortFromElement($, vodElement))
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
parseVodShortFromElement($, element) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_name = element.attribs["title"]
|
||||||
|
vodShort.vod_id = element.attribs["href"]
|
||||||
|
vodShort.vod_remarks = $($(element).find("[class=\"module-item-note\"]")).text()
|
||||||
|
vodShort.vod_pic = $(element).find("[class=\"lazy lazyload\"]")[0].attribs["data-original"]
|
||||||
|
return vodShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let itemElements = $($("[class=\"module-items module-poster-items-base \"]")).find("a")
|
||||||
|
for (const itemElement of itemElements) {
|
||||||
|
vod_list.push(this.parseVodShortFromElement($, itemElement))
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
for (const result of obj["Data"]["result"]){
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = result["vod_url"].replaceAll(this.siteUrl,"")
|
||||||
|
vodShort.vod_pic = result["vod_pic"]
|
||||||
|
vodShort.vod_name = result["vod_name"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByHot($) {
|
||||||
|
let vod_list = []
|
||||||
|
let itemElement = $($("[class=\"module-items module-card-items\"]"))[0]
|
||||||
|
let titleElements = $(itemElement).find("[class=\"module-card-item-title\"]").find("a")
|
||||||
|
let infoElements = $(itemElement).find("[class=\"module-card-item-info\"]")
|
||||||
|
let picElements = $(itemElement).find("[class=\"module-item-pic\"]").find("img")
|
||||||
|
|
||||||
|
for (let i = 0; i < titleElements.length; i++) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = titleElements[i].attribs["href"]
|
||||||
|
vodShort.vod_name = $(titleElements[i]).text()
|
||||||
|
vodShort.vod_pic = picElements[i].attribs["data-original"]
|
||||||
|
vodShort.vod_remarks = $($(infoElements[i])).text().split("\n")[5]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
let moudleElements = $("[class=\"module-info-tag-link\"]").find("a")
|
||||||
|
let mobilePlay = $("[class=\"module-mobile-play\"]").find("a")[0]
|
||||||
|
vodDetail.vod_name = mobilePlay.attribs["title"].replaceAll("立刻播放", "")
|
||||||
|
vodDetail.vod_content = $($("[class=\"module-info-introduction-content\"]")).text().replaceAll("\n", "").replaceAll(" ", "")
|
||||||
|
let type_list = []
|
||||||
|
for (const moudleElement of moudleElements.slice(2)) {
|
||||||
|
type_list.push($(moudleElement).text())
|
||||||
|
}
|
||||||
|
vodDetail.type_name = type_list.join("/")
|
||||||
|
vodDetail.vod_year = $(moudleElements[0]).text()
|
||||||
|
vodDetail.vod_area = $(moudleElements[1]).text()
|
||||||
|
let itemElements = $("[class=\"module-info-item\"]")
|
||||||
|
let itemText = ""
|
||||||
|
for (const itemElement of itemElements) {
|
||||||
|
itemText = itemText + $(itemElement).text().replaceAll("\n", "").replaceAll(":", ":") + "\n"
|
||||||
|
}
|
||||||
|
vodDetail.vod_pic = $("[class=\"module-item-pic\"]").find("img")[0].attribs["data-original"]
|
||||||
|
vodDetail.vod_director = Utils.getStrByRegex(/导演:(.*?)\n/, itemText)
|
||||||
|
vodDetail.vod_actor = Utils.getStrByRegex(/主演:(.*?)\n/, itemText)
|
||||||
|
vodDetail.vod_year = Utils.getStrByRegex(/上映:(.*?)\n/, itemText)
|
||||||
|
vodDetail.vod_remarks = Utils.getStrByRegex(/备注:(.*?)\n/, itemText)
|
||||||
|
if (_.isEmpty(vodDetail.vod_remarks)) {
|
||||||
|
vodDetail.vod_remarks = Utils.getStrByRegex(/集数:(.*?)\n/, itemText)
|
||||||
|
}
|
||||||
|
let playElements = $($("[class=\"module-tab-items-box hisSwiper\"]")).find("span")
|
||||||
|
let play_from_list = []
|
||||||
|
let playUrlElements = $("[class=\"module-list sort-list tab-list his-tab-list\"]")
|
||||||
|
let play_url_list = []
|
||||||
|
for (let i = 0; i < playElements.length; i++) {
|
||||||
|
let text = $(playElements[i]).text()
|
||||||
|
if (text.indexOf("夸克") === -1) {
|
||||||
|
let playDetailElements = $(playUrlElements[i]).find("a")
|
||||||
|
let vodItems = []
|
||||||
|
for (const playDetailElement of playDetailElements) {
|
||||||
|
let play_name = playDetailElement.attribs["title"].replaceAll("播放", "").replaceAll(vodDetail.vod_name, "")
|
||||||
|
let play_url = playDetailElement.attribs["href"]
|
||||||
|
vodItems.push(`${play_name}$${play_url}`)
|
||||||
|
}
|
||||||
|
play_url_list.push(vodItems.join("#"))
|
||||||
|
play_from_list.push($(playElements[i]).text())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = play_url_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl, this.getHeader())
|
||||||
|
let navElements = $($("[class=\"navbar-items swiper-wrapper\"]")).find("a")
|
||||||
|
let type_name = $(navElements.slice(0, 8).slice(-1)[0]).text().replaceAll("\n", "")
|
||||||
|
let type_id = navElements.slice(0, 8).slice(-1)[0].attribs["href"]
|
||||||
|
this.classes.push({"type_name": type_name, "type_id": type_id})
|
||||||
|
for (const navElement of navElements.slice(0, 8)) {
|
||||||
|
let type_name = $(navElement).text().replaceAll("\n", "")
|
||||||
|
if (type_name !== "首页" && type_name !== "热榜") {
|
||||||
|
let type_id = navElement.attribs["href"].split("/").slice(-1)[0].split(".")[0]
|
||||||
|
this.classes.push({"type_name": type_name, "type_id": type_id})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let titleElements = $("[class=\"module-item-title\"]")
|
||||||
|
let boxElements = $("[class=\"module-item-box\"]")
|
||||||
|
let extend_list = []
|
||||||
|
let type_id_dic = {"类型": 1, "剧情": 4, "地区": 2, "语言": 5, "年份": 12, "排序": 3}
|
||||||
|
for (let i = 0; i < titleElements.length; i++) {
|
||||||
|
let extend_dic = {"key": (i + 1).toString(), "name": $(titleElements[i]).text(), "value": []}
|
||||||
|
let typeElements = $(boxElements[i]).find("a")
|
||||||
|
for (let j = 0; j < typeElements.length; j++) {
|
||||||
|
let type_name = $(typeElements[j]).text()
|
||||||
|
let type_id = decodeURIComponent(typeElements[j].attribs["href"].split("-")[type_id_dic[$(titleElements[i]).text()]]).replaceAll(".html", "")
|
||||||
|
extend_dic["value"].push({"n": type_name, "v": $(titleElements[i]).text() + "-" + type_id})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
|
||||||
|
}
|
||||||
|
return extend_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const class_dic of this.classes) {
|
||||||
|
if (class_dic["type_name"] !== "最近更新" && class_dic["type_name"] !== "热榜") {
|
||||||
|
let cateUrl = this.siteUrl + `/vod-show/${class_dic["type_id"]}--------1---.html`
|
||||||
|
let $ = await this.getHtml(cateUrl, this.getHeader())
|
||||||
|
this.filterObj[class_dic["type_id"]] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl, this.getHeader())
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCateUrl(tid, pg, extend) {
|
||||||
|
let value_list = Object.values(extend)
|
||||||
|
let type_id_dic = {"类型": 1, "剧情": 3, "地区": 1, "语言": 4, "年份": 11, "排序": 2}
|
||||||
|
let urlParams = [tid.toString(), "", "","","", "", "", "", "", "", "",""]
|
||||||
|
urlParams[8] = pg.toString()
|
||||||
|
for (const value of value_list) {
|
||||||
|
if (value.split("-")[0] === "类型") {
|
||||||
|
urlParams[0] = value.split("-")[1].split("show/")[1].toString()
|
||||||
|
} else {
|
||||||
|
let type_index = type_id_dic[value.split("-")[0]]
|
||||||
|
urlParams[type_index] = value.split("-")[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return this.siteUrl + `/vod-show/` + urlParams.join("-") + ".html"
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let cateUrl
|
||||||
|
if (tid.indexOf(".html") > -1) {
|
||||||
|
cateUrl = this.siteUrl + tid
|
||||||
|
let $ = await this.getHtml(cateUrl, this.getHeader());
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByHot($)
|
||||||
|
} else {
|
||||||
|
cateUrl = this.getCateUrl(tid, pg, extend)
|
||||||
|
let $ = await this.getHtml(cateUrl, this.getHeader());
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let url = `http://123.207.150.253/zxapi/public/?service=App.F.Fetch&req_p=${wd}&type=okys`
|
||||||
|
let content = await this.fetch(url,null,this.getHeader())
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(JSON.parse(content))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async refreshCookie() {
|
||||||
|
let passUrl = this.siteUrl + "/index.php/verify/index.html?"
|
||||||
|
let passHtml = await this.fetch(passUrl,null,this.getHeader(),false,true)
|
||||||
|
|
||||||
|
let response2 = await this.post(OCR_API,passHtml["content"],this.getHeader())
|
||||||
|
this.cookie = Utils.getStrByRegex(/(.*?);/,passHtml["cookie"])
|
||||||
|
let verifyUrl = this.siteUrl + "/index.php/ajax/verify_check?type=search&verify=5286"
|
||||||
|
let headers = this.getHeader()
|
||||||
|
headers["cookie"] = this.cookie
|
||||||
|
let response = await this.post(verifyUrl,null,headers)
|
||||||
|
await this.write_cache()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async load_cache() {
|
||||||
|
try {
|
||||||
|
return await local.get("freeok_cookie", "cookie")
|
||||||
|
} catch (e) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async write_cache() {
|
||||||
|
await local.set("freeok_cookie", "cookie", JSON.stringify(this.cookie))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id, this.getHeader())
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id, this.getHeader())
|
||||||
|
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=', ''));
|
||||||
|
let url = this.siteUrl + "/okplayer/"
|
||||||
|
let params = {
|
||||||
|
"url": decodeURIComponent(js.url), "next": decodeURIComponent(js.url_next), "title": js.vod_data.vod_name
|
||||||
|
}
|
||||||
|
let playHtml = await this.fetch(url, params, this.getHeader());
|
||||||
|
let view_port_id = Utils.getStrByRegex(/<meta name="viewport"(.*?)>/, playHtml).split("id=\"")[1].replaceAll("now_", "")
|
||||||
|
let player_id = Utils.getStrByRegex(/meta charset="UTF-8" id="(.*?)">/, playHtml).replaceAll("now_", "")
|
||||||
|
let player_url = Utils.getStrByRegex(/"url": "(.*?)",/, playHtml)
|
||||||
|
this.playUrl = player(player_url, view_port_id, player_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let spider = new OkSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
228
18/ds/18js/js/gitcafe.js
Normal file
228
18/ds/18js/js/gitcafe.js
Normal file
|
|
@ -0,0 +1,228 @@
|
||||||
|
/*
|
||||||
|
* @File : gitcafe.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/18 9:56
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 阿里纸条
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {_, load} from "../lib/cat.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {detailContent, initAli, playContent} from "../lib/ali.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
|
||||||
|
class GitCafeSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://ali.gitcafe.ink"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🦊┃阿里纸条┃🦊"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "阿里纸条"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "gitcafe"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async getApiUrl() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let paper_js_url = Utils.getStrByRegex(/<script src='(.*?)'><\/script>/, html)
|
||||||
|
let paper_js_content = await this.fetch(paper_js_url, null, this.getHeader())
|
||||||
|
return {
|
||||||
|
"api": "https:" + Utils.getStrByRegex(/ return '(.*?)' \+ /, paper_js_content) + new Date().getTime(),
|
||||||
|
"search_api": Utils.getStrByRegex(/const SEARCH_API = '(.*?)';/, paper_js_content)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getContentJson() {
|
||||||
|
let url_json = await this.getApiUrl()
|
||||||
|
let content = await this.fetch(url_json["api"], null, this.getHeader())
|
||||||
|
this.search_api = url_json["search_api"]
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
return JSON.parse(content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit() {
|
||||||
|
this.content_json = await this.getContentJson()
|
||||||
|
this.token_dic = await this.load_cache()
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await this.spiderInit()
|
||||||
|
await super.init(cfg);
|
||||||
|
await initAli(this.cfgObj["token"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseClassFromJson(obj) {
|
||||||
|
let data_list = Object.keys(obj["data"]).slice(0, 19)
|
||||||
|
for (const data_key of data_list) {
|
||||||
|
this.classes.push({"type_name": obj["data"][data_key]["name"], "type_id": data_key})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
let class_id_list = this.getClassIdList()
|
||||||
|
for (const data_obj of obj) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
if (class_id_list.includes(data_obj["cat"])) {
|
||||||
|
vodShort.vod_id = JSON.stringify(data_obj)
|
||||||
|
vodShort.vod_name = data_obj["title"]
|
||||||
|
vodShort.vod_remarks = data_obj["date"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj) {
|
||||||
|
let classNamesList = this.getClassNameList()
|
||||||
|
let classIdList = this.getClassIdList()
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = obj["title"]
|
||||||
|
vodDetail.vod_remarks = obj["creatime"] ?? obj["date"]
|
||||||
|
vodDetail.type_name = classNamesList[classIdList.indexOf(obj["cat"])]
|
||||||
|
vodDetail.vod_content = obj["des"]
|
||||||
|
let ali_url = "https://www.aliyundrive.com/s/" + obj["alikey"]
|
||||||
|
let aliVodDetail = await detailContent([ali_url])
|
||||||
|
vodDetail.vod_play_url = aliVodDetail.vod_play_url
|
||||||
|
vodDetail.vod_play_from = aliVodDetail.vod_play_from
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
await this.parseClassFromJson(this.content_json)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
this.homeVodList = await this.parseVodShortListFromJson(this.content_json["info"]["new"])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let content_json = JSON.parse(id)
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(content_json)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(this.content_json["data"][tid]["catdata"])
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
await this.refreshToken();
|
||||||
|
let params = {
|
||||||
|
"action": "search", "from": "web", "token": this.token_dic["token"], "keyword": wd
|
||||||
|
}
|
||||||
|
let content = await this.post(this.search_api, params, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(content_json["data"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async refreshToken() {
|
||||||
|
let this_time = new Date().getTime()
|
||||||
|
if (_.isEmpty(this.token_dic["token"])) {
|
||||||
|
await this.get_token()
|
||||||
|
await this.jadeLog.debug("Token为空,刷新Token")
|
||||||
|
} else if (this_time - parseInt(this.token_dic["date"]) > 24 * 60 * 60 * 1000) {
|
||||||
|
await this.jadeLog.debug(`Token到期,上次获取Token时间为:${this_time},当前时间为:${parseInt(this.token_dic["date"])},刷新Token`)
|
||||||
|
await this.get_token()
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.debug(`Token仍然有效,无需刷新`, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async get_token() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
let params = {
|
||||||
|
"action": "get_token", "from": "web",
|
||||||
|
}
|
||||||
|
let content = await this.post(this.search_api, params, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let this_time = new Date().getTime()
|
||||||
|
this.token_dic["token"] = content_json["data"]
|
||||||
|
this.token_dic["date"] = this_time.toString()
|
||||||
|
await this.write_cache()
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
await this.jadeLog.error("获取Token失败,失败原因为:" + e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async write_cache() {
|
||||||
|
await local.set("gitcafe_token", "token", JSON.stringify(this.token_dic))
|
||||||
|
}
|
||||||
|
|
||||||
|
async load_cache() {
|
||||||
|
try {
|
||||||
|
let str = await local.get("gitcafe_token", "token")
|
||||||
|
return JSON.parse(str)
|
||||||
|
} catch (e) {
|
||||||
|
return {"token": "", "date": ""}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async play(flag, id, flags) {
|
||||||
|
return await playContent(flag, id, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new GitCafeSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
156
18/ds/18js/js/haiwaikan.js
Normal file
156
18/ds/18js/js/haiwaikan.js
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* @File : haiwaikan.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/04/02 9:15
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 海外看
|
||||||
|
*/
|
||||||
|
import {VodSpider} from "./vodSpider.js";
|
||||||
|
class HaiWaiKanSpider extends VodSpider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://haiwaikan.com"
|
||||||
|
this.remove18 = true
|
||||||
|
this.type_id_18 = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq) {
|
||||||
|
await super.spiderInit(inReq);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "海外看"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "☕┃海外看┃☕墙"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "haiwaikan"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let content = await this.fetch(this.siteUrl + "/api.php/provide/vod/from", {"ac": "list"}, this.getHeader())
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
for (const class_dic of content_json["class"]) {
|
||||||
|
if (class_dic["type_id"] < 26 ) {
|
||||||
|
this.classes.push(this.getTypeDic(class_dic["type_name"], class_dic["type_id"].toString()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.content_json = content_json
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter(type_id,obj) {
|
||||||
|
let extend_list = []
|
||||||
|
let extend_dic = {"key": "1", "name": "全部类别", "value": [{"n":"全部类别","v":type_id.toString()}]}
|
||||||
|
for (const type_dic of obj["class"]){
|
||||||
|
let a_type_id = type_dic["type_id"]
|
||||||
|
let max_type_id = 0
|
||||||
|
let min_type_id = 0
|
||||||
|
if (type_id === 20){
|
||||||
|
max_type_id = 50
|
||||||
|
min_type_id = 27
|
||||||
|
}
|
||||||
|
if (type_id === 21){
|
||||||
|
max_type_id = 128
|
||||||
|
min_type_id = 100
|
||||||
|
}
|
||||||
|
if (type_id === 22){
|
||||||
|
max_type_id = 143
|
||||||
|
min_type_id = 134
|
||||||
|
}
|
||||||
|
if (type_id === 23){
|
||||||
|
max_type_id = 135
|
||||||
|
min_type_id = 127
|
||||||
|
}
|
||||||
|
if (a_type_id < max_type_id && a_type_id > min_type_id){
|
||||||
|
extend_dic["value"].push({"n":type_dic["type_name"],"v":a_type_id.toString()})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (extend_dic["value"].length > 1){
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
return extend_list
|
||||||
|
}else{
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
let content = await this.fetch(this.siteUrl + "/api.php/provide/vod/from", {"ac": "list"}, this.getHeader())
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
for (const type_dic of this.classes){
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
if (type_id !== "最近更新"){
|
||||||
|
let extend_list = await this.getFilter(parseInt(type_id),content_json)
|
||||||
|
if (extend_list !== null){
|
||||||
|
this.filterObj[type_id] = extend_list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new HaiWaiKanSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
625
18/ds/18js/js/hanxiucao.js
Normal file
625
18/ds/18js/js/hanxiucao.js
Normal file
|
|
@ -0,0 +1,625 @@
|
||||||
|
/*
|
||||||
|
* @File : hanxiucao.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/04/13 19:38
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_, Crypto} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
|
||||||
|
function He(e, {key: t, iv: s} = {}) {
|
||||||
|
let VITE_APP_AES_KEY = "B77A9FF7F323B5404902102257503C2F"
|
||||||
|
let VITE_APP_AES_IV = "B77A9FF7F323B5404902102257503C2F"
|
||||||
|
var o = Crypto.enc.Utf8.parse(e)
|
||||||
|
, A = Crypto.AES.encrypt(o, Crypto.enc.Utf8.parse(t || VITE_APP_AES_KEY), {
|
||||||
|
iv: Crypto.enc.Utf8.parse(s || VITE_APP_AES_IV),
|
||||||
|
mode: Crypto.mode.CBC,
|
||||||
|
padding: Crypto.pad.Pkcs7
|
||||||
|
});
|
||||||
|
return Crypto.enc.Base64.stringify(A.ciphertext)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Kt() {
|
||||||
|
const e = new Date;
|
||||||
|
return He(parseInt(e.getTime() / 1e3) + e.getTimezoneOffset() * 60 + -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
function bt(e) {
|
||||||
|
const wA = "46cc793c53dc451b"
|
||||||
|
let t = Crypto.enc.Utf8.parse(wA)
|
||||||
|
, s = Crypto.AES.decrypt(e, t, {
|
||||||
|
mode: Crypto.mode.ECB,
|
||||||
|
padding: Crypto.pad.Pkcs7
|
||||||
|
});
|
||||||
|
return Crypto.enc.Utf8.stringify(s).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
class HanXiuCaoSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://api.qianyuewenhua.xyz"
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq = null) {
|
||||||
|
if (inReq !== null) {
|
||||||
|
this.jsBase = await js2Proxy(inReq, "imgBt", this.getHeader());
|
||||||
|
} else {
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'imgBt/', this.getHeader());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
this.danmuStaus = true
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "含羞草"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃含羞草┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "hanxiucao"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getParams(params) {
|
||||||
|
return {"endata": He(JSON.stringify(params)), "ents": Kt()}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let params = this.getParams({"channel": "pc"})
|
||||||
|
let response = await this.post(this.siteUrl + "/panel/list", params, this.getHeader(), "")
|
||||||
|
let resJson = JSON.parse(response)
|
||||||
|
for (const data of resJson["data"]["list"]) {
|
||||||
|
let type_id = data["panelId"]
|
||||||
|
let type_name = data["panelName"]
|
||||||
|
if (type_name !== "首页") {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter(Layouts) {
|
||||||
|
let extend_list = []
|
||||||
|
for (const data of Layouts) {
|
||||||
|
let layoutObj = JSON.parse(data["layoutContent"])
|
||||||
|
for (const layout of layoutObj["sortKeys"]) {
|
||||||
|
let extend_dic = {}
|
||||||
|
if (layout["label"] !== "综合排序") {
|
||||||
|
extend_dic = {"key": "sorts", "name": layout["label"].toString(), value: []}
|
||||||
|
extend_dic["value"].push({"n": "升序", "v": layout["value"].toString() + "-" + "升序"})
|
||||||
|
extend_dic["value"].push({"n": "降序", "v": layout["value"].toString() + "-" + "降序"})
|
||||||
|
} else {
|
||||||
|
extend_dic = {"key": "sorts", "name": "排序", value: []}
|
||||||
|
extend_dic["value"].push({"n": layout["label"].toString(), "v": layout["value"].toString()})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async getNvYouFilter(Layouts) {
|
||||||
|
let extend_list = []
|
||||||
|
let params = {
|
||||||
|
"uids": [],
|
||||||
|
"page": 1,
|
||||||
|
"length": 20
|
||||||
|
}
|
||||||
|
for (let i = 0; i < Layouts.length; i++) {
|
||||||
|
let data = Layouts[i]
|
||||||
|
let layoutObj = JSON.parse(data["layoutContent"])
|
||||||
|
params["uids"] = layoutObj["list"]
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/user/getUpList", this.getParams(params), this.getHeader(), ""))
|
||||||
|
let extend_dic = {"key": `tags`, "name": data["layoutName"], value: []}
|
||||||
|
for (const layout of resJson["data"]["list"]) {
|
||||||
|
extend_dic["value"].push({"n": layout["user_nicename"], "v": JSON.stringify(layout)})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
let sort_list = [
|
||||||
|
{
|
||||||
|
"key": "sorts",
|
||||||
|
"name": "发布时间",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"n": "升序",
|
||||||
|
"v": "1-升序"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"n": "降序",
|
||||||
|
"v": "1-降序"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "sorts",
|
||||||
|
"name": "点赞数量",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"n": "升序",
|
||||||
|
"v": "5-升序"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"n": "降序",
|
||||||
|
"v": "5-降序"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "sorts",
|
||||||
|
"name": "收藏数量",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"n": "升序",
|
||||||
|
"v": "6-升序"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"n": "降序",
|
||||||
|
"v": "6-降序"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
return [...extend_list, ...sort_list]
|
||||||
|
}
|
||||||
|
|
||||||
|
async getZhuanTiFilter(Layouts) {
|
||||||
|
let extend_list = []
|
||||||
|
let params = {
|
||||||
|
"page": 1,
|
||||||
|
"length": 36,
|
||||||
|
"subjectIds": []
|
||||||
|
}
|
||||||
|
for (let i = 0; i < Layouts.length; i++) {
|
||||||
|
let data = Layouts[i]
|
||||||
|
let layoutObj = JSON.parse(data["layoutContent"])
|
||||||
|
params["subjectIds"] = layoutObj["list"]
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/subject/list", this.getParams(params), this.getHeader(), ""))
|
||||||
|
let extend_dic = {"key": `tags`, "name": data["layoutName"], value: []}
|
||||||
|
for (const layout of resJson["data"]["list"]) {
|
||||||
|
extend_dic["value"].push({"n": layout["name"], "v": JSON.stringify(layout)})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
let sort_dic = {
|
||||||
|
"key": "sorts",
|
||||||
|
"name": "排序",
|
||||||
|
"value": [
|
||||||
|
{
|
||||||
|
"n": "推荐",
|
||||||
|
"v": "8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"n": "最新",
|
||||||
|
"v": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"n": "最热",
|
||||||
|
"v": "2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
extend_list.push(sort_dic)
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async getChuanMeiFilter(Layouts) {
|
||||||
|
let extend_list = []
|
||||||
|
let extend_dic = {"key": `tags`, "name": "传媒", value: []}
|
||||||
|
for (let i = 0; i < Layouts.length; i++) {
|
||||||
|
let data = Layouts[i]
|
||||||
|
extend_dic["value"].push({"n": data["layoutName"], "v": data["layoutContent"]})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
|
||||||
|
for (const layout of JSON.parse(Layouts[0]["layoutContent"])["moreOrderType"]) {
|
||||||
|
extend_dic = {"key": "sorts", "name": layout["label"].toString(), value: []}
|
||||||
|
extend_dic["value"].push({"n": "升序", "v": layout["value"].toString() + "-" + "升序"})
|
||||||
|
extend_dic["value"].push({"n": "降序", "v": layout["value"].toString() + "-" + "降序"})
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHeJiFilter(Layouts) {
|
||||||
|
let extend_list = []
|
||||||
|
let params = {
|
||||||
|
"page": 1,
|
||||||
|
"length": 24,
|
||||||
|
"gatherType": 1,
|
||||||
|
"gatherIds": []
|
||||||
|
}
|
||||||
|
let extend_dic = {"key": `tags`, "name": "合集", value: []}
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/gather/getList", this.getParams(params), this.getHeader(), ""))
|
||||||
|
for (const data of resJson["data"]["list"]) {
|
||||||
|
extend_dic["value"].push({"n": data["name"], "v": data["gatherId"].toString()})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (let i = 0; i < this.classes.length; i++) {
|
||||||
|
let type_dic = this.classes[i]
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
let type_name = type_dic["type_name"]
|
||||||
|
let filterList = []
|
||||||
|
if (type_id !== "最近更新") {
|
||||||
|
type_id = parseInt(type_id)
|
||||||
|
let params = this.getParams({"panelId": type_id})
|
||||||
|
let response = await this.post(this.siteUrl + "/panel/get", params, this.getHeader(), "")
|
||||||
|
let resJson = JSON.parse(response)
|
||||||
|
let layoutList = resJson["data"]["info"]["Layouts"]
|
||||||
|
let layOutObj = JSON.parse(resJson["data"]["info"]["Layouts"][0]["layoutContent"])
|
||||||
|
if (type_id > 174 && type_id < 181) {
|
||||||
|
let layOutObj = JSON.parse(resJson["data"]["info"]["Layouts"][0]["layoutContent"])
|
||||||
|
type_id = type_id + "$" + JSON.stringify(layOutObj)
|
||||||
|
filterList = await this.getFilter(layoutList)
|
||||||
|
} else {
|
||||||
|
switch (type_id) {
|
||||||
|
case 172:
|
||||||
|
filterList = await this.getHeJiFilter(layoutList)
|
||||||
|
type_id = type_id + "$" + filterList[0]["value"][0]["v"]
|
||||||
|
break
|
||||||
|
case 173:
|
||||||
|
filterList = await this.getChuanMeiFilter(layoutList)
|
||||||
|
type_id = type_id + "$" + JSON.stringify(layOutObj)
|
||||||
|
break
|
||||||
|
case 182:
|
||||||
|
filterList = await this.getNvYouFilter(layoutList)
|
||||||
|
type_id = type_id + "$" + filterList[0]["value"][0]["v"]
|
||||||
|
break
|
||||||
|
case 209:
|
||||||
|
filterList = await this.getZhuanTiFilter(layoutList)
|
||||||
|
type_id = type_id + "$" + filterList[0]["value"][0]["v"]
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.classes[i] = this.getTypeDic(type_name, type_id)
|
||||||
|
this.filterObj[type_id] = filterList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
for (const data of obj) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = data["id"]
|
||||||
|
vodShort.vod_name = data["name"]
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(data["coverImgUrl"])
|
||||||
|
if (data["hot"] === undefined) {
|
||||||
|
vodShort.vod_remarks = "观看:" + (data["seeCount"] / 10000).toFixed(1).toString() + "W"
|
||||||
|
} else {
|
||||||
|
vodShort.vod_remarks = "热度:" + (data["hot"] / 1000).toFixed(1).toString() + "K"
|
||||||
|
}
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromGatherJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
for (const data of obj) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = data["gatherId"]
|
||||||
|
vodShort.vod_name = data["name"]
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(data["coverImgUrl"])
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc(detailObj) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = detailObj["name"]
|
||||||
|
vodDetail.vod_year = detailObj["addTime"]
|
||||||
|
vodDetail.vod_pic = this.jsBase + Utils.base64Encode(detailObj["coverImgUrl"])
|
||||||
|
vodDetail.type_name = detailObj["typeName"]
|
||||||
|
vodDetail.vod_content = detailObj["tags"]
|
||||||
|
let vodItems = []
|
||||||
|
let params = {
|
||||||
|
"videoId": detailObj["id"]
|
||||||
|
}
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/videos/getPreUrl", this.getParams(params), this.getHeader(), ""))
|
||||||
|
let playList = resJson["data"]["url"].split("?")
|
||||||
|
let playUrl = playList[0] + "?sign" + playList[1].split("&sign").slice(-1)[0]
|
||||||
|
vodItems.push(vodDetail.vod_name + "$" + playUrl)
|
||||||
|
let playObj = {"线路1": vodItems.join("#")}
|
||||||
|
vodDetail.vod_play_url = _.values(playObj).join('$$$');
|
||||||
|
vodDetail.vod_play_from = _.keys(playObj).join('$$$');
|
||||||
|
return vodDetail
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHomeVod(params) {
|
||||||
|
let params_str = this.getParams(params)
|
||||||
|
let response = await this.post(this.siteUrl + "/videos/getList", params_str, this.getHeader(), "")
|
||||||
|
return await this.parseVodShortListFromJson(JSON.parse(response)["data"]["list"])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let vod_list1 = await this.getHomeVod({
|
||||||
|
"page": 1,
|
||||||
|
"length": 16,
|
||||||
|
"offset": 0,
|
||||||
|
"typeIds": [],
|
||||||
|
"orderType": 1,
|
||||||
|
"payType": [3, 4]
|
||||||
|
})
|
||||||
|
let vod_list2 = await this.getHomeVod({
|
||||||
|
"page": 1,
|
||||||
|
"length": 16,
|
||||||
|
"offset": 0,
|
||||||
|
"typeIds": [],
|
||||||
|
"orderType": 3,
|
||||||
|
"payType": [
|
||||||
|
1
|
||||||
|
]
|
||||||
|
})
|
||||||
|
let vod_list3 = await this.getHomeVod({
|
||||||
|
"page": 1,
|
||||||
|
"length": 32,
|
||||||
|
"offset": 0,
|
||||||
|
"typeIds": [],
|
||||||
|
"orderType": 1,
|
||||||
|
"payType": [
|
||||||
|
3
|
||||||
|
]
|
||||||
|
})
|
||||||
|
this.homeVodList = [...vod_list1, ...vod_list2, ...vod_list3];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getSortParams(params, extend) {
|
||||||
|
let orderTypeStr = extend["sorts"] ?? ""
|
||||||
|
if (!_.isEmpty(orderTypeStr)) {
|
||||||
|
let orderType = orderTypeStr.split("-")[0]
|
||||||
|
params["orderType"] = parseInt(orderType)
|
||||||
|
let orderModeStr = orderTypeStr.split("-")[1]
|
||||||
|
let orderMode = 0
|
||||||
|
if (orderModeStr === "升序") {
|
||||||
|
orderMode = "1"
|
||||||
|
} else {
|
||||||
|
orderMode = "0"
|
||||||
|
}
|
||||||
|
params["orderMode"] = parseInt(orderMode)
|
||||||
|
}
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
getTopParams(type_id, layOutObj, pg, extend) {
|
||||||
|
let defaultOderType
|
||||||
|
if (type_id === 180) {
|
||||||
|
defaultOderType = "1"
|
||||||
|
} else {
|
||||||
|
defaultOderType = "7"
|
||||||
|
}
|
||||||
|
let orderMode = "1"
|
||||||
|
let orderType
|
||||||
|
let orderTypeStr = extend["sorts"] ?? defaultOderType
|
||||||
|
let isOrderModel = false
|
||||||
|
if (orderTypeStr.indexOf("-") > -1) {
|
||||||
|
orderType = orderTypeStr.split("-")[0]
|
||||||
|
let orderModeStr = orderTypeStr.split("-")[1]
|
||||||
|
if (orderModeStr === "升序") {
|
||||||
|
orderMode = "1"
|
||||||
|
} else {
|
||||||
|
orderMode = "0"
|
||||||
|
}
|
||||||
|
isOrderModel = true
|
||||||
|
} else {
|
||||||
|
orderType = defaultOderType
|
||||||
|
}
|
||||||
|
let params = {
|
||||||
|
"orderType": parseInt(orderType), //或者7
|
||||||
|
"tags": [],
|
||||||
|
"length": 11,
|
||||||
|
"page": parseInt(pg),
|
||||||
|
"typeIds": layOutObj["classs"],
|
||||||
|
"payType": layOutObj["payType"],
|
||||||
|
}
|
||||||
|
if (isOrderModel) {
|
||||||
|
params["orderMode"] = parseInt(orderMode)
|
||||||
|
}
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
getChuanMeiParams(layOutObj, pg, extend) {
|
||||||
|
let obj
|
||||||
|
if (!_.isEmpty(extend["tags"])) {
|
||||||
|
obj = JSON.parse(extend["tags"])
|
||||||
|
} else {
|
||||||
|
obj = layOutObj
|
||||||
|
}
|
||||||
|
let params = {
|
||||||
|
"page": parseInt(pg),
|
||||||
|
"length": 32,
|
||||||
|
"offset": 32 * parseInt(pg - 1),
|
||||||
|
"tag": obj["videoLables"].join(","),
|
||||||
|
"typeIds": obj["classs"],
|
||||||
|
"orderType": obj["orderType"],
|
||||||
|
"payType": obj["payType"]
|
||||||
|
}
|
||||||
|
params = this.getSortParams(params, extend)
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
getNvYouParams(layoutObj, pg, extend) {
|
||||||
|
let obj
|
||||||
|
if (!_.isEmpty(extend["tags"])) {
|
||||||
|
obj = JSON.parse(extend["tags"])
|
||||||
|
} else {
|
||||||
|
obj = layoutObj
|
||||||
|
}
|
||||||
|
let params = {"videoSort": 1, "touid": obj["id"], "page": parseInt(pg), "length": 12, "orderType": 1}
|
||||||
|
params = this.getSortParams(params, extend)
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
getZhuantiParams(layoutObj, pg, extend) {
|
||||||
|
let obj
|
||||||
|
if (!_.isEmpty(extend["tags"])) {
|
||||||
|
obj = JSON.parse(extend["tags"])
|
||||||
|
} else {
|
||||||
|
obj = layoutObj
|
||||||
|
}
|
||||||
|
let orderType = extend["sorts"] ?? "8"
|
||||||
|
return {
|
||||||
|
"page": parseInt(pg),
|
||||||
|
"length": 12,
|
||||||
|
"offset": 12 * (parseInt(pg) - 1),
|
||||||
|
"orderType": parseInt(orderType),
|
||||||
|
"subjectId": obj["id"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let tid_list = tid.split("$")
|
||||||
|
let type_id = parseInt(tid_list[0])
|
||||||
|
let layOutObj = JSON.parse(tid_list[1])
|
||||||
|
let params = {}
|
||||||
|
let url = "/videos/getList"
|
||||||
|
if (type_id > 174 && type_id < 181) {
|
||||||
|
params = this.getTopParams(type_id, layOutObj, pg, extend)
|
||||||
|
} else {
|
||||||
|
switch (type_id) {
|
||||||
|
case 173:
|
||||||
|
params = this.getChuanMeiParams(layOutObj, pg, extend)
|
||||||
|
break
|
||||||
|
case 182:
|
||||||
|
params = this.getNvYouParams(layOutObj, pg, extend)
|
||||||
|
url = "/user/getSpaceVideo"
|
||||||
|
break
|
||||||
|
case 209:
|
||||||
|
params = this.getZhuantiParams(layOutObj, pg, extend)
|
||||||
|
break
|
||||||
|
case 172:
|
||||||
|
let gatherId = extend["tags"] ?? layOutObj
|
||||||
|
params = {
|
||||||
|
"gatherId": parseInt(gatherId)
|
||||||
|
}
|
||||||
|
url = "/gather/getDetail"
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + url, this.getParams(params), this.getHeader(), ""))
|
||||||
|
if (type_id === 172) {
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(resJson["data"]["info"]["videos"])
|
||||||
|
} else {
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(resJson["data"]["list"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let params = {
|
||||||
|
"videoId": parseInt(id),
|
||||||
|
"videoSort": 1
|
||||||
|
}
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/videos/getInfo", this.getParams(params), this.getHeader(), ""))
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc(resJson["data"]["info"])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async proxy(segments, headers) {
|
||||||
|
let what = segments[0];
|
||||||
|
let url = Utils.base64Decode(segments[1]);
|
||||||
|
if (what === 'imgBt') {
|
||||||
|
let response = await req(url, {buffer: 0});
|
||||||
|
return JSON.stringify({
|
||||||
|
code: 200,
|
||||||
|
buffer: 2,
|
||||||
|
content: bt(response.content).replaceAll("data:image/jpeg;base64,", "").replaceAll("data:image/jpg;base64,", "").replaceAll("data:image/png;base64", ""),
|
||||||
|
headers: headers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setSearch(wd, quick, pg) {
|
||||||
|
let params = {
|
||||||
|
"page": parseInt(pg),
|
||||||
|
"length": 12,
|
||||||
|
"type": 1,
|
||||||
|
"key": wd
|
||||||
|
}
|
||||||
|
let resJson = JSON.parse(await this.post(this.siteUrl + "/base/globalSearch", this.getParams(params), this.getHeader(), ""))
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(resJson["data"]["infos"])
|
||||||
|
this.result.setPage(parseInt(pg), resJson["data"]["count"] / 12, 12, resJson["data"]["count"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new HanXiuCaoSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider, bt}
|
||||||
273
18/ds/18js/js/haoxi.js
Normal file
273
18/ds/18js/js/haoxi.js
Normal file
|
|
@ -0,0 +1,273 @@
|
||||||
|
/*
|
||||||
|
* @File : haoxi.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/2/7 14:24
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 好戏追剧 已失效
|
||||||
|
*/
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
class HaoXiSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://haoxi.vip"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return `好戏追剧`
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return `🌿┃好戏追剧┃🌿`
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "haoxi"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
parseVodShortFromElement($, element) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = $(element).find("a")[0].attribs.href
|
||||||
|
vodShort.vod_name = $(element).find("a")[0].attribs.title
|
||||||
|
if (vodShort.vod_name === undefined) {
|
||||||
|
vodShort.vod_name = $($($(element).find("[class=\"thumb-txt cor4 hide\"]")).find("a")).html()
|
||||||
|
}
|
||||||
|
vodShort.vod_pic = $(element).find("img")[0].attribs["data-src"]
|
||||||
|
vodShort.vod_remarks = $($(element).find("[class=\"public-list-prb hide ft2\"]")).html()
|
||||||
|
return vodShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"flex bottom4\"]").find("[class=\"public-list-box public-pic-a [swiper]\"]")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"public-list-box public-pic-b [swiper]\"]")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"public-list-box search-box flex rel\"]")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetailElement = $("[class=\"vod-detail style-detail rel cor1 hader0\"]")
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
vodDetail.vod_pic = $(vodDetailElement).find("img")[0].attribs.src
|
||||||
|
vodDetail.vod_name = $($(vodDetailElement).find("[class=\"slide-info-title hide\"]")).html()
|
||||||
|
let elements = $(vodDetailElement).find("[class=\"slide-info hide\"]")
|
||||||
|
vodDetail.vod_year = $($($(elements[0]).find("[class=\"slide-info-remarks\"]")[0]).find("a")[0]).html()
|
||||||
|
vodDetail.vod_area = $($($(elements[0]).find("[class=\"slide-info-remarks\"]")[1]).find("a")[0]).html()
|
||||||
|
vodDetail.type_name = $($($(elements[0]).find("[class=\"slide-info-remarks\"]")[2]).find("a")[0]).html()
|
||||||
|
vodDetail.vod_remarks = $(elements[1]).text().replaceAll("备注 :", "")
|
||||||
|
vodDetail.vod_director = $(elements[2]).text().replaceAll("导演 :", "")
|
||||||
|
vodDetail.vod_actor = $(elements[3]).text().replaceAll("演员 :", "")
|
||||||
|
vodDetail.vod_content = $($("[class=\"text cor3\"]")).text()
|
||||||
|
let playElements = $("[class=\"box-width cor5\"]")
|
||||||
|
let playFormatElements = playElements.find("[class=\"swiper-slide\"]")
|
||||||
|
let playUrlElements = playElements.find("[class=\"anthology-list-box none\"]")
|
||||||
|
let vod_play_from_list = []
|
||||||
|
let vod_play_list = []
|
||||||
|
for (let i = 0; i < playFormatElements.length; i++) {
|
||||||
|
let playFormatElement = playFormatElements[i]
|
||||||
|
let format_name = playFormatElement.children[1].data
|
||||||
|
format_name = format_name.replaceAll(" ", "")
|
||||||
|
vod_play_from_list.push(format_name)
|
||||||
|
let vodItems = []
|
||||||
|
if (format_name === "http下载") {
|
||||||
|
for (const playUrlElement of $(playUrlElements[i]).find("a")) {
|
||||||
|
let episodeName = $(playUrlElement).text()
|
||||||
|
let episodeUrl = playUrlElement.attribs.href
|
||||||
|
if (episodeName !== "复制地址") {
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const playUrlElement of $(playUrlElements[i]).find("a")) {
|
||||||
|
let episodeName = $(playUrlElement).text()
|
||||||
|
let episodeUrl = playUrlElement.attribs.href
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let navElements = $("[class=\"head flex between no-null header_nav0\"]").find("li")
|
||||||
|
for (const navElement of navElements) {
|
||||||
|
let type_name = $($(navElement).find("a")).text()
|
||||||
|
let type_id = Utils.getStrByRegex(/\/vodtype\/(.*?)\//, $(navElement).find("a")[0].attribs.href)
|
||||||
|
if (Utils.isNumeric(type_id)) {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let elements = $("[class=\"nav-swiper rel\"]")
|
||||||
|
let extend_list = []
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
let extend_dic = {"key": (i + 1).toString(), "name": "", "value": []}
|
||||||
|
let name = $($($(elements[i]).find("[class=\"filter-text bj cor5\"]")[0]).find("span")).html()
|
||||||
|
if (name !== "已选" && name !== "频道") {
|
||||||
|
extend_dic["name"] = name
|
||||||
|
for (const ele of $(elements[i]).find("li")) {
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v": $(ele).text()})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let sortElments = $("[class=\"site-tabs b-b br\"]")
|
||||||
|
let extend_dic = {"key": (elements.length + 1).toString(), "name": "排序", "value": []}
|
||||||
|
extend_dic["value"].push({"n": "全部", "v": "/"})
|
||||||
|
for (const ele of $(sortElments).find("a")) {
|
||||||
|
let type_id_list = ele.attribs.href.split("-")
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v": type_id_list[2]})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const class_dic of this.classes) {
|
||||||
|
let type_id = class_dic["type_id"]
|
||||||
|
if (Utils.isNumeric(type_id)) {
|
||||||
|
let url = this.siteUrl + `/vodshow/${type_id}-----------`
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
get_extend_sort_dic(tid) {
|
||||||
|
return {
|
||||||
|
"3": 3, "4": 1, "5": 11, "6": 4, "9": 5, "10": 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
// "1-大陆-hits-Netflix-英语-A----正片--2023/version/4K/"
|
||||||
|
let urlParams = [tid.toString(), "", "", "", "", "", "", "", pg.toString(), "", "", ""]
|
||||||
|
let extend_dic = this.get_extend_sort_dic(parseInt(tid))
|
||||||
|
for (const key of Object.keys(extend_dic)) {
|
||||||
|
if (extend[key] === "0") {
|
||||||
|
urlParams[extend_dic[key]] = ""
|
||||||
|
} else {
|
||||||
|
if (extend[key] !== "全部") {
|
||||||
|
urlParams[extend_dic[key]] = extend[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let reqUrl = this.siteUrl + '/vodshow/' + urlParams.join("-");
|
||||||
|
if (extend[7] !== undefined && extend[7] !== "全部") {
|
||||||
|
reqUrl = reqUrl + `/version/${extend[7]}/`
|
||||||
|
}
|
||||||
|
await this.jadeLog.debug(`分类URL:${reqUrl}`)
|
||||||
|
let $ = await this.getHtml(reqUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + `/vodsearch/-------------/?wd=${wd}`)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
if (flag !== "http下载") {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + id)
|
||||||
|
let playConfig = JSON.parse(Utils.getStrByRegex(/var player_aaaa=(.*?)<\/script>/, $.html()))
|
||||||
|
this.playUrl = playConfig['url']
|
||||||
|
} else {
|
||||||
|
this.playUrl = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new HaoXiSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
153
18/ds/18js/js/hscangku.js
Normal file
153
18/ds/18js/js/hscangku.js
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
* @File : hscangku.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/01/03 19:19
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
|
||||||
|
class HsCangkuSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://hsck12.shop/"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃黄色仓库┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "黄色仓库"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "hscangku"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"stui-vodlist clearfix\"]").find("li")
|
||||||
|
for (const vod_element of vodElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let vodElement = $(vod_element).find("a")[0]
|
||||||
|
vodShort.vod_id = vodElement.attribs["href"]
|
||||||
|
vodShort.vod_name = vodElement.attribs["title"]
|
||||||
|
vodShort.vod_pic = vodElement.attribs["data-original"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
let element = $($("[class=\"stui-pannel__head clearfix\"]")[1]).find("h3")
|
||||||
|
let stui_pannel_bd_element = $("div.stui-pannel-bd > div")
|
||||||
|
let video_element = stui_pannel_bd_element.find("video")[0]
|
||||||
|
vodDetail.vod_name = element.text()
|
||||||
|
vodDetail.vod_pic = video_element.attribs["poster"]
|
||||||
|
vodDetail.vod_play_from = "黄色仓库"
|
||||||
|
vodDetail.vod_play_url = $(video_element).find("source")[0].attribs["src"]
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = [
|
||||||
|
{
|
||||||
|
"type_name": "国产视频",
|
||||||
|
"type_id": "?type=gc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_name": "国产新片",
|
||||||
|
"type_id": "?type=ycgc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_name": "无码中文字幕",
|
||||||
|
"type_id": "?type=wz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_name": "有码中文字幕",
|
||||||
|
"type_id": "?type=yz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_name": "日本无码",
|
||||||
|
"type_id": "?type=rw"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let url = this.siteUrl + tid + "&p=" + pg.toString()
|
||||||
|
let html = await this.fetch(url, null,this.getHeader())
|
||||||
|
this.limit = 40;
|
||||||
|
if (html !== null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
this.total = parseInt($("[class=\"active\"]").find("span").text())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let url = this.siteUrl + id
|
||||||
|
let html = await this.fetch(url,null,this.getHeader())
|
||||||
|
if (html !== null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
this.playUrl = id
|
||||||
|
this.playHeader = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new HsCangkuSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
709
18/ds/18js/js/huya.js
Normal file
709
18/ds/18js/js/huya.js
Normal file
|
|
@ -0,0 +1,709 @@
|
||||||
|
/*
|
||||||
|
* @File : huya.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/3/7 9:13
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
class HuyaSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.isJustLive = false
|
||||||
|
this.dataFrom = ""
|
||||||
|
this.customArea = ""
|
||||||
|
this.huYaPlayForamtObj = {"AL": "蓝光8M", "TX": "蓝光4M", "HW": "超清", "HS": "流畅"}
|
||||||
|
this.livePlayForamtObj = {"HD": "蓝光8M", "LD": "蓝光4M", "SD": "超清", "OD": "流畅"}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🐯┃虎牙直播┃🐯"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "虎牙直播"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "huya"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit() {
|
||||||
|
if (this.cfgObj.hasOwnProperty('custom')) {
|
||||||
|
this.customArea = this.cfgObj.custom;
|
||||||
|
}
|
||||||
|
if (this.cfgObj.hasOwnProperty('from')) {
|
||||||
|
this.dataFrom = this.cfgObj.from;
|
||||||
|
}
|
||||||
|
if (this.dataFrom !== 'justlive') {
|
||||||
|
this.siteUrl = 'https://www.huya.com';
|
||||||
|
} else {
|
||||||
|
this.siteUrl = 'http://live.yj1211.work';
|
||||||
|
this.isJustLive = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit()
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
let header = super.getHeader();
|
||||||
|
header["User-Agent"] = Utils.MOBILEUA
|
||||||
|
return header
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
this.classes = [{
|
||||||
|
"type_id": "1", "type_name": "网游"
|
||||||
|
}, {"type_id": "2", "type_name": "单机"}, {"type_id": "3", "type_name": "手游"}, {
|
||||||
|
"type_id": "8", "type_name": "娱乐"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
this.filterObj = {
|
||||||
|
"1": [{
|
||||||
|
"key": "cateId",
|
||||||
|
"name": "分类",
|
||||||
|
"init": "1",
|
||||||
|
"value": [{"n": "英雄联盟", "v": "1"}, {"n": "CS2", "v": "862"}, {
|
||||||
|
"n": "穿越火线", "v": "4"
|
||||||
|
}, {"n": "lol云顶之弈", "v": "5485"}, {"n": "无畏契约", "v": "5937"}, {
|
||||||
|
"n": "CFHD", "v": "6079"
|
||||||
|
}, {"n": "逆战", "v": "135"}, {"n": "炉石传说", "v": "393"}, {"n": "DOTA2", "v": "7"}, {
|
||||||
|
"n": "地下城与勇士", "v": "2"
|
||||||
|
}, {"n": "魔兽世界", "v": "8"}, {"n": "坦克世界", "v": "802"}, {"n": "DOTA1", "v": "6"}, {
|
||||||
|
"n": "梦三国", "v": "489"
|
||||||
|
}, {"n": "魔兽争霸3", "v": "4615"}, {"n": "问道", "v": "107"}, {
|
||||||
|
"n": "命运方舟", "v": "3058"
|
||||||
|
}, {"n": "QQ飞车", "v": "9"}, {"n": "星际争霸", "v": "5"}, {
|
||||||
|
"n": "网游竞技", "v": "100023"
|
||||||
|
}, {"n": "射击综合游戏", "v": "100141"}, {"n": "暴雪专区", "v": "100043"}, {
|
||||||
|
"n": "彩虹岛Online", "v": "683"
|
||||||
|
}, {"n": "剑灵", "v": "897"}, {"n": "军事游戏", "v": "100133"}, {
|
||||||
|
"n": "冒险岛", "v": "2243"
|
||||||
|
}, {"n": "暗黑破坏神", "v": "1123"}, {"n": "诛仙3", "v": "1646"}, {
|
||||||
|
"n": "热血江湖", "v": "387"
|
||||||
|
}, {"n": "英魂之刃", "v": "1830"}, {"n": "武林外传一世琴缘", "v": "1661"}, {
|
||||||
|
"n": "起凡:群雄逐鹿", "v": "1612"
|
||||||
|
}, {"n": "神武4电脑版", "v": "3227"}, {"n": "龙之谷", "v": "15"}, {
|
||||||
|
"n": "炉石战棋", "v": "5751"
|
||||||
|
}, {"n": "御龙在天", "v": "675"}, {"n": "逆水寒", "v": "2952"}, {
|
||||||
|
"n": "千年3", "v": "878"
|
||||||
|
}, {"n": "永恒之塔", "v": "446"}, {"n": "体育游戏", "v": "100135"}, {
|
||||||
|
"n": "寻仙", "v": "734"
|
||||||
|
}, {"n": "战舰世界", "v": "1947"}, {"n": "QQ三国", "v": "1090"}, {
|
||||||
|
"n": "流放之路", "v": "427"
|
||||||
|
}, {"n": "反恐精英Online", "v": "1918"}, {"n": "反恐行动online", "v": "861"}, {
|
||||||
|
"n": "征途", "v": "2715"
|
||||||
|
}, {"n": "战争雷霆", "v": "624"}, {"n": "丝路传说2", "v": "1026"}, {
|
||||||
|
"n": "星际战甲", "v": "627"
|
||||||
|
}, {"n": "NBA2KOL系列", "v": "3959"}, {"n": "九阴真经", "v": "1009"}, {
|
||||||
|
"n": "跑跑卡丁车", "v": "162"
|
||||||
|
}, {"n": "诛仙世界", "v": "7749"}, {"n": "QQ华夏", "v": "1878"}, {
|
||||||
|
"n": "天涯明月刀", "v": "1219"
|
||||||
|
}, {"n": "大话西游:归来", "v": "8239"}, {"n": "荒野行动PC版", "v": "3185"}, {
|
||||||
|
"n": "新剑侠情缘", "v": "586"
|
||||||
|
}, {"n": "剑网3", "v": "900"}, {"n": "生死狙击2", "v": "6091"}, {
|
||||||
|
"n": "全球使命", "v": "939"
|
||||||
|
}, {"n": "梦想世界3", "v": "486"}, {"n": "枪神纪", "v": "496"}, {
|
||||||
|
"n": "新天龙八部", "v": "5671"
|
||||||
|
}, {"n": "铁甲雄兵", "v": "2765"}, {"n": "神泣", "v": "2531"}, {
|
||||||
|
"n": "斗战神", "v": "591"
|
||||||
|
}, {"n": "造梦西游OL", "v": "6815"}, {"n": "天堂", "v": "1966"}, {
|
||||||
|
"n": "大话西游2", "v": "2975"
|
||||||
|
}, {"n": "使命召唤:战区", "v": "5911"}, {"n": "希望OL", "v": "1161"}, {
|
||||||
|
"n": "极光世界 弑神传", "v": "514"
|
||||||
|
}, {"n": "守望先锋归来", "v": "2174"}, {"n": "QQ自由幻想", "v": "1862"}, {
|
||||||
|
"n": "命运2", "v": "2942"
|
||||||
|
}, {"n": "奇迹世界2", "v": "766"}, {"n": "坦克大战", "v": "4359"}, {
|
||||||
|
"n": "生死狙击", "v": "2471"
|
||||||
|
}, {"n": "天翼决", "v": "779"}, {"n": "QQ幻想", "v": "2419"}, {
|
||||||
|
"n": "新飞飞(FlyFF)", "v": "1582"
|
||||||
|
}, {"n": "刀剑英雄", "v": "915"}, {"n": "FIFA Online系列", "v": "100079"}, {
|
||||||
|
"n": "全球使命3", "v": "2953"
|
||||||
|
}, {"n": "完美端游系列", "v": "3034"}, {"n": "战意", "v": "2599"}, {
|
||||||
|
"n": "泡泡堂", "v": "440"
|
||||||
|
}, {"n": "赛尔号", "v": "2755"}, {"n": "大唐无双零", "v": "1584"}, {
|
||||||
|
"n": "QQ炫舞", "v": "2440"
|
||||||
|
}, {"n": "007:传奇", "v": "1135"}, {"n": "天下", "v": "1597"}, {
|
||||||
|
"n": "天谕", "v": "1899"
|
||||||
|
}, {"n": "新倩女幽魂", "v": "1579"}, {"n": "传世无双", "v": "984"}, {
|
||||||
|
"n": "剑侠世界", "v": "903"
|
||||||
|
}, {"n": "Warhaven", "v": "9053"}, {"n": "诺亚传说", "v": "190"}, {
|
||||||
|
"n": "新挑战", "v": "583"
|
||||||
|
}, {"n": "超激斗梦境", "v": "5691"}, {"n": "QQ音速", "v": "1085"}, {"n": "征途2", "v": "677"}, {
|
||||||
|
"n": "征程", "v": "678"
|
||||||
|
}, {"n": "蜀门", "v": "4711"}, {"n": "完美世界:诸神之战", "v": "7217"}, {
|
||||||
|
"n": "战之刃:幸存者", "v": "8627"
|
||||||
|
}, {"n": "黎明之光", "v": "41"}, {"n": "天命西游", "v": "1086"}, {
|
||||||
|
"n": "炫舞时代", "v": "3353"
|
||||||
|
}, {"n": "荣誉空间", "v": "225"}, {"n": "卡拉彼丘", "v": "9073"}, {
|
||||||
|
"n": "成吉思汗怀旧版", "v": "640"
|
||||||
|
}, {"n": "英雄年代3", "v": "1232"}, {"n": "天书奇谈", "v": "2225"}, {
|
||||||
|
"n": "劲舞团", "v": "2420"
|
||||||
|
}, {"n": "远征Online梦想版", "v": "142"}, {"n": "奇迹:传奇", "v": "3917"}, {
|
||||||
|
"n": "封印者", "v": "2294"
|
||||||
|
}, {"n": "上古世纪", "v": "1046"}, {"n": "梦幻诛仙2", "v": "488"}, {
|
||||||
|
"n": "TERA Online", "v": "1072"
|
||||||
|
}, {"n": "倚天Ⅱ", "v": "959"}, {"n": "街头篮球", "v": "206"}, {
|
||||||
|
"n": "永恒轮回:无限", "v": "7847"
|
||||||
|
}, {"n": "火线精英", "v": "2550"}, {"n": "忍者村大战2", "v": "2369"}, {
|
||||||
|
"n": "领地人生", "v": "2282"
|
||||||
|
}, {"n": "仙侠世界", "v": "995"}, {"n": "洛奇英雄传", "v": "432"}, {
|
||||||
|
"n": "KARDS", "v": "8261"
|
||||||
|
}, {"n": "无限法则", "v": "3189"}, {"n": "全面战争:竞技场", "v": "5901"}, {
|
||||||
|
"n": "自由篮球", "v": "243"
|
||||||
|
}, {"n": "FC Online4", "v": "3683"}, {"n": "战地之王", "v": "618"}, {
|
||||||
|
"n": "古剑奇谭OL", "v": "1892"
|
||||||
|
}, {"n": "QQ仙侠传", "v": "2291"}, {"n": "300英雄", "v": "1132"}]
|
||||||
|
}], "2": [{
|
||||||
|
"key": "cateId",
|
||||||
|
"name": "分类",
|
||||||
|
"init": "2793",
|
||||||
|
"value": [{"n": "天天吃鸡", "v": "2793"}, {"n": "永劫无间", "v": "6219"}, {
|
||||||
|
"n": "主机游戏", "v": "100032"
|
||||||
|
}, {"n": "猛兽派对", "v": "6165"}, {"n": "互动点播", "v": "5907"}, {
|
||||||
|
"n": "我的世界", "v": "1732"
|
||||||
|
}, {"n": "方舟", "v": "1997"}, {"n": "单机热游", "v": "100002"}, {
|
||||||
|
"n": "怀旧游戏", "v": "100125"
|
||||||
|
}, {"n": "逃离塔科夫", "v": "3493"}, {"n": "俄罗斯钓鱼4", "v": "5495"}, {
|
||||||
|
"n": "部落:上升", "v": "1318"
|
||||||
|
}, {"n": "Dark and Darker", "v": "7905"}, {"n": "The Front", "v": "9497"}, {
|
||||||
|
"n": "Apex英雄", "v": "5011"
|
||||||
|
}, {"n": "生化危机4重制版", "v": "8013"}, {"n": "DayZ独立版", "v": "1125"}, {
|
||||||
|
"n": "星空", "v": "7857"
|
||||||
|
}, {"n": "互动剧游", "v": "6919"}, {"n": "艾尔登法环", "v": "5801"}, {
|
||||||
|
"n": "恐惧之间", "v": "6679"
|
||||||
|
}, {"n": "SCUM", "v": "4245"}, {"n": "Dread Hunger", "v": "7601"}, {
|
||||||
|
"n": "塞尔达传说:王国之泪", "v": "7883"
|
||||||
|
}, {"n": "欧洲卡车模拟", "v": "475"}, {"n": "洛克王国", "v": "2864"}, {
|
||||||
|
"n": "卧龙:苍天陨落", "v": "7859"
|
||||||
|
}, {"n": "无人深空", "v": "2566"}, {"n": "帝国神话", "v": "6821"}, {
|
||||||
|
"n": "饥荒", "v": "74"
|
||||||
|
}, {"n": "森林之子", "v": "7943"}, {"n": "星球大战系列", "v": "554"}, {
|
||||||
|
"n": "极限竞速:地平线", "v": "2634"
|
||||||
|
}, {"n": "最终幻想16", "v": "7869"}, {"n": "Among Us", "v": "6163"}, {
|
||||||
|
"n": "怪物猎人:崛起", "v": "6479"
|
||||||
|
}, {"n": "怪物猎人物语", "v": "7101"}, {"n": "骑马与砍杀系列", "v": "4783"}, {
|
||||||
|
"n": "荒野大镖客2", "v": "4319"
|
||||||
|
}, {"n": "太荒初境", "v": "7685"}, {"n": "罗布乐思", "v": "5771"}, {
|
||||||
|
"n": "只狼:影逝二度", "v": "4505"
|
||||||
|
}, {"n": "双人成行", "v": "6737"}, {"n": "重生边缘", "v": "6201"}, {
|
||||||
|
"n": "海贼王 寻秘世界", "v": "5097"
|
||||||
|
}, {"n": "战神:诸神黄昏", "v": "7771"}, {"n": "恐鬼症", "v": "6205"}, {
|
||||||
|
"n": "鬼谷八荒", "v": "6571"
|
||||||
|
}, {"n": "霍格沃茨之遗", "v": "7881"}, {"n": "全面战争", "v": "3521"}, {
|
||||||
|
"n": "仁王2", "v": "5795"
|
||||||
|
}, {"n": "奥拉星", "v": "2846"}, {"n": "甜蜜之家", "v": "6739"}, {
|
||||||
|
"n": "仙剑奇侠传七", "v": "6509"
|
||||||
|
}, {"n": "消逝的光芒2", "v": "7581"}, {"n": "渡神记", "v": "6231"}, {
|
||||||
|
"n": "归家异途", "v": "2949"
|
||||||
|
}, {"n": "博德之门3", "v": "6147"}, {"n": "看门狗:军团", "v": "6155"}, {
|
||||||
|
"n": "使命召唤系列", "v": "100137"
|
||||||
|
}, {"n": "育碧游戏", "v": "100139"}, {"n": "帝国时代4", "v": "4835"}, {
|
||||||
|
"n": "英灵神殿", "v": "6609"
|
||||||
|
}, {"n": "蛮荒志异:起源", "v": "9709"}, {"n": "岛", "v": "3019"}, {
|
||||||
|
"n": "沙盒与副本", "v": "9151"
|
||||||
|
}, {"n": "扫雷", "v": "2349"}, {"n": "街机游戏", "v": "5999"}, {
|
||||||
|
"n": "幽灵线:东京", "v": "7669"
|
||||||
|
}, {"n": "怪物猎人世界", "v": "3519"}, {"n": "盗贼之海", "v": "3641"}, {
|
||||||
|
"n": "纸人", "v": "5257"
|
||||||
|
}, {"n": "黑色像素人", "v": "28"}, {"n": "对马岛之魂", "v": "6039"}, {
|
||||||
|
"n": "瑞奇与叮当", "v": "2455"
|
||||||
|
}, {"n": "港诡实录", "v": "5853"}, {"n": "剑士", "v": "1467"}, {
|
||||||
|
"n": "魔法门之英雄无敌系列", "v": "2096"
|
||||||
|
}, {"n": "星露谷物语", "v": "2443"}, {"n": "仙剑奇侠传四", "v": "1659"}, {
|
||||||
|
"n": "伤害世界", "v": "2337"
|
||||||
|
}, {"n": "禁闭求生", "v": "6065"}, {"n": "真三国无双", "v": "1599"}, {
|
||||||
|
"n": "恐怖黎明", "v": "3435"
|
||||||
|
}, {"n": "其他单机", "v": "3069"}, {"n": "幽灵行动:荒野", "v": "2794"}, {
|
||||||
|
"n": "边缘", "v": "151"
|
||||||
|
}, {"n": "阿凡达", "v": "106"}, {"n": "全面战争:三国", "v": "3004"}, {
|
||||||
|
"n": "黎明之星", "v": "40"
|
||||||
|
}, {"n": "翼星求生", "v": "7463"}, {"n": "黎明传说", "v": "39"}, {
|
||||||
|
"n": "恶魔之魂", "v": "6151"
|
||||||
|
}, {"n": "艾兰岛", "v": "3855"}, {"n": "龙与地下城:秘影历代记HD", "v": "17"}, {
|
||||||
|
"n": "龙与地下城:匕首谷", "v": "18"
|
||||||
|
}, {"n": "沙石镇时光", "v": "7687"}, {"n": "三国志曹操传", "v": "2592"}, {
|
||||||
|
"n": "FIFA足球", "v": "1888"
|
||||||
|
}, {"n": "最终幻想7:重制版", "v": "5809"}, {"n": "四海兄弟", "v": "5995"}, {
|
||||||
|
"n": "最终幻想:起源", "v": "7653"
|
||||||
|
}, {"n": "摔跤城大乱斗", "v": "7773"}, {"n": "音乐游戏", "v": "2761"}, {
|
||||||
|
"n": "精灵与萤火意志", "v": "5895"
|
||||||
|
}, {"n": "桥梁建造师", "v": "3275"}, {"n": "哈迪斯", "v": "6153"}, {
|
||||||
|
"n": "小缇娜的奇幻之地", "v": "7647"
|
||||||
|
}, {"n": "宝可梦:剑盾", "v": "5715"}, {"n": "边境", "v": "4779"}, {
|
||||||
|
"n": "人类一败涂地", "v": "3289"
|
||||||
|
}, {"n": "糖豆人:终极淘汰赛", "v": "6083"}, {"n": "精灵宝可梦Let's Go", "v": "4375"}, {
|
||||||
|
"n": "战锤40K:暗潮", "v": "3016"
|
||||||
|
}, {"n": "石油骚动", "v": "2585"}, {"n": "紫塞秋风", "v": "6045"}, {
|
||||||
|
"n": "阿尔比恩", "v": "8115"
|
||||||
|
}, {"n": "猎人:荒野的召唤", "v": "2906"}, {"n": "FIFA 23", "v": "7789"}, {
|
||||||
|
"n": "都市:天际线", "v": "2201"
|
||||||
|
}, {"n": "乐高大电影:游戏版", "v": "1439"}, {"n": "全面战争:阿提拉", "v": "2383"}, {
|
||||||
|
"n": "斩妖行", "v": "6105"
|
||||||
|
}, {"n": "马里奥赛车8", "v": "5947"}, {"n": "复仇者联盟", "v": "6121"}, {"n": "霓虹深渊", "v": "5743"}]
|
||||||
|
}], "3": [{
|
||||||
|
"key": "cateId",
|
||||||
|
"name": "分类",
|
||||||
|
"init": "2336",
|
||||||
|
"value": [{"n": "王者荣耀", "v": "2336"}, {"n": "和平精英", "v": "3203"}, {
|
||||||
|
"n": "英雄联盟手游", "v": "6203"
|
||||||
|
}, {"n": "CF手游", "v": "2413"}, {"n": "金铲铲之战", "v": "7185"}, {
|
||||||
|
"n": "三国杀", "v": "1669"
|
||||||
|
}, {"n": "原神", "v": "5489"}, {"n": "棋牌桌游", "v": "100036"}, {
|
||||||
|
"n": "综合手游", "v": "100029"
|
||||||
|
}, {"n": "劲乐幻想", "v": "7691"}, {"n": "新游广场", "v": "100052"}, {
|
||||||
|
"n": "崩坏:星穹铁道", "v": "7349"
|
||||||
|
}, {"n": "火影忍者手游", "v": "2429"}, {"n": "第五人格", "v": "3115"}, {
|
||||||
|
"n": "问道手游", "v": "2477"
|
||||||
|
}, {"n": "暗区突围", "v": "7209"}, {"n": "QQ飞车手游", "v": "2928"}, {
|
||||||
|
"n": "球球大作战", "v": "2411"
|
||||||
|
}, {"n": "明日之后", "v": "3483"}, {"n": "皇室战争", "v": "2439"}, {
|
||||||
|
"n": "COD手游", "v": "4769"
|
||||||
|
}, {"n": "手游休闲", "v": "100004"}, {"n": "二次元手游", "v": "100091"}, {
|
||||||
|
"n": "摸了个鱼", "v": "9283"
|
||||||
|
}, {"n": "MMORPG", "v": "100273"}, {"n": "动作游戏", "v": "100197"}, {
|
||||||
|
"n": "战争冲突", "v": "7449"
|
||||||
|
}, {"n": "王者模拟战", "v": "5699"}, {"n": "逆水寒手游", "v": "7725"}, {
|
||||||
|
"n": "幻塔", "v": "6437"
|
||||||
|
}, {"n": "欢乐斗地主", "v": "1749"}, {"n": "神武4手游", "v": "3135"}, {
|
||||||
|
"n": "阴阳师", "v": "2598"
|
||||||
|
}, {"n": "DNF手游", "v": "4921"}, {"n": "欢乐麻将", "v": "1751"}, {
|
||||||
|
"n": "英雄联盟电竞经理", "v": "7177"
|
||||||
|
}, {"n": "狼人杀手游", "v": "100049"}, {"n": "新天龙八部手游", "v": "6945"}, {
|
||||||
|
"n": "中国象棋", "v": "1671"
|
||||||
|
}, {"n": "天天象棋", "v": "4997"}, {"n": "传奇世界3D", "v": "3961"}, {
|
||||||
|
"n": "御龙在天手游", "v": "2568"
|
||||||
|
}, {"n": "高能英雄", "v": "8359"}, {"n": "天龙八部手游", "v": "2852"}, {
|
||||||
|
"n": "三国志战略版", "v": "5619"
|
||||||
|
}, {"n": "忍者必须死3", "v": "4041"}, {"n": "SKY光遇", "v": "3719"}, {
|
||||||
|
"n": "虎牙领主争霸", "v": "7529"
|
||||||
|
}, {"n": "云上城之歌", "v": "5977"}, {"n": "晶核", "v": "7279"}, {
|
||||||
|
"n": "仙境传说RO", "v": "2675"
|
||||||
|
}, {"n": "天天狼人", "v": "2774"}, {"n": "JJ棋牌", "v": "3841"}, {
|
||||||
|
"n": "奇迹MU:觉醒", "v": "3116"
|
||||||
|
}, {"n": "指尖四川麻将", "v": "7215"}, {"n": "部落冲突", "v": "1797"}, {
|
||||||
|
"n": "新剑侠情缘手游", "v": "6259"
|
||||||
|
}, {"n": "萌宠远征", "v": "9385"}, {"n": "暗黑破坏神:不朽", "v": "6385"}, {
|
||||||
|
"n": "英雄杀", "v": "2688"
|
||||||
|
}, {"n": "热血江湖手游", "v": "2817"}, {"n": "蛋仔派对", "v": "6909"}, {
|
||||||
|
"n": "完美世界手游", "v": "4237"
|
||||||
|
}, {"n": "巅峰战舰", "v": "2502"}, {"n": "狼人杀", "v": "2785"}, {
|
||||||
|
"n": "斗罗大陆:魂师对决", "v": "6745"
|
||||||
|
}, {"n": "武侠乂手游", "v": "4929"}, {"n": "诛仙手游", "v": "2647"}, {
|
||||||
|
"n": "斗破苍穹手游", "v": "4337"
|
||||||
|
}, {"n": "迷你世界", "v": "2683"}, {"n": "风云", "v": "3061"}, {
|
||||||
|
"n": "妄想山海", "v": "6007"
|
||||||
|
}, {"n": "曙光英雄", "v": "6169"}, {"n": "三国战纪2", "v": "6049"}, {
|
||||||
|
"n": "梦幻新诛仙", "v": "5975"
|
||||||
|
}, {"n": "黎明觉醒:生机", "v": "6131"}, {"n": "远征", "v": "7837"}, {
|
||||||
|
"n": "航海王:燃烧意志", "v": "3943"
|
||||||
|
}, {"n": "火炬之光:无限", "v": "6399"}, {"n": "巅峰极速", "v": "6979"}, {
|
||||||
|
"n": "圣境之塔", "v": "7055"
|
||||||
|
}, {"n": "魔力宝贝", "v": "2891"}, {"n": "香肠派对", "v": "3639"}, {
|
||||||
|
"n": "创造与魔法", "v": "2931"
|
||||||
|
}, {"n": "JJ斗地主", "v": "6271"}, {"n": "永恒纪元:戒", "v": "2646"}, {
|
||||||
|
"n": "天涯明月刀手游", "v": "5115"
|
||||||
|
}, {"n": "狼人杀官方", "v": "3679"}, {"n": "混沌起源", "v": "5985"}, {
|
||||||
|
"n": "多多自走棋", "v": "5133"
|
||||||
|
}, {"n": "梦幻诛仙手游", "v": "2672"}, {"n": "鸿图之下", "v": "6027"}, {
|
||||||
|
"n": "新笑傲江湖", "v": "5669"
|
||||||
|
}, {"n": "凡人修仙传:人界篇", "v": "8297"}, {"n": "多乐棋牌", "v": "6209"}, {
|
||||||
|
"n": "口袋觉醒", "v": "5953"
|
||||||
|
}, {"n": "跑跑卡丁车手游", "v": "2620"}, {"n": "奶块", "v": "2775"}, {
|
||||||
|
"n": "月圆之夜", "v": "4339"
|
||||||
|
}, {"n": "率土之滨", "v": "2691"}, {"n": "征途2手游", "v": "2811"}, {
|
||||||
|
"n": "英魂之刃口袋版", "v": "2760"
|
||||||
|
}, {"n": "精灵盛典:黎明", "v": "6123"}, {"n": "方舟手游", "v": "4035"}, {
|
||||||
|
"n": "掼蛋", "v": "6225"
|
||||||
|
}, {"n": "绝世仙王", "v": "6619"}, {"n": "流星群侠传", "v": "3927"}, {
|
||||||
|
"n": "寻仙手游", "v": "2979"
|
||||||
|
}, {"n": "一梦江湖", "v": "3082"}, {"n": "Lost Light(萤火突击国际服)", "v": "6859"}, {
|
||||||
|
"n": "弹幕云游戏", "v": "7001"
|
||||||
|
}, {"n": "猎魂觉醒", "v": "3071"}, {"n": "冒险岛:枫之传说", "v": "8005"}, {
|
||||||
|
"n": "征途手游", "v": "2556"
|
||||||
|
}, {"n": "海岛奇兵", "v": "2624"}, {"n": "倩女幽魂手游", "v": "2503"}, {
|
||||||
|
"n": "超凡先锋", "v": "6507"
|
||||||
|
}, {"n": "龙之谷2手游", "v": "2736"}, {"n": "崩坏3", "v": "2639"}, {
|
||||||
|
"n": "猫和老鼠", "v": "2758"
|
||||||
|
}, {"n": "七人传奇:光与暗之交战", "v": "8125"}, {"n": "JJ麻将", "v": "9487"}, {
|
||||||
|
"n": "拉轰西游", "v": "9543"
|
||||||
|
}, {"n": "三国战纪", "v": "6047"}, {"n": "自由幻想手游", "v": "4015"}, {
|
||||||
|
"n": "秦时明月世界", "v": "5279"
|
||||||
|
}, {"n": "新斗罗大陆", "v": "6657"}, {"n": "新神魔大陆", "v": "5939"}, {
|
||||||
|
"n": "逃跑吧!少年", "v": "4137"
|
||||||
|
}, {"n": "太古神王2", "v": "6649"}, {"n": "剑侠世界3", "v": "7183"}, {
|
||||||
|
"n": "天天吃鸡手机版", "v": "4341"
|
||||||
|
}, {"n": "时空猎人3", "v": "6411"}, {"n": "合金弹头:觉醒", "v": "6931"}, {
|
||||||
|
"n": "明日方舟", "v": "4925"
|
||||||
|
}, {"n": "原始征途", "v": "7713"}, {"n": "奇迹:最强者", "v": "3215"}, {
|
||||||
|
"n": "天天酷跑", "v": "1715"
|
||||||
|
}, {"n": "FC 足球世界", "v": "3873"}, {"n": "万国觉醒", "v": "6159"}, {
|
||||||
|
"n": "机动都市阿尔法", "v": "5411"
|
||||||
|
}, {"n": "航海王热血航线", "v": "6181"}, {"n": "幻世九歌", "v": "7199"}, {
|
||||||
|
"n": "植物大战僵尸", "v": "485"
|
||||||
|
}, {"n": "无悔华夏", "v": "7063"}, {"n": "时空猎人", "v": "1742"}, {
|
||||||
|
"n": "荒野乱斗", "v": "4613"
|
||||||
|
}, {"n": "拳皇98终极之战OL", "v": "2687"}, {"n": "蛇蛇争霸", "v": "2680"}, {
|
||||||
|
"n": "王牌竞速", "v": "6463"
|
||||||
|
}, {"n": "重返帝国", "v": "6955"}, {"n": "吞噬星空:黎明", "v": "6651"}, {
|
||||||
|
"n": "口袋妖怪", "v": "2541"
|
||||||
|
}, {"n": "QQ炫舞手游", "v": "2991"}, {"n": "一拳超人:最强之男", "v": "4629"}, {
|
||||||
|
"n": "荣耀新三国", "v": "6943"
|
||||||
|
}, {"n": "少年三国志2", "v": "6125"}, {"n": "我的起源", "v": "5365"}, {
|
||||||
|
"n": "决战平安京", "v": "3064"
|
||||||
|
}, {"n": "剑灵2", "v": "7223"}, {"n": "开心消消乐", "v": "1712"}, {
|
||||||
|
"n": "小小蚁国", "v": "7803"
|
||||||
|
}, {"n": "最强NBA", "v": "2988"}, {"n": "剑侠情缘手游", "v": "2621"}, {
|
||||||
|
"n": "长安幻想", "v": "6727"
|
||||||
|
}, {"n": "我叫MT4", "v": "4087"}, {"n": "全明星街球派对", "v": "8401"}, {
|
||||||
|
"n": "大话西游手游", "v": "2626"
|
||||||
|
}, {"n": "荣耀大天使", "v": "6477"}, {"n": "镇魂街:天生为王", "v": "6557"}, {
|
||||||
|
"n": "摩尔庄园", "v": "5981"
|
||||||
|
}, {"n": "游戏王:决斗链接", "v": "4451"}, {"n": "剑侠世界2手游", "v": "3150"}, {
|
||||||
|
"n": "青云诀2", "v": "6009"
|
||||||
|
}, {"n": "战地无疆", "v": "7909"}, {"n": "一念逍遥", "v": "6419"}, {
|
||||||
|
"n": "永劫无间手游", "v": "7579"
|
||||||
|
}, {"n": "尘白禁区", "v": "7297"}, {"n": "元梦之星", "v": "9521"}, {
|
||||||
|
"n": "不良人3", "v": "5891"
|
||||||
|
}, {"n": "剑灵:革命", "v": "4545"}, {"n": "魔力宝贝:旅人", "v": "7573"}, {
|
||||||
|
"n": "米加小镇", "v": "7269"
|
||||||
|
}, {"n": "龙武手游", "v": "5219"}, {"n": "斗罗大陆2:绝世唐门", "v": "6581"}, {
|
||||||
|
"n": "西行纪燃魂", "v": "8303"
|
||||||
|
}, {"n": "坦克世界闪击战", "v": "4977"}, {"n": "军棋", "v": "2561"}, {
|
||||||
|
"n": "饥荒:新家", "v": "6491"
|
||||||
|
}, {"n": "拳皇命运", "v": "3379"}, {"n": "实况足球", "v": "3741"}, {
|
||||||
|
"n": "战舰世界闪击战", "v": "4101"
|
||||||
|
}, {"n": "时空召唤", "v": "2551"}, {"n": "王牌战争:文明重启", "v": "5479"}, {
|
||||||
|
"n": "雀魂麻将", "v": "7107"
|
||||||
|
}, {"n": "欢乐升级", "v": "3925"}, {"n": "绿色征途", "v": "4227"}, {
|
||||||
|
"n": "弹弹堂手游", "v": "2857"
|
||||||
|
}, {"n": "太极熊猫3:猎龙", "v": "2778"}, {"n": "哈利波特:魔法觉醒", "v": "5835"}, {
|
||||||
|
"n": "天地劫:幽城再临", "v": "5987"
|
||||||
|
}, {"n": "热血街篮", "v": "5859"}, {"n": "神雕侠侣手游", "v": "1781"}, {
|
||||||
|
"n": "山海镜花", "v": "5089"
|
||||||
|
}, {"n": "三国志战棋版", "v": "7937"}, {"n": "神雕侠侣2", "v": "4209"}, {
|
||||||
|
"n": "仙魔决", "v": "1674"
|
||||||
|
}, {"n": "王者荣耀星之破晓", "v": "7927"}, {"n": "我在江湖之神魔道", "v": "7699"}, {
|
||||||
|
"n": "梦幻模拟战", "v": "3481"
|
||||||
|
}, {"n": "单机手游", "v": "2777"}, {"n": "斗罗大陆-斗神再临", "v": "6631"}, {
|
||||||
|
"n": "未来之役", "v": "6831"
|
||||||
|
}, {"n": "风云岛行动", "v": "4695"}, {"n": "新游推荐", "v": "3160"}, {
|
||||||
|
"n": "火影忍者OL", "v": "3901"
|
||||||
|
}, {"n": "九灵神域", "v": "7719"}, {"n": "武动乾坤", "v": "3829"}, {
|
||||||
|
"n": "秦时明月2", "v": "1784"
|
||||||
|
}, {"n": "文明与征服", "v": "7071"}, {"n": "战双:帕弥什", "v": "4133"}, {
|
||||||
|
"n": "大航海时代:海上霸主", "v": "6929"
|
||||||
|
}, {"n": "剑网1:归来", "v": "7361"}, {"n": "绝区零", "v": "7711"}, {
|
||||||
|
"n": "黑色沙漠手游", "v": "7287"
|
||||||
|
}, {"n": "虎牙吃鸡", "v": "7465"}, {"n": "一剑斩仙", "v": "6843"}, {
|
||||||
|
"n": "传奇天下", "v": "6927"
|
||||||
|
}, {"n": "斗斗堂", "v": "7133"}, {"n": "斗罗大陆", "v": "6119"}, {
|
||||||
|
"n": "天谕手游", "v": "5925"
|
||||||
|
}, {"n": "坎公骑冠剑", "v": "6641"}, {"n": "最终幻想觉醒", "v": "2721"}, {
|
||||||
|
"n": "神将三国", "v": "6621"
|
||||||
|
}, {"n": "灌篮高手正版授权手游", "v": "5399"}, {"n": "剑与家园", "v": "2838"}, {
|
||||||
|
"n": "极无双2", "v": "7825"
|
||||||
|
}, {"n": "光明大陆", "v": "2832"}, {"n": "荒野行动", "v": "3084"}, {
|
||||||
|
"n": "战斗法则", "v": "9513"
|
||||||
|
}, {"n": "疯狂原始人", "v": "4619"}, {"n": "逆战手游", "v": "7575"}, {
|
||||||
|
"n": "石器时代:觉醒", "v": "9159"
|
||||||
|
}]
|
||||||
|
}], "8": [{
|
||||||
|
"key": "cateId",
|
||||||
|
"name": "分类",
|
||||||
|
"init": "1663",
|
||||||
|
"value": [{"n": "星秀", "v": "1663"}, {"n": "户外", "v": "2165"}, {
|
||||||
|
"n": "一起看", "v": "2135"
|
||||||
|
}, {"n": "二次元", "v": "2633"}, {"n": "虚拟偶像", "v": "6055"}, {"n": "旅游", "v": "6791"}, {
|
||||||
|
"n": "放映厅", "v": "6245"
|
||||||
|
}, {"n": "娱乐天地", "v": "100022"}, {"n": "交友", "v": "4079"}, {
|
||||||
|
"n": "组队", "v": "5367"
|
||||||
|
}, {"n": "吃喝玩乐", "v": "100044"}, {"n": "原创", "v": "6861"}, {
|
||||||
|
"n": "虎牙文化", "v": "4089"
|
||||||
|
}, {"n": "体育", "v": "2356"}, {"n": "虎牙地方", "v": "5123"}, {"n": "颜值", "v": "2168"}, {
|
||||||
|
"n": "科技", "v": "2408"
|
||||||
|
}, {"n": "音乐", "v": "3793"}, {"n": "趣分享", "v": "5883"}, {"n": "一起买", "v": "7759"}, {
|
||||||
|
"n": "派对", "v": "7785"
|
||||||
|
}]
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
if (this.customArea.length > 0) {
|
||||||
|
const filterCfg = this.customArea.split('#');
|
||||||
|
this.classes.unshift({"type_id": "custom", "type_name": "自选"});
|
||||||
|
const filterList = _.map(filterCfg, (it) => {
|
||||||
|
const filterKv = it.split(',');
|
||||||
|
return {
|
||||||
|
n: filterKv[1], v: filterKv[0],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const defKey = filterList[0];
|
||||||
|
this.filterObj["custom"] = [{"key": "cateId", "name": "分类", "init": defKey.v, "value": filterList}];
|
||||||
|
}
|
||||||
|
if (this.isJustLive) {
|
||||||
|
// key-value映射修改
|
||||||
|
const filterKeys = Object.keys(this.filterObj);
|
||||||
|
for (const filterKey of filterKeys) {
|
||||||
|
const filterItem = this.filterObj[filterKey];
|
||||||
|
for (const typeItem of filterItem) {
|
||||||
|
typeItem.value = _.map(typeItem.value, (it) => {
|
||||||
|
// 修改默认值
|
||||||
|
if (it.v === typeItem.init) {
|
||||||
|
typeItem.init = it.n;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
n: it.n, v: it.n,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.classes.unshift({"type_id": "home", "type_name": "首页"});
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHome(filter) {
|
||||||
|
await this.setClasses()
|
||||||
|
await this.setFilterObj()
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(obj) {
|
||||||
|
let vod_list = []
|
||||||
|
if (this.isJustLive) {
|
||||||
|
for (const it of obj["data"]) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = it["roomId"]
|
||||||
|
vodShort.vod_name = it["ownerName"] + it["roomName"]
|
||||||
|
vodShort.vod_pic = it["roomPic"]
|
||||||
|
vodShort.vod_remarks = it["categoryName"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
for (const it of obj.data.datas) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = it["profileRoom"]
|
||||||
|
vodShort.vod_name = it["nick"] + it["introduction"]
|
||||||
|
vodShort.vod_pic = it["screenshot"]
|
||||||
|
vodShort.vod_remarks = it["gameFullName"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
getPlayUrlData(streamInfo, ratio) {
|
||||||
|
const hlsUrl = streamInfo["sHlsUrl"] + '/' + streamInfo["sStreamName"] + '.' + streamInfo["sHlsUrlSuffix"];
|
||||||
|
const srcAntiCode = unescape(streamInfo["sHlsAntiCode"]);
|
||||||
|
let codeList = srcAntiCode.split('&');
|
||||||
|
codeList = codeList.filter(code => code !== '');
|
||||||
|
let cryptoInfo = {};
|
||||||
|
for (const code of codeList) {
|
||||||
|
const [k, v] = code.split('=');
|
||||||
|
cryptoInfo[k] = v;
|
||||||
|
}
|
||||||
|
const fm = Utils.unquote(cryptoInfo["fm"]);
|
||||||
|
const fmDecoded = Utils.base64Decode(fm);
|
||||||
|
const hashPrefix = fmDecoded.split('_')[0];
|
||||||
|
const ctype = cryptoInfo["ctype"] || '';
|
||||||
|
const txyp = cryptoInfo["txyp"] || '';
|
||||||
|
const fs = cryptoInfo.fs || '';
|
||||||
|
const t = cryptoInfo.t || '';
|
||||||
|
const u = 1463993859134;
|
||||||
|
const curTime = Date.now();
|
||||||
|
const seqid = Math.floor(curTime + u);
|
||||||
|
const wsTime = (Math.floor(curTime / 1e3) + 3600).toString(16);
|
||||||
|
const v0 = seqid + '|' + ctype + '|' + t;
|
||||||
|
const v1 = Utils.md5Encode(v0);
|
||||||
|
const v2 = hashPrefix + '_' + u + '_' + streamInfo["sStreamName"] + '_' + v1 + '_' + wsTime;
|
||||||
|
const hash = Utils.md5Encode(v2);
|
||||||
|
// ratio = ""
|
||||||
|
const purl = `${hlsUrl}?wsSecret=${hash}&wsTime=${wsTime}&seqid=${seqid}&ctype=${ctype}&ver=1&txyp=${txyp}&fs=${fs}&ratio=${ratio}&u=${u}&t=${t}&sv=2107230339`;
|
||||||
|
return {
|
||||||
|
cdnType: streamInfo["sCdnType"], playUrl: purl,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(liveInfo, streamInfoList, bitInfoList) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = liveInfo["introduction"] ?? liveInfo["sIntroduction"]
|
||||||
|
vodDetail.vod_pic = liveInfo["screenshot"] ?? liveInfo["sScreenshot"]
|
||||||
|
vodDetail.vod_remarks = liveInfo["gameFullName"] ?? liveInfo["sGameFullName"]
|
||||||
|
vodDetail.type_name = liveInfo["gameFullName"] ?? liveInfo["sGameFullName"]
|
||||||
|
vodDetail.vod_director = liveInfo["nick"] ?? liveInfo["sNick"]
|
||||||
|
vodDetail.vod_content = liveInfo["activityCount"] ?? liveInfo["lActivityCount"]
|
||||||
|
vodDetail.vod_content = vodDetail.vod_content + '人在线'
|
||||||
|
let vod_play_from_list = []
|
||||||
|
let vod_play_list = []
|
||||||
|
for (const streamInfo of streamInfoList) {
|
||||||
|
let vodItems = []
|
||||||
|
for (const bitinfo of bitInfoList) {
|
||||||
|
let format_name = this.huYaPlayForamtObj[streamInfo["sCdnType"]]
|
||||||
|
if (format_name === bitinfo["sDisplayName"]) {
|
||||||
|
const urlData = this.getPlayUrlData(streamInfo, bitinfo["iBitRate"]);
|
||||||
|
vod_play_from_list.push(format_name)
|
||||||
|
vodItems.push("虎牙直播" + '$' + urlData["playUrl"])
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc(vodData, playData) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = vodData["data"]["roomName"]
|
||||||
|
vodDetail.vod_director = vodData["data"]["ownerName"]
|
||||||
|
vodDetail.vod_pic = vodData["data"]["roomPic"]
|
||||||
|
vodDetail.vod_remarks = vodData["data"]["categoryName"]
|
||||||
|
vodDetail.vod_content = vodData["data"]["online"] + "人在线"
|
||||||
|
let vod_play_from_list = []
|
||||||
|
let vod_play_list = []
|
||||||
|
for (const key of Object.keys(this.livePlayForamtObj)) {
|
||||||
|
let vodItems = []
|
||||||
|
if (playData.data.hasOwnProperty(key)) {
|
||||||
|
vod_play_from_list.push(this.livePlayForamtObj[key])
|
||||||
|
vodItems.push("JustLive" + '$' + playData["data"][key])
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch(data) {
|
||||||
|
let vod_list = [];
|
||||||
|
for (const vod of data.response['3']["docs"]) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = vod["room_id"]
|
||||||
|
vodShort.vod_name = vod["game_nick"] + vod["game_introduction"]
|
||||||
|
vodShort.vod_pic = vod["game_screenshot"]
|
||||||
|
vodShort.vod_remarks = vod["game_name"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0 || typeof pg == 'undefined') pg = 1;
|
||||||
|
let url = '';
|
||||||
|
let data = {}
|
||||||
|
if (this.isJustLive) {
|
||||||
|
if (tid === 'home') {
|
||||||
|
url = this.siteUrl + '/api/live/getRecommendByPlatform?platform=huya&size=20&page=' + pg;
|
||||||
|
} else {
|
||||||
|
url = this.siteUrl + '/api/live/getRecommendByPlatformArea?platform=huya&size=20&area=' + extend.cateId + '&page=' + pg;
|
||||||
|
}
|
||||||
|
data = JSON.parse(await this.fetch(url, null, this.getHeader()));
|
||||||
|
} else {
|
||||||
|
if (tid === 'home') {
|
||||||
|
url = this.siteUrl + '/cache.php?m=LiveList&do=getLiveListByPage&tagAll=1&page=' + pg;
|
||||||
|
} else {
|
||||||
|
url = this.siteUrl + '/cache.php?m=LiveList&do=getLiveListByPage&gameId=' + extend["cateId"] + '&tagAll=0&page=' + pg;
|
||||||
|
}
|
||||||
|
data = JSON.parse(await this.fetch(url, null, this.getHeader()));
|
||||||
|
}
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let liveInfo = null;
|
||||||
|
let streamInfoList = null;
|
||||||
|
if (this.isJustLive) {
|
||||||
|
await this.jadeLog.debug("JustLive", true)
|
||||||
|
const vodInfo = await this.fetch(this.siteUrl + `/api/live/getRoomInfo?platform=huya&roomId=${id}`, null, this.getHeader())
|
||||||
|
const playInfo = await this.fetch(this.siteUrl + `/api/live/getRealUrl?platform=huya&roomId=${id}`, null, this.getHeader())
|
||||||
|
const vodData = JSON.parse(vodInfo);
|
||||||
|
const playData = JSON.parse(playInfo)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc(vodData, playData)
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.debug("虎牙直播", true)
|
||||||
|
const resp = await this.fetch('https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid=' + id, null, this.getHeader());
|
||||||
|
const data = JSON.parse(resp);
|
||||||
|
liveInfo = data.data["liveData"];
|
||||||
|
let bitInfo = JSON.parse(liveInfo["bitRateInfo"])
|
||||||
|
streamInfoList = data.data.stream["baseSteamInfoList"];
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(liveInfo, streamInfoList, bitInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 网页链接
|
||||||
|
*
|
||||||
|
* await this.jadeLog.debug("虎牙直播",true)
|
||||||
|
* const headers = {
|
||||||
|
* 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': Utils.MOBILEUA,
|
||||||
|
* };
|
||||||
|
* let content = await this.fetch('https://m.huya.com/' + id, null, headers);
|
||||||
|
* let liveData = JSON.parse(Utils.getStrByRegex(/<script> window.HNF_GLOBAL_INIT = (.*?)<\/script>/, content))
|
||||||
|
* const vodData = liveData["roomInfo"];
|
||||||
|
* liveInfo = vodData["tLiveInfo"];
|
||||||
|
* streamInfoList = vodData["tLiveInfo"]["tLiveStreamInfo"]["vStreamInfo"]["value"]
|
||||||
|
* let bitInfoList = vodData["tLiveInfo"]["tLiveStreamInfo"]["vBitRateInfo"]["value"]
|
||||||
|
* this.vodDetail = await this.parseVodDetailfromJson(liveInfo, streamInfoList, bitInfoList)
|
||||||
|
* */
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
const resp = await this.fetch('https://search.cdn.huya.com/?m=Search&do=getSearchContent&q=' + wd + '&uid=0&v=4&typ=-5&livestate=0&rows=40&start=0', null, this.getHeader());
|
||||||
|
const data = JSON.parse(resp);
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new HuyaSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
319
18/ds/18js/js/ikanbot.js
Normal file
319
18/ds/18js/js/ikanbot.js
Normal file
|
|
@ -0,0 +1,319 @@
|
||||||
|
/*
|
||||||
|
* @File : ikanbot.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/15 10:32
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {load, _} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
|
||||||
|
function _0xf746(_0xbb40c4, _0x1cb776) {
|
||||||
|
const _0x45e084 = _0x45e0();
|
||||||
|
return _0xf746 = function (_0xf74696, _0x4d32af) {
|
||||||
|
_0xf74696 = _0xf74696 - 0x1a8;
|
||||||
|
let _0xcbfa28 = _0x45e084[_0xf74696];
|
||||||
|
return _0xcbfa28;
|
||||||
|
}, _0xf746(_0xbb40c4, _0x1cb776);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _0x45e0() {
|
||||||
|
const _0x58b10c = ['1580630GngmmA', '117uvwflw', 'join', 'current_id', '565448Apkhig', '23092JwmytW', '707152yowhOv', 'getElementById', '855936CGaczt', 'length', '2966831GCGpvn', '611266nfcTEf', 'value', 'substring'];
|
||||||
|
_0x45e0 = function () {
|
||||||
|
return _0x58b10c;
|
||||||
|
};
|
||||||
|
return _0x45e0();
|
||||||
|
}
|
||||||
|
|
||||||
|
(function (_0x27923d, _0x43d7fc) {
|
||||||
|
const _0x439396 = _0xf746, _0x30f164 = _0x27923d();
|
||||||
|
while (!![]) {
|
||||||
|
try {
|
||||||
|
const _0xa560eb = -parseInt(_0x439396(0x1b4)) / 0x1 + parseInt(_0x439396(0x1ad)) / 0x2 + -parseInt(_0x439396(0x1b1)) / 0x3 * (-parseInt(_0x439396(0x1b5)) / 0x4) + -parseInt(_0x439396(0x1b0)) / 0x5 + parseInt(_0x439396(0x1aa)) / 0x6 + parseInt(_0x439396(0x1ac)) / 0x7 + parseInt(_0x439396(0x1a8)) / 0x8;
|
||||||
|
if (_0xa560eb === _0x43d7fc) break; else _0x30f164['push'](_0x30f164['shift']());
|
||||||
|
} catch (_0x3ae316) {
|
||||||
|
_0x30f164['push'](_0x30f164['shift']());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(_0x45e0, 0x4a3d9));
|
||||||
|
|
||||||
|
function get_tks(play_id, e_token) {
|
||||||
|
const _0xf07220 = _0xf746;
|
||||||
|
let _0x35162d = play_id, _0xf25678 = e_token;
|
||||||
|
if (!_0x35162d || !_0xf25678) return;
|
||||||
|
let _0x3882a3 = _0x35162d['length'], _0x52a097 = _0x35162d[_0xf07220(0x1af)](_0x3882a3 - 0x4, _0x3882a3),
|
||||||
|
_0x2d9d1b = [];
|
||||||
|
for (let _0x570711 = 0x0; _0x570711 < _0x52a097[_0xf07220(0x1ab)]; _0x570711++) {
|
||||||
|
let _0x23e537 = parseInt(_0x52a097[_0x570711]), _0x48b93d = _0x23e537 % 0x3 + 0x1;
|
||||||
|
_0x2d9d1b[_0x570711] = _0xf25678[_0xf07220(0x1af)](_0x48b93d, _0x48b93d + 0x8), _0xf25678 = _0xf25678[_0xf07220(0x1af)](_0x48b93d + 0x8, _0xf25678[_0xf07220(0x1ab)]);
|
||||||
|
}
|
||||||
|
return _0x2d9d1b[_0xf07220(0x1b2)]('');
|
||||||
|
}
|
||||||
|
|
||||||
|
class IKanBotSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://v.ikanbot.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🤖┃爱看机器人┃🤖"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "爱看机器人"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "ikanbot"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq = null) {
|
||||||
|
if (inReq !== null) {
|
||||||
|
this.jsBase = await js2Proxy(inReq, "img", this.getHeader());
|
||||||
|
} else {
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getHeader());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = [];
|
||||||
|
let VodShortElements = $($("[class=\"row list-wp\"]")).find("a")
|
||||||
|
for (const vodShortElement of VodShortElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let reElement = $(vodShortElement).find("img")[0]
|
||||||
|
vodShort.vod_id = vodShortElement.attribs["href"]
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(reElement.attribs["data-src"])
|
||||||
|
vodShort.vod_name = reElement.attribs["alt"]
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
getChildren(detail, index) {
|
||||||
|
try {
|
||||||
|
return detail[index].children[0].data;
|
||||||
|
} catch (e) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
const detail = $('div.detail > .meta');
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
vodDetail.vod_pic = this.jsBase + Utils.base64Encode($('div.item-root > img')[0].attribs['data-src'])
|
||||||
|
vodDetail.vod_name = this.getChildren(detail, 0)
|
||||||
|
vodDetail.vod_year = this.getChildren(detail, 1)
|
||||||
|
vodDetail.vod_area = this.getChildren(detail, 3);
|
||||||
|
vodDetail.vod_actor = this.getChildren(detail, 4);
|
||||||
|
|
||||||
|
let id = Utils.getStrByRegex(/<input type="hidden" id="current_id" value="(.*?)"/, $.html())
|
||||||
|
let token = Utils.getStrByRegex(/<input type="hidden" id="e_token" value="(.*?)"/, $.html())
|
||||||
|
let mtype = Utils.getStrByRegex(/<input type="hidden" id="mtype" value="(.*?)"/, $.html())
|
||||||
|
let params = {
|
||||||
|
"videoId": id, "mtype": mtype, "token": get_tks(id, token),
|
||||||
|
}
|
||||||
|
let content = await this.fetch(this.siteUrl + '/api/getResN', params, this.getHeader())
|
||||||
|
|
||||||
|
const list = JSON.parse(content)["data"]["list"];
|
||||||
|
let playlist = {};
|
||||||
|
|
||||||
|
let index = 0
|
||||||
|
let form_list = []
|
||||||
|
for (const l of list) {
|
||||||
|
const flagData = JSON.parse(l["resData"]);
|
||||||
|
for (const f of flagData) {
|
||||||
|
index = index + 1
|
||||||
|
const from = f.flag;
|
||||||
|
const urls = f.url;
|
||||||
|
if (!from || !urls) continue;
|
||||||
|
if (playlist[from]) continue;
|
||||||
|
form_list.push(`线路${index}`)
|
||||||
|
playlist[from] = urls;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = form_list.join('$$$');
|
||||||
|
vodDetail.vod_play_url = _.values(playlist).join('$$$');
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
const items = $('div.media > div.media-left > a');
|
||||||
|
for (const item of items) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
vodShort.vod_id = item.attribs.href
|
||||||
|
vodShort.vod_name = img.attribs.alt
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(img.attribs['data-src'])
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let html = await this.fetch(this.siteUrl + "/category", null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
let classElements = $($($("[class=\"row visible-xs-block visible-sm-block\"]")).find("li")).find("a")
|
||||||
|
for (const classElement of classElements) {
|
||||||
|
this.classes.push({"type_name": $(classElement).text(), "type_id": classElement.attribs["href"]})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const class_dic of this.classes.slice(1, 9)) {
|
||||||
|
let type_id = class_dic["type_id"]
|
||||||
|
if (type_id.indexOf("category") === -1 || type_id.indexOf(",") > -1) {
|
||||||
|
let type_url = type_id.split(",").slice(-1)[0]
|
||||||
|
let html = await this.fetch(this.siteUrl + type_url, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
let containerElement = $("[class=\"row visible-xs-block visible-sm-block\"]")
|
||||||
|
let filterElements = containerElement.find("[class=\"nav nav-pills\"]").find("a")
|
||||||
|
let value_list = []
|
||||||
|
if (type_id.indexOf(",") > -1) {
|
||||||
|
value_list.push({"n": "全部", "v": type_id.split(",")[0]})
|
||||||
|
|
||||||
|
}
|
||||||
|
let extend_dic = {
|
||||||
|
"key": type_id, "name": $(containerElement.find("h5")).text(), "value": value_list
|
||||||
|
}
|
||||||
|
for (const filterElement of filterElements) {
|
||||||
|
value_list.push({"n": $(filterElement).text(), "v": filterElement.attribs["href"]})
|
||||||
|
}
|
||||||
|
if (value_list.length > 0) {
|
||||||
|
this.filterObj[type_id] = [extend_dic]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let categoryUrl = (this.siteUrl + (extend[tid] || tid.split(",")[0]))
|
||||||
|
let update_page = false
|
||||||
|
if (categoryUrl.indexOf("html") > -1) {
|
||||||
|
categoryUrl = categoryUrl.replace('.html', pg > 1 ? `-p-${pg}.html` : '.html');
|
||||||
|
} else {
|
||||||
|
categoryUrl = categoryUrl + `?p=${pg}`
|
||||||
|
update_page = true
|
||||||
|
|
||||||
|
}
|
||||||
|
await this.jadeLog.debug(`分类URL:${categoryUrl}`)
|
||||||
|
let html = await this.fetch(categoryUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
let pageDoc = $('div.page-more > a:contains(下一页)')
|
||||||
|
if (update_page) {
|
||||||
|
this.page = parseInt(pageDoc[0].attribs["href"].split("p=")[1])
|
||||||
|
}
|
||||||
|
const hasMore = pageDoc.length > 0;
|
||||||
|
this.limit = 24
|
||||||
|
this.count = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
this.total = this.limit * this.count
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let html = await this.fetch(this.siteUrl + id, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html);
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
const html = await this.fetch(this.siteUrl + '/search?q=' + wd, null, this.getHeader());
|
||||||
|
if (!_.isEmpty(html)) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
this.playUrl = id
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let spider = new IKanBotSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
317
18/ds/18js/js/jable.js
Normal file
317
18/ds/18js/js/jable.js
Normal file
|
|
@ -0,0 +1,317 @@
|
||||||
|
/*
|
||||||
|
* @File : jable.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/3/4 9:44
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc :
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
class JableTVSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://jable.tv"
|
||||||
|
this.cookie = ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq = null) {
|
||||||
|
if (inReq !== null) {
|
||||||
|
this.jsBase = await js2Proxy(inReq, "img", this.getImgHeaders());
|
||||||
|
} else {
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getImgHeaders());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getImgHeaders(){
|
||||||
|
return {
|
||||||
|
"User-Agent": "PostmanRuntime/7.37.3",
|
||||||
|
"Postman-Token": "c2602692-1a05-4bb0-93cd-270afad97e87",
|
||||||
|
"Host": "assets-cdn.jable.tv",
|
||||||
|
"Proxy": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "Jable"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🔞┃Jable┃🔞"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "jable"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
// let header = super.getHeader()
|
||||||
|
let header = {}
|
||||||
|
header["User-Agent"] = "PostmanRuntime/7.36.3"
|
||||||
|
header["Host"] = "jable.tv"
|
||||||
|
header["Postman-Token"] = "33290483-3c8d-413f-a160-0d3aea9e6f95"
|
||||||
|
return header
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtml(url = this.siteUrl, proxy = false, headers = this.getHeader()) {
|
||||||
|
return super.getHtml(url, true, headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
let navElements = $("[class=\"title-box\"]")
|
||||||
|
let defaultTypeIdElements = $("div.row")
|
||||||
|
for (const navElement of $(defaultTypeIdElements[0]).find("a")) {
|
||||||
|
let type_name = $(navElement).text()
|
||||||
|
let type_id = navElement.attribs.href
|
||||||
|
if (type_id.indexOf(this.siteUrl) > -1) {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, type_id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
navElements = navElements.slice(1, 9)
|
||||||
|
defaultTypeIdElements = defaultTypeIdElements.slice(1, 9)
|
||||||
|
for (let i = 0; i < navElements.length; i++) {
|
||||||
|
let typeId = $(defaultTypeIdElements[i]).find("a")[0].attribs["href"]
|
||||||
|
this.classes.push(this.getTypeDic("标签", typeId));
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getSortFilter($) {
|
||||||
|
let sortElements = $("[class=\"sorting-nav\"]").find("a")
|
||||||
|
let extend_dic = {"name": "排序", "key": "sort", "value": []}
|
||||||
|
for (const sortElement of sortElements) {
|
||||||
|
let typeId = sortElement.attribs["data-parameters"].split("sort_by:")[1]
|
||||||
|
let typeName = $(sortElement).text()
|
||||||
|
extend_dic["value"].push({"n": typeName, "v": typeId})
|
||||||
|
}
|
||||||
|
return extend_dic
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($, index, type_id, type_name) {
|
||||||
|
let extend_list = []
|
||||||
|
if (index < 4) {
|
||||||
|
let extend_dic = {"name": type_name, "key": "type", "value": []}
|
||||||
|
let type_seletc_list = ["div.img-box > a", "[class=\"horizontal-img-box ml-3 mb-3\"] > a", "", "sort"]
|
||||||
|
let type_id_select_list = ["div.absolute-center > h4", "div.detail"]
|
||||||
|
let default$ = await this.getHtml(type_id)
|
||||||
|
for (const element of default$(type_seletc_list[index])) {
|
||||||
|
let typeId = element.attribs["href"]
|
||||||
|
let typeName = $($(element).find(type_id_select_list[index])).text().replaceAll("\t", "").replaceAll("\n", '').replaceAll(" ", "");
|
||||||
|
extend_dic["value"].push({"n": typeName, "v": typeId})
|
||||||
|
}
|
||||||
|
if (extend_dic.value.length > 0) {
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
//排序
|
||||||
|
let sortDetail$ = await this.getHtml(extend_dic["value"][0]["v"])
|
||||||
|
let sort_extend_dic = await this.getSortFilter(sortDetail$)
|
||||||
|
if (sort_extend_dic.value.length > 0) {
|
||||||
|
extend_list.push(sort_extend_dic)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//排序
|
||||||
|
let sort_extend_dic = await this.getSortFilter(default$)
|
||||||
|
if (sort_extend_dic.value.length > 0) {
|
||||||
|
extend_list.push(sort_extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
let defaultTypeIdElements = $("div.row").slice(1, 9)
|
||||||
|
let navElements = $("[class=\"title-box\"]").slice(1, 9)
|
||||||
|
for (let i = 0; i < navElements.length; i++) {
|
||||||
|
let extend_dic = {"name": $($(navElements[i]).find("h2")).text(), "key": "type", "value": []}
|
||||||
|
for (const filterElement of $(defaultTypeIdElements[i]).find("a")) {
|
||||||
|
let filter_type_id = filterElement.attribs.href
|
||||||
|
if (filter_type_id.indexOf(this.siteUrl) > -1) {
|
||||||
|
extend_dic["value"].push({"n": $(filterElement).text(), "v": filter_type_id})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
|
||||||
|
let sortDetail$ = await this.getHtml(type_id)
|
||||||
|
let sort_extend_dic = await this.getSortFilter(sortDetail$)
|
||||||
|
if (sort_extend_dic.value.length > 0) {
|
||||||
|
extend_list.push(sort_extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
let classes = this.classes.slice(1)
|
||||||
|
for (let i = 0; i < classes.length; i++) {
|
||||||
|
let type_name = classes[i].type_name
|
||||||
|
let type_id = classes[i].type_id
|
||||||
|
// if (type_id.indexOf("models") > 1) {
|
||||||
|
// type_id = `https://jable.tv/models/?mode=async&function=get_block&block_id=list_models_models_list&sort_by=total_videos&_=${new Date().getTime()}`
|
||||||
|
// }
|
||||||
|
let extend_list = await this.getFilter($, i, type_id, type_name)
|
||||||
|
if (extend_list.length > 1 && i < 4) {
|
||||||
|
type_id = extend_list[0]["value"][0]["v"]
|
||||||
|
this.classes[i + 1] = this.getTypeDic(type_name, type_id)
|
||||||
|
}
|
||||||
|
this.filterObj[type_id] = extend_list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("div.video-img-box")
|
||||||
|
for (const element of vodElements) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
let vod_pic = $(element).find("img").attr("data-src")
|
||||||
|
if (vod_pic !== undefined) {
|
||||||
|
vodShort.vod_pic = vod_pic
|
||||||
|
// if (this.catOpenStatus) {
|
||||||
|
// vodShort.vod_pic = this.jsBase + Utils.base64Encode(vod_pic)
|
||||||
|
// } else {
|
||||||
|
// vodShort.vod_pic = vod_pic
|
||||||
|
// }
|
||||||
|
let url = $(element).find("a").attr("href");
|
||||||
|
vodShort.vod_id = url.split("/")[4];
|
||||||
|
vodShort.vod_name = url.split("/")[4];
|
||||||
|
let remarks_list = $($(element).find("[class=\"sub-title\"]")).text().split("\n")
|
||||||
|
if (remarks_list.length > 1) {
|
||||||
|
vodShort.vod_remarks = remarks_list[1].replaceAll(" ", "").replaceAll("\t", "")
|
||||||
|
} else {
|
||||||
|
vodShort.vod_remarks = "精选"
|
||||||
|
}
|
||||||
|
if (!_.isEmpty(vodShort.vod_pic) && vodShort.vod_remarks !== "[限時優惠]只需1元即可無限下載") {
|
||||||
|
vod_list.push(vodShort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
let leftElement = $("[class=\"header-left\"]")
|
||||||
|
vodDetail.vod_name = $($(leftElement).find("h4")).text();
|
||||||
|
let vod_pic = Utils.getStrByRegex(/<video poster="(.*?)" id=/, $.html())
|
||||||
|
vodDetail.vod_pic = vod_pic
|
||||||
|
// if (this.catOpenStatus) {
|
||||||
|
// vodDetail.vod_pic = this.jsBase + Utils.base64Encode(vod_pic)
|
||||||
|
// } else {
|
||||||
|
// vodDetail.vod_pic = vod_pic
|
||||||
|
// }
|
||||||
|
vodDetail.vod_year = $($("[class=\"inactive-color\"]")).text()
|
||||||
|
let episodeName = $($("[class=\"header-right d-none d-md-block\"] > h6")).text().replaceAll("\n", "").replaceAll("●", "")
|
||||||
|
let vodItems = []
|
||||||
|
let episodeUrl = Utils.getStrByRegex(/var hlsUrl = '(.*?)';/, $.html())
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
let vod_play_list = []
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
let vod_play_from_list = ["Jable"]
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml(this.siteUrl)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + "/videos/" + id + "/")
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let extend_type = extend["type"] ?? tid
|
||||||
|
let sort_by = extend["sort"] ?? "video_viewed"
|
||||||
|
this.limit = 24
|
||||||
|
let cateUrl;
|
||||||
|
this.total = 0
|
||||||
|
this.count = 0
|
||||||
|
if (tid.indexOf("latest-updates") > 1) {
|
||||||
|
cateUrl = `https://jable.tv/latest-updates/?mode=async&function=get_block&block_id=list_videos_latest_videos_list&sort_by=post_date&from=${pg}&_=1709730132217`
|
||||||
|
} else {
|
||||||
|
cateUrl = extend_type + `/${pg}/?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=${sort_by}&_=${new Date().getTime()}`
|
||||||
|
}
|
||||||
|
let $ = await this.getHtml(cateUrl);
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
let page = $($("[class=\"page-item\"]").slice(-1)[0]).text()
|
||||||
|
if (page.indexOf("最後") > -1) {
|
||||||
|
} else {
|
||||||
|
if (parseInt(page) === this.page || _.isEmpty(page)) {
|
||||||
|
await this.jadeLog.debug("分类页面到底了")
|
||||||
|
this.total = this.page
|
||||||
|
this.count = this.page
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let searchUrl = this.siteUrl + `/search/${wd}/`
|
||||||
|
let $ = await this.getHtml(searchUrl)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new JableTVSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export {spider}
|
||||||
295
18/ds/18js/js/jiafeimao.js
Normal file
295
18/ds/18js/js/jiafeimao.js
Normal file
|
|
@ -0,0 +1,295 @@
|
||||||
|
/*
|
||||||
|
* @File : jiafeimao.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/24 9:15
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 加菲猫 (已失效)
|
||||||
|
*/
|
||||||
|
import {_, load} from '../lib/cat.js';
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js"
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
|
||||||
|
class JiaFeiMaoSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://jfmys.app"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "加菲猫"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return `🐈┃加菲猫┃🐈`
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "jiafeimao"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getPic(url){
|
||||||
|
if (url.indexOf("http:") > -1 || url.indexOf("https:") > -1){
|
||||||
|
return url
|
||||||
|
}else{
|
||||||
|
return this.siteUrl + url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parseVodShortFromElement($, element) {
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = Utils.getStrByRegex(/id\/(.*?)\//,$(element).find("a")[0].attribs.href)
|
||||||
|
vodShort.vod_name = $(element).find("a")[0].attribs.title
|
||||||
|
vodShort.vod_pic = this.getPic($(element).find("img")[0].attribs["data-src"])
|
||||||
|
vodShort.vod_remarks = $($(element).find("[class=\"v-tips\"]")).html()
|
||||||
|
return vodShort
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $(".icon > .container").find("[class=\"imain clearfix\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocByCategory($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"tv-list clearfix\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let vodShort = this.parseVodShortFromElement($, vodElement)
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = $($("[class=\"iptit\"]").find("h3")).html().split(" ")[0]
|
||||||
|
vodDetail.vod_content = $($("[class=\"idetail container\"]").find("[class=\"infor_intro\"]")).text()
|
||||||
|
let vodPlayElements = $("[class=\"fjcon\"]")
|
||||||
|
let vod_play_from_list = []
|
||||||
|
let vod_play_list = []
|
||||||
|
let playFormatElemets = $($(vodPlayElements).find("[class=\"fjtop clearfix\"]")).find("a")
|
||||||
|
let playUrlElements = $(vodPlayElements).find("[class=\"xjn_ul play-list\"]")
|
||||||
|
for (let i = 0; i < playFormatElemets.length; i++) {
|
||||||
|
let playFormatElement = playFormatElemets[i]
|
||||||
|
vod_play_from_list.push("线路" +( i+1).toString())
|
||||||
|
let vodItems = []
|
||||||
|
for (const playUrlElement of $(playUrlElements[i]).find("a")) {
|
||||||
|
let episodeName = $(playUrlElement).text()
|
||||||
|
let episodeUrl = playUrlElement.attribs.href
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl)
|
||||||
|
}
|
||||||
|
vod_play_list.push(vodItems.join("#"))
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from_list.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_play_list.join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
parseVodDetail(vod_data) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
vodDetail.vod_name = vod_data["vod_name"]
|
||||||
|
vodDetail.vod_pic = this.getPic(vod_data["vod_pic"])
|
||||||
|
vodDetail.vod_remarks = vod_data["vod_remarks"]
|
||||||
|
vodDetail.vod_area = vod_data["vod_area"]
|
||||||
|
vodDetail.vod_year = vod_data["vod_year"]
|
||||||
|
vodDetail.vod_actor = vod_data["vod_actor"]
|
||||||
|
vodDetail.vod_director = vod_data["vod_director"]
|
||||||
|
vodDetail.vod_content = vod_data["vod_content"].replaceAll("<p>","").replaceAll("</p>","")
|
||||||
|
let vod_play_from = []
|
||||||
|
for (let i = 0; i < vod_data["vod_play_from"].split("$$$").length; i++) {
|
||||||
|
vod_play_from.push("线路"+(i+1).toString())
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_from = vod_play_from.join("$$$")
|
||||||
|
vodDetail.vod_play_url = vod_data["vod_play_url"]
|
||||||
|
vodDetail.type_name = vod_data["type_name"]
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj) {
|
||||||
|
let vodDetail;
|
||||||
|
let vod_data_list = obj["list"]
|
||||||
|
if (vod_data_list.length > 0) {
|
||||||
|
let vod_data = vod_data_list[0]
|
||||||
|
vodDetail = this.parseVodDetail(vod_data)
|
||||||
|
}
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"tv-bd search-list\"]").find("[class=\"item clearfix\"]")
|
||||||
|
for (const vodElement of vodElements){
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = Utils.getStrByRegex(/id\/(.*?).html/, $($(vodElement).find("[class=\"s_tit\"]")).find("a")[0].attribs.href)
|
||||||
|
vodShort.vod_name = $($($(vodElement).find("[class=\"s_tit\"]")).find("a")).text()
|
||||||
|
vodShort.vod_pic = this.getPic($(vodElement).find("img")[0].attribs.src)
|
||||||
|
vodShort.vod_remarks = $($(vodElement).find("[class=\"s_score\"]")).text()
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
let content = $($("[class=\"container\"]").find("script")).html()
|
||||||
|
let navContent = Utils.getStrByRegex(/document.write\('(.*?);/, content)
|
||||||
|
for (const navElement of $(navContent).find("a")) {
|
||||||
|
let type_id = navElement.attribs["href"]
|
||||||
|
let type_name = $(navElement).text()
|
||||||
|
if (type_id !== "/" && type_name !== "专题" && type_name !== "站长模板") {
|
||||||
|
this.classes.push(this.getTypeDic(type_name, Utils.getStrByRegex(/id\/(.*?).html/, type_id)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let elements = $($("[class=\"container\"]").find("[class=\"select_list clearfix\"]")).find("li")
|
||||||
|
let extend_list = []
|
||||||
|
let key_value_dic = {
|
||||||
|
"分类": /id\/(.*?).html/,
|
||||||
|
"地区": /area\/(.*?)\//,
|
||||||
|
"年份": /year\/(.*?).html/,
|
||||||
|
"字母": /letter\/(.*?).html/,
|
||||||
|
"排序": /by\/(.*?)\//,
|
||||||
|
}
|
||||||
|
for (let i = 0; i < elements.length; i++) {
|
||||||
|
let element = elements[i]
|
||||||
|
let name = $($($(element).find("[class=\"v-tit\"]"))).text().replaceAll(":", "")
|
||||||
|
if (name !== "频道") {
|
||||||
|
let extend_dic = {"key": (i + 1).toString(), "name": name, "value": []}
|
||||||
|
for (const ele of $(element).find("a")) {
|
||||||
|
let type_id = Utils.getStrByRegex(key_value_dic[name], ele.attribs.href)
|
||||||
|
if (_.isEmpty(type_id)) {
|
||||||
|
type_id = "/"
|
||||||
|
}
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v": decodeURIComponent(type_id)})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let sortElments = $("[class=\"v-hd clearfix\"]")
|
||||||
|
let extend_dic = {"key": (elements.length + 1).toString(), "name": "排序", "value": []}
|
||||||
|
extend_dic["value"].push({"n": "全部", "v": "/"})
|
||||||
|
for (const ele of $(sortElments).find("a")) {
|
||||||
|
let type_id = Utils.getStrByRegex(key_value_dic["排序"], ele.attribs.href)
|
||||||
|
if (_.isEmpty(type_id)) {
|
||||||
|
type_id = "/"
|
||||||
|
}
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v": type_id})
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const class_dic of this.classes) {
|
||||||
|
let type_id = class_dic["type_id"]
|
||||||
|
if (type_id !== "最近更新") {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + `/index.php/vod/show/id/${type_id}.html`)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let $ = await this.getHtml()
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
|
||||||
|
getExtend(extend, key, value) {
|
||||||
|
if (extend[key] !== undefined && extend[key] !== "/") {
|
||||||
|
return value + "/" + extend[key] + "/"
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let area = this.getExtend(extend, "3", "area")
|
||||||
|
let sort = this.getExtend(extend, "6", "by")
|
||||||
|
let id = this.getExtend(extend, "2", "id")
|
||||||
|
let letter = this.getExtend(extend, "5", "letter")
|
||||||
|
let year = this.getExtend(extend, "4", "year")
|
||||||
|
if (_.isEmpty(id)) {
|
||||||
|
id = "id/" + tid + "/"
|
||||||
|
}
|
||||||
|
let url = this.siteUrl + `/index.php/vod/show/${area}${sort}${id}${letter}${year}page/${pg}.html`
|
||||||
|
let $ = await this.getHtml(url)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocByCategory($)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let content = await this.fetch(this.siteUrl + "/api.php/provide/vod", {
|
||||||
|
"ac": "detail", "ids": id
|
||||||
|
}, this.getHeader())
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(JSON.parse(content))
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let $ = await this.getHtml(this.siteUrl + "/index.php/vod/search.html?wd="+wd)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new JiaFeiMaoSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
proxy: proxy
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
491
18/ds/18js/js/jianpian.js
Normal file
491
18/ds/18js/js/jianpian.js
Normal file
|
|
@ -0,0 +1,491 @@
|
||||||
|
/*
|
||||||
|
* @File : jianpian.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/15 10:32
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 完成荐片所有功能(添加弹幕)
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {_, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
|
||||||
|
class JianPianSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "http://api2.rinhome.com"
|
||||||
|
// this.siteUrl = "https://ownjpykxttjzuhy.jiesiwa.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🌼┃荐片┃🌼"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "荐片"
|
||||||
|
}
|
||||||
|
|
||||||
|
getJSName() {
|
||||||
|
return "jianpian"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader() {
|
||||||
|
return {
|
||||||
|
"User-Agent": "jianpian-android/360",
|
||||||
|
"JPAUTH": "y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv",
|
||||||
|
"Referer": "www.jianpianapp.com"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async spiderInit(inReq=null) {
|
||||||
|
if (inReq !== null){
|
||||||
|
this.jsBase = await js2Proxy(inReq,"img",this.getHeader());
|
||||||
|
}else{
|
||||||
|
this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getHeader());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(cfg) {
|
||||||
|
await super.init(cfg);
|
||||||
|
this.danmuStaus = true
|
||||||
|
await this.spiderInit(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodShortListFromJson(data_list) {
|
||||||
|
let vod_list = [];
|
||||||
|
for (const data of data_list) {
|
||||||
|
let vodShort = new VodShort();
|
||||||
|
vodShort.vod_id = data["id"]
|
||||||
|
if (data["path"] !== undefined) {
|
||||||
|
if (!this.catOpenStatus) {
|
||||||
|
vodShort.vod_pic = data["path"] + "@Referer=www.jianpianapp.com@User-Agent=jianpian-version353@JPAUTH=y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv"
|
||||||
|
} else {
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(data["path"])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!this.catOpenStatus) {
|
||||||
|
vodShort.vod_pic = data["thumbnail"] + "@Referer=www.jianpianapp.com@User-Agent=jianpian-version353@JPAUTH=y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiE"
|
||||||
|
|
||||||
|
} else {
|
||||||
|
vodShort.vod_pic = this.jsBase + Utils.base64Encode(data["thumbnail"])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodShort.vod_name = data["title"]
|
||||||
|
if (this.catOpenStatus) {
|
||||||
|
vodShort.vod_remarks = `评分:${data["score"]}`
|
||||||
|
} else {
|
||||||
|
if (data["playlist"] !== undefined) {
|
||||||
|
vodShort.vod_remarks = `评分:${data["score"]}` + " " + data["playlist"]["title"]
|
||||||
|
} else {
|
||||||
|
vodShort.vod_remarks = `评分:${data["score"]}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
objToList(list, key, split_value = "*") {
|
||||||
|
let value_list = []
|
||||||
|
for (const dic of list) {
|
||||||
|
value_list.push(dic[key])
|
||||||
|
}
|
||||||
|
return value_list.join(split_value)
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailfromJson(obj) {
|
||||||
|
let vodDetail = new VodDetail();
|
||||||
|
vodDetail.vod_id = obj["id"]
|
||||||
|
vodDetail.vod_year = obj["year"]["title"]
|
||||||
|
vodDetail.vod_pic = this.jsBase + Utils.base64Encode(obj["thumbnail"])
|
||||||
|
vodDetail.type_name = obj["category"][0]["title"]
|
||||||
|
vodDetail.vod_name = obj["title"]
|
||||||
|
vodDetail.vod_content = obj["description"]
|
||||||
|
vodDetail.vod_area = obj["area"]["title"]
|
||||||
|
vodDetail.vod_director = this.objToList(obj["directors"], "name")
|
||||||
|
vodDetail.vod_actor = this.objToList(obj["actors"], "name")
|
||||||
|
vodDetail.vod_remarks = "评分:" + obj["score"]
|
||||||
|
let playKeyList = [{"btbo_downlist": "btbo"}, {"xunlei_downlist": "迅雷"}, {"m3u8_downlist": "m3u8"}, {"new_ftp_list": "new_ftp"}, {"new_m3u8_list": "new_m3u8"}]
|
||||||
|
let playlist = {}
|
||||||
|
let urlList = []
|
||||||
|
for (const dic of playKeyList) {
|
||||||
|
let key = Object.keys(dic)[0]
|
||||||
|
let value = Object.values(dic)[0]
|
||||||
|
if (obj[key].length > 0) {
|
||||||
|
let url_str_list = []
|
||||||
|
for (const dic of obj[key]) {
|
||||||
|
url_str_list.push(dic["title"] + "$" + dic["url"])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (urlList.indexOf(url_str_list.join("#")) === -1) {
|
||||||
|
urlList.push(url_str_list.join("#"))
|
||||||
|
playlist[value] = url_str_list.join("#")
|
||||||
|
} else {
|
||||||
|
await this.jadeLog.warning(`key为:${key},播放链接重复,无需保存`)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vodDetail.vod_play_url = _.values(playlist).join('$$$');
|
||||||
|
vodDetail.vod_play_from = _.keys(playlist).join('$$$');
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let type_name_list = ["全部", "电影", "电视剧", "动漫", "综艺"]
|
||||||
|
let type_id_list = ["0", "1", "2", "3", "4"]
|
||||||
|
for (let i = 0; i < type_name_list.length; i++) {
|
||||||
|
let type_name = type_name_list[i]
|
||||||
|
let type_id = type_id_list[i]
|
||||||
|
this.classes.push({"type_name": type_name, "type_id": type_id})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
this.filterObj = {
|
||||||
|
"0": [{
|
||||||
|
"key": "area", "name": "地區", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "国产", "v": "1"
|
||||||
|
}, {
|
||||||
|
"n": "中国香港", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "中国台湾", "v": "6"
|
||||||
|
}, {
|
||||||
|
"n": "美国", "v": "5"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "18"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "2"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "year", "name": "年份", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "2024", "v": "119"
|
||||||
|
}, {
|
||||||
|
"n": "2023", "v": "153"
|
||||||
|
}, {
|
||||||
|
"n": "2022", "v": "101"
|
||||||
|
}, {
|
||||||
|
"n": "2021", "v": "118"
|
||||||
|
}, {
|
||||||
|
"n": "2020", "v": "16"
|
||||||
|
}, {
|
||||||
|
"n": "2019", "v": "7"
|
||||||
|
}, {
|
||||||
|
"n": "2018", "v": "2"
|
||||||
|
}, {
|
||||||
|
"n": "2017", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "2016", "v": "22"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "by", "name": "排序", "value": [{
|
||||||
|
"n": "热门", "v": "hot"
|
||||||
|
}, {
|
||||||
|
"n": "更新", "v": "updata"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rating"
|
||||||
|
}]
|
||||||
|
}], "1": [{
|
||||||
|
"key": "area", "name": "地區", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "国产", "v": "1"
|
||||||
|
}, {
|
||||||
|
"n": "中国香港", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "中国台湾", "v": "6"
|
||||||
|
}, {
|
||||||
|
"n": "美国", "v": "5"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "18"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "2"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "year", "name": "年份", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "2024", "v": "119"
|
||||||
|
}, {
|
||||||
|
"n": "2023", "v": "153"
|
||||||
|
}, {
|
||||||
|
"n": "2022", "v": "101"
|
||||||
|
}, {
|
||||||
|
"n": "2021", "v": "118"
|
||||||
|
}, {
|
||||||
|
"n": "2020", "v": "16"
|
||||||
|
}, {
|
||||||
|
"n": "2019", "v": "7"
|
||||||
|
}, {
|
||||||
|
"n": "2018", "v": "2"
|
||||||
|
}, {
|
||||||
|
"n": "2017", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "2016", "v": "22"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "by", "name": "排序", "value": [{
|
||||||
|
"n": "热门", "v": "hot"
|
||||||
|
}, {
|
||||||
|
"n": "更新", "v": "updata"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rating"
|
||||||
|
}]
|
||||||
|
}], "2": [{
|
||||||
|
"key": "area", "name": "地區", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "国产", "v": "1"
|
||||||
|
}, {
|
||||||
|
"n": "中国香港", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "中国台湾", "v": "6"
|
||||||
|
}, {
|
||||||
|
"n": "美国", "v": "5"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "18"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "2"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "year", "name": "年份", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "2024", "v": "119"
|
||||||
|
}, {
|
||||||
|
"n": "2023", "v": "153"
|
||||||
|
}, {
|
||||||
|
"n": "2022", "v": "101"
|
||||||
|
}, {
|
||||||
|
"n": "2021", "v": "118"
|
||||||
|
}, {
|
||||||
|
"n": "2020", "v": "16"
|
||||||
|
}, {
|
||||||
|
"n": "2019", "v": "7"
|
||||||
|
}, {
|
||||||
|
"n": "2018", "v": "2"
|
||||||
|
}, {
|
||||||
|
"n": "2017", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "2016", "v": "22"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "by", "name": "排序", "value": [{
|
||||||
|
"n": "热门", "v": "hot"
|
||||||
|
}, {
|
||||||
|
"n": "更新", "v": "updata"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rating"
|
||||||
|
}]
|
||||||
|
}], "3": [{
|
||||||
|
"key": "area", "name": "地區", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "国产", "v": "1"
|
||||||
|
}, {
|
||||||
|
"n": "中国香港", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "中国台湾", "v": "6"
|
||||||
|
}, {
|
||||||
|
"n": "美国", "v": "5"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "18"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "2"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "year", "name": "年份", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "2024", "v": "119"
|
||||||
|
}, {
|
||||||
|
"n": "2023", "v": "153"
|
||||||
|
}, {
|
||||||
|
"n": "2022", "v": "101"
|
||||||
|
}, {
|
||||||
|
"n": "2021", "v": "118"
|
||||||
|
}, {
|
||||||
|
"n": "2020", "v": "16"
|
||||||
|
}, {
|
||||||
|
"n": "2019", "v": "7"
|
||||||
|
}, {
|
||||||
|
"n": "2018", "v": "2"
|
||||||
|
}, {
|
||||||
|
"n": "2017", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "2016", "v": "22"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "by", "name": "排序", "value": [{
|
||||||
|
"n": "热门", "v": "hot"
|
||||||
|
}, {
|
||||||
|
"n": "更新", "v": "updata"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rating"
|
||||||
|
}]
|
||||||
|
}], "4": [{
|
||||||
|
"key": "area", "name": "地區", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "国产", "v": "1"
|
||||||
|
}, {
|
||||||
|
"n": "中国香港", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "中国台湾", "v": "6"
|
||||||
|
}, {
|
||||||
|
"n": "美国", "v": "5"
|
||||||
|
}, {
|
||||||
|
"n": "韩国", "v": "18"
|
||||||
|
}, {
|
||||||
|
"n": "日本", "v": "2"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "year", "name": "年份", "value": [{
|
||||||
|
"n": "全部", "v": "0"
|
||||||
|
}, {
|
||||||
|
"n": "2024", "v": "119"
|
||||||
|
}, {
|
||||||
|
"n": "2023", "v": "153"
|
||||||
|
}, {
|
||||||
|
"n": "2022", "v": "101"
|
||||||
|
}, {
|
||||||
|
"n": "2021", "v": "118"
|
||||||
|
}, {
|
||||||
|
"n": "2020", "v": "16"
|
||||||
|
}, {
|
||||||
|
"n": "2019", "v": "7"
|
||||||
|
}, {
|
||||||
|
"n": "2018", "v": "2"
|
||||||
|
}, {
|
||||||
|
"n": "2017", "v": "3"
|
||||||
|
}, {
|
||||||
|
"n": "2016", "v": "22"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"key": "by", "name": "排序", "value": [{
|
||||||
|
"n": "热门", "v": "hot"
|
||||||
|
}, {
|
||||||
|
"n": "更新", "v": "updata"
|
||||||
|
}, {
|
||||||
|
"n": "评分", "v": "rating"
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let content = await this.fetch(this.siteUrl + "/api/tag/hand?code=unknown601193cf375db73d&channel=wandoujia", null, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let data_list = content_json["data"][0]["video"]
|
||||||
|
this.homeVodList = await this.parseVodShortListFromJson(data_list)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let cateId = extend["cateId"] ?? tid
|
||||||
|
let area = extend["area"] ?? "0";
|
||||||
|
let year = extend["year"] ?? "0";
|
||||||
|
let by = extend["by"] ?? "hot";
|
||||||
|
this.limit = 24
|
||||||
|
let categoryUrl = this.siteUrl + `/api/crumb/list?area=${area}&category_id=${cateId}&page=${pg}&type=0&limit=24&sort=${by}&year=${year}`
|
||||||
|
await this.jadeLog.debug(`分类URL:${categoryUrl}`)
|
||||||
|
let content = await this.fetch(categoryUrl, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let data = content_json["data"]
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let url = this.siteUrl + "/api/node/detail?channel=wandoujia&token=&id=" + id;
|
||||||
|
let content = await this.fetch(url, null, this.getHeader())
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content);
|
||||||
|
let data_list = content_json["data"]
|
||||||
|
this.vodDetail = await this.parseVodDetailfromJson(data_list)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let url = this.siteUrl + "/api/video/search?page=1" + "&key=" + wd;
|
||||||
|
const content = await this.fetch(url, null, this.getHeader());
|
||||||
|
if (!_.isEmpty(content)) {
|
||||||
|
let content_json = JSON.parse(content)
|
||||||
|
let data_list = content_json["data"]
|
||||||
|
this.vodList = await this.parseVodShortListFromJson(data_list)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
await this.jadeLog.debug(`播放链接为:${id}`)
|
||||||
|
this.playUrl = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let spider = new JianPianSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
return await spider.proxy(segments, headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
281
18/ds/18js/js/jiujiuliu.js
Normal file
281
18/ds/18js/js/jiujiuliu.js
Normal file
|
|
@ -0,0 +1,281 @@
|
||||||
|
/*
|
||||||
|
* @File : jiujiuliu.js
|
||||||
|
* @Author : jade
|
||||||
|
* @Date : 2024/1/4 14:15
|
||||||
|
* @Email : jadehh@1ive.com
|
||||||
|
* @Software : Samples
|
||||||
|
* @Desc : 996影视
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Spider} from "./spider.js";
|
||||||
|
import {_, Crypto, load} from "../lib/cat.js";
|
||||||
|
import {VodDetail, VodShort} from "../lib/vod.js";
|
||||||
|
import * as Utils from "../lib/utils.js";
|
||||||
|
|
||||||
|
class JiuJiuLiuSpider extends Spider {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.siteUrl = "https://www.cs1369.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
getName() {
|
||||||
|
return "🥃┃九九六影视┃🥃"
|
||||||
|
}
|
||||||
|
|
||||||
|
getAppName() {
|
||||||
|
return "九九六影视"
|
||||||
|
}
|
||||||
|
getJSName() {
|
||||||
|
return "jiujiuliu"
|
||||||
|
}
|
||||||
|
|
||||||
|
getType() {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodShortListFromDoc($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"stui-vodlist clearfix\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let resource = $(vodElement).find("[class=\"stui-vodlist__thumb lazyload\"]")[0]
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = resource.attribs["href"]
|
||||||
|
vodShort.vod_name = resource.attribs["title"]
|
||||||
|
vodShort.vod_pic = resource.attribs["data-original"]
|
||||||
|
vodShort.vod_remarks = $($(resource).find("[class=\"pic-text text-right\"]")[0]).text()
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async parseVodShortListFromDocBySearch($) {
|
||||||
|
let vod_list = []
|
||||||
|
let vodElements = $("[class=\"stui-pannel_bd\"]").find("li")
|
||||||
|
for (const vodElement of vodElements) {
|
||||||
|
let resource = $($(vodElement).find("[class=\"thumb\"]")[0]).find("a")[0]
|
||||||
|
let vodShort = new VodShort()
|
||||||
|
vodShort.vod_id = resource.attribs["href"]
|
||||||
|
vodShort.vod_name = resource.attribs["title"]
|
||||||
|
vodShort.vod_pic = resource.attribs["data-original"]
|
||||||
|
vodShort.vod_remarks = Utils.getStrByRegex(/类型:(.*?)地区/, $($(vodElement).find("[class=\"hidden-mi\"]")[0]).text())
|
||||||
|
vod_list.push(vodShort)
|
||||||
|
}
|
||||||
|
return vod_list
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async parseVodDetailFromDoc($) {
|
||||||
|
let vodDetail = new VodDetail()
|
||||||
|
let vodElement = $("[class=\"col-pd clearfix\"]")[1]
|
||||||
|
let vodShortElement = $(vodElement).find("[class=\"stui-content__thumb\"]")[0]
|
||||||
|
let vodItems = []
|
||||||
|
for (const playElement of $("[class=\"stui-content__playlist clearfix\"]").find("a")) {
|
||||||
|
let episodeUrl = this.siteUrl + playElement.attribs["href"];
|
||||||
|
let episodeName = $(playElement).text();
|
||||||
|
vodItems.push(episodeName + "$" + episodeUrl);
|
||||||
|
}
|
||||||
|
vodDetail.vod_name = $(vodShortElement).find("[class=\"stui-vodlist__thumb picture v-thumb\"]")[0].attribs["title"]
|
||||||
|
vodDetail.vod_pic = $(vodShortElement).find("img")[0].attribs["data-original"]
|
||||||
|
vodDetail.vod_remarks = $($(vodShortElement).find("[class=\"pic-text text-right\"]")[0]).text()
|
||||||
|
let data_str = $($(vodElement).find("[class=\"data\"]")).text().replaceAll(" ", " ")
|
||||||
|
vodDetail.type_name = Utils.getStrByRegex(/类型:(.*?) /, data_str)
|
||||||
|
vodDetail.vod_area = Utils.getStrByRegex(/地区:(.*?) /, data_str)
|
||||||
|
vodDetail.vod_year = Utils.getStrByRegex(/年份:(.*?) /, data_str)
|
||||||
|
vodDetail.vod_actor = Utils.getStrByRegex(/主演:(.*?) /, data_str)
|
||||||
|
vodDetail.vod_director = Utils.getStrByRegex(/导演:(.*?) /, data_str)
|
||||||
|
vodDetail.vod_content = $($("[class=\"stui-pannel_bd\"]").find("[class=\"col-pd\"]")).text()
|
||||||
|
vodDetail.vod_play_from = ["996"].join("$$$")
|
||||||
|
vodDetail.vod_play_url = [vodItems.join("#")].join("$$$")
|
||||||
|
return vodDetail
|
||||||
|
}
|
||||||
|
|
||||||
|
async setClasses() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (html !== null) {
|
||||||
|
let $ = load(html)
|
||||||
|
let menuElements = $("[class=\"stui-header__menu type-slide\"]").find("a")
|
||||||
|
for (const menuElement of menuElements) {
|
||||||
|
let type_dic = {
|
||||||
|
"type_name": $(menuElement).text(),
|
||||||
|
"type_id": "/show/id/" + menuElement.attribs["href"].split("/").slice(-1)[0].split(".")[0]
|
||||||
|
}
|
||||||
|
if ($(menuElement).text() !== "首页") {
|
||||||
|
this.classes.push(type_dic)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFilter($) {
|
||||||
|
let hdElements = $("[class=\"stui-pannel_hd\"]")
|
||||||
|
let extend_list = []
|
||||||
|
let index = 0
|
||||||
|
for (let i = 0; i < 2; i++) {
|
||||||
|
let cateElemet = hdElements[i]
|
||||||
|
let typeElements = $(cateElemet).find("ul")
|
||||||
|
if (i === 0) {
|
||||||
|
for (const typeElement of typeElements) {
|
||||||
|
let extend_dic = {
|
||||||
|
"key": (index + 1).toString(), "name": $($(typeElement).find("li")[0]).text(), "value": []
|
||||||
|
}
|
||||||
|
for (const ele of $(typeElement).find("li").slice(1)) {
|
||||||
|
if (!_.isEmpty($(ele).text())) {
|
||||||
|
if (index === 0) {
|
||||||
|
extend_dic["value"].push({
|
||||||
|
"n": $(ele).text(),
|
||||||
|
"v": $(ele).find("a")[0].attribs["href"].split("/").slice(-1)[0].split(".")[0]
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
extend_dic["value"].push({"n": $(ele).text(), "v": $(ele).text()})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
index = index + 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let extend_dic = {
|
||||||
|
"key": (index + 1).toString(), "name": $($(cateElemet).find("li")[0]).text(), "value": []
|
||||||
|
}
|
||||||
|
extend_dic["value"].push({"n": "全部", "v": "time"})
|
||||||
|
for (const ele of $(cateElemet).find("li").slice(1)) {
|
||||||
|
if (!_.isEmpty($(ele).text())) {
|
||||||
|
extend_dic["value"].push({
|
||||||
|
"n": $(ele).text(), "v": $(ele).find("a")[0].attribs["href"].split("/")[3]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extend_list.push(extend_dic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return extend_list
|
||||||
|
}
|
||||||
|
|
||||||
|
async setFilterObj() {
|
||||||
|
for (const type_dic of this.classes) {
|
||||||
|
let type_id = type_dic["type_id"]
|
||||||
|
if (type_id !== "/" && type_id !== "最近更新") {
|
||||||
|
let url = this.siteUrl + type_id + ".html"
|
||||||
|
let html = await this.fetch(url, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.filterObj[type_id] = await this.getFilter($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHomeVod() {
|
||||||
|
let html = await this.fetch(this.siteUrl, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.homeVodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getParams(params, value) {
|
||||||
|
let x = value ?? "全部"
|
||||||
|
if (x === "全部" || x === undefined) {
|
||||||
|
return ""
|
||||||
|
} else {
|
||||||
|
return params + value
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setCategory(tid, pg, filter, extend) {
|
||||||
|
let typeName = this.getParams("/id/", extend["1"])
|
||||||
|
if (_.isEmpty(typeName)) {
|
||||||
|
typeName = "/id/" + tid.split("/").slice(-1)[0]
|
||||||
|
}
|
||||||
|
let plot = this.getParams("/class/", extend["2"])
|
||||||
|
let area = this.getParams("/area/", extend["3"])
|
||||||
|
let year = this.getParams("/year/", extend["4"])
|
||||||
|
let language = this.getParams("/lang/ ", extend["5"])
|
||||||
|
let letter = this.getParams("/letter/ ", extend["6"])
|
||||||
|
let time = this.getParams("/by/", extend["7"])
|
||||||
|
let cateUrl = this.siteUrl + `/show${area}${time}${plot}${typeName}${language}${letter}${year}/page/${pg.toString()}.html`
|
||||||
|
await this.jadeLog.info(`类别URL为:${cateUrl}`)
|
||||||
|
this.limit = 36
|
||||||
|
let html = await this.fetch(cateUrl, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setDetail(id) {
|
||||||
|
let detailUrl = this.siteUrl + id
|
||||||
|
let html = await this.fetch(detailUrl, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodDetail = await this.parseVodDetailFromDoc($)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setSearch(wd, quick) {
|
||||||
|
let searchUrl = this.siteUrl + `/search.html?wd=${wd}`
|
||||||
|
let html = await this.fetch(searchUrl, null, this.getHeader())
|
||||||
|
if (html != null) {
|
||||||
|
let $ = load(html)
|
||||||
|
this.vodList = await this.parseVodShortListFromDocBySearch($)
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async setPlay(flag, id, flags) {
|
||||||
|
let html = await this.fetch(id, null, this.getHeader())
|
||||||
|
if (html !== null) {
|
||||||
|
let matcher = Utils.getStrByRegex(/player_aaaa=(.*?)<\/script>/, html)
|
||||||
|
let player = JSON.parse(matcher);
|
||||||
|
try {
|
||||||
|
this.playUrl = decodeURIComponent(Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(player["url"])))
|
||||||
|
this.header = this.getHeader()
|
||||||
|
} catch (e) {
|
||||||
|
this.playUrl = player["url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let spider = new JiuJiuLiuSpider()
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
await spider.init(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return await spider.home(filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return await spider.homeVod()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
return await spider.category(tid, pg, filter, extend)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
return await spider.detail(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return await spider.play(flag, id, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick) {
|
||||||
|
return await spider.search(wd, quick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export {spider}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user