企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
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&amp;searchType=WEBTOON" > <search cache="1d" method="get" parse="search_parse_challenge" url="https://m.comic.naver.com/search/result.nhn?keyword=@key&amp;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> (本节完)