├── .gitignore
├── .idea
├── .gitignore
├── hikerViewRules.iml
├── misc.xml
├── modules.xml
└── vcs.xml
├── COLLECTION
├── assets.js
├── gcores.js
├── gods_plan.js
└── nga
│ ├── bbcode2Html.js
│ └── nga.js
├── COMIC
├── hentai-one.js
├── maofly.js
├── mh3618.js
└── picacg.js
├── GHS
├── 3dhentai.js
├── 7719.js
├── JavTree.js
├── JavWan.js
├── MissAV.js
├── eporner.js
├── eroticmovies.xyz.js
├── hxc.js
├── jable.js
├── ohentai.js
├── pornhub.js
├── shuiguopai.js
├── spankbang.js
└── yande.re.js
├── God_Plan.js
├── HOME
└── index.html
├── IMAGE
├── ChilloutMix.js
├── Hentai Cosplay.js
├── artstation.js
├── cos.js
├── huashi6.js
├── iconfont.js
└── zcool.js
├── LIVE
├── 17live.js
├── 95_xiu.js
├── AfreecaTV.js
├── collection
│ ├── index.js
│ └── pages
│ │ └── douyu.js
├── douyu.js
├── douyu_danmu.js
├── huya.js
├── qie_egame.js
├── qie_sport.js
└── twitch.js
├── README.md
├── TEST
├── acfun-bangumilist.js
├── new-homepage.js
├── x5.js
└── youtube.js
├── TEXT
└── juejin.js
├── TOOL
├── aktools.js
├── bailan_paste.js
├── baota.js
├── bt.js
├── cloud-music.js
├── naraka_score.js
├── prts.js
├── ys_map.js
└── zczc.js
├── VIDEO
├── 400.js
├── 4kvm.js
├── 555dy.js
├── OneList.js
├── buosn.js
├── douyin
│ ├── douyin_web.js
│ └── signature.js
├── douyin_slide.js
├── douyin_web.js
├── ednovas.js
├── histar.js
├── simple_douyin_web.js
├── xiletv.js
└── youtube.js
├── assets
├── icons
│ ├── list.png
│ ├── ps4.svg
│ ├── search.png
│ ├── setting.png
│ ├── sort-ascending.png
│ ├── sort-descending.png
│ ├── steam.svg
│ ├── switch.svg
│ ├── turn.png
│ ├── xboxone.svg
│ ├── 专题.svg
│ ├── 关注.svg
│ ├── 播单.svg
│ ├── 收藏.svg
│ ├── 文章.svg
│ ├── 游戏.svg
│ ├── 电台.svg
│ ├── 视频.svg
│ ├── 设置.svg
│ └── 资讯.svg
└── images
│ ├── 4k.png
│ ├── avatar-r.png
│ ├── avatar.jpg
│ ├── chuzhan.png
│ ├── douyin.jpg
│ ├── douyu.png
│ ├── github.svg
│ ├── huya.png
│ ├── juejin.png
│ ├── nga.png
│ ├── pica.jpg
│ ├── qie_e.png
│ ├── twitch.png
│ ├── youtube.png
│ └── zcool.jpg
├── data
├── base.json
├── music_list.json
├── nsfw.json
└── rules.json
├── public
├── CloudMusic.html
├── CloudMusic
│ └── tabs.html
├── Home.html
├── banner.html
├── category.html
├── css
│ ├── aliplayer-min.css
│ ├── douyu_danmu.css
│ ├── element-ui.css
│ └── vant.css
├── douyu-danmu-tabs.html
├── douyu-player.html
├── douyu-tabs.html
├── douyu_danmu.html
├── fonts
│ └── AlexBrush-Regular.ttf
├── gcores_banners.html
├── huya-category.html
├── huya-player.html
├── huya-tabs.html
├── js
│ ├── aliplayer-min.js
│ ├── douyu_danmu.js
│ ├── element-ui.js
│ ├── vant.min.js
│ └── vue.min.js
├── markdown.html
├── mix-manifest.json
├── netEasy-music-master
│ ├── .gitignore
│ ├── README.md
│ ├── css
│ │ ├── home.css
│ │ ├── playlist.css
│ │ ├── reset.css
│ │ └── song.css
│ ├── home.html
│ ├── js
│ │ ├── av.js
│ │ ├── device.js
│ │ ├── leanCloud.js
│ │ ├── playlist.js
│ │ ├── song.js
│ │ └── tab.js
│ ├── package-lock.json
│ ├── package.json
│ ├── playlist.html
│ ├── song.html
│ ├── vendors
│ │ ├── av-min.js
│ │ ├── jquery.min.js
│ │ └── loaders.min.css
│ └── yarn.lock
├── new_home.html
├── qieEgame-tabs.html
└── utils
│ └── huya_lib.js
└── tyrantgenesis.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | /node_modules
3 | /dist
4 |
5 |
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # Editor directories and files
17 | .idea
18 | .vscode
19 | *.suo
20 | *.ntvs*
21 | *.njsproj
22 | *.sln
23 | *.sw?
24 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # 基于编辑器的 HTTP 客户端请求
5 | /httpRequests/
6 |
--------------------------------------------------------------------------------
/.idea/hikerViewRules.iml:
--------------------------------------------------------------------------------
1 |
2 | ",
16 | html_close: ""
17 | },
18 | {
19 | tag: "u",
20 | html_open: "",
21 | html_close: ""
22 | },
23 | {
24 | tag: "color",
25 | html_open: attr => ``,
26 | html_close: ""
27 | },
28 | {
29 | tag: "size",
30 | html_open: attr => ``,
31 | html_close: ""
32 | },
33 |
34 | // 折叠
35 | {
36 | tag: "collapse",
37 | html_open: attr => `${attr || '折叠内容'}
`,
38 | html_close: "
", 45 | html_close: "" 46 | }, 47 | 48 | // 列表 49 | { 50 | tag: "list", 51 | html_open: "
', 177 | html_close: "" 178 | }, 179 | ]; 180 | 181 | function get(tag) { 182 | return nodes.find(node => node.tag === tag); 183 | } 184 | 185 | function parser(str) { 186 | if (!str) { 187 | throw "Parse string is empty"; 188 | } 189 | 190 | let html = str.slice(0); 191 | 192 | const tags = str.match(/(\[[^\]^\s]{1,}\])/g); 193 | 194 | if (!tags || tags.length < 1) 195 | return html; 196 | 197 | let args; 198 | let closing; 199 | let name; 200 | let node; 201 | let attr; 202 | let open; 203 | tags.forEach(tag => { 204 | args = tag.slice(1, -1).split("="); 205 | closing = args[0].startsWith("/"); 206 | name = closing ? args[0].slice(1) : args[0]; 207 | attr = args[1]; 208 | 209 | node = get(name); 210 | 211 | if (node) { 212 | open = typeof (node.html_open) === "function" ? node.html_open(attr) : node.html_open; 213 | html = html.replace(tag, closing ? node.html_close : open); 214 | } 215 | }); 216 | 217 | return html.replace(/(?:\r\n|\r|\n)/g, ""); 218 | } 219 | 220 | $.exports = { 221 | parser: parser, 222 | } 223 | -------------------------------------------------------------------------------- /COMIC/hentai-one.js: -------------------------------------------------------------------------------- 1 | const one = { 2 | empty: 'hiker://empty', 3 | d: [], 4 | data: { 5 | subTab: getMyVar('HentaiOne.subTab', '0'), 6 | }, 7 | baseParse: () => { 8 | const [url, page] = MY_URL.split('##') 9 | one.list(pdfa(fetch(url+'/?page='+page), '.gallery-list&&a')) 10 | setResult(one.d) 11 | }, 12 | searchParse: () => { 13 | one.list(pdfa(getResCode(), '#list&&a')) 14 | setResult(one.d) 15 | }, 16 | list: (list) => { 17 | list.forEach(item => { 18 | let title = pdfh(item, '.gallery-item-ttl&&Text') 19 | let url = pd(item, 'a&&href') 20 | let pic_url = pdfh(item, 'img&&src') 21 | one.d.push({ 22 | title: title, 23 | url: $(url+'#immersiveTheme#').rule((title, url, pic_url) => { 24 | const one = $.require('hiker://page/one') 25 | one.detail(title, url, pic_url) 26 | setResult(one.d) 27 | }, title, url, pic_url), 28 | pic_url: pic_url, 29 | col_type: 'movie_3', 30 | }) 31 | }) 32 | }, 33 | detail: (title, url, pic_url) => { 34 | setPageTitle(title) 35 | const html = getResCode() 36 | one.d.push({ 37 | title: title, 38 | url: url, 39 | pic_url: pic_url, 40 | col_type: 'movie_1_vertical_pic_blur', 41 | }) 42 | one.d.push({ 43 | col_type: 'line_blank' 44 | }) 45 | 46 | const tags = pdfa(html, '.detail-infos&&.detail-tags,4&&a') 47 | 48 | tags.forEach(tag => { 49 | let title = pdfh(tag, 'a&&Text') 50 | let url = pd(tag, 'a&&href') 51 | one.d.push({ 52 | title: pdfh(tag, 'a&&Text'), 53 | url: $(url+'?page=fypage').rule((title) => { 54 | const one = $.require('hiker://page/one') 55 | one.tag(title) 56 | setResult(one.d) 57 | }, title), 58 | col_type: 'flex_button', 59 | }) 60 | }) 61 | 62 | one.d.push({ 63 | col_type: 'line_blank' 64 | }) 65 | 66 | const desc_url = pd(html, '.detail-link-row&&a&&href') 67 | 68 | one.d.push({ 69 | title: '浏览', 70 | url: one.getPics(desc_url), 71 | col_type: 'text_center_1', 72 | }) 73 | one.d.push({ 74 | col_type: 'line_blank' 75 | }) 76 | 77 | one.d.push({ 78 | title: '相似内容', 79 | url: one.empty, 80 | col_type: 'text_1', 81 | }) 82 | 83 | one.list(pdfa(html, '.gallery-list&&a')) 84 | }, 85 | tag: (title) => { 86 | setPageTitle(title) 87 | try { 88 | one.list(pdfa(getResCode(), '.gallery-list&&a')) 89 | } catch(e) {} 90 | }, 91 | getPics: (url) => { 92 | const img_list = [] 93 | const html = fetch(url) 94 | const match = html.match(/\\"src\\":\\"(.*?)\\"/g) 95 | match.forEach(img => { 96 | img_list.push(img.replace(/\\"src\\":\\"(.*?)\\"/, "$1")) 97 | }) 98 | return 'pics://'+img_list.join('&&') 99 | }, 100 | } 101 | 102 | $.exports = one 103 | -------------------------------------------------------------------------------- /COMIC/mh3618.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | const d = [] 3 | const list = pdfa(getResCode(), '.books&&.bk') 4 | const class_url = MY_RULE.class_url 5 | 6 | list.forEach(item => { 7 | let url 8 | if (class_url === 'dpxs/list_3' || class_url === 'cpxs/list_2') { 9 | url = $(pd(item, 'a&&href')).rule(() => { 10 | const d = [] 11 | const list = pdfa(getResCode(), 'ul,1&&li') 12 | 13 | list.forEach(item => { 14 | d.push({ 15 | title: pdfh(item, 'a&&Text'), 16 | col_type: 'text_1', 17 | url: $(pd(item, 'a&&href')+'#readTheme#').rule(() => { 18 | const d = [] 19 | d.push({ 20 | title: pdfh(getResCode(), '#contxt&&Text'), 21 | col_type: 'rich_text', 22 | extra: { 23 | click: true, 24 | } 25 | }) 26 | setResult(d); 27 | }), 28 | }) 29 | }) 30 | 31 | setResult(d); 32 | }) 33 | } else { 34 | url = $(pd(item, 'a&&href')).lazyRule(() => { 35 | const img_list = [] 36 | const list = pdfa(fetch(input), 'ul,1&&li') 37 | list.forEach(item => { 38 | let true_page = pd(item, 'a&&href') 39 | let img_array = pdfa(fetch(true_page), '#htmlContent&&img') 40 | img_array.forEach(img => { 41 | img_list.push(pdfh(img, 'img&&src')) 42 | }) 43 | }) 44 | return 'pics://'+img_list.join('&&') 45 | }) 46 | } 47 | d.push({ 48 | title: pdfh(item, 'h3&&Text'), 49 | pic_url: pd(item, '.pic&&img&&src'), 50 | desc: pdfh(item, 'span&&Text'), 51 | url: url, 52 | }) 53 | }) 54 | 55 | setResult(d); 56 | } 57 | -------------------------------------------------------------------------------- /GHS/3dhentai.js: -------------------------------------------------------------------------------- 1 | const ht = { 2 | empty: 'hiker://empty', 3 | url: 'https://3dhentai.co', 4 | d: [], 5 | lazyRule: true, 6 | taskList: [], 7 | data: { 8 | category: getMyVar('3dhentai.category', '0'), 9 | }, 10 | baseParse: () => { 11 | const page = parseInt(MY_URL.split('##')[1]) 12 | 13 | let categoryList = [{type: 'Home', path: ''}, {type: 'Tags', path: '/tag'}, {type: 'Artists', path: '/artist'}, {type: 'Characters', path: '/characters'}] 14 | const currentCate = categoryList[ht.data.category] 15 | 16 | const type = currentCate.type 17 | const path = currentCate.path 18 | let url = ht.url + path 19 | 20 | if (type !== 'Artists') { 21 | url += '/page/'+page 22 | } 23 | 24 | if (page === 1) { 25 | categoryList.forEach((cate, index) => { 26 | ht.d.push({ 27 | title: parseInt(ht.data.category) === index ? '‘‘’’'+cate.type+'' : cate.type, 28 | url: $(ht.empty).lazyRule((index) => { 29 | putMyVar("3dhentai.category", index.toString()) 30 | refreshPage(true) 31 | return "hiker://empty" 32 | }, index), 33 | col_type: 'scroll_button', 34 | }) 35 | }) 36 | } 37 | 38 | const html = fetch(url) 39 | 40 | ht.videoType(html, type) 41 | 42 | setResult(ht.d) 43 | }, 44 | searchParse: () => { 45 | ht.videoType(getResCode(), 'Home') 46 | setResult(ht.d) 47 | }, 48 | videoParse: (url) => { 49 | const html = fetch(url) 50 | const title = pdfh(html, 'h1&&Text') 51 | setPageTitle(title) 52 | 53 | const videoFrameUrl = pdfh(html, 'iframe&&src'); 54 | const videoName = videoFrameUrl.split('&video=')[1] 55 | 56 | ht.d.push({ 57 | title: title, 58 | desc: pdfh(html, '.video-views&&Text'), 59 | pic_url: pdfh(html, 'meta[property=og:image]&&content')+'@Referer='+ht.url, 60 | url: 'https://3dhq1.org/video/3d/' + videoName, 61 | col_type: 'pic_1', 62 | }) 63 | 64 | const tagsDom1 = pdfa(html, '#video-about&video-actors') 65 | const tagsDom2 = pdfa(html, '#video-about&video-cats') 66 | const tagsDom3 = pdfa(html, '#video-about&video-tags') 67 | 68 | tagsDom1.concat(tagsDom2).concat(tagsDom3).forEach((item, index) => { 69 | const tags = pdfa(item, '.video-content-row&&a') 70 | 71 | ht.d.push({ 72 | title: pdfh(item, '.video-content-row&&Text').split(':')[0], 73 | url: ht.empty, 74 | col_type: 'text_center_1', 75 | extra: {lineVisible: false}, 76 | }) 77 | 78 | tags.forEach(tag => { 79 | const title = pdfh(tag, 'a&&title') 80 | ht.d.push({ 81 | title: title, 82 | url: $(pdfh(item, 'a&&href')+(index === 1 ? ('#noHistory#'+'#fypage') : '#noHistory#')).rule((tag, index) => { 83 | setPageTitle(tag) 84 | const ht = $.require('hiker://page/ht') 85 | const page = MY_PAGE 86 | if (index === 0) { 87 | ht.videoType(fetch(ht.url + '/actor/' + tag + '/page/' + page), 'Home') 88 | setResult(ht.d) 89 | } else if (index === 1) { 90 | ht.videoType(fetch(ht.url + '/artist/' + tag + '/page/' + page), 'Home') 91 | setResult(ht.d) 92 | } else { 93 | ht.videoType(fetch(ht.url + '/tag/' + tag + '/page/' + page), 'Home') 94 | setResult(ht.d) 95 | } 96 | }, title, index), 97 | col_type: 'flex_button', 98 | }) 99 | }) 100 | 101 | ht.d.push({ 102 | col_type: 'line_blank' 103 | }) 104 | }) 105 | 106 | ht.d.push({ 107 | title: 'Related Videos', 108 | url: ht.empty, 109 | col_type: 'text_center_1', 110 | }) 111 | 112 | ht.videoType(html, 'Related') 113 | }, 114 | videoType: (html, type) => { 115 | const list = type === 'Related' ? pdfa(html, '.related-videos&&.video-block') : pdfa(html, '.video-loop&&.video-block') 116 | 117 | const makeUrl = (item) => type === 'Home' && ht.lazyRule ? $(pdfh(item, 'a&&href')).lazyRule((url) => { 118 | log(url) 119 | const html = fetch(url) 120 | const videoFrameUrl = pdfh(html, 'iframe&&src'); 121 | const videoName = videoFrameUrl.split('&video=')[1] 122 | log(videoName) 123 | 124 | return 'https://3dhq1.org/video/3d/' + videoName 125 | }, pdfh(item, 'a&&href')) : $(pdfh(item, 'a&&href')+'#noHistory#').rule((type) => { 126 | const ht = $.require('hiker://page/ht') 127 | if (type === 'Home' || type === 'Related') { 128 | ht.videoParse(MY_URL) 129 | setResult(ht.d) 130 | } else { 131 | const html = fetch(MY_URL) 132 | ht.videoType(html, 'Home') 133 | setResult(ht.d) 134 | } 135 | }, type) 136 | 137 | list.forEach(item => { 138 | ht.d.push({ 139 | title: pdfh(item, '.title&&Text'), 140 | url: makeUrl(item), 141 | pic_url: pdfh(item, '.video-img&&data-src')+'@Referer='+ht.url, 142 | desc: pdfh(item, '.duration&&Text'), 143 | col_type: 'movie_2' 144 | }) 145 | }) 146 | }, 147 | } 148 | 149 | $.exports = ht 150 | -------------------------------------------------------------------------------- /GHS/7719.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let d = []; 3 | const list = parseDomForArray(getResCode(), '.content&&.grid_item'); 4 | for (let j in list) { 5 | d.push({ 6 | title: parseDomForHtml(list[j], '.description&&Text'), 7 | desc: parseDomForHtml(list[j], '.num&&Text'), 8 | pic_url: parseDom(list[j], 'img&&src'), 9 | url: $(parseDom(list[j],'a&&href')).lazyRule(_ => { 10 | const html = fetch(input) 11 | const script = parseDomForHtml(html, '.bofang_box&&script&&Html') 12 | eval(script) 13 | return player_data.url 14 | }) 15 | }) 16 | } 17 | 18 | setResult(d); 19 | } -------------------------------------------------------------------------------- /GHS/JavTree.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let d = []; 3 | const [empty, page] = MY_URL.split('##') 4 | 5 | const className = getMyVar('JavTree.tyrantgenesis.className', 'last') 6 | let url = getMyVar('JavTree.tyrantgenesis.url', 'https://javtree.com/last.html') 7 | url = url.replace('.html', '-'+page+'.html') 8 | 9 | if (parseInt(page) === 1) { 10 | d.push( 11 | { 12 | title: className === 'last' ? '““””最新更新' : '最新更新', 13 | url: $(empty).lazyRule(() => { 14 | putMyVar('JavTree.tyrantgenesis.className', 'last') 15 | putMyVar('JavTree.tyrantgenesis.url', 'https://javtree.com/last.html') 16 | refreshPage(true) 17 | return "hiker://empty" 18 | }), 19 | col_type: 'scroll_button', 20 | }, 21 | { 22 | title: className === 'category' ? '““””主題選片' : '主題選片', 23 | url: $(empty).lazyRule(() => { 24 | putMyVar('JavTree.tyrantgenesis.className', 'category') 25 | putMyVar('JavTree.tyrantgenesis.url', 'https://javtree.com/last.html') 26 | refreshPage(false) 27 | return "hiker://empty" 28 | }), 29 | col_type: 'scroll_button', 30 | }, 31 | { 32 | col_type:"blank_block" 33 | }, 34 | ) 35 | 36 | if (className === 'category') { 37 | const tags_html = fetch('https://javtree.com/tags.html') 38 | const tags = pdfa(tags_html, '.gm-main&&.gm-genre') 39 | tags.forEach(tag => { 40 | let list = pdfa(tag, '.list&&li') 41 | d.push({ 42 | title: pdfh(tag, '.title&&Text')+':', 43 | url: empty, 44 | col_type: 'scroll_button', 45 | }) 46 | list.forEach(item => { 47 | let url = 'https://javtree.com'+pdfh(item, 'a&&href') 48 | d.push({ 49 | title: pdfh(item, 'a&&Text').replace('#', ''), 50 | url: $(url).lazyRule(() => { 51 | putMyVar('JavTree.tyrantgenesis.className', 'category') 52 | putMyVar('JavTree.tyrantgenesis.url', input) 53 | refreshPage(true) 54 | return "hiker://empty" 55 | }), 56 | col_type: 'scroll_button', 57 | }) 58 | }) 59 | d.push({ 60 | col_type:"blank_block" 61 | }) 62 | }) 63 | } 64 | } 65 | 66 | const html = fetch(url) 67 | const list = pdfa(html, '.gm-list&&.item') 68 | 69 | list.forEach(item => { 70 | let pic_url = pdfh(item, 'img&&data-src') 71 | let url = 'https://javtree.com'+pdfh(item, '.title&&href') 72 | d.push({ 73 | title: pdfh(item, '.info&&.title&&Text'), 74 | desc: pdfh(item, '.volume&&Text'), 75 | pic_url: pic_url.startsWith('http') ? pic_url : 'https:'+pic_url, 76 | url: $(url).lazyRule(() => { 77 | const html = fetch(input) 78 | const video_source_json = html.match(/var post = (.*?);/)[1] 79 | const video_source = JSON.parse(video_source_json).vods 80 | 81 | return JSON.stringify({urls: video_source.map(item => item.source), names: video_source.map(item => item.name)}) 82 | }), 83 | col_type: 'movie_2', 84 | }) 85 | }) 86 | 87 | setResult(d); 88 | } 89 | -------------------------------------------------------------------------------- /GHS/JavWan.js: -------------------------------------------------------------------------------- 1 | const wan = { 2 | d: [], 3 | baseParse: () => { 4 | const html = getResCode() 5 | wan.listParse(html) 6 | setResult(wan.d) 7 | }, 8 | listParse: (html) => { 9 | const list = pdfa(html, '#main&&a') 10 | 11 | list.forEach(item => { 12 | try { 13 | let title = pdfh(item, 'a&&span&&Text') 14 | let img = pdfh(item, '.post-list-image&&img&&src') 15 | wan.d.push({ 16 | title: title, 17 | desc: pdfh(item, '.post-list-duration&&Text'), 18 | pic_url: img, 19 | url: $(pdfh(item, 'a&&href')+'#immersiveTheme#').rule((title, img) => { 20 | const wan = $.require('hiker://page/wan') 21 | wan.videoParse(title, img) 22 | setResult(wan.d) 23 | }, title, img), 24 | col_type: 'movie_2', 25 | }) 26 | }catch(e){} 27 | }) 28 | }, 29 | videoParse: (title, img) => { 30 | setPageTitle(title) 31 | const html = getResCode() 32 | const info = pdfh(html, '#post-data&&Html') 33 | 34 | let url = 'hiker://empty' 35 | const player = pdfh(info, '#player-width&&Html') 36 | const iframe = player.match(/id="iframe"/) 37 | if (iframe) { 38 | let iframe_context = '' 39 | let iframe_src = '' 40 | let script = pdfh(player, 'script&&Html').replace('return p', 'iframe_context = p') 41 | eval(script) 42 | try { 43 | iframe_src = iframe_context.match(/src="(.*?)"/)[1] 44 | }catch(e){} 45 | 46 | if (iframe_src) { 47 | url = pdfh(fetch(iframe_src), 'meta[property="og:video:url"]&&content') 48 | } 49 | } else { 50 | let context = '' 51 | let script = pdfh(player, 'script,2&&Html').replace('return p', 'context = p') 52 | eval(script) 53 | try { 54 | url = context.match(/video.src='(.*?)';/)[1] 55 | }catch(e){} 56 | } 57 | 58 | wan.d.push({ 59 | title: title, 60 | desc: pdfh(info, '.post-content&&Text'), 61 | pic_url: img, 62 | url: MY_URL, 63 | col_type: 'movie_1_vertical_pic_blur' 64 | }) 65 | 66 | wan.d.push({ 67 | col_type: 'line_blank' 68 | }) 69 | 70 | wan.d.push({ 71 | title: '播放', 72 | url: url, 73 | col_type: 'text_center_1', 74 | extra: {lineVisible: false}, 75 | }) 76 | 77 | wan.d.push({ 78 | col_type: 'line_blank' 79 | }) 80 | 81 | wan.listParse(html) 82 | }, 83 | } 84 | 85 | $.exports = wan 86 | -------------------------------------------------------------------------------- /GHS/eporner.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let d = []; 3 | try{ 4 | const list = parseDomForArray(getResCode(), 'body&&.mb'); 5 | for (let j in list) { 6 | d.push({ 7 | title: parseDomForHtml(list[j], '.mbtit&&Text'), 8 | desc: parseDomForHtml(list[j], '.mvhdico&&Text'), 9 | pic_url: parseDom(list[j], 'img&&src')+"@Referer=", 10 | url: parseDom(list[j],'a&&href'), 11 | }); 12 | }}catch(e){} 13 | 14 | setResult(d); 15 | } 16 | 17 | const secParse = _ => { 18 | let d = []; 19 | const list = parseDomForArray(getResCode(), 'body&&.dloaddivcol&&a'); 20 | 21 | list.forEach(item => { 22 | d.push({ 23 | title: parseDomForHtml(item, 'a&&Text').match(/\((.*?),/)[1], 24 | url: parseDom(item,'a&&href'), 25 | col_type: 'text_2', 26 | }); 27 | }) 28 | 29 | setResult(d); 30 | } -------------------------------------------------------------------------------- /GHS/eroticmovies.xyz.js: -------------------------------------------------------------------------------- 1 | const secParse = _ => { 2 | let res = {}; 3 | let d = []; 4 | const html = getResCode(); 5 | 6 | const des_title = parseDomForHtml(html, 'h1&&Text'); 7 | const des_pic = parseDom(html, 'img[title]&&src'); 8 | const des_desc = parseDomForHtml(html, '[id=fileDescription]&&Text'); 9 | 10 | const fetch_video = fetch(parseDomForHtml(html, 'iframe&&src')) 11 | 12 | const src = fetch_video.match(/src: '(.*?)',/)[1] 13 | 14 | d.push({ 15 | title: des_title, 16 | desc: des_desc, 17 | pic_url: des_pic, 18 | url: src+"#isVideo=true#", 19 | col_type: 'pic_1' 20 | }); 21 | 22 | res.data = d; 23 | setHomeResult(res); 24 | } 25 | -------------------------------------------------------------------------------- /GHS/jable.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let d = []; 3 | try { 4 | const list = pdfa(getResCode(), '.site-content&&.video-img-box'); 5 | for (let j in list) { 6 | d.push({ 7 | title: pdfh(list[j], 'h6&&a&&Text'), 8 | desc: pdfh(list[j], '.label&&Text'), 9 | pic_url: pd(list[j], 'img&&data-src'), 10 | url: $(pd(list[j],'a&&href')).rule(() => { 11 | eval(fetch("hiker://files/TyrantG/GHS/jable.js")) 12 | secParse() 13 | }), 14 | col_type: 'movie_2', 15 | }) 16 | } 17 | } catch (e){} 18 | 19 | setResult(d); 20 | } 21 | 22 | const secParse = _ => { 23 | let d = []; 24 | try { 25 | const html = getResCode() 26 | 27 | d.push({ 28 | title: pdfh(html, '.header-left&&h4&&Text'), 29 | desc: pdfh(html, '.video-info&&.text-center&&.tags&&Text'), 30 | pic_url: pd(html, 'video&&poster'), 31 | url: html.match(/hlsUrl = '(.*?)'/)[1], 32 | col_type: 'pic_1', 33 | }) 34 | 35 | d.push({ 36 | title: '演员', 37 | url: 'hiker://empty', 38 | col_type: 'text_center_1', 39 | extra: {lineVisible: false}, 40 | }) 41 | 42 | const models = pdfa(html, '.video-info&&.models&&a') 43 | 44 | models.forEach(model => { 45 | d.push({ 46 | title: pdfh(model, '.rounded-circle&&title'), 47 | pic_url: pdfh(model, '.rounded-circle&&src')+"@Referer=https://jable.tv/", 48 | url: $(pdfh(model, 'a&&href')).rule(() => { 49 | eval(fetch("hiker://files/TyrantG/GHS/jable.js")) 50 | baseParse() 51 | }), 52 | col_type: 'avatar', 53 | }) 54 | }) 55 | } catch (e){} 56 | 57 | setResult(d); 58 | } 59 | 60 | const makeTags = () => { 61 | const list = pdfa(getResCode(), 'nav.app-nav&&.container&&.col-6'); 62 | log(list.map(item => pdfh(item, 'a&&Text')).join('&')) 63 | log(list.map(item => pdfh(item, 'a&&href').slice(17)).join('&')) 64 | 65 | // 黑絲&過膝襪&運動裝&肉絲&絲襪&眼鏡娘&獸耳&漁網&水着&校服&旗袍&婚紗&女僕&和服&吊帶襪&兔女郎&Cosplay&黑肉&長身&軟體&貧乳&蘿莉&美腿&美尻&紋身&短髮&白虎&熟女&巨乳&少女&顏射&腳交&肛交&痙攣&潮吹&深喉&接吻&口爆&口交&乳交&中出&露出&輪姦&調教&綑綁&瞬間插入&痴漢&痴女&男M&泥醉&泡姬&母乳&放尿&按摩&強姦&多P&刑具&凌辱&一日十回&3P&黑人&醜男&誘惑&童貞&時間停止&復仇&年齡差&巨漢&媚藥&夫目前犯&出軌&催眠&偷拍&不倫&下雨天&NTR&風俗娘&醫生&逃犯&護士&老師&空姐&球隊經理&未亡人&搜查官&情侶&家政婦&家庭教師&偶像&人妻&主播&OL&魔鏡號&電車&處女&監獄&溫泉&洗浴場&泳池&汽車&廁所&學校&圖書館&健身房&便利店&錄像&處女作/引退作&綜藝&節日主題&感謝祭&4小時以上 66 | // tags/black-pantyhose/&tags/knee-socks/&tags/sportswear/&tags/flesh-toned-pantyhose/&tags/pantyhose/&tags/glasses/&tags/kemonomimi/&tags/fishnets/&tags/swimsuit/&tags/school-uniform/&tags/cheongsam/&tags/wedding-dress/&tags/maid/&tags/kimono/&tags/stockings/&tags/bunny-girl/&tags/Cosplay/&tags/suntan/&tags/tall/&tags/flexible-body/&tags/small-tits/&tags/loli/&tags/beautiful-leg/&tags/beautiful-butt/&tags/tattoo/&tags/short-hair/&tags/hairless-pussy/&tags/mature-woman/&tags/big-tits/&tags/girl/&tags/facial/&tags/footjob/&tags/anal-sex/&tags/spasms/&tags/squirting/&tags/deep-throat/&tags/kiss/&tags/cum-in-mouth/&tags/blowjob/&tags/tit-wank/&tags/creampie/&tags/outdoor/&tags/gang-rape/&tags/tune/&tags/bondage/&tags/quickie/&tags/chikan/&tags/chizyo/&tags/masochism-guy/&tags/crapulence/&tags/soapland/&tags/breast-milk/&tags/piss/&tags/massage/&tags/rape/&tags/gangbang/&tags/torture/&tags/insult/&tags/10-times-a-day/&tags/3p/&tags/black/&tags/ugly-man/&tags/temptation/&tags/virginity/&tags/time-stop/&tags/avenge/&tags/age-difference/&tags/giant/&tags/love-potion/&tags/sex-beside-husband/&tags/affair/&tags/hypnosis/&tags/hidden-cam/&tags/incest/&tags/rainy-day/&tags/ntr/&tags/club-hostess-and-sex-worker/&tags/doctor/&tags/fugitive/&tags/nurse/&tags/teacher/&tags/flight-attendant/&tags/team-manager/&tags/widow/&tags/detective/&tags/couple/&tags/housewife/&tags/private-teacher/&tags/idol/&tags/wife/&tags/female-anchor/&tags/ol/&tags/magic-mirror/&tags/tram/&tags/first-night/&tags/prison/&tags/hot-spring/&tags/bathing-place/&tags/swimming-pool/&tags/car/&tags/toilet/&tags/school/&tags/library/&tags/gym-room/&tags/store/&tags/video-recording/&tags/debut-retires/&tags/variety-show/&tags/festival/&tags/thanksgiving/&tags/more-than-4-hours/ 67 | } -------------------------------------------------------------------------------- /GHS/ohentai.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let d = []; 3 | try{ 4 | const list = parseDomForArray(getResCode(), '.serywrapper&&.tagtext'); 5 | for (let j in list) { 6 | d.push({ 7 | title: parseDomForHtml(list[j], '.tagtext&&Text'), 8 | url: "https://ohentai.org/"+parseDomForHtml(list[j],'a&&href').replace(/\s/g, '%20')+"&p=fypage" 9 | }); 10 | }}catch(e){} 11 | 12 | setResult(d); 13 | } 14 | 15 | const secParse = _ => { 16 | let d = []; 17 | try{ 18 | const list = parseDomForArray(getResCode(), '.videobrickwrap&&.videobrick'); 19 | 20 | for (let j in list) { 21 | let title = pdfh(list[j], '.videotitle&&Text') 22 | if (title !== 'StripChat - Live Cams') { 23 | d.push({ 24 | title: title, 25 | pic_url: "https://ohentai.org/"+pdfh(list[j], 'img&&src').replace(/\s/g, '%20'), 26 | url: $("https://ohentai.org/"+pdfh(list[j],'a&&href').replace(/\s/g, '%20')).lazyRule(_ => { 27 | const data = fetch(input).match(/sources: \[\{\"file\"\:\".*\"\}\],/) 28 | 29 | if (data) { 30 | return data[0].replace(/sources: \[\{\"file\"\:\"/, '').replace(/\"\}\],/, '') 31 | } else { 32 | return "取值失败" 33 | } 34 | }), 35 | col_type: "movie_2" 36 | }) 37 | } 38 | } 39 | }catch(e){} 40 | 41 | setResult(d); 42 | } -------------------------------------------------------------------------------- /GHS/pornhub.js: -------------------------------------------------------------------------------- 1 | const secParse = _ => { 2 | let res = {}; 3 | let d = []; 4 | const html = getResCode(); 5 | 6 | const des_title = parseDomForHtml(html, '.inlineFree&&Text'); 7 | const des_pic = parseDom(html, '#videoPlayerPlaceholder&&img&&src'); 8 | // const des_desc = parseDomForHtml(html, '.inlineFree&&Text'); 9 | const meta = parseDomForHtml(html, '[name=adsbytrafficjunkycontext]&&data-context-category'); 10 | 11 | d.push({ 12 | title: des_title, 13 | desc: meta, 14 | pic_url: des_pic, 15 | url: MY_URL, 16 | col_type: 'pic_1' 17 | }); 18 | 19 | // 这个变量定义在下面执行 script 的上方,没有被读取执行,需要手动声明避免报错 20 | let playerObjList = {} 21 | // 获取视频播放地址的变量并执行 22 | const js = parseDomForHtml(html,"[id=mobileContainer]&&script&&Html").replace(/var flashvars_.*?=/, 'var flashvars ='); 23 | eval(js); 24 | const list = flashvars.mediaDefinitions 25 | 26 | list.forEach(item => { 27 | if (typeof item.quality === 'string') { 28 | d.push({ 29 | title: item.quality, 30 | url: item.videoUrl, 31 | col_type: 'text_4' 32 | }); 33 | } 34 | }) 35 | 36 | res.data = d; 37 | setHomeResult(res); 38 | } -------------------------------------------------------------------------------- /GHS/shuiguopai.js: -------------------------------------------------------------------------------- 1 | js: 2 | let d = []; 3 | const [url, page] = MY_URL.split('##') 4 | const list_json = fetch(url, {headers: { 5 | 'Content-Type': 'application/json', 6 | 'Referer': 'https://sgpai.cc/', 7 | 'User-Agent': MOBILE_UA 8 | }, method:'POST', body: JSON.stringify({ 9 | "hm": "008-api", 10 | "length": 12, 11 | "type": 1, 12 | "page": page, 13 | })}); 14 | 15 | const list = JSON.parse(list_json).data.list 16 | 17 | if (url.includes('homePage')) { 18 | list.forEach(item => { 19 | d.push({ 20 | title: item.title, 21 | desc: item.subtitle, 22 | pic_url: item.img_url, 23 | url: $("https://sgpai.cc/play-details/1/"+item.library_id+"/").lazyRule(_ => { 24 | const html = fetch(input) 25 | return (html.match(/url:"(.*?)index.m3u8"/)[1]).replace(/\\u002F/g, '/')+"index.m3u8" 26 | }), 27 | col_type: 'movie_2' 28 | }) 29 | }) 30 | } else { 31 | list.forEach(item => { 32 | d.push({ 33 | title: item.anchors_name, 34 | desc: item.library_count+'部作品', 35 | pic_url: item.anchors_img, 36 | url: $("hiker://empty##fypage").rule(item => { 37 | let d = []; 38 | const params = { 39 | "anchors_id": item.anchors_id, 40 | "hm": "008-api", 41 | "length": 12, 42 | "page": MY_URL.split('##')[1], 43 | } 44 | const headers = { 45 | 'Content-Type': 'application/json', 46 | 'Referer': 'https://sgpai.cc/', 47 | 'User-Agent': MOBILE_UA 48 | } 49 | const data_json = fetch("https://api.cbbee0.com/v1_2/anchorsDetail", {headers: headers, method:'POST', body: JSON.stringify(params)}) 50 | const list = JSON.parse(data_json).data.list 51 | list.forEach(res => { 52 | d.push({ 53 | title: res.title, 54 | desc: res.subtitle, 55 | pic_url: res.img_url, 56 | url: $("https://sgpai.cc/play-details/1/"+res.library_id+"/").lazyRule(_ => { 57 | const html = fetch(input) 58 | return (html.match(/url:"(.*?)index.m3u8"/)[1]).replace(/\\u002F/g, '/')+"index.m3u8" 59 | }), 60 | col_type: 'movie_2' 61 | }) 62 | }) 63 | setResult(d); 64 | }, item), 65 | col_type: 'icon_round_4' 66 | }) 67 | }) 68 | } 69 | 70 | setResult(d); 71 | -------------------------------------------------------------------------------- /GHS/spankbang.js: -------------------------------------------------------------------------------- 1 | const videoSource = (stream_data, d) => { 2 | d.push({ 3 | pic_url: stream_data.cover_image, 4 | col_type: 'pic_1' 5 | }); 6 | 7 | 8 | if (stream_data['240p'].length > 0) { 9 | d.push({ 10 | title: '240p', 11 | url: stream_data['240p'][0], 12 | col_type: 'text_2' 13 | }); 14 | } 15 | if (stream_data['320p'].length > 0) { 16 | d.push({ 17 | title: '320p', 18 | url: stream_data['320p'][0], 19 | col_type: 'text_2' 20 | }); 21 | } 22 | if (stream_data['480p'].length > 0) { 23 | d.push({ 24 | title: '480p', 25 | url: stream_data['480p'][0], 26 | col_type: 'text_2' 27 | }); 28 | } 29 | if (stream_data['720p'].length > 0) { 30 | d.push({ 31 | title: '720p', 32 | url: stream_data['720p'][0], 33 | col_type: 'text_2' 34 | }); 35 | } 36 | if (stream_data['1080p'].length > 0) { 37 | d.push({ 38 | title: '1080p', 39 | url: stream_data['1080p'][0], 40 | col_type: 'text_2' 41 | }); 42 | } 43 | if (stream_data['4k'].length > 0) { 44 | d.push({ 45 | title: '4k', 46 | url: stream_data['4k'][0], 47 | col_type: 'text_2' 48 | }); 49 | } 50 | } 51 | 52 | const baseParse = _ => { 53 | let res = {}; 54 | let d = []; 55 | const html = getResCode(); 56 | 57 | const list = parseDomForArray(html, '.video-list&&.video-item'); 58 | 59 | if (Number(MY_PAGE) === 1) { 60 | d.push({ 61 | title: '分类', 62 | col_type: 'text_center_1', 63 | url: $("https://spankbang.com/categories").rule(_ => { 64 | var d = []; 65 | 66 | var list = parseDomForArray(getResCode(), '#categories&&a'); 67 | list.forEach(item => { 68 | d.push({ 69 | title: parseDomForHtml(item, 'a&&Text'), 70 | pic_url: parseDomForHtml(item, '.cover&&src'), 71 | url: $("https://spankbang.com"+parseDomForHtml(item,'a&&href').replace(/\?.*/, '')+"/fypage/").rule(_ => { 72 | let d = []; 73 | let html = getResCode(); 74 | let list = parseDomForArray(html, '.video-list&&.video-item'); 75 | 76 | list.forEach(item => { 77 | d.push({ 78 | title: parseDomForHtml(item, '.name&&Text'), 79 | desc: parseDomForHtml(item, '.l&&Text'), 80 | pic_url: parseDom(item, '.cover&&data-src'), 81 | url: $(parseDom(item,'a&&href')).rule(_ => { 82 | eval(fetch('hiker://files/TyrantG/GHS/spankbang.js')) 83 | secParse() 84 | }), 85 | col_type: 'movie_3', 86 | }); 87 | }) 88 | 89 | setResult(d) 90 | }), 91 | col_type: 'movie_3', 92 | }); 93 | }) 94 | setResult(d) 95 | }) 96 | }) 97 | } 98 | 99 | list.forEach(item => { 100 | d.push({ 101 | title: parseDomForHtml(item, '.name&&Text'), 102 | desc: parseDomForHtml(item, '.l&&Text'), 103 | pic_url: parseDom(item, '.cover&&data-src'), 104 | url: parseDom(item,'a&&href'), 105 | col_type: 'movie_3', 106 | }); 107 | }) 108 | 109 | res.data = d; 110 | setHomeResult(res); 111 | } 112 | 113 | const secParse = _ => { 114 | let res = {}; 115 | let d = []; 116 | const html = getResCode(); 117 | 118 | const script = parseDomForHtml(html, '#inner_content&&script&&Html'); 119 | eval(script) 120 | 121 | videoSource(stream_data, d) 122 | 123 | res.data = d; 124 | setHomeResult(res); 125 | } 126 | 127 | const searchParse = () => { 128 | let res = {}; 129 | let d = []; 130 | const html = getResCode(); 131 | 132 | const list = parseDomForArray(html, '.video-list&&.video-item'); 133 | list.forEach(item => { 134 | d.push({ 135 | title: parseDomForHtml(item, '.name&&Text'), 136 | desc: parseDomForHtml(item, '.l&&Text'), 137 | pic_url: parseDom(item, '.cover&&data-src'), 138 | url: parseDom(item,'a&&href'), 139 | col_type: 'movie_2', 140 | }); 141 | }) 142 | 143 | res.data = d; 144 | setHomeResult(res); 145 | } -------------------------------------------------------------------------------- /GHS/yande.re.js: -------------------------------------------------------------------------------- 1 | const baseParse = _ => { 2 | let res = {}; 3 | let d = []; 4 | const html = getResCode(); 5 | const list = parseDomForArray(html, "#post-list-posts&&li"); 6 | 7 | list.forEach(element => { 8 | d.push({ 9 | pic_url: parseDomForHtml(element, ".preview&&src"), 10 | url: $("https://yande.re"+parseDomForHtml(element, "a&&href")).lazyRule(_ => parseDomForHtml(fetch(input), ".highres-show&&href")), 11 | col_type: 'pic_3' 12 | }) 13 | }); 14 | 15 | res.data = d; 16 | setHomeResult(res); 17 | } 18 | 19 | const secParse = _ => { 20 | let res = {}; 21 | let d = []; 22 | const html = getResCode(); 23 | 24 | d.push({ 25 | pic_url: parseDomForHtml(html, ".highres-show&&href"), 26 | url: parseDomForHtml(html, ".highres-show&&href"), 27 | col_type: 'image_1_full' 28 | }) 29 | res.data = d; 30 | setHomeResult(res); 31 | } 32 | 33 | const searchParse = _ => { 34 | let res = {}; 35 | let d = []; 36 | const html = getResCode(); 37 | const list = parseDomForArray(html, "#post-list-posts&&li"); 38 | 39 | list.forEach(element => { 40 | d.push({ 41 | title: '', 42 | desc: '', 43 | pic_url: parseDomForHtml(element, ".preview&&src"), 44 | url: "https://yande.re"+parseDomForHtml(element, "a&&href") 45 | }) 46 | }); 47 | 48 | res.data = d; 49 | setHomeResult(res); 50 | } -------------------------------------------------------------------------------- /HOME/index.html: -------------------------------------------------------------------------------- 1 |