24-5-2.txt 720 KB

1
  1. [{"last_chapter_rule":"js:\neval(fetch('hiker://files/rules/xyq/hikermovie.js'));hikchapter();","title":"香情影视","author":"香雅情","version":7,"type":"all","url":"hiker://files/rules/xyq/hikermovie.json","col_type":"icon_4_card","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\neval(fetch('hiker://files/rules/xyq/hikermovie.js'));hikhmrule();","searchFind":"js:\neval(fetch('hiker://files/rules/xyq/hikermovie.js'));hiksearch();","search_url":"hiker://empty$$$hiker://files/rules/xyq/hikermovie.json$$$**$$$fypage$$$","titleColor":"#fff20c00","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"js:\neval(fetch('hiker://files/rules/xyq/hikermovie.js'));hikhmerj();","sdetail_col_type":"movie_1","sdetail_find_rule":"js:\neval(fetch('hiker://files/rules/xyq/hikermovie.js'));hikseaerji();","ua":"mobile","preRule":"//设置更新间隔时间,单位为整数天。\nvar uptime = 2;\n\nfunction uprulefile() {\n let jiasu = 'https://github.moeyy.xyz/';\n var rulejs = fetch('https://agit.ai/lzk23559/CloudRule/raw/branch/master/hikermovie.js', {\n dns: \"152.32.170.60\"\n });\n if (rulejs.search(/lazyRule/) == -1) {\n rulejs = fetch(jiasu + 'https://raw.githubusercontent.com/xyq254245/HikerRule/main/hikermovie.js', {});\n }\n if (rulejs.search(/lazyRule/) != -1) {\n writeFile(\"hiker://files/rules/xyq/hikermovie.js\", rulejs);\n }\n var rulejson = fetch('https://agit.ai/lzk23559/CloudRule/raw/branch/master/hikermovie.json', {\n dns: \"152.32.170.60\"\n });\n if (rulejson.search(/\\\"vodhref\\\"/) == -1) {\n rulejson = fetch(jiasu + 'https://raw.githubusercontent.com/xyq254245/HikerRule/main/hikermovie.json', {});\n }\n if (rulejson.search(/\\\"vodhref\\\"/) != -1) {\n writeFile(\"hiker://files/rules/xyq/hikermovie.json\", rulejson);\n }\n if (rulejs.search(/lazyRule/) != -1 && rulejson.search(/\\\"vodhref\\\"/) != -1) {\n writeFile(\"hiker://files/rules/xyq/hikerupdate.txt\", new Date() + '');\n confirm({\n title: '提示',\n content: '自动更新完成'\n });\n } else {\n confirm({\n title: '提示',\n content: '自动更新失败'\n });\n }\n}\n\n\n\n//检测是否有写入时间与规则的js插件文件\nif (fileExist(\"hiker://files/rules/xyq/hikerupdate.txt\") && fileExist(\"hiker://files/rules/xyq/hikermovie.js\") && fileExist(\"hiker://files/rules/xyq/hikermovie.json\")) {\n //计算时间间隔\n var start = new Date(fetch(\"hiker://files/rules/xyq/hikerupdate.txt\", {}));\n var nowt = new Date();\n var D_T = nowt.getTime() - start.getTime();\n var D_D = D_T / (1000 * 3600 * 24);\n var tdif = parseInt(D_D) + '';\n //log(tdif);\n //默认间隔超过设置天数就取一次云端文件\n if (tdif >= uptime || tdif < 0) {\n uprulefile();\n }\n} else {\n //如果少一个文件就自动取云端文件\n uprulefile();\n}\n\n\n\n//执行需要预处理的站点\nvar lac = fetch('hiker://files/rules/xyq/hikermovie.js');\n//log(lac.length);\nif (lac.search(/lazyRule/) != -1) {\n eval(lac);\n hikerpre();\n} else {\n //如果本地文件不对将尝试自修复\n uprulefile();\n setError('规则修复完成,如有问题请反馈。')\n}","pages":"[]","proxy":"","icon":"https://codeberg.org/lzk23559/PublicRule/raw/branch/master/xqys.png"},{"last_chapter_rule":"","title":"轻合集.缘分","author":"缘分","version":20240329,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = { 'all': '聚合', 'video': '视频🎋', 'music': '音频🍂', 'live': '直播🍁', 'cartoon': '漫画🌾', 'read': '阅读🌺', 'picture': '图集🌻', 'news': '资讯🌿', 'tool': '工具🎄', 'other': '其它🍀' }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙ &nbsp '.small() + getVar('gx', '').small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '这是轻合集的搜索哦~~',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部🌸' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部🌸 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n$.require(\"hiker://page/更新?rule=轻合集.缘分\")\n})\nsetResult(el)\n","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nvar JiaSu = 'https://github.moeyy.xyz/';\nvar Url = 'https://gitlab.com/liuzaoyue/l/-/raw/main/share-home-rules.json';\nvar Url1 = 'https://gitcode.net/liuzaoyue/hai/-/raw/master/share-home-rules.json';\nvar Url2 = JiaSu + 'https://raw.githubusercontent.com/liuzaoyue/haikuo/master/share-home-rules.json';\nputMyVar('remoteUrl', Url1)","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 轻合集设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://'))\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n deleteCache(url)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据'], 1).select(() => {\\n if (input == '清除自定义数据') {\\n deleteFile('customData')\\n } else if (input == '启用合集自定义') {\\n saveFile('disableCustom', '')\\n } else {\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是轻合集的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((MY_PAGE == 1 || typeof MY_PAGE == 'undefined') &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].find((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].find((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].find((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"更新\",\"path\":\"更新\",\"rule\":\"if (getMyVar('qx', '1') != 0) {\\n var uplink = 'http://hiker.nokia.press/hikerule/rulelist.json?id=4765'\\n let newVersion;\\n let myVersion = MY_RULE.version == 0 ? 20240329 : MY_RULE.version;\\n try {\\n newVersion = JSON.parse(fetchCache(uplink, 24, {\\n timeout: 1000\\n })).version;\\n log(newVersion)\\n } catch (e) {\\n newVersion = myVersion;\\n }\\n let isUpdate = Number(newVersion) > Number(myVersion);\\n if (isUpdate) {\\n log('有新版本:' + newVersion + ',当前:' + myVersion);\\n confirm({\\n title: '更新提示',\\n content: '检测到你的规则版本小于服务器版本,是否立即更新?',\\n confirm: $.toString((uplink) => {\\n return `海阔视界首页频道规则¥home_rule_url¥${uplink}`\\n }, uplink),\\n cancel: $.toString(() => {\\n return putMyVar('qx', '0')\\n })\\n })\\n }\\n}\"}]","proxy":"","icon":"https://img2.woyaogexing.com/2022/04/19/dc6b18070df64185a80f6dcb3cbfc207!400x400.jpeg"},{"last_chapter_rule":"","title":"聚磁🔮","author":"Joe","version":240127,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = { 'all': '聚合', 'video': '视频', 'music': '音频', 'live': '直播', 'cartoon': '漫画', 'read': '阅读', 'picture': '图集', 'news': '资讯', 'tool': '工具', 'other': '其它' }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '这是轻合集的搜索哦~~',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)\n","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'https://ghproxy.org/https://raw.githubusercontent.com/Gumingjie0312/files/main/share-home-rules.json')\n// \n/*\n */","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 轻合集设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://'))\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n deleteCache(url)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据'], 1).select(() => {\\n if (input == '清除自定义数据') {\\n deleteFile('customData')\\n } else if (input == '启用合集自定义') {\\n saveFile('disableCustom', '')\\n } else {\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是轻合集的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((MY_PAGE == 1 || typeof MY_PAGE == 'undefined') &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].find((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].find((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].find((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"}]","proxy":"","icon":"https://s1.328888.xyz/2022/07/29/FL3Bm.jpg"},{"last_chapter_rule":"","title":"轻合集.水淼","author":"轻合集生成器","version":107,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = { 'all': '聚合', 'video': '视频', 'music': '音频', 'live': '直播', 'cartoon': '漫画', 'read': '阅读', 'picture': '图集', 'news': '资讯', 'tool': '工具', 'other': '其它' }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '这是轻合集的搜索哦~~',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)\n","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'http://hiker.nokia.press/hikerule/dev/json_list?name=384625466')\n// \n/*\n*/","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 轻合集设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://'))\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n deleteCache(url)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据', '编辑JSON'], 1).select(() => {\\n switch (input.slice(0, 2)) {\\n case '清除':\\n deleteFile('customData')\\n break\\n case '启用':\\n saveFile('disableCustom', '')\\n break\\n case '禁用':\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n break\\n case '编辑':\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://files/') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n return 'hiker://page/interface#noRefresh##noHistory##noRecordHistory#?rule=JSON编辑器&Json='+base64Encode(url)\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是轻合集的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\nlog(MY_RULE.url)\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((typeof MY_PAGE != 'undefined' && MY_PAGE == 1) &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n MY_PARAMS = JSON.parse(base64Decode(MY_PARAMS))\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, base64Encode(JSON.stringify({ url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })))\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].some((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].some((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].some((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"}]","proxy":"","icon":"http://q1.qlogo.cn/g?b=qq&nk=36835891&s=640"},{"last_chapter_rule":"","title":"Q","author":"发粪涂墙","version":107,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = { 'all': '聚合', 'video': '视频', 'music': '音频', 'live': '直播', 'cartoon': '漫画', 'read': '阅读', 'picture': '图集', 'news': '资讯', 'tool': '工具', 'other': '其它' }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '这是轻合集的搜索哦~~',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)\n","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'http://hiker.nokia.press/hikerule/rulelist.json?id=5009')\nif (request('hiker://home@模板·Q') == 'null') {\r\n confirm({\r\n title: '依赖检测',\r\n content: '检测到缺少模板依赖,请导入!',\r\n confirm: () => {\r\n return \"海阔视界首页频道规则【模板·Q】¥home_rule_url¥http://hiker.nokia.press/hikerule/rulelist.json?id=3055\"\r\n }\r\n })\r\n}\n// \n/*\n*/","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 轻合集设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://'))\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n deleteCache(url)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据', '编辑JSON'], 1).select(() => {\\n switch (input.slice(0, 2)) {\\n case '清除':\\n deleteFile('customData')\\n break\\n case '启用':\\n saveFile('disableCustom', '')\\n break\\n case '禁用':\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n break\\n case '编辑':\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://files/') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n return 'hiker://page/interface#noRefresh##noHistory##noRecordHistory#?rule=JSON编辑器&Json='+base64Encode(url)\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是轻合集的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\nlog(MY_RULE.url)\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((typeof MY_PAGE != 'undefined' && MY_PAGE == 1) &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n MY_PARAMS = JSON.parse(base64Decode(MY_PARAMS))\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, base64Encode(JSON.stringify({ url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })))\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].some((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].some((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].some((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"}]","proxy":"","icon":"hiker://images/icon4"},{"last_chapter_rule":"","title":"听合集","author":"小棉袄🌞&永远の明日","version":106,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = { 'all': '聚合', 'video': '视频', 'music': '音频', 'live': '直播', 'cartoon': '漫画', 'read': '阅读', 'picture': '图集', 'news': '资讯', 'tool': '工具', 'other': '其它' }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '这是轻合集的搜索哦~~',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)\n","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow)\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'https://ghproxy.org/https://raw.githubusercontent.com/xixifree/Hiker/main/ting.json')","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 轻合集设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://'))\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n deleteCache(url)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据'], 1).select(() => {\\n if (input == '清除自定义数据') {\\n deleteFile('customData')\\n } else if (input == '启用合集自定义') {\\n saveFile('disableCustom', '')\\n } else {\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是轻合集的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((typeof MY_PAGE != 'undefined' && MY_PAGE == 1) &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].find((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].find((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].find((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"}]","proxy":"","icon":"https://pic.imgdb.cn/item/62ea0a5116f2c2beb1f3bc42.jpg"},{"last_chapter_rule":"","title":"阅动漫","author":"小米粥","version":309,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = {\n 'cartoon': '🔮漫画',\n 'video': '🎋优质',\n 'other': '🌾一般',\n 'all': '🍀新增',\n 'music': '💽音乐',\n 'live': '🎛直播',\n 'read': '📙书',\n 'picture': '📚图片',\n 'news': '🚫无搜索',\n 'tool': '📥下载'\n }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 阅动漫💫设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img:\n'https://img.vinua.cn/images/vkhRw.jpeg',\n col_type: 'avatar',\n extra: {\n version: MY_RULE.version\n }\n }, {\n desc: '0',\n url: 'hiker://page/Main.view?rule=本地资源管理',\n img: 'https://img.vinua.cn/images/vkhRw.jpeg',\n col_type: 'card_pic_1'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '倾君之言,阅水天一色~~阅动漫',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow);\n let yux=\"yux\"+Date.now();\n let el = $.toString((QING_TITLE, yux) => {\n let {\n hijackEl\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\n QING_TITLE:QING_TITLE,\n isIndex: $.hiker[yux],\n MY_RULE:MY_RULE\n })\n\n $.hiker.setResult = function(param0, param1, param2, param3) {\n param1 = CALLBACK_KEY\n param2 = MY_RULE\n param3 = MY_TYPE\n if (Array.isArray(param0.data)) param0 = param0.data\n param0 = param0.map(hijackEl);\n method_setResult.invoke(javaContext, param0, param1, param2, param3)\n }\n $.hiker.setHomeResult = setResult\n $.hiker.setSearchResult = setResult\n }, QING_TITLE, yux);\n rules = rules.map((v,i)=> {\n if (v.searchFind.startsWith('js:')) {\n v.searchFind = \"js:$.hiker.\"+yux+\"=\"+i+\";\" + el + \";\" + v.searchFind.slice(3);\n }\n return v;\n });\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\n\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\nif (getItem(\"read_policy\") !== \"1\") {\n el.push({\n title: '““””<small><font color=#871f78>以下数据源于网络,请支持官方!</font></small>',\n desc: '““””<small><font color=#f20c00>本规则道长仓库作者:小米粥 收集自网络 仅限免费学习交流使用,请于导入后24小时内删除,任何组织或个人不得以任何方式方法传播或售卖此规则的整体或部分!本程序代码来源于网络,有能力请支持官方</font></small>',\n url: $('#noHistory#').lazyRule(() => {\n setItem(\"read_policy\", \"1\")\n refreshPage(false)\n return \"toast://你已同意该协议\"\n }),\n col_type: 'text_center_1'\n })\n}\n\nif (getItem(\"data\") !== \"1\") {\n url = getMyVar('remoteUrl')\n el.push({\n title: '““””<small><font color=#871f78>点击获取仓库源</font></small>',\n url: $('#noHistory#').lazyRule((url) => {\n setItem(\"data\", \"1\")\n\n requireDownload('https://ghproxy.net/https://raw.githubusercontent.com/QQ1993HUANG/A/main/阅动漫.json', url)\n back(false)\n refreshPage(true)\n return \"toast://数据已获取\"\n }, url),\n col_type: 'text_center_1'\n })\n}\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)","searchFind":"js:\nsetResult([{\n title: \"点我开始阅动漫•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow);\n let yux=\"yux\"+Date.now();\n let el = $.toString((QING_TITLE, yux) => {\n let {\n hijackEl\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\n QING_TITLE:QING_TITLE,\n isIndex: $.hiker[yux],\n MY_RULE:MY_RULE\n })\n\n $.hiker.setResult = function(param0, param1, param2, param3) {\n param1 = CALLBACK_KEY\n param2 = MY_RULE\n param3 = MY_TYPE\n if (Array.isArray(param0.data)) param0 = param0.data\n param0 = param0.map(hijackEl);\n method_setResult.invoke(javaContext, param0, param1, param2, param3)\n }\n $.hiker.setHomeResult = setResult\n $.hiker.setSearchResult = setResult\n }, QING_TITLE, yux);\n rules = rules.map((v,i)=> {\n if (v.searchFind.startsWith('js:')) {\n v.searchFind = \"js:$.hiker.\"+yux+\"=\"+i+\";\" + el + \";\" + v.searchFind.slice(3);\n }\n return v;\n });\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'https://ghproxy.net/https://raw.githubusercontent.com/QQ1993HUANG/A/main/阅动漫.json')\n// \n/*\n*/","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('阅动漫生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\nlog(MY_RULE.url)\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((typeof MY_PAGE != 'undefined' && MY_PAGE == 1) &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n MY_PARAMS = JSON.parse(base64Decode(MY_PARAMS))\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, base64Encode(JSON.stringify({ url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })))\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].some((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].some((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].some((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是阅动漫的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"更新详情\",\"path\":\"Up\",\"rule\":\"js:\\nvar res = {};\\nvar items = [];\\nvar img = 'https://bing.img.run/1366x768.php';\\nitems.push({\\n img: img,\\n url: img + \\\"#.jpg\\\",\\n desc: '0',\\n col_type: 'card_pic_1'\\n});\\n\\nitems.push({\\n title: \\\"““””<h4>【阅动漫🔮反馈收集】</h4>\\\" + '<span style=\\\"color: grey\\\">小小</span>',\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://page/manageRule#noHistory##noRecordHistory#?rule=道长仓库Pro\\\",\\n extra: {\\n lver: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\",\\n id: \\\"6803\\\"\\n }\\n});\\n\\nif (getItem(\\\"read_policy\\\") !== \\\"1\\\") {\\n items.push({\\n title: '““””<small><font color=#871f78>本规则数据来源于网络,如您喜欢,请支持官方</font></small>',\\n desc: '““””<small><font color=#f20c00>本规则仅限免费学习交流使用,请于导入后24小时内删除,任何组织或个人不得以任何方式方法传播或售卖此规则的整体或部分!</font></small>',\\n url: $('#noHistory#').lazyRule(() => {\\n setItem(\\\"read_policy\\\", \\\"1\\\")\\n refreshPage(false)\\n return \\\"toast://你已同意该协议\\\"\\n }),\\n col_type: 'text_center_1'\\n })\\n}\\n\\nitems.push({\\n title: '““””<b>更新公告</b>',\\n url: \\\"https://img.vinua.cn/images/vkn3J.jpeg\\\",\\n col_type: \\\"text_2\\\"\\n});\\n\\nlet newVersion;\\nlet myVersion = MY_PARAMS.version;\\ntry {\\n newVersion = JSON.parse(fetchPC(\\\"http://hiker.nokia.press/hikerule/dev/getbyid?id=6749\\\", {\\n timeout: 1000\\n })).result.ver;\\n} catch (e) {\\n toast(\\\"道长仓库抽风了,本次未检测到新版信息\\\");\\n newVersion = myVersion;\\n}\\nlet isUpdate = Number(newVersion) > Number(myVersion);\\nlet isVer = Number(newVersion) === Number(myVersion);\\nif (isUpdate) {\\n log('有新版本:' + newVersion + ',当前:' + myVersion);\\n}\\nitems.push({\\n title: isUpdate ? \\\"🆙新版本\\\" : \\\"道长仓库内更新\\\",\\n url: isUpdate ? \\\"\\\" : \\\"hiker://page/manageRule#noHistory##noRecordHistory#?rule=道长仓库Pro\\\",\\n col_type: \\\"text_2\\\",\\n extra: {\\n lver: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\",\\n id: \\\"6803\\\"\\n }\\n});\\nconst Color = \\\"#19B89D\\\";\\nvar des_desc = '<h1 style=\\\"text-align: center;\\\">🐾更新[240427]</h1>' +\\n '<<blockquote><font color=\\\"red\\\"<br>①新增优质站点</橘子br>②剔除失效源</br><blockquote>' +\\n\\n'<h1 style=\\\"text-align: center;\\\">🐾更新[231023]</h1>' +\\n '<<blockquote><font color=\\\"red\\\"<br>①囧次元,皮皮虾动漫,七色动漫,girigiri爱动漫,NT动漫,整理分类,页面优化</br>②增加更新页面/反馈页面③优化阅动漫本体,与旧规则不兼容,需删除再导入更新规则</br><blockquote>'\\n\\nitems.push({\\n title: '更新详情 <small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>',\\n img: \\\"https://lanmeiguojiang.com/tubiao/more/197.png\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((jjid, decid, des_desc) => {\\n if (getMyVar(\\\"jjs\\\", \\\"收起\\\") == \\\"收起\\\") {\\n putMyVar(\\\"jjs\\\", \\\"展开\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '更新详情 <small><small><span style=\\\"color:#19B89D\\\">收起></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc + '</span>'\\n })\\n return \\\"hiker://empty\\\"\\n } else {\\n putMyVar(\\\"jjs\\\", \\\"收起\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '更新详情<small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 150)\\n })\\n return \\\"hiker://empty\\\"\\n }\\n\\n }, MY_RULE + \\\"_jjid\\\", MY_RULE + \\\"_decid\\\", des_desc),\\n col_type: \\\"avatar\\\",\\n extra: {\\n id: MY_RULE + \\\"_jjid\\\"\\n }\\n});\\n\\nitems.push({\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 150),\\n col_type: \\\"rich_text\\\",\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: MY_RULE + \\\"_decid\\\"\\n }\\n});\\n\\nres.data = items;\\nsetHomeResult(res);\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 阅动漫🔮设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,没事别点,可每月点一次更新)',\\n url: $(\\\"清除缓存,立即更新\\\").confirm((url) => {\\n //远程依赖索引文件代理地址列表\\n let requirelist = ['https://raw.iqiq.io/', 'https://github.jevons.vip/https://raw.githubusercontent.com/', 'https://ghproxy.com/https://raw.githubusercontent.com/', 'https://cdn.staticaly.com/gh/', 'https://github.jevons.vip/https://raw.githubusercontent.com/']\\n for (let i = 0; i < requirelist.length; i++) {\\n try { //远程依赖索引\\n let res = request(requirelist[i] + 'QQ1993HUANG/YMJ/main/', {\\n withStatusCode: true\\n })\\n if (JSON.parse(res).statusCode == 200) {\\n if (fileExist(url)) {\\n deleteFile(url)\\n requireDownload(requirelist[i] + 'QQ1993HUANG/YMJ/main',url)\\n break\\n } else {\\n requireDownload(requirelist[i] + 'QQ1993HUANG/YMJ/main',url)\\n break\\n }\\n }\\n } catch (e) {}\\n }\\n refreshPage(true)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:🈚️\\\\n'\\n /*data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、')*/,\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\nel.push({\\n title: \\\"更新&反馈\\\",\\n url: \\\"hiker://page/Up#noRefresh##noRecordHistory##noHistory#\\\",\\n extra: {\\n version: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\"\\n },\\n col_type: \\\"text_center_1\\\"\\n});\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 阅动漫🔮自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据', '编辑JSON'], 1).select(() => {\\n switch (input.slice(0, 2)) {\\n case '清除':\\n deleteFile('customData')\\n break\\n case '启用':\\n saveFile('disableCustom', '')\\n break\\n case '禁用':\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n break\\n case '编辑':\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://files/') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n return 'hiker://page/interface#noRefresh##noHistory##noRecordHistory#?rule=JSON编辑器&Json='+base64Encode(url)\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});/*\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})*/\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif(editMode === '导入海阔') {\\n el.push({\\n title:'搜索',\\n desc:'输入小程序标题|地址进行搜索...',\\n url:$.toString(()=>{\\n refreshPage(false);\\n }),\\n col_type:'input',\\n extra: {\\n onChange: \\\"putMyVar('importSearchKey',input)\\\",\\n titleVisible: true,\\n defaultValue:getMyVar('importSearchKey','')\\n },\\n });\\n el.push({\\n title: '全部导入(非搜索过滤后结果)',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: {lineVisible: false}\\n });\\n}\\nvar datas = (disableCustom ? data : JSON.parse(readFile('customData') || '[]'));\\nlet sk = getMyVar('importSearchKey','');\\nif(editMode === '导入海阔'&&sk) {\\n datas = datas.filter(it=>it.title.includes(sk)||(it.url&&it.url.includes(sk)));\\n data = data.filter(it=>it.title.includes(sk)||(it.url&&it.url.includes(sk)));\\n}\\ndatas.forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = 'rule://' + base64Encode(JSON.stringify(data[i]));\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\"},{\"col_type\":\"movie_3\",\"name\":\"链接处理*\",\"path\":\"urlParse\",\"rule\":\"// 首页链接替换分类\\nfunction indexUrl(param) {\\n function runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n }\\n let { RULE, pageNum, QING_TITLE } = JSON.parse(param.split('###')[1])\\n RULE = JSON.parse(base64Decode(RULE))\\n pageNum = parseInt(pageNum)\\n let url = RULE.url\\n\\n eval(JSON.parse(fetch('hiker://page/ClassTab?rule=' + QING_TITLE)).rule)\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"链接处理[二]*\",\"path\":\"url-processor\",\"rule\":\"/**\\n * 码云 Gitee 链接 https://github.jevons.vip/https://raw.githubusercontent.com/QQ1993HUANG/YMJ/main/阅动漫.json\\n */\\nfunction UrlProcessor() {\\n this.params = {}\\n this.regexMap = [\\n {\\n reg: '(vodtype|videot)\\\\\\\\/\\\\\\\\w+',\\n exec: () => {\\n return this.params.url\\n .replace(/-\\\\d+.html/, '-' + this.params.page + '.html')\\n .replace(/((vodtype|videot)\\\\/\\\\w+).html/, '$1-' + this.params.page + '.html')\\n }\\n },\\n {\\n reg: '\\\\\\\\/?[\\\\\\\\w\\\\\\\\d]+-.*?-.*?-.*?-.*?-.*?-.*?-.*?-\\\\\\\\d*---\\\\\\\\d*.html',\\n exec: () => {\\n return this.params.url\\n .replace(/\\\\d*(---.html)/, this.params.page + '$1')\\n .replace(/(---\\\\d+.html)/, this.params.page + '$1'); // 拼接页码\\n }\\n },\\n {\\n reg: '((\\\\\\\\/vod\\\\\\\\/show)?(\\\\\\\\/area\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?(\\\\\\\\/by\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?(\\\\\\\\/id\\\\\\\\/\\\\\\\\d+)?(\\\\\\\\/letter\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?)(\\\\\\\\/page\\\\\\\\/\\\\\\\\d+)?(\\\\\\\\/year\\\\\\\\/\\\\\\\\d+)?\\\\\\\\.html',\\n exec: () => {\\n let regExp = /((\\\\/vod\\\\/show)?(\\\\/area\\\\/[\\\\w\\\\d%]+)?(\\\\/by\\\\/[\\\\w\\\\d%]+)?(\\\\/id\\\\/\\\\d+)?(\\\\/letter\\\\/[\\\\w\\\\d%]+)?)(\\\\/page\\\\/\\\\d+)?(\\\\/year\\\\/\\\\d+)?\\\\.html/\\n return this.params.url\\n .replace(regExp, '$1' + (\\\"/page/\\\" + this.params.page) + '$8' + \\\".html\\\")\\n }\\n }\\n ]\\n}\\n\\nObject.assign(UrlProcessor.prototype, {\\n constructor: UrlProcessor,\\n checkParams() {\\n if (!this.params.url) {\\n throw new Error(\\\"请先调用 .baseUrl(url) 传入链接进行初始化!\\\")\\n }\\n if (!this.params.page) {\\n throw new Error(\\\"请先调用 .page(page) 传入页码进行初始化!\\\")\\n }\\n },\\n baseUrl(url){\\n this.params.url = url\\n return this\\n },\\n page(page){\\n this.params.page = page\\n return this\\n },\\n addExtra(regExp) {\\n if (regExp.constructor === Array) {\\n this.regexMap = this.regexMap.concat(regExp)\\n } else {\\n this.regexMap.push(regExp)\\n }\\n return this;\\n },\\n debug() {\\n this.params.debug = true\\n return this;\\n },\\n exec() {\\n this.checkParams()\\n let true_url = ''\\n for (let i = 0; i < this.regexMap.length; i++) {\\n let regObj = this.regexMap[i];\\n let urlExp = regObj.reg;\\n if (typeof urlExp === 'string') {\\n urlExp = new RegExp(urlExp)\\n }\\n if (urlExp.test(this.params.url)) {\\n if (this.params.debug) {\\n log(urlExp.toString())\\n }\\n true_url = regObj.exec();\\n break;\\n }\\n }\\n if (true_url) {\\n return true_url;\\n } else {\\n return this.params.url\\n }\\n },\\n 获取处理结果() {\\n return this.exec()\\n },\\n 链接(url) {\\n return this.baseUrl(url)\\n },\\n 页码(page) {\\n return this.page(page)\\n },\\n 插入新处理规则(regExp) {\\n return this.addExtra(regExp)\\n },\\n 调试模式() {\\n return this.debug();\\n }\\n})\\n$.exports=new UrlProcessor()\\n$.exports\\n\"},{\"col_type\":\"movie_3\",\"name\":\"动态[一]*\",\"path\":\"categories-header\",\"rule\":\"/**\\n * 本地网页插件链接 hiker://files/rules/js/categories-header.js\\n * 子页面链接 hiker://page/categories-header\\n * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2705\\n * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/categories-header.js\\n */\\n/**\\n * Object.assign 用法参考链接\\n *\\n * 1.https://www.daimajiaoliu.com/daima/47139a9e7100407\\n * 2.https://segmentfault.com/a/1190000011778875\\n * 3.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\\n */\\n// 利用 Symbol 实现私有变量和私有方法,外界不可访问(参考链接2)\\nconst symbolMap = {\\n // checkParams: Symbol('checkParams'),\\n mLayout: Symbol('mLayout'),\\n true_url: Symbol('true_url'),\\n mPage: Symbol('mPage'),\\n src: Symbol('src'),\\n ruleObjList: Symbol('ruleObjList'),\\n mFold: Symbol('mFold'),\\n mFoldInnerEnable: Symbol('mFoldInnerEnable'),\\n mFoldIndex: Symbol('mFoldIndex'),\\n mFoldLayout: Symbol('mFoldLayout'),\\n mColor: Symbol('mColor'),\\n mTag: Symbol('mTag'),\\n}\\n\\nfunction CategoriesHeader(color) {\\n // 'use strict';\\n // ...\\n // this[symbolMap.listRule] = []\\n // this[symbolMap.subListRule] = []\\n this[symbolMap.mColor] = color || \\\"#FA7298\\\";\\n this[symbolMap.ruleObjList] = []\\n this.VARMAP = {\\n CATEGORY: \\\"header.category\\\",\\n URL: \\\"header.url\\\",\\n FOLD: \\\"header.fold\\\",\\n }\\n this[symbolMap.mFoldLayout] = {\\n injectIndex: 1\\n }\\n this[symbolMap.mFoldIndex] = 1\\n}\\n\\nObject.assign(CategoriesHeader.prototype, {\\n // Override 构造方法,相当于 function.prototype.constructor = (...) => {...},new function() 的时候会自动执行\\n constructor: CategoriesHeader,\\n // 定义私有方法\\n VERSION: 202111301900,\\n checkParams() {\\n if (!this[symbolMap.mLayout]) {\\n throw new Error(\\\"请调用 layout(d) 传入当前界面\\\")\\n }\\n if (!this[symbolMap.true_url]) {\\n throw new Error(\\\"请调用 trueUrl(url) 传入当前分类的链接\\\")\\n }\\n if (!this[symbolMap.mPage]) {\\n throw new Error(\\\"请调用 page(mPage) 传入当前页数\\\")\\n }\\n if (this[symbolMap.ruleObjList].length < 1) {\\n throw new Error(\\\"请调用相关方法传入定位规则\\\")\\n }\\n if (!this[symbolMap.mFold]) {\\n this[symbolMap.mFold] = '0'\\n }\\n },\\n layout(mLayout) {\\n this[symbolMap.mLayout] = mLayout\\n return this\\n },\\n trueUrl(url) {\\n this[symbolMap.true_url] = url\\n return this\\n },\\n page(mPage) {\\n if (typeof (mPage) === 'string') {\\n mPage = parseInt(mPage)\\n }\\n this[symbolMap.mPage] = mPage\\n return this\\n },\\n html(mSrc) {\\n this[symbolMap.src] = mSrc\\n return this\\n },\\n list(rule) {\\n if (this[symbolMap.ruleObjList].length > 0) {\\n throw new Error(\\\"list(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n this[symbolMap.ruleObjList] = [{}]\\n this[symbolMap.ruleObjList][0].listRule = rule\\n this[symbolMap.ruleObjList][0]['一级分类'] = rule\\n return this\\n },\\n subList(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"subList(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].subListRule = rule\\n this[symbolMap.ruleObjList][0]['子分类'] = rule\\n return this\\n },\\n title(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"title(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].titleRule = rule\\n this[symbolMap.ruleObjList][0]['分类标题'] = this[symbolMap.ruleObjList][0].titleRule\\n return this\\n },\\n url(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"url(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].urlRule = rule\\n this[symbolMap.ruleObjList][0]['分类链接'] = this[symbolMap.ruleObjList][0].urlRule\\n return this\\n },\\n /**\\n * 是否开启折叠功能\\n *\\n * @param enabled true 表示开启,false 表示禁用\\n * @returns {CategoriesHeader}\\n */\\n foldInner(enabled) {\\n if (!(typeof (enabled) === 'boolean')) {\\n throw new Error(\\\"请传入 true 或 false 表示开启或关闭折叠功能!\\\")\\n }\\n this[symbolMap.mFoldInnerEnable] = enabled\\n return this\\n },\\n /**\\n * 从第 index 行开始折叠\\n *\\n * @param index 开始折叠的行数\\n * @returns {CategoriesHeader}\\n */\\n foldIndex(index) {\\n if (!(typeof (index) === 'number')) {\\n throw new Error(\\\"开始折叠行请传入数字!\\\")\\n }\\n if (index < 1) {\\n throw new Error(\\\"开始折叠行请传入大于 0 的整数!\\\")\\n }\\n this[symbolMap.mFoldIndex] = index || 1;\\n return this\\n },\\n /**\\n * 折叠按钮的界面\\n *\\n * @param layout 与 d.push 结构一致,\\n * 例:{ title:\\\"标题1\\\", url:\\\"xxx\\\", col_type:\\\"scroll_button\\\" };\\n * 参数采用可选覆盖模式,不写的参数则使用默认;\\n * 比如传入 { col_type:\\\"text_1\\\" },那最终结果就是 { title:\\\"标题1\\\", url:\\\"xxx\\\", col_type:\\\"text_1\\\" }\\n * @returns {CategoriesHeader}\\n */\\n foldLayout(layout) {\\n if (typeof layout === 'object') {\\n let keys = Object.keys(layout)\\n let injectIndex = layout.injectIndex || layout['折叠按钮插入行']\\n if (layout.title || layout.url || layout.col_type || injectIndex) {\\n for (let i = 0; i < keys.length; i++) {\\n const key = keys[i]\\n this[symbolMap.mFoldLayout][key] = layout[key];\\n }\\n } else {\\n throw new Error(\\\"请传入正确的折叠界面元素!\\\")\\n }\\n // injectIndex 折叠按钮插入第 injectIndex 行\\n if (injectIndex) {\\n if (!(typeof (injectIndex) === 'number')) {\\n throw new Error(\\\"折叠按钮插入行请传入数字!\\\")\\n }\\n if (injectIndex < 1) {\\n throw new Error(\\\"折叠按钮插入行请传入大于 0 的整数!\\\")\\n }\\n if (injectIndex > this[symbolMap.mFoldIndex]) {\\n throw new Error(\\\"折叠按钮插入行不得大于显示折叠行数!请调用 .foldIndex(index) 或 .第几行开始折叠(index) 传入正确的显示折叠行数\\\")\\n }\\n this[symbolMap.mFoldLayout].injectIndex = injectIndex || 1;\\n }\\n } else {\\n throw new Error(\\\"请传入正确的折叠界面元素!\\\")\\n }\\n return this;\\n },\\n // 当前是否折叠\\n fold(isFold) {\\n if (typeof (isFold) === 'string') {\\n isFold = isFold === '1'\\n }\\n if (isFold) {\\n this[symbolMap.mFold] = '1';\\n } else {\\n this[symbolMap.mFold] = '0';\\n }\\n return this\\n },\\n color(mColor) {\\n this[symbolMap.mColor] = mColor\\n return this\\n },\\n tag(mTag) {\\n this[symbolMap.mTag] = mTag\\n return this\\n },\\n add(ruleObj) {\\n // log($.stringify(ruleObj))\\n if (ruleObj.constructor === Array) {\\n this[symbolMap.ruleObjList] = this[symbolMap.ruleObjList].concat(ruleObj)\\n } else {\\n this[symbolMap.ruleObjList].push(ruleObj)\\n }\\n return this;\\n },\\n evalJSRule(item, jsRule) {\\n let rule = jsRule.replace(\\\"@js:\\\", \\\"\\\")\\n rule = rule.trim()\\n // log($.stringify(rule))\\n let input = item\\n if (rule.startsWith(\\\"(\\\")) {\\n eval('result = ' + rule)\\n } else {\\n /**\\n * 还原成 $.toString(...) 的最终结果,达到最终处理方式跟上面的 if 一致的目的\\n */\\n eval('result = ' + '(() => {' + rule + '})()')\\n }\\n return (result || '')\\n },\\n getTitle(src, category) {\\n let title = ''\\n let titleRule = category.titleRule || 'a&&Text'\\n if (titleRule.startsWith(\\\"@js:\\\")) {\\n title = this.evalJSRule(src, titleRule)\\n } else {\\n title = parseDomForHtml(src, titleRule)\\n }\\n return title || \\\"\\\";\\n },\\n getUrl(src, category) {\\n let url = ''\\n let urlRule = category.urlRule || 'a&&href'\\n if (typeof urlRule === 'object') {\\n let mUrlRule = urlRule.rule || urlRule['解析规则'] || 'a&&href';\\n if (mUrlRule.startsWith(\\\"@js:\\\")) {\\n url = this.evalJSRule(src, mUrlRule);\\n } else {\\n let parse = parseDom;\\n if (urlRule.parseOption) {\\n switch (urlRule.parseOption) {\\n case \\\"parseDom\\\":\\n case \\\"pd\\\":\\n parse = parseDom;\\n break;\\n case \\\"parseDomForHtml\\\":\\n case \\\"pdfh\\\":\\n parse = parseDomForHtml;\\n break;\\n default:\\n parse = parseDom;\\n }\\n } else if (urlRule[\\\"解析方法\\\"]) {\\n switch (urlRule[\\\"解析方法\\\"]) {\\n case \\\"parseDom\\\":\\n case \\\"pd\\\":\\n parse = parseDom;\\n break;\\n case \\\"parseDomForHtml\\\":\\n case \\\"pdfh\\\":\\n parse = parseDomForHtml;\\n break;\\n default:\\n parse = parseDom;\\n }\\n }\\n url = parse(src, mUrlRule);\\n }\\n if (urlRule.dealUrl) {\\n url = urlRule.dealUrl(url)\\n } else if (urlRule['二次处理']) {\\n url = urlRule['二次处理'](url)\\n }\\n } else {\\n if (urlRule.startsWith(\\\"@js:\\\")) {\\n url = this.evalJSRule(src, urlRule);\\n } else {\\n url = parseDom(src, urlRule);\\n }\\n }\\n return url || \\\"\\\";\\n },\\n build() {\\n // 检测是否传入需要的参数\\n this.checkParams()\\n // 每一个分类的唯一标识\\n let mTag = this[symbolMap.mTag] || \\\"\\\"\\n //翻页 需要根据实际替换\\n const html = this[symbolMap.src] || request(this[symbolMap.true_url])\\n const empty = \\\"hiker://empty\\\"\\n //获取列表\\n const categories = []\\n this[symbolMap.ruleObjList].map(ruleObj => {\\n let list = []\\n let listRule = ruleObj.listRule || ruleObj[\\\"一级分类\\\"]\\n if (listRule.startsWith(\\\"@js:\\\")) {\\n // log($.stringify(listRule))\\n list = this.evalJSRule(html, listRule)\\n } else {\\n list = parseDomForArray(html, listRule)\\n }\\n // log(list)\\n list.map(category => {\\n categories.push({\\n list: category,\\n subListRule: ruleObj.subListRule || ruleObj[\\\"子分类\\\"],\\n titleRule: ruleObj.titleRule || ruleObj[\\\"分类标题\\\"],\\n urlRule: ruleObj.urlRule || ruleObj[\\\"分类链接\\\"],\\n });\\n })\\n })\\n\\n // log($.stringify(categories))\\n\\n let init_cate = []\\n for (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\")\\n }\\n\\n const cate_temp_json = getMyVar(mTag + this.VARMAP.CATEGORY, JSON.stringify(init_cate))\\n const cate_temp = JSON.parse(cate_temp_json)\\n\\n if (this[symbolMap.mPage] === 1) {\\n\\n categories.forEach((category, index) => {\\n\\n // 折叠 UI\\n if (this[symbolMap.mFoldInnerEnable] && this[symbolMap.mFoldLayout].injectIndex === (index+1)) {\\n let foldLayout = {\\n title: this[symbolMap.mFoldLayout].title || (this[symbolMap.mFold] === '1' ? '““””<b><span style=\\\"color: #FF0000\\\">∨</span></b>' : '““””<b><span style=\\\"color: #1aad19\\\">∧</span></b>'),\\n url: this[symbolMap.mFoldLayout].url || $(\\\"hiker://empty#noHistory#\\\").lazyRule((params) => {\\n putMyVar(params.mTag + params.VARMAP.FOLD, getMyVar(params.mTag + params.VARMAP.FOLD, params.isFold) === '1' ? '0' : '1')\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, {\\n mTag: mTag,\\n isFold: this[symbolMap.mFold],\\n VARMAP: this.VARMAP\\n }),\\n col_type: this[symbolMap.mFoldLayout].col_type || \\\"scroll_button\\\",\\n }\\n this[symbolMap.mLayout].push(foldLayout)\\n }\\n\\n //具体列表下的分类\\n let sub_categories = [];\\n if (category.subListRule.startsWith(\\\"@js:\\\")) {\\n sub_categories = this.evalJSRule(category.list, category.subListRule)\\n } else {\\n sub_categories = parseDomForArray(category.list, category.subListRule);\\n }\\n if (index < (this[symbolMap.mFoldIndex] || 1)) {\\n sub_categories.forEach((item, key) => {\\n let title = this.getTitle(item, category)\\n let url = this.getUrl(item, category)\\n\\n this[symbolMap.mLayout].push({\\n title: key.toString() === cate_temp[index] ? '““””<b><font color=' + this[symbolMap.mColor] + '>' + title + ' </font></b>' : title,\\n url: $(url).lazyRule((params) => {\\n let new_cate = []\\n if (params.index === 0) {\\n params.cate_temp.forEach((cate, index) => {\\n new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n });\\n } else {\\n params.cate_temp[params.index] = params.key.toString()\\n }\\n putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.index === 0 ? new_cate : params.cate_temp))\\n putMyVar(params.tag + params.VARMAP.URL, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n VARMAP: this.VARMAP,\\n tag: mTag,\\n key: key,\\n page: this[symbolMap.mPage],\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n this[symbolMap.mLayout].push({\\n col_type: \\\"blank_block\\\"\\n });\\n } else if (this[symbolMap.mFold] === '0') {\\n sub_categories.forEach((item, key) => {\\n let title = this.getTitle(item, category)\\n let url = this.getUrl(item, category)\\n\\n this[symbolMap.mLayout].push({\\n title: key.toString() === cate_temp[index] ? '““””<b><font color=' + this[symbolMap.mColor] + '>' + title + ' </font></b>' : title,\\n url: $(url).lazyRule((params) => {\\n params.cate_temp[params.index] = params.key.toString()\\n\\n putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.cate_temp))\\n putMyVar(params.tag + params.VARMAP.URL, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n VARMAP: this.VARMAP,\\n tag: mTag,\\n key: key,\\n page: this[symbolMap.mPage],\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n this[symbolMap.mLayout].push({\\n col_type: \\\"blank_block\\\"\\n });\\n }\\n });\\n }\\n },\\n\\n 界面(layout) {\\n return this.layout(layout)\\n },\\n 分类链接(trueUrl) {\\n return this.trueUrl(trueUrl);\\n },\\n 页码(page) {\\n return this.page(page);\\n },\\n 源码(html) {\\n return this.html(html);\\n },\\n 定位一级分类(list) {\\n return this.list(list);\\n },\\n 定位子分类(subList) {\\n return this.subList(subList);\\n },\\n 定位分类标题(title) {\\n return this.title(title);\\n },\\n 定位分类链接(url) {\\n return this.url(url);\\n },\\n 开启内置折叠功能() {\\n return this.foldInner(true);\\n },\\n 关闭内置折叠功能() {\\n return this.foldInner(false);\\n },\\n 第几行开始折叠(index) {\\n return this.foldIndex(index);\\n },\\n 折叠按钮样式(layout) {\\n return this.foldLayout(layout)\\n },\\n 折叠(fold) {\\n return this.fold(fold);\\n },\\n 选中的分类颜色(color) {\\n return this.color(color);\\n },\\n 唯一标识(mTag) {\\n return this.tag(mTag)\\n },\\n 添加分类定位(ruleObj) {\\n return this.add(ruleObj);\\n },\\n 开始打造分类() {\\n return this.build();\\n },\\n\\n})\\n$.exports = new CategoriesHeader();\\n$.exports\"},{\"col_type\":\"movie_3\",\"name\":\"动态[二]*\",\"path\":\"dtfl\",\"rule\":\"const empty = \\\"hiker://empty\\\"\\n\\nif (typeof(拼接分类) != 'undefined' && 拼接分类 != '') {\\n var categories = pdfa(html, 大类定位).concat(pdfa(html, 拼接分类))\\n} else {\\n var categories = pdfa(html, 大类定位)\\n}\\n\\nlet init_cate = []\\n\\nfor (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\")\\n}\\n\\nconst fold = getMyVar(MY_RULE.group, \\\"0\\\")\\nconst cate_temp_json = getMyVar(MY_RULE.title, JSON.stringify(init_cate))\\nconst cate_temp = JSON.parse(cate_temp_json)\\n\\nif (parseInt(page) === 1) {\\n d.push({\\n title: fold === '1' ? '““””<b>' + '∨'.fontcolor(\\\"#FF0000\\\") + '</b>' : '““””<b>' + '∧'.fontcolor(\\\"#1aad19\\\") + '</b>',\\n url: $().lazyRule((fold) => {\\n putMyVar(MY_RULE.group, fold === '1' ? '0' : '1');\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, fold),\\n col_type: 'scroll_button',\\n })\\n categories.forEach((category, index) => {\\n let sub_categories = pdfa(category, 小类定位);\\n if (index === 0) {\\n sub_categories.forEach((item, key) => {\\n let title = pdfh(item, 分类标题)\\n if (typeof(排除) != 'undefined' && 排除 != '') {\\n title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n }\\n d.push({\\n title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n let new_cate = []\\n params.cate_temp.forEach((cate, index) => {\\n new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n })\\n putMyVar(MY_RULE.title, JSON.stringify(new_cate))\\n putMyVar(MY_RULE.url, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n key: key,\\n page: page,\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n d.push({\\n col_type: \\\"blank_block\\\"\\n });\\n } else if (fold === '1') {\\n sub_categories.forEach((item, key) => {\\n let title = pdfh(item, 分类标题)\\n if (typeof(排除) != 'undefined' && 排除 != '') {\\n title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n }\\n d.push({\\n title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n params.cate_temp[params.index] = params.key.toString()\\n\\n putMyVar(MY_RULE.title, JSON.stringify(params.cate_temp))\\n putMyVar(MY_RULE.url, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n key: key,\\n page: page,\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n d.push({\\n col_type: \\\"blank_block\\\"\\n });\\n }\\n })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"图片解密*\",\"path\":\"imgDES\",\"rule\":\"$.exports.imgDecrypt = function() {\\n var javaImport = new JavaImporter();\\n javaImport.importPackage(\\n Packages.com.example.hikerview.utils,\\n Packages.java.lang,\\n Packages.java.security,\\n Packages.java.util,\\n Packages.java.io,\\n Packages.java.text,\\n Packages.javax.crypto,\\n Packages.javax.crypto.spec\\n );\\n with(javaImport) {\\n let bytes = FileUtil.toBytes(input);\\n function decryptData(bArr) {\\n var generateSecret = SecretKeyFactory.getInstance(\\\"desede\\\").generateSecret(new DESedeKeySpec(String('OW84U8Eerdb99rtsTXWSILDO').getBytes()));\\n var cipher = Cipher.getInstance(\\\"desede/CBC/PKCS5Padding\\\");\\n cipher.init(2, generateSecret, new IvParameterSpec(String('SK8bncVu').getBytes()));\\n return cipher.doFinal(bArr);\\n }\\n //decryptData为解密方法\\n bytes = decryptData(bytes);\\n return FileUtil.toInputStream(bytes);\\n }\\n\\n}\"}]","proxy":"","icon":"https://img.vinua.cn/images/vkhRw.jpeg"},{"last_chapter_rule":"js:\neval(fetch('hiker://files/rules/xyq/zywcj.js'));chapter();","title":"资源网采集.xyq","author":"香雅情","version":2,"type":"other","url":"hiker://files/rules/xyq/ZYWCJ.txt","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\neval(fetch('hiker://files/rules/xyq/zywcj.js'));zywhm();","searchFind":"js:\neval(fetch('hiker://files/rules/xyq/zywcj.js'));zywsea();","search_url":"hiker://$$$?wd=**&pg=1&ac=list$$$fypage","titleColor":"","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"js:\r\neval(fetch('hiker://files/rules/xyq/zywcj.js',{}));\nTWEJ();","sdetail_col_type":"movie_1","sdetail_find_rule":"js:\neval(fetch('hiker://files/rules/xyq/zywcj.js'));zywerj();","ua":"mobile","preRule":"function uprulefile() {\n try {\n let jiasu = 'https://github.moeyy.xyz/';\n var ruletxt = fetch(jiasu + 'https://raw.githubusercontent.com/xyq254245/HikerRule/main/ZYWCJ.txt', {});\n var rulejs = fetch(jiasu + 'https://raw.githubusercontent.com/xyq254245/HikerRule/main/zywcj.js', {});\n } catch (e) {\n rulejs = \"\";\n ruletxt = \"\";\n }\n if (rulejs.search(/lazyRule/) != -1) {\n writeFile(\"hiker://files/rules/xyq/zywcj.js\", rulejs);\n writeFile(\"hiker://files/rules/xyq/ZYWCJ.txt\", ruletxt);\n } else {\n setError('规则文件获取失败,可能网络有问题。')\n };\n};\n\n//检测是否有规则与JS文件\nif (fileExist(\"hiker://files/rules/xyq/zywcj.js\") && fileExist(\"hiker://files/rules/xyq/ZYWCJ.txt\")) {\n //执行预处理\n var lac = fetch('hiker://files/rules/xyq/zywcj.js');\n if(lac.includes('codeberg')){\n writeFile(\"hiker://files/rules/xyq/zywcj.js\", fetch('https://github.moeyy.xyz/https://raw.githubusercontent.com/xyq254245/HikerRule/main/zywcj.js', {}));\n }\n if (lac.search(/lazyRule/) != -1) {\n eval(lac);\n if (filter(base64Decode('VklQ'))) {\n zywpre();\n } else {\n uprulefile();\n };\n } else {\n //如果本地文件不对将尝试自修复\n uprulefile();\n eval(fetch('hiker://files/rules/xyq/zywcj.js'));\n zywpre();\n };\n} else {\n uprulefile();\n //执行预处理\n eval(fetch('hiker://files/rules/xyq/zywcj.js'));\n zywpre();\n};","pages":"[]","proxy":"","icon":"https://codeberg.org/lzk23559/PublicRule/raw/branch/master/zywcj.png"},{"last_chapter_rule":"","title":"阅漫君","author":"小米粥&团子&众位大佬","version":89,"type":"cartoon","url":"hiker://empty","col_type":"icon_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '@'),\n types = {\n 'cartoon': '🔮漫画',\n 'other': '✈️梯子',\n 'all': '🌱优质动漫',\n 'music': '💽音乐',\n 'live': '🎛直播',\n 'read': '📙书',\n 'picture': '📚图片',\n 'news': '🚫无搜索',\n 'tool': '📥下载'\n }\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 阅漫君🌱设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img:\n'https://img.vinua.cn/images/vkhRw.jpeg',\n col_type: 'avatar',\n extra: {\n version: MY_RULE.version\n }\n }, {\n desc: '0',\n url: 'hiker://page/Main.view?rule=本地资源管理',\n img: 'https://img.vinua.cn/images/vkhRw.jpeg',\n col_type: 'card_pic_1'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '倾君之言,阅水天一色~~阅漫君',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow);\n let yux=\"yux\"+Date.now();\n let el = $.toString((QING_TITLE, yux) => {\n let {\n hijackEl\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\n QING_TITLE:QING_TITLE,\n isIndex: $.hiker[yux],\n MY_RULE:MY_RULE\n })\n\n $.hiker.setResult = function(param0, param1, param2, param3) {\n param1 = CALLBACK_KEY\n param2 = MY_RULE\n param3 = MY_TYPE\n if (Array.isArray(param0.data)) param0 = param0.data\n param0 = param0.map(hijackEl);\n method_setResult.invoke(javaContext, param0, param1, param2, param3)\n }\n $.hiker.setHomeResult = setResult\n $.hiker.setSearchResult = setResult\n }, QING_TITLE, yux);\n rules = rules.map((v,i)=> {\n if (v.searchFind.startsWith('js:')) {\n v.searchFind = \"js:$.hiker.\"+yux+\"=\"+i+\";\" + el + \";\" + v.searchFind.slice(3);\n }\n return v;\n });\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE),\n rulesType = rules.reduce((obj, v) => {\n let type = v.type\n if (type) {\n if (!Array.isArray(obj[type]))\n obj[type] = []\n obj[type].push(v)\n }\n return obj\n }, {})\nif (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n}\nel.push({\n img: 'https://img.vinua.cn/images/vkhRw.jpeg',\n title: '收藏',\n url: \"hiker://collection?group=阅漫君\",\n col_type: \"icon_2\"\n}, {\n img: 'https://img.vinua.cn/images/vkhRw.jpeg',\n title: '历史',\n url: \"hiker://history\",\n col_type: \"icon_2\"\n})\nel.push(typeShow[0] == '@' ? {\n title: '““””' + ('全部' + (typeShow[1] ? '[' + typeShow.slice(1) + ']' : '')).bold().fontcolor('#12b668') + ' ' + (rules.length).toString().small(),\n url: $(typeShow.slice(5), '查找小程序关键词').input(() => {\n putMyVar('typeShow', '@' + input)\n refreshPage(false)\n return 'hiker://empty'\n }),\n col_type: 'scroll_button'\n} : {\n title: '““””全部 ' + (rules.length).toString().small(),\n url: $('#noLoading#').lazyRule(() => {\n putMyVar('typeShow', '@')\n refreshPage(false)\n return 'toast://再次点击【全部】可查找小程序'\n }),\n col_type: 'scroll_button'\n})\n\nfor (let k in types)\n if (k in rulesType)\n el.push({\n title: '““””' + (k == typeShow ? types[k].bold().fontcolor('#12b668') : types[k]) + ' ' + (rulesType[k].length).toString().small(),\n url: k == typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\nif (getItem(\"read_policy\") !== \"1\") {\n el.push({\n title: '““””<small><font color=#871f78>以下数据源于网络,请支持官方!</font></small>',\n desc: '““””<small><font color=#f20c00>本规则道长仓库作者:小小(小米粥)修改,已授权接手团子大佬的聚漫,仅限免费学习交流使用,请于导入后24小时内删除,任何组织或个人不得以任何方式方法传播或售卖此规则的整体或部分!本程序代码来源于网络,有能力请支持官方</font></small>',\n url: $('#noHistory#').lazyRule(() => {\n setItem(\"read_policy\", \"1\")\n refreshPage(false)\n return \"toast://你已同意该协议\"\n }),\n col_type: 'text_center_1'\n })\n}\n\nif (getItem(\"data\") !== \"1\") {\n url = getMyVar('remoteUrl')\n el.push({\n title: '““””<small><font color=#871f78>点击获取漫画源</font></small>',\n url: $('#noHistory#').lazyRule((url) => {\n setItem(\"data\", \"1\")\n\n requireDownload('https://ghproxy.net/https://raw.githubusercontent.com/QQ1993HUANG/A/main/阅漫君.json', url)\n back(false)\n refreshPage(true)\n return \"toast://数据已获取\"\n }, url),\n col_type: 'text_center_1'\n })\n}\nif (typeShow[0] != '@') rules = rulesType[typeShow]\nlet { paramHandle } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {})\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/^https?:\\/\\/[^/?#]+/i.exec(ruleTmp.url) || ['hiker://empty'])[0],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + fypage +\n '.js:let { runCode, indexUrl } = $.require(\"hiker://page/funcTools??rule=' + QING_TITLE + '\", '\n + JSON.stringify({\n MY_RULE: base64Encode(JSON.stringify(ruleTmp)),\n QING_TITLE: QING_TITLE\n }) + ');;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: base64Encode(JSON.stringify({ title: v.title })),\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n})\nsetResult(el)","searchFind":"js:\nsetResult([{\n title: \"点我开始阅漫君•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '@')\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\n if (typeShow[0] == '@') {\n let filterKey = typeShow.slice(1)\n if (filterKey) rules = rules.filter((v) => v.title.includes(filterKey))\n } else rules = rules.filter((v) => v.type == typeShow);\n let yux=\"yux\"+Date.now();\n let el = $.toString((QING_TITLE, yux) => {\n let {\n hijackEl\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\n QING_TITLE:QING_TITLE,\n isIndex: $.hiker[yux],\n MY_RULE:MY_RULE\n })\n\n $.hiker.setResult = function(param0, param1, param2, param3) {\n param1 = CALLBACK_KEY\n param2 = MY_RULE\n param3 = MY_TYPE\n if (Array.isArray(param0.data)) param0 = param0.data\n param0 = param0.map(hijackEl);\n method_setResult.invoke(javaContext, param0, param1, param2, param3)\n }\n $.hiker.setHomeResult = setResult\n $.hiker.setSearchResult = setResult\n }, QING_TITLE, yux);\n rules = rules.map((v,i)=> {\n if (v.searchFind.startsWith('js:')) {\n v.searchFind = \"js:$.hiker.\"+yux+\"=\"+i+\";\" + el + \";\" + v.searchFind.slice(3);\n }\n return v;\n });\n return JSON.stringify(rules)\n })\n }\n}])\n","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"putMyVar('myCollection', MY_RULE.title)\nputMyVar('remoteUrl', 'https://ghproxy.net/https://raw.githubusercontent.com/QQ1993HUANG/A/main/阅漫君.json')\n// \n/*\n*/","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"var {\\n QING_TITLE, title, url,\\n class_name, class_url,\\n area_name, area_url,\\n year_name, year_url,\\n sort_name, sort_url\\n} = $.importParam\\nconst ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('$fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('$fold_' + sign, folded ? '' : 'T')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nlet fyAll = url.includes('fyAll'),\\n tabHeader = []\\nif (class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: class_name,\\n class_url: class_url\\n})\\nif (area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: area_name,\\n class_url: area_url\\n})\\nif (year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: year_name,\\n class_url: year_url\\n})\\nif (sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: sort_name,\\n class_url: sort_url\\n})\\n$.exports = {\\n fyAll: fyAll,\\n tabHeader: new ClassTab(tabHeader, { name: title, fold: readFile('tabFold'), })\\n}\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()')\\nsetPageTitle('⚙ 阅漫君设置 ⚙')\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE, true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,没事别点,可每月点一次更新)',\\n url: $(\\\"清除缓存,立即更新\\\").confirm((url) => {\\n //远程依赖索引文件代理地址列表\\n let requirelist = ['https://ghproxy.net/https://raw.githubusercontent.com/QQ1993HUANG/A/main/']\\n for (let i = 0; i < requirelist.length; i++) {\\n try { //远程依赖索引\\n let res = request(requirelist[i] + 'QQ1993HUANG/A/main', {\\n withStatusCode: true\\n })\\n if (JSON.parse(res).statusCode == 200) {\\n if (fileExist(url)) {\\n deleteFile(url)\\n requireDownload(requirelist[i] + 'QQ1993HUANG/A/main',url)\\n break\\n } else {\\n requireDownload(requirelist[i] + 'QQ1993HUANG/A/main',url)\\n break\\n }\\n }\\n } catch (e) {}\\n }\\n refreshPage(true)\\n back(false)\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用')\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if (Number.isNaN(input)) input = 1\\n else if (input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : 'T')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if (url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if (rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:团子/墙佬/道长/ 小程序维护:小米粥\\\\n'\\n /*data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、')*/,\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\nel.push({\\n title: \\\"更新&反馈\\\",\\n url: \\\"hiker://page/Up#noRefresh##noRecordHistory##noHistory#\\\",\\n extra: {\\n version: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\"\\n },\\n col_type: \\\"text_center_1\\\"\\n});\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 阅漫君自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据', '编辑JSON'], 1).select(() => {\\n switch (input.slice(0, 2)) {\\n case '清除':\\n deleteFile('customData')\\n break\\n case '启用':\\n saveFile('disableCustom', '')\\n break\\n case '禁用':\\n saveFile('disableCustom', 'T')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n break\\n case '编辑':\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://files/') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n return 'hiker://page/interface#noRefresh##noHistory##noRecordHistory#?rule=JSON编辑器&Json='+base64Encode(url)\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});/*\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif (editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let data = $.require('hiker://page/dataLoad?rule=' + getMyVar('myCollection'), true)\\n return 'rule://' + base64Encode(JSON.stringify(data[i]))\\n }, i)\\n break\\n }\\n el.push(d)\\n})*/\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif(editMode === '导入海阔') {\\n el.push({\\n title:'搜索',\\n desc:'输入小程序标题|地址进行搜索...',\\n url:$.toString(()=>{\\n refreshPage(false);\\n }),\\n col_type:'input',\\n extra: {\\n onChange: \\\"putMyVar('importSearchKey',input)\\\",\\n titleVisible: true,\\n defaultValue:getMyVar('importSearchKey','')\\n },\\n });\\n el.push({\\n title: '全部导入(非搜索过滤后结果)',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: {lineVisible: false}\\n });\\n}\\nvar datas = (disableCustom ? data : JSON.parse(readFile('customData') || '[]'));\\nlet sk = getMyVar('importSearchKey','');\\nif(editMode === '导入海阔'&&sk) {\\n datas = datas.filter(it=>it.title.includes(sk)||(it.url&&it.url.includes(sk)));\\n data = data.filter(it=>it.title.includes(sk)||(it.url&&it.url.includes(sk)));\\n}\\ndatas.forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = 'rule://' + base64Encode(JSON.stringify(data[i]));\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nvar myColl_el = []\\neval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(oriRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n} else if (MY_PAGE == 1) {\\n tabHeader.load(myColl_el)\\n if (RULE.search_url) myColl_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"这是阅漫君的搜索哦~~\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n}\\n// 正文解析\\nvar {\\n paramHandle,\\n runPreRule,\\n genExUrl,\\n hijackLazyRule\\n} = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\nrunPreRule(oriRULE.preRule)\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n let { hijackEl } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n setResult = function(param0, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(param0.data)) param0 = param0.data\\n Array.prototype.push.apply(myColl_el, param0.map(hijackEl))\\n method_setResult.invoke(javaContext, myColl_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let { runCode } = $.require('hiker://page/funcTools?rule=' + QING_TITLE),\\n [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(Object.assign(genMyRule(), { detail_find_rule: detailFindRule }))),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: base64Encode(JSON.stringify(genMyRule())),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myColl_el.push(res)\\n })\\n setResult(myColl_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"let showAll = $.importParam,\\n url = getMyVar('remoteUrl'),\\n data = []\\nif (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n} else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if (interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, { timeout: 50000 })) } catch (e) {}\\n if (!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n}\\ndata = data.filter((v) => v.title != getMyVar('myCollection') && !(v.author || '').includes('阅漫君生成器'))\\nif (readFile('disableCustom')) $.exports = data\\nelse { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n $.exports = rewriteData.concat(data)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"链接处理*\",\"path\":\"urlParse\",\"rule\":\"// 首页链接替换分类\\nfunction indexUrl(param) {\\n function runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n }\\n let { RULE, pageNum, QING_TITLE } = JSON.parse(param.split('###')[1])\\n RULE = JSON.parse(base64Decode(RULE))\\n pageNum = parseInt(pageNum)\\n let url = RULE.url\\n\\n eval(JSON.parse(fetch('hiker://page/ClassTab?rule=' + QING_TITLE)).rule)\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级[一]*\",\"path\":\"ejtool\",\"rule\":\"function cover(标题, 作者, 分类, 状态, 章节, 更新, 简介,封面图片,true_url, hasLine) {\\r\\nvar 标题, 作者, 分类, 状态, 章节, 更新, 简介,封面图片,true_url, hasLine;\\r\\n\\ttry {\\r\\n\\t\\td.push({\\r\\n\\t\\t\\ttitle: '‘‘’’<small><font color=\\\"#FA7298\\\">'+作者.slice(0,15)+\\\"&nbsp;\\\"+状态+'</font></small>'+'‘‘’’<small><font color=\\\"#B15BFF\\\">'+\\\"\\\\n\\\"+分类+'</font></small>'+'‘‘’’<small><font color=\\\"#FF359A\\\">'+\\\"\\\\n\\\"+章节+\\\"&nbsp;\\\"+更新+'</font></small>',\\r\\n\\t\\t\\tdesc:'‘‘’’<small>' +简介+ '</small>',\\r\\n\\t\\t\\tpic_url: 封面图片,\\r\\n\\t\\t\\turl: true_url,\\r\\n\\t\\t\\tcol_type: 'movie_1_vertical_pic_blur'\\r\\n\\t\\t});\\n\\t\\td.push({\\r\\n\\t\\t\\tcol_type: 'line_blank',\\r\\n\\t\\t});\\n\\t\\td.push({\\r\\n\\t\\t\\tcol_type: 'line',\\r\\n\\t\\t});\\r\\n\\t\\tif (hasLine) {\\r\\n\\t\\t\\titem.extra = {\\r\\n\\t\\t\\t\\tlineVisible: false\\r\\n\\t\\t\\t}\\r\\n\\t\\t}\\r\\n\\t\\td.push(item);\\r\\n\\t} catch (e) {}\\r\\n}\\r\\nfunction chapter(title,pic_url,chapterList, chapterTitle, chapterUrl, defaultOrder, hasLine,downloadlazy) {\\r\\n\\tvar list = chapterList;\\r\\n\\tvar original = [{\\r\\n\\t\\turl: MY_URL,\\r\\n\\t\\torder: defaultOrder\\r\\n\\t}];\\r\\n\\t!fileExist('hiker://files/rules/comic/comicLogFile.js') ? (writeFile('hiker://files/rules/comic/comicLogFile.js', JSON.stringify(original))) : 0;\\r\\n\\tvar log = JSON.parse(fetch('hiker://files/rules/comic/comicLogFile.js'));\\r\\n\\tfor (var i in log) {\\r\\n\\t\\tif (log[i].url == MY_URL) {\\r\\n\\t\\t\\tvar now = i;\\r\\n\\t\\t\\tvar order = log[i].order;\\r\\n\\t\\t\\tbreak;\\r\\n\\t\\t} else {\\r\\n\\t\\t\\tvar now = '';\\r\\n\\t\\t\\tvar order = defaultOrder;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\tlet orderItem = {\\r\\n\\t\\ttitle: \\\"““””\\\" + '<strong><font color=\\\"#098AC1\\\">' + '章节排序⇅' + '</font></strong>',\\r\\n\\t\\turl: MY_URL + `@lazyRule=.js:var log = JSON.parse(fetch('hiker://files/rules/comic/comicLogFile.js'));var now='` + now + `';if(now!=''){var now=parseInt(now);var order=log[now].order}else{var now=parseInt(log.length);var order=` + defaultOrder + `;log.push({url:input,order:order});}if(log[now].order){log[now].order=0;}else{log[now].order=1;};writeFile('hiker://files/rules/comic/comicLogFile.js', JSON.stringify(log));refreshPage();'hiker://empty'`,\\r\\n\\t\\tcol_type: 'text_2'\\r\\n\\t}\\r\\n\\tif (hasLine) {\\r\\n\\t\\torderItem.title = \\\"““””\\\" + '<strong><font color=\\\"#098AC1\\\">' + '集数排序⇅' + '</font></strong>';\\r\\n\\t\\torderItem.col_type = \\\"text_2\\\"\\r\\n\\t}\\r\\n\\tlet chapterLists = list.map((item)=>({\\r\\n\\t\\ttitle: pdfh(item,\\\"a&&Text\\\"),\\r\\n\\t\\turl: pd(item,\\\"a&&href\\\"),\\r\\n\\t}));\\r\\nd.push({\\r\\n\\ttitle: '‘‘’’<strong><font color= \\\"#098AC1\\\">' + \\\"下载漫画\\\" + '</front></strong>',\\r\\n\\turl: \\\"hiker://page/download.view#noHistory##noRecordHistory##noRefresh#?rule=本地资源管理\\\",\\r\\n\\tcol_type: \\\"text_2\\\",\\r\\n\\textra: {\\r\\n\\t\\tchapterList: chapterLists,\\r\\n\\t\\tinfo:{\\r\\n\\t\\t\\tbookName: title,\\r\\n\\t\\t\\truleName: MY_RULE.title,\\r\\n\\t\\t\\tbookTopPic: pic_url,\\r\\n\\t\\t\\tparseCode: downloadlazy\\r\\n\\t\\t},\\r\\n\\t\\tdefaultView:\\\"1\\\"\\r\\n\\t}\\r\\n});\\r\\n\\td.push({\\r\\n\\t\\ttitle: '‘‘’’<strong><font color= \\\"#098AC1\\\">' + \\\"本地书架\\\" + '</front></strong>',\\r\\n\\t\\turl: \\\"hiker://page/Main.view?rule=本地资源管理\\\",\\r\\n\\t\\tcol_type: \\\"text_2\\\",\\r\\n\\t}); \\r\\n\\td.push(orderItem);\\r\\n\\td.push({col_type: 'line'});\\t\\r\\n\\tvar list = order ? list : list.reverse();\\n\\tif(!list||list==\\\"\\\"){\\r\\n\\t\\td.push({\\r\\n\\t\\t\\ttitle: '此漫画已下架!!',\\r\\n\\t\\t\\tcol_type: 'text_center_1',\\r\\n\\t\\t});\\r\\n\\t}\\r\\n\\tfor (var i in list) {\\r\\n\\t\\ttry {\\r\\n\\t\\t\\td.push({\\r\\n\\t\\t\\t\\ttitle: pdfh(list[i], chapterTitle),\\r\\n\\t\\t\\t\\turl: pd(list[i], chapterUrl) + lazy,\\r\\n\\t\\t\\t\\tcol_type: 'text_2',\\r\\n\\t\\t\\t});\\r\\n\\t\\t}catch (e) {}\\r\\n\\t}\\r\\n}\\r\\n\\r\\nfunction line(lineList, lineTitleRule, varKey) {\\r\\n\\tlet list = lineList\\r\\n\\tvarKey = varKey == null ? (MY_RULE.url + '#line-index'): varKey;\\r\\n\\taddListener('onClose', $.toString((keyList) => {\\r\\n\\t\\tfor (let i in keyList) {clearVar(keyList[i])}\\r\\n\\t}, [varKey, MY_RULE.title + '#line-title']))\\r\\n\\tlet line0Title = '';\\r\\n\\ttry {\\r\\n\\t\\tline0Title = pdfh(list[0], lineTitleRule).replace(\\\"章节列表:\\\",\\\"\\\");\\r\\n\\t} catch (e) {}\\r\\n\\tlog(MY_RULE.title + getMyVar((MY_RULE.title + '#line-title')))\\r\\n\\tfor (let i in list) {\\r\\n\\t\\ttry {\\r\\n\\t\\t\\tlet lineTitle = pdfh(list[i], lineTitleRule).replace(\\\"章节列表:\\\",\\\"\\\");\\r\\n\\t\\t\\td.push({\\r\\n\\t\\t\\t\\ttitle: getMyVar((MY_RULE.title + '#line-title'), line0Title) === lineTitle ? \\\"切换:‘‘\\\" + lineTitle+\\\"\\\":lineTitle+\\\"‘‘:切换\\\",\\r\\n\\t\\t\\t\\turl: $().lazyRule((varKey, lineIndex, lineTitle) => {\\r\\n\\t\\t\\t\\t\\tputMyVar(varKey, lineIndex.toString());\\r\\n\\t\\t\\t\\t\\tputMyVar((MY_RULE.title + '#line-title'), lineTitle);\\r\\n\\t\\t\\t\\t\\tlog(MY_RULE.title + getMyVar((MY_RULE.title + '#line-title')));\\r\\n\\t\\t\\t\\t\\trefreshPage();\\r\\n\\t\\t\\t\\t\\treturn \\\"toast://已切换至\\\" + lineTitle;\\r\\n\\t\\t\\t\\t}, varKey, i, lineTitle),\\r\\n\\t\\t\\t\\tcol_type: 'text_2',\\r\\n\\t\\t\\t});\\r\\n\\t\\t} catch (e) {}\\r\\n\\t}\\r\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级[二]*\",\"path\":\"comicFunctionFile.js\",\"rule\":\"function cover(coverTitle, coverTitle1, coverTitle2, coverTitle3, coverDesc, coverPic, coverUrl, hasLine) {\\n try {\\n const Color = \\\"#19B89D\\\";\\n var des_desc = pdfh(html, coverDesc).replace('简  介:', '').replace('漫画简介:', '');\\n d.push({\\n title: '‘‘’’<><font color=\\\"#FA7298\\\">' + pdfh(html, coverTitle) + '\\\\n' + '‘‘’’<><font color=\\\"#734338\\\">' + pdfh(html, coverTitle1) + '\\\\n',\\n desc: '‘‘’’<><font color=\\\"#954A45\\\">' + pdfh(html, coverTitle2) + '\\\\n' + '‘‘’’<><font color=\\\"#954A45\\\">' + pdfh(html, coverTitle3),\\n pic_url: pd(html, coverPic)||coverPic,\\n url: 'hiker://search?s='+MY_PARAMS.ytitle+'&rule=阅漫君',\\n col_type: 'movie_1_vertical_pic_blur'\\n });\\n d.push({\\n col_type: 'line'\\n });\\n //var jj = getMyVar(\\\"jjs\\\", \\\"收起\\\");\\n //var jjurl = 'hiker://empty@lazyRule=.js:getMyVar(\\\"jjs\\\") == \\\"收起\\\"?putMyVar(\\\"jjs\\\",\\\"展开\\\"):putMyVar(\\\"jjs\\\",\\\"收起\\\");\\\"hiker://empty\\\"';\\n d.push({\\n title: '简介 <small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>',\\n img: \\\"https://lanmeiguojiang.com/tubiao/more/197.png\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((jjid, decid, des_desc) => {\\n if (getMyVar(\\\"jjs\\\", \\\"收起\\\") == \\\"收起\\\") {\\n putMyVar(\\\"jjs\\\", \\\"展开\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '简介 <small><small><span style=\\\"color:#19B89D\\\">收起></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc + '...</span>'\\n })\\n return \\\"hiker://empty\\\"\\n } else {\\n putMyVar(\\\"jjs\\\", \\\"收起\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '简介 <small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 30) + '...</span>'\\n })\\n return \\\"hiker://empty\\\"\\n }\\n\\n }, MY_RULE + \\\"_jjid\\\", MY_RULE + \\\"_decid\\\", des_desc),\\n col_type: \\\"avatar\\\",\\n extra: {\\n id: MY_RULE + \\\"_jjid\\\"\\n }\\n });\\n\\n d.push({\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 30) + '...</span>',\\n col_type: \\\"rich_text\\\",\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: MY_RULE + \\\"_decid\\\"\\n }\\n });\\n d.push({\\n col_type: 'line'\\n })\\n d.push({\\n col_type: 'line'\\n })\\n } catch (e) {}\\n}\\n\\nfunction down(Title, chapterPic, list, chapterTitle, chapterLine, downloadlazy) {\\n try {\\n let doList = list.map((item) => ({\\n title: pdfh(item, chapterTitle),\\n url: pd(item, chapterLine),\\n }));\\n d.push({\\n title: '““””<b><span style=\\\"color: #1aad19\\\">下载漫画🔹</span></b>',\\n url: \\\"hiker://page/download.view#noRecordHistory##noRefresh#?rule=本地资源管理\\\",\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n chapterList: doList,\\n info: {\\n bookName: pdfh(html, Title),\\n ruleName: MY_RULE.title,\\n bookTopPic: pd(html, chapterPic),\\n parseCode: downloadlazy\\n },\\n defaultView: \\\"1\\\"\\n }\\n });\\n d.push({\\n col_type: 'line'\\n });\\n } catch (e) {}\\n}\\n\\nfunction chapter(chapterList, chapterTitle, chapterUrl, defaultOrder, hasLine) {\\n var list = chapterList;\\n var original = [{\\n url: MY_URL,\\n order: defaultOrder\\n }];\\n !fileExist('hiker://files/rules/comic/comicLogFile.js') ? (writeFile('hiker://files/rules/comic/comicLogFile.js', JSON.stringify(original))) : 0;\\n var log = JSON.parse(fetch('hiker://files/rules/comic/comicLogFile.js'));\\n for (var i in log) {\\n if (log[i].url == MY_URL) {\\n var now = i;\\n var order = log[i].order;\\n break;\\n } else {\\n var now = '';\\n var order = defaultOrder;\\n }\\n }\\n let orderItem = {\\n title: \\\"““””\\\" + '<font color=\\\"#f37335\\\">' + '章节排序⇅' + '</font>',\\n url: MY_URL + `@lazyRule=.js:var log = JSON.parse(fetch('hiker://files/rules/comic/comicLogFile.js'));var now='` + now + `';if(now!=''){var now=parseInt(now);var order=log[now].order}else{var now=parseInt(log.length);var order=` + defaultOrder + `;log.push({url:input,order:order});}if(log[now].order){log[now].order=0;}else{log[now].order=1;};writeFile('hiker://files/rules/comic/comicLogFile.js', JSON.stringify(log));refreshPage();'hiker://empty'`,\\n col_type: 'text_center_1'\\n }\\n if (hasLine) {\\n orderItem.title = \\\"““””\\\" + '<font color=\\\"#f37335\\\">' + '集数排序⇅' + '</font>';\\n orderItem.col_type = \\\"text_center_1\\\"\\n }\\n d.push(orderItem);\\n d.push({\\n col_type: 'line'\\n });\\n\\n var list = order ? list : list.reverse();\\n for (let i in list) {\\n try {\\n d.push({\\n title: '““””<small>' + pdfh(list[i], chapterTitle) + '</small>',\\n url: pd(list[i], chapterUrl) + lazy,\\n col_type: 'text_2',\\n });\\n } catch (e) {}\\n }\\n}\\n\\nfunction line(lineList, lineTitleRule, varKey) {\\n let list = lineList\\n varKey = varKey == null ? (MY_RULE.url + '#line-index') : varKey;\\n addListener('onClose', $.toString((keyList) => {\\n for (let i in keyList) {\\n clearVar(keyList[i])\\n }\\n\\n }, [varKey, MY_RULE.title + '#line-title']))\\n let line0Title = ''\\n try {\\n line0Title = pdfh(list[0], lineTitleRule);\\n } catch (e) {}\\n log(MY_RULE.title + getMyVar((MY_RULE.title + '#line-title')))\\n for (let i in list) {\\n try {\\n let lineTitle = pdfh(list[i], lineTitleRule);\\n d.push({\\n title: getMyVar((MY_RULE.title + '#line-title'), line0Title) === lineTitle ? \\\"切换:‘‘\\\" + lineTitle + \\\"\\\" : lineTitle + \\\"‘‘:切换\\\",\\n url: $().lazyRule((varKey, lineIndex, lineTitle) => {\\n putMyVar(varKey, lineIndex.toString())\\n // log(MY_RULE.url)\\n putMyVar((MY_RULE.title + '#line-title'), lineTitle)\\n log(MY_RULE.title + getMyVar((MY_RULE.title + '#line-title')))\\n refreshPage()\\n return \\\"toast://已切换至\\\" + lineTitle\\n }, varKey, i, lineTitle),\\n col_type: 'flex_button'\\n });\\n } catch (e) {}\\n }\\n d.push({\\n col_type: 'line'\\n });\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"动态[二]*\",\"path\":\"dtfl\",\"rule\":\"const empty = \\\"hiker://empty\\\"\\n\\nif (typeof(拼接分类) != 'undefined' && 拼接分类 != '') {\\n var categories = pdfa(html, 大类定位).concat(pdfa(html, 拼接分类))\\n} else {\\n var categories = pdfa(html, 大类定位)\\n}\\n\\nlet init_cate = []\\n\\nfor (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\")\\n}\\n\\nconst fold = getMyVar(MY_RULE.group, \\\"0\\\")\\nconst cate_temp_json = getMyVar(MY_RULE.title, JSON.stringify(init_cate))\\nconst cate_temp = JSON.parse(cate_temp_json)\\n\\nif (parseInt(page) === 1) {\\n d.push({\\n title: fold === '1' ? '““””<b>' + '∨'.fontcolor(\\\"#FF0000\\\") + '</b>' : '““””<b>' + '∧'.fontcolor(\\\"#1aad19\\\") + '</b>',\\n url: $().lazyRule((fold) => {\\n putMyVar(MY_RULE.group, fold === '1' ? '0' : '1');\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, fold),\\n col_type: 'scroll_button',\\n })\\n categories.forEach((category, index) => {\\n let sub_categories = pdfa(category, 小类定位);\\n if (index === 0) {\\n sub_categories.forEach((item, key) => {\\n let title = pdfh(item, 分类标题)\\n if (typeof(排除) != 'undefined' && 排除 != '') {\\n title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n }\\n d.push({\\n title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n let new_cate = []\\n params.cate_temp.forEach((cate, index) => {\\n new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n })\\n putMyVar(MY_RULE.title, JSON.stringify(new_cate))\\n putMyVar(MY_RULE.url, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n key: key,\\n page: page,\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n d.push({\\n col_type: \\\"blank_block\\\"\\n });\\n } else if (fold === '1') {\\n sub_categories.forEach((item, key) => {\\n let title = pdfh(item, 分类标题)\\n if (typeof(排除) != 'undefined' && 排除 != '') {\\n title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n }\\n d.push({\\n title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n params.cate_temp[params.index] = params.key.toString()\\n\\n putMyVar(MY_RULE.title, JSON.stringify(params.cate_temp))\\n putMyVar(MY_RULE.url, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n key: key,\\n page: page,\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n d.push({\\n col_type: \\\"blank_block\\\"\\n });\\n }\\n })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"动态[一]*\",\"path\":\"categories-header\",\"rule\":\"/**\\n * 本地网页插件链接 hiker://files/rules/js/categories-header.js\\n * 子页面链接 hiker://page/categories-header\\n * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2705\\n * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/categories-header.js\\n */\\n/**\\n * Object.assign 用法参考链接\\n *\\n * 1.https://www.daimajiaoliu.com/daima/47139a9e7100407\\n * 2.https://segmentfault.com/a/1190000011778875\\n * 3.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\\n */\\n// 利用 Symbol 实现私有变量和私有方法,外界不可访问(参考链接2)\\nconst symbolMap = {\\n // checkParams: Symbol('checkParams'),\\n mLayout: Symbol('mLayout'),\\n true_url: Symbol('true_url'),\\n mPage: Symbol('mPage'),\\n src: Symbol('src'),\\n ruleObjList: Symbol('ruleObjList'),\\n mFold: Symbol('mFold'),\\n mFoldInnerEnable: Symbol('mFoldInnerEnable'),\\n mFoldIndex: Symbol('mFoldIndex'),\\n mFoldLayout: Symbol('mFoldLayout'),\\n mColor: Symbol('mColor'),\\n mTag: Symbol('mTag'),\\n}\\n\\nfunction CategoriesHeader(color) {\\n // 'use strict';\\n // ...\\n // this[symbolMap.listRule] = []\\n // this[symbolMap.subListRule] = []\\n this[symbolMap.mColor] = color || \\\"#FA7298\\\";\\n this[symbolMap.ruleObjList] = []\\n this.VARMAP = {\\n CATEGORY: \\\"header.category\\\",\\n URL: \\\"header.url\\\",\\n FOLD: \\\"header.fold\\\",\\n }\\n this[symbolMap.mFoldLayout] = {\\n injectIndex: 1\\n }\\n this[symbolMap.mFoldIndex] = 1\\n}\\n\\nObject.assign(CategoriesHeader.prototype, {\\n // Override 构造方法,相当于 function.prototype.constructor = (...) => {...},new function() 的时候会自动执行\\n constructor: CategoriesHeader,\\n // 定义私有方法\\n VERSION: 202111301900,\\n checkParams() {\\n if (!this[symbolMap.mLayout]) {\\n throw new Error(\\\"请调用 layout(d) 传入当前界面\\\")\\n }\\n if (!this[symbolMap.true_url]) {\\n throw new Error(\\\"请调用 trueUrl(url) 传入当前分类的链接\\\")\\n }\\n if (!this[symbolMap.mPage]) {\\n throw new Error(\\\"请调用 page(mPage) 传入当前页数\\\")\\n }\\n if (this[symbolMap.ruleObjList].length < 1) {\\n throw new Error(\\\"请调用相关方法传入定位规则\\\")\\n }\\n if (!this[symbolMap.mFold]) {\\n this[symbolMap.mFold] = '0'\\n }\\n },\\n layout(mLayout) {\\n this[symbolMap.mLayout] = mLayout\\n return this\\n },\\n trueUrl(url) {\\n this[symbolMap.true_url] = url\\n return this\\n },\\n page(mPage) {\\n if (typeof (mPage) === 'string') {\\n mPage = parseInt(mPage)\\n }\\n this[symbolMap.mPage] = mPage\\n return this\\n },\\n html(mSrc) {\\n this[symbolMap.src] = mSrc\\n return this\\n },\\n list(rule) {\\n if (this[symbolMap.ruleObjList].length > 0) {\\n throw new Error(\\\"list(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n this[symbolMap.ruleObjList] = [{}]\\n this[symbolMap.ruleObjList][0].listRule = rule\\n this[symbolMap.ruleObjList][0]['一级分类'] = rule\\n return this\\n },\\n subList(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"subList(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].subListRule = rule\\n this[symbolMap.ruleObjList][0]['子分类'] = rule\\n return this\\n },\\n title(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"title(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].titleRule = rule\\n this[symbolMap.ruleObjList][0]['分类标题'] = this[symbolMap.ruleObjList][0].titleRule\\n return this\\n },\\n url(rule) {\\n if (this[symbolMap.ruleObjList].length > 1) {\\n throw new Error(\\\"url(rule) add(ruleObj) 只能二选一!\\\")\\n }\\n if (!this[symbolMap.ruleObjList][0] || (!this[symbolMap.ruleObjList][0].listRule && !this[symbolMap.ruleObjList][0]['一级分类'])) {\\n throw new Error(\\\"请先调用 list(rule) 或 一级分类(rule) 定位一级分类\\\")\\n }\\n this[symbolMap.ruleObjList][0].urlRule = rule\\n this[symbolMap.ruleObjList][0]['分类链接'] = this[symbolMap.ruleObjList][0].urlRule\\n return this\\n },\\n /**\\n * 是否开启折叠功能\\n *\\n * @param enabled true 表示开启,false 表示禁用\\n * @returns {CategoriesHeader}\\n */\\n foldInner(enabled) {\\n if (!(typeof (enabled) === 'boolean')) {\\n throw new Error(\\\"请传入 true 或 false 表示开启或关闭折叠功能!\\\")\\n }\\n this[symbolMap.mFoldInnerEnable] = enabled\\n return this\\n },\\n /**\\n * 从第 index 行开始折叠\\n *\\n * @param index 开始折叠的行数\\n * @returns {CategoriesHeader}\\n */\\n foldIndex(index) {\\n if (!(typeof (index) === 'number')) {\\n throw new Error(\\\"开始折叠行请传入数字!\\\")\\n }\\n if (index < 1) {\\n throw new Error(\\\"开始折叠行请传入大于 0 的整数!\\\")\\n }\\n this[symbolMap.mFoldIndex] = index || 1;\\n return this\\n },\\n /**\\n * 折叠按钮的界面\\n *\\n * @param layout 与 d.push 结构一致,\\n * 例:{ title:\\\"标题1\\\", url:\\\"xxx\\\", col_type:\\\"scroll_button\\\" };\\n * 参数采用可选覆盖模式,不写的参数则使用默认;\\n * 比如传入 { col_type:\\\"text_1\\\" },那最终结果就是 { title:\\\"标题1\\\", url:\\\"xxx\\\", col_type:\\\"text_1\\\" }\\n * @returns {CategoriesHeader}\\n */\\n foldLayout(layout) {\\n if (typeof layout === 'object') {\\n let keys = Object.keys(layout)\\n let injectIndex = layout.injectIndex || layout['折叠按钮插入行']\\n if (layout.title || layout.url || layout.col_type || injectIndex) {\\n for (let i = 0; i < keys.length; i++) {\\n const key = keys[i]\\n this[symbolMap.mFoldLayout][key] = layout[key];\\n }\\n } else {\\n throw new Error(\\\"请传入正确的折叠界面元素!\\\")\\n }\\n // injectIndex 折叠按钮插入第 injectIndex 行\\n if (injectIndex) {\\n if (!(typeof (injectIndex) === 'number')) {\\n throw new Error(\\\"折叠按钮插入行请传入数字!\\\")\\n }\\n if (injectIndex < 1) {\\n throw new Error(\\\"折叠按钮插入行请传入大于 0 的整数!\\\")\\n }\\n if (injectIndex > this[symbolMap.mFoldIndex]) {\\n throw new Error(\\\"折叠按钮插入行不得大于显示折叠行数!请调用 .foldIndex(index) 或 .第几行开始折叠(index) 传入正确的显示折叠行数\\\")\\n }\\n this[symbolMap.mFoldLayout].injectIndex = injectIndex || 1;\\n }\\n } else {\\n throw new Error(\\\"请传入正确的折叠界面元素!\\\")\\n }\\n return this;\\n },\\n // 当前是否折叠\\n fold(isFold) {\\n if (typeof (isFold) === 'string') {\\n isFold = isFold === '1'\\n }\\n if (isFold) {\\n this[symbolMap.mFold] = '1';\\n } else {\\n this[symbolMap.mFold] = '0';\\n }\\n return this\\n },\\n color(mColor) {\\n this[symbolMap.mColor] = mColor\\n return this\\n },\\n tag(mTag) {\\n this[symbolMap.mTag] = mTag\\n return this\\n },\\n add(ruleObj) {\\n // log($.stringify(ruleObj))\\n if (ruleObj.constructor === Array) {\\n this[symbolMap.ruleObjList] = this[symbolMap.ruleObjList].concat(ruleObj)\\n } else {\\n this[symbolMap.ruleObjList].push(ruleObj)\\n }\\n return this;\\n },\\n evalJSRule(item, jsRule) {\\n let rule = jsRule.replace(\\\"@js:\\\", \\\"\\\")\\n rule = rule.trim()\\n // log($.stringify(rule))\\n let input = item\\n if (rule.startsWith(\\\"(\\\")) {\\n eval('result = ' + rule)\\n } else {\\n /**\\n * 还原成 $.toString(...) 的最终结果,达到最终处理方式跟上面的 if 一致的目的\\n */\\n eval('result = ' + '(() => {' + rule + '})()')\\n }\\n return (result || '')\\n },\\n getTitle(src, category) {\\n let title = ''\\n let titleRule = category.titleRule || 'a&&Text'\\n if (titleRule.startsWith(\\\"@js:\\\")) {\\n title = this.evalJSRule(src, titleRule)\\n } else {\\n title = parseDomForHtml(src, titleRule)\\n }\\n return title || \\\"\\\";\\n },\\n getUrl(src, category) {\\n let url = ''\\n let urlRule = category.urlRule || 'a&&href'\\n if (typeof urlRule === 'object') {\\n let mUrlRule = urlRule.rule || urlRule['解析规则'] || 'a&&href';\\n if (mUrlRule.startsWith(\\\"@js:\\\")) {\\n url = this.evalJSRule(src, mUrlRule);\\n } else {\\n let parse = parseDom;\\n if (urlRule.parseOption) {\\n switch (urlRule.parseOption) {\\n case \\\"parseDom\\\":\\n case \\\"pd\\\":\\n parse = parseDom;\\n break;\\n case \\\"parseDomForHtml\\\":\\n case \\\"pdfh\\\":\\n parse = parseDomForHtml;\\n break;\\n default:\\n parse = parseDom;\\n }\\n } else if (urlRule[\\\"解析方法\\\"]) {\\n switch (urlRule[\\\"解析方法\\\"]) {\\n case \\\"parseDom\\\":\\n case \\\"pd\\\":\\n parse = parseDom;\\n break;\\n case \\\"parseDomForHtml\\\":\\n case \\\"pdfh\\\":\\n parse = parseDomForHtml;\\n break;\\n default:\\n parse = parseDom;\\n }\\n }\\n url = parse(src, mUrlRule);\\n }\\n if (urlRule.dealUrl) {\\n url = urlRule.dealUrl(url)\\n } else if (urlRule['二次处理']) {\\n url = urlRule['二次处理'](url)\\n }\\n } else {\\n if (urlRule.startsWith(\\\"@js:\\\")) {\\n url = this.evalJSRule(src, urlRule);\\n } else {\\n url = parseDom(src, urlRule);\\n }\\n }\\n return url || \\\"\\\";\\n },\\n build() {\\n // 检测是否传入需要的参数\\n this.checkParams()\\n // 每一个分类的唯一标识\\n let mTag = this[symbolMap.mTag] || \\\"\\\"\\n //翻页 需要根据实际替换\\n const html = this[symbolMap.src] || request(this[symbolMap.true_url])\\n const empty = \\\"hiker://empty\\\"\\n //获取列表\\n const categories = []\\n this[symbolMap.ruleObjList].map(ruleObj => {\\n let list = []\\n let listRule = ruleObj.listRule || ruleObj[\\\"一级分类\\\"]\\n if (listRule.startsWith(\\\"@js:\\\")) {\\n // log($.stringify(listRule))\\n list = this.evalJSRule(html, listRule)\\n } else {\\n list = parseDomForArray(html, listRule)\\n }\\n // log(list)\\n list.map(category => {\\n categories.push({\\n list: category,\\n subListRule: ruleObj.subListRule || ruleObj[\\\"子分类\\\"],\\n titleRule: ruleObj.titleRule || ruleObj[\\\"分类标题\\\"],\\n urlRule: ruleObj.urlRule || ruleObj[\\\"分类链接\\\"],\\n });\\n })\\n })\\n\\n // log($.stringify(categories))\\n\\n let init_cate = []\\n for (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\")\\n }\\n\\n const cate_temp_json = getMyVar(mTag + this.VARMAP.CATEGORY, JSON.stringify(init_cate))\\n const cate_temp = JSON.parse(cate_temp_json)\\n\\n if (this[symbolMap.mPage] === 1) {\\n\\n categories.forEach((category, index) => {\\n\\n // 折叠 UI\\n if (this[symbolMap.mFoldInnerEnable] && this[symbolMap.mFoldLayout].injectIndex === (index+1)) {\\n let foldLayout = {\\n title: this[symbolMap.mFoldLayout].title || (this[symbolMap.mFold] === '1' ? '““””<b><span style=\\\"color: #FF0000\\\">∨</span></b>' : '““””<b><span style=\\\"color: #1aad19\\\">∧</span></b>'),\\n url: this[symbolMap.mFoldLayout].url || $(\\\"hiker://empty#noHistory#\\\").lazyRule((params) => {\\n putMyVar(params.mTag + params.VARMAP.FOLD, getMyVar(params.mTag + params.VARMAP.FOLD, params.isFold) === '1' ? '0' : '1')\\n refreshPage(false);\\n return \\\"hiker://empty\\\"\\n }, {\\n mTag: mTag,\\n isFold: this[symbolMap.mFold],\\n VARMAP: this.VARMAP\\n }),\\n col_type: this[symbolMap.mFoldLayout].col_type || \\\"scroll_button\\\",\\n }\\n this[symbolMap.mLayout].push(foldLayout)\\n }\\n\\n //具体列表下的分类\\n let sub_categories = [];\\n if (category.subListRule.startsWith(\\\"@js:\\\")) {\\n sub_categories = this.evalJSRule(category.list, category.subListRule)\\n } else {\\n sub_categories = parseDomForArray(category.list, category.subListRule);\\n }\\n if (index < (this[symbolMap.mFoldIndex] || 1)) {\\n sub_categories.forEach((item, key) => {\\n let title = this.getTitle(item, category)\\n let url = this.getUrl(item, category)\\n\\n this[symbolMap.mLayout].push({\\n title: key.toString() === cate_temp[index] ? '““””<b><font color=' + this[symbolMap.mColor] + '>' + title + ' </font></b>' : title,\\n url: $(url).lazyRule((params) => {\\n let new_cate = []\\n if (params.index === 0) {\\n params.cate_temp.forEach((cate, index) => {\\n new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n });\\n } else {\\n params.cate_temp[params.index] = params.key.toString()\\n }\\n putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.index === 0 ? new_cate : params.cate_temp))\\n putMyVar(params.tag + params.VARMAP.URL, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n VARMAP: this.VARMAP,\\n tag: mTag,\\n key: key,\\n page: this[symbolMap.mPage],\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n this[symbolMap.mLayout].push({\\n col_type: \\\"blank_block\\\"\\n });\\n } else if (this[symbolMap.mFold] === '0') {\\n sub_categories.forEach((item, key) => {\\n let title = this.getTitle(item, category)\\n let url = this.getUrl(item, category)\\n\\n this[symbolMap.mLayout].push({\\n title: key.toString() === cate_temp[index] ? '““””<b><font color=' + this[symbolMap.mColor] + '>' + title + ' </font></b>' : title,\\n url: $(url).lazyRule((params) => {\\n params.cate_temp[params.index] = params.key.toString()\\n\\n putMyVar(params.tag + params.VARMAP.CATEGORY, JSON.stringify(params.cate_temp))\\n putMyVar(params.tag + params.VARMAP.URL, input)\\n refreshPage(true)\\n return \\\"hiker://empty\\\"\\n }, {\\n cate_temp: cate_temp,\\n index: index,\\n VARMAP: this.VARMAP,\\n tag: mTag,\\n key: key,\\n page: this[symbolMap.mPage],\\n }),\\n col_type: 'scroll_button',\\n })\\n })\\n this[symbolMap.mLayout].push({\\n col_type: \\\"blank_block\\\"\\n });\\n }\\n });\\n }\\n },\\n\\n 界面(layout) {\\n return this.layout(layout)\\n },\\n 分类链接(trueUrl) {\\n return this.trueUrl(trueUrl);\\n },\\n 页码(page) {\\n return this.page(page);\\n },\\n 源码(html) {\\n return this.html(html);\\n },\\n 定位一级分类(list) {\\n return this.list(list);\\n },\\n 定位子分类(subList) {\\n return this.subList(subList);\\n },\\n 定位分类标题(title) {\\n return this.title(title);\\n },\\n 定位分类链接(url) {\\n return this.url(url);\\n },\\n 开启内置折叠功能() {\\n return this.foldInner(true);\\n },\\n 关闭内置折叠功能() {\\n return this.foldInner(false);\\n },\\n 第几行开始折叠(index) {\\n return this.foldIndex(index);\\n },\\n 折叠按钮样式(layout) {\\n return this.foldLayout(layout)\\n },\\n 折叠(fold) {\\n return this.fold(fold);\\n },\\n 选中的分类颜色(color) {\\n return this.color(color);\\n },\\n 唯一标识(mTag) {\\n return this.tag(mTag)\\n },\\n 添加分类定位(ruleObj) {\\n return this.add(ruleObj);\\n },\\n 开始打造分类() {\\n return this.build();\\n },\\n\\n})\\n$.exports = new CategoriesHeader();\\n$.exports\"},{\"col_type\":\"movie_3\",\"name\":\"链接处理[二]*\",\"path\":\"url-processor\",\"rule\":\"/**\\n * 本地网页插件链接 hiker://files/rules/js/UrlProcessor.js\\n * 子页面链接 hiker://page/url-processor\\n * 道长仓库链接 http://hiker.nokia.press/hikerule/rulelist.json?id=2849\\n * 码云 Gitee 链接 https://gitee.com/reborn0/HikerRules/raw/master/plugins/UrlProcessor.js\\n */\\nfunction UrlProcessor() {\\n this.params = {}\\n this.regexMap = [\\n {\\n reg: '(vodtype|videot)\\\\\\\\/\\\\\\\\w+',\\n exec: () => {\\n return this.params.url\\n .replace(/-\\\\d+.html/, '-' + this.params.page + '.html')\\n .replace(/((vodtype|videot)\\\\/\\\\w+).html/, '$1-' + this.params.page + '.html')\\n }\\n },\\n {\\n reg: '\\\\\\\\/?[\\\\\\\\w\\\\\\\\d]+-.*?-.*?-.*?-.*?-.*?-.*?-.*?-\\\\\\\\d*---\\\\\\\\d*.html',\\n exec: () => {\\n return this.params.url\\n .replace(/\\\\d*(---.html)/, this.params.page + '$1')\\n .replace(/(---\\\\d+.html)/, this.params.page + '$1'); // 拼接页码\\n }\\n },\\n {\\n reg: '((\\\\\\\\/vod\\\\\\\\/show)?(\\\\\\\\/area\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?(\\\\\\\\/by\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?(\\\\\\\\/id\\\\\\\\/\\\\\\\\d+)?(\\\\\\\\/letter\\\\\\\\/[\\\\\\\\w\\\\\\\\d%]+)?)(\\\\\\\\/page\\\\\\\\/\\\\\\\\d+)?(\\\\\\\\/year\\\\\\\\/\\\\\\\\d+)?\\\\\\\\.html',\\n exec: () => {\\n let regExp = /((\\\\/vod\\\\/show)?(\\\\/area\\\\/[\\\\w\\\\d%]+)?(\\\\/by\\\\/[\\\\w\\\\d%]+)?(\\\\/id\\\\/\\\\d+)?(\\\\/letter\\\\/[\\\\w\\\\d%]+)?)(\\\\/page\\\\/\\\\d+)?(\\\\/year\\\\/\\\\d+)?\\\\.html/\\n return this.params.url\\n .replace(regExp, '$1' + (\\\"/page/\\\" + this.params.page) + '$8' + \\\".html\\\")\\n }\\n }\\n ]\\n}\\n\\nObject.assign(UrlProcessor.prototype, {\\n constructor: UrlProcessor,\\n checkParams() {\\n if (!this.params.url) {\\n throw new Error(\\\"请先调用 .baseUrl(url) 传入链接进行初始化!\\\")\\n }\\n if (!this.params.page) {\\n throw new Error(\\\"请先调用 .page(page) 传入页码进行初始化!\\\")\\n }\\n },\\n baseUrl(url){\\n this.params.url = url\\n return this\\n },\\n page(page){\\n this.params.page = page\\n return this\\n },\\n addExtra(regExp) {\\n if (regExp.constructor === Array) {\\n this.regexMap = this.regexMap.concat(regExp)\\n } else {\\n this.regexMap.push(regExp)\\n }\\n return this;\\n },\\n debug() {\\n this.params.debug = true\\n return this;\\n },\\n exec() {\\n this.checkParams()\\n let true_url = ''\\n for (let i = 0; i < this.regexMap.length; i++) {\\n let regObj = this.regexMap[i];\\n let urlExp = regObj.reg;\\n if (typeof urlExp === 'string') {\\n urlExp = new RegExp(urlExp)\\n }\\n if (urlExp.test(this.params.url)) {\\n if (this.params.debug) {\\n log(urlExp.toString())\\n }\\n true_url = regObj.exec();\\n break;\\n }\\n }\\n if (true_url) {\\n return true_url;\\n } else {\\n return this.params.url\\n }\\n },\\n 获取处理结果() {\\n return this.exec()\\n },\\n 链接(url) {\\n return this.baseUrl(url)\\n },\\n 页码(page) {\\n return this.page(page)\\n },\\n 插入新处理规则(regExp) {\\n return this.addExtra(regExp)\\n },\\n 调试模式() {\\n return this.debug();\\n }\\n})\\n$.exports=new UrlProcessor()\\n$.exports\\n\"},{\"col_type\":\"movie_3\",\"name\":\"一级*\",\"path\":\"yjtool\",\"rule\":\"function convert1(str) {\\n let c = str.split(\\\";\\\")\\n return {\\n 列表: c[0],\\n 标题: c[1],\\n 图片: c[2],\\n 描述: c[3],\\n 链接: c[4]\\n }\\n}\\n\\nfunction merge(source, target) {\\n let keys = Object.keys(source)\\n for (let i in keys) {\\n target[keys[i]] = source[keys[i]]\\n }\\n}\\n\\nfunction 一级(obj) {\\n var d = [];\\n if ($.type(obj) == \\\"string\\\") {\\n obj = convert1(obj)\\n }\\n if (obj.规则) {\\n let c = convert1(obj.规则)\\n merge(c, obj)\\n }\\n let arr = pdfa(getResCode(), obj.列表);\\n if (obj.列表处理 != null) {\\n arr = obj.链接处理(arr)\\n }\\n for (let it of arr) {\\n let url = pd(it, obj.链接)\\n if (obj.链接处理 != null) {\\n url = obj.链接处理(url)\\n }\\n let title = pdfh(it, obj.标题)\\n if (obj.标题处理 != null) {\\n title = obj.标题处理(title)\\n }\\n let pic = pd(it, obj.图片)\\n if (obj.图片处理 != null) {\\n pic = obj.图片处理(pic)\\n }\\n d.push({\\n title: obj.标题 ? pdfh(it, obj.标题) : \\\"\\\",\\n url: url+'#autoCache#',\\n col_type: \\\"\\\",\\n desc: obj.描述 ? pdfh(it, obj.描述) : \\\"\\\",\\n pic_url: pic,\\n extra: {\\n ytitle: title,\\n ypic: pic,\\n yurl: url.replace('hiker://empty##','')\\n }\\n });\\n\\n }\\n setResult(d);\\n}\\nvar tool = {\\n 一级: 一级\\n}\\n$.exports = tool\"},{\"col_type\":\"movie_3\",\"name\":\"一级[二]*\",\"path\":\"yiji\",\"rule\":\"function 一级() {};\\r\\nObject.assign(一级.prototype, {\\r\\n\\tconstructor: 一级,\\r\\n\\ttest() {},\\r\\n\\t获取源码(url, header) {return fetch(true_url, {headers: header || {'User-Agent': PC_UA}}) },// 默认统一使用MOBILE_UA\\r\\n\\t搜索框架(page) {\\r\\n\\t\\tif (page == '1') {\\n/*\\r\\n\\t\\t\\td.push({\\r\\n\\t\\t\\t\\ttitle: \\\"搜索本规则\\\",\\r\\n\\t\\t\\t\\turl: \\\"'hiker://search?rule=\\\" + MY_RULE.title + \\\"&s='+input\\\",\\r\\n\\t\\t\\t\\tdesc: \\\" \\\",\\r\\n\\t\\t\\t\\tcol_type: \\\"input\\\"\\r\\n\\t\\t\\t});\\n*/\\r\\n\\t\\t}\\r\\n\\t},\\r\\n\\t获取链接(page, regex) {\\r\\n\\t\\tlet true_url = getMyVar('header.url', MY_URL);\\r\\n\\t\\t//let 链接处理工具 = requireCache(config.链接处理工具依赖)\\r\\n\\t\\t//let 链接处理工具 = requireCache('http://hiker.nokia.press/hikerule/rulelist.json?id=2849')\\r\\n\\t\\t//let 链接处理工具 = $.require('hiker://page/url-processor')\\r\\n\\t\\tlet 链接处理工具 = requireCache('http://hiker.nokia.press/hikerule/rulelist.json?id=2849')\\r\\n\\t\\ttrue_url = 链接处理工具\\r\\n\\t\\t\\t.链接(true_url)\\r\\n\\t\\t\\t.页码(page)\\r\\n\\t\\t\\t.插入新处理规则(regex || [])\\r\\n\\t\\t\\t.获取处理结果();\\r\\n\\t\\treturn true_url;\\r\\n\\t},\\r\\n\\t打造分类(ruleList) {\\r\\n\\t\\t// let htmlCategories = requireCache(config.动态分类依赖)\\r\\n\\t\\t//let htmlCategories = requireCache('http://hiker.nokia.press/hikerule/rulelist.json?id=2705')\\r\\n\\t\\tif (!ruleList) {\\r\\n\\t\\t\\tlet 分类定位 = [{\\r\\n\\t\\t\\t\\t\\t一级分类: 一级定位A,\\r\\n\\t\\t\\t\\t\\t子分类: 统一定位B || 一级定位B,\\r\\n\\t\\t\\t\\t\\t分类链接: {二次处理(url) {try {return 一级处理C(url)} catch (e) {return url}}}\\r\\n\\t\\t\\t}]\\r\\n\\t\\t\\tif (二级定位A && (统一定位B || 二级定位B)) {\\r\\n\\t\\t\\t\\t分类定位.push({\\r\\n\\t\\t\\t\\t\\t\\t一级分类: 二级定位A,\\r\\n\\t\\t\\t\\t\\t\\t子分类: 统一定位B || 二级定位B,\\r\\n\\t\\t\\t\\t\\t\\t分类链接: {二次处理(url) {try {return 二级处理C(url)} catch (e) {return url}}}\\r\\n\\t\\t\\t\\t})\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif (三级定位A && (统一定位B || 三级定位B)) {\\r\\n\\t\\t\\t\\t分类定位.push({\\r\\n\\t\\t\\t\\t\\t\\t一级分类: 三级定位A,\\r\\n\\t\\t\\t\\t\\t\\t子分类: 统一定位B || 三级定位B,\\r\\n\\t\\t\\t\\t\\t\\t分类链接: {二次处理(url) {try {return 三级处理C(url)} catch (e) {return url}}}\\r\\n\\t\\t\\t\\t})\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tif (四级定位A && (统一定位B || 四级定位B)) {\\r\\n\\t\\t\\t\\t分类定位.push({\\r\\n\\t\\t\\t\\t\\t\\t一级分类: 四级定位A,\\r\\n\\t\\t\\t\\t\\t\\t子分类: 统一定位B || 四级定位B,\\r\\n\\t\\t\\t\\t\\t\\t分类链接: {二次处理(url) {try {return 四级处理C(url)} catch (e) {return url}}}\\r\\n\\t\\t\\t\\t})\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\truleList = 分类定位;\\r\\n\\t\\t}\\r\\n\\t\\t// '0' 为默认不折叠,'1' 为默认折叠\\r\\n\\t\\tconst 当前折叠状态 = getMyVar('header.fold', '0')\\r\\n\\t\\t// 引入动态分类依赖\\r\\n\\t\\tlet htmlCategories = requireCache('http://hiker.nokia.press/hikerule/rulelist.json?id=2705')\\r\\n\\t\\tvar getRangeColors = function() {\\r\\n\\t\\t\\treturn '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);\\r\\n\\t\\t} // 随机选中的分类颜色\\r\\n\\t\\tvar colour;\\r\\n\\t\\tif (分类颜色 !== '') {\\r\\n\\t\\t\\tcolour = 分类颜色\\r\\n\\t\\t} else {\\r\\n\\t\\t\\tcolour = getRangeColors()\\r\\n\\t\\t}\\r\\n\\t\\thtmlCategories.界面(d)\\r\\n\\t\\t\\t//.分类链接(true_url)\\r\\n\\t\\t\\t.源码(html)\\r\\n\\t\\t\\t.页码(page)\\r\\n\\t\\t\\t.添加分类定位(ruleList)\\r\\n\\t\\t\\t.开启内置折叠功能() // 必须\\r\\n\\t\\t\\t.折叠(当前折叠状态) // 必须\\r\\n\\t\\t\\t.折叠按钮样式({\\r\\n\\t\\t\\t\\ttitle: 当前折叠状态 == \\\"1\\\" ? \\\"““””<big><b><font color='#5959AB'>\\\" + 动态缩小 + \\\"</font></b></big>\\\" : \\\"““””<big><b><font color='#F75D59'>\\\" + 动态扩展 + \\\"</font></b></big>\\\"\\r\\n\\t\\t\\t}) // 可选\\r\\n\\t\\t\\t// .第几行开始折叠(2) // 可选\\r\\n\\t\\t\\t// .折叠按钮样式({ 折叠按钮插入行: 2 }) // 可选,但必须先调用 .第几行开始折叠(index),然后再传入 { 折叠按钮插入行: index }\\r\\n\\t\\t\\t.选中的分类颜色(colour)\\r\\n\\t\\t\\t.开始打造分类();\\r\\n\\t},\\r\\n\\r\\n\\t生成片单(d,html) {\\r\\n\\r\\n\\t\\tvar 列表\\r\\n\\t\\tvar 标题\\r\\n\\t\\tvar 描述\\r\\n\\t\\tvar 图片\\r\\n\\t\\tvar 链接\\r\\n\\r\\n\\t\\tif (框架类型 === 'myui-vodlist') {\\r\\n\\t\\t\\t列表 = '.myui-vodlist&&li';\\r\\n\\t\\t\\t标题 = 'h4&&Text';\\r\\n\\t\\t\\t描述 = '.pic-tag||.pic-text&&Text';\\r\\n\\t\\t\\t图片 = '.lazyload&&data-original';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t\\t//log('框架类型·myui-vodlist')\\r\\n\\t\\t} else if (框架类型 === '#data_list') {\\r\\n\\t\\t\\t列表 = '#data_list&&li';\\r\\n\\t\\t\\t标题 = 'a&&title';\\r\\n\\t\\t\\t描述 = 'em&&Text';\\r\\n\\t\\t\\t图片 = 'img&&data-srcl';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t\\t//log('框架类型·data_list')\\r\\n\\t\\t} else if (框架类型 === 'fed-list-title') {\\r\\n\\t\\t\\t列表 = '.fed-list-info&&li';\\r\\n\\t\\t\\t标题 = '.fed-list-title&&Text';\\r\\n\\t\\t\\t描述 = '.fed-text-center&&Text';\\r\\n\\t\\t\\t图片 = 'a&&data-original';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t\\t//log('框架类型·.fed-list-info')\\r\\n\\t\\t} else if (框架类型 === 'item') {\\r\\n\\t\\t\\t列表 = 'body&&.item';\\r\\n\\t\\t\\t标题 = 'img&&alt';\\r\\n\\t\\t\\t描述 = 'p&&Text';\\r\\n\\t\\t\\t图片 = 'img&&srcl';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t} else if (框架类型 === 'module-items') {\\r\\n\\t\\t\\t列表 = '.module-items&&.module-item';\\r\\n\\t\\t\\t标题 = 'a&&title';\\r\\n\\t\\t\\t描述 = '.module-item-text&&Text';\\r\\n\\t\\t\\t图片 = 'img||.lazy&&data-src';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t} else if (框架类型 === 'pack-ykpack') {\\r\\n\\t\\t\\t列表 = 'body&&.pack-ykpack';\\r\\n\\t\\t\\t标题 = 'a&&title';\\r\\n\\t\\t\\t描述 = 'span,-1&&Text';\\r\\n\\t\\t\\t图片 = '.eclazy&&data-original';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t} else if (框架类型 === 'stui-vodlist') {\\r\\n\\t\\t\\t列表 = '.stui-vodlist&&li';\\r\\n\\t\\t\\t标题 = 'a&&title';\\r\\n\\t\\t\\t描述 = '.pic-text&&Text';\\r\\n\\t\\t\\t图片 = '.lazyload||a&&data-original';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t} else if (框架类型 === 'vodlist') {\\r\\n\\t\\t\\t列表 = '.vodlist&&li';\\r\\n\\t\\t\\t标题 = 'a&&title';\\r\\n\\t\\t\\t描述 = 'a&&Text';\\r\\n\\t\\t\\t图片 = '.lazyload&&data-original';\\r\\n\\t\\t\\t链接 = 'a&&href';\\r\\n\\t\\t} else if (框架类型 === '测试') {\\r\\n\\t\\t\\t列表 = 'body&&a';\\r\\n\\t\\t\\t标题 = 'body&&a';\\r\\n\\t\\t\\t描述 = 'body&&a';\\r\\n\\t\\t\\t图片 = 'body&&a';\\r\\n\\t\\t\\t链接 = 'body&&a';\\r\\n\\t\\t} else if (框架类型 === '') {\\r\\n\\t\\t\\t列表 = 框架列表;\\r\\n\\t\\t\\t标题 = 框架标题;\\r\\n\\t\\t\\t描述 = 框架描述;\\r\\n\\t\\t\\t图片 = 框架图片;\\r\\n\\t\\t\\t链接 = 框架链接;\\r\\n\\t\\t}\\r\\n\\t\\tlet list = pdfa(html, 列表);\\r\\n\\t\\tfor (let k in list) {\\r\\n\\t\\t\\td.push({\\r\\n\\t\\t\\t\\ttitle: pdfh(list[k], 标题),\\r\\n\\t\\t\\t\\tdesc: pdfh(list[k], 描述),\\r\\n\\t\\t\\t\\timg: pd(list[k], 图片) + '@Referer=',\\r\\n\\t\\t\\t\\turl: pd(list[k], 链接)+\\\"#immersiveTheme##autoCache#\\\",\\r\\n\\t\\t\\t});\\r\\n\\t\\t}\\r\\n\\t\\td.push({\\r\\n\\t\\t\\tcol_type: 'big_big_blank_block',\\r\\n\\t\\t});\\r\\n\\t}\\r\\n})\\r\\n\\r\\n$.exports = new 一级();\\r\\n$.exports\"},{\"col_type\":\"movie_3\",\"name\":\"函数组件*\",\"path\":\"qs\",\"rule\":\"function 优化路线章节数据(多路线否, 源数据, 路线列表, 路线名, 选集总列表, 选集列表, 集名, 集url, 前缀, 标题, 图片) {\\n\\n //当多路线否 选集总列表为空\\n //最终返回 [{title: '路线名',list: [{title:'选集名',url:'选集url',...}],sjss:'下载资料'},....]\\n //选集列表 第一项是css选择器,之后可以用$分割添加要删除章节名\\n\\n\\n var 章节json = [];\\n var 单路线章节 = '章节列表'\\n\\n var 列表名 = [];\\n if (!多路线否) {\\n\\n 列表名.push(单路线章节)\\n\\n } else {\\n\\n pdfa(源数据, 路线列表).forEach(function(data) {\\n 列表名.push(pdfh(data, 路线名))\\n });\\n\\n }\\n\\n var 集数组 = [];\\n\\n\\nvar 排除章节 = [];\\nif(选集列表.includes('$')){\\n排除章节 = 选集列表.split('$')\\n选集列表 = 排除章节.shift()\\n}\\n\\n if (!多路线否) {\\n 集数组.push(pdfa(源数据, 选集列表))\\n } else {\\n pdfa(源数据, 选集总列表).forEach(function(data) {\\n 集数组.push(pdfa(data, 选集列表))\\n });\\n }\\n\\n\\n for (let i in 集数组) {\\n\\n var doList = [];\\n\\n排除章节.forEach(function(data) {\\n var 标识id = 集数组[i].findIndex(返回 => 返回.indexOf(data) != -1);\\n if (标识id != -1) {\\n 集数组[i].splice(标识id, 1)\\n };\\n });\\n\\n for (let it of 集数组[i]) {\\n var doListurl = pdfh(it, 集url)\\n doListurl = doListurl.includes(\\\"http\\\") ? doListurl : 前缀 + doListurl\\n doList.push({\\n title: '““””<small>' + pdfh(it, 集名) + '</small>',\\n url: doListurl\\n })\\n }\\n\\n var bookName = !多路线否 ? 标题 : 标题 + '-' + 列表名[i]\\n\\n 章节json.push({\\n title: 列表名[i],\\n list: doList,\\n sjss: {\\n chapterList: doList,\\n info: {\\n bookName: bookName, //漫画名称,\\n ruleName: MY_RULE.title,\\n bookTopPic: 图片,\\n parseCode: downloadlazy,\\n },\\n defaultView: \\\"1\\\"\\n }\\n })\\n }\\n return 章节json\\n}\\n\\n\\nfunction 添加头部列表(d, 标题, 图片, 描述, 作者, 时间, 分类,页URL) {\\n\\n 标题 = !标题 ? '' : 标题 + '\\\\n'\\n 图片 = !图片 ? '' : 图片\\n 描述 = !描述 ? '' : 描述.replace(\\\"更新至:\\\", '')\\n\\n 作者 = !作者 ? '' : '\\\\n' + 作者\\n 时间 = !时间 ? '' : '\\\\n' + 时间\\n 分类 = !分类 ? '' : '\\\\n' + 分类\\n\\n\\n var 头部title = ['‘‘’’<b>','</b> <small><font color=#FA7298>','</font>','</small>']\\n var 头部desc = ['‘‘’’<font color=#f8ecc9>','</font>']\\n\\n\\n\\n 头部title = 头部title[0]+标题+头部title[1]+描述+头部title[2]+作者+头部title[3]\\n\\n 头部desc = 头部desc[0]+时间+分类+头部desc[1]\\n\\n d.push({\\n title: 头部title,\\n desc: 头部desc,\\n pic_url: 图片,\\n url: 'hiker://search?s='+getParam('Name')+'&rule=阅漫君',\\n col_type: 'movie_1_vertical_pic_blur'\\n });\\n\\n}\\n\\n\\nfunction 添加简介(d, 数据源, 页URL, 图片) {\\n //获取数据\\n var 简介内容 = 数据源\\n 简介内容 = 简介内容.replace(\\\"简介:\\\", \\\"\\\").replace(\\\"介绍:\\\", \\\"\\\").replace(\\\"漫画\\\", \\\"\\\").replace(\\\"……\\\", \\\"\\\").replace(\\\"简介\\\", \\\"\\\")\\n\\n var 简介内容收;\\n if (简介内容.length > 45) {\\n 简介内容收 = 简介内容.substr(0, 45) + '...'\\n } else {\\n 简介内容收 = 简介内容 + '...'\\n }\\n\\n //图标获取\\n if (!图片) {\\n 图片 = 'https://lanmeiguojiang.com/tubiao/q/107.png'\\n }\\n\\n //页URL 获取\\n if (!页URL) {\\n 页URL = MY_RULE.title\\n }\\n\\n //标题与简介样式\\n var mztext = \\\"&nbsp;&nbsp;&nbsp;&nbsp;<small>简介</small><br>\\\"\\n var bttitle = '<font color=\\\"#098AC1\\\">漫画简介 </font><small><small><font color=\\\"#f47983\\\">简介收></font></small></small>'\\n\\n //展开与收缩操作\\n var jj = getMyVar(页URL + \\\"简介收\\\", \\\"已收起\\\");\\n var jjurl = $(\\\"#noLoading#\\\").lazyRule((简介内容, 简介内容收, 收, 收内容, 当前URL) => {\\n var jsbl = 当前URL + \\\"简介收\\\";\\n var jj = getMyVar(当前URL + \\\"简介收\\\", \\\"已收起\\\");\\n jj = jj == \\\"已收起\\\" ? \\\"展开\\\" : \\\"已收起\\\";\\n putMyVar(jsbl, jj)\\n updateItem({\\n extra: {\\n id: 当前URL + \\\"_bt\\\"\\n },\\n title: 收.replace(\\\"简介收\\\", jj)\\n })\\n\\n updateItem({\\n extra: {\\n id: 当前URL + \\\"_mz\\\"\\n },\\n title: jj == \\\"已收起\\\" ? 收内容.replace(\\\"简介\\\", 简介内容收) : 收内容.replace(\\\"简介\\\", 简介内容)\\n })\\n return \\\"hiker://empty\\\"\\n }, 简介内容, 简介内容收, bttitle, mztext, 页URL)\\n\\n\\n //标题\\n d.push({\\n title: bttitle.replace(\\\"简介收\\\", jj),\\n url: jjurl,\\n col_type: \\\"avatar\\\",\\n pic_url: 图片,\\n extra: {\\n id: 页URL + \\\"_bt\\\"\\n }\\n });\\n\\n //简介\\n d.push({\\n title: jj == \\\"已收起\\\" ? mztext.replace(\\\"简介\\\", 简介内容收) : mztext.replace(\\\"简介\\\", 简介内容),\\n col_type: \\\"rich_text\\\",\\n extra: {\\n id: 页URL + \\\"_mz\\\"\\n }\\n });\\n\\n}\\n\\nfunction 添加列表章节(d, 标题数据, 列表数据, 解析代码, 页URL, 图片) {\\n\\n\\n //d与外界d,为同内存地址,不用返回\\n //标题数据 即标题名字\\n //列表数据必须是JSON 格式是[{title:'',url:'',},.....] 且url必须有前缀\\n\\n //图标获取\\n if (!图片) {\\n 图片 = 'https://lanmeiguojiang.com/tubiao/q/18.png'\\n }\\n\\n //页URL 获取\\n if (!页URL) {\\n 页URL = MY_RULE.title\\n }\\n\\n //标题名\\n var 标题名 = '<b>路线</b> <small><small><font color=#f9906f>排序 ></font></small></small>'\\n\\n\\n var 排序 = getMyVar(页URL + \\\"章节排序\\\", \\\"正序\\\");\\n var 提示 = 排序 == '倒序' ? '正序' : '倒序';\\n\\n var 排序url = $(\\\"#noLoading#\\\").lazyRule((标题名, 标题数据, 列表数据, 解析代码, 页URL) => {\\n var 排序 = getMyVar(页URL + \\\"章节排序\\\", \\\"正序\\\");\\n var 提示 = 排序 == '倒序' ? '正序' : '倒序';\\n updateItem({\\n extra: {\\n id: 页URL + \\\"_排序\\\"\\n },\\n title: 标题名.replace('路线', 标题数据).replace('排序', 提示)\\n })\\n\\n\\n if (提示 == '倒序') {\\n 列表数据.reverse()\\n }\\n 列表数据.forEach(function(data, ssid) {\\n updateItem({\\n title: data.title,\\n url: data.url + 解析代码,\\n extra: {\\n id: 页URL + \\\"_选集\\\" + ssid\\n }\\n });\\n });\\n\\n\\n putMyVar(页URL + \\\"章节排序\\\", 提示)\\n return \\\"hiker://empty\\\"\\n }, 标题名, 标题数据, 列表数据, 解析代码, 页URL)\\n\\n d.push({\\n title: 标题名.replace('路线', 标题数据).replace('排序', 排序),\\n pic_url: 图片,\\n url: 排序url,\\n col_type: \\\"avatar\\\",\\n extra: {\\n id: 页URL + \\\"_排序\\\"\\n }\\n });\\n\\n if (排序 == '倒序') {\\n 列表数据.reverse()\\n }\\n\\n 列表数据.forEach(function(data, id) {\\n d.push({\\n title: data.title,\\n url: data.url + 解析代码,\\n col_type: \\\"text_2\\\",\\n extra: {\\n id: 页URL + \\\"_选集\\\" + id\\n }\\n });\\n });\\n\\n}\\n\\n/*\\nfunction 添加防止网页(项url, UA) {\\n\\n //上级跳转到当前页的链接必须是hiker://empty;不然一刷新还是会重复加载\\n //UA ''或false或'手机' 默认是手机端 ; 电脑 'PC'\\n\\n var 刷新重复 = MY_RULE.title + \\\"网页源码\\\"\\n var pc链接 = 项url.replace(\\\"m.\\\", \\\"www.\\\")\\n var 手机链接 = 项url.replace(\\\"www.\\\", \\\"m.\\\")\\n\\n var code;\\n if (getMyVar(刷新重复, \\\"false\\\") == \\\"false\\\") {\\n\\n code = UA == 'PC' ? fetch(pc链接) : request(手机链接);\\n putMyVar(刷新重复, getParam('url') + \\\"¥&¥\\\" + code)\\n\\n } else {\\n\\n var pm = getMyVar(刷新重复).split(\\\"¥&¥\\\")\\n if (pm[0] == getParam('url')) {\\n code = pm[1]\\n } else {\\n code = UA == 'PC' ? fetch(pc链接) : request(手机链接);\\n putMyVar(刷新重复, getParam('url') + \\\"¥&¥\\\" + code)\\n }\\n }\\n return code\\n}\\n*/\\n\\nfunction 添加选择路线(d, 路线数据, 页URL, 多路线否) {\\n\\n //路线数据 格式[{title:'路线名'},....]\\n //多路线否 false 则不启用选择路线;true 则启用\\n\\n var 选择列表 = getItem(页URL + \\\"选择列表\\\", \\\"0\\\")\\n\\n if (多路线否) {\\n\\n var 路线选中 = '‘‘’’<font color=#098AC1>选中</font>'\\n\\n\\n d.push({\\n title: '‘‘’’📖<font color=\\\"#FA7298\\\"> 图源列表</font> :',\\n url: \\\"toast://点我干啥呢\\\",\\n col_type: 'flex_button'\\n });\\n\\n\\n 路线数据.forEach(function(data, id) {\\n\\n var jjurl = $(\\\"#noLoading#\\\").lazyRule((页URL,id) => {\\n setItem(页URL + '选择列表',id+'');\\n refreshPage(false);\\n return \\\"hiker://empty\\\";\\n },页URL,id);\\n\\n var 标题名 = id == 选择列表 ? 路线选中.replace('选中', data.title) : data.title;\\n d.push({\\n title: 标题名,\\n url: jjurl,\\n col_type: 'flex_button',\\n extra: {\\n id: 页URL + \\\"_路线\\\" + id\\n }\\n });\\n });\\n\\n }\\n return 选择列表\\n}\\n\\n\\nfunction 添加选择下载(d, 路线数据, 多路线否) {\\n d.push({\\n title: '‘‘’’🗳<font color=\\\"#f47983\\\"> 书架</font> ',\\n url: \\\"hiker://page/Bookrack.view?rule=本地资源管理&ruleName=\\\"+MY_RULE.title,\\n col_type: 'scroll_button'\\n});\\n\\n //路线数据 格式[{title:'路线名',sjss:'下载资料信息'},....]\\n //多路线否 false 则只有①个下载 标题为 点击下载;true 则多个下载\\n\\nif(多路线否){\\n\\nd.push({\\n title: '‘‘’’📥<font color=\\\"#f47983\\\"> 下载</font> :',\\n url: \\\"toast://点我干啥呢\\\",\\n col_type: 'scroll_button'\\n });\\n\\n}\\n\\n 路线数据.forEach(function(data, id) {\\n\\n d.push({\\n title: data.title.includes('章节列表') ? '点击下载' : data.title,\\n url: 'hiker://page/download.view#noRecordHistory##noRefresh##noHistory#?rule=本地资源管理',\\n col_type: 'scroll_button',\\n extra: data.sjss\\n });\\n });\\n\\n if (多路线否) {\\n d.push({\\n col_type: \\\"line_blank\\\"\\n });\\n }\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"CSS选择器模版*\",\"path\":\"ejwb.js\",\"rule\":\"function 一级(列表, 标题, 图片, 集数, 链接, 访问头) {\\n 访问头 = !访问头 ? '' : 访问头\\n var d = [];\\n var code = getCode()\\n pdfa(code, 列表).forEach(function(data) {\\n d.push({\\n title: pdfh(data, 标题),\\n desc: pdfh(data, 集数),\\n pic_url: pd(data, 图片)||图片 + \\\"@Referer=\\\" + 访问头,\\n url: 'hiker://empty#immersiveTheme##autoCache#',\\n col_type: \\\"movie_3\\\",\\nextra: {\\n name: pdfh(data, 标题),\\n url: pd(data, 链接),\\n qz: MY_HOME\\n }\\n });\\n });\\n setResult(d);\\n}\\n\\n\\n\\nfunction 搜索(列表, 标题, 链接, 描述, 详情, 图片, 访问头) {\\n var d = [];\\n 访问头 = !访问头 ? '' : 访问头\\n pdfa(getResCode(), 列表).forEach(function(data) {\\n d.push({\\n title: pdfh(data, 标题),\\n desc: pdfh(data, 描述),\\n pic_url: pd(data, 图片) + \\\"@Referer=\\\" + 访问头,\\n url: 'hiker://empty#immersiveTheme##autoCache#',\\n content: pdfh(data, 详情),\\n\\nextra: {\\n name: pdfh(data, 标题),\\n url: pd(data, 链接),\\n qz: MY_HOME\\n }\\n });\\n });\\n setResult(d);\\n}\\n\\n\\n\\n\\nfunction 最新(选择器, UA) {\\n if (UA == \\\"PC\\\") {\\n var code = fetch(getParam('url').replace(\\\"m.\\\", \\\"www.\\\"));\\n } else {\\n var code = request(getParam('url').replace(\\\"www.\\\", \\\"m.\\\"));\\n }\\n setResult(pdfh(code, 选择器))\\n}\\n\\n\\n\\neval(JSON.parse(request(\\\"hiker://page/qs?rule=阅漫君\\\")).rule)\\n\\nfunction 二级(头部列表, 标题, 图片, 描述, 访问头, 作者, 时间, 分类, 简介, 多路线否, 路线列表, 路线名, 选集总列表, 选集列表, 集名, 集url, downloadlazy,当前URL,当前页名,前缀,UA,防重载否) {\\n var d = [];\\n\\n//头部列表 则默认使用 code 来作为头部列表数据\\n//多路线否 true 则使用多路线;false 则使用章路线\\n//UA 不填则使用手机端 'PC'则手机端\\n\\nif (当前页名) {\\n setPageTitle(当前页名)\\n}\\n\\nif(防重载否){\\n//网页内容+防止重拉\\n var code = 添加防止网页(当前URL, UA)\\n}else{\\n var code = getCode()\\n}\\n \\n\\n //头部列表数据\\n var 头部 = !头部列表 ? code : pdfa(code, 头部列表)[0];\\n 标题 = pdfh(头部, 标题)\\n 图片 = pdfh(头部, 图片)||图片\\n if (图片) {\\n 图片 = 图片.includes('http') ? 图片 : 前缀 + 图片\\n if (!访问头) {} else if (访问头.substr(0, 1) == '@') {\\n 图片 = 图片 + 访问头\\n } else {\\n 图片 = 图片 + \\\"@Referer=\\\" + 访问头\\n }\\n }\\n \\n\\n描述 = 描述.includes('$') ? 描述.split('$')[1] + pdfh(头部, 描述.split('$')[0]) : pdfh(头部, 描述)\\n\\n作者 = 作者.includes('$') ? 作者.split('$')[1] + pdfh(头部, 作者.split('$')[0]) : pdfh(头部, 作者)\\n \\n时间 = 时间.includes('$') ? 时间.split('$')[1] + pdfh(头部, 时间.split('$')[0]) : pdfh(头部, 时间)\\n\\n分类 = 分类.includes('$') ? 分类.split('$')[1] + pdfh(头部, 分类.split('$')[0]) : pdfh(头部, 分类)\\n\\n \\n //头部列表\\n 添加头部列表(d, 标题, 图片, 描述, 作者, 时间, 分类,当前URL)\\n \\n //路线名与选集数据\\n var 章节json = 优化路线章节数据(多路线否, code, 路线列表,路线名,选集总列表,选集列表,集名,集url,前缀,当前页名,图片)\\n\\n //简介\\n 添加简介(d, pdfh(code, 简介), 当前URL, '')\\n\\n //当没有章节内容,就不显示\\n if (章节json.length > 0) {\\n\\n //路线选择\\n var 选择列表 = 添加选择路线(d, 章节json, 当前URL, 多路线否)\\n\\n //选择下载\\n 添加选择下载(d, 章节json,多路线否)\\n\\n //排序与选集\\n 添加列表章节(d, 章节json[选择列表].title, 章节json[选择列表].list, lazy, 当前URL, '')\\n\\n d.push({\\n col_type: \\\"long_text\\\"\\n });\\n }\\n setResult(d)\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级列表*\",\"path\":\"ejlb\",\"rule\":\"var tabs = []\\nvar lists = []\\nvar arts = pdfa(html, 线路);\\narts.forEach((data, id) => {\\n tabs.push(pdfh(data, 线路名))\\n})\\nvar conts = pdfa(html, 选集);\\nconts.forEach((data, id) => {\\n lists.push(pdfa(data, 选集列表))\\n})\\naddListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"lists\\\");\\n}));\\nstorage0.putMyVar(\\\"lists\\\", lists);\\nvar list = lists[getMyVar(MY_URL, '0')];\\nvar 排序 = getMyVar(MY_URL + \\\"章节排序\\\", '#1aad19\\\">正序');\\nvar 提示 = 排序 == '#FF0000\\\">倒序' ? '#1aad19\\\">正序' : '#FF0000\\\">倒序';\\nvar 排序名 = '““””<b><span style=\\\"color:排序</span></b>'\\n\\nd.push({\\n title: '““””<b><span style=\\\"color: ' + 排序 + '</span></b>',\\n url: $(\\\"#noLoading#\\\").lazyRule((排序名, lazy) => {\\n var lists = storage0.getMyVar(\\\"lists\\\");\\n var 章节 = lists[getMyVar(MY_URL, '0')];\\n var 排序 = getMyVar(MY_URL + \\\"章节排序\\\", '#1aad19\\\">正序');\\n var 提示 = 排序 == '#FF0000\\\">倒序' ? '#1aad19\\\">正序' : '#FF0000\\\">倒序';\\n updateItem({\\n extra: {\\n id: MY_URL + \\\"_排序\\\"\\n },\\n title: 排序名.replace('排序', 提示)\\n })\\n if (排序 == '#1aad19\\\">正序') {\\n 章节.reverse()\\n }\\n let cp = 章节.map((data, ssid) => {\\n return {\\n title: pdfh(data, 'a&&Text'),\\n url: pd(data, 'a&&href') + lazy,\\n col_type: 'text_2',\\n extra: {\\n cls: MY_URL + \\\"_选集\\\"\\n }\\n };\\n });\\n deleteItemByCls(MY_URL + \\\"_选集\\\");\\n addItemBefore(MY_URL + \\\"footer\\\", cp);\\n putMyVar(MY_URL + \\\"章节排序\\\", 提示)\\n return \\\"hiker://empty\\\"\\n }, 排序名, lazy),\\n col_type: 'text_center_1',\\n extra: {\\n id: MY_URL + \\\"_排序\\\"\\n }\\n})\\ntabs.forEach((data, id) => {\\n d.push({\\n title: getMyVar(MY_URL, '0') == id ? '““' + data + '””' : data,\\n url: $(\\\"#noLoading#\\\").lazyRule((线路, lazy, id) => {\\n var lists = storage0.getMyVar(\\\"lists\\\");\\n var 排序 = getMyVar(MY_URL + \\\"章节排序\\\", '#1aad19\\\">正序');\\n var 提示 = 排序 == '#FF0000\\\">倒序' ? '#1aad19\\\">正序' : '#FF0000\\\">倒序';\\n\\n 线路.forEach((data, xlid) => {\\n updateItem({\\n title: id == xlid ? '““' + data + '””' : data,\\n extra: {\\n id: MY_URL + \\\"_线路\\\" + xlid\\n }\\n });\\n })\\n putMyVar(MY_URL, id)\\n var 章节 = lists[getMyVar(MY_URL, '0')];\\n if (排序 == '#FF0000\\\">倒序') {\\n 章节.reverse()\\n }\\n let cp = 章节.map((data, ssid) => {\\n return {\\n title: pdfh(data, 'a&&Text'),\\n url: pd(data, 'a&&href') + lazy,\\n col_type: 'text_2',\\n extra: {\\n cls: MY_URL + \\\"_选集\\\"\\n }\\n };\\n });\\n deleteItemByCls(MY_URL + \\\"_选集\\\");\\n addItemBefore(MY_URL + \\\"footer\\\", cp);\\n return \\\"hiker://empty\\\"\\n }, tabs, lazy, id),\\n col_type: 'text_center_1',\\n extra: {\\n id: MY_URL + \\\"_线路\\\" + id\\n }\\n });\\n})\\n\\nif (排序 == '#FF0000\\\">倒序') {\\n list.reverse()\\n}\\nlist.forEach((data, id) => {\\n d.push({\\n title: pdfh(data, 'a&&Text'),\\n url: pd(data, 'a&&href') + lazy,\\n col_type: 'text_2',\\n extra: {\\n cls: MY_URL + \\\"_选集\\\"\\n }\\n });\\n})\\nlet newstip = list.length;\\nif (newstip) {\\n setLastChapterRule('js:' + $.toString((newstip) => {\\n setResult('更新至: 第' + newstip + \\\"集\\\");\\n }, newstip));\\n}\\n\\nd.push({\\n col_type: \\\"big_blank_block\\\",\\n extra: {\\n id: MY_URL + \\\"footer\\\"\\n }\\n});\"},{\"col_type\":\"movie_3\",\"name\":\"环境劫持\",\"path\":\"hijackEnv\",\"rule\":\"var { RULE, isIndex, pageTitle } = MY_PARAMS\\nRULE = JSON.parse(base64Decode(RULE))\\nvar oriRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE).find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = oriRULE\\n var { tabHeader, fyAll } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, RULE))\\n // 处理MY_RULE\\n MY_RULE.class_url = tabHeader.getClass(fyAll ? 'fyAll' : 'fyclass').url\\n MY_RULE.area_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyarea').url\\n MY_RULE.year_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fyyear').url\\n MY_RULE.sort_url = fyAll ? MY_RULE.class_url : tabHeader.getClass('fysort').url\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n RULE.pages = oriRULE.pages\\n // 处理MY_RULE\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\nMY_RULE.ua = RULE.ua\\nlog(MY_RULE.url)\\n// 载入函数工具\\nvar { genMyRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE, {\\n QING_TITLE: QING_TITLE,\\n MY_RULE: MY_RULE,\\n isIndex: isIndex\\n})\\n// 防止require多次运行\\nconst myColl_required = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param2 = param2 != null ? param2 : 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (myColl_required[param0]) return\\n myColl_required[param0] = true\\n param3 = param3 != null ? param3 : 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n// 最新章节规则环境劫持\\nsetLastChapterRule = function(param0) {\\n if (param0.startsWith(\\\"js:\\\")) {\\n param0 = 'js:' + $.toString((QING_TITLE, MY_PARAMS) => {\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var { runPreRule } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n runPreRule(oriRULE.preRule)\\n }, QING_TITLE, { url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex }) + ';' + param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0)\\n}\\n// 动态新增函数劫持\\naddItemAfter = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemAfter.invoke(javaContext, param0, param1)\\n}\\naddItemBefore = function(param0, param1) {\\n if (Array.isArray(param1)) param1 = param1.map(hijackEl)\\n else param1 = hijackEl(param1)\\n method_addItemBefore.invoke(javaContext, param0, param1)\\n}\\n//@菜团 环境劫持劫持哪里加个这个-L佬\\nrequest = function(param0, param1, param2) {\\n if (param0.includes(\\\"hiker://page/\\\")) {\\n let rule = (param0.split(/\\\\?.*rule=/)[1] || \\\"\\\").split(\\\"&\\\")[0];\\n let pageUrl = param0.split(\\\"hiker://page/\\\")[1].split(\\\"?\\\")[0];\\n if (rule !== QING_TITLE) {\\n let ruleCode;\\n if (!rule || rule === RULE.title) {\\n ruleCode = (RULE.pageList || (RULE.pageList = JSON.parse(RULE.pages))).find(v => v.path === pageUrl);\\n }\\n if(ruleCode){\\n return JSON.stringify(ruleCode);\\n }else{\\n return \\\"\\\";\\n }\\n }\\n }\\n param2 = MY_RULE;\\n var retStr = method_request.invoke(javaContext, param0, param1, param2);\\n try {\\n if (retStr instanceof java.io.InputStream) {\\n return retStr;\\n }\\n } catch (e) {}\\n return retStr == null ? retStr : retStr + \\\"\\\";\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"函数工具\",\"path\":\"funcTools\",\"rule\":\"let { QING_TITLE, MY_RULE, isIndex } = $.importParam\\nif (!MY_RULE) MY_RULE = {}\\n\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\n// 首页链接替换分类\\nfunction indexUrl(param) {\\n MY_RULE = JSON.parse(base64Decode(MY_RULE))\\n let pageNum = parseInt(param.split('###')[1]),\\n url = MY_RULE.url,\\n { fyAll, tabHeader } = $.require('hiker://page/ClassTab?rule=' + QING_TITLE, Object.assign({ QING_TITLE: QING_TITLE }, MY_RULE))\\n\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, paramTmp\\n try { // 链接的编码、UA和Referer应该是首先继承首页链接\\n [, , charset, paramTmp] = urlTmp.split(';')\\n paramTmp = paramTmp.match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { paramTmp = [] }\\n let UserAgent = paramTmp.find((v) => v.startsWith('User-Agent@')),\\n Referer = paramTmp.find((v) => v.startsWith('Referer@'))\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA和上级Referer\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n if (Referer && !urlParam[2].some((v) => v.startsWith('Referer@')))\\n urlParam[2].push(Referer)\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n// 预处理并初始化config\\nfunction runPreRule(rule) {\\n if ((typeof MY_PAGE != 'undefined' && MY_PAGE == 1) &&\\n (isIndex || !getMyVar('$preRule_' + MY_RULE.title))) {\\n eval(rule)\\n putMyVar('$preRule_' + MY_RULE.title, 'T')\\n }\\n let _cfg = getMyVar('initConfig', '{}')\\n if (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n }\\n}\\n// 正文解析通用变量\\nfunction genMyRule() {\\n let RULE = Object.assign({}, MY_RULE)\\n delete RULE.last_chapter_rule\\n delete RULE.preRule\\n delete RULE.pageList\\n delete RULE.pages\\n return RULE\\n}\\n\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, MY_RULE.ua, MY_RULE.url)\\n}\\n\\nhijackLazyRule = $.toString((QING_TITLE, MY_PARAMS) => {\\n if (!MY_RULE) MY_RULE = {}\\n MY_PARAMS = JSON.parse(base64Decode(MY_PARAMS))\\n eval(JSON.parse(fetch('hiker://page/hijackEnv?rule=' + QING_TITLE)).rule)\\n var {\\n paramHandle,\\n genExUrl,\\n hijackLazyRule,\\n hijackEl\\n } = $.require('hiker://page/funcTools?rule=' + QING_TITLE)\\n}, QING_TITLE, base64Encode(JSON.stringify({ url: MY_RULE.url, RULE: base64Encode(JSON.stringify(genMyRule())), isIndex: isIndex })))\\n\\nfunction hijackEl(el) {\\n if(!el || typeof el != 'object') return\\n if (!el.extra) el.extra = {}\\n el.col_type = el.col_type || MY_RULE.col_type\\n let NOW_RULE = Object.assign(genMyRule(), { params: el.extra })\\n\\n if (typeof el.url != 'string' ||\\n ['x5_webview_single', 'input'].some((v) => el.col_type == v) ||\\n ['海阔视界', 'javascript:'].some((v) => el.url.startsWith(v)) ||\\n ['rule', 'pics', 'toast', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'x5Rule', 'webRule',\\n 'download', 'share', 'fileSelect', 'video'].some((v) => el.url.startsWith(v + '://'))) {\\n return el\\n } else if (el.url.startsWith('input://')) {\\n let para = JSON.parse(el.url.slice(8))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'input://' + JSON.stringify(para)\\n return el\\n } else if (el.url.startsWith('confirm://')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (el.url.startsWith('select://')) {\\n let para = JSON.parse(el.url.slice(9))\\n if (para.js) para.js = hijackLazyRule + ';' + para.js\\n el.url = 'select://' + JSON.stringify(para)\\n return el\\n } else if (el.url.includes('@rule=')) {\\n let [_, url, rule] = el.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n el.url = url\\n NOW_RULE.detail_find_rule = rule\\n NOW_RULE.detail_col_type = MY_RULE.col_type\\n } else if (el.url.startsWith('hiker://page/')) {\\n if (el.url.includes('rule=') || el.extra.rule)\\n return el\\n let [_, path, flag, params] = el.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n el.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (el.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n NOW_RULE.detail_find_rule = subPage.rule\\n NOW_RULE.detail_col_type = subPage.col_type\\n } else if (el.url.includes('@lazyRule=')) {\\n let reIndex = el.url.indexOf('.js:')\\n if (reIndex >= 0) el.url = el.url.slice(0, reIndex) + '.js:' + hijackLazyRule + ';' + el.url.slice(reIndex + 4)\\n return el\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(el.url)) return el\\n } else {\\n return el\\n }\\n el.extra = Object.assign({}, el.extra, {\\n url: genExUrl(el.url),\\n RULE: base64Encode(JSON.stringify(NOW_RULE)),\\n pageTitle: isIndex && el.title\\n })\\n el.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return el\\n}\\n$.exports = {\\n runCode: runCode,\\n indexUrl: indexUrl,\\n paramHandle: paramHandle,\\n runPreRule: runPreRule,\\n genMyRule: genMyRule,\\n genExUrl: genExUrl,\\n hijackLazyRule: hijackLazyRule,\\n hijackEl: hijackEl\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"漫画解析*\",\"path\":\"js\",\"rule\":\"function 爱米推类(input) {\\n\\ttry{\\n var url = input\\n .replace('m.'||'mh.'||'wap.', 'www.')\\n .replace('ikr.', 'icekr.');\\n var html = request(url, {\\n headers: {\\n 'User-Agent': PC_UA,\\n 'Referer': url\\n }\\n})\\n eval(pdfh(pdfa(html, 'body&&script:not([src]):not([type])')[0], 'script&&Html'));\\n var pics = [];\\n if (chapterImages.length > 0) {\\n var host = request(input).match(/img src=\\\"(.*?)\\\\/image/)[1];\\n chapterImages.forEach(img => {\\n if (img.indexOf(\\\"http\\\") > -1) {\\n pics.push(img + '@Referer=' + url)\\n } else {\\n pics.push(host + img + '@Referer=' + url)\\n }\\n })\\n } else {\\n var html = request(input);\\n var pics = [];\\n if(/k_total/.test(html)){\\n var Page = pdfh(html, '#k_total&&Text');\\n if(Page.length > 0){\\n var host = html.match(/mip-img src=\\\"(.*?)image/)[1];\\n for (var i = 0; i < Page; i++) {\\n pics.push(host + 'image/view/' + input.match(/\\\\d+/)[0] + '/' + i + '.webp'+ '@Referer=')\\n }\\n } else {\\n var res1 = {};\\n var d1 = [];\\n var jsHtml = fetch(input, {\\n headers: {\\n \\\"content-type\\\": \\\"UTF-8\\\",\\n \\\"User-Agent\\\": \\\"Mobile\\\"\\n },\\n method: \\\"GET\\\"\\n });\\n var pics = [];\\n for (var k = 1;; k++) {\\n try {\\n var jsHtml = fetch(input.split(\\\".html\\\")[0] + \\\"-\\\" + k + \\\".html\\\", {\\n headers: {\\n \\\"content-type\\\": \\\"UTF-8\\\",\\n \\\"User-Agent\\\": \\\"Mobile\\\"\\n },\\n method: \\\"GET\\\"\\n });\\n let page = pdfh(jsHtml, \\\"\\\");\\n if (page && page.includes(\\\"/\\\")) {\\n page = parseInt(page.split(\\\"/\\\")[1]);\\n var jsUrl = parseDomForHtml(jsHtml, \\\".erPag&&mip-img||img&&src\\\")+ '@Referer=';\\n if (jsUrl.indexOf(\\\"png\\\") > -1) {\\n break\\n }\\n let urls = [];\\n for (let i = 2; i <= page; i++) {\\n urls.push({\\n url: input.split(\\\".html\\\")[0] + \\\"-\\\" + i + \\\".html\\\",\\n options: {\\n headers: {\\n \\\"content-type\\\": \\\"UTF-8\\\",\\n \\\"User-Agent\\\": \\\"Mobile\\\"\\n },\\n method: \\\"GET\\\"\\n }\\n })\\n }\\n let htmls = bf(urls);\\n for (let i = 0; i < htmls.length; i++) {\\n var jsUrl = parseDomForHtml(htmls[i], \\\".erPag&&mip-img||img&&src\\\")+ '@Referer=';\\n if (jsUrl.indexOf(\\\"png\\\") > -1) {\\n break\\n }\\n }\\n pics.push(jsUrl);\\n }\\n var jsUrl = parseDomForHtml(jsHtml, \\\".erPag&&mip-img||img&&src\\\")+ '@Referer=';\\n if (jsUrl.indexOf(\\\"png\\\") > -1) {\\n break\\n } else {\\n pics.push(jsUrl);\\n }\\n } catch (e) {\\n break\\n }\\n }\\n }\\n } else {\\n var list = pdfa(html, 'body&&.scroll-item||.image-content||#scroll-image');\\n var first = pdfa(html, 'body&&#image');\\n list = first.concat(list);\\n list.forEach(img => {\\n pics.push(pdfh(img, 'img&&data-src||src') + '@Referer=' + input)\\n })\\n }\\n }\\n } catch(e) {\\n var html = request(input);\\n var pics = [];\\n var list = pdfa(html, 'body&&.scroll-item||.image-content||#scroll-image');\\n var first = pdfa(html, 'body&&#image');\\n list = first.concat(list);\\n list.forEach(img => {\\n pics.push(pdfh(img, 'img&&data-src||src') + '@Referer=' + input)\\n })\\n }\\n return \\\"pics://\\\" + pics.join(\\\"&&\\\")\\n}\\n$.exports.jx=爱米推类;\\n\\nfunction 包子(input) {\\n var id = true;\\n var code = request(input)\\n var pics = [];\\n var to_Repeat = false;\\n\\n\\n while (id) {\\n pdfa(code, \\\".chapter-main&&amp-img\\\")\\n .forEach(data => pics.push(pdfh(data, \\\"amp-img&&src\\\") + '@Referer=https://www.webmota.com/'));\\n var next_Page = pdfh(code, \\\".next_chapter,-1&&Html\\\")\\n if (next_Page.includes('下一页')) {\\n code = request(pdfh(next_Page, \\\"a&&href\\\"))\\n to_Repeat = true;\\n } else {\\n id = false;\\n }\\n }\\n\\n //去除重复图片\\n if (to_Repeat) {\\n for (let i = 0; i < pics.length; i++) {\\n while (pics.indexOf(pics[i], i + 1) != -1) {\\n pics.splice(pics.indexOf(pics[i], i + 1), 1)\\n }\\n }\\n }\\n\\n return \\\"pics://\\\" + pics.join(\\\"&&\\\");\\n}\\n$.exports.bz=包子;\\n\\nfunction 古风(input) {\\n\\tvar html = fetchPC(input);\\n\\teval(pdfh(pdfa(html, 'body&&script:not([src]):not([type])')[0], 'script&&Html'));\\n\\tvar pics = [];\\n\\tfor (var i in chapterImages) {\\n\\t\\tpics.push('https://res.xiaoqinre.com/' + chapterPath + chapterImages[i] + '@Referer=https://www.123gf.com')\\n\\t\\t}\\n\\treturn \\\"pics://\\\" + pics.join(\\\"&&\\\")\\n}\\n$.exports.GF=古风;\\n\\nfunction 爱米(input) {\\n var html = request(input);\\n var pics = [];\\n var list = pdfa(html, 'body&&.scroll-item||.image-content||#scroll-image');\\n var first = pdfa(html, 'body&&#image');\\n list = first.concat(list);\\n list.forEach(img => {\\n pics.push(pdfh(img, 'img&&data-src||src') + '@Referer=' + input)\\n })\\n return \\\"pics://\\\" + pics.join(\\\"&&\\\")\\n}\\n$.exports.IM=爱米;\"},{\"col_type\":\"movie_3\",\"name\":\"云口令*\",\"path\":\"import\",\"rule\":\"writeFile('hiker://files//rules/Tz/JM',fetch(input))\\n'toast://已从云口令获取阅漫君源'\"},{\"col_type\":\"movie_3\",\"name\":\"更新详情*\",\"path\":\"Up\",\"rule\":\"js:\\nvar res = {};\\nvar items = [];\\nvar img = 'https://bing.img.run/1366x768.php';\\nitems.push({\\n img: img,\\n url: img + \\\"#.jpg\\\",\\n desc: '0',\\n col_type: 'card_pic_1'\\n});\\n\\nitems.push({\\n title: \\\"““””<h4>【阅漫君反馈收集】</h4>\\\" + '<span style=\\\"color: grey\\\">小小</span>',\\n col_type: \\\"text_center_1\\\",\\n url: \\\"hiker://page/manageRule#noHistory##noRecordHistory#?rule=道长仓库Pro\\\",\\n extra: {\\n lver: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\",\\n id: \\\"6791\\\"\\n }\\n});\\n\\nif (getItem(\\\"read_policy\\\") !== \\\"1\\\") {\\n items.push({\\n title: '““””<small><font color=#871f78>本规则数据来源于网络,如您喜欢,请支持官方</font></small>',\\n desc: '““””<small><font color=#f20c00>本规则仅限免费学习交流使用,请于导入后24小时内删除,任何组织或个人不得以任何方式方法传播或售卖此规则的整体或部分!</font></small>',\\n url: $('#noHistory#').lazyRule(() => {\\n setItem(\\\"read_policy\\\", \\\"1\\\")\\n refreshPage(false)\\n return \\\"toast://你已同意该协议\\\"\\n }),\\n col_type: 'text_center_1'\\n })\\n}\\n\\nitems.push({\\n title: '““””<b>使用说明</b>',\\n url: \\\"切换分组搜索即可\\\",\\n col_type: \\\"text_2\\\"\\n});\\n\\nlet newVersion;\\nlet myVersion = MY_PARAMS.version;\\ntry {\\n newVersion = JSON.parse(fetchPC(\\\"http://hiker.nokia.press/hikerule/dev/getbyid?id=6749\\\", {\\n timeout: 1000\\n })).result.ver;\\n} catch (e) {\\n toast(\\\"道长仓库抽风了,本次未检测到新版信息\\\");\\n newVersion = myVersion;\\n}\\nlet isUpdate = Number(newVersion) > Number(myVersion);\\nlet isVer = Number(newVersion) === Number(myVersion);\\nif (isUpdate) {\\n log('有新版本:' + newVersion + ',当前:' + myVersion);\\n}\\nitems.push({\\n title: isUpdate ? \\\"🆙新版本\\\" : \\\"规则发布页&反馈\\\",\\n url: isUpdate ? \\\"rule://5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQ6IGa5ryr8J+UruOAke+/pWhvbWVfcnVsZV91cmzvv6VodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ3\\\" : \\\"hiker://page/manageRule#noHistory##noRecordHistory#?rule=道长仓库Pro\\\",\\n col_type: \\\"text_2\\\",\\n extra: {\\n lver: MY_PARAMS.version || \\\"获取版本失败,自行查看\\\",\\n id: \\\"6791\\\"\\n }\\n});\\nconst Color = \\\"#19B89D\\\";\\nvar des_desc = \\n'<h1 style=\\\"text-align: center;\\\">🐾更新[20240120]</h1>' +\\n '<<blockquote><font color=\\\"red\\\">①剔除失效源,漫蛙国内/分类修复</br></<blockquote>' +\\n\\n'<h1 style=\\\"text-align: center;\\\">🐾更新[1105]</h1>' +\\n '<<blockquote><font color=\\\"red\\\">①更换远程仓库,优化加载速度 并增加更新长按规则名 清除缓存即可</br>②修复漫蛙图源加载不出来<br></<blockquote>' +\\n\\n'<h1 style=\\\"text-align: center;\\\">🐾更新[231023]</h1>' +\\n '<<blockquote><font color=\\\"red\\\">①增加漫神/野蛮漫画</br><br>②优化阅漫君本体,与旧规则不兼容,需删除更新规则本地</br><br>③剔除无用源,修复部分源报错</br></<blockquote>'\\n\\nitems.push({\\n title: '更新详情 <small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>',\\n img: \\\"https://lanmeiguojiang.com/tubiao/more/197.png\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((jjid, decid, des_desc) => {\\n if (getMyVar(\\\"jjs\\\", \\\"收起\\\") == \\\"收起\\\") {\\n putMyVar(\\\"jjs\\\", \\\"展开\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '更新详情 <small><small><span style=\\\"color:#19B89D\\\">收起></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc + '</span>'\\n })\\n return \\\"hiker://empty\\\"\\n } else {\\n putMyVar(\\\"jjs\\\", \\\"收起\\\");\\n\\n updateItem({\\n extra: {\\n id: jjid\\n },\\n title: '更新详情<small><small><span style=\\\"color:#19B89D\\\">展开></span></small></small>'\\n })\\n\\n updateItem({\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: decid\\n },\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 150)\\n })\\n return \\\"hiker://empty\\\"\\n }\\n\\n }, MY_RULE + \\\"_jjid\\\", MY_RULE + \\\"_decid\\\", des_desc),\\n col_type: \\\"avatar\\\",\\n extra: {\\n id: MY_RULE + \\\"_jjid\\\"\\n }\\n});\\n\\nitems.push({\\n title: '<span style=\\\"color:#808080\\\">' + des_desc.substr(0, 150),\\n col_type: \\\"rich_text\\\",\\n extra: {\\n textSize: 14,\\n lineSpacing: 3,\\n id: MY_RULE + \\\"_decid\\\"\\n }\\n});\\n\\nres.data = items;\\nsetHomeResult(res);\"},{\"col_type\":\"movie_3\",\"name\":\"使用帮助*\",\"path\":\"Help\",\"rule\":\"js:\\nvar res = {};\\nvar items = [];\\n\\nitems.push({\\n title:'二级页面标题双击优化,在顶部则双击到底部,否则双击回顶部',\\n col_type: 'rich_text'\\n});\\n\\nitems.push({\\n img: 'https://s1.ax1x.com/2022/11/04/xLhgoR.jpg',\\n desc: '0',\\n col_type: 'pic_1_full'\\n});\\n\\nitems.push({\\n img: 'https://s1.ax1x.com/2022/11/04/xLhcw9.jpg',\\n desc: '0',\\n col_type: 'pic_1_full'\\n});\\n\\nres.data = items;\\nsetHomeResult(res);\"},{\"col_type\":\"movie_3\",\"name\":\"搜索*\",\"path\":\"search\",\"rule\":\"function convert1(str) {\\n let c = str.split(\\\";\\\")\\n return {\\n 列表: c[0],\\n 标题: c[1],\\n 链接: c[2],\\n 描述: c[3],\\n 详情: c[4],\\n 图片: c[5]\\n }\\n}\\n\\nfunction merge(source, target) {\\n let keys = Object.keys(source)\\n for (let i in keys) {\\n target[keys[i]] = source[keys[i]]\\n }\\n}\\n\\nfunction 搜索(obj) {\\n var d = [];\\n if ($.type(obj) == \\\"string\\\") {\\n obj = convert1(obj)\\n }\\n if (obj.规则) {\\n let c = convert1(obj.规则)\\n merge(c, obj)\\n }\\n let arr = pdfa(getResCode(), obj.列表);\\n if (obj.列表处理 != null) {\\n arr = obj.链接处理(arr)\\n }\\n for (let it of arr) {\\n let url = pd(it, obj.链接)\\n if (obj.链接处理 != null) {\\n url = obj.链接处理(url)\\n }\\n let title = pdfh(it, obj.标题)\\n if (obj.标题处理 != null) {\\n title = obj.标题处理(title)\\n }\\n let pic = pd(it, obj.图片)\\n if (obj.图片处理 != null) {\\n pic = obj.图片处理(pic)\\n }\\n d.push({\\n title: obj.标题 ? pdfh(it, obj.标题) : \\\"\\\",\\n url: url+'#autoCache#',\\n col_type: \\\"\\\",\\n desc: obj.描述 ? pdfh(it, obj.描述) : \\\"\\\",\\n content: obj.详情 ? pdfh(it, obj.详情) : \\\"\\\",\\n pic_url: pic,\\n extra: {\\n ytitle: title,\\n ypic: pic,\\n yurl: url.replace('hiker://empty##','')\\n }\\n });\\n\\n }\\n setResult(d);\\n}\\nvar tool = {\\n 搜索: 搜索\\n}\\n$.exports = tool\"},{\"col_type\":\"movie_3\",\"name\":\"图片解密*\",\"path\":\"imgDES\",\"rule\":\"$.exports.imgDecrypt = function() {\\n var javaImport = new JavaImporter();\\n javaImport.importPackage(\\n Packages.com.example.hikerview.utils,\\n Packages.java.lang,\\n Packages.java.security,\\n Packages.java.util,\\n Packages.java.io,\\n Packages.java.text,\\n Packages.javax.crypto,\\n Packages.javax.crypto.spec\\n );\\n with(javaImport) {\\n let bytes = FileUtil.toBytes(input);\\n function decryptData(bArr) {\\n var generateSecret = SecretKeyFactory.getInstance(\\\"desede\\\").generateSecret(new DESedeKeySpec(String('OW84U8Eerdb99rtsTXWSILDO').getBytes()));\\n var cipher = Cipher.getInstance(\\\"desede/CBC/PKCS5Padding\\\");\\n cipher.init(2, generateSecret, new IvParameterSpec(String('SK8bncVu').getBytes()));\\n return cipher.doFinal(bArr);\\n }\\n //decryptData为解密方法\\n bytes = decryptData(bytes);\\n return FileUtil.toInputStream(bytes);\\n }\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"DES*\",\"path\":\"des\",\"rule\":\"var javaImport = new JavaImporter();\\njavaImport.importPackage(\\n Packages.java.lang,\\n Packages.java.security,\\n Packages.java.util,\\n Packages.java.io,\\n Packages.java.text,\\n Packages.javax.crypto,\\n Packages.javax.crypto.spec\\n);\\nwith(javaImport) {\\n function De(str) {\\n var generateSecret = SecretKeyFactory.getInstance(\\\"desede\\\").generateSecret(new DESedeKeySpec(String('OW84U8Eerdb99rtsTXWSILDO').getBytes()));\\n var instance = Cipher.getInstance(\\\"desede/CBC/PKCS5Padding\\\");\\n instance.init(2, generateSecret, new IvParameterSpec(String('SK8bncVu').getBytes()));\\n return String(instance.doFinal(_base64.decode(str, 2))); \\n }\\n}\\n\\n/*\\neval(getCryptoJS())\\nvar key = CryptoJS.enc.Utf8.parse('OW84U8Eerdb99rtsTXWSILDO')\\nvar iv = CryptoJS.enc.Utf8.parse('SK8bncVu')\\n\\nfunction De(data, encoding) {\\n var decrypted = CryptoJS.TripleDES.decrypt(data, key, {\\n iv: iv,\\n mode: CryptoJS.mode.CBC,\\n padding: CryptoJS.pad.Pkcs7\\n });\\n if (!encoding) {\\n return decrypted.toString(CryptoJS.enc.Utf8);\\n }\\n return decrypted.toString(CryptoJS.enc.Base64);\\n};\\n*/\"},{\"col_type\":\"movie_3\",\"name\":\"漫蛙*\",\"path\":\"image\",\"rule\":\"js:\\nconst SoftReference = java.lang.ref.SoftReference;\\nconst Cipher = Cipher = javax.crypto.Cipher;\\nconst IvParameterSpec = javax.crypto.spec.IvParameterSpec;\\nconst SecretKeySpec = javax.crypto.spec.SecretKeySpec;\\nconst KEY = new java.lang.String(\\\"my2ecret782ecret\\\");\\nconst f2319IV = new java.lang.String(\\\"my2ecret782ecret\\\");\\nconst KEY_ALGORITHM = \\\"AES\\\";\\nconst AES_MODE = \\\"AES/CBC/PKCS7Padding\\\";\\n\\nfunction decryptData(file2Bytes) {\\n try {\\n let secretKeySpec = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);\\n let ivParameterSpec = new IvParameterSpec(f2319IV.getBytes());\\n let cipher = Cipher.getInstance(AES_MODE);\\n cipher.init(2, secretKeySpec, ivParameterSpec);\\n return cipher.doFinal(file2Bytes);\\n return new SoftReference(cipher.doFinal(file2Bytes)).get();\\n } catch (e) {\\n //e.printStackTrace();\\n log(e.toString());\\n return null;\\n }\\n}\\n\\n$.exports.imageDecrypt = function() {\\n let javaImport = new JavaImporter();\\n javaImport.importPackage(\\n Packages.com.example.hikerview.utils\\n );\\n with(javaImport) {\\n let bytes = FileUtil.toBytes(input);\\n bytes = decryptData(bytes);\\n return FileUtil.toInputStream(bytes);\\n }\\n}\\n\"}]","proxy":"","icon":"https://img.vinua.cn/images/vkhRw.jpeg"},{"last_chapter_rule":"","title":"轻合集.TyrantG","author":"轻合集生成器","version":100,"type":"all","url":"hiker://empty","col_type":"icon_round_small_4","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\n//关闭自定义分类?\nconst defaultDisTabModify = true;\nconst QING_TITLE = getMyVar('myCollection'),\n newWindow = readFile('newWindow'),\n typeShow = getMyVar('typeShow', '');\nlet disTabModify = readFile('disTabModify');\nif(disTabModify===''){\n saveFile('disTabModify', defaultDisTabModify+'');\n disTabModify = defaultDisTabModify;\n}else if(/true|false/.test(disTabModify)){\n disTabModify = JSON.parse(disTabModify);\n}\n//log('关闭自定义分类?'+disTabModify);\nconst {color,small,unique2} = $.require(\"hiker://page/tools?rule=\"+ QING_TITLE);\n\nlet el = [{\n title: ' ' + QING_TITLE.bold() + ' &nbsp &nbsp ' + '⚙ 轻合集设置 ⚙'.small(),\n url: 'hiker://page/Config?rule=' + QING_TITLE + '&#noRecordHistory#',\n img: MY_RULE.icon || 'hiker://images/icon1',\n col_type: 'avatar'\n }, {\n url: '\"hiker://search?s=\"+input',\n desc: '搜你想要的...',\n title: '搜索',\n col_type: 'input',\n extra: {\n rules: $.toString((QING_TITLE, typeShow,disTabModify) => {\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)();\n if (disTabModify&&typeShow) {\n rules = rules.filter((v) => v.type === typeShow);\n }else if(!disTabModify){\n typeNow = typeShow || '全部';\n if(typeNow==='其他'){\n rules = rules.filter((v) => !v.sort_url);\n }else if(typeNow!=='全部'){\n rules = rules.filter((v) => v.sort_url===typeNow);\n }\n }\n return JSON.stringify(rules)\n }, QING_TITLE, typeShow,disTabModify),\n defaultValue: getMyVar('searchKey', ''),\n onChange: \"putMyVar('searchKey',input)\"\n }\n }],\n rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)();\n\nif(disTabModify) {\n types = { '': '全部', 'all': '聚合', 'video': '视频', 'music': '音频', 'live': '直播', 'cartoon': '漫画', 'read': '阅读', 'picture': '图集', 'news': '资讯', 'tool': '工具', 'other': '其它' };\n for (let k in types) {\n if (!k || rules.find((v) => v.type === k)) {\n let title = '““””' + (k === typeShow ? types[k].bold().fontcolor('#12b668') : types[k]);\n let cnt = rules.filter(it => !k || it.type === k).length;\n el.push({\n title: title + ' ' + color(cnt, '#ff7000'),\n url: k === typeShow ? 'hiker://empty' : $('#noLoading#').lazyRule((k) => {\n putMyVar('typeShow', k)\n refreshPage(false)\n return 'hiker://empty'\n }, k),\n col_type: 'scroll_button'\n })\n }\n }\n\n if (typeShow) {\n rules = rules.filter((v) => v.type === typeShow);\n }\n}else{\n types = rules.map(it => it.sort_url || \"其他\");\n types.unshift('全部');\n types = unique2(types);\n typeNow = typeShow || '全部';\n for (let k in types) {\n let its = types[k];\n let title = '““””' + (its === typeNow ? its.bold().fontcolor('#12b668') : its);\n let cnt;\n if (its === '全部') {\n cnt = rules.length\n } else if (its === '其他') {\n cnt = rules.filter(it => !it.sort_url).length;\n } else {\n cnt = rules.filter(it => it.sort_url === its).length;\n }\n el.push({\n title: title + ' ' + color(cnt, '#ff7000'),\n url: its === typeNow ? 'hiker://empty' : $('#noLoading#').lazyRule((its) => {\n putMyVar('typeShow', its);\n refreshPage(false)\n return 'hiker://empty'\n }, its),\n col_type: 'scroll_button'\n })\n }\n if(typeNow==='其他'){\n rules = rules.filter((v) => !v.sort_url);\n }else if(typeNow!=='全部'){\n rules = rules.filter((v) => v.sort_url===typeNow);\n }\n}\neval(JSON.parse(fetch('hiker://page/urlParse?rule=' + QING_TITLE)).rule);\nrules.forEach((v) => {\n let urlParam = v.url.split(';'),\n ruleTmp = {\n title: v.title, url: urlParam.shift(),\n class_name: v.class_name, class_url: v.class_url,\n area_name: v.area_name, area_url: v.area_url,\n year_name: v.year_name, year_url: v.year_url,\n sort_name: v.sort_name, sort_url: v.sort_url\n },\n fypage = ruleTmp.url.includes('fypage') ? 'fypage' : '1',\n domain = (/(https?:\\/\\/.+?)(?:\\/|$)/i.exec(ruleTmp.url) || [, 'hiker://empty'])[1],\n d = {\n title: v.title,\n url: 'hiker://page/frameLoad',\n img: v.icon || 'hiker://images/icon1',\n extra: {\n url: domain + '/#noHistory##noRecordHistory####' + JSON.stringify({\n RULE: base64Encode(JSON.stringify(ruleTmp)),\n pageNum: fypage,\n QING_TITLE: getMyVar('myCollection')\n }) + '.js:eval(JSON.parse(fetch(\"hiker://page/urlParse??rule=' + QING_TITLE + '\")).rule);;indexUrl(input);' + paramHandle(urlParam, v.ua),\n RULE: { title: v.title },\n isIndex: true\n }\n }\n if (newWindow) Object.assign(d.extra, {\n newWindow: true,\n windowId: QING_TITLE + '_' + d.title\n })\n el.push(d)\n});\nsetResult(el)","searchFind":"js:\nsetResult([{\n title: \"点我开始轻合集•视界聚搜\",\n url: \"hiker://search?s=\" + getParam(\"keyword\"),\n extra: {\n rules: $.toString(() => {\n const defaultDisTabModify = false; //默认禁用自定义分类关闭.就是开启自定义\n const QING_TITLE = getMyVar('myCollection'),\n typeShow = getMyVar('typeShow', '');\n let disTabModify = readFile('disTabModify');\n if(disTabModify===''){\n saveFile('disTabModify', defaultDisTabModify+'');\n disTabModify = defaultDisTabModify;\n }else if(/true|false/.test(disTabModify)){\n disTabModify = JSON.parse(disTabModify);\n }\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)();\n if (disTabModify&&typeShow) {\n rules = rules.filter((v) => v.type === typeShow);\n }else if(!disTabModify){\n typeNow = typeShow || '全部';\n if(typeNow==='其他'){\n rules = rules.filter((v) => !v.sort_url);\n }else if(typeNow!=='全部'){\n rules = rules.filter((v) => v.sort_url===typeNow);\n }\n }\n return JSON.stringify(rules)\n })\n }\n}]);","search_url":"hiker://empty?keyword=**","group":"①轻合集","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"auto","preRule":"putMyVar('myCollection', MY_RULE.title);\nputMyVar('remoteUrl', 'https://git.tyrantg.com/tyrantgenesis/hikerViewRules/raw/master/data/rules.json');","pages":"[{\"col_type\":\"text_1\",\"name\":\"ClassTab\",\"path\":\"ClassTab\",\"rule\":\"const ClassTab = function(classArray, params) {\\n Object.assign(this, params)\\n this.arr = classArray.map(v => this.init(v))\\n this.sign = '$' + QING_TITLE + '_' + (this.name || '') + '_'\\n this.color = this.color || '#12b668'\\n this.boundary = this.boundary || 'blank_block'\\n}\\nClassTab.prototype = {\\n constructor: ClassTab,\\n load(el) {\\n let folded = this.fold && getVar('fold_' + this.sign, '')\\n if (this.arr.length > 1 && this.fold) el.push({\\n title: '““””' + (folded ? '▶' : '▼').fontcolor('#049eff'),\\n url: $('#noLoading#').lazyRule((sign, folded) => {\\n putVar('fold_' + sign, { '': 'T', 'T': '' } [folded])\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, folded),\\n col_type: 'scroll_button'\\n })\\n let arr = folded ? [this.arr[0]] : this.arr\\n arr.forEach((v) => {\\n let { id, class_name, class_url } = v,\\n selected = JSON.stringify(this.getClass(id))\\n class_name.forEach((name, i) => {\\n let url = class_url[i],\\n now = JSON.stringify({ name: name, url: url })\\n el.push({\\n title: selected == now ? '““””' + name.fontcolor(this.color).bold() : name,\\n url: selected == now ? 'hiker://empty' : $('#noLoading#').lazyRule((sign, id, now) => {\\n putVar(sign + id, now)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, this.sign, id, now),\\n col_type: 'scroll_button'\\n })\\n })\\n el.push({ col_type: this.boundary })\\n })\\n },\\n init(classObject) {\\n if (typeof classObject.class_name == 'string')\\n classObject.class_name = classObject.class_name.split('&')\\n if (typeof classObject.class_url == 'string')\\n classObject.class_url = classObject.class_url.split('&').map((v) => v.trim())\\n return classObject\\n },\\n push(classObject) {\\n this.arr.push(this.init(classObject))\\n },\\n getClass(id) {\\n let defaultClass = this.arr.find(item => item.id == id)\\n defaultClass = JSON.stringify(defaultClass ? {\\n name: defaultClass.class_name[0],\\n url: defaultClass.class_url[0]\\n } : { name: 'cannot find id: ' + id + ' in classTab: ' + this.sign, url: ''})\\n return JSON.parse(getVar(this.sign + id, defaultClass))\\n },\\n setUrl(url) {\\n return url.replace(/\\\\$\\\\{([^}]*)\\\\}/g, (_, id) => this.getClass(id).url)\\n }\\n}\\n// 生成头部分类\\nconst fyAll = RULE.url.includes('fyAll')\\nlet tabHeader = []\\nif (RULE.class_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyclass',\\n class_name: RULE.class_name,\\n class_url: RULE.class_url\\n})\\nif (RULE.area_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyarea',\\n class_name: RULE.area_name,\\n class_url: RULE.area_url\\n})\\nif (RULE.year_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fyyear',\\n class_name: RULE.year_name,\\n class_url: RULE.year_url\\n})\\nif (RULE.sort_name) tabHeader.push({\\n id: fyAll ? 'fyAll' : 'fysort',\\n class_name: RULE.sort_name,\\n class_url: RULE.sort_url\\n})\\ntabHeader = new ClassTab(tabHeader, { name: RULE.title, fold: readFile('tabFold'), })\\n\"},{\"col_type\":\"icon_2_round\",\"name\":\"设置\",\"path\":\"Config\",\"rule\":\"js:\\naddListener('onClose', 'clearMyVar(\\\"sortFlag\\\");refreshPage()');\\nsetPageTitle('⚙ 轻合集设置 ⚙');\\nconst defaultDisTabModify = false; //默认禁用自定义分类关闭.就是开启自定义\\nconst QING_TITLE = getMyVar('myCollection'),\\n url = getMyVar('remoteUrl')\\nlet data = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)(true),\\n el = [{\\n title: '<b> 清除缓存,立即更新 <small> (基于远程仓库,不要频繁点击)',\\n url: $('#noLoading#').lazyRule((url) => {\\n if (url.startsWith('hiker://') || url.startsWith('file://')){\\n return 'toast://仓库为本地文件,不会进行缓存,本功能也无效'\\n }\\n deleteCache(url);\\n back(false);\\n return 'toast://已更新'\\n }, url),\\n img: 'hiker://images/icon4',\\n col_type: 'avatar'\\n }],\\n updateInterval = readFile('updateInterval') || '1',\\n newWindow = readFile('newWindow'),\\n tabFold = readFile('tabFold'),\\n disTabModify = readFile('disTabModify'),\\n disableCustom = readFile('disableCustom'),\\n editMode = disableCustom ? '导入海阔' : getMyVar('editMode', '启用/禁用');\\nif(disTabModify===''){\\n saveFile('disTabModify', defaultDisTabModify+'');\\n disTabModify = defaultDisTabModify;\\n}else if(/true|false/.test(disTabModify)){\\n disTabModify = JSON.parse(disTabModify);\\n}\\n\\nel.push({\\n title: ' 💡 更新频率: ' + (updateInterval == 0 ? '手动' : updateInterval + '天') + ' ',\\n url: $(updateInterval, '输入更新间隔(天),为0则手动更新\\\\n本地文件链接无效').input(() => {\\n input = parseInt(input)\\n if(Number.isNaN(input)) input = 1\\n else if(input < 1) input = 0\\n saveFile('updateInterval', input.toString())\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 🖥 独立首页: ' + (newWindow ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((newWindow) => {\\n saveFile('newWindow', newWindow ? '' : '1')\\n refreshPage()\\n return 'hiker://empty'\\n }, newWindow),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类折叠: ' + (tabFold ? '是' : '否') + ' ',\\n url: $('#noLoading#').lazyRule((tabFold) => {\\n saveFile('tabFold', tabFold ? '' : '1')\\n refreshPage()\\n return 'hiker://empty'\\n }, tabFold),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💠 分类自定义: ' + (disTabModify ? '否' : '是') + ' ',\\n url: $('#noLoading#').lazyRule((disTabModify) => {\\n saveFile('disTabModify', disTabModify ? 'false' : 'true');\\n putMyVar('typeShow', '');\\n refreshPage();\\n return 'hiker://empty'\\n }, disTabModify),\\n col_type: 'scroll_button'\\n}, {\\n title: ' 💼 备份恢复 ',\\n url: $(['备份', '恢复'], 1).select((QING_TITLE, updateInterval, newWindow, tabFold, disableCustom) => {\\n let url = getMyVar('remoteUrl')\\n if (!url.startsWith('hiker://') && !url.startsWith('file://'))\\n url = 'hiker://files/libs/' + md5(url) + '.js'\\n else if(url.startsWith('hiker://page/')) url = 'hiker://empty'\\n if (input == '备份') return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径')\\n .input((url, updateInterval, newWindow, tabFold, disableCustom) => {\\n let rules = request(url),\\n customData = readFile('customData')\\n writeFile(input, JSON.stringify({\\n updateInterval: updateInterval,\\n newWindow: newWindow,\\n tabFold: tabFold,\\n disableCustom: disableCustom,\\n customData: customData,\\n rules: rules\\n }))\\n return 'toast://已备份,注意若仓库为子页面则不备份'\\n }, url, updateInterval, newWindow, tabFold, disableCustom)\\n else return $('hiker://files/tmp/' + QING_TITLE + '_backup.json', '输入备份路径').input((url) => {\\n let { updateInterval, newWindow, tabFold, disableCustom, customData, rules } = JSON.parse(request(input))\\n saveFile('updateInterval', updateInterval)\\n saveFile('newWindow', newWindow)\\n saveFile('tabFold', tabFold)\\n saveFile('disableCustom', disableCustom)\\n saveFile('customData', customData)\\n if(rules) writeFile(url, rules)\\n refreshPage()\\n return 'toast://已恢复,如果不想同步远程仓库,可以设置更新频率为手动'\\n }, url)\\n }, QING_TITLE, updateInterval, newWindow, tabFold, disableCustom),\\n col_type: 'scroll_button'\\n}, {\\n title: '““””<font color=\\\"#666666\\\"><small>特别鸣谢,小程序提供者:\\\\n' +\\n data.reduce((self, v) => v.author ? self.concat(v.author.split('&')) : self, [])\\n .filter((v, i, arr) => v && arr.indexOf(v) == i).join('、'),\\n url: 'hiker://empty',\\n col_type: 'text_center_1'\\n})\\n\\nel.push({ col_type: 'line' }, {\\n title: '““””' + '📝'.small() + '&nbsp 轻合集自定义 &nbsp'.bold().fontcolor('#757575') + (disableCustom ? '❌' : '⭕').small(),\\n url: $([(disableCustom ? '启用' : '禁用') + '合集自定义', '清除自定义数据'], 1).select(() => {\\n if (input == '清除自定义数据') {\\n deleteFile('customData')\\n } else if (input == '启用合集自定义') {\\n saveFile('disableCustom', '')\\n } else {\\n saveFile('disableCustom', '1')\\n input += '\\\\n小程序启用/禁用、重新排序等操作均不会体现在首页小程序列表中'\\n }\\n refreshPage(false)\\n return 'toast://已' + input\\n }),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? ['导入海阔'] : ['启用/禁用', '重新排序', '更改图标', '导入海阔']).forEach((v) => {\\n el.push({\\n title: v == editMode ? '““””' + v.bold().fontcolor('#12b668') : v,\\n url: v == editMode ? 'hiker://empty' : $('#noLoading#').lazyRule((v) => {\\n putMyVar('editMode', v)\\n refreshPage(false)\\n return 'hiker://empty'\\n }, v),\\n col_type: 'scroll_button'\\n })\\n});\\nif(editMode == '导入海阔') el.push({\\n title: '全部导入',\\n url: '海阔视界¥home_rule_url¥' + (url.startsWith('hiker://') || url.startsWith('file://') ? url : 'hiker://files/libs/' + md5(url) + '.js'),\\n col_type: 'text_center_1',\\n extra: { lineVisible: false }\\n});\\n(disableCustom ? data : JSON.parse(readFile('customData') || '[]')).forEach((v, i) => {\\n let d = { title: v.title, img: data[i].icon }\\n switch (editMode) {\\n case '启用/禁用':\\n d.title = (v.visible ? '🟢 ' : '🔴 ') + d.title\\n d.url = $('#noLoading#').lazyRule((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules[i].visible = !rules[i].visible\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '重新排序':\\n let sortFlag = parseInt(getMyVar('sortFlag', '-1'))\\n d.title = (sortFlag == i ? '🔃 ' : '') + d.title\\n if (sortFlag == -1)\\n d.url = $('#noLoading#').lazyRule((i) => {\\n putMyVar('sortFlag', i.toString())\\n refreshPage(false)\\n return 'toast://选择要移动到的位置'\\n }, i)\\n else\\n d.url = $('#noLoading#').lazyRule((oldIndex, newIndex) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n rules.splice(newIndex, 0, rules.splice(oldIndex, 1)[0])\\n saveFile('customData', JSON.stringify(rules))\\n putMyVar('sortFlag', '-1')\\n refreshPage(false)\\n return 'hiker://empty'\\n }, sortFlag, i)\\n break\\n case '更改图标':\\n d.url = $(v.icon || '', '输入新图标地址或颜色代码:').input((i) => {\\n let rules = JSON.parse(readFile('customData') || '[]')\\n if (input)\\n rules[i].icon = input\\n else\\n delete rules[i].icon\\n saveFile('customData', JSON.stringify(rules))\\n refreshPage(false)\\n return 'hiker://empty'\\n }, i)\\n break\\n case '导入海阔':\\n d.url = 'rule://' + base64Encode(JSON.stringify(data[i]))\\n break\\n }\\n el.push(d)\\n})\\nsetResult(el)\\n\"},{\"col_type\":\"movie_3\",\"name\":\"页面载入\",\"path\":\"frameLoad\",\"rule\":\"js:\\nconst QING_TITLE = getMyVar('myCollection')\\nlet myCollection_el = [],\\n { RULE, isIndex, pageTitle } = MY_PARAMS,\\n thisRULE = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)().find((v) => v.title == RULE.title)\\nif (isIndex) {\\n RULE = thisRULE\\n} else {\\n RULE.pages = thisRULE.pages\\n}\\neval(JSON.parse(fetch('hiker://page/preFunc?rule=' + QING_TITLE)).rule)\\neval(JSON.parse(fetch('hiker://page/urlParse?rule=' + QING_TITLE)).rule)\\n\\nif (isIndex) {\\n if (MY_PAGE == 1) {\\n // 加载ClassTab组件\\n eval(JSON.parse(fetch('hiker://page/ClassTab?rule=' + QING_TITLE)).rule)\\n tabHeader.load(myCollection_el)\\n if (RULE.search_url) myCollection_el.push({\\n title: \\\"搜索\\\",\\n desc: \\\"搜你想要的...\\\",\\n url: '\\\"hiker://search?s=\\\"+input',\\n extra: {\\n rules: $.toString((QING_TITLE, title) => {\\n let rules = $.require('hiker://page/dataLoad?rule=' + QING_TITLE)()\\n rules = [rules.find((v) => v.title == title)]\\n return JSON.stringify(rules)\\n }, QING_TITLE, RULE.title),\\n defaultValue: getMyVar('searchKey', ''),\\n onChange: \\\"putMyVar('searchKey',input)\\\"\\n },\\n col_type: \\\"input\\\",\\n })\\n }\\n // 处理MY_RULE\\n MY_RULE.url = RULE.url\\n MY_RULE.col_type = RULE.col_type\\n MY_RULE.detail_col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.find_rule\\n MY_RULE.detail_find_rule = RULE.detail_find_rule\\n MY_RULE.params = {}\\n} else {\\n MY_RULE.url = MY_PARAMS.url\\n MY_RULE.col_type = RULE.detail_col_type\\n MY_RULE.find_rule = RULE.detail_find_rule\\n MY_RULE.params = RULE.params\\n}\\nMY_RULE.pages = RULE.pages\\nMY_RULE.pageList = JSON.parse(MY_RULE.pages || '[]')\\nMY_RULE.title = RULE.title\\n\\nif (!isIndex) {\\n if (pageTitle) setPageTitle(pageTitle)\\n setLastChapterRule(thisRULE.last_chapter_rule)\\n MY_PARAMS = MY_RULE.params\\n}\\n// 预处理并初始化config\\nif (isIndex && MY_PAGE == 1) eval(thisRULE.preRule)\\nlet _cfg = getMyVar('initConfig', '{}')\\nif (_cfg && _cfg.length > 0) {\\n config = JSON.parse(_cfg)\\n}\\n\\n// 正文解析通用变量\\nlet assignLazyRule = $.toString((QING_TITLE, title) => {\\n let RULE = $.require(\\\"hiker://page/dataLoad?rule=\\\" + QING_TITLE)().find((v) => v.title == title)\\n return { pages: RULE.pages, pageList: JSON.parse(RULE.pages || '[]') }\\n}, QING_TITLE, RULE.title)\\nfunction genMyRule() {\\n let rule = Object.assign({}, MY_RULE)\\n delete rule.last_chapter_rule\\n delete rule.preRule\\n delete rule.pageList\\n delete rule.pages\\n return rule\\n}\\nfunction runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n}\\nfunction genExUrl(url) {\\n url = url.split(';')\\n return url.shift() + ';' + paramHandle(url, thisRULE.ua, MY_RULE.url)\\n}\\n// 正文解析\\nif (MY_RULE.find_rule.startsWith('js:')) {\\n setResult = function(el, param1, param2, param3) {\\n param1 = CALLBACK_KEY\\n param2 = MY_RULE\\n param3 = MY_TYPE\\n if (Array.isArray(el.data)) el = el.data\\n Array.prototype.push.apply(myCollection_el, el.map((v) => {\\n let MY__RULE = Object.assign(genMyRule(), { params: v.extra || {} })\\n v.col_type = v.col_type || MY_RULE.col_type\\n\\n if (!v.url || ['rule', 'pics', 'toast', 'input', 'copy', 'editFile', 'x5', 'x5WebView', 'x5Play', 'web', 'select', 'x5Rule', 'webRule', 'download', 'share'].find((vv) => v.url.startsWith(vv + '://')) || ['x5_webview_single', 'input'].find((vv) => v.col_type == vv)) {\\n return v\\n } else if (v.url.includes('@rule=')) {\\n let [_, url, rule] = v.url.match(/^([\\\\s\\\\S]*?)@rule=([\\\\s\\\\S]*)$/)\\n v.url = url\\n MY__RULE.detail_find_rule = rule\\n MY__RULE.detail_col_type = MY_RULE.col_type\\n } else if (v.url.startsWith('hiker://page/')) {\\n if (v.url.includes('rule=') || (v.extra || {}).rule)\\n return v\\n let [_, path, flag, params] = v.url.match(/^hiker:\\\\/\\\\/page\\\\/(.+?)(#.*?)?(?:\\\\?(.*))?$/),\\n subPage = MY_RULE.pageList.find((v) => v.path == path),\\n subUrl = (params || '').split('&').find((v) => v.startsWith('url='))\\n v.url = (subUrl ? subUrl.slice(4).replace(/??/g, '?').replace(/&&/g, '&') : (v.extra || {}).url) || 'hiker://empty' + flag + '?' + (params || '')\\n MY__RULE.detail_find_rule = subPage.rule\\n MY__RULE.detail_col_type = subPage.col_type\\n } else if (v.url.includes('@lazyRule=')) {\\n let reIndex = v.url.indexOf('.js:')\\n if (reIndex >= 0) v.url = v.url.slice(0, reIndex) + '.js:\\\\nif(MY_RULE)Object.assign(MY_RULE, ' + assignLazyRule + ');' + v.url.slice(reIndex + 4)\\n return v\\n } else if (isIndex) {\\n if (!MY_RULE.detail_find_rule || /hiker:\\\\/\\\\/(?!empty.+$)/.test(v.url)) return v\\n } else {\\n return v\\n }\\n v.extra = {\\n url: genExUrl(v.url),\\n RULE: MY__RULE,\\n pageTitle: isIndex && v.title\\n }\\n v.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n return v\\n }))\\n method_setResult.invoke(javaContext, myCollection_el, param1, param2, param3)\\n }\\n setHomeResult = setResult\\n setSearchResult = setResult\\n\\n eval(MY_RULE.find_rule.slice(3))\\n} else {\\n let [_, findRule, detailFindRule] = MY_RULE.find_rule.match(/^([\\\\s\\\\S]*?)(?:==>([\\\\s\\\\S]*))?$/)\\n findRule = findRule.split(';')\\n parseDomForArray(getResCode(), findRule.shift()).forEach((data) => {\\n let [title, img, desc, url] = findRule.map((v, i) => {\\n try {\\n if (v == '*') return ''\\n else v = (i == 1 || i == 3) ?\\n parseDom(data, v) :\\n parseDomForHtml(data, v)\\n if (i != 3) v = runCode(v)\\n return v\\n } catch (e) { return '' }\\n }),\\n res = {\\n title: title, url: url,\\n desc: desc, img: img,\\n col_type: MY_RULE.col_type\\n }\\n if (res.url) {\\n if (res.url.includes('@lazyRule=')) {\\n let reIndex = res.url.indexOf('.js:')\\n if (reIndex >= 0) res.url = res.url.slice(0, reIndex) + '.js:\\\\nif(MY_RULE)Object.assign(MY_RULE, ' + assignLazyRule + ');' + res.url.slice(reIndex + 4)\\n } else if (detailFindRule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: Object.assign(genMyRule(), { detail_find_rule: detailFindRule }),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n } else if (MY_RULE.detail_find_rule) {\\n res.extra = {\\n url: genExUrl(url),\\n RULE: genMyRule(),\\n pageTitle: isIndex && title\\n }\\n res.url = 'hiker://page/frameLoad?rule=' + QING_TITLE\\n }\\n }\\n myCollection_el.push(res)\\n })\\n setResult(myCollection_el)\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"数据载入\",\"path\":\"dataLoad\",\"rule\":\"$.exports = function(showAll) {\\n let url = getMyVar('remoteUrl'),\\n data = []\\n if (url.startsWith('hiker://') || url.startsWith('file://')) {\\n // 如果为本地文件则不进行缓存\\n try {\\n let oriData = fetch(url)\\n if (url.startsWith('hiker://page/'))\\n oriData = JSON.parse(oriData).rule\\n data = JSON.parse(oriData)\\n } catch (e) {}\\n } else {\\n // 获取远程数据,检查间隔默认一天\\n let interval = parseInt(readFile('updateInterval') || '1'),\\n oldData = fetch('hiker://files/libs/' + md5(url) + '.js'),\\n remoteData = []\\n if(interval == 0) interval = -1\\n try { remoteData = JSON.parse(fetchCache(url, 24 * interval, {timeout:50000})) } catch(e) {}\\n if(!Array.isArray(remoteData)) remoteData = []\\n if (remoteData.length < 3) {\\n log('未获取到数据')\\n if (oldData) writeFile('hiker://files/libs/' + md5(url) + '.js', oldData)\\n data = JSON.parse(oldData || '[]')\\n } else {\\n log('已获取到数据')\\n data = remoteData\\n }\\n }\\n data = data.filter((v) => { return v.title != getMyVar('myCollection') && !(v.author || '').includes('轻合集生成器') })\\n if (readFile('disableCustom')) return data\\n else { // 写入自定义数据\\n let customData = JSON.parse(readFile('customData') || '[]'),\\n rewriteData = []\\n customData = customData.reduce((self, v) => {\\n let index = data.findIndex((vv) => v.title == vv.title)\\n if (index >= 0) {\\n self.push(v)\\n let rule = data.splice(index, 1)[0]\\n if (showAll || v.visible)\\n rewriteData.push(Object.assign(rule, v))\\n }\\n return self\\n }, [])\\n data.forEach((v) => customData.push({ title: v.title, visible: true }))\\n saveFile('customData', JSON.stringify(customData))\\n return rewriteData.concat(data)\\n }\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数重写\",\"path\":\"preFunc\",\"rule\":\"// 防止require多次运行\\nlet rCache = {}\\nrequire = function(param0, param1, param2, param3, param4) {\\n if (!param0 || rCache[param0] != null) {\\n return\\n }\\n rCache[param0] = 1\\n param2 = param2 || 0\\n param3 = MY_TICKET\\n param4 = eval\\n return method_require.invoke(javaContext, param0, param1, param2, param3, param4)\\n}\\nrequireCache = function(param0, param1, param2, param3, param4, param5) {\\n if (!param0 || rCache[param0] != null) {\\n return\\n }\\n rCache[param0] = 1\\n param3 = param3 || 0\\n param4 = MY_TICKET\\n param5 = eval\\n return method_requireCache.invoke(javaContext, param0, param1, param2, param3, param4, param5)\\n}\\nrc = requireCache\\n\\n// 最新章节规则注入预处理代码\\nsetLastChapterRule = function(param0) {\\n if (!param0) return\\n if (param0.startsWith(\\\"js:\\\") && thisRULE.preRule) {\\n param0 = 'js:\\\\ntry{eval(JSON.parse(fetch(\\\"hiker://page/preFunc?rule=' + QING_TITLE + '\\\")).rule);\\\\\\n eval(base64Decode(\\\"' + base64Encode(thisRULE.preRule) + '\\\"));\\\\\\n let _cfg = getMyVar(\\\"initConfig\\\", \\\"{}\\\");\\\\\\n if (_cfg && _cfg.length>0) {config = JSON.parse(_cfg)}}catch(e){log(e.message)}\\\\n;' +\\n param0.slice(3)\\n }\\n method_setLastChapterRule.invoke(javaContext, param0);\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"链接处理\",\"path\":\"urlParse\",\"rule\":\"// 首页链接替换分类\\nfunction indexUrl(param) {\\n function runCode(rule) {\\n try {\\n let [input, code] = rule.split('.js:')\\n return code ? eval(code) : rule\\n } catch (e) { return rule }\\n }\\n let { RULE, pageNum, QING_TITLE } = JSON.parse(param.split('###')[1])\\n RULE = JSON.parse(base64Decode(RULE))\\n pageNum = parseInt(pageNum)\\n let url = RULE.url\\n\\n eval(JSON.parse(fetch('hiker://page/ClassTab?rule=' + QING_TITLE)).rule)\\n url = tabHeader.setUrl(fyAll ? url.replace(/fyAll/g, '$${fyAll}') : url.replace(/fy(class|area|year|sort)/g, '$${fy$1}'))\\n url = url.replace(/fypage(?:@(-?\\\\d+)@)?(?:\\\\*(\\\\d+)@)?/g, (_, start, space) => parseInt(start || 0) + 1 + (pageNum - 1) * parseInt(space || 1))\\n url = /^([\\\\s\\\\S]*?)(?:\\\\[firstPage=([\\\\s\\\\S]*?)\\\\])?(?:(\\\\.js:[\\\\s\\\\S]*?))?$/.exec(url)\\n if (pageNum == 1 && url[2]) url[1] = url[2]\\n if (url[3] && !url[1].includes('.js:')) url[1] += url[3]\\n return runCode(url[1])\\n}\\n// 链接参数处理\\nfunction paramHandle(urlParam, ua, urlTmp) {\\n let charset, UserAgent\\n try { // 链接的编码和ua应该是首先继承首页链接\\n [, , charset, UserAgent] = urlTmp.split(';')\\n UserAgent = UserAgent.match(/^{(.*)}$/)[1].split('&&').find((v) => v.startsWith('User-Agent@'))\\n } catch (e) {}\\n urlParam[0] = urlParam[0] || 'GET'\\n urlParam[1] = urlParam[1] || charset || 'UTF-8'\\n try {\\n urlParam[2] = urlParam[2].match(/^{(.*)}$/)[1].split('&&')\\n } catch (e) { urlParam[2] = [] }\\n // 添加全局UA\\n if (!urlParam[2].some((v) => v.startsWith('User-Agent@'))) {\\n if (UserAgent) urlParam[2].push(UserAgent)\\n else if (ua == 'pc')\\n urlParam[2].push('User-Agent@' + PC_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n else if (ua == 'mobile')\\n urlParam[2].push('User-Agent@' + MOBILE_UA.replace(/;/g, ';;').replace(/\\\\?/, '??'))\\n }\\n urlParam[2] = '{' + urlParam[2].join('&&') + '}'\\n return urlParam.join(';')\\n}\\n\"},{\"name\":\"仓库工具\",\"path\":\"tools\",\"rule\":\"js:\\n$.exports.range = function(m, n) {\\n return Math.floor(Math.random() * (m - n + 1) + n);\\n}\\n$.exports.color = function(text, color) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””<font color='\\\" + color + \\\"'>\\\" + text + \\\"</font>\\\";\\n}\\nfunction htmlTag(tag, text) {\\n text += \\\"\\\";\\n if (text.indexOf(\\\"““””\\\") === 0) {\\n text.replace(\\\"““””\\\", \\\"\\\");\\n }\\n return \\\"““””\\\" + \\\"<\\\" + tag + \\\">\\\" + text + \\\"</\\\" + tag + \\\">\\\";\\n\\n}\\n\\nfunction getNowFormatDate() {\\n let date = new Date();\\n let seperator1 = \\\"-\\\";\\n let seperator2 = \\\":\\\";\\n let month = date.getMonth() + 1;\\n let strDate = date.getDate();\\n let strHours = date.getHours();\\n let strMinutes = date.getMinutes();\\n let strSeconds = date.getSeconds()+1;\\n if (month >= 1 && month <= 9) {\\n month = \\\"0\\\" + month\\n }\\n if (strDate >= 0 && strDate <= 9) {\\n strDate = \\\"0\\\" + strDate\\n }\\n if (strHours >= 0 && strHours <= 9) {\\n strHours = \\\"0\\\" + strHours\\n }\\n if (strMinutes >= 0 && strMinutes <= 9) {\\n strMinutes = \\\"0\\\" + strMinutes\\n }\\n if (strSeconds >= 0 && strSeconds <= 9) {\\n strSeconds = \\\"0\\\" + strSeconds\\n }\\n //let currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + \\\" \\\" + strHours + seperator2 + strMinutes + seperator2 + strSeconds;\\n let currentdate = (date.getFullYear()-2020)+''+ month +''+ strDate +''+ strHours+'' + strMinutes +''+ Math.ceil(strSeconds/7);\\n return parseInt(currentdate)\\n }\\n$.exports.getNowFormatDate = getNowFormatDate;\\n$.exports.htmlTag = htmlTag;\\n$.exports.small = function(text) {\\n return htmlTag(\\\"small\\\", text);\\n}\\n$.exports.unique2 = function unique2(array){\\n return Array.from(new Set(array));\\n}\\n$.exports.strDeal = function strDeal(str){\\n str = str.split('');\\n str = str.filter(e => (e >= 0 && e <= 9) || (e >= 'a' && e <= 'z') || (e >= 'A' && e <= 'Z') || (e >= '\\\\u4e00' && e <= '\\\\u9fa5'));\\n str = str.join('');\\n return str\\n}\"}]","icon":"https://git.tyrantg.com/tyrantgenesis/hikerViewRules/raw/master/assets/images/avatar.jpg"},{"last_chapter_rule":"","title":"AI识片","author":"","version":56,"type":"tool","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar d = [];\nd.push({\n title: \"终极大招,输入搜索地址生成规则\",\n url: \"\",\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入要生成的规则合集名\",\n pic_url: \"\",\n extra: { \n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"r1\", input);\n }),\n defaultValue: getMyVar(\"r1\",\"\")\n }\n});\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"示例:\\n规则1@http://1.com?kw=%E4%BD\\n规则2@http://2.com?kw=%E4%BD\",\n pic_url: \"\",\n extra: {\n type: \"textarea\",\n height: 3,\n highlight: true,\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"rule\", input);\n }),\n defaultValue: getMyVar(\"rule\", \"\")\n }\n});\n\nd.push({\n title: \"生成规则\",\n url: $(\"#noLoading#\").lazyRule((rule1) => {\n let rules = getMyVar(\"rule\", \"\");\n let r1 = getMyVar(\"r1\", \"\");\n rules = rules.split(\"\\n\")\n .filter(it => it.includes(\"@\"))\n .map(it=>{\n let a = it.split(\"@\");\n let r = decodeURIComponent(a[1]);\n r = r.replace(new RegExp(\"[\\u4e00-\\u9fa5]+\", \"g\"), \"**\");\n return a[0] + \"@\" + r;\n })\n .join(\"\\\\n\");\n if (rules == \"\") {\n return \"toast://请先在上面输入网站搜索地址合集\";\n }\n rule = JSON.parse(fetch(\"hiker://home@\" + rule1));\n rule.find_rule = \"js:$.require('hiker://page/pro')\";\n rule.url = \"hiker://empty##fypage\";\n return \"海阔视界¥home_rule¥\" + JSON.stringify(rule)\n .replace(\"{RULES}\", rules)\n .replace(rule1, r1);\n }, MY_RULE.title),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"来个示例\",\n url: $(\"#noLoading#\").lazyRule(() => {\n putMyVar(\"rule\", \"AppMovie@https://www.appmovie.cc/index.php/vod/search.html?wd=%E4%BD%A0%E6%98%AF%E6%88%91%E7%9A%84&submit=\");\n putMyVar(\"r1\", \"AI测试\");\n refreshPage();\n return \"hiker://empty\"\n }),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"以下为测试区域\",\n url: \"\",\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\n\nd.push({\n title: \"走你\",\n url: $.toString(() => {\n return \"hiker://page/p?u=\" + base64Encode(input)\n }),\n col_type: \"input\",\n desc: \"请输入选集网页地址\",\n pic_url: \"\"\n});\n\n\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入网站搜索地址,要带搜索词\",\n pic_url: \"\",\n extra: {\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"r\", input);\n }),\n defaultValue: getMyVar(\"r\", \"\")\n }\n});\n\n\nd.push({\n title: \"搜索测试\",\n url: $.toString(() => {\n let r = getMyVar(\"r\", \"\");\n if (r == \"\") {\n return \"toast://请先在上面输入网站搜索地址\";\n }\n putMyVar(\"s\", input);\n r = decodeURIComponent(r);\n let surl = r.replace(new RegExp(\"[\\u4e00-\\u9fa5]+\", \"g\"), \"**\");\n return \"hiker://page/s?key=\" + input + \"&u=\" + base64Encode(surl);\n }),\n col_type: \"input\",\n desc: \"请输入关键词测试\",\n pic_url: \"\",\n extra: {\n defaultValue: getMyVar(\"s\", \"\")\n }\n});\n\nd.push({\n title: \"来个示例\",\n url: $(\"#noLoading#\").lazyRule(() => {\n putMyVar(\"r\", \"https://www.appmovie.cc/index.php/vod/search.html?wd=%E4%BD%A0%E6%98%AF%E6%88%91%E7%9A%84&submit=\");\n putMyVar(\"s\", \"龙之家族\");\n refreshPage();\n return \"hiker://empty\"\n }),\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\n\n\nsetResult(d);","searchFind":"js:\nvar d = [];\nlet key = MY_URL.split(\"##\")[1];\nd.push({\n title: \"点我开始聚合搜索\" + key,\n url: \"hiker://page/soup?p=fypage\",\n extra: {\n pageTitle: \"搜索\" + key,\n key: key\n }\n});\n\nsetResult(d);\n","search_url":"hiker://empty##**","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet html = request(url);\\nlet alist = pdfa(html, \\\"body&&a\\\");\\nlet arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n});\\n//log(arr);\\nlet debug = false;\\n\\nfunction clearText(it) {\\n return it.replace(/第|集|章|话/g, \\\"\\\");\\n}\\n\\nfunction isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD/)\\n}\\n\\nfunction notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n}\\n\\nfunction isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n}\\n\\nfunction getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n}\\n\\nfunction isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n}\\n\\nlet _web = $.toString(() => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n }\\n }\\n});\\n\\nlet web = getItem('web', '0') == \\\"1\\\";\\n\\nfor (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (web) {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href\\n };\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n}\\nif (d.length == 0) {\\n //匹配失败\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n setResult(d);\\n} else {\\n //为线路加分割线\\n let d2 = [];\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n }\\n\\n setResult(d2);\\n}\"},{\"col_type\":\"text_1\",\"name\":\"搜索测试\",\"path\":\"s\",\"rule\":\"js:\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlog(url);\\nlet key = getParam(\\\"key\\\");\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nsetResult(sp(url, key, \\\"搜索测试\\\"));\"},{\"col_type\":\"movie_3\",\"name\":\"聚合搜索\",\"path\":\"pro\",\"rule\":\"var d = [];\\nif (MY_PAGE == 1) {\\n d.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString(() => {\\n putMyVar(\\\"sou\\\", input);\\n })\\n }\\n });\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n clearMyVar(\\\"so\\\");\\n }));\\n}\\n\\nlet s = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, r != \\\"\\\" ? r : null);\\n\\n let pageid = MY_RULE.title + \\\"-page\\\" + p;\\n if (data.length > 0) {\\n d.push({\\n title: \\\"加载第\\\" + p + \\\"页中,进度:1/\\\" + data.length,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n });\\n }\\n setResult(d);\\n log(data.length);\\n if (data.length > 0) {\\n //多线程加载 \\n let realPage = \\\"\\\" == r ? 1 : p;\\n let tasks = data.map(it => {\\n return {\\n func: function(rule) {\\n return rule.find(s, realPage);\\n },\\n param: it,\\n id: \\\"rule@\\\" + it.name\\n }\\n });\\n\\n batchExecute(tasks, {\\n func: function(param, id, error, result) {\\n //log(\\\"listener: \\\" + (result || []).length)\\n param.i = param.i + 1;\\n if (result) {\\n try {\\n for (let it of result) {\\n param.j = param.j + 1;\\n addItemBefore(pageid, {\\n title: wrap(it.title, s),\\n desc: it.desc,\\n url: it.url,\\n pic_url: it.pic_url,\\n col_type: it.pic_url ? 'movie_1_vertical_pic' : \\\"text_1\\\",\\n extra: it.extra\\n })\\n }\\n } catch (e) {}\\n\\n }\\n if (param.i >= param.all) {\\n deleteItem(pageid)\\n } else {\\n updateItem({\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:\\\" + (param.i + 1) + \\\"/\\\" + param.all,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n })\\n }\\n },\\n param: {\\n all: data.length,\\n i: 0,\\n j: -1\\n }\\n })\\n }\\n} else {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1, null);\\n if (data.length > 0) {\\n $.require(\\\"hiker://page/manage\\\")(d, data.map(it => it.name));\\n for (let it of data) {\\n d.push({\\n title: it.name,\\n url: \\\"select://\\\" + JSON.stringify({\\n title: \\\"请选择操作\\\",\\n col: 1,\\n options: [\\\"访问首页\\\", \\\"搜索此站\\\"],\\n js: $.toString((url) => {\\n if (input == \\\"访问首页\\\") {\\n MY_URL = url;\\n return \\\"hiker://page/x5?u=\\\" + base64Encode(getHome(url))\\n } else {\\n return \\\"hiker://page/singles\\\"\\n }\\n }, it.url)\\n }),\\n col_type: \\\"flex_button\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n RULE: {\\n name: it.name,\\n url: it.url\\n },\\n longClick: [{\\n title: \\\"禁用\\\" + it.name,\\n js: $.toString((name) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确认删除禁用\\\" + name + \\\"吗?\\\",\\n confirm: $.toString((name, rule) => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data?rule=\\\" + rule);\\n removeRule(name);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n }, name, MY_RULE.title)\\n })\\n return \\\"hiker://empty\\\";\\n }, it.name)\\n }, {\\n title: \\\"访问首页\\\",\\n js: \\\"'hiker://page/x5?u=\\\" + base64Encode(getHome(it.url)) + \\\"'\\\"\\n }, {\\n title: \\\"搜索此源\\\",\\n js: \\\"'hiker://page/singles'\\\"\\n }]\\n }\\n });\\n }\\n }\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"数据\",\"path\":\"data\",\"rule\":\"//并发规则数\\nlet size0 = 10;\\nlet rulesText0 = `{RULES}`;\\nlet rulesText = getItem(\\\"rules\\\", rulesText0);\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nrules = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n find: function(key, page) {\\n return sp(s[1], key, s[0]);\\n },\\n url: s[1]\\n };\\n });\\n\\nfunction load(page, rule) {\\n let size = page <= 0 ? rules.length : size0;\\n page = page <= 0 ? 1 : page;\\n if (!page && !rule) {\\n return rules.map(it => it.name);\\n }\\n if (rule != null) {\\n if (page != null && page > 1) {\\n return rules.filter(i => i.name == rule && i.page);\\n }\\n return rules.filter(i => i.name == rule);\\n }\\n let start = (page - 1) * size;\\n if (rules.length < start + 1) {\\n return [];\\n }\\n let len = size;\\n if (rules.length < page * size) {\\n len = rules.length - start\\n }\\n return rules.slice(start, start + len);\\n}\\n\\nfunction addRule(name, surl) {\\n setItem(\\\"rules\\\", rulesText + \\\"\\\\n\\\" + name + \\\"@\\\" + surl);\\n}\\n\\nfunction addAll(input) {\\n if (input == null || input == \\\"\\\") {\\n return 0;\\n }\\n let arr = input.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n url: s[1]\\n };\\n });\\n let exist = rules.map(it => it.url);\\n let c = 0;\\n for (let it of arr) {\\n if (!exist.includes(it.url)) {\\n rulesText = rulesText + \\\"\\\\n\\\" + it.name + \\\"@\\\" + it.url;\\n c++;\\n }\\n }\\n setItem(\\\"rules\\\", rulesText);\\n return c;\\n}\\n\\nfunction removeRule(name) {\\n let newT = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.indexOf(name + \\\"@\\\") < 0)\\n .join(\\\"\\\\n\\\");\\n setItem(\\\"rules\\\", newT);\\n}\\n\\n$.exports = {\\n load: load,\\n addRule: addRule,\\n removeRule: removeRule,\\n addAll: addAll\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索解析\",\"path\":\"sp\",\"rule\":\"function search(url, key, rule) {\\n let d = [];\\n let html = \\\"\\\";\\n if (url.includes(\\\"**\\\")) {\\n //get请求\\n let old = url;\\n url = url.replace(\\\"**\\\", key);\\n html = request(url);\\n //自动过验证码和频繁访问限制\\n let {\\n check, test\\n } = $.require(\\\"hiker://page/yzm\\\");\\n if (check(url, html, d)) {\\n log(\\\"重试了\\\");\\n html = request(url, {\\n headers: {\\n \\\"Referer\\\": url\\n }\\n }); \\n } \\n test(url, html, d, old, key, rule);\\n } else {\\n //自动识别post请求\\n html = request(url);\\n let form = pdfh(html, \\\"body&&form&&Html\\\");\\n let action = pd(html, \\\"form&&action\\\", url);\\n let inputs = pdfa(html, \\\"body&&form&&input\\\");\\n let body = {};\\n for (let it of inputs) {\\n let name = pdfh(it, \\\"input&&name\\\");\\n if (name && name != \\\"\\\") {\\n let value = pdfh(it, \\\"input&&value\\\");\\n body[name] = value || key;\\n }\\n }\\n html = post(action, {\\n body: body\\n });\\n }\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n let arr = alist.map(it => {\\n let t = pdfh(it, \\\"a&&Text\\\");\\n let t2 = pdfh(it, \\\"a&&title\\\");\\n return {\\n //html: it,\\n text: t2 && t2.includes(key) ? t2 : t,\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n\\n function isResult(it) {\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.match(/搜索|结果/)) {\\n return false\\n }\\n return it.includes(key);\\n }\\n\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n if (isResult(it)) {\\n d.push({\\n title: t,\\n url: \\\"hiker://page/p?u=\\\" + base64Encode(it.href),\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\",\\n extra: {\\n inheritTitle: false\\n }\\n });\\n }\\n }\\n return d;\\n}\\n$.exports = search;\"},{\"col_type\":\"movie_3\",\"name\":\"增删\",\"path\":\"manage\",\"rule\":\"$.exports = function(d, names) {\\n d.push({\\n title: \\\"AI技术\\\",\\n url: \\\"confirm://基于AI识片自动分析源码技术,代码完全开源,数据来源于原网站,软件和规则不提供任何内容.js:''\\\",\\n col_type: \\\"flex_button\\\"\\n }, {\\n title: getItem('web', '0') == \\\"0\\\" ? \\\"视频嗅探\\\" : \\\"Web通免\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n if (getItem('web', '0') == \\\"0\\\") {\\n setItem('web', '1')\\n } else {\\n setItem('web', '0')\\n }\\n refreshPage();\\n return 'hiker://empty'\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\" + \\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((rr) => {\\n deleteItemByCls(\\\"aiadd\\\");\\n addItemAfter(rr + \\\"aisdel\\\", [{\\n title: \\\"\\\",\\n desc: \\\"请输入网站名称\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('name', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"\\\",\\n desc: \\\"请输入网站搜索地址\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('surl', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"提交保存\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let surl = getMyVar(\\\"surl\\\", \\\"\\\");\\n let name = getMyVar(\\\"name\\\", \\\"\\\");\\n if (surl == \\\"\\\" || name == \\\"\\\") {\\n return \\\"toast://请输入完整内容\\\"\\n }\\n let r = decodeURIComponent(surl);\\n r = r.replace(new RegExp(\\\"[\\\\u4e00-\\\\u9fa5]+\\\", \\\"g\\\"), \\\"**\\\");\\n let {\\n addRule\\n } = $.require(\\\"hiker://page/data\\\");\\n addRule(name, r);\\n refreshPage();\\n return \\\"toast://已保存\\\";\\n }),\\n extra: {\\n cls: \\\"aiadd\\\"\\n }\\n }\\n ]);\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\" - \\\",\\n url: \\\"select://\\\" + JSON.stringify({\\n options: names,\\n title: \\\"请选择要删除的站点\\\",\\n js: $.toString(() => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data\\\");\\n removeRule(input);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n })\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\"↗️\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确定导出所有数据吗?(导出后可以点击旁边的导入按钮批量导入)\\\",\\n confirm: $.toString(() => {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1);\\n let s = data.map(it => it.name + \\\"@\\\" + it.url).join(\\\"\\\\n\\\");\\n return \\\"copy://\\\" + s\\n })\\n });\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\"↘️\\\",\\n url: $(\\\"\\\", \\\"请输入要批量导入的数据\\\").input(() => {\\n let {\\n addAll\\n } = $.require(\\\"hiker://page/data\\\");\\n let count = addAll(input);\\n if (count > 0) refreshPage();\\n return \\\"toast://\\\" + (count > 0 ? \\\"成功导入\\\" + count + \\\"条数据\\\" : \\\"一条也没导入\\\")\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n col_type: \\\"blank_block\\\",\\n extra: {\\n id: MY_RULE.title + \\\"aisdel\\\"\\n }\\n });\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"验证码\",\"path\":\"yzm\",\"rule\":\"function check(url, html, d) {\\n let reload = false;\\n if (/验证码|系统安全验证/.test(html)) {\\n let headers = {\\n \\\"User-Agent\\\": MOBILE_UA,\\n \\\"Referer\\\": url\\n };\\n MY_HOME = getHome(url);\\n let ssyz = 'TloGnnikThrfs/5fDNlk5CSsbaGtAH7W/uMZjuYoIupB6bCoo9CotLQHfPIdGgbkbynKqL2aUE2Xy558X2QxHYtTU09vD+4oaCDIuSZO7nxDbLfRGfWj7zql+yMbvF+aJoD/m6Psfw/PyYOAp/ZVGdrPzaCByfd0HL5DFVSw+YF2OC40V8SP9RxdFKKdrBuPxCWdxUCFrJ+1lRy/TU3LC84C4xxEBhgud7RtBp0zZArqBE06+Z3JtDP0eFCz/D5X0409qPHK3e1y/LuUgccuxpHnjYLE1GjlP8wYA2hQWe7yPngggQBHw33/gvb3tuCcxEKTWgmah/R32AH9ZF8jF7WemT26lUizVXe/spCdhDgHR/zUhODD4PO6glI8JPhdu+VwfPyRLG2D7CUo1L6SIF+0fYf0oTOWN13UPITo5+uZd/WnQQLU8NYx/WFCThEnkbzln9YGt60fRxsH+8uMDFgaBiC+z2SpcxB9gZ6GXypLSXWaj+qEUbGJKEx+jK/v5fnrkIhCdwNbkp9dRks6dmlYlBifzoWF8RkuC3rqPtoScBkMOMZu7GiVtoHEdHUozmnUIdrU1LGIqq9WnG7X2a3yH8s65mjLuLnd3q0U8v+LMPnHL2/GjQuTQKVh+RKEPqK/JdrChGLNrjcHvLHDbHEshrGZuQOdEphbx/PkhkvaYy4K1MO84R17guRsKs/V6niUPaL+XbQ7c3fqJS4VHJwludJTDe02euffGCm0PJIPlAOgLHnX0izJhA6q738R2UwQcWBQjJt79aF+kyqSdyt1QPVQVjaC3IpRf7PgsDhEJ7bi9nSclyIzgJ9DCJ4T+8dG1xHhKyZasT7L/x9Lfr1Mgs8nBZER2W9ax7iTkNK+X5ACU//p/YoP/uAanDtb3D0iKUUuXFH+Jbb0x1P322S2w6BJ46nuNHBMHTpVuWwhZeZzriGh7qoOywLWiExBMKyxTGLnmKh7r03/yXKYWIJnpBN2MMycVHRZJ7RumHV4CIsVrq7iRP48823RJVt9OtyP7uuc3wBBV3kcZUzbbaYdWBx1+Au+Od2u7lR6joOL810mcJm/f7J5TvGQP6HGph1YHHX4C7453a7uVHqOgyjjh5EBd720MEBY23c+TKq/z9UpWDDOg48ZFnwSIhFqitWdiZiqsaYuN0/SXwiK8EG9eQ29u2XDJoDW4mlwtcRO7vaX5XcFsgf4/mLU07mi';\\n evalPrivateJS(ssyz);\\n\\n let vcode = getVCode2(MY_HOME + '/index.php/verify/index.html?', JSON.stringify(headers), 'num');\\n fetch(MY_HOME + html.match(/\\\\/index.php.*?verify=/)[0] + JSON.parse(vcode).ret, {\\n headers: headers,\\n method: 'POST'\\n });\\n reload = true;\\n }\\n return reload;\\n}\\n\\nfunction test(url, html, d, old, key, rule) {\\n if (/5秒|频繁/.test(html)) {\\n d.push({\\n title: '搜索需间隔5秒,点击重新加载',\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\",\\n url: $().lazyRule((url, old, key, rule) => {\\n let sp = $.require(\\\"hiker://page/sp\\\");\\n let d = sp(old, key, rule);\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n for (let it of d) {\\n it.title = wrap(it.title, key);\\n }\\n addItemAfter(url, d);\\n deleteItem(url);\\n return \\\"toast://OK\\\";\\n }, url, old, key, rule),\\n extra: {\\n id: url\\n }\\n });\\n }\\n}\\n\\n$.exports = {\\n check: check,\\n test: test\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"function wrap(text, s) {\\n return text.includes(\\\"““””\\\") ? text : \\\"““””\\\" + text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n$.exports = {\\n wrap: wrap\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"单搜\",\"path\":\"singles\",\"rule\":\"js:\\nvar d = [];\\nd.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"so\\\", input);\\n refreshPage();\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"so\\\", \\\"\\\")\\n }\\n});\\nlet s = getMyVar(\\\"so\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, MY_PARAMS.RULE.name);\\n let arr = data[0].find(s, p);\\n for (let it of arr) {\\n it.title = wrap(it.title, s)\\n d.push(it);\\n }\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"soup\",\"rule\":\"js:\\nvar d = [];\\nif (MY_PARAMS.key && getMyVar(\\\"use\\\", \\\"\\\") == \\\"\\\") {\\n putMyVar(\\\"sou\\\", MY_PARAMS.key);\\n putMyVar(\\\"use\\\", \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"use\\\");\\n }));\\n}\\n$.require('hiker://page/pro')\"},{\"col_type\":\"movie_3\",\"name\":\"X5\",\"path\":\"x5\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n floatVideo: true,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nsetResult(d);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"AI搜索","author":"","version":54,"type":"tool","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar d = [];\nd.push({\n title: \"根据搜索地址生成聚合搜索器,无二级解析,如有需要请用AI识片\",\n url: \"\",\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入要生成的规则合集名\",\n pic_url: \"\",\n extra: { \n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"r1\", input);\n }),\n defaultValue: getMyVar(\"r1\",\"\")\n }\n});\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"示例:\\n规则1@http://1.com?kw=%E4%BD\\n规则2@http://2.com?kw=%E4%BD\",\n pic_url: \"\",\n extra: {\n type: \"textarea\",\n height: 3,\n highlight: true,\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"rule\", input);\n }),\n defaultValue: getMyVar(\"rule\", \"\")\n }\n});\n\nd.push({\n title: \"生成规则\",\n url: $(\"#noLoading#\").lazyRule((rule1) => {\n let rules = getMyVar(\"rule\", \"\");\n let r1 = getMyVar(\"r1\", \"\");\n rules = rules.split(\"\\n\")\n .filter(it => it.includes(\"@\"))\n .map(it=>{\n let a = it.split(\"@\");\n let r = decodeURIComponent(a[1]);\n r = r.replace(new RegExp(\"[\\u4e00-\\u9fa5]+\", \"g\"), \"**\");\n return a[0] + \"@\" + r;\n })\n .join(\"\\\\n\");\n if (rules == \"\") {\n return \"toast://请先在上面输入网站搜索地址合集\";\n }\n rule = JSON.parse(fetch(\"hiker://home@\" + rule1));\n rule.find_rule = \"js:$.require('hiker://page/pro')\";\n rule.url = \"hiker://empty##fypage\";\n return \"海阔视界¥home_rule¥\" + JSON.stringify(rule)\n .replace(\"{RULES}\", rules)\n .replace(rule1, r1);\n }, MY_RULE.title),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"来个示例\",\n url: $(\"#noLoading#\").lazyRule(() => {\n putMyVar(\"rule\", \"AppMovie@https://www.appmovie.cc/index.php/vod/search.html?wd=%E4%BD%A0%E6%98%AF%E6%88%91%E7%9A%84&submit=\");\n putMyVar(\"r1\", \"AI测试\");\n refreshPage();\n return \"hiker://empty\"\n }),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"以下为测试区域\",\n url: \"\",\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\n\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入网站搜索地址,要带搜索词\",\n pic_url: \"\",\n extra: {\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"r\", input);\n }),\n defaultValue: getMyVar(\"r\", \"\")\n }\n});\n\n\nd.push({\n title: \"搜索测试\",\n url: $.toString(() => {\n let r = getMyVar(\"r\", \"\");\n if (r == \"\") {\n return \"toast://请先在上面输入网站搜索地址\";\n }\n putMyVar(\"s\", input);\n r = decodeURIComponent(r);\n let surl = r.replace(new RegExp(\"[\\u4e00-\\u9fa5]+\", \"g\"), \"**\");\n return \"hiker://page/s?key=\" + input + \"&u=\" + base64Encode(surl);\n }),\n col_type: \"input\",\n desc: \"请输入关键词测试\",\n pic_url: \"\",\n extra: {\n defaultValue: getMyVar(\"s\", \"\")\n }\n});\n\nd.push({\n title: \"来个示例\",\n url: $(\"#noLoading#\").lazyRule(() => {\n putMyVar(\"r\", \"https://www.appmovie.cc/index.php/vod/search.html?wd=%E4%BD%A0%E6%98%AF%E6%88%91%E7%9A%84&submit=\");\n putMyVar(\"s\", \"龙之家族\");\n refreshPage();\n return \"hiker://empty\"\n }),\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\n\n\nsetResult(d);","searchFind":"js:\nvar d = [];\nlet key = MY_URL.split(\"##\")[1];\nd.push({\n title: \"点我开始聚合搜索\" + key,\n url: \"hiker://page/soup?p=fypage\",\n extra: {\n pageTitle: \"搜索\" + key,\n key: key\n }\n});\n\nsetResult(d);","search_url":"hiker://empty##**","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet ite = $.require(\\\"hiker://page/u\\\")(MY_RULE.title, getHome(url));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nsetResult(d);\\n\"},{\"col_type\":\"text_1\",\"name\":\"搜索测试\",\"path\":\"s\",\"rule\":\"js:\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlog(url);\\nlet key = getParam(\\\"key\\\");\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nsetResult(sp(url, key, \\\"搜索测试\\\"));\"},{\"col_type\":\"movie_3\",\"name\":\"聚合搜索\",\"path\":\"pro\",\"rule\":\"var d = [];\\nif (MY_PAGE == 1) {\\n d.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString(() => {\\n putMyVar(\\\"sou\\\", input);\\n })\\n }\\n });\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n clearMyVar(\\\"so\\\");\\n }));\\n}\\n\\nlet s = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, r != \\\"\\\" ? r : null);\\n\\n let pageid = MY_RULE.title + \\\"-page\\\" + p;\\n if (data.length > 0) {\\n d.push({\\n title: \\\"加载第\\\" + p + \\\"页中,进度:1/\\\" + data.length,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n });\\n }\\n setResult(d);\\n log(data.length);\\n if (data.length > 0) {\\n //多线程加载 \\n let realPage = \\\"\\\" == r ? 1 : p;\\n let tasks = data.map(it => {\\n return {\\n func: function(rule) {\\n return rule.find(s, realPage);\\n },\\n param: it,\\n id: \\\"rule@\\\" + it.name\\n }\\n });\\n\\n batchExecute(tasks, {\\n func: function(param, id, error, result) {\\n //log(\\\"listener: \\\" + (result || []).length)\\n param.i = param.i + 1;\\n if (result) {\\n try {\\n for (let it of result) {\\n param.j = param.j + 1;\\n addItemBefore(pageid, {\\n title: wrap(it.title, s),\\n desc: it.desc,\\n url: it.url,\\n pic_url: it.pic_url,\\n col_type: it.pic_url ? 'movie_1_vertical_pic' : \\\"text_1\\\",\\n extra: it.extra\\n })\\n }\\n } catch (e) {}\\n\\n }\\n if (param.i >= param.all) {\\n deleteItem(pageid)\\n } else {\\n updateItem({\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:\\\" + (param.i + 1) + \\\"/\\\" + param.all,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n })\\n }\\n },\\n param: {\\n all: data.length,\\n i: 0,\\n j: -1\\n }\\n })\\n }\\n} else {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1, null);\\n if (data.length > 0) {\\n $.require(\\\"hiker://page/manage\\\")(d, data.map(it => it.name));\\n for (let it of data) {\\n d.push({\\n title: it.name,\\n url: \\\"select://\\\" + JSON.stringify({\\n title: \\\"请选择操作\\\",\\n col: 1,\\n options: [\\\"访问首页\\\", \\\"搜索此站\\\"],\\n js: $.toString((url) => {\\n if (input == \\\"访问首页\\\") {\\n MY_URL = url;\\n return \\\"hiker://page/p?u=\\\" + base64Encode(getHome(url))\\n } else {\\n return \\\"hiker://page/singles\\\"\\n }\\n }, it.url)\\n }),\\n col_type: \\\"flex_button\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n RULE: {\\n name: it.name,\\n url: it.url\\n },\\n longClick: [{\\n title: \\\"禁用\\\" + it.name,\\n js: $.toString((name) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确认删除禁用\\\" + name + \\\"吗?\\\",\\n confirm: $.toString((name, rule) => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data?rule=\\\" + rule);\\n removeRule(name);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n }, name, MY_RULE.title)\\n })\\n return \\\"hiker://empty\\\";\\n }, it.name)\\n }, {\\n title: \\\"访问首页\\\",\\n js: \\\"'hiker://page/p?u=\\\" + base64Encode(getHome(it.url)) +\\\"'\\\"\\n }, {\\n title: \\\"搜索此源\\\",\\n js: \\\"'hiker://page/singles'\\\"\\n }]\\n }\\n });\\n }\\n }\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"数据\",\"path\":\"data\",\"rule\":\"//并发规则数\\nlet size0 = 10;\\nlet rulesText0 = `{RULES}`;\\nlet rulesText = getItem(\\\"rules\\\", rulesText0);\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nrules = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n find: function(key, page) {\\n return sp(s[1], key, s[0]);\\n },\\n url: s[1]\\n };\\n });\\n\\nfunction load(page, rule) {\\n let size = page <= 0 ? rules.length : size0;\\n page = page <= 0 ? 1 : page;\\n if (!page && !rule) {\\n return rules.map(it => it.name);\\n }\\n if (rule != null) {\\n if (page != null && page > 1) {\\n return rules.filter(i => i.name == rule && i.page);\\n }\\n return rules.filter(i => i.name == rule);\\n }\\n let start = (page - 1) * size;\\n if (rules.length < start + 1) {\\n return [];\\n }\\n let len = size;\\n if (rules.length < page * size) {\\n len = rules.length - start\\n }\\n return rules.slice(start, start + len);\\n}\\n\\nfunction addRule(name, surl) {\\n setItem(\\\"rules\\\", rulesText + \\\"\\\\n\\\" + name + \\\"@\\\" + surl);\\n}\\n\\nfunction addAll(input) {\\n if (input == null || input == \\\"\\\") {\\n return 0;\\n }\\n let arr = input.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n url: s[1]\\n };\\n });\\n let exist = rules.map(it => it.url);\\n let c = 0;\\n for (let it of arr) {\\n if (!exist.includes(it.url)) {\\n rulesText = rulesText + \\\"\\\\n\\\" + it.name + \\\"@\\\" + it.url;\\n c++;\\n }\\n }\\n setItem(\\\"rules\\\", rulesText);\\n return c;\\n}\\n\\nfunction removeRule(name) {\\n let newT = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.indexOf(name + \\\"@\\\") < 0)\\n .join(\\\"\\\\n\\\");\\n setItem(\\\"rules\\\", newT);\\n}\\n\\n$.exports = {\\n load: load,\\n addRule: addRule,\\n removeRule: removeRule,\\n addAll: addAll\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索解析\",\"path\":\"sp\",\"rule\":\"function search(url, key, rule) {\\n let d = [];\\n let html = \\\"\\\";\\n if (url.includes(\\\"**\\\")) {\\n //get请求\\n let old = url;\\n url = url.replace(\\\"**\\\", key);\\n html = request(url);\\n //自动过验证码和频繁访问限制\\n let {\\n check, test\\n } = $.require(\\\"hiker://page/yzm\\\");\\n if (check(url, html, d)) {\\n log(\\\"重试了\\\");\\n html = request(url, {\\n headers: {\\n \\\"Referer\\\": url\\n }\\n }); \\n } \\n test(url, html, d, old, key, rule);\\n } else {\\n //自动识别post请求\\n html = request(url);\\n let form = pdfh(html, \\\"body&&form&&Html\\\");\\n let action = pd(html, \\\"form&&action\\\", url);\\n let inputs = pdfa(html, \\\"body&&form&&input\\\");\\n let body = {};\\n for (let it of inputs) {\\n let name = pdfh(it, \\\"input&&name\\\");\\n if (name && name != \\\"\\\") {\\n let value = pdfh(it, \\\"input&&value\\\");\\n body[name] = value || key;\\n }\\n }\\n html = post(action, {\\n body: body\\n });\\n }\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n let arr = alist.map(it => {\\n let t = pdfh(it, \\\"a&&Text\\\");\\n let t2 = pdfh(it, \\\"a&&title\\\");\\n return {\\n //html: it,\\n text: t2 && t2.includes(key) ? t2 : t,\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n\\n function isResult(it) {\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.match(/搜索|结果/)) {\\n return false\\n }\\n return it.toLowerCase().includes(key);\\n }\\n key = key.toLowerCase();\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n if (isResult(it)) {\\n d.push({\\n title: t,\\n url: \\\"hiker://page/p?u=\\\" + base64Encode(it.href),\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\"\\n });\\n }\\n }\\n return d;\\n}\\n$.exports = search;\"},{\"col_type\":\"movie_3\",\"name\":\"增删\",\"path\":\"manage\",\"rule\":\"$.exports = function(d, names) {\\n d.push({\\n title: \\\"AI技术\\\",\\n url: \\\"confirm://基于AI识片自动分析源码技术,代码完全开源,数据来源于原网站,软件和规则不提供任何内容.js:''\\\",\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\" + \\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((rr) => {\\n deleteItemByCls(\\\"aiadd\\\");\\n addItemAfter(rr + \\\"aisdel\\\", [{\\n title: \\\"\\\",\\n desc: \\\"请输入网站名称\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('name', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"\\\",\\n desc: \\\"请输入网站搜索地址\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('surl', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"提交保存\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let surl = getMyVar(\\\"surl\\\", \\\"\\\");\\n let name = getMyVar(\\\"name\\\", \\\"\\\");\\n if (surl == \\\"\\\" || name == \\\"\\\") {\\n return \\\"toast://请输入完整内容\\\"\\n }\\n let r = decodeURIComponent(surl);\\n r = r.replace(new RegExp(\\\"[\\\\u4e00-\\\\u9fa5]+\\\", \\\"g\\\"), \\\"**\\\");\\n let {\\n addRule\\n } = $.require(\\\"hiker://page/data\\\");\\n addRule(name, r);\\n refreshPage();\\n return \\\"toast://已保存\\\";\\n }),\\n extra: {\\n cls: \\\"aiadd\\\"\\n }\\n }\\n ]);\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\" - \\\",\\n url: \\\"select://\\\" + JSON.stringify({\\n options: names,\\n title: \\\"请选择要删除的站点\\\",\\n js: $.toString(() => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data\\\");\\n removeRule(input);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n })\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\"↗️\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确定导出所有数据吗?(导出后可以点击旁边的导入按钮批量导入)\\\",\\n confirm: $.toString(() => {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1);\\n let s = data.map(it => it.name + \\\"@\\\" + it.url).join(\\\"\\\\n\\\");\\n return \\\"copy://\\\" + s\\n })\\n });\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\"↘️\\\",\\n url: $(\\\"\\\", \\\"请输入要批量导入的数据\\\").input(() => {\\n let {\\n addAll\\n } = $.require(\\\"hiker://page/data\\\");\\n let count = addAll(input);\\n if (count > 0) refreshPage();\\n return \\\"toast://\\\" + (count > 0 ? \\\"成功导入\\\" + count + \\\"条数据\\\" : \\\"一条也没导入\\\")\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n col_type: \\\"blank_block\\\",\\n extra: {\\n id: MY_RULE.title + \\\"aisdel\\\"\\n }\\n });\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"验证码\",\"path\":\"yzm\",\"rule\":\"function check(url, html, d) {\\n let reload = false;\\n return reload;\\n}\\n\\nfunction test(url, html, d, old, key, rule) {\\n if (/5秒|频繁/.test(html)) {\\n d.push({\\n title: '搜索需间隔5秒,点击重新加载',\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\",\\n url: $().lazyRule((url, old, key, rule) => {\\n let sp = $.require(\\\"hiker://page/sp\\\");\\n let d = sp(old, key, rule);\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n for (let it of d) {\\n it.title = wrap(it.title, key);\\n }\\n addItemAfter(url, d);\\n deleteItem(url);\\n return \\\"toast://OK\\\";\\n }, url, old, key, rule),\\n extra: {\\n id: url\\n }\\n });\\n }\\n}\\n\\n$.exports = {\\n check: check,\\n test: test\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"function wrap(text, s) {\\n return text.includes(\\\"““””\\\") ? text : \\\"““””\\\" + text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n$.exports = {\\n wrap: wrap\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"单搜\",\"path\":\"singles\",\"rule\":\"js:\\nvar d = [];\\nd.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"so\\\", input);\\n refreshPage();\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"so\\\", \\\"\\\")\\n }\\n});\\nlet s = getMyVar(\\\"so\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, MY_PARAMS.RULE.name);\\n let arr = data[0].find(s, p);\\n for (let it of arr) {\\n it.title = wrap(it.title, s)\\n d.push(it);\\n }\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"soup\",\"rule\":\"js:\\nvar d = [];\\nif (MY_PARAMS.key && getMyVar(\\\"use\\\", \\\"\\\") == \\\"\\\") {\\n putMyVar(\\\"sou\\\", MY_PARAMS.key);\\n putMyVar(\\\"use\\\", \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"use\\\");\\n }));\\n}\\n$.require('hiker://page/pro')\"},{\"col_type\":\"movie_3\",\"name\":\"u\",\"path\":\"u\",\"rule\":\"$.exports = function(rule, origin) {\\n return $.toString((rule, origin) => {\\n let host = origin.replace(new RegExp(\\\"http://|https://\\\"), \\\"\\\").split(\\\"/\\\")[0];\\n let hosts = host.split(\\\".\\\");\\n if (hosts.length > 2) {\\n host = hosts[hosts.length - 2] + \\\".\\\" + hosts[hosts.length - 1];\\n }\\n if (input.startsWith(\\\"magnet\\\")) {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"检测到新的磁链地址,点击确定按钮即可播放,点击取消按钮可以复制链接\\\",\\n confirm: $.toString((mag) => {\\n return mag;\\n }, input),\\n cancel: $.toString((mag) => {\\n return \\\"copy://\\\" + mag\\n }, input)\\n })\\n return true;\\n } else if (input.includes(\\\"aliyundrive.com\\\")) {\\n log(input);\\n let r1 = fetch(\\\"hiker://home@云盘汇影\\\");\\n if (!r1 || r1.length <= 5) {\\n let ru = $.toString(() => {\\n return \\\"海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘汇影@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5LqR55uY5rGH5b2xIiwiYXV0aG9yIjoiTXJGbHkiLCJ1cmwiOiJoaWtlcjovL2VtcHR5JCQkZnlwYWdlIiwidmVyc2lvbiI6NiwiY29sX3R5cGUiOiJ0ZXh0XzEiLCJjbGFzc19uYW1lIjoiIiwidHlwZSI6ImFsbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmhvbWVQYWdlKCk7Iiwic2VhcmNoX3VybCI6Imhpa2VyOi8vZW1wdHkkJCQqKiQkJGZ5cGFnZSQkJCIsImdyb3VwIjoi4pGg572R55uYIiwic2VhcmNoRmluZCI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLnNlYXJjaFBhZ2UodHJ1ZSk7XG4iLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmRldGFpbFBhZ2UoKTsiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoidmFyIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKTtcbmlmICghYWxpanMgfHwgIWFsaWpzLmluY2x1ZGVzKCdhbGkuJykpIHtcbiAgICBhbGlqcyA9IGZldGNoQ2FjaGUoJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9mbHkxMzk3L2hpa2VyLWljeS9hbGkuanMnKVxufVxuaWYgKCFhbGlqcyB8fCAhYWxpanMuaW5jbHVkZXMoJ2FsaS4nKSkge1xuICAgIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cDovL2xmaWN5LmNvbTozMDAwMC9tcmZseS9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKVxufVxuaWYgKGFsaWpzKSB7XG4gICAgd3JpdGVGaWxlKFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzXCIsIGFsaWpzKTtcbiAgICBldmFsKGFsaWpzKTtcbiAgICBhbGkucHJlUnVsZSgpO1xufSIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvZHnm5jor6bmg4VcIixcInBhdGhcIjpcImRldGFpbFwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLmFsaVJ1bGUoKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfbGVmdF9waWNcIixcIm5hbWVcIjpcIui1hOa6kOe9kemhteivpuaDhVwiLFwicGF0aFwiOlwic2l0ZS1kZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbmV2YWwoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvaWN5L2FsaS5qcycpKTtcXG5hbGkuZGV0YWlsUGFnZSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq6572R55uY6K+m5oOFXCIsXCJwYXRoXCI6XCJkcml2ZVwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLm15QWxpUnVsZSgpO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGl5dW4ucG5nIiwicHJveHkiOiIifQ==\\\"\\n });\\n confirm({\\n title: '温馨提示',\\n content: '本规则依赖云盘汇影规则,点击下面的确定按钮导入,注意导入后一定要在云盘汇影登录阿里云盘账号,否则不能用',\\n confirm: ru,\\n cancel: ru\\n });\\n return false;\\n }\\n log(\\\"input\\\");\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"阿里云盘\\\",\\n url: \\\"hiker://page/detail?rule=云盘汇影&url=\\\" + url + '??fypage',\\n }))\\n }, input, rule)\\n } else if (/\\\\.(mp3|flac|m4a)$/.test(input)) {\\n log(input);\\n return $.toString((url, rule) => {\\n fy_bridge_app.playVideo(url);\\n }, input, rule)\\n } else if (!input.includes(host) && input.startsWith(\\\"http\\\")) {\\n \\n } else if (!input.startsWith(\\\"http\\\")) {\\n log(input);\\n //能唤起APP的白名单\\n let white = [\\n \\\"qklink\\\",\\n \\\"bdnetdisk\\\",\\n \\\"xunleiapp\\\"\\n ];\\n let inWhite = white.filter(it => input.startsWith(it)).length > 0;\\n if (!inWhite) {\\n return false;\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.openThirdApp && fy_bridge_app.openThirdApp(url);\\n }, input, rule)\\n } else {\\n \\n }\\n }, rule, origin);\\n}\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"AI生成器","author":"","version":27,"type":"video","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar d = [];\nd.push({\n title: \"终极大招,输入网站地址生成规则\",\n url: \"\",\n col_type: \"text_center_1\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入要生成的小程序名\",\n pic_url: \"\",\n extra: {\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"r1\", input);\n }),\n defaultValue: getMyVar(\"r1\", \"\")\n }\n});\nd.push({\n title: \"\",\n url: \"\",\n col_type: \"input\",\n desc: \"请输入网站地址,如https://cn.bing.com/\",\n pic_url: \"\",\n extra: {\n type: \"textarea\",\n height: 2,\n highlight: true,\n titleVisible: false,\n onChange: $.toString(() => {\n putMyVar(\"rule\", input);\n }),\n defaultValue: getMyVar(\"rule\", \"\")\n }\n});\n\nd.push({\n title: \"生成规则\",\n url: $(\"#noLoading#\").lazyRule((rule1) => {\n let url = getMyVar(\"rule\", \"\");\n let r1 = getMyVar(\"r1\", \"\");\n if (url == \"\" || r1 == \"\") {\n return \"toast://请先在上面输入网站地址和名称\";\n }\n if (url.includes(\"@\")) {\n return \"toast://网站地址格式不对\";\n }\n let arr = storage0.getItem(\"list\", []);\n arr = arr.filter(it => it.url != url);\n arr.push({\n name: r1,\n url: url\n });\n storage0.setItem(\"list\", arr);\n refreshPage();\n rule = JSON.parse(fetch(\"hiker://home@\" + rule1));\n rule.find_rule = \"js:\\nvar 网站 = '{RULE}';\\neval(JSON.parse(fetch('hiker://page/home')).rule)\";\n rule.url = \"hiker://empty\";\n return \"海阔视界¥home_rule¥\" + JSON.stringify(rule)\n .replace(\"{RULE}\", url)\n .replace(rule1, r1);\n }, MY_RULE.title),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\n\nd.push({\n title: \"来个示例\",\n url: $(\"#noLoading#\").lazyRule(() => {\n putMyVar(\"rule\", \"https://cn.bing.com/\");\n putMyVar(\"r1\", \"必应AI\");\n refreshPage();\n return \"hiker://empty\"\n }),\n col_type: \"text_2\",\n desc: \"\",\n pic_url: \"\"\n});\nlet arr = storage0.getItem(\"list\", []).reverse();\nfor (let it of arr) {\n d.push({\n title: it.name,\n url: $(\"#noLoading#\").lazyRule((item) => {\n putMyVar(\"rule\", item.url);\n putMyVar(\"r1\", item.name);\n refreshPage();\n return \"toast://已填充\"\n }, it),\n col_type: \"flex_button\",\n extra: {\n longClick: [{\n title: \"删除\" + it.name,\n js: $.toString((u) => {\n let arr = storage0.getItem(\"list\", []);\n arr = arr.filter(it => it.url != u);\n storage0.setItem(\"list\", arr);\n refreshPage();\n return \"toast://已删除\"\n }, it.url)\n }, {\n title: \"跳转\" + it.name,\n js: $.toString((u) => { \n return \"hiker://home@\" + u\n }, it.name)\n }, {\n title: \"删除全部\",\n js: $.toString(() => {\n clearItem(\"list\");\n refreshPage();\n return \"toast://已删除\"\n })\n }]\n }\n });\n}\n\nsetResult(d);","searchFind":"","search_url":"","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"ysfx\",\"path\":\"ysfx\",\"rule\":\"js:\\nvar d = [];\\nlet rule = getParam(\\\"r\\\").split(\\\"##\\\")[0];\\nlet url = MY_URL.split(\\\"##\\\")[1];\\nlet ite = $.require(\\\"hiker://page/u\\\")(rule, getHome(url));\\nlet js = $.toString(() => {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n});\\nlet js2 = $.require(\\\"hiker://page/x5ai\\\")(rule, url);\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n js: js + \\\";\\\\n\\\" + js2,\\n canBack: true,\\n jsLoadingInject: true,\\n floatVideo: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nd.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: url\\n }\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"u\",\"path\":\"u\",\"rule\":\"$.exports = function(rule, origin) {\\n return $.toString((rule, origin) => {\\n let host = origin.replace(new RegExp(\\\"http://|https://\\\"), \\\"\\\").split(\\\"/\\\")[0];\\n let hosts = host.split(\\\".\\\");\\n if (hosts.length > 2) {\\n host = hosts[hosts.length - 2] + \\\".\\\" + hosts[hosts.length - 1];\\n }\\n if (input.startsWith(\\\"magnet\\\")) {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"检测到新的磁链地址,点击确定按钮即可播放,点击取消按钮可以复制链接\\\",\\n confirm: $.toString((mag) => {\\n return mag;\\n }, input),\\n cancel: $.toString((mag) => {\\n return \\\"copy://\\\" + mag\\n }, input)\\n })\\n return true;\\n } else if (input.includes(\\\"aliyundrive.com\\\")) {\\n log(input);\\n let r1 = fetch(\\\"hiker://home@云盘汇影\\\");\\n if (!r1 || r1.length <= 5) {\\n let ru = $.toString(() => {\\n return \\\"海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘汇影@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5LqR55uY5rGH5b2xIiwiYXV0aG9yIjoiTXJGbHkiLCJ1cmwiOiJoaWtlcjovL2VtcHR5JCQkZnlwYWdlIiwidmVyc2lvbiI6NiwiY29sX3R5cGUiOiJ0ZXh0XzEiLCJjbGFzc19uYW1lIjoiIiwidHlwZSI6ImFsbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmhvbWVQYWdlKCk7Iiwic2VhcmNoX3VybCI6Imhpa2VyOi8vZW1wdHkkJCQqKiQkJGZ5cGFnZSQkJCIsImdyb3VwIjoi4pGg572R55uYIiwic2VhcmNoRmluZCI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLnNlYXJjaFBhZ2UodHJ1ZSk7XG4iLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmRldGFpbFBhZ2UoKTsiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoidmFyIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKTtcbmlmICghYWxpanMgfHwgIWFsaWpzLmluY2x1ZGVzKCdhbGkuJykpIHtcbiAgICBhbGlqcyA9IGZldGNoQ2FjaGUoJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9mbHkxMzk3L2hpa2VyLWljeS9hbGkuanMnKVxufVxuaWYgKCFhbGlqcyB8fCAhYWxpanMuaW5jbHVkZXMoJ2FsaS4nKSkge1xuICAgIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cDovL2xmaWN5LmNvbTozMDAwMC9tcmZseS9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKVxufVxuaWYgKGFsaWpzKSB7XG4gICAgd3JpdGVGaWxlKFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzXCIsIGFsaWpzKTtcbiAgICBldmFsKGFsaWpzKTtcbiAgICBhbGkucHJlUnVsZSgpO1xufSIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvZHnm5jor6bmg4VcIixcInBhdGhcIjpcImRldGFpbFwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLmFsaVJ1bGUoKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfbGVmdF9waWNcIixcIm5hbWVcIjpcIui1hOa6kOe9kemhteivpuaDhVwiLFwicGF0aFwiOlwic2l0ZS1kZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbmV2YWwoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvaWN5L2FsaS5qcycpKTtcXG5hbGkuZGV0YWlsUGFnZSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq6572R55uY6K+m5oOFXCIsXCJwYXRoXCI6XCJkcml2ZVwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLm15QWxpUnVsZSgpO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGl5dW4ucG5nIiwicHJveHkiOiIifQ==\\\"\\n });\\n confirm({\\n title: '温馨提示',\\n content: '本规则依赖云盘汇影规则,点击下面的确定按钮导入,注意导入后一定要在云盘汇影登录阿里云盘账号,否则不能用',\\n confirm: ru,\\n cancel: ru\\n });\\n return false;\\n }\\n log(\\\"input\\\");\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"阿里云盘\\\",\\n url: \\\"hiker://page/detail?rule=云盘汇影&url=\\\" + url + '??fypage',\\n }))\\n }, input, rule)\\n } else if (/\\\\.(mp3|flac|m4a)$/.test(input)) {\\n log(input);\\n return $.toString((url, rule) => {\\n fy_bridge_app.playVideo(url);\\n }, input, rule)\\n } else if (!input.includes(host) && input.startsWith(\\\"http\\\")) {\\n log(input);\\n return $.toString((url, rule) => {\\n let white = [\\n \\\"douyin\\\",\\n \\\"douban\\\",\\n \\\"ixigua.com\\\",\\n \\\"kuaishou\\\",\\n \\\"bilibili\\\",\\n \\\"weibo\\\",\\n \\\"weixin\\\",\\n \\\"baidu\\\",\\n \\\"zmk.\\\",\\n \\\"subhd\\\",\\n \\\"thunder\\\",\\n \\\"xinjuc\\\",\\n \\\"grab4k\\\",\\n \\\"/bt\\\",\\n \\\"jsr10\\\",\\n \\\"assrt\\\",\\n \\\"quark\\\"\\n ];\\n let inWhite = white.filter(it => url.includes(it)).length > 0;\\n if (inWhite) {\\n //跳网页\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n }))\\n } else {\\n //AI解析\\n fy_bridge_app.open(JSON.stringify({\\n title: document.title,\\n url: \\\"hiker://page/p?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"&u=\\\" + fy_bridge_app.base64Encode(url),\\n }))\\n }\\n }, input, rule);\\n } else if (!input.startsWith(\\\"http\\\")) {\\n log(input);\\n //能唤起APP的白名单\\n let white = [\\n \\\"qklink\\\",\\n \\\"bdnetdisk\\\",\\n \\\"xunleiapp\\\"\\n ];\\n let inWhite = white.filter(it => input.startsWith(it)).length > 0;\\n if (!inWhite) {\\n return false;\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.openThirdApp && fy_bridge_app.openThirdApp(url);\\n }, input, rule)\\n } else {\\n let white = [\\n \\\"url=\\\",\\n \\\"fsou.com\\\",\\n \\\"bing.\\\", \\n ];\\n let inWhite = white.filter(it => input.includes(it)).length > 0;\\n if (inWhite) {\\n return false;\\n }\\n let reg = new RegExp(\\\"[\\\\u4e00-\\\\u9fa5]+\\\", \\\"g\\\");\\n let r = decodeURIComponent(input);\\n if (reg.test(r) || (input.startsWith(origin) && input.length - origin.length > 2)) {\\n //有中文,应该是在搜索,跳新页面\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n }));\\n }, input, rule);\\n }\\n }\\n }, rule, origin);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet list = storage0.getItem(\\\"white\\\", []);\\nlet inWhite = list.includes(url);\\nlet d = [];\\nif (!inWhite) {\\n let html = request(url);\\n let web = getItem('web', '0') == \\\"1\\\";\\n let rule = getParam(\\\"r\\\");\\n let parse = $.require(\\\"hiker://page/parse\\\");\\n d = parse(rule, web, url, html);\\n}\\nif (d.length == 0) {\\n //匹配失败\\n let ite = $.require(\\\"hiker://page/u\\\")(getParam(\\\"r\\\"), getHome(url));\\n let js = $.toString(() => {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n });\\n let js2 = $.require(\\\"hiker://page/x5ai\\\")(getParam(\\\"r\\\"), url);\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n js: js + \\\";\\\\n\\\" + js2,\\n urlInterceptor: ite,\\n canBack: true,\\n floatVideo: true,\\n jsLoadingInject: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n d.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: url\\n }\\n });\\n if (!inWhite) {\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n }\\n setResult(d);\\n} else {\\n setResult(d);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级parse\",\"path\":\"parse\",\"rule\":\"$.exports = function(rule, web, url, html) {\\n let d = [];\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n let arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n //log(arr);\\n let debug = false;\\n\\n function clearText(it) {\\n return it.replace(/第|集|章|话/g, \\\"\\\");\\n }\\n\\n function isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD/)\\n }\\n\\n function notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n }\\n\\n function isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n }\\n\\n function getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n }\\n\\n function isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n }\\n\\n let _web = $.toString(() => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n }\\n }\\n });\\n\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (web) {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href\\n };\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n }\\n if (d.length == 0) {\\n return d;\\n } else {\\n d.splice(0, 0, {\\n title: \\\"““””<small><font color='#aaaaaa'>🔗\\\" + url + \\\"</font></small>\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n //为线路加分割线\\n let d2 = [];\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n } \\n d2.push({\\n title: \\\"<small><font color='#aaaaaa'>匹配有误?点我不再匹配此页面</font></small>\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((url) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"如果只是单次匹配失败,点击下方取消按钮刷新页面重新匹配,如果确认无法匹配,点击下方确定按钮加入白名单\\\",\\n cancel: \\\"refreshPage()\\\",\\n confirm: $.toString((url) => {\\n let list = storage0.getItem(\\\"white\\\", []);\\n list.push(url);\\n storage0.setItem(\\\"white\\\", list);\\n refreshPage();\\n return \\\"toast://已加入白名单\\\"\\n }, url)\\n });\\n return \\\"hiker://empty\\\"\\n }, url),\\n col_type: \\\"avatar\\\",\\n img: \\\"hiker://images/account\\\"\\n });\\n return d2;\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"x5AI\",\"path\":\"x5ai\",\"rule\":\"$.exports = function(rule, anchorId) {\\n return $.toString((rule, anchorId, white) => {\\n if (window.check0 == null) {\\n function check0() {\\n try {\\n let u1 = location.href.replace(\\\"https://\\\", \\\"\\\").replace(\\\"http://\\\", \\\"\\\");\\n let u2 = u1.split(\\\"/\\\");\\n let isHome = u2.length < 2 || (u2.length == 2 && u2[1] == \\\"\\\");\\n let h = location.hash;\\n if (h != null && h != \\\"\\\" && h != \\\"#/\\\") {\\n isHome = false;\\n }\\n if (isHome) {\\n setTimeout(window.check0, 250);\\n return\\n }\\n let html = document.querySelector(\\\"html\\\").innerHTML;\\n fba.putVar(\\\"html0\\\", html);\\n fba.parseLazyRuleAsync($$$().lazyRule((rule, url, anchorId, white) => {\\n try {\\n let d = [];\\n let html = getVar(\\\"html0\\\", \\\"\\\");\\n clearVar(\\\"html0\\\");\\n let web = false;\\n let white2 = [\\n \\\"fsou.com\\\",\\n \\\"bing.\\\",\\n ];\\n let parse = $.require(\\\"hiker://page/parse?rule=\\\" + rule);\\n let inWhite = white2.filter(it => url.includes(it)).length > 0;\\n if (!inWhite && !white.includes(url)) {\\n d = parse(rule, web, url, html);\\n }\\n if (!inWhite && d.length < 1) {\\n try {\\n let arr = pdfa(html, \\\"body&&iframe\\\");\\n if (arr.length > 0) {\\n let src = pdfh(arr[0], \\\"iframe&&src\\\");\\n log(\\\"获取到iframe:\\\" + src);\\n if (!white.includes(src)) {\\n if (src && src.startsWith(\\\"http\\\") && !src.match(/\\\\.mp4|\\\\.m3u8|\\\\.mp3|\\\\.flv|\\\\.mkv/)) {\\n html = request(src);\\n d = parse(rule, web, src, html);\\n }\\n }\\n }\\n } catch (e) {\\n log(\\\"尝试获取iframe失败\\\");\\n }\\n }\\n if (d.length > 0) {\\n d[0].url = $(\\\"#noLoading#\\\").lazyRule((anchorId) => {\\n let desc = getVar(anchorId, \\\"0\\\");\\n if (desc == \\\"0\\\") {\\n refreshX5Desc(\\\"float&&screen-170\\\");\\n putVar(anchorId, \\\"1\\\");\\n } else {\\n refreshX5Desc(\\\"float&&0\\\");\\n putVar(anchorId, \\\"0\\\");\\n }\\n return \\\"hiker://empty\\\";\\n }, anchorId + \\\"x5\\\");\\n d[0].title = \\\"展开/收起\\\" + d[0].title;\\n putVar(anchorId + \\\"x5\\\", \\\"0\\\");\\n refreshX5Desc(\\\"float&&0\\\");\\n for (let it of d) {\\n let extra = it.extra || {};\\n extra.cls = \\\"x5ai\\\";\\n it.extra = extra;\\n }\\n deleteItemByCls(\\\"x5ai\\\");\\n addItemAfter(anchorId, d);\\n toast(\\\"AI匹配成功\\\");\\n }\\n if (d.length > 0) {\\n log(\\\"parseLazyRuleAsync:\\\" + d.length);\\n }\\n return d.length > 0 ? \\\"1\\\" : \\\"0\\\";\\n } catch (e) {\\n log(e.toString());\\n }\\n }, rule, location.href, anchorId, white), $$$.toString(() => {\\n if (\\\"0\\\" == input) {\\n window.checkc = window.checkc + 1;\\n /*if (window.checkc > 120) {\\n fba.log(\\\"执行超过30秒,无法解析\\\");\\n } else {*/\\n setTimeout(window.check0, 250);\\n //}\\n } else {\\n window.checkurl = location.href;\\n\\n function checku0() {\\n if (window.checkurl != location.href) {\\n //hash发生了变化\\n setTimeout(function() {\\n window.checkc = 0;\\n check0();\\n }, 2000);\\n } else {\\n setTimeout(checku0, 250);\\n }\\n }\\n checku0();\\n }\\n }));\\n } catch (e) {\\n fba.log(e.toString());\\n setTimeout(window.check0, 250);\\n }\\n }\\n window.checkc = 0;\\n window.check0 = check0;\\n check0();\\n }\\n }, rule, anchorId, storage0.getItem(\\\"white\\\", []));\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"首页\",\"path\":\"home\",\"rule\":\"var d = [];\\nlet url = 网站;\\nlet anchorId = url;\\nlet js = $.require(\\\"hiker://page/x5ai\\\")(MY_RULE.title, anchorId);\\nlet ite = $.require(\\\"hiker://page/u\\\")(MY_RULE.title, getHome(url));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n canBack: true,\\n js: js,\\n jsLoadingInject: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nd.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: anchorId\\n }\\n});\\n\\nsetResult(d);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"必应AI","author":"","version":26,"type":"video","url":"hiker://empty","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar 网站 = 'https://cn.bing.com/';\neval(JSON.parse(fetch('hiker://page/home')).rule)","searchFind":"","search_url":"","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"ysfx\",\"path\":\"ysfx\",\"rule\":\"js:\\nvar d = [];\\nlet rule = getParam(\\\"r\\\").split(\\\"##\\\")[0];\\nlet url = MY_URL.split(\\\"##\\\")[1];\\nlet ite = $.require(\\\"hiker://page/u\\\")(rule, getHome(url));\\nlet js = $.toString(() => {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n});\\nlet js2 = $.require(\\\"hiker://page/x5ai\\\")(rule, url);\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n js: js + \\\";\\\\n\\\" + js2,\\n canBack: true,\\n jsLoadingInject: true,\\n floatVideo: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nd.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: url\\n }\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"u\",\"path\":\"u\",\"rule\":\"$.exports = function(rule, origin) {\\n return $.toString((rule, origin) => {\\n let host = origin.replace(new RegExp(\\\"http://|https://\\\"), \\\"\\\").split(\\\"/\\\")[0];\\n let hosts = host.split(\\\".\\\");\\n if (hosts.length > 2) {\\n host = hosts[hosts.length - 2] + \\\".\\\" + hosts[hosts.length - 1];\\n }\\n if (input.startsWith(\\\"magnet\\\")) {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"检测到新的磁链地址,点击确定按钮即可播放,点击取消按钮可以复制链接\\\",\\n confirm: $.toString((mag) => {\\n return mag;\\n }, input),\\n cancel: $.toString((mag) => {\\n return \\\"copy://\\\" + mag\\n }, input)\\n })\\n return true;\\n } else if (input.includes(\\\"aliyundrive.com\\\")) {\\n log(input);\\n let r1 = fetch(\\\"hiker://home@云盘汇影\\\");\\n if (!r1 || r1.length <= 5) {\\n let ru = $.toString(() => {\\n return \\\"海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘汇影@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5LqR55uY5rGH5b2xIiwiYXV0aG9yIjoiTXJGbHkiLCJ1cmwiOiJoaWtlcjovL2VtcHR5JCQkZnlwYWdlIiwidmVyc2lvbiI6NiwiY29sX3R5cGUiOiJ0ZXh0XzEiLCJjbGFzc19uYW1lIjoiIiwidHlwZSI6ImFsbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmhvbWVQYWdlKCk7Iiwic2VhcmNoX3VybCI6Imhpa2VyOi8vZW1wdHkkJCQqKiQkJGZ5cGFnZSQkJCIsImdyb3VwIjoi4pGg572R55uYIiwic2VhcmNoRmluZCI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLnNlYXJjaFBhZ2UodHJ1ZSk7XG4iLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6ImpzOlxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xuYWxpLmRldGFpbFBhZ2UoKTsiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoidmFyIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKTtcbmlmICghYWxpanMgfHwgIWFsaWpzLmluY2x1ZGVzKCdhbGkuJykpIHtcbiAgICBhbGlqcyA9IGZldGNoQ2FjaGUoJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9mbHkxMzk3L2hpa2VyLWljeS9hbGkuanMnKVxufVxuaWYgKCFhbGlqcyB8fCAhYWxpanMuaW5jbHVkZXMoJ2FsaS4nKSkge1xuICAgIGFsaWpzID0gZmV0Y2hDYWNoZSgnaHR0cDovL2xmaWN5LmNvbTozMDAwMC9tcmZseS9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGkuanMnKVxufVxuaWYgKGFsaWpzKSB7XG4gICAgd3JpdGVGaWxlKFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzXCIsIGFsaWpzKTtcbiAgICBldmFsKGFsaWpzKTtcbiAgICBhbGkucHJlUnVsZSgpO1xufSIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvZHnm5jor6bmg4VcIixcInBhdGhcIjpcImRldGFpbFwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLmFsaVJ1bGUoKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzFfbGVmdF9waWNcIixcIm5hbWVcIjpcIui1hOa6kOe9kemhteivpuaDhVwiLFwicGF0aFwiOlwic2l0ZS1kZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbmV2YWwoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvaWN5L2FsaS5qcycpKTtcXG5hbGkuZGV0YWlsUGFnZSgpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq6572R55uY6K+m5oOFXCIsXCJwYXRoXCI6XCJkcml2ZVwiLFwicnVsZVwiOlwianM6XFxuZXZhbChmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9pY3kvYWxpLmpzJykpO1xcbmFsaS5pbml0Q29uZmlnKCk7XFxuYWxpLm15QWxpUnVsZSgpO1wifV0iLCJpY29uIjoiaHR0cHM6Ly9naXRlZS5jb20vZmx5MTM5Ny9oaWtlci1pY3kvcmF3L21hc3Rlci9hbGl5dW4ucG5nIiwicHJveHkiOiIifQ==\\\"\\n });\\n confirm({\\n title: '温馨提示',\\n content: '本规则依赖云盘汇影规则,点击下面的确定按钮导入,注意导入后一定要在云盘汇影登录阿里云盘账号,否则不能用',\\n confirm: ru,\\n cancel: ru\\n });\\n return false;\\n }\\n log(\\\"input\\\");\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"阿里云盘\\\",\\n url: \\\"hiker://page/detail?rule=云盘汇影&url=\\\" + url + '??fypage',\\n }))\\n }, input, rule)\\n } else if (/\\\\.(mp3|flac|m4a)$/.test(input)) {\\n log(input);\\n return $.toString((url, rule) => {\\n fy_bridge_app.playVideo(url);\\n }, input, rule)\\n } else if (!input.includes(host) && input.startsWith(\\\"http\\\")) {\\n log(input);\\n return $.toString((url, rule) => {\\n let white = [\\n \\\"douyin\\\",\\n \\\"douban\\\",\\n \\\"ixigua.com\\\",\\n \\\"kuaishou\\\",\\n \\\"bilibili\\\",\\n \\\"weibo\\\",\\n \\\"weixin\\\",\\n \\\"baidu\\\",\\n \\\"zmk.\\\",\\n \\\"subhd\\\",\\n \\\"thunder\\\",\\n \\\"xinjuc\\\",\\n \\\"grab4k\\\",\\n \\\"/bt\\\",\\n \\\"jsr10\\\",\\n \\\"assrt\\\",\\n \\\"quark\\\"\\n ];\\n let inWhite = white.filter(it => url.includes(it)).length > 0;\\n if (inWhite) {\\n //跳网页\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n }))\\n } else {\\n //AI解析\\n fy_bridge_app.open(JSON.stringify({\\n title: document.title,\\n url: \\\"hiker://page/p?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"&u=\\\" + fy_bridge_app.base64Encode(url),\\n }))\\n }\\n }, input, rule);\\n } else if (!input.startsWith(\\\"http\\\")) {\\n log(input);\\n //能唤起APP的白名单\\n let white = [\\n \\\"qklink\\\",\\n \\\"bdnetdisk\\\",\\n \\\"xunleiapp\\\"\\n ];\\n let inWhite = white.filter(it => input.startsWith(it)).length > 0;\\n if (!inWhite) {\\n return false;\\n }\\n return $.toString((url, rule) => {\\n fy_bridge_app.openThirdApp && fy_bridge_app.openThirdApp(url);\\n }, input, rule)\\n } else {\\n let white = [\\n \\\"url=\\\",\\n \\\"fsou.com\\\",\\n \\\"bing.\\\", \\n ];\\n let inWhite = white.filter(it => input.includes(it)).length > 0;\\n if (inWhite) {\\n return false;\\n }\\n let reg = new RegExp(\\\"[\\\\u4e00-\\\\u9fa5]+\\\", \\\"g\\\");\\n let r = decodeURIComponent(input);\\n if (reg.test(r) || (input.startsWith(origin) && input.length - origin.length > 2)) {\\n //有中文,应该是在搜索,跳新页面\\n return $.toString((url, rule) => {\\n fy_bridge_app.open(JSON.stringify({\\n title: \\\"详情\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n }));\\n }, input, rule);\\n }\\n }\\n }, rule, origin);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet list = storage0.getItem(\\\"white\\\", []);\\nlet inWhite = list.includes(url);\\nlet d = [];\\nif (!inWhite) {\\n let html = request(url);\\n let web = getItem('web', '0') == \\\"1\\\";\\n let rule = getParam(\\\"r\\\");\\n let parse = $.require(\\\"hiker://page/parse\\\");\\n d = parse(rule, web, url, html);\\n}\\nif (d.length == 0) {\\n //匹配失败\\n let ite = $.require(\\\"hiker://page/u\\\")(getParam(\\\"r\\\"), getHome(url));\\n let js = $.toString(() => {\\n try {\\n if (document.title && document.title.length) {\\n let r = $$$().lazyRule((t) => {\\n setPageTitle(t);\\n }, document.title);\\n fy_bridge_app.parseLazyRule(r);\\n }\\n } catch (e) {\\n fy_bridge_app.log(e.toString());\\n }\\n });\\n let js2 = $.require(\\\"hiker://page/x5ai\\\")(getParam(\\\"r\\\"), url);\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n js: js + \\\";\\\\n\\\" + js2,\\n urlInterceptor: ite,\\n canBack: true,\\n floatVideo: true,\\n jsLoadingInject: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n d.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: url\\n }\\n });\\n if (!inWhite) {\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n }\\n setResult(d);\\n} else {\\n setResult(d);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"二级parse\",\"path\":\"parse\",\"rule\":\"$.exports = function(rule, web, url, html) {\\n let d = [];\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n let arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n //log(arr);\\n let debug = false;\\n\\n function clearText(it) {\\n return it.replace(/第|集|章/g, \\\"\\\");\\n }\\n\\n function isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD/)\\n }\\n\\n function notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n }\\n\\n function isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n }\\n\\n function getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n }\\n\\n function isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n }\\n\\n let _web = $.toString(() => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n }\\n }\\n });\\n\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (web) {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href\\n };\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n }\\n if (d.length == 0) {\\n return d;\\n } else {\\n d.splice(0, 0, {\\n title: \\\"““””<small><font color='#aaaaaa'>🔗\\\" + url + \\\"</font></small>\\\",\\n url: \\\"hiker://page/ysfx?rule=\\\" + rule + \\\"&r=\\\" + rule + \\\"##\\\" + url,\\n col_type: \\\"text_1\\\",\\n extra: {\\n lineVisible: false\\n }\\n });\\n //为线路加分割线\\n let d2 = [];\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n } \\n d2.push({\\n title: \\\"<small><font color='#aaaaaa'>匹配有误?点我不再匹配此页面</font></small>\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((url) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"如果只是单次匹配失败,点击下方取消按钮刷新页面重新匹配,如果确认无法匹配,点击下方确定按钮加入白名单\\\",\\n cancel: \\\"refreshPage()\\\",\\n confirm: $.toString((url) => {\\n let list = storage0.getItem(\\\"white\\\", []);\\n list.push(url);\\n storage0.setItem(\\\"white\\\", list);\\n refreshPage();\\n return \\\"toast://已加入白名单\\\"\\n }, url)\\n });\\n return \\\"hiker://empty\\\"\\n }, url),\\n col_type: \\\"avatar\\\",\\n img: \\\"hiker://images/account\\\"\\n });\\n return d2;\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"x5AI\",\"path\":\"x5ai\",\"rule\":\"$.exports = function(rule, anchorId) {\\n return $.toString((rule, anchorId, white) => {\\n if (window.check0 == null) {\\n function check0() {\\n try {\\n let u1 = location.href.replace(\\\"https://\\\", \\\"\\\").replace(\\\"http://\\\", \\\"\\\");\\n let u2 = u1.split(\\\"/\\\");\\n let isHome = u2.length < 2 || (u2.length == 2 && u2[1] == \\\"\\\");\\n let h = location.hash;\\n if (h != null && h != \\\"\\\" && h != \\\"#/\\\") {\\n isHome = false;\\n }\\n if (isHome) {\\n setTimeout(window.check0, 250);\\n return\\n }\\n let html = document.querySelector(\\\"html\\\").innerHTML;\\n fba.putVar(\\\"html0\\\", html);\\n fba.parseLazyRuleAsync($$$().lazyRule((rule, url, anchorId, white) => {\\n try {\\n let d = [];\\n let html = getVar(\\\"html0\\\", \\\"\\\");\\n clearVar(\\\"html0\\\");\\n let web = false;\\n let white2 = [\\n \\\"fsou.com\\\",\\n \\\"bing.\\\",\\n ];\\n let parse = $.require(\\\"hiker://page/parse?rule=\\\" + rule);\\n let inWhite = white2.filter(it => url.includes(it)).length > 0;\\n if (!inWhite && !white.includes(url)) {\\n d = parse(rule, web, url, html);\\n }\\n if (!inWhite && d.length < 1) {\\n try {\\n let arr = pdfa(html, \\\"body&&iframe\\\");\\n if (arr.length > 0) {\\n let src = pdfh(arr[0], \\\"iframe&&src\\\");\\n log(\\\"获取到iframe:\\\" + src);\\n if (!white.includes(src)) {\\n if (src && src.startsWith(\\\"http\\\") && !src.match(/\\\\.mp4|\\\\.m3u8|\\\\.mp3|\\\\.flv|\\\\.mkv/)) {\\n html = request(src);\\n d = parse(rule, web, src, html);\\n }\\n }\\n }\\n } catch (e) {\\n log(\\\"尝试获取iframe失败\\\");\\n }\\n }\\n if (d.length > 0) {\\n d[0].url = $(\\\"#noLoading#\\\").lazyRule((anchorId) => {\\n let desc = getVar(anchorId, \\\"0\\\");\\n if (desc == \\\"0\\\") {\\n refreshX5Desc(\\\"float&&screen-170\\\");\\n putVar(anchorId, \\\"1\\\");\\n } else {\\n refreshX5Desc(\\\"float&&0\\\");\\n putVar(anchorId, \\\"0\\\");\\n }\\n return \\\"hiker://empty\\\";\\n }, anchorId + \\\"x5\\\");\\n d[0].title = \\\"展开/收起\\\" + d[0].title;\\n putVar(anchorId + \\\"x5\\\", \\\"0\\\");\\n refreshX5Desc(\\\"float&&0\\\");\\n for (let it of d) {\\n let extra = it.extra || {};\\n extra.cls = \\\"x5ai\\\";\\n it.extra = extra;\\n }\\n deleteItemByCls(\\\"x5ai\\\");\\n addItemAfter(anchorId, d);\\n toast(\\\"AI匹配成功\\\");\\n }\\n if (d.length > 0) {\\n log(\\\"parseLazyRuleAsync:\\\" + d.length);\\n }\\n return d.length > 0 ? \\\"1\\\" : \\\"0\\\";\\n } catch (e) {\\n log(e.toString());\\n }\\n }, rule, location.href, anchorId, white), $$$.toString(() => {\\n if (\\\"0\\\" == input) {\\n window.checkc = window.checkc + 1;\\n /*if (window.checkc > 120) {\\n fba.log(\\\"执行超过30秒,无法解析\\\");\\n } else {*/\\n setTimeout(window.check0, 250);\\n //}\\n } else {\\n window.checkurl = location.href;\\n\\n function checku0() {\\n if (window.checkurl != location.href) {\\n //hash发生了变化\\n setTimeout(function() {\\n window.checkc = 0;\\n check0();\\n }, 2000);\\n } else {\\n setTimeout(checku0, 250);\\n }\\n }\\n checku0();\\n }\\n }));\\n } catch (e) {\\n fba.log(e.toString());\\n setTimeout(window.check0, 250);\\n }\\n }\\n window.checkc = 0;\\n window.check0 = check0;\\n check0();\\n }\\n }, rule, anchorId, storage0.getItem(\\\"white\\\", []));\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"首页\",\"path\":\"home\",\"rule\":\"var d = [];\\nlet url = 网站;\\nlet anchorId = url;\\nlet js = $.require(\\\"hiker://page/x5ai\\\")(MY_RULE.title, anchorId);\\nlet ite = $.require(\\\"hiker://page/u\\\")(MY_RULE.title, getHome(url));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"100%&&float\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n urlInterceptor: ite,\\n canBack: true,\\n js: js,\\n jsLoadingInject: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nd.push({\\n col_type: \\\"line\\\",\\n extra: {\\n id: anchorId\\n }\\n});\\n\\nsetResult(d);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"AI聚集","author":"","version":55,"type":"tool","url":"hiker://empty##fyclass##fypage","col_type":"movie_3_marquee","class_name":"首页&豌豆&茶杯狐&搜片&青麦&电影狗&茶杯虎&土拨鼠&动漫巴士","class_url":"home&https://www.wandou.la/&https://cupfox.app/&http://soupian.xyz/&https://www.qmtv.pro/&https://www.dianyinggou.com/yingku/&https://www.725998.com/yingku&https://www.tbsdy.com/m/index.html&https://dm84.tv","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:\nvar myurl = MY_URL.split(\"##\")[1];\n\nlet anchorId = myurl;\nlet js = $.require(\"hiker://page/x5ai\")(MY_RULE.title, anchorId);\n\nfunction loadUrl(myurl, myrule, m) {\n setResult([{\n col_type: \"x5_webview_single\",\n url: myurl,\n desc: \"float&&top\",\n extra: {\n floatVideo: true,\n canBack: true,\n urlInterceptor: $.toString((MY_RULE, moban) => {\n log(input)\n if (input.startsWith('https://www.aliyundrive.com/s/')) {\n return $.toString((url) => {\n fba.open(JSON.stringify({\n rule: '云盘汇影',\n url: 'hiker://page/detail?rule=云盘汇影&url=' + url + '??fypage'\n }));\n }, input)\n } else if (input.startsWith('https://dm84.tv/v/')) {\n return $.toString((url, MY_RULE, moban) => {\n var u = 'hiker://empty?u=' + url;\n u = moban == '0' ? u : u + '#immersiveTheme#';\n fba.open(JSON.stringify({\n rule: MY_RULE.title,\n title: '影片详情',\n group: MY_RULE.group,\n preRule: MY_RULE.preRule,\n pages: MY_RULE.pages,\n url: u,\n findRule: MY_RULE.detail_find_rule\n }));\n }, input, MY_RULE, moban)\n } else if (!input.startsWith('https://dm84.tv') && !input.startsWith(\"https://cupfox.app/\") && !input.startsWith(\"https://51souju.com/\") &&\n !input.startsWith(\"https://www.dianyinggou.com/\") && !input.startsWith(\"https://www.wandou.la/\") && !input.startsWith(\"https://soupian.icu/\") && !input.startsWith(\"http://m.qmtv.pro/\") && !\n input.startsWith(\"https://www.725998.com/\") && !input.includes(\"search\")) {\n return $.toString((url, MY_RULE, moban) => {\n var u = 'hiker://empty?u=' + url;\n u = moban == '0' ? u : u + '#immersiveTheme#';\n fba.open(JSON.stringify({\n rule: MY_RULE.title,\n title: '影片详情',\n group: MY_RULE.group,\n preRule: MY_RULE.preRule,\n pages: MY_RULE.pages,\n url: u,\n findRule: MY_RULE.detail_find_rule\n }));\n }, input, MY_RULE, moban)\n }\n }, MY_RULE, getItem('ai', '0')),\n js: js,\n }\n }]);\n}\n\nif (myurl == 'home') {\n refreshX5Desc('0')\n $.require('hiker://page/pro')\n} else {\n loadUrl(myurl, MY_RULE);\n}","searchFind":"js:\nvar d = [];\nlet key = MY_URL.split(\"##\")[1];\nd.push({\n title: \"点我开始聚合搜索\" + key,\n url: \"hiker://page/soup\",\n extra: {\n pageTitle: \"搜索\" + key,\n key: key\n }\n});\n\nsetResult(d);","search_url":"hiker://empty##**","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"js:\nlog(MY_URL)\n\neval(JSON.parse(request('hiker://page/p')).rule)","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"var ua = '';\nrequire('https://gitcode.net/qq_32394351/dr/-/raw/master/js/预处理.js');\n\ninitConfig({\n wandou: \"api.json.wandou9.xyz:8036\",\n soupian: 'soupian.icu',\n qimai: 'www.qmtv.pro'\n});","pages":"[{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\naddListener(\\\"onClose\\\", $.toString(() => {\\n updateItem('parset', {\\n title: getItem('嗅探', '视频嗅探'),\\n });\\n clearMyVar('weburl');\\n putMyVar('bm', '0');\\n storage0.putMyVar(\\\"duoselect\\\", []);\\n //back(false)\\n}));\\n\\nvar BitTS = [];\\n\\n//putMyVar(\\\"muban\\\", {名称:'极客影视'})\\n\\neval(JSON.parse(request('hiker://page/ztools')).rule)\\n\\nvar url = '';\\nvar html = '';\\n\\nvar keys = MY_PARAMS;\\nvar from = keys.from != undefined ? keys.from : '';\\nvar dtitle = keys.pageTitle != undefined ? keys.pageTitle : '';\\n\\n\\nif (getMyVar('weburl', '') == '') {\\n //MY_URL = MY_URL.replace('#immersiveTheme#', '');\\n MY_URL = MY_URL.includes('#') ? MY_URL.split('#')[0] : MY_URL;\\n var u = getParam(\\\"u\\\")\\n if (u == undefined) {\\n u = MY_URL\\n }\\n log('u:' + u);\\n url = getTurl(u);\\n //预读\\n //log('url:'+url);\\n var temp = fetch(url);\\n var al = pdfa(temp, \\\"body&&a\\\");\\n if (temp.search(/window.location.href/) != -1 && al.length == 0) {\\n MY_URL = url;\\n var te = temp.replace(/.+href=\\\"(.*?)\\\".+/g, '<a href=\\\"$1\\\"></a>');\\n url = pd(te, \\\"a&&href\\\");\\n log('js重定向:' + url);\\n } else {\\n html = temp;\\n }\\n\\n putMyVar('weburl', url);\\n\\n} else {\\n url = getMyVar('weburl');\\n}\\nvar durl = url;\\nlog('二级页面:' + durl);\\n\\nif (getItem('ai', '0') == '1') {\\n var lazy = $('').lazyRule(() => {\\n try {\\n var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1])\\n var url = html.url\\n if (html.encrypt == '1') {\\n url = unescape(url);\\n } else if (html.encrypt == '2') {\\n url = unescape(base64Decode(url));\\n }\\n if (/m3u8|mp4/.test(url)) {\\n return url\\n } else {\\n return 'video://' + input\\n }\\n } catch (e) {\\n return 'video://' + input\\n }\\n })\\n\\n try {\\n log(url)\\n MY_URL = 'hiker://empty##' + url\\n require(config.自动匹配);\\n 自动二级(lazy);\\n putMyVar('bm', '1')\\n } catch {\\n putMyVar('bm', '0')\\n }\\n}\\n\\n\\nlog('模板:' + getMyVar('bm', '0'))\\n\\nif (getMyVar('bm', '0') == '0') {\\n\\n var d = [];\\n MY_URL = url\\n\\n function getTitle(html, s) {\\n var title = '';\\n var titles = pdfa(html, s);\\n //log(titles);\\n if (titles.length == 0) {\\n return title\\n }\\n for (let x of titles) {\\n if (x.includes('<font')) {\\n title = pdfh(x, 'h1--font&&Text');\\n } else if (x.includes('<span')) {\\n title = pdfh(x, 'h1--span&&Text');\\n } else {\\n title = pdfh(x, 'Text');\\n }\\n if (title != '') {\\n break;\\n } else {\\n continue;\\n }\\n }\\n return title\\n }\\n\\n if (html == \\\"\\\") {\\n html = fetchPC(url)\\n }\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n /*if(html.search(/window.location.href/)!=-1&&alist.length==0){\\n MY_URL=url;\\n var temp=html.replace(/.+href=\\\"(.*?)\\\".+/g,'<a href=\\\"$1\\\"></a>');\\n url=pd(temp,\\\"a&&href\\\");\\n log('js重定向:'+url);\\n putMyVar('weburl', url);\\n html = fetchPC(url);\\n alist = pdfa(html, \\\"body&&a\\\");\\n }*/\\n\\n let arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n\\n\\n var title = getTitle(html, 'body&&h1');\\n if (title == '') {\\n title = getTitle(html, \\\"body&&h3[class*='title']\\\");\\n }\\n if (title == '') {\\n title = getTitle(html, \\\"head&&title\\\");\\n }\\n if (dtitle != \\\"\\\") {\\n setPageTitle(dtitle);\\n } else if (getPageTitle().includes('详情')) {\\n if (title != '') {\\n if (title.includes('-')) {\\n title = title.split('-')[0].trim()\\n }\\n setPageTitle(title)\\n }\\n }\\n\\n\\n //log(arr);\\n let debug = false;\\n\\n function clearText(it) {\\n return it.replace(/第|集|章/g, \\\"\\\");\\n }\\n\\n function isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n if (nofile(it)) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD|中字/)\\n }\\n\\n function notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n }\\n\\n function isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n }\\n\\n function getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n }\\n\\n function isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n }\\n\\n let tfpush = getItem('webpush', '0');\\n\\n let _web = $.toString((tfpush) => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n //return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n if (tfpush == '0') {\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n } else {\\n let play = fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\"));\\n return 'hiker://page/push?pushurl=' + encodeURIComponent(JSON.stringify({\\n \\\"name\\\": document.title,\\n \\\"url\\\": play\\n }));\\n }\\n }\\n }\\n }, tfpush);\\n\\n function __web(mode) {\\n return $.toString((tfpush) => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n //return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n if (tfpush == '0') {\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n } else {\\n let play = fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\"));\\n return 'hiker://page/push?pushurl=' + encodeURIComponent(JSON.stringify({\\n \\\"name\\\": document.title,\\n \\\"url\\\": play\\n }));\\n }\\n }\\n }\\n }, mode);\\n }\\n\\n $.extend({\\n lweb: __web\\n })\\n\\n let web = getItem('web', '0');\\n var pushtype = ['列表', '单集']\\n var parsetype = ['Web嗅探:0', '视频嗅探:1', 'dm盒子:2']\\n log('推送类型:' + pushtype[parseInt(tfpush)])\\n log('嗅探类型:' + parsetype[parseInt(web)].split(':')[0])\\n\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (tfpush == '1') {\\n /*var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n cls: 'plays',\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };*/\\n var urlx = 'hiker://page/push?&pushurl=' + encodeURIComponent(JSON.stringify({\\n \\\"name\\\": getPageTitle(),\\n \\\"url\\\": it.text + '$' + it.href,\\n \\\"content\\\": MY_URL.title,\\n }));\\n var extrax = {\\n id: it.href,\\n cls: 'plays',\\n };\\n } else {\\n if (web == '0') {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n cls: 'plays',\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else if (web == '1') {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href,\\n cls: 'plays',\\n };\\n } else if (web == '2') {\\n lazy = $('').lazyRule(() => {\\n return $.require('hiker://page/lazyToX5?rule=dm盒子').videoX5();\\n })\\n var urlx = it.href + lazy\\n var extrax = {\\n id: it.href,\\n cls: 'plays',\\n };\\n }\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n ph: t + \\\"$\\\" + it.href,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n }\\n if (d.length == 0) {\\n //匹配失败\\n d.push({\\n title: 'x5',\\n col_type: 'avatar',\\n url: 'hiker://empty',\\n extra: {\\n id: 'aijump'\\n }\\n })\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&screen-100\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n floatVideo: true,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n log(\\\"当前页面地址: \\\" + url)\\n setResult(d);\\n\\n if (MY_PARAMS.web == \\\"哔滴影视\\\") {\\n var trule = request(\\\"hiker://home@哔嘀影视\\\")\\n //log(trule)\\n\\n if (trule != null) {\\n var tjson = JSON.parse(trule);\\n var jsr = tjson.preRule;\\n var ticon = tjson.icon;\\n //log(jsr)\\n eval(jsr)\\n //log(config.ui)\\n updateItem('aijump', {\\n title: '哔滴影视',\\n col_type: 'avatar',\\n img: ticon,\\n url: \\\"hiker://page/details?rule=哔嘀影视&url=\\\" + durl + '#immersiveTheme#',\\n extra: {\\n config: JSON.stringify(config),\\n }\\n })\\n }\\n }\\n\\n } else {\\n //为线路加分割线\\n let d2 = [];\\n let mtab = [];\\n\\n d = unique(d)\\n //log(BitTS)\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n mtab.push(d[i].ph);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n mtab.push('#');\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n }\\n\\n let playl = mtab.join('#').replace(/###/g, '$$$$$$');\\n\\n\\n let from = [];\\n for (var j = 0; j < playl.split('$$$').length; j++) {\\n from.push(\\\"播放列表\\\" + [j + 1]);\\n }\\n let push = JSON.stringify({\\n \\\"name\\\": getPageTitle(),\\n \\\"from\\\": from.join('$$$'),\\n \\\"url\\\": playl.replace(/\\\\&/g, '&&'),\\n \\\"content\\\": MY_RULE.title\\n });\\n //log(push);\\n\\n var tconfig = {\\n name: getPageTitle(),\\n content: MY_RULE.title\\n }\\n\\n d2.unshift({\\n title: \\\"推送本页=>TVBox\\\",\\n url: $(push).lazyRule((tconfig) => {\\n var dlist = storage0.getMyVar(\\\"duoselect\\\");\\n if (dlist.length > 0) {\\n var plays = dlist.map(x => x.title + \\\"$\\\" + x.url).join(\\\"#\\\");\\n var dpush = JSON.stringify({\\n \\\"name\\\": tconfig.name,\\n \\\"from\\\": \\\"播放列表\\\",\\n \\\"url\\\": plays,\\n \\\"content\\\": tconfig.content\\n });\\n //log(dpush)\\n return 'hiker://page/push?pushurl=' + encodeURIComponent(dpush);\\n }\\n\\n return 'hiker://page/push?pushurl=' + encodeURIComponent(input);\\n }, tconfig),\\n col_type: \\\"scroll_button\\\",\\n extra: {\\n id: 'pushs',\\n }\\n });\\n\\n\\n d2.unshift({\\n title: '选推',\\n col_type: 'scroll_button',\\n url: $('#noLoading#').lazyRule(() => {\\n setItem('webpush', '0');\\n\\n updateItem('spush', {\\n title: '单推',\\n });\\n\\n if (findItem('dselect').extra.mode == 'open') {\\n toast('选推模式关闭');\\n storage0.putMyVar(\\\"duoselect\\\", []);\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }\\n\\n let Ids = (findItemsByCls('plays')).map(it => it.extra.id);\\n Ids.forEach(x => {\\n var title = findItem(x).title;\\n\\n updateItem(x, {\\n url: $.msm(title, x),\\n });\\n });\\n var title = findItem('dselect').title;\\n updateItem('dselect', {\\n title: `““””<span style=\\\"color:#4682B4\\\">` + title,\\n extra: {\\n mode: 'open'\\n }\\n });\\n\\n updateItem('pushs', {\\n title: '推送选中=>TVBox',\\n });\\n\\n toast('选推模式开启')\\n return \\\"hiker://empty\\\";\\n }),\\n extra: {\\n id: 'dselect',\\n 'mode': 'close'\\n }\\n })\\n\\n\\n d2.unshift({\\n title: (getItem('webpush', '0') == '1' ? '““””<font color=\\\"#00FF00\\\">单推</font>' : '单推'),\\n url: `hiker://empty@lazyRule=.js:getItem('webpush','0')=='1'?setItem('webpush','0'):setItem('webpush','1');refreshPage();'toast://切换成功!'`,\\n col_type: 'scroll_button',\\n extra: {\\n id: 'spush',\\n }\\n });\\n\\n d2.splice(3, 0, {\\n title: parsetype[parseInt(web)].split(':')[0],\\n col_type: 'scroll_button',\\n url: $('#noLoading#').lazyRule((inf) => {\\n if (getItem('webpush', '0') == '1' || findItem('dselect').extra.mode == 'open') {\\n return 'toast://单推|选推模式开启无法修改'\\n }\\n let all_cols = inf\\n let col = storage0.getItem('嗅探', 'Web嗅探');\\n let 嗅探 = all_cols.map((it) => {\\n return it.split(':')[0] === col ? '➡️' + it : it;\\n });\\n let tips = '请选择嗅探模式';\\n return $(嗅探, 1, tips).select(() => {\\n input = input.replace(/➡️/g, '');\\n storage0.setItem('嗅探', input.split(':')[0]);\\n var mode = input.split(':')[1]\\n storage0.setItem('web', mode)\\n let oldIds = (findItemsByCls('plays')).map(it => it.extra.id);\\n oldIds.forEach(x => {\\n if (mode == '0') {\\n updateItem(x, {\\n url: \\\"webRule://\\\" + x + \\\"@\\\" + $.lweb('0'),\\n extra: {\\n jsLoadingInject: true,\\n id: x,\\n cls: 'plays',\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n }\\n });\\n }\\n if (mode == '1') {\\n updateItem(x, {\\n url: \\\"video://\\\" + x,\\n extra: {\\n id: x,\\n cls: 'plays',\\n }\\n });\\n }\\n if (mode == '2') {\\n updateItem(x, {\\n url: x + $('').lazyRule(() => {\\n return $.require('hiker://page/lazyToX5?rule=dm盒子').videoX5();\\n }),\\n extra: {\\n id: x,\\n cls: 'plays',\\n }\\n });\\n }\\n })\\n updateItem('parse', {\\n title: storage0.getItem('嗅探', 'Web嗅探'),\\n });\\n\\n return 'toast://已切嗅探方式为:' + input;\\n });\\n return 'hiker://empty'\\n }, parsetype),\\n extra: {\\n id: 'parse',\\n }\\n });\\n\\n d2.unshift({\\n title: '““””<small>⚡️' + durl + '</small>',\\n col_type: 'text_center_1',\\n url: durl,\\n });\\n\\n\\n if (MY_PARAMS.web == \\\"哔滴影视\\\") {\\n var trule = request(\\\"hiker://home@哔嘀影视\\\")\\n //log(trule)\\n\\n if (trule != null) {\\n var tjson = JSON.parse(trule);\\n var jsr = tjson.preRule;\\n var ticon = tjson.icon;\\n //log(jsr)\\n eval(jsr)\\n //log(config.ui)\\n d2.unshift({\\n title: '哔滴影视',\\n col_type: 'avatar',\\n img: ticon,\\n url: \\\"hiker://page/details?rule=哔嘀影视&url=\\\" + durl + '#immersiveTheme#',\\n extra: {\\n config: JSON.stringify(config),\\n }\\n })\\n }\\n }\\n\\n\\n\\n var d3 = [];\\n if (getItem('ai', '0') == '1') {\\n\\n d3.push({\\n title: getPageTitle(),\\n img: 'https://pic3.58cdn.com.cn/nowater/webim/big/n_v281d60bd127e84cd28807d51143eaa61f.gif',\\n col_type: 'movie_1_vertical_pic_blur',\\n extra: {\\n id: 'd3',\\n }\\n })\\n setResult(d3)\\n }\\n\\n if (findItem('d3') != null) {\\n addItemAfter('d3', d2);\\n } else {\\n setResult(d2)\\n }\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"0.聚合\",\"path\":\"pro\",\"rule\":\"var d = [];\\n\\nvar getRangeColors = function() {       \\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);     \\n}\\n\\n\\nvar titles = [{\\n title: '豌豆',\\n img: 'https://www.wandou.la/favicon.ico',\\n url: 'hiker://page/wandou',\\n}, {\\n title: '茶杯狐',\\n img: 'https://bj.bcebos.com/baidu-rmb-video-cover-1/74f13d0620f72b00a4e9b67f3dab96d1.png',\\n url: 'hiker://page/cupfox',\\n}, {\\n title: '搜片',\\n img: 'https://bj.bcebos.com/baidu-rmb-video-cover-1/73b8cf6ae078303a572e76c79dd93e7a.png',\\n url: 'hiker://page/soupian',\\n}, {\\n title: '茶杯虎',\\n img: 'https://www.725998.com/favicon.ico',\\n url: 'hiker://page/aiobb',\\n}, {\\n title: '电影狗',\\n img: 'https://www.dianyinggou.com/favicon.ico',\\n url: 'hiker://page/dydog',\\n}]\\n\\ntitles = titles.filter(x => x.title != \\\"茶杯狐\\\");\\n\\nvar names = titles.map(x => x.title);\\nvar imgs = titles.map(x => x.img);\\nvar urls = titles.map(x => x.url);\\n\\nvar col = 5;\\n\\nswitch (titles.length) {\\n case 1:\\n col = \\\"avatar\\\";\\n break;\\n case 2:\\n col = \\\"icon_2\\\";\\n break;\\n case 3:\\n col = \\\"icon_small_3\\\";\\n break;\\n case 4:\\n col = \\\"icon_round_small_4\\\";\\n break;\\n case 5:\\n col = \\\"icon_5\\\";\\n break;\\n}\\n\\n\\nif (MY_PAGE == 1) {\\n names.map((x, i) => {\\n var ix = storage0.getMyVar('page_index', 0);\\n var title = ix == i ? `““””<font color=${getRangeColors()}>` + x + '</font>' : x;\\n d.push({\\n title: title,\\n col_type: col,\\n img: imgs[i],\\n url: $('#noLoading#').lazyRule((i) => {\\n storage0.putMyVar('page_index', i)\\n //clearMyVar('sou')\\n clearMyVar('page')\\n clearMyVar('cfpage')\\n refreshPage()\\n return 'toast://切换成功'\\n }, i),\\n })\\n })\\n\\n var web = getItem('web', '0')\\n //log(web)\\n var title = ''\\n switch (web) {\\n case '0':\\n title = 'Web嗅探'\\n break;\\n case '1':\\n title = '视频嗅探'\\n break;\\n case '2':\\n title = 'dm盒子'\\n break;\\n }\\n setItem('嗅探', title)\\n\\n d.push({\\n title: '设置',\\n url: \\\"hiker://page/setting\\\",\\n col_type: 'flex_button'\\n }, {\\n title: \\\"页面加载:\\\" + getItem('home', '关'),\\n url: $('#noLoading#').lazyRule(() => {\\n if (getItem('home', '关') == '关') {\\n setItem('home', '开')\\n } else {\\n setItem('home', '关')\\n }\\n refreshPage()\\n return 'hiker://empty'\\n }),\\n col_type: \\\"flex_button\\\"\\n }, {\\n title: title,\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n var web = getItem('web', '0')\\n switch (web) {\\n case '0':\\n setItem('web', '1')\\n break;\\n case '1':\\n setItem('web', '2')\\n break;\\n case '2':\\n setItem('web', '0')\\n break;\\n }\\n refreshPage();\\n return 'hiker://empty'\\n }),\\n col_type: \\\"flex_button\\\",\\n extra: {\\n id: 'parset'\\n }\\n }, {\\n title: '模板:' + (getItem('ai', '0') == '0' ? '关闭' : '开启'),\\n col_type: \\\"flex_button\\\",\\n url: $('#noLoading#').lazyRule(() => {\\n if (getItem('ai', '0') == '0') {\\n setItem('ai', '1')\\n } else {\\n setItem('ai', '0')\\n }\\n refreshPage(false)\\n return 'hiker://empty'\\n }),\\n col_type: 'flex_button',\\n extra: {\\n id: 'aimb'\\n }\\n });\\n}\\n\\n\\nvar rulename = MY_RULE.title;\\nif (MY_PAGE == 1) {\\n\\n let {\\n searchw\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rulename);\\n\\n var sconfig = {\\n history: false, //历史\\n histshow: 10, //保留10个\\n suggest: false, //建议\\n }\\n\\n\\n var sfig = storage0.getItem('sconfig', sconfig);\\n\\n searchw(d, {\\n sug: sfig.suggest ? sfig.suggest : false,\\n history: sfig.history ? sfig.history : false,\\n show: sfig.histshow ? sfig.histshow : 10\\n })\\n\\n\\n\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n }));\\n\\n addListener(\\\"onRefresh\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n clearMyVar(\\\"durl\\\");\\n clearMyVar('cfpage')\\n }));\\n}\\n\\nlet s = getMyVar(\\\"sou\\\", \\\"\\\");\\nif (s != \\\"\\\") {\\n let num = 10;\\n $.searchwords.addData(s, rulename, num);\\n}\\n\\nlet r = \\\"\\\";\\n\\nvar index = Number(storage0.getMyVar('page_index', 0))\\nlet nextindex = index + 1;\\n\\n\\ntry {\\n eval(JSON.parse(request(urls[index])).rule)\\n} catch (e) {\\n //setItem('home', '关')\\n if (index > 4) {\\n nextindex = 0;\\n }\\n toast(names[Number(storage0.getMyVar('page_index', 0))] + `发生错误,错误信息:${e.message}`);\\n log(names[Number(storage0.getMyVar('page_index', 0))] + `发生错误,错误信息:${e.message}`);\\n //storage0.putMyVar('page_index', nextindex);\\n //refreshPage();\\n}\\n\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"js:\\nfunction wrap(text, s) {\\n return text.includes(\\\"““””\\\") ? text : \\\"““””\\\" + text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n\\nfunction wrap1(text, s) {\\n return text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n\\nfunction removehtml(text) {\\n return text.replace(/<[^<]+?>/g, '')\\n}\\n\\nfunction merge(text, s, m) {\\n if (m == 0) {\\n text = '““””' + text + '-' + \\\"<strong><span style=\\\\\\\"color: #FF5733\\\\\\\">\\\" + s + \\\"</span></strong>\\\"\\n } else {\\n text = text + '-' + \\\"<strong><span style=\\\\\\\"color: #FF5733\\\\\\\">\\\" + s + \\\"</span></strong>\\\"\\n }\\n return text\\n}\\n\\nfunction setPageD(d, page, ptag, titles, color) {\\n var paged = getMyVar(ptag, \\\"0\\\");\\n titles.map((x, i) => {\\n var title = Number(paged) == i ? \\\"““””<b><font color=\\\" + color + \\\">\\\" + x + \\\"</font></b>\\\" : `${x}`;\\n if (page == 1) {\\n d.push({\\n title: title,\\n col_type: 'text_2',\\n url: i + $('#noLoading#').lazyRule((ptag) => {\\n putMyVar(ptag, input);\\n clearMyVar('cfpage')\\n refreshPage();\\n return 'hiker://empty'\\n }, ptag),\\n })\\n }\\n })\\n return getMyVar(ptag, \\\"0\\\")\\n}\\n\\n//url解析\\nfunction urlParse(u) {\\n var dict = {}\\n dict.Source = u;\\n let params = (url) => {\\n let queryParams = {};\\n let reg = /([^?=&]+)=([^?=&]+)/g;\\n url.replace(reg, function() {\\n queryParams[arguments[1]] = arguments[2];\\n })\\n return queryParams\\n }\\n var javaUrl = JavaImporter(java.net.URL);\\n with(javaUrl) {\\n var url = new URL(u);\\n dict.Protocol = url.getProtocol();\\n dict.Host = url.getHost();\\n dict.Port = url.getPort();\\n dict.File = url.getFile();\\n dict.Path = url.getPath();\\n dict.Ref = url.getRef();\\n dict.Hosts = `${url.getProtocol()}://${url.getHost()}`\\n }\\n dict.Params = params(u);\\n return dict;\\n}\\n\\n\\n//json对象转查询字符串\\nObject.ToParams = function() {\\n var json = arguments[0];\\n return Object.keys(json).map(key => key + '=' + json[key]).join('&');\\n}\\n\\n\\n//搜索补全\\nfunction 搜索建议(arr, setting) {\\n $.extend({\\n searchwords: {\\n addData: function(name, rule_name, num) {\\n clearMyVar('page')\\n clearMyVar(\\\"cfpage\\\")\\n clearMyVar(\\\"durl\\\")\\n //log(name)\\n let localData = request('hiker://files/cache/' + rule_name + '-搜索记录.json');\\n if (!localData) localData = \\\"[]\\\";\\n let lishi = JSON.parse(localData);\\n let ccc = lishi.indexOf(name);\\n if (ccc > -1) {\\n lishi.splice(ccc, 1)\\n };\\n lishi.push(name);\\n\\n lishi = lishi.slice(-num);\\n //log(lishi)\\n writeFile('hiker://files/cache/' + rule_name + '-搜索记录.json', JSON.stringify(lishi));\\n },\\n getData: function(rule_name) {\\n var res = request('hiker://files/cache/' + rule_name + '-搜索记录.json');\\n return JSON.parse(res)\\n },\\n delData: function(index, rule_name) {\\n let localData = this.getData(rule_name).reverse();\\n //log(localData)\\n if (localData.length > 0) {\\n //log(index)\\n localData.splice(index, 1);\\n localData.reverse();\\n writeFile('hiker://files/cache/' + rule_name + '-搜索记录.json', JSON.stringify(localData));\\n }\\n }\\n }\\n })\\n\\n var rule_name = MY_RULE.title;\\n let num = setting.show != undefined ? setting.show : 3;\\n let sug = setting.sug != undefined ? setting.sug : false;\\n var key = getMyVar(\\\"sou\\\", \\\"\\\")\\n if (setting.history == true) {\\n arr.push({\\n title: `${key!=\\\"\\\"?'<small>'+key+'</small>':'<b>历史记录</b>'}`,\\n desc: '<b>📄\\\\t\\\\t</b>',\\n img: 'https://i2.100024.xyz/2023/06/10/md3vui.webp',\\n url: $('hiker://empty').rule((rule_name, num) => {\\n setPageTitle('历史记录:' + num)\\n var d = [];\\n let localData = request('hiker://files/cache/' + rule_name + '-搜索记录.json');\\n if (!localData) localData = \\\"[]\\\";\\n let lishi = JSON.parse(localData).slice(-num).reverse();\\n //log(lishi)\\n //log(localData)\\n config.sug = lishi;\\n initConfig({\\n sug: config.sug\\n });\\n //log(config.sug)\\n config.sug.map((x, i) => {\\n d.push({\\n title: `““””<small>${x}</small>`,\\n url: $('#noLoading#').lazyRule((x, rule_name, num) => {\\n putMyVar(\\\"sou\\\", x);\\n $.searchwords.addData(x, rule_name, num);\\n back();\\n return 'hiker://empty'\\n }, x, rule_name, num), //'hiker://search?s=' + x + '&rule=' + rule_name,\\n col_type: \\\"flex_button\\\",\\n extra: {\\n longClick: [{\\n title: '删除',\\n js: $.toString((x, rule_name, i) => {\\n $.searchwords.delData(i, rule_name);\\n deleteItem('clsid' + i);\\n return 'hiker://empty'\\n }, x, rule_name, i)\\n }],\\n id: 'clsid' + i,\\n }\\n })\\n })\\n d.push({\\n title: `““””<small>清除历史记录</small>`,\\n url: $('#noLoading#').lazyRule((rule_name) => {\\n let test = $(\\\"是否确认?\\\").confirm((rule_name) => {\\n writeFile('hiker://files/cache/' + rule_name + '-搜索记录.json', '');\\n refreshPage();\\n return \\\"toast://完成\\\";\\n }, rule_name);\\n return test\\n }, rule_name),\\n col_type: \\\"text_center_1\\\",\\n extra: {\\n cls: \\\"#s\\\"\\n }\\n })\\n\\n setResult(d);\\n }, rule_name, num),\\n col_type: \\\"avatar\\\",\\n extra: {\\n id: '13input',\\n //cls: \\\"#s\\\"\\n }\\n })\\n }\\n if (sug) {\\n arr.push({\\n title: \\\"搜索\\\",\\n url: $.toString((rule_name, num) => {\\n putMyVar(\\\"sou\\\", input);\\n $.searchwords.addData(input, rule_name, num);\\n refreshPage();\\n return 'hiker://empty';\\n }, rule_name, num),\\n //'\\\"hiker://search?s=\\\" + input + \\\"&rule=\\\"+MY_RULE.title ',\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n //defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString((rule_name, setting) => {\\n //putMyVar(\\\"sou\\\", input)\\n let sug = config.sug || [];\\n for (let i in sug) {\\n deleteItem(sug[i]);\\n }\\n if (input == '') {\\n deleteItemByCls(\\\"#s\\\")\\n };\\n\\n if (input) {\\n if (input == '清除搜索记录') writeFile('hiker://files/cache/' + rule_name + '-搜索记录.json', '');\\n initConfig({\\n sug: [input]\\n });\\n http.fetch(`https://www.douban.com/j/search_suggest?debug=&q=${input}`, {}).success(data => {\\n var gg = JSON.parse(data).words;\\n //log(gg)\\n putMyVar('建议数据', gg)\\n\\n }).error(msg => log(msg.toString())).start(log(2))\\n var gg = JSON.parse(getMyVar('建议数据'));\\n let num = setting.show != undefined ? setting.show : 3;\\n deleteItemByCls(\\\"#s\\\");\\n for (let i in gg) {\\n var nn = gg[i];\\n\\n addItemAfter(\\\"12input\\\", {\\n title: nn,\\n url: $(\\\"#noLoading#\\\").lazyRule((nn, rule_name, num) => {\\n putMyVar(\\\"sou\\\", nn);\\n $.searchwords.addData(nn, rule_name, num);\\n refreshPage();\\n //return 'hiker://search?s=' + nn + '&rule=' + rule_name;\\n return 'hiker://empty';\\n }, nn, rule_name, num),\\n col_type: \\\"text_1\\\",\\n extra: {\\n id: input,\\n cls: \\\"#s\\\"\\n }\\n });\\n\\n }\\n }\\n }, rule_name, setting),\\n //titleVisible: false,\\n id: \\\"12input\\\"\\n }\\n });\\n } else {\\n arr.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString(() => {\\n putMyVar(\\\"sou\\\", input);\\n clearMyVar('page')\\n clearMyVar(\\\"durl\\\")\\n })\\n }\\n })\\n }\\n}\\n\\n\\n\\n$.exports = {\\n wrap: wrap,\\n wrap1: wrap1,\\n rehtml: removehtml,\\n merge: merge,\\n setpaged: setPageD,\\n urlParse: urlParse,\\n searchw: 搜索建议,\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"soup\",\"rule\":\"js:\\nvar d = [];\\nif (MY_PARAMS.key && getMyVar(\\\"use\\\", \\\"\\\") == \\\"\\\") {\\n putMyVar(\\\"sou\\\", MY_PARAMS.key);\\n putMyVar(\\\"use\\\", \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"use\\\");\\n }));\\n}\\n$.require('hiker://page/pro')\"},{\"col_type\":\"movie_3\",\"name\":\"x5\",\"path\":\"x5\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n floatVideo: true,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"3.搜片\",\"path\":\"soupian\",\"rule\":\"js:\\nif (s != \\\"\\\") {\\n var html = fetch(`http://${config.soupian}/search?key=${s}`)\\n \\n var list = pdfa(html, 'body&&.list-row-info')\\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool\\\");\\n for (let it of list) {\\n //log(it)\\n //let name = it.movie_name;\\n let name = pdfh(it, 'h4&&Text');\\n let web = pdfh(it, 'a&&title').replace(name,'').trim();\\n \\n let img = pdfh(it, 'img&&src');\\n if(!img.includes('http')){\\n img='https://'+config.soupian+img;\\n }\\n \\n let url = pdfh(it, 'a&&href');\\n var u = \\\"hiker://page/p?rule=\\\" + MY_RULE.title + \\\"&u=\\\" + base64Encode(url)\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n d.push({\\n title: wrap1(web+'-'+name, s),\\n url: u,\\n col_type: \\\"avatar\\\",\\n //desc: \\\"““””<font color=#f13b66a>搜片</font>\\\",\\n pic_url: img,\\n extra: {\\n id: url,\\n inheritTitle: false,\\n pageTitle:name,\\n web:web,\\n }\\n });\\n }\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n var html = request(`http://${config.soupian}/`, {})\\n\\n\\n function setLists(item) {\\n var title = item.split('-')[0]\\n var t = item.split('-')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n var list = pdfa(html, `body&&.list-header:matches(${t})+*&&a`)\\n\\n list.map(x => {\\n var name = pdfh(x, '.poster-item-title&&Text')\\n d.push({\\n title: name,\\n img: pdfh(x, 'img&&src'),\\n url: $('').lazyRule((n) => {\\n putMyVar(\\\"sou\\\", n)\\n refreshPage()\\n return 'hiker://empty'\\n }, name)\\n })\\n })\\n }\\n\\n ['热门电影-电影', '热门电视剧-电视剧', '热门综艺-综艺', '热门动漫-动漫'].map(x => {\\n setLists(x)\\n })\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"1.豌豆\",\"path\":\"wandou\",\"rule\":\"js:\\nlet durl = getMyVar(\\\"durl\\\", \\\"\\\");\\nif (durl != '') {\\n\\n durl = 'https://www.wandou.la' + durl.replace('.html', '')\\n let url = durl;\\n let id = url;\\n let html = fetch(url);\\n var rule = MY_RULE.title\\n var name = pdfh(html, '.movie-content&&p&&Text');\\n d.push({\\n title: name,\\n img: pdfh(html, '.movie-img&&img&&src'),\\n col_type: 'movie_1_vertical_pic',\\n desc: pdfh(html, '.bottom&&p&&Text'),\\n url: 'hiker://page/x5?u=' + base64Encode(url),\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n //setResult(d);\\n\\n let text = pdfh(html, \\\"body&&#__NEXT_DATA__&&Html\\\");\\n //log(text);\\n let erji = JSON.parse(text);\\n // log(erji);\\n let list = erji.props.pageProps.data.playData;\\n\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = it.data_url;\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: it.site_name,\\n url: u,\\n col_type: \\\"avatar\\\",\\n img: it.site_icon,\\n extra: {\\n inheritTitle: false,\\n id: u,\\n from: 'home',\\n pageTitle: name,\\n web: it.site_name,\\n }\\n }\\n });\\n if (MY_PAGE == 1) {\\n //addItemAfter(id, list);\\n d = d.concat(list);\\n }\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n setResult(d)\\n}\\n\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n\\n json = \\\"https://\\\"+config.wandou+\\\"/movie/getsearchlist/keywords/\\\" + s + \\\"/page/1/rows/16.json\\\";\\n data = JSON.parse(fetch(json)).data;\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n for (let it of data) {\\n let name = it.movie_name;\\n //log(name)\\n let img = it.movie_img_url;\\n let url = \\\"https://www.wandou.la\\\" + it.movie_url.replace(\\\".html\\\", \\\"\\\");\\n //log(url)\\n d.push({\\n title: wrap(name, s),\\n url: $(url).lazyRule((rule, id, s, name) => {\\n var cls = findItemsByCls(id);\\n if (!!cls) {\\n deleteItemByCls(id)\\n } else {\\n let url = input;\\n let id = url;\\n let html = fetch(url);\\n //log(html)\\n let text = pdfh(html, \\\"body&&#__NEXT_DATA__&&Html\\\");\\n //log(text);\\n let erji = JSON.parse(text);\\n //log(erji);\\n let list = erji.props.pageProps.data.playData;\\n\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = it.data_url;\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: it.site_name,\\n url: u,\\n col_type: \\\"avatar\\\",\\n img: it.site_icon,\\n extra: {\\n inheritTitle: false,\\n cls: id,\\n from: 'home',\\n pageTitle: name,\\n web: it.site_name,\\n }\\n }\\n });\\n addItemAfter(id, list);\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n }\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title, url, s, name),\\n col_type: \\\"movie_1_left_pic\\\",\\n desc: \\\"““””<font color=#f13b66a>豌豆</font>\\\",\\n pic_url: img,\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n });\\n }\\n setResult(d)\\n}\\n\\n\\nif (getItem('home', '关') == '开') {\\n var page = MY_PAGE;\\n let {\\n setpaged\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n //var pindex = setpaged(d,page,\\\"wandou_ptag\\\", [\\\"首页\\\", \\\"分类\\\"], \\\"#4682B4\\\");\\n var pindex=0\\n\\n //首页\\n if (pindex == \\\"0\\\") {\\n\\n var html = fetch('https://www.wandou.la/')\\n let json = JSON.parse(pdfh(html, \\\"body&&#__NEXT_DATA__&&Html\\\"));\\n\\n function setLists(item) {\\n var title = item.split('#')[0]\\n var key = item.split('#')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n var list = json.props.pageProps.fallback[key].data\\n\\n list.map(x => {\\n var name = x.hot_name\\n d.push({\\n title: name,\\n img: x.hot_img_url,\\n desc: x.hot_rate,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, x.hot_url)\\n })\\n })\\n }\\n\\n ['热门电影#index-getMovieList-movie', '热门剧集#index-getTvList-tv-28'].map(x => {\\n setLists(x)\\n })\\n }\\n if (pindex == \\\"1\\\") {\\n \\n var types = {\\n \\\"wandou_tag\\\": [\\\"类型:0\\\", \\\"喜剧:1\\\", \\\"爱情:2\\\", \\\"奇幻:4\\\", \\\"犯罪:5\\\", \\\"悬疑:6\\\", \\\"历史:7\\\", \\\"战争:8\\\", \\\"动作:9\\\", \\\"科幻:10\\\", \\\"动画:11\\\", \\\"冒险:12\\\", \\\"灾难:15\\\", \\\"惊悚:17\\\", \\\"恐怖:18\\\", \\\"歌舞:22\\\", \\\"武侠:24\\\", \\\"音乐:27\\\"],\\n \\\"wandou_country\\\": [\\\"地区:0\\\", \\\"中国:1\\\", \\\"韩国:3\\\", \\\"日本:4\\\", \\\"美国:6\\\", \\\"英国:9\\\", \\\"法国:10\\\", \\\"德国:11\\\", \\\"其他:12\\\"],\\n \\\"wandou_year\\\": [\\\"时间:0\\\", \\\"2022:1\\\", \\\"2022:2\\\", \\\"2020:3\\\", \\\"2019:4\\\", \\\"2010年代:5\\\", \\\"2000年代:6\\\", \\\"90年代:7\\\", \\\"80年代:8\\\", \\\"70年代:9\\\", \\\"60年代:10\\\", \\\"更早:11\\\"],\\n \\\"wandou_sort\\\": [\\\"综合排序:1\\\", \\\"近期热度:2\\\", \\\"高分优先:3\\\"]\\n }\\n\\n var ojson = [{\\n name: '电影',\\n id: 'movie',\\n content: types\\n }, {\\n name: '电视剧',\\n id: 'tv',\\n content: types\\n }, {\\n name: '动漫',\\n id: 'anime',\\n content: types\\n }, {\\n name: '综艺',\\n id: 'variety',\\n content: types\\n }, {\\n name: '纪录片',\\n id: 'documentary',\\n content: types\\n }]\\n\\n var 大类 = [];\\n ojson.map(x => {\\n 大类.push(x.name + \\\"@\\\" + x.id);\\n })\\n var index = storage0.getMyVar(\\\"index\\\", '0');\\n var j = ojson[index];\\n var keys = Object.keys(j.content);\\n\\n var temp = {};\\n keys.forEach(x => {\\n var type = x;\\n var l = j.content[x];\\n if (['version'].includes(x)) {\\n return\\n }\\n if (l.length > 0) {\\n var ns = l.map((k) => {\\n var name = k.split(':')[0];\\n var id = k.split(':')[1];\\n return {\\n 'name': name,\\n 'url': id,\\n 'type': x\\n }\\n })\\n temp[x] = ns;\\n }\\n })\\n\\n var t = Object.values(temp).map(x => x.map(z => JSON.stringify(z)).join('#'))\\n\\n var TrueJson = {\\n type: Array(大类.join('#')),\\n item: t != \\\"\\\" ? t : [],\\n }\\n //log(TrueJson)\\n\\n //需根据实际修改\\n const 页面标识 =\\\"wandoupage\\\";\\n const 单项清除 =[];\\n const 分类颜色 = getRangeColors();\\n const Json大类 = 'type';\\n const Json拼接 = 'item';\\n const Json拆分 = '#';\\n const Json单项 = '@';\\n const Json列表 = [\\\"wandou_tag\\\", \\\"wandou_country\\\", \\\"wandou_year\\\", \\\"wandou_sort\\\"]; //切换清除\\n const 排除 = '';\\n const 分类展开 = '∨';\\n const 分类折叠 = '∧';\\n\\n //动态分类\\n eval(JSON.parse(request('hiker://page/jdtfl')).rule);\\n var type = storage0.getMyVar(\\\"wandoupage\\\", \\\"movie\\\");\\n var tag = storage0.getMyVar(\\\"wandou_tag\\\", \\\"0\\\");\\n var country = storage0.getMyVar(\\\"wandou_country\\\", \\\"0\\\");\\n var year = storage0.getMyVar(\\\"wandou_year\\\", \\\"0\\\");\\n var sort = storage0.getMyVar(\\\"wandou_sort\\\", \\\"1\\\");\\n\\n //log(`${type}:${tag}+${country}+${year}+${sort}`)\\n var jurl = `https://${config.wandou}/movie/get${type}list/tag/${tag}/country/${country}/year/${year}/sort/${sort}/page/${page}/rows/30.json`;\\n \\n //log(jurl)\\n var plist = JSON.parse(fetch(jurl)).data\\n plist.map(x => {\\n var name = x.movie_name;\\n d.push({\\n title: name,\\n img: x.movie_img_url + \\\"@Referer=\\\",\\n desc: x.movie_rate,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, x.movie_url),\\n col_type: 'movie_3_marquee'\\n })\\n })\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"2.茶杯狐\",\"path\":\"cupfox\",\"rule\":\"js:\\neval(JSON.parse(request('hiker://page/xtools')).rule)\\n\\nif (s != \\\"\\\") {\\n let {\\n wrap1,\\n rehtml\\n } = $.require(\\\"hiker://page/tool\\\");\\n var json = search(s, storage0.getMyVar('page', MY_PAGE))\\n if (JSON.stringify(json) != \\\"{}\\\") {\\n var list = json.resources;\\n list.map(it => {\\n //log(it.website+'-'+rehtml(it.text))\\n var u = \\\"hiker://page/p?u=\\\" + base64Encode(it.url)\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n d.push({\\n title: wrap1(it.website + '-' + rehtml(it.text), s),\\n url: u,\\n col_type: \\\"avatar\\\",\\n img: it.icon,\\n desc: it.website,\\n extra: {\\n inheritTitle: false,\\n pageTitle: rehtml(it.text),\\n web: it.website,\\n }\\n });\\n })\\n }\\n\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n var page = MY_PAGE;\\n let {\\n setpaged\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n var pindex = setpaged(d, page, \\\"cupfox_ptag\\\", [\\\"首页\\\", \\\"选片\\\"], \\\"#4682B4\\\");\\n\\n if (pindex == \\\"0\\\") {\\n var html = fetchPC('https://cupfox.app/', {})\\n\\n function setLists(item) {\\n var title = item.split('-')[0]\\n var t = item.split('-')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n var list = pdfa(html, `body&&#${t}&&.movie-list-item`)\\n\\n list.map(x => {\\n var name = pdfh(x, '.movie-title&&Text')\\n d.push({\\n title: name,\\n img: pdfh(x, 'img&&src'),\\n desc: pdfh(x, '.movie-rating&&Text'), \\n url: $('').lazyRule((n) => {\\n putMyVar(\\\"sou\\\", n)\\n refreshPage()\\n return 'hiker://empty'\\n }, name)\\n })\\n })\\n }\\n\\n ['热播新剧-tv', '热门电影-movie', '热播动漫-anime', '热播综艺-show', '热播纪录片-documentary'].map(x => {\\n setLists(x)\\n })\\n }\\n\\n if (pindex == \\\"1\\\") {\\n\\n\\n var ojson = [{\\n name: '电影',\\n id: 'movie',\\n content: {\\n \\\"cupfox_genres\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"动作\\\", \\\"科幻\\\", \\\"奇幻\\\", \\\"动画\\\", \\\"悬疑\\\", \\\"犯罪\\\", \\\"恐怖\\\", \\\"战争\\\", \\\"音乐\\\", \\\"歌舞\\\", \\\"历史\\\", \\\"传记\\\", \\\"灾难\\\", \\\"纪录片\\\", \\\"短片\\\"],\\n \\\"cupfox_countries\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\", \\\"中国大陆\\\", \\\"美国\\\", \\\"中国香港\\\", \\\"中国台湾\\\", \\\"英国\\\", \\\"法国\\\", \\\"意大利\\\", \\\"西班牙\\\", \\\"印度\\\", \\\"泰国\\\", \\\"俄罗斯\\\"],\\n \\\"cupfox_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2010年代\\\", \\\"2000年代\\\", \\\"90年代\\\", \\\"80年代\\\", \\\"70年代\\\", \\\"60年代\\\", \\\"更早\\\"],\\n \\\"cupfox_sort\\\": [\\\"近期热度:T\\\", \\\"高分优先:S\\\"],\\n }\\n }, {\\n name: '电视剧',\\n id: 'tv',\\n content: {\\n \\\"cupfox_genres\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"科幻\\\", \\\"奇幻\\\", \\\"古装\\\", \\\"战争\\\", \\\"悬疑\\\", \\\"恐怖\\\", \\\"纪录片\\\"],\\n \\\"cupfox_countries\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\", \\\"美国\\\", \\\"英国\\\", \\\"泰国\\\"],\\n \\\"cupfox_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2010年代\\\", \\\"2000年代\\\", \\\"90年代\\\", \\\"80年代\\\", \\\"70年代\\\", \\\"60年代\\\", \\\"更早\\\"],\\n \\\"cupfox_sort\\\": [\\\"近期热度:T\\\", \\\"高分优先:S\\\"],\\n }\\n }, {\\n name: '动漫',\\n id: 'anime',\\n content: {\\n \\\"cupfox_genres\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"动作\\\", \\\"科幻\\\", \\\"奇幻\\\"],\\n \\\"cupfox_countries\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"日本\\\"],\\n \\\"cupfox_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2010年代\\\", \\\"2000年代\\\", \\\"90年代\\\", \\\"80年代\\\", \\\"70年代\\\", \\\"60年代\\\", \\\"更早\\\"],\\n \\\"cupfox_sort\\\": [\\\"近期热度:T\\\", \\\"高分优先:S\\\"],\\n }\\n }, {\\n name: '综艺',\\n id: 'variety',\\n content: {\\n \\\"cupfox_genres\\\": [\\\"全部类型:\\\", \\\"真人秀\\\", \\\"脱口秀\\\", \\\"音乐\\\", \\\"歌舞\\\"],\\n \\\"cupfox_countries\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\"],\\n \\\"cupfox_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2010年代\\\", \\\"2000年代\\\", \\\"90年代\\\", \\\"80年代\\\", \\\"70年代\\\", \\\"60年代\\\", \\\"更早\\\"],\\n \\\"cupfox_sort\\\": [\\\"近期热度:T\\\", \\\"高分优先:S\\\"],\\n }\\n }]\\n\\n\\n var 大类 = []\\n ojson.map(x => {\\n 大类.push(x.name + \\\"@\\\" + x.name)\\n })\\n\\n var index = storage0.getMyVar(\\\"index\\\", '0')\\n\\n var j = ojson[index]\\n var keys = Object.keys(j.content)\\n\\n var temp = {}\\n keys.forEach(x => {\\n var type = x\\n\\n var l = j.content[x]\\n\\n if (['area', 'lang', 'version', 'state'].includes(x)) {\\n return\\n }\\n\\n if (l.length > 0) {\\n var ns = l.map((k) => {\\n\\n var name = k.includes(\\\":\\\") ? k.split(':')[0] : k\\n var id = k.includes(\\\":\\\") ? k.split(':')[1] : k\\n return {\\n 'name': name,\\n 'url': id,\\n 'type': x\\n }\\n })\\n temp[x] = ns\\n }\\n })\\n\\n var t = Object.values(temp).map(x => x.map(z => JSON.stringify(z)).join('#'))\\n\\n\\n var TrueJson = {\\n type: Array(大类.join('#')),\\n item: t != \\\"\\\" ? t : [],\\n }\\n //log(TrueJson)\\n\\n //需根据实际修改\\n const 分类颜色 = getRangeColors();\\n const Json大类 = 'type';\\n const Json拼接 = 'item';\\n const Json拆分 = '#';\\n const Json单项 = '@';\\n const Json列表 = [\\\"cupfox_genres\\\", \\\"cupfox_countries\\\", \\\"cupfox_year\\\", \\\"cupfox_sort\\\", \\\"cfpage\\\"]; //切换清除\\n const 单项清除 = [\\\"cfpage\\\"];\\n const 排除 = '';\\n const 分类展开 = '∨';\\n const 分类折叠 = '∧';\\n const 页面标识 = 'aicupfox';\\n\\n\\n //动态分类\\n eval(JSON.parse(request('hiker://page/jdtfl')).rule)\\n\\n var type = storage0.getMyVar(页面标识, \\\"电影\\\")\\n var tag = storage0.getMyVar(\\\"cupfox_genres\\\", \\\"\\\")\\n var country = storage0.getMyVar(\\\"cupfox_countries\\\", \\\"\\\")\\n var year = storage0.getMyVar(\\\"cupfox_year\\\", \\\"\\\")\\n var sort = storage0.getMyVar(\\\"cupfox_sort\\\", \\\"T\\\")\\n\\n //log(type + tag + country + year + sort)\\n\\n var fjson = cupfoxfilter({\\n tags: type,\\n genres: tag,\\n countries: country,\\n year_range: year,\\n sort: sort,\\n }, storage0.getMyVar('cfpage', MY_PAGE))\\n\\n fjson.subjects.map(x => {\\n d.push({\\n title: x.title,\\n img: x.cover + \\\"@Referer=\\\",\\n desc: x.star,\\n col_type: 'movie_3_marquee',\\n url: $('').lazyRule((n) => {\\n putMyVar(\\\"sou\\\", n)\\n refreshPage()\\n return 'hiker://empty'\\n }, x.title),\\n })\\n })\\n\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"函数\",\"path\":\"xtools\",\"rule\":\"js:\\nfunction encodeUTF8(s) {\\nvar i, r = [], c, x;\\nfor (i = 0; i < s.length; i++)\\nif ((c = s.charCodeAt(i)) < 0x80) r.push(c);\\nelse if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x1F), 0x80 + (c & 0x3F));\\nelse {\\nif ((x = c ^ 0xD800) >> 10 == 0) //对四字节UTF-16转换为Unicode\\nc = (x << 10) + (s.charCodeAt(++i) ^ 0xDC00) + 0x10000,\\nr.push(0xF0 + (c >> 18 & 0x7), 0x80 + (c >> 12 & 0x3F));\\nelse r.push(0xE0 + (c >> 12 & 0xF));\\nr.push(0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));\\n};\\nreturn r;\\n}\\n\\nfunction sha1(s) {\\nvar data = new Uint8Array(encodeUTF8(s))\\nvar i, j, t;\\nvar l = ((data.length + 8) >>> 6 << 4) + 16, s = new Uint8Array(l << 2);\\ns.set(new Uint8Array(data.buffer)), s = new Uint32Array(s.buffer);\\nfor (t = new DataView(s.buffer), i = 0; i < l; i++)s[i] = t.getUint32(i << 2);\\ns[data.length >> 2] |= 0x80 << (24 - (data.length & 3) * 8);\\ns[l - 1] = data.length << 3;\\nvar w = [], f = [\\nfunction () { return m[1] & m[2] | ~m[1] & m[3]; },\\nfunction () { return m[1] ^ m[2] ^ m[3]; },\\nfunction () { return m[1] & m[2] | m[1] & m[3] | m[2] & m[3]; },\\nfunction () { return m[1] ^ m[2] ^ m[3]; }\\n], rol = function (n, c) { return n << c | n >>> (32 - c); },\\nk = [1518500249, 1859775393, -1894007588, -899497514],\\nm = [1732584193, -271733879, null, null, -1009589776];\\nm[2] = ~m[0], m[3] = ~m[1];\\nfor (i = 0; i < s.length; i += 16) {\\nvar o = m.slice(0);\\nfor (j = 0; j < 80; j++)\\nw[j] = j < 16 ? s[i + j] : rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1),\\nt = rol(m[0], 5) + f[j / 20 | 0]() + m[4] + w[j] + k[j / 20 | 0] | 0,\\nm[1] = rol(m[1], 30), m.pop(), m.unshift(t);\\nfor (j = 0; j < 5; j++)m[j] = m[j] + o[j] | 0;\\n};\\nt = new DataView(new Uint32Array(m).buffer);\\nfor (var i = 0; i < 5; i++)m[i] = t.getUint32(i << 2);\\n\\nvar hex = Array.prototype.map.call(new Uint8Array(new Uint32Array(m).buffer), function (e) {\\nreturn (e < 16 ? \\\"0\\\" : \\\"\\\") + e.toString(16);\\n}).join(\\\"\\\");\\nreturn hex;\\n}\\n\\n\\nfunction search1(s, page) {\\n eval(getCryptoJS())\\n if (page == 1) {\\n p = 0\\n } else if (page == 2) {\\n p = 19\\n } else {\\n p = parseInt(page) + 20\\n }\\n storage0.putMyVar('page', p)\\n ss = s + 'URBBRGROUN'\\n tk = CryptoJS.SHA1(ss).toString();\\n var j = fetch(`https://api.cupfox.app/api/v2/search/?text=${s}&type=0&from=${p}&size=20&douban_id=0&token=${tk}`)\\n try {\\n var json = JSON.parse(j)\\n } catch {\\n var json = {}\\n }\\n return json\\n}\\n\\nfunction search(s, page) {\\n eval(getCryptoJS())\\n if (page == 1) {\\n p = 0\\n } else if (page == 2) {\\n p = 19\\n } else {\\n p = parseInt(page) + 20\\n }\\n storage0.putMyVar('page', p)\\n ss = s + 'URBBRGROUN'\\n tk = CryptoJS.SHA1(ss).toString();\\n var j = fetch(`https://api.cupfox.app/api/v2/search/?text=${s}&type=0&from=${p}&size=20&douban_id=0&token=${tk}`)\\n try {\\n var json = JSON.parse(j)\\n } catch {\\n var json = {}\\n }\\n return json\\n}\\n\\nfunction cupfoxfilter(dict,page) {\\n var s=Object.values(dict).join(\\\"\\\");\\n let start=0;\\n let limit=24;\\n if (page == 1) {\\n start = 0;\\n } else {\\n start=parseInt(page)+limit;\\n }\\n storage0.putMyVar('cfpage', start)\\n //log(start+\\\" \\\"+limit)\\n ss = s + 'URBBRGROUN'\\n tk = sha1(ss)\\n var url=`https://api.cupfox.app/api/v2/filter/?tags=${dict.tags}&genres=${dict.genres}&countries=${dict.countries}&year_range=${dict.year_range}&sort=${dict.sort}&start=${start}&limit=${limit}&token=${tk}`;\\n //log(url)\\n var j = fetch(`${url}`)\\n try {\\n var json = JSON.parse(j)\\n } catch {\\n var json = {}\\n }\\n return json\\n}\\n\"},{\"col_type\":\"movie_3\",\"name\":\"函数2\",\"path\":\"ztools\",\"rule\":\"js:\\n//url解析\\nlet {\\n urlParse\\n} = $.require(\\\"hiker://page/tool\\\");\\n\\n\\nfunction stringInArray(str, arr) {\\n return arr.some(item => str.includes(item));\\n}\\n\\n\\n//排除没路径\\nfunction nofile(u) {\\n url = u.href\\n if (stringInArray(url, ['magnet', 'ed2k'])) {\\n BitTS.push(u);\\n return true\\n }\\n var u = urlParse(url)\\n if (u.File == '' || u.File == '/' || u.Ref != null) {\\n return true\\n }\\n}\\n//去重\\nfunction unique(arr) {\\n const res = new Map()\\n return arr.filter((a) => !res.has(a.url) && res.set(a.url, 1))\\n}\\n\\n//重定向可用链接\\nfunction getTurl(u) {\\n //log(u)\\n try {\\n var url = base64Decode(u);\\n } catch {\\n var url = u\\n }\\n if (!url.includes('http') || url == undefined) {\\n url = u\\n }\\n url = url.includes('?') ? url.split('?')[0] : url\\n log('url:' + url)\\n var file = urlParse(url).File\\n var turl = ''\\n let head = JSON.parse(request(url, {\\n onlyHeaders: true\\n }));\\n //log(head)\\n if (head.url != undefined || head.url != '') {\\n var jurlp = urlParse(head.url)\\n if (jurlp.File == '/' || jurlp.File == '') {\\n turl = jurlp.Hosts + file\\n } else {\\n turl = head.url\\n }\\n } else {\\n turl = url\\n }\\n //log('turl:'+turl)\\n turl = turl.replace(/\\\\?from.+$/gm, '');\\n\\n turl = videoRefDetail(turl)\\n //log(turl)\\n return turl\\n}\\n\\n\\nfunction videoRefDetail(url) {\\n if (stringInArray(url, [\\\"6080\\\"])) {\\n url = url.replace(\\\"vplay\\\", \\\"video\\\");\\n } else if (stringInArray(url, [\\\"zhuiju\\\"])) {\\n url = url.replace(\\\"vodplay\\\", \\\"voddetail\\\");\\n } else if (stringInArray(url, [\\\"rrets\\\"])) {\\n url = url.replace(\\\"play\\\", \\\"project\\\")\\n }\\n return url;\\n}\\n\\n\\n//多选模块\\nfunction MultiSelectMode(name, id) {\\n return $('#noLoading#').lazyRule((datatitle, dataurl) => {\\n function unique(arr) {\\n const res = new Map()\\n return arr.filter((a) => !res.has(a.url) && res.set(a.url, 1))\\n }\\n let duoselect = storage0.getMyVar(\\\"duoselect\\\") ? storage0.getMyVar(\\\"duoselect\\\") : [];\\n if (duoselect.findIndex(x => x.url === dataurl) == -1) {\\n duoselect.push({\\n title: datatitle,\\n url: dataurl\\n })\\n duoselect = unique(duoselect)\\n updateItem(dataurl, {\\n title: `““””<span style=\\\"color:#FF5733\\\">` + datatitle\\n //title:`‘‘`+datatitle+`’’`\\n });\\n } else {\\n function removeByValue(arr, val) {\\n for (var i = 0; i < arr.length; i++) {\\n if (arr[i]['url'] == val) {\\n arr.splice(i, 1);\\n break;\\n }\\n }\\n }\\n removeByValue(duoselect, dataurl)\\n updateItem(dataurl, {\\n title: datatitle\\n });\\n }\\n storage0.putMyVar(\\\"duoselect\\\", duoselect);\\n return \\\"hiker://empty\\\"\\n }, name, id)\\n}\\n\\n$.extend({\\n msm: MultiSelectMode,\\n})\"},{\"col_type\":\"movie_3\",\"name\":\"推送\",\"path\":\"push\",\"rule\":\"js:\\nlet items = [];\\nlet pushin = decodeURIComponent(getParam(\\\"pushurl\\\"));\\nlet tvip = getItem('hikertvboxset', '');\\n\\nitems.push({\\n title: '当前IP:' + tvip,\\n url: \\\"input://\\\" + getItem('hikertvboxset', 'http://' + getIP() + ':9978') + \\\"////请输入TVBox端的IP地址,如http://\\\" + getIP() + \\\":9978.js:setItem('hikertvboxset',input);refreshPage()\\\",\\n col_type: 'flex_button'\\n});\\nvar purl = pushin;\\n\\nif (pushin.includes('\\\\n') && !pushin.startsWith('{')) {\\n purl = pushin.replace(\\\"\\\\n\\\", '$');\\n}\\nif (pushin.startsWith('http') && pushin.includes(';{')) {\\n purl = JSON.stringify({\\n \\\"name\\\": \\\"海阔直链推送\\\",\\n \\\"url\\\": pushin\\n })\\n}\\nif (pushin.startsWith('https://www.aliyundrive.com/s/')) {\\n let reftoken = JSON.parse(fetch('hiker://files/rules/icy/icy-ali-token.json', {}))[0].refresh_token;\\n purl = JSON.stringify({\\n \\\"url\\\": pushin,\\n \\\"refresh_token\\\": reftoken\\n })\\n}\\nif (pushin.includes(':52020')) {\\n if (pushin.includes('redirectPlayUrl')) {\\n purl = JSON.stringify({\\n \\\"name\\\": \\\"海阔投屏直链\\\",\\n \\\"url\\\": pushin\\n })\\n } else {\\n purl = JSON.stringify({\\n \\\"name\\\": \\\"海阔网页投屏\\\",\\n \\\"url\\\": pushin\\n })\\n }\\n}\\n\\n//log('推送'+purl);\\nvar state = request(tvip + '/action', {\\n headers: {\\n 'Content-Type': 'application/x-www-form-urlencoded',\\n //'X-Requested-With': 'XMLHttpRequest',\\n 'Referer': tvip\\n },\\n timeout: 2000,\\n body: 'do=push&url=' + purl.replace(/\\\\&/g, '&&'),\\n method: 'POST'\\n});\\n//log(state);\\nif (state == 'ok') {\\n //log(state);\\n items.push({\\n title: \\\"✅\\\" + state,\\n url: $('').lazyRule(() => {\\n back(false);\\n return 'hiker://empty'\\n }),\\n col_type: \\\"text_center_1\\\"\\n });\\n} else {\\n //log(state);\\n items.push({\\n title: \\\"❎\\\" + state,\\n url: \\\"hiker://empty\\\",\\n col_type: \\\"text_center_1\\\"\\n });\\n\\n}\\nsetResult(items);\"},{\"col_type\":\"movie_3\",\"name\":\"设置\",\"path\":\"setting\",\"rule\":\"js:\\nvar d = []\\n\\naddListener(\\\"onClose\\\", $.toString(() => {\\n refreshPage()\\n}));\\n\\nif (MY_PAGE == 1) {\\n d.push({\\n title: '设置IP地址',\\n url: \\\"input://\\\" + getItem('hikertvboxset', 'http://' + getIP() + ':9978') + \\\"////请输入tvbox推送IP地址,如http://\\\" + getIP() + \\\":9978.js:setItem('hikertvboxset',input);refreshPage()\\\",\\n col_type: 'flex_button'\\n });\\n d.push({\\n title: getItem('hikertvboxset', ''),\\n url: 'hiker://empty',\\n col_type: 'flex_button'\\n });\\n\\n var sconfig = {\\n history: false, //历史\\n histshow: 10, //保留10个\\n suggest: false, //建议\\n }\\n\\n var sfig = storage0.getItem('sconfig', sconfig);\\n\\n var lazy = $('').lazyRule((o, k) => {\\n var obj = storage0.getItem('sconfig', o)\\n if (obj[k] == false) {\\n o[k] = true;\\n storage0.setItem('sconfig', o)\\n } else {\\n o[k] = false;\\n storage0.setItem('sconfig', o)\\n }\\n refreshPage(false)\\n return 'hiker://empty'\\n }, storage0.getItem('sconfig', sfig), 'action')\\n\\n function Tof(key) {\\n var b = storage0.getItem('sconfig', sfig)[key]\\n if (b == true || b == undefined) {\\n return 'https://hikerfans.com/tubiao/messy/55.svg'\\n } else {\\n return 'https://hikerfans.com/tubiao/messy/63.svg'\\n }\\n }\\n\\n $.extend({\\n GoS: {\\n get: function(key) {\\n return storage0.getItem('sconfig', sfig)[key];\\n },\\n save: function(cof, key, input) {\\n var o = storage0.getItem('sconfig', cof);\\n o[key] = input;\\n storage0.setItem('sconfig', o);\\n }\\n }\\n })\\n\\n d.push({\\n title: '启用历史记录',\\n url: lazy.replace('action', 'history'),\\n col_type: \\\"text_icon\\\",\\n desc: \\\"\\\",\\n pic_url: Tof('history'),\\n });\\n\\n if (sfig.history == true) {\\n d.push({\\n title: '历史保留',\\n col_type: 'input',\\n desc: '默认10',\\n url: $.toString((cof) => {\\n $.GoS.save(cof, 'histshow', Number(input));\\n refreshPage(false);\\n return 'toast://历史数据保留设置:' + input;\\n }, storage0.getItem('sconfig', sfig)),\\n extra: {\\n defaultValue: $.GoS.get('histshow') == 0 ? 10 : $.GoS.get('histshow'),\\n type: 'number'\\n }\\n })\\n }\\n\\n d.push({\\n title: '启用建议',\\n url: lazy.replace('action', 'suggest'),\\n col_type: \\\"text_icon\\\",\\n desc: \\\"\\\",\\n pic_url: Tof('suggest'),\\n });\\n\\n //log(sfig)\\n\\n}\\n\\nsetResult(d)\"},{\"col_type\":\"movie_3\",\"name\":\"x5ai\",\"path\":\"x5ai\",\"rule\":\"$.exports = function(rule, anchorId) {\\n return $.toString((rule, anchorId, moban) => {\\n if (window.check0 == null) {\\n function check0() {\\n try {\\n let html = document.querySelector(\\\"html\\\").innerHTML;\\n fba.putVar(\\\"html0\\\", html);\\n fba.parseLazyRuleAsync($$$().lazyRule((rule, url, anchorId, moban) => {\\n try {\\n\\n let html = getVar(\\\"html0\\\", \\\"\\\");\\n let iurl = '';\\n clearVar(\\\"html0\\\");\\n //log('url:' + url)\\n if (url.startsWith('https://cupfox.app/page?url=')) {\\n var baseurl = url.replace(/.+url=(.*?)&.+/gm, '$1')\\n iurl = base64Decode(baseurl)\\n putVar('iframe', iurl)\\n log('iurl:' + iurl)\\n } else if (url.startsWith('https://m.qmtv.pro/#/third-page?playurl=')) {\\n var baseurl=url.replace(/.*?playurl=(.*?)$/gm,'$1');\\n iurl=decodeURIComponent(baseurl);\\n putVar('iframe', iurl);\\n log('iurl:' + iurl);\\n }\\n return iurl.length > 0 ? \\\"1\\\" : \\\"0\\\";\\n } catch (e) {\\n log(e.toString());\\n }\\n }, rule, location.href, anchorId, moban), $$$.toString((rule, moban) => {\\n //fba.log(input)\\n //fba.log(rule)\\n if (\\\"0\\\" == input) {\\n window.checkc = window.checkc + 1;\\n /*if (window.checkc > 120) {\\n fba.log(\\\"执行超过30秒,无法解析\\\");\\n } else {*/\\n setTimeout(window.check0, 250);\\n //}\\n } else {\\n var url = fba.getVar('iframe');\\n fba.log('moban' + moban)\\n if (moban == '1') {\\n url = url + '#immersiveTheme#'\\n }\\n fba.log(url)\\n fba.open(JSON.stringify({\\n rule: rule,\\n title: '影片详情',\\n group: \\\"\\\",\\n preRule: \\\"\\\",\\n pages: \\\"\\\",\\n url: 'hiker://page/p?rule=' + rule + '&u=' + url,\\n findRule: \\\"\\\"\\n }));\\n window.checkurl = location.href;\\n\\n function checku0() {\\n if (window.checkurl != location.href) {\\n //hash发生了变化\\n setTimeout(function() {\\n window.checkc = 0;\\n check0();\\n }, 2000);\\n } else {\\n setTimeout(checku0, 250);\\n }\\n }\\n checku0();\\n }\\n }, rule, moban));\\n } catch (e) {\\n fba.log(e.toString());\\n setTimeout(window.check0, 250);\\n }\\n }\\n window.checkc = 0;\\n window.check0 = check0;\\n check0();\\n }\\n }, rule, anchorId, getItem('ai', '0'));\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"5.茶杯虎\",\"path\":\"aiobb\",\"rule\":\"js:\\nlet durl = getMyVar(\\\"durl\\\", \\\"\\\");\\nif (durl != '') {\\n MY_URL = durl\\n log(durl)\\n\\n let url = durl;\\n let id = url;\\n try {\\n var html = fetch(url);\\n } catch {\\n var html = ''\\n }\\n var rule = MY_RULE.title\\n if (html == undefined || html == '') {\\n toast('无数据')\\n clearMyVar(\\\"sou\\\");\\n clearMyVar(\\\"durl\\\");\\n refreshPage()\\n } else {\\n\\n d.push({\\n title: pdfh(html, 'h4&&Text'),\\n img: pd(html, 'img&&src'),\\n col_type: 'movie_1_vertical_pic',\\n desc: pdfh(html, 'body&&.pubTime&&Text'),\\n url: url,\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n\\n\\n var list = pdfa(html, '.movieZy&&a')\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n merge\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, 'ul&&Text');\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: merge(t, '详情', 1),\\n img: 'https://www.725998.com/static/search/images/onLine.png',\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n from: 'home',\\n }\\n }\\n });\\n d = d.concat(list)\\n } catch (e) {\\n log(e.toString());\\n }\\n } else {\\n d.push({\\n title: '无资源',\\n col_type: 'text_center_1',\\n })\\n }\\n setResult(d)\\n }\\n\\n}\\ns = getMyVar(\\\"sou\\\", \\\"\\\");\\n\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n\\n var url = post(`https://www.725998.com/keywords.html`, {\\n body: {\\n keywords: s,\\n type: 'movie'\\n },\\n onlyHeaders: true\\n })\\n var json = JSON.parse(url)\\n var turl = json.url.replace(/-\\\\d+.html$/, '-' + MY_PAGE + '.html')\\n MY_URL = turl\\n var html = fetch(turl)\\n\\n var list = pdfa(html, 'body&&.each')\\n //log(list)\\n\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n for (let it of list) {\\n let name = pdfh(it, 'a&&title');\\n let img = pd(it, 'img&&src');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.725998.com/static/search/images/preloadImg.png\\\";\\n }\\n let url = pd(it, 'a&&href');\\n let desc = pdfa(it, 'body&&.info&&a').map(x => pdfh(x, 'a&&Text')).join(' ');\\n let score = pdfh(it, '.noScore&&Text');\\n d.push({\\n title: wrap(name, s),\\n col_type: 'movie_1_vertical_pic',\\n img: img,\\n desc: '评分:' + score + '\\\\n' + desc,\\n url: $(url).lazyRule((rule, url, s) => {\\n var cls = findItemsByCls(url);\\n if (!!cls) {\\n deleteItemByCls(url)\\n } else {\\n let url = input;\\n let id = url;\\n let html = fetch(url);\\n var list = pdfa(html, '.movieZy&&a')\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n merge\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, 'ul&&Text');\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: merge(t, '详情', 1),\\n img: 'https://www.725998.com/static/search/images/onLine.png',\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n from: 'home',\\n }\\n }\\n });\\n addItemAfter(id, list);\\n } catch (e) {\\n log(e.toString());\\n }\\n } else {\\n addItemAfter(id, {\\n title: '无资源',\\n col_type: 'text_center_1',\\n extra: {\\n cls: url,\\n }\\n })\\n }\\n }\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title, url, s),\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n }\\n\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n function setLists(item) {\\n MY_URL = 'https://www.725998.com/';\\n var title = item.split('#')[0]\\n var key = item.split('#')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n var html = fetch(`https://www.725998.com/yingku-list/${key}-0-0-0-0-0-0.html`)\\n var list = pdfa(html, 'body&&.each')\\n\\n list.map(x => {\\n var name = pdfh(x, 'a&&title')\\n let img = pd(x, 'img&&src');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.725998.com/static/search/images/preloadImg.png\\\";\\n }\\n let url = pd(x, 'a&&href');\\n let score = pdfh(x, '.noScore&&Text');\\n d.push({\\n title: name,\\n img: img,\\n desc: score,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, url)\\n })\\n })\\n }\\n\\n ['电影#1', '电视剧#2', '动漫#3', '纪录片#4'].map(x => {\\n\\n setLists(x)\\n })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"6.电影狗\",\"path\":\"dydog\",\"rule\":\"js:\\nMY_URL='https://www.dianyinggou.com/soMore/all-all-all-all-';\\nlet durl = getMyVar(\\\"durl\\\", \\\"\\\");\\nif (durl != '') {\\n //log(durl)\\n\\n let url = durl;\\n let id = url;\\n let name = s;\\n try {\\n var html = fetch(url);\\n } catch {\\n var html = ''\\n }\\n var rule = MY_RULE.title\\n\\n d.push({\\n title: pdfh(html, 'h4&&Text'),\\n img: pdfh(html, 'img&&data-url'),\\n col_type: 'movie_1_vertical_pic',\\n desc: pdfh(html, 'body&&.pubTime&&Text'),\\n url: url,\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n\\n let html = fetch(`https://www.dianyinggou.com/SpiderMovie/zy/${name}`, {\\n headers: {\\n 'x-requested-with': 'XMLHttpRequest'\\n }\\n });\\n\\n var list = pdfa(html, '.movieZy&&a')\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n \\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, 'li,0&&Text');\\n let web=pdfh(it, 'li,1&&Text');\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: wrap1(web+'-'+t, s),\\n img: 'https://www.725998.com/static/search/images/onLine.png',\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n pageTitle:t,\\n web:web,\\n }\\n }\\n });\\n d = d.concat(list)\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n setResult(d)\\n}\\ns = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n var page = MY_PAGE;\\n var url = `https://www.dianyinggou.com/so/${s}/page_${page}.html`;\\n //log(url)\\n var html = fetch(url)\\n\\n var list = pdfa(html, 'body&&.each')\\n //log(list)\\n\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n for (let it of list) {\\n let name = pdfh(it, 'a&&title');\\n let img = pd(it, 'img&&data-url');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.dianyinggou.com/View/images/blank_bg.png\\\";\\n }\\n let url = pd(it, 'a&&href');\\n let desc = pdfa(it, 'body&&.info&&a').map(x => pdfh(x, 'a&&Text')).join(' ');\\n let score = pdfh(it, '.noScore&&Text');\\n d.push({\\n title: wrap(name, s),\\n col_type: 'movie_1_vertical_pic',\\n img: img,\\n desc: '评分:' + score + '\\\\n' + desc,\\n url: $(url).lazyRule((rule, url, s, name) => {\\n var cls = findItemsByCls(url);\\n if (!!cls) {\\n deleteItemByCls(url)\\n } else {\\n let url = input;\\n let id = url;\\n let html = fetch(`https://www.dianyinggou.com/SpiderMovie/zy/${name}`, {\\n headers: {\\n 'x-requested-with': 'XMLHttpRequest'\\n }\\n });\\n var list = pdfa(html, '.movieZy&&a')\\n if (list && list.length > 0) {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, 'li,0&&Text');\\n let web=pdfh(it, 'li,1&&Text');\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: wrap1(web+'-'+t, s),\\n img: 'https://www.725998.com/static/search/images/onLine.png',\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n pageTitle:t,\\n web:web,\\n }\\n }\\n });\\n addItemAfter(id, list);\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n }\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title, url, s, name),\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n }\\n\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n function setLists(item) {\\n MY_URL = 'https://www.dianyinggou.com/';\\n var title = item.split('#')[0]\\n var key = item.split('#')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n var date = new Date();\\n var year = date.getFullYear();\\n //var html = fetch(`https://www.dianyinggou.com/mRecommd/${key}`);\\n var html = fetch(`https://www.dianyinggou.com/soMore/${key}-all-all-${year}-`);\\n\\n var list = pdfa(html, 'body&&.each')\\n\\n list.map(x => {\\n var name = pdfh(x, 'a&&title')\\n let img = pd(x, 'img&&data-url');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.dianyinggou.com/View/images/blank_bg.png\\\";\\n }\\n let url = pd(x, 'a&&href');\\n let score = pdfh(x, '.noScore&&Text');\\n d.push({\\n title: name,\\n img: img,\\n desc: score,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, url)\\n })\\n })\\n }\\n\\n function home() {\\n ['电影#movie', '电视剧#tv', '纪录片#doc', '动漫#comic'].map(x => {\\n\\n setLists(x)\\n })\\n }\\n \\n var page=MY_PAGE;\\n let true_url = getMyVar(MY_RULE.url, MY_URL);\\n if(page>1){\\n //log(true_url)\\n true_url=true_url+`/page_${page}.html`\\n //log(true_url)\\n }\\n var html =fetch(true_url).replace('%','');\\n //log(html)\\n \\n const 页面标识 =\\\"dydog\\\";\\n const 分类颜色 = getRangeColors();\\n const 大类定位 = '.w_100';\\n const 拼接分类 = 'body&&.y_filterMenu:nth-child(n+2)>div>div';\\n const 小类定位 = 'body&&a:not(:matches(分类))';\\n const 分类标题 = 'a&&Text';\\n const 分类链接 = 'a&&href';\\n const 分类展开 = '∨';\\n const 分类折叠 = '∧';\\n\\n //动态分类\\n eval(JSON.parse(request('hiker://page/dtfl')).rule);\\n \\n var list = pdfa(html, 'body&&.each')\\n\\n list.map(x => {\\n var name = pdfh(x, 'a&&title')\\n let img = pd(x, 'img&&src||img&&data-url');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.dianyinggou.com/View/images/blank_bg.png\\\";\\n }\\n let url = pd(x, 'a&&href');\\n let score = pdfh(x, '.noScore&&Text');\\n d.push({\\n title: name,\\n img: img,\\n desc: score,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, url)\\n })\\n })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"动态分类\",\"path\":\"dtfl\",\"rule\":\"const empty = \\\"hiker://empty\\\"\\n\\nif (typeof(拼接分类) != 'undefined' && 拼接分类 != '') {\\n    var categories = pdfa(html, 大类定位).concat(pdfa(html, 拼接分类))\\n} else {\\n    var categories = pdfa(html, 大类定位)\\n}\\n\\nlet init_cate = []\\n\\nfor (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\")\\n}\\n\\nconst fold = getMyVar(MY_RULE.group, \\\"0\\\")\\nconst cate_temp_json = getMyVar(页面标识+MY_RULE.title, JSON.stringify(init_cate))\\nconst cate_temp = JSON.parse(cate_temp_json)\\n\\n\\n\\nif (parseInt(page) === 1) {\\n d.push({\\n col_type:'big_blank_block'\\n })\\n d.push({\\n col_type:'big_blank_block'\\n })\\n \\n    d.push({\\n        title: fold === '1' ? '““””<b>' + 分类折叠.fontcolor(\\\"#FF0000\\\") + '</b>' : '““””<b>' + 分类展开.fontcolor(\\\"#1aad19\\\") + '</b>',\\n        url: $().lazyRule((fold) => {\\n            putMyVar(MY_RULE.group, fold === '1' ? '0' : '1');\\n            refreshPage(false);\\n            return \\\"hiker://empty\\\"\\n        }, fold),\\n        col_type: 'scroll_button',\\n extra: {\\n longClick: [{\\n title: '清除',\\n js: $.toString((mark) => {\\n clearMyVar(mark + MY_RULE.url);\\n refreshPage();\\n return 'toast://清除成功';\\n }, 页面标识)\\n }]\\n }\\n    })\\n    categories.forEach((category, index) => {\\n        let sub_categories = pdfa(category, 小类定位);\\n        if (index === 0) {\\n            sub_categories.forEach((item, key) => {\\n                let title = pdfh(item, 分类标题)\\n                if (typeof(排除) != 'undefined' && 排除 != '') {\\n                    title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n                }\\n                d.push({\\n                    title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n                    url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n                        let new_cate = []\\n                        params.cate_temp.forEach((cate, index) => {\\n                            new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n                        })\\n                        putMyVar(params.mark+MY_RULE.title, JSON.stringify(new_cate))\\n                        putMyVar(params.mark+MY_RULE.url, input)\\n                        refreshPage(true)\\n                        return \\\"hiker://empty\\\"\\n                    }, {\\n                        cate_temp: cate_temp,\\n                        key: key,\\n                        page: page,\\n mark:页面标识,\\n                    }),\\n                    col_type: 'scroll_button',\\n                })\\n            })\\n            d.push({\\n                col_type: \\\"blank_block\\\"\\n            });\\n        } else if (fold === '1') {\\n            sub_categories.forEach((item, key) => {\\n                let title = pdfh(item, 分类标题)\\n                if (typeof(排除) != 'undefined' && 排除 != '') {\\n                    title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n                }\\n                d.push({\\n                    title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n                    url: $(pd(item, 分类链接) + '#noLoading#').lazyRule((params) => {\\n                        params.cate_temp[params.index] = params.key.toString()\\n\\n                        putMyVar(params.mark+MY_RULE.title, JSON.stringify(params.cate_temp))\\n                        putMyVar(params.mark+MY_RULE.url, input)\\n\\n                        refreshPage(true)\\n                        return \\\"hiker://empty\\\"\\n                    }, {\\n                        cate_temp: cate_temp,\\n                        index: index,\\n                        key: key,\\n                        page: page,\\n mark:页面标识,\\n                    }),\\n                    col_type: 'scroll_button',\\n                })\\n            })\\n            d.push({\\n                col_type: \\\"blank_block\\\"\\n            });\\n        }\\n    })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"7.土拨鼠\",\"path\":\"tbsdy\",\"rule\":\"js:\\nlet durl = getMyVar(\\\"durl\\\", \\\"\\\");\\nif (durl != '') {\\n MY_URL = durl;\\n //log(durl)\\n\\n let url = durl;\\n let id = url;\\n let name = s;\\n try {\\n var html = fetch(url, {\\n headers: {\\n \\\"User-Agent\\\": PC_UA\\n }\\n });\\n } catch {\\n var html = ''\\n }\\n\\n var rule = MY_RULE.title\\n let desc = pdfh(html, '.video_plot_info_content&&Text');\\n let score = pdfh(html, '.video_point&&Text');\\n\\n d.push({\\n title: pdfh(html, '.video_info_title_text&&Text'),\\n img: pdfh(html, '.video_cover_img_box&&img&&data-url'),\\n col_type: 'movie_1_vertical_pic',\\n desc: '评分:' + score + '\\\\n主演:' + desc,\\n url: url,\\n extra: {\\n id: url,\\n inheritTitle: false,\\n }\\n })\\n\\n\\n var list = pdfa(html, 'body&&.video_download_link_item')\\n if (list && list.length > 0) {\\n try {\\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n\\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, '.video_download_link_name_text&&Text');\\n let web = pdfh(it, '.resource_website_name&&Text');\\n let img = pd(it, '.video_labels&&img&&src');\\n\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: wrap1(web + '-' + t, s),\\n img: img,\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n pageTitle: t,\\n web: web,\\n }\\n }\\n });\\n d = d.concat(list)\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n setResult(d)\\n}\\ns = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n var page = MY_PAGE;\\n MY_URL = `https://www.tbsdy.com/search.html?keyword=${s}&paged=${page}&category=`;\\n //log(MY_URL)\\n let html = fetch(MY_URL, {\\n headers: {\\n \\\"User-Agent\\\": PC_UA\\n }\\n });\\n\\n var list = pdfa(html, 'body&&.search_result_item')\\n\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n for (let it of list) {\\n let name = pdfh(it, '.search_result_title&&Text');\\n let img = pd(it, 'img&&src');\\n if (img == \\\"\\\") {\\n img = \\\"\\\";\\n }\\n let url = pd(it, 'a&&href');\\n let desc = pdfa(it, 'body&&.search_result_item&&.search_result_sub_info_line&&.video_actor').map(x => pdfh(x, 'span&&Text')).join(' ');\\n let score = pdfh(it, '.search_video_img_point&&Text');\\n d.push({\\n title: wrap(name, s),\\n col_type: 'movie_1_vertical_pic',\\n img: img,\\n desc: '评分:' + score + '\\\\n主演:' + desc,\\n url: $(url).lazyRule((rule, url, s, name) => {\\n\\n var cls = findItemsByCls(url);\\n if (!!cls) {\\n deleteItemByCls(url)\\n } else {\\n let url = input;\\n let id = url;\\n let html = fetch(url, {\\n headers: {\\n \\\"User-Agent\\\": PC_UA\\n }\\n });\\n\\n var list = pdfa(html, 'body&&.video_download_link_item')\\n if (list && list.length > 0) {\\n try {\\n MY_URL = url;\\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n list = list.map(it => {\\n let u = pdfh(it, 'a&&href');\\n let t = pdfh(it, '.video_download_link_name_text&&Text');\\n let web = pdfh(it, '.resource_website_name&&Text');\\n let img = pd(it, '.video_labels&&img&&src');\\n\\n u = \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(u);\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n return {\\n title: wrap1(web + '-' + t, s),\\n img: img,\\n col_type: \\\"avatar\\\",\\n url: u,\\n extra: {\\n inheritTitle: false,\\n cls: url,\\n pageTitle: t,\\n web: web,\\n }\\n }\\n });\\n addItemAfter(id, list);\\n } catch (e) {\\n log(e.toString());\\n }\\n }\\n }\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title, url, s, name),\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n })\\n }\\n\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n var page = MY_PAGE;\\n let {\\n setpaged\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n var pindex = setpaged(d, page, \\\"tbsdy_ptag\\\", [\\\"首页\\\", \\\"分类\\\"], \\\"#4682B4\\\");\\n if (pindex == 0) {\\n\\n let html = fetch('https://www.tbsdy.com/', {\\n headers: {\\n \\\"User-Agent\\\": PC_UA\\n }\\n });\\n\\n function setLists(item) {\\n MY_URL = 'https://www.tbsdy.com/';\\n var title = item.name;\\n var key = item.select;\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: item.img,\\n })\\n\\n var list = pdfa(html, `body&&.container_main_hot_${key}&&.hot_resource_one`)\\n\\n list.map(x => {\\n var name = pdfh(x, '.resource_name&&Text')\\n let img = pd(x, '.resource_posters&&data-url');\\n if (img == \\\"\\\") {\\n img = \\\"\\\";\\n }\\n let url = pd(x, 'a&&href');\\n\\n let score = pdfh(x, '.update_tip||.resource_score||img&&Text');\\n\\n d.push({\\n title: name,\\n img: img,\\n desc: score,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, url)\\n })\\n })\\n }\\n\\n [{\\n name: '热门电视剧',\\n select: 'tvs',\\n img: 'https://www.tbsdy.com/img/mrsw/web/index/index_tv.svg',\\n }, {\\n name: '热门电影',\\n select: 'movies',\\n img: 'https://www.tbsdy.com/img/mrsw/web/index/index_mv.svg'\\n }, {\\n name: '热门动漫',\\n select: 'animes',\\n img: 'https://www.tbsdy.com/img/mrsw/web/index/index_show.svg'\\n }, {\\n name: '热门综艺',\\n select: 'varietys',\\n img: 'https://www.tbsdy.com/img/mrsw/web/index/index_records.svg'\\n }, {\\n name: '热门纪录片',\\n select: 'documentarys',\\n img: 'https://www.tbsdy.com/img/mrsw/web/index/index_records.svg',\\n }].map(x => {\\n\\n setLists(x)\\n })\\n }\\n\\n if (pindex == 1) {\\n MY_URL = \\\"https://www.tbsdy.com/classify.html\\\";\\n\\n const 页面标识 = 'aitbsdy'\\n const 分类颜色 = getRangeColors();\\n const 大类定位 = 'body&&.top_navs_category';\\n const 拼接分类 = 'body&&.classify_category_lines';\\n const 小类定位 = 'body&&.top_nav||.classify_category_one';\\n const 分类标题 = 'Text';\\n const 分类链接 = 'a&&href';\\n const 分类展开 = '∧';\\n const 分类折叠 = '∨';\\n \\n\\n let {\\n urlParse\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n let true_url = getMyVar(页面标识 + MY_RULE.url, MY_URL);\\n\\n var uParse = urlParse(true_url);\\n var urlpath = uParse.Path;\\n var urlpa = uParse.Params;\\n var uhost = uParse.Hosts\\n\\n true_url = uhost + urlpath + \\\"?\\\" + Object.ToParams(Object.assign({}, urlpa, {\\n paged: page\\n }));\\n //log(true_url)\\n\\n var html = fetchPC(true_url);\\n //log(html)\\n\\n //动态分类\\n eval(JSON.parse(request('hiker://page/dtfl')).rule);\\n\\n var list = pdfa(html, 'body&&.classify_main_resources&&a')\\n\\n list.map(x => {\\n var name = pdfh(x, '.resource_name&&Text')\\n let img = pd(x, 'img&&data-url');\\n if (img == \\\"\\\") {\\n img = \\\"https://www.dianyinggou.com/View/images/blank_bg.png\\\";\\n }\\n let url = pd(x, 'a&&href');\\n let score = pdfh(x, '.resource_score&&Text');\\n d.push({\\n title: name,\\n img: img,\\n desc: score,\\n url: $('').lazyRule((n, u) => {\\n putMyVar(\\\"sou\\\", n)\\n putMyVar('durl', u)\\n refreshPage()\\n return 'hiker://empty'\\n }, name, url)\\n })\\n })\\n }\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"动态分类Json\",\"path\":\"jdtfl\",\"rule\":\"js:\\nconst empty = \\\"hiker://empty\\\";\\n\\nif (typeof(Json拼接) != 'undefined' && Json拼接 != '') {\\n \\n var categoriesjson=TrueJson[Json大类];\\n \\n if(TrueJson[Json拼接].constructor == Object){\\n var itemjson=Object.keys(TrueJson[Json拼接]).map(x=>Object.values(TrueJson[Json拼接][x]).map(z=>JSON.stringify(z)).join(Json拆分))\\n }else if(TrueJson[Json拼接].constructor == Array){\\n var itemjson=TrueJson[Json拼接]\\n }\\n \\n categoriesjson=categoriesjson.concat(itemjson);\\n \\n} else {\\n    var categoriesjson=TrueJson[Json大类];\\n}\\n\\n//log(categoriesjson)\\n\\nlet init_cate = [];\\n\\nfor (let i = 0; i < 20; i++) {\\n init_cate.push(\\\"0\\\");\\n}\\n\\nconst fold = getVar(MY_RULE.group, \\\"0\\\");\\nconst cate_temp_json = getVar(MY_RULE.title+页面标识, JSON.stringify(init_cate));\\nconst cate_temp = JSON.parse(cate_temp_json);\\n\\nif (parseInt(page) === 1) {\\n    d.push({\\n        title: fold === '1' ? '““””<b>' + 分类展开.fontcolor(\\\"#FF0000\\\") + '</b>' : '““””<b>' + 分类折叠.fontcolor(\\\"#1aad19\\\") + '</b>',\\n        url: $().lazyRule((fold) => {\\n            putVar(MY_RULE.group, fold === '1' ? '0' : '1');\\n clearMyVar('page')\\n clearMyVar(\\\"cfpage\\\")\\n            refreshPage(false);\\n            return \\\"hiker://empty\\\"\\n        }, fold),\\n        col_type: 'scroll_button',\\n    });\\n    categoriesjson.forEach((category, index) => {\\n        let sub_categories = category.split(Json拆分);\\n        if (index === 0) {\\n            sub_categories.forEach((item, key) => {\\n                let title = item.split(Json单项)[0];\\n                if (typeof(排除) != 'undefined' && 排除 != '') {\\n                    title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\");\\n                }\\n if(title==''){\\n return\\n }\\n                d.push({\\n                    title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n                    url: item.split(Json单项)[1] + $('#noLoading#').lazyRule((params,list,pagetab) => {\\n \\n storage0.putMyVar('index',params.key)\\n\\n list.map(key=>{\\n clearMyVar(key);\\n })\\n                        let new_cate = []\\n                        params.cate_temp.forEach((cate, index) => {\\n                            new_cate.push(index === 0 ? params.key.toString() : \\\"0\\\")\\n \\n                        })\\n                        putVar(MY_RULE.title+pagetab, JSON.stringify(new_cate))\\n                        putVar(pagetab, input)\\n putMyVar(pagetab,input)\\n                        refreshPage(true)\\n                        return \\\"hiker://empty\\\"\\n                    }, {\\n                        cate_temp: cate_temp,\\n                        key: key,\\n                        page: page,\\n                    },Json列表,页面标识),\\n                    col_type: 'scroll_button',\\n                })\\n            })\\n            d.push({\\n                col_type: \\\"blank_block\\\"\\n            });\\n        } else if (fold === '1') {\\n            sub_categories.forEach((item, key) => {\\n var obj=JSON.parse(item)\\n \\n                let title = obj['name']\\n \\n                if (typeof(排除) != 'undefined' && 排除 != '') {\\n \\n                    title = title.replace(new RegExp(排除, \\\"g\\\"), \\\"\\\")\\n \\n                }\\n if(title==''){\\n return\\n }\\n                d.push({\\n                    title: key.toString() === cate_temp[index] ? \\\"““””\\\" + title.fontcolor(分类颜色) : title,\\n                    url: $(item+'#noLoading#').lazyRule((params,pagetab,list) => {\\n var obj=JSON.parse(input)\\n var url=obj['url']\\n var type=obj['type']\\n \\n list.map(key=>{\\n clearMyVar(key);\\n })\\n \\n                        params.cate_temp[params.index] = params.key.toString()\\n\\n                        putVar(MY_RULE.title+pagetab, JSON.stringify(params.cate_temp))\\n                        putVar(pagetab, url)\\n \\n if(type!=''?true:false){\\n var key=type\\n var value=url\\n storage0.putMyVar(key,value)\\n }\\n                        refreshPage(true)\\n                        return \\\"hiker://empty\\\"\\n                    }, {\\n                        cate_temp: cate_temp,\\n                        index: index,\\n                        key: key,\\n                        page: page,\\n                    },页面标识,单项清除),\\n                    col_type: 'scroll_button',\\n                })\\n            })\\n            d.push({\\n                col_type: \\\"blank_block\\\"\\n            });\\n        }\\n    })\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"4.青麦\",\"path\":\"qimaitv\",\"rule\":\"js:\\nif (s != \\\"\\\") {\\n var url = \\\"https://\\\" + config.qimai + \\\"/api/app/movie/index/searchMovieByName\\\";\\n\\n let html = fetch(url, {\\n headers: {\\n \\\"X-Requested-With\\\": \\\"XMLHttpRequest\\\"\\n },\\n body: {\\n \\\"condition\\\": s,\\n \\\"pageSize\\\": 25,\\n \\\"pageNum\\\": MY_PAGE\\n }\\n });\\n\\n var info = ''\\n try {\\n info = JSON.parse(html).data.records;\\n } catch {\\n\\n }\\n if (info != null) {\\n var data = info;\\n } else {\\n data = []\\n d.push({\\n title: '““””<small>无结果</samll>',\\n col_type: 'text_center_1'\\n })\\n setResult(d)\\n }\\n \\n let {\\n wrap1\\n } = $.require(\\\"hiker://page/tool\\\");\\n \\n for (let item of data){\\n var j = JSON.parse(fetch('https://' + config.qimai + '/api/app/movie/website/page', {\\n body: {\\n \\\"condition\\\": {\\n movieName: item.name,\\n movieType: item.type,\\n movieYear: item.year\\n },\\n \\\"pageSize\\\": 10,\\n \\\"pageNum\\\": MY_PAGE\\n },\\n method:'POST',\\n })).data.records\\n \\n d.push({\\n img:item.cover+'@Referer='+item.cover,\\n url:'hiker://empty',\\n col_type:'movie_1_left_pic'\\n })\\n \\n for (let it of j) {\\n let t = item.name;\\n let web = it.name;\\n let img = it.icon;\\n let url = it.playUrl;\\n\\n if (!t) {\\n continue;\\n }\\n var u = \\\"hiker://page/p?u=\\\" + base64Encode(url)\\n u = getItem('ai', '0') == '0' ? u : u + '#immersiveTheme#'\\n \\n \\n\\n\\n d.push({\\n title: wrap1(web + '-' + t, s),\\n url: u,\\n col_type: \\\"avatar\\\",\\n img: img,\\n //desc: '',\\n extra: {\\n id: it.uri,\\n inheritTitle: false,\\n pageTitle: t,\\n web: web,\\n }\\n });\\n }\\n }\\n setResult(d)\\n} else {\\n\\n}\\n\\nif (getItem('home', '关') == '开') {\\n var page = MY_PAGE;\\n let {\\n setpaged\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n var pindex = setpaged(d, page, \\\"qmtv_ptag\\\", [\\\"首页\\\", \\\"选片\\\"], \\\"#4682B4\\\");\\n\\n if (pindex == 0) {\\n\\n function setLists(item) {\\n var title = item.split('-')[0]\\n var t = item.split('-')[1]\\n d.push({\\n title: title,\\n col_type: 'avatar',\\n img: 'https://hikerfans.com/tubiao/more/10.png'\\n })\\n\\n\\n var json = JSON.parse(fetchPC(`https://${config.qimai}/api/app/movie/index/searchAllMovie`))\\n\\n\\n var list = json.data[t].records;\\n\\n list.map(x => {\\n var name = x.title;\\n d.push({\\n title: name,\\n img: x.cover,\\n desc: x.rate,\\n url: $('').lazyRule((n) => {\\n putMyVar(\\\"sou\\\", n)\\n refreshPage()\\n return 'hiker://empty'\\n }, name)\\n })\\n })\\n }\\n\\n ['热播电影-listHotMovie', '热播电视剧-listHotTv', '热播动漫-listHotComic', '热播综艺-listHotVariety'].map(x => {\\n setLists(x)\\n })\\n\\n }\\n\\n\\n if (pindex == 1) {\\n var ojson = [{\\n name: '电影',\\n id: 'movie',\\n content: {\\n \\\"qmtv_classify\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"动作\\\", \\\"科幻\\\", \\\"悬疑\\\", \\\"犯罪\\\", \\\"惊悚\\\", \\\"冒险\\\", \\\"音乐\\\", \\\"历史\\\", \\\"奇幻\\\", \\\"恐怖\\\", \\\"战争\\\", \\\"传记\\\", \\\"歌舞\\\", \\\"武侠\\\", \\\"灾难\\\", \\\"西部\\\", \\\"纪录片\\\", \\\"短片\\\"],\\n \\\"qmtv_region\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\", \\\"中国大陆\\\", \\\"美国\\\", \\\"中国香港\\\", \\\"中国台湾\\\", \\\"英国\\\", \\\"法国\\\", \\\"意大利\\\", \\\"西班牙\\\", \\\"印度\\\", \\\"泰国\\\", \\\"俄罗斯\\\"],\\n \\\"qmtv_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2019\\\", \\\"2018\\\", \\\"2017\\\", \\\"2016\\\", \\\"2015\\\", \\\"2014\\\", \\\"2013\\\", \\\"2012\\\", \\\"2010\\\"],\\n \\\"qmtv_sort\\\": [\\\"近期热度:time\\\", \\\"高分优先:rate\\\"],\\n }\\n }, {\\n name: '电视剧',\\n id: 'tv',\\n content: {\\n \\\"qmtv_classify\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"科幻\\\", \\\"奇幻\\\", \\\"古装\\\", \\\"战争\\\", \\\"悬疑\\\", \\\"恐怖\\\", \\\"纪录片\\\"],\\n \\\"qmtv_genres\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\", \\\"美国\\\", \\\"英国\\\", \\\"泰国\\\"],\\n \\\"qmtv_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2019\\\", \\\"2018\\\", \\\"2017\\\", \\\"2016\\\", \\\"2015\\\", \\\"2014\\\", \\\"2013\\\", \\\"2012\\\", \\\"2010\\\"],\\n \\\"qmtv_sort\\\": [\\\"近期热度:time\\\", \\\"高分优先:rate\\\"],\\n }\\n }, {\\n name: '动漫',\\n id: 'anime',\\n content: {\\n \\\"qmtv_classify\\\": [\\\"全部类型:\\\", \\\"喜剧\\\", \\\"爱情\\\", \\\"动作\\\", \\\"科幻\\\", \\\"奇幻\\\"],\\n \\\"qmtv_genres\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"日本\\\"],\\n \\\"qmtv_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2019\\\", \\\"2018\\\", \\\"2017\\\", \\\"2016\\\", \\\"2015\\\", \\\"2014\\\", \\\"2013\\\", \\\"2012\\\", \\\"2010\\\"],\\n \\\"qmtv_sort\\\": [\\\"近期热度:time\\\", \\\"高分优先:rate\\\"],\\n }\\n }, {\\n name: '综艺',\\n id: 'variety',\\n content: {\\n \\\"qmtv_classify\\\": [\\\"全部类型:\\\", \\\"真人秀\\\", \\\"脱口秀\\\", \\\"音乐\\\", \\\"歌舞\\\"],\\n \\\"qmtv_genres\\\": [\\\"全部地区:\\\", \\\"华语\\\", \\\"欧美\\\", \\\"韩国\\\", \\\"日本\\\"],\\n \\\"qmtv_year\\\": [\\\"全部年代:\\\", \\\"2023\\\", \\\"2022\\\", \\\"2021\\\", \\\"2020\\\", \\\"2019\\\", \\\"2018\\\", \\\"2017\\\", \\\"2016\\\", \\\"2015\\\", \\\"2014\\\", \\\"2013\\\", \\\"2012\\\", \\\"2010\\\"],\\n \\\"qmtv_sort\\\": [\\\"近期热度:time\\\", \\\"高分优先:rate\\\"],\\n }\\n }]\\n\\n\\n var 大类 = []\\n ojson.map(x => {\\n 大类.push(x.name + \\\"@\\\" + x.name)\\n })\\n\\n var index = storage0.getMyVar(\\\"index\\\", '0')\\n\\n var j = ojson[index]\\n var keys = Object.keys(j.content)\\n\\n var temp = {}\\n keys.forEach(x => {\\n var type = x\\n\\n var l = j.content[x]\\n\\n if (['area', 'lang', 'version', 'state'].includes(x)) {\\n return\\n }\\n\\n if (l.length > 0) {\\n var ns = l.map((k) => {\\n\\n var name = k.includes(\\\":\\\") ? k.split(':')[0] : k\\n var id = k.includes(\\\":\\\") ? k.split(':')[1] : k\\n return {\\n 'name': name,\\n 'url': id,\\n 'type': x\\n }\\n })\\n temp[x] = ns\\n }\\n })\\n\\n var t = Object.values(temp).map(x => x.map(z => JSON.stringify(z)).join('#'))\\n\\n\\n var TrueJson = {\\n type: Array(大类.join('#')),\\n item: t != \\\"\\\" ? t : [],\\n }\\n //log(TrueJson)\\n\\n //需根据实际修改\\n const 分类颜色 = getRangeColors();\\n const Json大类 = 'type';\\n const Json拼接 = 'item';\\n const Json拆分 = '#';\\n const Json单项 = '@';\\n const Json列表 = [\\\"qmtv_classify\\\", \\\"qmtv_genres\\\", \\\"qmtv_year\\\", \\\"qmtv_sort\\\"]; //切换清除\\n const 单项清除 = [];\\n const 排除 = '';\\n const 分类展开 = '∨';\\n const 分类折叠 = '∧';\\n const 页面标识 = 'aiqmtv';\\n\\n\\n //动态分类\\n eval(JSON.parse(request('hiker://page/jdtfl')).rule)\\n\\n var type = storage0.getMyVar(页面标识, \\\"电影\\\");\\n var tag = storage0.getMyVar(\\\"qmtv_classify\\\", \\\"\\\");\\n var country = storage0.getMyVar(\\\"qmtv_genres\\\", \\\"\\\");\\n var year = storage0.getMyVar(\\\"qmtv_year\\\", \\\"\\\");\\n var sort = storage0.getMyVar(\\\"qmtv_sort\\\", \\\"\\\");\\n\\n body = JSON.stringify({\\n \\\"condition\\\": {\\n \\\"type\\\": type,\\n \\\"classify\\\": tag,\\n \\\"region\\\": country,\\n \\\"sort\\\": sort,\\n \\\"years\\\": year,\\n },\\n \\\"pageNum\\\": page,\\n \\\"pageSize\\\": 28,\\n }\\n\\n )\\n\\n //log(body)\\n\\n var json = fetch(\\\"https://\\\" + config.qimai + \\\"/api/app/movie/index/screenMovie\\\", {\\n\\n headers: {\\n 'content-type': 'application/json',\\n 'Origin': 'http://' + config.qimai,\\n },\\n body: body,\\n method: 'POST'\\n })\\n\\n\\n var info = [];\\n try {\\n info = JSON.parse(json).data.records;\\n } catch {}\\n\\n if (info.length > 0) {\\n var data = info;\\n } else {\\n data = []\\n d.push({\\n title: '““””<small>无结果</samll>',\\n col_type: 'text_center_1'\\n })\\n setResult(d)\\n }\\n\\n data.map(x => {\\n var name = x.name;\\n d.push({\\n title: name,\\n img: x.cover,\\n desc: x.rate,\\n url: $('').lazyRule((n) => {\\n putMyVar(\\\"sou\\\", n)\\n refreshPage()\\n return 'hiker://empty'\\n }, name)\\n })\\n })\\n\\n }\\n}\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"AI影搜","author":"","version":54,"type":"tool","url":"hiker://empty##fypage","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require('hiker://page/pro')","searchFind":"js:\nvar d = [];\nlet key = MY_URL.split(\"##\")[1];\nd.push({\n title: \"点我开始聚合搜索\" + key,\n url: \"hiker://page/soup?p=fypage\",\n extra: {\n pageTitle: \"搜索\" + key,\n key: key\n }\n});\n\nsetResult(d);\n","search_url":"hiker://empty##**","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet html = request(url);\\nlet alist = pdfa(html, \\\"body&&a\\\");\\nlet arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n});\\n//log(arr);\\nlet debug = false;\\n\\nfunction clearText(it) {\\n return it.replace(/第|集|章/g, \\\"\\\");\\n}\\n\\nfunction isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD/)\\n}\\n\\nfunction notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n}\\n\\nfunction isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n}\\n\\nfunction getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n}\\n\\nfunction isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n}\\n\\nlet _web = $.toString(() => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n }\\n }\\n});\\n\\nlet web = getItem('web', '0') == \\\"1\\\";\\n\\nfor (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (web) {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href\\n };\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n}\\nif (d.length == 0) {\\n //匹配失败\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n setResult(d);\\n} else {\\n //为线路加分割线\\n let d2 = [];\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n }\\n\\n setResult(d2);\\n}\"},{\"col_type\":\"text_1\",\"name\":\"搜索测试\",\"path\":\"s\",\"rule\":\"js:\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlog(url);\\nlet key = getParam(\\\"key\\\");\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nsetResult(sp(url, key, \\\"搜索测试\\\"));\"},{\"col_type\":\"movie_3\",\"name\":\"聚合搜索\",\"path\":\"pro\",\"rule\":\"var d = [];\\nif (MY_PAGE == 1) {\\n d.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString(() => {\\n putMyVar(\\\"sou\\\", input);\\n })\\n }\\n });\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n clearMyVar(\\\"so\\\");\\n }));\\n}\\n\\nlet s = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, r != \\\"\\\" ? r : null);\\n\\n let pageid = MY_RULE.title + \\\"-page\\\" + p;\\n if (data.length > 0) {\\n d.push({\\n title: \\\"加载第\\\" + p + \\\"页中,进度:1/\\\" + data.length,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n });\\n }\\n setResult(d);\\n log(data.length);\\n if (data.length > 0) {\\n //多线程加载 \\n let realPage = \\\"\\\" == r ? 1 : p;\\n let tasks = data.map(it => {\\n return {\\n func: function(rule) {\\n return rule.find(s, realPage);\\n },\\n param: it,\\n id: \\\"rule@\\\" + it.name\\n }\\n });\\n\\n batchExecute(tasks, {\\n func: function(param, id, error, result) {\\n //log(\\\"listener: \\\" + (result || []).length)\\n param.i = param.i + 1;\\n if (result) {\\n try {\\n for (let it of result) {\\n param.j = param.j + 1;\\n addItemBefore(pageid, {\\n title: wrap(it.title, s),\\n desc: it.desc,\\n url: it.url,\\n pic_url: it.pic_url,\\n col_type: it.pic_url ? 'movie_1_vertical_pic' : \\\"text_1\\\",\\n extra: it.extra\\n })\\n }\\n } catch (e) {}\\n\\n }\\n if (param.i >= param.all) {\\n deleteItem(pageid)\\n } else {\\n updateItem({\\n title: \\\"加载第\\\" + MY_PAGE + \\\"页中,进度:\\\" + (param.i + 1) + \\\"/\\\" + param.all,\\n url: \\\"\\\",\\n col_type: \\\"text_center_1\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n id: pageid\\n }\\n })\\n }\\n },\\n param: {\\n all: data.length,\\n i: 0,\\n j: -1\\n }\\n })\\n }\\n} else {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1, null);\\n if (data.length > 0) {\\n $.require(\\\"hiker://page/manage\\\")(d, data.map(it => it.name));\\n for (let it of data) {\\n d.push({\\n title: it.name,\\n url: \\\"select://\\\" + JSON.stringify({\\n title: \\\"请选择操作\\\",\\n col: 1,\\n options: [\\\"访问首页\\\", \\\"搜索此站\\\"],\\n js: $.toString((url) => {\\n if (input == \\\"访问首页\\\") {\\n MY_URL = url;\\n return \\\"hiker://page/x5?u=\\\" + base64Encode(getHome(url))\\n } else {\\n return \\\"hiker://page/singles\\\"\\n }\\n }, it.url)\\n }),\\n col_type: \\\"flex_button\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n RULE: {\\n name: it.name,\\n url: it.url\\n },\\n longClick: [{\\n title: \\\"禁用\\\" + it.name,\\n js: $.toString((name) => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确认删除禁用\\\" + name + \\\"吗?\\\",\\n confirm: $.toString((name, rule) => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data?rule=\\\" + rule);\\n removeRule(name);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n }, name, MY_RULE.title)\\n })\\n return \\\"hiker://empty\\\";\\n }, it.name)\\n }, {\\n title: \\\"访问首页\\\",\\n js: \\\"'hiker://page/x5?u=\\\" + base64Encode(getHome(it.url)) + \\\"'\\\"\\n }, {\\n title: \\\"搜索此源\\\",\\n js: \\\"'hiker://page/singles'\\\"\\n }]\\n }\\n });\\n }\\n }\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"数据\",\"path\":\"data\",\"rule\":\"//并发规则数\\nlet size0 = 10;\\nlet rulesText0 = `稀饭@https://www.xifanys.com/yingpiansearch/-------------.html?wd=**\\n达龟@https://www.dadagui.me/vodsearch/-------------.html?wd=**&submit=\\n城市@https://www.citydy.com/search.html?wd=**\\nlibvio@https://www.libvio.me/search/-------------.html?wd=**&submit=\\n新视@https://www.6080dy1.com/vodsearch/-------------.html?wd=**\\n看看y@https://www.kkdy.live/vod-search.html?wd=**&submit=\\n饭团@https://www.fantuanhd.com/search.html?wd=**&submit=\\n免的@https://www.freeok.vip/vodsearch/-------------.html?wd=**\\n牛马@https://www.niumatv.cc/vodsearch.html?wd=**&submit=\\n免费@https://www.thefree.vip/vodsearch/-------------.html?wd=**\\n莫扎兔@https://www.mozhatu.com/index.php/vod/search.html?wd=**\\n霹雳@https://plyingshi.com/vodsearch/-------------.html?wd=**\\n厂长@https://www.czspp.com/xssearch?q=**\\nVOF@https://www.voflix.com/search/-------------.html?wd=**\\n电影@https://www.appmovie.cc/index.php/vod/search.html?wd=**&submit=\\n追剧@http://zjdr.vip/vod/search/wd/**.html\\n疯狗@https://m.fenggoudy3.com/index.php?s=vod-search-name&wd=**\\n在线@https://www.zxzj.org/vodsearch/-------------.html?wd=**&submit=\\n七七@http://aaasofa.com/search.php\\n北川@https://www.bcwzg.com/vodsearch/-------------/?wd=**\\nEF@https://www.pili5.cn/vodsearch/-------------.html?wd=**&submit=\\n影家@http://yszjvip.com/index.php/vod/search.html?wd=**\\n五五@https://555dy.cc/vodsearch/-------------.html?wd=**\\n渣漫@https://www.dm2022.com/vodsearch.html?wd=**\\n在家@https://zxzj.vip/vodsearch/-------------.html?wd=**&submit=\\npia库@https://m.piaku.cc/s/-------------/?wd=**\\n极品@https://www.jpys.me/vodsearch/-------------.html?wd=**\\n艾迪@https://aidi.tv/vsearch/-------------.html?wd=**&submit=\\n九州@http://www.jiuzhou911.com/search.php?searchword=**\\n十千@http://www.qianshihouse.com/srh/-------------.html?wd=**\\n麦片@http://m.ly368.com/index.php?s=vod-m_s-name&wd=**\\n私人@https://soumk.com/vodsearch/-------------.html?wd=**\\n星辰@http://www.qhddj.com.cn/xcyysearch/**-------------.html\\nCokevY@https://cokemv.me/vodsearch/-------------.html?wd=**\\n爱看y@https://ikan6.vip/vodsearch/-------------/?wd=**&submit=\\n干饭py@https://www.gfysys1.com/vodsearch/-------------.html?wd=**\\n天空y@http://tkznp.com/vodsearch.html?wd=**\\n蓝光@https://www.lgyy.cc/vodsearch/-------------.html?wd=**\\n低端@https://ddys.tv/?s=**&post_type=post\\n努努@https://www.nunuyy3.org/so/**-**--.html`;\\nlet rulesText = getItem(\\\"rules\\\", rulesText0);\\nlet sp = $.require(\\\"hiker://page/sp\\\");\\nrules = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n find: function(key, page) {\\n return sp(s[1], key, s[0]);\\n },\\n url: s[1]\\n };\\n });\\n\\nfunction load(page, rule) {\\n let size = page <= 0 ? rules.length : size0;\\n page = page <= 0 ? 1 : page;\\n if (!page && !rule) {\\n return rules.map(it => it.name);\\n }\\n if (rule != null) {\\n if (page != null && page > 1) {\\n return rules.filter(i => i.name == rule && i.page);\\n }\\n return rules.filter(i => i.name == rule);\\n }\\n let start = (page - 1) * size;\\n if (rules.length < start + 1) {\\n return [];\\n }\\n let len = size;\\n if (rules.length < page * size) {\\n len = rules.length - start\\n }\\n return rules.slice(start, start + len);\\n}\\n\\nfunction addRule(name, surl) {\\n setItem(\\\"rules\\\", rulesText + \\\"\\\\n\\\" + name + \\\"@\\\" + surl);\\n}\\n\\nfunction addAll(input) {\\n if (input == null || input == \\\"\\\") {\\n return 0;\\n }\\n let arr = input.split(\\\"\\\\n\\\")\\n .filter(it => it.includes(\\\"@\\\"))\\n .map(rule => {\\n let s = rule.split(\\\"@\\\");\\n return {\\n name: s[0],\\n url: s[1]\\n };\\n });\\n let exist = rules.map(it => it.url);\\n let c = 0;\\n for (let it of arr) {\\n if (!exist.includes(it.url)) {\\n rulesText = rulesText + \\\"\\\\n\\\" + it.name + \\\"@\\\" + it.url;\\n c++;\\n }\\n }\\n setItem(\\\"rules\\\", rulesText);\\n return c;\\n}\\n\\nfunction removeRule(name) {\\n let newT = rulesText.split(\\\"\\\\n\\\")\\n .filter(it => it.indexOf(name + \\\"@\\\") < 0)\\n .join(\\\"\\\\n\\\");\\n setItem(\\\"rules\\\", newT);\\n}\\n\\n$.exports = {\\n load: load,\\n addRule: addRule,\\n removeRule: removeRule,\\n addAll: addAll\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索解析\",\"path\":\"sp\",\"rule\":\"function search(url, key, rule) {\\n let d = [];\\n let html = \\\"\\\";\\n if (url.includes(\\\"**\\\")) {\\n //get请求\\n let old = url;\\n url = url.replace(\\\"**\\\", key);\\n html = request(url);\\n //自动过验证码和频繁访问限制\\n let {\\n check, test\\n } = $.require(\\\"hiker://page/yzm\\\");\\n if (check(url, html, d)) {\\n log(\\\"重试了\\\");\\n html = request(url, {\\n headers: {\\n \\\"Referer\\\": url\\n }\\n }); \\n } \\n test(url, html, d, old, key, rule);\\n } else {\\n //自动识别post请求\\n html = request(url);\\n let form = pdfh(html, \\\"body&&form&&Html\\\");\\n let action = pd(html, \\\"form&&action\\\", url);\\n let inputs = pdfa(html, \\\"body&&form&&input\\\");\\n let body = {};\\n for (let it of inputs) {\\n let name = pdfh(it, \\\"input&&name\\\");\\n if (name && name != \\\"\\\") {\\n let value = pdfh(it, \\\"input&&value\\\");\\n body[name] = value || key;\\n }\\n }\\n html = post(action, {\\n body: body\\n });\\n }\\n\\n let alist = pdfa(html, \\\"body&&a\\\");\\n let arr = alist.map(it => {\\n let t = pdfh(it, \\\"a&&Text\\\");\\n let t2 = pdfh(it, \\\"a&&title\\\");\\n return {\\n //html: it,\\n text: t2 && t2.includes(key) ? t2 : t,\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n });\\n\\n function isResult(it) {\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.match(/搜索|结果/)) {\\n return false\\n }\\n return it.includes(key);\\n }\\n\\n for (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n if (isResult(it)) {\\n d.push({\\n title: t,\\n url: \\\"hiker://page/p?u=\\\" + base64Encode(it.href),\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\",\\n extra: {\\n inheritTitle: false\\n }\\n });\\n }\\n }\\n return d;\\n}\\n$.exports = search;\"},{\"col_type\":\"movie_3\",\"name\":\"增删\",\"path\":\"manage\",\"rule\":\"$.exports = function(d, names) {\\n d.push({\\n title: \\\"AI技术\\\",\\n url: \\\"confirm://基于AI识片自动分析源码技术,代码完全开源,数据来源于原网站,软件和规则不提供任何内容.js:''\\\",\\n col_type: \\\"flex_button\\\"\\n }, {\\n title: getItem('web', '0') == \\\"0\\\" ? \\\"视频嗅探\\\" : \\\"Web通免\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n if (getItem('web', '0') == \\\"0\\\") {\\n setItem('web', '1')\\n } else {\\n setItem('web', '0')\\n }\\n refreshPage();\\n return 'hiker://empty'\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\" + \\\",\\n url: $(\\\"#noLoading#\\\").lazyRule((rr) => {\\n deleteItemByCls(\\\"aiadd\\\");\\n addItemAfter(rr + \\\"aisdel\\\", [{\\n title: \\\"\\\",\\n desc: \\\"请输入网站名称\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('name', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"\\\",\\n desc: \\\"请输入网站搜索地址\\\",\\n col_type: \\\"input\\\",\\n extra: {\\n titleVisible: false,\\n onChange: \\\"putMyVar('surl', input)\\\",\\n cls: \\\"aiadd\\\"\\n }\\n },\\n {\\n title: \\\"提交保存\\\",\\n col_type: \\\"text_center_1\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n let surl = getMyVar(\\\"surl\\\", \\\"\\\");\\n let name = getMyVar(\\\"name\\\", \\\"\\\");\\n if (surl == \\\"\\\" || name == \\\"\\\") {\\n return \\\"toast://请输入完整内容\\\"\\n }\\n let r = decodeURIComponent(surl);\\n r = r.replace(new RegExp(\\\"[\\\\u4e00-\\\\u9fa5]+\\\", \\\"g\\\"), \\\"**\\\");\\n let {\\n addRule\\n } = $.require(\\\"hiker://page/data\\\");\\n addRule(name, r);\\n refreshPage();\\n return \\\"toast://已保存\\\";\\n }),\\n extra: {\\n cls: \\\"aiadd\\\"\\n }\\n }\\n ]);\\n return \\\"hiker://empty\\\"\\n }, MY_RULE.title),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\" - \\\",\\n url: \\\"select://\\\" + JSON.stringify({\\n options: names,\\n title: \\\"请选择要删除的站点\\\",\\n js: $.toString(() => {\\n let {\\n removeRule\\n } = $.require(\\\"hiker://page/data\\\");\\n removeRule(input);\\n refreshPage();\\n return \\\"toast://OK\\\";\\n })\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\"↗️\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n confirm({\\n title: \\\"温馨提示\\\",\\n content: \\\"确定导出所有数据吗?(导出后可以点击旁边的导入按钮批量导入)\\\",\\n confirm: $.toString(() => {\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let data = load(-1);\\n let s = data.map(it => it.name + \\\"@\\\" + it.url).join(\\\"\\\\n\\\");\\n return \\\"copy://\\\" + s\\n })\\n });\\n return \\\"hiker://empty\\\"\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n title: \\\"↘️\\\",\\n url: $(\\\"\\\", \\\"请输入要批量导入的数据\\\").input(() => {\\n let {\\n addAll\\n } = $.require(\\\"hiker://page/data\\\");\\n let count = addAll(input);\\n if (count > 0) refreshPage();\\n return \\\"toast://\\\" + (count > 0 ? \\\"成功导入\\\" + count + \\\"条数据\\\" : \\\"一条也没导入\\\")\\n }),\\n col_type: \\\"flex_button\\\",\\n });\\n d.push({\\n col_type: \\\"blank_block\\\",\\n extra: {\\n id: MY_RULE.title + \\\"aisdel\\\"\\n }\\n });\\n\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"验证码\",\"path\":\"yzm\",\"rule\":\"function check(url, html, d) {\\n let reload = false;\\n if (/验证码|系统安全验证/.test(html)) {\\n let headers = {\\n \\\"User-Agent\\\": MOBILE_UA,\\n \\\"Referer\\\": url\\n };\\n MY_HOME = getHome(url);\\n let ssyz = 'TloGnnikThrfs/5fDNlk5CSsbaGtAH7W/uMZjuYoIupB6bCoo9CotLQHfPIdGgbkbynKqL2aUE2Xy558X2QxHYtTU09vD+4oaCDIuSZO7nxDbLfRGfWj7zql+yMbvF+aJoD/m6Psfw/PyYOAp/ZVGdrPzaCByfd0HL5DFVSw+YF2OC40V8SP9RxdFKKdrBuPxCWdxUCFrJ+1lRy/TU3LC84C4xxEBhgud7RtBp0zZArqBE06+Z3JtDP0eFCz/D5X0409qPHK3e1y/LuUgccuxpHnjYLE1GjlP8wYA2hQWe7yPngggQBHw33/gvb3tuCcxEKTWgmah/R32AH9ZF8jF7WemT26lUizVXe/spCdhDgHR/zUhODD4PO6glI8JPhdu+VwfPyRLG2D7CUo1L6SIF+0fYf0oTOWN13UPITo5+uZd/WnQQLU8NYx/WFCThEnkbzln9YGt60fRxsH+8uMDFgaBiC+z2SpcxB9gZ6GXypLSXWaj+qEUbGJKEx+jK/v5fnrkIhCdwNbkp9dRks6dmlYlBifzoWF8RkuC3rqPtoScBkMOMZu7GiVtoHEdHUozmnUIdrU1LGIqq9WnG7X2a3yH8s65mjLuLnd3q0U8v+LMPnHL2/GjQuTQKVh+RKEPqK/JdrChGLNrjcHvLHDbHEshrGZuQOdEphbx/PkhkvaYy4K1MO84R17guRsKs/V6niUPaL+XbQ7c3fqJS4VHJwludJTDe02euffGCm0PJIPlAOgLHnX0izJhA6q738R2UwQcWBQjJt79aF+kyqSdyt1QPVQVjaC3IpRf7PgsDhEJ7bi9nSclyIzgJ9DCJ4T+8dG1xHhKyZasT7L/x9Lfr1Mgs8nBZER2W9ax7iTkNK+X5ACU//p/YoP/uAanDtb3D0iKUUuXFH+Jbb0x1P322S2w6BJ46nuNHBMHTpVuWwhZeZzriGh7qoOywLWiExBMKyxTGLnmKh7r03/yXKYWIJnpBN2MMycVHRZJ7RumHV4CIsVrq7iRP48823RJVt9OtyP7uuc3wBBV3kcZUzbbaYdWBx1+Au+Od2u7lR6joOL810mcJm/f7J5TvGQP6HGph1YHHX4C7453a7uVHqOgyjjh5EBd720MEBY23c+TKq/z9UpWDDOg48ZFnwSIhFqitWdiZiqsaYuN0/SXwiK8EG9eQ29u2XDJoDW4mlwtcRO7vaX5XcFsgf4/mLU07mi';\\n evalPrivateJS(ssyz);\\n\\n let vcode = getVCode2(MY_HOME + '/index.php/verify/index.html?', JSON.stringify(headers), 'num');\\n fetch(MY_HOME + html.match(/\\\\/index.php.*?verify=/)[0] + JSON.parse(vcode).ret, {\\n headers: headers,\\n method: 'POST'\\n });\\n reload = true;\\n }\\n return reload;\\n}\\n\\nfunction test(url, html, d, old, key, rule) {\\n if (/5秒|频繁/.test(html)) {\\n d.push({\\n title: '搜索需间隔5秒,点击重新加载',\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>\\\" + rule + \\\"</font>\\\",\\n url: $().lazyRule((url, old, key, rule) => {\\n let sp = $.require(\\\"hiker://page/sp\\\");\\n let d = sp(old, key, rule);\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n for (let it of d) {\\n it.title = wrap(it.title, key);\\n }\\n addItemAfter(url, d);\\n deleteItem(url);\\n return \\\"toast://OK\\\";\\n }, url, old, key, rule),\\n extra: {\\n id: url\\n }\\n });\\n }\\n}\\n\\n$.exports = {\\n check: check,\\n test: test\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"function wrap(text, s) {\\n return text.includes(\\\"““””\\\") ? text : \\\"““””\\\" + text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n$.exports = {\\n wrap: wrap\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"单搜\",\"path\":\"singles\",\"rule\":\"js:\\nvar d = [];\\nd.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n putMyVar(\\\"so\\\", input);\\n refreshPage();\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"so\\\", \\\"\\\")\\n }\\n});\\nlet s = getMyVar(\\\"so\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let p = MY_PAGE;\\n let {\\n load\\n } = $.require(\\\"hiker://page/data\\\");\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n let data = load(p, MY_PARAMS.RULE.name);\\n let arr = data[0].find(s, p);\\n for (let it of arr) {\\n it.title = wrap(it.title, s)\\n d.push(it);\\n }\\n}\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"soup\",\"rule\":\"js:\\nvar d = [];\\nif (MY_PARAMS.key && getMyVar(\\\"use\\\", \\\"\\\") == \\\"\\\") {\\n putMyVar(\\\"sou\\\", MY_PARAMS.key);\\n putMyVar(\\\"use\\\", \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"use\\\");\\n }));\\n}\\n$.require('hiker://page/pro')\"},{\"col_type\":\"movie_3\",\"name\":\"X5\",\"path\":\"x5\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n floatVideo: true,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nsetResult(d);\"}]","proxy":"","icon":""},{"last_chapter_rule":"","title":"AI狗狗","author":"","version":55,"type":"tool","url":"hiker://empty##","col_type":"movie_3","class_name":"","class_url":"","area_name":"","area_url":"","sort_name":"","year_name":"","sort_url":"","year_url":"","find_rule":"js:$.require('hiker://page/pro')","searchFind":"js:\nvar d = [];\nlet key = MY_URL.split(\"##\")[1];\nd.push({\n title: \"点我开始聚合搜索\" + key,\n url: \"hiker://page/soup\",\n extra: {\n pageTitle: \"搜索\" + key,\n key: key\n }\n});\n\nsetResult(d);","search_url":"hiker://empty##**","group":"③AI","detail_col_type":"movie_1","detail_find_rule":"","sdetail_col_type":"movie_1","sdetail_find_rule":"","ua":"mobile","preRule":"","pages":"[{\"col_type\":\"movie_3\",\"name\":\"二级解析\",\"path\":\"p\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nlet html = request(url);\\nlet alist = pdfa(html, \\\"body&&a\\\");\\nlet arr = alist.map(it => {\\n return {\\n //html: it,\\n text: pdfh(it, \\\"a&&Text\\\"),\\n title: pdfh(it, \\\"a&&title\\\"),\\n href: pd(it, \\\"a&&href\\\", url)\\n }\\n});\\n//log(arr);\\nlet debug = false;\\n\\nfunction clearText(it) {\\n return it.replace(/第|集|章/g, \\\"\\\");\\n}\\n\\nfunction isMovie(it) {\\n if (it == null || it.text == null) {\\n return false;\\n }\\n let tit = it.title || \\\"\\\";\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\" || it.length > 8) {\\n return false;\\n }\\n //排除\\n let reg = /\\\\.|高清直播|写真推荐|影院|影视|蓝光电影|高清电影|第一季|第二季|第三季|第四季|第五季/;\\n if (tit != \\\"\\\" && !tit.includes(it) || reg.test(it)) {\\n return false;\\n }\\n return it.match(/原画|备用|蓝光|超清|高清|正片|韩版|4K|4k|1080P|720P|TC|HD|BD/)\\n}\\n\\nfunction notChapter(it) {\\n if (it == null || it.text == null) {\\n return true;\\n }\\n return it.text.match(/[0-9]\\\\.[0-9]分/);\\n}\\n\\nfunction isChapter(it, pre, next) {\\n if (notChapter(it)) {\\n //优先排除\\n return false;\\n }\\n //判断是不是电影\\n if (isMovie(it)) {\\n return true;\\n }\\n return isChapter0(it, pre) || isChapter0(it, next);\\n}\\n\\nfunction getChapterNum(it) {\\n if (it == null || it.text == null) {\\n return -1;\\n }\\n it = it.text || \\\"\\\";\\n if (it == \\\"\\\") {\\n return -1;\\n }\\n it = clearText(it);\\n let reg = /^[0-9]*$/;\\n if (!reg.test(it)) {\\n return -1;\\n }\\n it = parseInt(it);\\n if (isNaN(it)) {\\n return -1;\\n }\\n if (it > 1900 && it < 2100) {\\n return -1;\\n }\\n return it;\\n}\\n\\nfunction isChapter0(it, brother) {\\n /*if (debug) {\\n log({\\n it: it,\\n brother: brother\\n });\\n }*/\\n it = getChapterNum(it);\\n //if (debug) log(it);\\n if (it < 0) {\\n return false;\\n }\\n brother = getChapterNum(brother);\\n //if (debug) log(brother);\\n if (brother < 0) {\\n return false;\\n }\\n return it - brother < 2 && it - brother > -2;\\n}\\n\\nlet _web = $.toString(() => {\\n let urls = _getUrls();\\n let reg = /\\\\.html|\\\\.css|\\\\.js/;\\n for (let k in urls) {\\n if (!reg.test(urls[k]) && urls[k].match(/\\\\.mp4|\\\\.m3u8/)) {\\n fy_bridge_app.log(urls[k]);\\n return fy_bridge_app.getHeaderUrl(urls[k].replace(/.*?url=/, \\\"\\\")) + \\\"#ignoreImg=true#\\\";\\n }\\n }\\n});\\n\\nlet web = getItem('web', '0') == \\\"1\\\";\\n\\nfor (let i = 0; i < arr.length; i++) {\\n let it = arr[i];\\n let t = it.text;\\n if (!it.href || it.href == \\\"\\\") {\\n continue;\\n }\\n let pre = i == 0 ? null : arr[i - 1];\\n let next = i == (arr.length - 1) ? null : arr[i + 1];\\n if (isChapter(it, pre, next)) {\\n if (web) {\\n var urlx = \\\"webRule://\\\" + it.href + \\\"@\\\" + _web;\\n var extrax = {\\n jsLoadingInject: true,\\n id: it.href,\\n blockRules: ['.m4a', '.mp3', '.flv', '.avi', '.3gp', '.mpeg', '.wmv', '.mov', '.rmvb', '.gif', '.jpeg', '.png', '.ico', '.svg']\\n };\\n } else {\\n var urlx = \\\"video://\\\" + it.href;\\n var extrax = {\\n id: it.href\\n };\\n }\\n d.push({\\n title: t,\\n url: urlx,\\n col_type: \\\"text_3\\\",\\n extra: extrax\\n });\\n }\\n}\\nif (d.length == 0) {\\n //匹配失败\\n d.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n });\\n toast(\\\"AI匹配失败,已使用X5加载\\\");\\n setResult(d);\\n} else {\\n //为线路加分割线\\n let d2 = [];\\n for (let i = 0; i < d.length; i++) {\\n d2.push(d[i]);\\n if (i < d.length - 1) {\\n let it = d[i];\\n let t1 = parseInt(clearText(it.title));\\n let next = d[i + 1];\\n let t2 = parseInt(clearText(next.title));\\n if (t2 - t1 > 1 || t1 - t2 > 1) {\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n d2.push({\\n col_type: \\\"line_blank\\\"\\n });\\n d2.push({\\n col_type: \\\"big_blank_block\\\"\\n });\\n }\\n }\\n }\\n\\n setResult(d2);\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"聚合搜索\",\"path\":\"pro\",\"rule\":\"var d = [];\\nif (MY_PAGE == 1) {\\n d.push({\\n title: \\\"搜索\\\",\\n url: $.toString(() => {\\n refreshPage();\\n return \\\"hiker://empty\\\";\\n }),\\n col_type: \\\"input\\\",\\n desc: \\\"请输入关键词,尽量少字不要多字\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n defaultValue: getMyVar(\\\"sou\\\", \\\"\\\"),\\n onChange: $.toString(() => {\\n putMyVar(\\\"sou\\\", input);\\n })\\n }\\n });\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"sou\\\");\\n }));\\n}\\n\\nlet s = getMyVar(\\\"sou\\\", \\\"\\\");\\nlet r = \\\"\\\";\\nif (s != \\\"\\\") {\\n let u = \\\"https://www.dianyinggou.com/so/\\\" + s;\\n let html = request(u);\\n let data = pdfa(html, \\\"body&&.movies&&.each\\\");\\n //log(text); \\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool\\\");\\n\\n for (let it of data) {\\n let t = pdfh(it, \\\"a&&title\\\");\\n let url = pd(it, \\\"a&&href\\\", u);\\n d.push({\\n title: wrap(t, s),\\n url: \\\"webRule://\\\" + url + \\\"@\\\" + $.toString((rule, id, s) => {\\n let list = document.querySelectorAll(\\\".movieZy a\\\");\\n if (list && list.length > 0) {\\n let arr = []\\n for (let it of list) {\\n arr.push(it.outerHTML);\\n }\\n fy_bridge_app.log(arr.length + \\\"。\\\");\\n fy_bridge_app.parseLazyRule($$$().lazyRule((arr, rule, id, s) => {\\n try {\\n MY_URL = \\\"\\\";\\n let {\\n wrap\\n } = $.require(\\\"hiker://page/tool?rule=\\\" + rule);\\n let list = arr.map(it => {\\n let u = pd(it, \\\"a&&href\\\");\\n u = $(u).lazyRule((rule) => {\\n let h = request(input, {\\n redirect: false,\\n withHeaders: true\\n });\\n log(h);\\n h = JSON.parse(h).headers.location[0];\\n return \\\"hiker://page/p?rule=\\\" + rule + \\\"&u=\\\" + base64Encode(h)\\n }, rule);\\n return {\\n title: wrap(pdfh(it, \\\"li&&Text\\\"), s),\\n url: u,\\n desc: pdfh(it, \\\"li,1&&Text\\\"),\\n col_type: \\\"text_1\\\",\\n extra: {\\n inheritTitle: false\\n }\\n }\\n });\\n addItemAfter(id, list);\\n } catch (e) {\\n log(e.toString());\\n }\\n }, arr, rule, id, s));\\n return \\\"hiker://empty\\\"\\n }\\n }, MY_RULE.title, url, s),\\n col_type: \\\"text_1\\\",\\n desc: \\\"““””<font color=#f13b66a>二哈</font>\\\",\\n pic_url: pd(it, \\\"img&&data-url\\\", u),\\n extra: {\\n id: url,\\n inheritTitle: false\\n }\\n });\\n }\\n} else {\\n d.push({\\n title: \\\"AI技术\\\",\\n url: \\\"confirm://基于AI识片自动分析源码技术,代码完全开源,数据来源于原网站,软件和规则不提供任何内容.js:''\\\",\\n col_type: \\\"flex_button\\\"\\n }, {\\n title: getItem('web', '0') == \\\"0\\\" ? \\\"视频嗅探\\\" : \\\"Web通免\\\",\\n url: $(\\\"#noLoading#\\\").lazyRule(() => {\\n if (getItem('web', '0') == \\\"0\\\") {\\n setItem('web', '1')\\n } else {\\n setItem('web', '0')\\n }\\n refreshPage();\\n return 'hiker://empty'\\n }),\\n col_type: \\\"flex_button\\\"\\n });\\n d.push({\\n title: \\\"二哈\\\",\\n url: \\\"hiker://page/x5?u=\\\" + base64Encode(\\\"https://www.dianyinggou.com/\\\"),\\n col_type: \\\"flex_button\\\",\\n desc: \\\"\\\",\\n pic_url: \\\"\\\"\\n });\\n}\\n\\nsetResult(d);\"},{\"col_type\":\"movie_3\",\"name\":\"工具\",\"path\":\"tool\",\"rule\":\"function wrap(text, s) {\\n return text.includes(\\\"““””\\\") ? text : \\\"““””\\\" + text.replace(new RegExp(\\\"<em>|</em>\\\", \\\"g\\\"), \\\"\\\").replace(new RegExp(s, \\\"g\\\"), \\\"<strong><span style=\\\\\\\"color: #1E90FF\\\\\\\">\\\" + s + \\\"</span></strong>\\\")\\n}\\n$.exports = {\\n wrap: wrap\\n}\"},{\"col_type\":\"movie_3\",\"name\":\"搜索页面\",\"path\":\"soup\",\"rule\":\"js:\\nvar d = [];\\nif (MY_PARAMS.key && getMyVar(\\\"use\\\", \\\"\\\") == \\\"\\\") {\\n putMyVar(\\\"sou\\\", MY_PARAMS.key);\\n putMyVar(\\\"use\\\", \\\"1\\\");\\n addListener(\\\"onClose\\\", $.toString(() => {\\n clearMyVar(\\\"use\\\");\\n }));\\n}\\n$.require('hiker://page/pro')\"},{\"col_type\":\"movie_3\",\"name\":\"X5\",\"path\":\"x5\",\"rule\":\"js:\\nvar d = [];\\nlet url = base64Decode(getParam(\\\"u\\\"));\\nd.push({\\n title: \\\"\\\",\\n url: url,\\n col_type: \\\"x5_webview_single\\\",\\n desc: \\\"float&&100%\\\",\\n pic_url: \\\"\\\",\\n extra: {\\n floatVideo: true,\\n canBack: true,\\n blockRules: [\\\".gif\\\", \\\"/ad/\\\", \\\"/ads/\\\", \\\"google\\\", \\\"/sh/to/\\\", \\\".GIF\\\"]\\n }\\n});\\nsetResult(d);\"}]","proxy":"","icon":""}]