main(主体节点)用xml代码写,用于描述解析对象数据和app上显示的样式。 <br>
## 2.3.1 多多猫界面展示和插件之间的逻辑
![](https://box.kancloud.cn/1c79e3171637008e7b02262ef5965878_634x687.png)
如图所示,插件的解析代码部分主要就是提供给多多猫展示以下页面
1. 首页,它通过`hots标签`里面的js解析函数返回的json数据来展现
2. 书籍页面,它通过`book标签`里面的js解析函数(book_parse)返回的json数据来展现
3. 漫画(小说等)正文页面,它通过`section标签`里面的js解析函数返回的json数据来展现
4. 搜索页面,它通过`search标签`里面的js解析函数返回的json数据来展现
5. 图中4个标签就构成一个插件完整界面,如果要丰富界面给用户使用,还可以加上updates、tags、tag标签(节点),见下文2.3.2说明。
<br>
## 2.3.2 main节点内节点跳转示意图
1. main节点的dtype="1"为漫画(或有目录的图片)插件;dtype2.轻小说、小说插件;dtype3.动画(或有目录的视频、音频)插件;dtype4.图片(或无目录的漫画)插件;dtype5.商品插件(手办周边、漫画书等可购买的商品);dtype6.资讯(或无目录的轻小说、小说)插件;dtype7.视频(或无目录的直播)插件;dtype8.小工具、查询插件。
2. main节点dtype选了其中一种情况下,有多个book、section节点的还可以设置每个为其他的dtype已适应源网站对象数据(不设置就默认继承main节点的还是父节点的),组成混合插件。dtype为1、2、3的book节点即book[123]之间的xml属性和js脚本节点输出格式是一样的,和book[4]、book[6]、book[7]、book[5]、book[8]都不同;section节点只有dtype1、2、3,book[4]的属性和输出格式类似section[1],book[6]的类似section[2],book[7]的类似section[3];book[123]通过expr+dtype进入section[123],book[4675]进入不了section[123],v32引擎支持book[8]expr+dtype进入section[123]但有bug一直实现不了。
![节点跳转示意图](https://box.kancloud.cn/a549d8196803de2c5e5bb634cbdec42d_797x622.png)
3. 以main dtype="1"漫画插件为例:hots向用户展示热门漫画列表;updates展示最新漫画列表;tags展示漫画分类列表(是展示所有分类标签如恋爱、体育,而不是一组漫画);tag展示某一个分类的漫画列表;subtag展示某一个二级分类的漫画列表(很少写该节点),tag与subtag关系类似前者是体育漫画列表,后者是足球漫画、篮球漫画列表;search展示搜索结果列表;book[1]展示某一本漫画书的介绍和目录;section[1]展示漫画某一话所有图片。
4. 用户在app正式版首页输入一本漫画url打开,app会检查官方插件中心上面所有插件的meta节点的expr是否和它匹配,然后app进入匹配的插件界面或者原网页界面,前者的话还会瞬间检查这个插件的book节点的expr是否和它匹配,是的话app就直接进入book节点,否则就进入home节点。所以meta节点expr属性填好源网站域名的正则表达式比如`xxcomic\.com`,减少写上www或wap开头以兼容电脑版手机版网站,book节点expr写类似`\/comic\/\d+`这种明显特征的,有tag的也要tag节点写expr因为hots、updates等也能通过expr进入tag。
<br>
## 2.3.3 main节点及其数据说明(?表示随意可以不写)
||下级|类型|官方说明|以漫画插件为例的补充说明|
|:-|:-|:-|:-|:-|
|main节点|||||
|>home||Set|站点首页数据|下一级节点包括hots、updates、tags节点,3个节点都写才方便用户随意浏览,如果源网站没有相应网页可以删去对应节点但一定要保留home节点标签|
||>hots|Node|::热门(可使用>item进行静态配置,item支持跳转到book或tag)|静态配置(即预先在插件写下有哪些漫画)很少用,因为热门列表是定时不定时变化的|
||>>updates?|Add|当hots与updates在同一个url里使用(只填写parse)|这种写成hots的下级节点是简略写法,不建议写|
||>>tags?|Add|当hots与tags在同一个url里使用(只填写parse)|这种写成hots的下级节点是简略写法,不建议写|
||>updates|Node|::更新(可使用>item进行静态配置,item支持跳转到book或tag)注:当showImg="1"时,使用有图模板|静态配置(即预先在插件写下有哪些漫画)很少用,因为最新列表是定时或不定时变化的|
||>tags|Node|::分类(可使用>item进行静态配置)|静态配置(即预先在插件写下有哪些分类标签)是常见的,因为源网站总共有的分类很少改动除非整个网站大改版。静态配置时tags节点:xml部分只写title属性不写非静态配置时需要的其他属性,xml部分增加下级节点item(有group?、title、url属性),且不需要js部分代码|
|>search||Node|::搜索|如果删去该节点,app上该插件中搜索按钮会消失。url用了@page也只有第一页结果,是app限制,单个插件搜索结果数最多十几个够了,过多会影响多站(最近打开15个插件)搜索效果。|
|>tag||Node|::分类(处理某一个分类的数据)注:当showImg="0"时,使用无图模板||
|>subtag||Node|::二级分类(处理某一个二级分类的数据)注:当showImg="0"时,使用无图模板;注:必须要有expr;注:与tag节点的xml属性和js输出相同|tag与subtag关系类似前者是体育漫画列表,后者是足球漫画、篮球漫画列表,很少写subtag节点,因为会在tag界面后面增加一层分类界面要用户点击。|
|>book||Node|::书本(处理某一本书的数据)注:支持sited://的url接收|支持sited://是app层面的,插件者记得写expr|
||>sections?|Add|book的数据与sections不在同一个url时使用|相当于某一本漫画的全部目录页,当book节点接入url和源网站存放该漫画目录数据的网址不一样时使用sections节点,sections节点必须含buildUrl和parse属性|
|>section||Node|::章节(处理某一话的数据)|和sections节点不一样哦|
<br>
## 2.3.4 漫画插件main节点示例
以下是一个漫画插件示例的main节点。
```xml
<main dtype="1" btag="漫画">
<home>
<hots cache="1d" showImg="1" w="1" h="1" title="hots节点" method="get" parse="hots_parse" url="https://m.comic.naver.com/webtoon/weekday.nhn"/>
<updates cache="1d" showImg="1" w="1" h="1" title="updates节点" method="get" parse="updates_parse" url="https://m.comic.naver.com/webtoon/weekday.nhn"/>
<tags title="分类">
<tags cache="1d" method="get" parse="tags_parse1" url="https://m.comic.naver.com/webtoon/genre.nhn"/>
<tags cache="1d" method="get" parse="tags_parse_challenge" url="https://m.comic.naver.com/bestChallenge/genre.nhn"/>
</tags>
</home>
<search cache="1d" method="get" parse="search_parse1" url="https://m.comic.naver.com/search/result.nhn?keyword=@key&searchType=WEBTOON" >
<search cache="1d" method="get" parse="search_parse_challenge" url="https://m.comic.naver.com/search/result.nhn?keyword=@key&searchType=BEST_CHALLENGE" />
</search>
<tag>
<tag cache="10m" showImg="1" w="1" h="1" method="get" parse="tag_parse1" expr="webtoon\/genre.nhn"/>
<tag cache="10m" showImg="1" w="1" h="1" method="get" parse="tag_parse_challenge" expr="bestChallenge\/genre.nhn"/>
</tag>
<book cache="1d" method="get" buildUrl="book_buildUrl" parse="book_parse" expr="\/list\.nhn" >
<sections cache="1d" method="get" buildUrl="book_s_buildUrl" parseUrl="book_s_parseUrl" parse="book_s_parse" />
</book>
<section cache="1d" method="get" options="0,0,0,1" parseUrl="section_parseUrl" parse="section_parse" header="referer"/>
</main>
```
<br>
## 2.3.5 main节点主要格式说明
(?表示随意可以不写的属性)
|属性|类型|说明|
|:-|:-|:-|
|@dtype|[1,2,3,4,5,6,7,8]|2.3.2的第1、2、3段有讲|
|@btag?|字符串|对插件业务类型的真实描述(3 个字以内),呼应meta节点intro标签插件介绍,如漫画、轻小说、小说、动画、视频、FM、音乐、图片、商品、资讯、直播、小游戏、小工具、综合。|
|@cache?|[1m,1d,1,0]|缓存(1分钟,1天,永久、不缓存)。一般我是填1天,1天后再次进入该节点后即会刷新|
|@title?|字符串|节点标题,显示在多多猫界面上|
|@ua?|字符串|节点请求HTTP时使用的UA,默认使用site或引擎给定的值|
|@expr|字符串|正则表达式,满足条件的,由当前节点处理。请在book、tag、section节点填上。如果section节点只有一个,可以不用写expr属性|
|@showImg?|2/1/0|0无图;1小图;2大图。不添加默认是1。仅在hots、updates和tag上可用,2/1/0在3个节点显示标题图效果都不一样。|
|@w?|宽比重|和h搭配一起写,都不写就默认1比1。在同一节点搭配showImg使用|
|@h?|高比重|和w搭配一起写,都不写就默认1比1。在同一节点搭配showImg使用|
|@method?|get或post或@null|请求方式。@null表示节点不需请求,直接parse(url)|
|@args?|字符串|为post提供参数支持,格式如下:k1=v1;k2=v2(其它用途时不计格式)。支持@page,@key宏定义|
|@parseUrl?|fun(url,html)->url;url;CALL::url|通过url和它的html输出新的url作为parse的目标网址,如果多个url以“;”隔开(CALL::url的请求结果仍由parseUrl处理)|
|@parse|fun(url,html)->参考输出格式|解析函数。支持@null(表示不进行解析)|
|@buildUrl?|fun(url,key?,page?)或fun(url,str?)|通过url生成新的目标url。dtype=8时,是fun(url,str)|
|@url?|Uri|目标网址。直接get请求没有buildUrl/parseUrl时支持@page宏定义|
|@style?|11/12|界面样式风格:(dtype-section[3]book[7]节点专用属性)11:视频(默认),12:有封面的音乐|
main节点的其他属性说明请见[插件开放平台http://sited.noear.org/](http://sited.noear.org/) 里面的官方开发文档PDF。
<br>
ps.开发文档PDF中未说明:
- @update和@btn只用于dtype="8"的book节点;
- @buildArgs的function参数,在tag/subtag节点里有(url)和(url,page),在search节点里有(url)和(url,key),在dtype8的book节点里有(url)和(url,str),在其他节点只有(url)。@buildArgs的返回结果要符合@args格式;用了@buildArgs会使@args属性(若有)失效;@args格式要符合k1=v1;k2=v2
- search节点里:@args格式里每组k=@key键值对中的@key能替换成用户在search界面填写的搜索词,但@key左边右边多了任何字符时就不会替换如k1=123@key;k2=@key456,@key在等于号左边时也不能替换。url中的@key能替换成用户在search界面填写的搜索词,但限于get请求方式。
<br>
(本节完)
- 序言
- 第一章 基础
- 1.1 Html基础
- 1.2 CSS选择器
- 1.2.1 标签选择器
- 1.2.2 class/id选择器
- 1.2.3 属性选择器
- 1.3 JavaScript基础
- 1.4 json基础
- 第二章 中级
- 2.1 插件结构总览
- 2.2 meta头部节点讲解
- 2.3 main主体节点讲解
- 2.4 script脚本节点讲解
- 2.5 插件的安装调试与发布
- 第三章 高级
- 3.1 插件高级特性
- 3.2 常见内容保护突破方法
- 3.3 开发文档所没说的事
- 3.4 电脑js脚本测试插件
- 3.5 加login节点教程
- 3.6 使用yeoman生成器
- 3.7 自动化发布插件
- 第四章 附录
- 4.1 markdown基本用法