Skip to content

💻作者 : SoEasy 📅时间 : 2024年9月5日 🪢个人公众号 : SoEasy同学

海阔视界写源(一)

1 简介

海阔视界写源,就是开发能用的小程序,初学者建议先学习官方文档: 海阔视界规则官方文档海阔视界$工具文档。 关于学习路径,建议:

  • 1.先读文档,了解开发环境、开发工具、插件、调试等,
  • 2.再学习开发规范,了解小程序代码结构,字段含义,常见写法等
  • 3.试写,一点一点熟悉,配合文档,逐步调试,最后完成整个小程序实战
  • 4.学习别人小程序的写法,了解一些高阶或者复杂的页面写法。特别是合集、聚合等写法,抽取可用代码。

2 环境准备

2.1 开发环境

先在手机上安装海阔视界,选择最新版本:123网盘下载。在设置--开发手册与模式--记录并显示日志,勾选。 然后在主页的右上角,打开小程序管理界面,新增小程序,填写小程序名称后,先导入。保存成功后还是进入小程序管理界面,长按小程序名称弹出界面--选择web编辑。

展开查看图片

log.pngedit.png

将链接在同一局域网内的电脑上打开,链接类似这种:http://192.168.0.194:52020/ruleEdit#/?rule=test 直接在浏览器上在线编辑保存即可开发 web.png

2.2 开发工具

还可以选择谷歌浏览器插件,功能和web编辑器一样,有代码提示等。下载地址

3 小程序格式规范

小程序编辑完成后,最终分享的是一个json文件,里面包含小程序的配置信息、基础规则、解析规则、子页面等。 基本格式如下:

展开查看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搜索的二级页面
全局UAua一般是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:
javascript
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.返回结果

解析规则里标准写法:

javascript
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格式
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,看解析规则的结果:

javascript
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地址,包括参数

javascript
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 子页面解析

播放链接添加了子页面用于动态解析播放链接:

javascript
// $('').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);可查看日志,日志查看配置需要打开

小程序效果如下: index.jpgdetail.jpgviewLog.jpg