💻作者 : SoEasy 📅时间 : 2024年9月5日 🪢个人公众号 : SoEasy同学
海阔视界写源(一)
1 简介
海阔视界写源,就是开发能用的小程序,初学者建议先学习官方文档: 海阔视界规则官方文档。 海阔视界$工具文档。 关于学习路径,建议:
- 1.先读文档,了解开发环境、开发工具、插件、调试等,
- 2.再学习开发规范,了解小程序代码结构,字段含义,常见写法等
- 3.试写,一点一点熟悉,配合文档,逐步调试,最后完成整个小程序实战
- 4.学习别人小程序的写法,了解一些高阶或者复杂的页面写法。特别是合集、聚合等写法,抽取可用代码。
2 环境准备
2.1 开发环境
先在手机上安装海阔视界,选择最新版本:123网盘下载。在设置--开发手册与模式--记录并显示日志,勾选。 然后在主页的右上角,打开小程序管理界面,新增小程序,填写小程序名称后,先导入。保存成功后还是进入小程序管理界面,长按小程序名称弹出界面--选择web编辑。
展开查看图片
将链接在同一局域网内的电脑上打开,链接类似这种:http://192.168.0.194:52020/ruleEdit#/?rule=test 直接在浏览器上在线编辑保存即可开发
2.2 开发工具
还可以选择谷歌浏览器插件,功能和web编辑器一样,有代码提示等。下载地址
3 小程序格式规范
小程序编辑完成后,最终分享的是一个json文件,里面包含小程序的配置信息、基础规则、解析规则、子页面等。 基本格式如下:
展开查看JSON格式
{
"associatedModelsMapForJoinTable": {},
"associatedModelsMapWithFK": {},
"associatedModelsMapWithoutFK": {},
"fieldsToSetToDefault": [],
"gmtModified": 1725505651743,
"id": 131,
"last_chapter_rule": "最新章节",
"listToClearAssociatedFK": [],
"listToClearSelfFK": [],
"pageList": [],
"saved": true,
"title": "test",
"author": "SoEasy",
"version": 0,
"type": "video",
"url": "频道链接",
"col_type": "movie_3",
"class_name": "分类名称",
"class_url": "分类替换",
"area_name": "地区名称",
"area_url": "地区替换",
"sort_name": "排序名称",
"year_name": "年代名称",
"sort_url": "排序替换",
"year_url": "年代替换",
"find_rule": "解析规则",
"searchFind": "搜索解析",
"search_url": "搜索链接",
"group": "频道分组",
"detail_col_type": "movie_1",
"detail_find_rule": "二级解析",
"sdetail_col_type": "movie_1",
"sdetail_find_rule": "搜二解析",
"ua": "mobile",
"preRule": "JS预处理",
"pages": "[{\"name\":\"子页面名称\",\"path\":\"子页面标识\",\"col_type\":\"text_1\",\"rule\":\"解析规则\"}]",
"proxy": "",
"icon": "图标地址"
}
注:以下表格为字段描述,黑体字段为重要或者必填!
分类 | 编辑器 | 字段 | 标记 |
---|---|---|---|
基础信息 | 规则名称 | title | 必填、唯一 |
规则作者 | author | ||
规则版本 | version | 数字累加 | |
频道分组 | group | 频道分组(名称前加①、②等序号可排序) | |
图标地址 | icon | 网站logo | |
基础规则 | 频道链接 | url | 主页入口链接,可不填 |
显示样式 | col_type | 主页显示样式 | |
分类名称 | class_name | ||
分类替换 | class_url | ||
地区名称 | area_name | ||
地区替换 | area_url | ||
年代名称 | year_name | ||
年代替换 | year_url | ||
排序名称 | sort_name | ||
排序替换 | sort_url | ||
搜索链接 | search_url | 用**作为关键词占位符,搜索链接 | |
二级样式 | detail_col_type | 就是二级页面(视频类就是详情页)的上方样式 | |
搜二样式 | sdetail_find_rule | 搜索的二级页面 | |
全局UA | ua | 一般是mobile |
字段说明:
- 频道分组:就是分组的意思,海阔有分组功能,各分组间通过序号排序
- 频道链接:主页链接,可以填搜索链接代替,或者在解析里写js。适用于简写代码
- 显示样式:主页默认的显示样式,主页布局一般上部是分类过滤,下部是主体,视频类一般设置movie_3,即表示视频类每行3个
- 分类名称&分类替换:分类名称,固定写法,以&拼接,例如:电影&电视剧&动漫; 分类替换词,以&拼接,例如:1&2&3。用来取代频道链接里的fyclass。其它过滤字段相同
- 二级样式:二级样式是首页列表点击元素后,根据url跳转的二级页面,一般就是视频点击后进入详情页面,二级样式只能给定上方的一行(movie_1_vertical_pic:图片+标题+备注),详情页+播放线路+播放链接需要自行编写。
分类 | 编辑器 | 字段 | 标记 |
---|---|---|---|
解析规则 | 解析规则 | find_rule | 列表;标题;图片;描述;链接 |
搜索解析 | searchFind | 列表;标题;链接;描述;详情;图片 | |
二级解析 | detail_find_rule | 列表;标题;图片;描述;链接 | |
搜二解析 | sdetail_find_rule | 列表;标题;图片;描述;链接 | |
最新章节 | last_chapter_rule | ||
JS预处理 | preRule | 解析规则和搜索解析规则前执行 | |
子页面 | 子页面组合 | pages(pageList) | 列表嵌套对象 |
子页面名称 | name | 子页面名称 | |
子页面标识 | path | 子页面标识路径 | |
显示样式 | col_type | 独立页面的样式 | |
解析规则 | rule | 子页面代码 |
以下字段是小程序的核心:
- JS预处理:在解析规则和搜索规则前执行,一般用来初始化一些变量,例如远程url地址,应用其它规则链接
- 解析规则:是首页加载内容的核心,相见官方文档首页频道解析规则 + 选择器语法说明。一般简写时配合频道链接写选择器语法。不用选择器语法时写js:
js:
var d = [];
d.push({
title: "标题",
pic: "图片url",
desc: "描述",
url: "链接"
})
})
setResult(d);
- 二级解析:首页频道加载后获得列表(例如视频类的分类下的列表),点击列表后根据url链接跳转到二级页面(常见视频详情页)。二级解析就是解析详情页的。写法与解析规则相同。
- 搜索解析&搜二解析:就是针对搜索的解析和二级解析,一般就url稍有差异,大部分与首页解析和二级相同。
- 最新章节:貌似没用到,也不知道干啥的
- 子页面:一些独立的模块,可以用子页面来编写,子页面有多个所以用List嵌套Object。子页面标识是路径,用于主页代码引用。子页面解析规则是核心
4.常用写法
1.发起请求
在解析规则或者预处理、子页面的规则里,用到js:写法需要写JS代码时,通常需要发送请求获取页面或者Json响应,参考JS发起请求
- fetch(url) // 发送请求获取结果
- request('hiker://page/detail') // 发送请求,获取子页面detail,返回对象字符串
- var json = JSON.parse(); // 如果结果返回json,解析成JSON对象,可以通过类似json.list[0].name取值
- pdfh('html代码', 'body&&a&&href') ; // 解析dom树获取结果
- pdfa('html代码', 'body&&li') // 解析dom树获取结果列表
2.获取参数
在解析规则中写JS代码时,可以获取全局参数或者请求参数:
- MY_URL 指的是当前解析规则所在的请求URL,解析规则里就是频道链接,二级解析里就是首页列表里点击的url路径
- getParam('key', 'defaultValue') 获取请求链接里的param参数,如http://1.com?type=mp4,那么getParam('type', 'mp3')
的值为
mp4
3.返回结果
解析规则里标准写法:
js:
var d = [];
d.push({
title: "标题",
pic: "图片url",
desc: "描述",
url: "链接"
})
})
setResult(d);
二级解析或者子页面里,写入一个长文本:
var d = [];
d.push({
title: "这是一段长文本~~~",
col_type: 'long_text'
})
})
setResult(d);
4.传参
在一个规则内,通过putVar("key", "value")和getVar("key", "defaultValue")进行存取值,用于全局传参 还可以通过本地存储传值:例如storage0对象来支持存储JSON对象, 如storage0.putMyVar('a', {a: 1}),storage0.getMyVar('a'),同理还有storage0.putVar、storage0.getVar 设置值storage0.setItem('a', {a: 1}),取值storage0.getItem('a') 移除值:clearItem('key')
5.动态解析
在列表页面或者二级页面拼写选择器时,动态解析url,参考文档: 动态解析
body&&.stui-content__playlist,fyIndex&&li;a&&Text;*;*;a&&href.js:input+'@lazyRule=.js:input'
点击结果时就会请求链接然后用规则去解析获取真正的链接,然后视界再对真正的链接进行处理,比如检测为视频或者音乐则直接播放,检测为图片直接大图显示,否则用网页查看;
这里href后面的.js标识需要js解析,input + @lazyRule 表示动态解析,在lazyRule里的input是传入参数,就是传入的href的值。
还有另外一种写法:let test2=url+$('').lazyRule(); 这里的lazyRule()方法里写箭头函数,input是入参,就是前面的url。具体示例参考: 动态解析$工具
5.使用案例
以某个采集站+JSON解析播放链接为例,写一个常用的视频类小程序规则。
代码如下:
展开查看JSON格式
{
"associatedModelsMapForJoinTable": {},
"associatedModelsMapWithFK": {},
"associatedModelsMapWithoutFK": {},
"fieldsToSetToDefault": [],
"gmtModified": 1725500595808,
"id": 127,
"last_chapter_rule": "",
"listToClearAssociatedFK": [],
"listToClearSelfFK": [],
"pageList": [
{
"col_type": "movie_3",
"name": "lazy",
"path": "lazy",
"rule": "// $('').lazyRule 拼接在url后执行动态解析,就是点击的时候再执行\nvar lazy = $('').lazyRule((MY_HOME) => {\n try {\n\t // 这里input是父页面的传参,就是二级解析里 XXX + lazy里的XXX\n\t var html = request(\"http://122.228.85.203:7979/api/?key=e5ef7605633990b8d99ee1bfae196786&url=\" + input.split(\"#\")[0], {\n headers: {\n 'Referer': MY_URL\n }\n })\n\t\t// 得到解析结果\n var json = JSON.parse(html)\n\t\t// 可以在控制台打印,需要在设置的开发手册与模式--记录并显示日志,勾选。页面就可以看到日志悬浮按钮\n\t\t$.log(json);\n\t\tif (json.code != 200) {\n\t\t html = request(\"http://122.228.85.203:6789/api/?key=de7ed0ead4328fe74ade88bd922e3f4f&url=\" + input.split(\"#\")[0], {\n headers: {\n 'Referer': MY_URL\n }\n })\n json = JSON.parse(html)\n\t\t $.log(json);\n\t\t}\n\t // '#isVideo=true#' 强制标记为视频,视频链接就是前面的json.url\n return json.url+ '#isVideo=true#'\n } catch (e) {\n return e + 'video://' + input\n }\n}, MY_HOME)"
}
],
"saved": true,
"title": "官解",
"author": "SoEasy",
"version": 7,
"type": "video",
"url": "http://111.173.115.204:2211/api.php/app/video?tid=fyclass&class=&area=fyarea&lang=&year=fyyear&limit=&pg=fypage",
"col_type": "movie_3",
"class_name": "电影&电视剧&综艺&动漫&B站&海外剧&港台剧&日韩剧&纪录片",
"class_url": "1&2&3&4&20&21&22&23&24",
"area_name": "全部地区&大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他",
"area_url": "&大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他",
"sort_name": "",
"year_name": "全部年代&2024&2023&2022&2021&2020&2019&2018&2017&2016&2015&2014&2013&2012&2011&2010&2009&2008&2007&2006&2005&2004",
"sort_url": "",
"year_url": "&2024&2023&2022&2021&2020&2019&2018&2017&2016&2015&2014&2013&2012&2011&2010&2009&2008&2007&2006&2005&2004",
"find_rule": "js:\nvar d = [];\n// MY_URL 就是当前页面的url,在js里通过getParam获取请求参数(xxx?a=b&c=d),替换占位符fyxxx\nlet url = MY_URL.replace(\"fyclass\", getParam('tid', '1')).replace(\"fyarea\", getParam('area', '')).replace(\"fyyear\", getParam('year', '')).replace(\"fypage\", getParam('pg', '1'));\nlet detailUrl = \"http://111.173.115.204:2211/api.php/app/video_detail?id=\";\n// 发起请求fetch,得到的json字符串需要解析成Object\nvar json = JSON.parse(fetch(url));\n// 对结果json.list进行循环,抽取title、pic、url、desc字段\njson.list.forEach((item) => {\n d.push({\n title: item.vod_name,\n pic: item.vod_pic,\n url: detailUrl + item.vod_id,\n\tdesc: item.vod_remarks\n })\n})\n// 返回解析结果,配合显示样式movie_3,在主页显示分类后,以每行3列显示视频数据\nsetResult(d);",
"searchFind": "js:\nvar d = [];\n// MY_URL 就是当前页面的url,在js里通过getParam获取请求参数(xxx?a=b&c=d),替换占位符fyxxx\nlet url = MY_URL.replace(\"**\", getParam('text', '')).replace(\"fypage\", getParam('pg', '1'));\nlet detailUrl = \"http://111.173.115.204:2211/api.php/app/video_detail?id=\";\n// 发起请求fetch,得到的json字符串需要解析成Object\nvar json = JSON.parse(fetch(url));\n// 对结果json.list进行循环,抽取title、pic、url、desc字段\njson.list.forEach((item) => {\n d.push({\n title: item.vod_name,\n pic: item.vod_pic,\n url: detailUrl + item.vod_id,\n\tdesc: item.vod_remarks\n })\n})\n// 返回解析结果,配合显示样式movie_3,在主页显示分类后,以每行3列显示视频数据\nsetResult(d);",
"search_url": "http://111.173.115.204:2211/api.php/app/search?text=**&pg=fypage",
"group": "#官解",
"detail_col_type": "movie_1_vertical_pic",
"detail_find_rule": "js:\n// 二级解析就是解析规则渲染的首页视频或首页其它列表,点击时,进入二级解析 MY_URL 就是当前页面的url,也就是首页点击的链接\nvar d = [];\nvar json = JSON.parse(fetch(MY_URL));\n// 以下列表配合二级样式 movie_1_vertical_pic,展示最上方的图片,标题,备注\nd.push({\n title: json.data.vod_name,\n desc: json.data.vod_remarks,\n pic: json.data.vod_pic\n})\n// 以下是简介,通过long_text设置长文本,点击可跳转查看详情\nvar 简介 = json.data.vod_content;\nd.push({\n title: '‘‘’’<small><font color=\"#ff148e8e\">简介:' + 简介.substr(0, 55) + '...</font><small><font color=\"red\">详情</font></small></small>',\n url: 'hiker://empty#' + '\\n' + 简介 +'#noHistory##noRecordHistory#' + `@rule=js: var d = [];d.push({title:'影片简介:'+ MY_URL.split('#')[1],col_type: 'long_text'}); setResult(d);`,\n col_type: 'text_1'\n});\n\n// 以下是播放线路,vod_play_from,拆分成数据,配合排序规则,固定代码\nvar tabs = json.data.vod_play_from.split(\",\")\n// 定义线路方法,点击时,url上通过@lazyRule执行动态解析js逻辑,固定代码\nfunction setTabs(tabs, vari) {\n d.push({\n title: (getVar('shsort') == '1') ? '““””<b><span style=\"color: #FF0000\">逆序</span></b>' : '““””<b><span style=\"color: #1aad19\">正序</span></b>',\n url: `@lazyRule=.js:let conf = getVar('shsort');if(conf=='1'){putVar({key:'shsort', value:'0'});}else{putVar({key:'shsort', value:'1'})};refreshPage();'toast://切换排序成功'`,\n col_type: 'flex_button'\n })\n for (var i = 0; i < tabs.length; i++) {\n var url = \"#noLoading#@lazyRule=.js:putVar('\" + vari + \"', '\" + i + \"');refreshPage(false);'toast://切换成功!';'#noHistory#hiker://empty'\";\n d.push({\n title: getVar(vari, '0') == i ? '““' + tabs[i] + '””' : tabs[i],\n url: url,\n col_type: 'flex_button'\n })\n }\n}\n// 调用排序方法,方法在上面已经定义了\nsetTabs(tabs, \"tab_index\");\n// 处理播放线路,转换成两级数组 [[\"第一集$url\", \"第二集$url\"],[\"第一集$url\", \"第二集$url\"]]\nvar lists = json.data.vod_play_url.split(\"$$$\")\nvar lists = lists.map(e => e.split(\"#\"))\n// 执行lazy子页面,获取lazy解析结果,在点击集数时触发,因为这个页面导出了一个lazy变量,拼接到url上了\neval(JSON.parse(fetch('hiker://page/lazy', {})).rule);\n// 设置集数数据 以text_4样式排布,如果设置逆序,就反转一下, getVar(\"shsort\")在前面设置过putVar\nfunction setLists(lists, index) { \n var list = lists[index];\n if (getVar('shsort') == '1') {\n var list = lists[index].reverse();\n }\n for (var j in list) {\n var url = list[j].split(\"$\")[1];\n d.push({\n title: list[j].split(\"$\")[0], \n url: url + '#' + tabs[index] + lazy,\n col_type: list.length > 3 ? 'text_4' : 'text_2',\n extra: {referer: MY_URL, id: url}\n });\n }\n}\n// 调用方法,取播放线路的索引,默认第一个\nsetLists(lists, getVar(\"tab_index\", '0'));\n// 返回\nsetResult(d);",
"sdetail_col_type": "movie_1",
"sdetail_find_rule": "*",
"ua": "mobile",
"preRule": "",
"pages": "[{\"col_type\":\"movie_3\",\"name\":\"lazy\",\"path\":\"lazy\",\"rule\":\"// $('').lazyRule 拼接在url后执行动态解析,就是点击的时候再执行\\nvar lazy = $('').lazyRule((MY_HOME) => {\\n try {\\n\\t // 这里input是父页面的传参,就是二级解析里 XXX + lazy里的XXX\\n\\t var html = request(\\\"http://122.228.85.203:7979/api/?key=e5ef7605633990b8d99ee1bfae196786&url=\\\" + input.split(\\\"#\\\")[0], {\\n headers: {\\n 'Referer': MY_URL\\n }\\n })\\n\\t\\t// 得到解析结果\\n var json = JSON.parse(html)\\n\\t\\t// 可以在控制台打印,需要在设置的开发手册与模式--记录并显示日志,勾选。页面就可以看到日志悬浮按钮\\n\\t\\t$.log(json);\\n\\t\\tif (json.code != 200 || json.msg.includes(\\\"错误\\\")) {\\n\\t\\t html = request(\\\"http://122.228.85.203:6789/api/?key=de7ed0ead4328fe74ade88bd922e3f4f&url=\\\" + input.split(\\\"#\\\")[0], {\\n headers: {\\n 'Referer': MY_URL\\n }\\n })\\n json = JSON.parse(html)\\n\\t\\t $.log(json);\\n\\t\\t}\\n\\t // '#isVideo=true#' 强制标记为视频,视频链接就是前面的json.url\\n return json.url+ '#isVideo=true#'\\n } catch (e) {\\n return e + 'video://' + input\\n }\\n}, MY_HOME)\"}]",
"proxy": "",
"icon": ""
}
5.1 解析规则
配置了频道链接,即指定了解析规则里的MY_URL,看解析规则的结果:
js:
var d = [];
// MY_URL 就是当前页面的url,在js里通过getParam获取请求参数(xxx?a=b&c=d),替换占位符fyxxx
let url = MY_URL.replace("fyclass", getParam('tid', '1')).replace("fyarea", getParam('area', '')).replace("fyyear", getParam('year', '')).replace("fypage", getParam('pg', '1'));
let detailUrl = "http://111.173.115.204:2211/api.php/app/video_detail?id=";
// 发起请求fetch,得到的json字符串需要解析成Object
var json = JSON.parse(fetch(url));
// 对结果json.list进行循环,抽取title、pic、url、desc字段
json.list.forEach((item) => {
d.push({
title: item.vod_name,
pic: item.vod_pic,
url: detailUrl + item.vod_id,
desc: item.vod_remarks
})
})
// 返回解析结果,配合显示样式movie_3,在主页显示分类后,以每行3列显示视频数据
setResult(d);
- MY_URL获取频道链接,通过replace将配置的(分类、年代、地区等)替换值取代占位符,方便用户通过筛选过滤。特别是分页
- 发起请求,由于采集站返回的是JSON对象,解析成json后取列表
- 循环列表,取首页对象列表,注意4个核心字段:title、pic、url、desc
- 返回给海阔,setResult(d)。配合显示样式"col_type": "movie_3"在首页分类选择下方以每行3列展示数据
- 搜索解析类似,不再重复解释
5.2 二级解析
首页视频列表点击后进入二级页面,MY_URL是首页里被点击对象的url地址,包括参数
js:
// 二级解析就是解析规则渲染的首页视频或首页其它列表,点击时,进入二级解析 MY_URL 就是当前页面的url,也就是首页点击的链接
var d = [];
var json = JSON.parse(fetch(MY_URL));
// 以下列表配合二级样式 movie_1_vertical_pic,展示最上方的图片,标题,备注
d.push({
title: json.data.vod_name,
desc: json.data.vod_remarks,
pic: json.data.vod_pic
})
// 以下是简介,通过long_text设置长文本,点击可跳转查看详情
var 简介 = json.data.vod_content;
d.push({
title: '‘‘’’<small><font color="#ff148e8e">简介:' + 简介.substr(0, 55) + '...</font><small><font color="red">详情</font></small></small>',
url: 'hiker://empty#' + '\n' + 简介 +'#noHistory##noRecordHistory#' + `@rule=js: var d = [];d.push({title:'影片简介:'+ MY_URL.split('#')[1],col_type: 'long_text'}); setResult(d);`,
col_type: 'text_1'
});
// 以下是播放线路,vod_play_from,拆分成数据,配合排序规则,固定代码
var tabs = json.data.vod_play_from.split(",")
// 定义线路方法,点击时,url上通过@lazyRule执行动态解析js逻辑,固定代码
function setTabs(tabs, vari) {
d.push({
title: (getVar('shsort') == '1') ? '““””<b><span style="color: #FF0000">逆序</span></b>' : '““””<b><span style="color: #1aad19">正序</span></b>',
url: `@lazyRule=.js:let conf = getVar('shsort');if(conf=='1'){putVar({key:'shsort', value:'0'});}else{putVar({key:'shsort', value:'1'})};refreshPage();'toast://切换排序成功'`,
col_type: 'flex_button'
})
for (var i = 0; i < tabs.length; i++) {
var url = "#noLoading#@lazyRule=.js:putVar('" + vari + "', '" + i + "');refreshPage(false);'toast://切换成功!';'#noHistory#hiker://empty'";
d.push({
title: getVar(vari, '0') == i ? '““' + tabs[i] + '””' : tabs[i],
url: url,
col_type: 'flex_button'
})
}
}
// 调用排序方法,方法在上面已经定义了
setTabs(tabs, "tab_index");
// 处理播放线路,转换成两级数组 [["第一集$url", "第二集$url"],["第一集$url", "第二集$url"]]
var lists = json.data.vod_play_url.split("$$$")
var lists = lists.map(e => e.split("#"))
// 执行lazy子页面,获取lazy解析结果,在点击集数时触发,因为这个页面导出了一个lazy变量,拼接到url上了
eval(JSON.parse(fetch('hiker://page/lazy', {})).rule);
// 设置集数数据 以text_4样式排布,如果设置逆序,就反转一下, getVar("shsort")在前面设置过putVar
function setLists(lists, index) {
var list = lists[index];
if (getVar('shsort') == '1') {
var list = lists[index].reverse();
}
for (var j in list) {
var url = list[j].split("$")[1];
d.push({
title: list[j].split("$")[0],
url: url + '#' + tabs[index] + lazy,
col_type: list.length > 3 ? 'text_4' : 'text_2',
extra: {referer: MY_URL, id: url}
});
}
}
// 调用方法,取播放线路的索引,默认第一个
setLists(lists, getVar("tab_index", '0'));
// 返回
setResult(d);
- 二级解析就是详情页,分为四个部分
- 第一部分:配合二级样式movie_1_vertical_pic,给定了一个页面基础描述(图片+标题+备注)
- 第二部分:配置了一个单行文本text_1,指定了详情字段展示,url上通过@url新开页面展示所有
- 第三部分:指定了一系列flex_button,显示播放线路,支持排序功能,用到了putVar和getVar传参
- 第四部分:每条播放线路下的播放链接。播放线路的url添加了一个lazy函数
- lazy函数写在了子页面中,通过eval(JSON.parse(fetch('hiker://page/lazy')).rule)获取子页面,转成JSON对象,取rule解析规则内容,eval执行该js获取里面的lazy变量
5.3 子页面解析
播放链接添加了子页面用于动态解析播放链接:
// $('').lazyRule 拼接在url后执行动态解析,就是点击的时候再执行
var lazy = $('').lazyRule((MY_HOME) => {
try {
// 这里input是父页面的传参,就是二级解析里 XXX + lazy里的XXX
var html = request("http://122.228.85.203:7979/api/?key=e5ef7605633990b8d99ee1bfae196786&url=" + input.split("#")[0], {
headers: {
'Referer': MY_URL
}
})
// 得到解析结果
var json = JSON.parse(html)
// 可以在控制台打印,需要在设置的开发手册与模式--记录并显示日志,勾选。页面就可以看到日志悬浮按钮
$.log(json);
if (json.code != 200 || json.msg.includes("错误")) {
html = request("http://122.228.85.203:6789/api/?key=de7ed0ead4328fe74ade88bd922e3f4f&url=" + input.split("#")[0], {
headers: {
'Referer': MY_URL
}
})
json = JSON.parse(html)
$.log(json);
}
// '#isVideo=true#' 强制标记为视频,视频链接就是前面的json.url
return json.url+ '#isVideo=true#'
} catch (e) {
return e + 'video://' + input
}
}, MY_HOME)
- 通过箭头函数处理动态解析,input是输入参数,就是播放链接里的 url + '#' + tabs[index] + lazy的lazy之前的部分。
- json解析播放地址后,动态解析需要返回return json.url+ '#isVideo=true#'。标记为视频,海阔就会只取json.url进行页面跳转播放视频,参照文档:动态解析
- $.log(json);可查看日志,日志查看配置需要打开
小程序效果如下: