parent
104cd0fcf2
commit
91d7e734e3
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,47 @@
|
||||
{
|
||||
"bookSourceComment": "",
|
||||
"bookSourceGroup": "🎨漫画",
|
||||
"bookSourceName": "🎨禁漫天堂(正文有问题)",
|
||||
"bookSourceType": 0,
|
||||
"bookSourceUrl": "https:\/\/jmcomic1.me\/",
|
||||
"customOrder": 37,
|
||||
"enabled": true,
|
||||
"enabledExplore": true,
|
||||
"exploreUrl": "总排行榜::\/albums?o=mv?page={{key}}\n月排行榜::\/albums?t=m&o=mv?page={{key}}\n周排行榜::\/albums?o=mv&t=w?page={{key}}\n日排行榜::\/albums?o=mv&t=t?page={{key}}\n最新A漫::\/albums?o=mr?page={{key}}\n同人::\/albums\/doujin?page={{key}}\n\n单行本::\/albums\/single?o=mr?page={{key}}\n短篇::\/albums\/short?page={{key}}\n其他::\/albums\/another?page={{key}}\n韩漫::\/albums\/hanman?page={{key}}\n美漫::\/albums\/meiman?page={{key}}\ncosplay::\/albums\/another\/sub\/cosplay?page={{key}}",
|
||||
"lastUpdateTime": 1651214216611,
|
||||
"respondTime": 180000,
|
||||
"ruleBookInfo": {
|
||||
"coverUrl": "class.thumb-overlay.2@tag.img@src",
|
||||
"init": "",
|
||||
"intro": "class.nav-tab-content@class.p-t-5 p-b-5@text",
|
||||
"kind": "class.tag-block.3@text",
|
||||
"name": "class.panel-heading.0@text"
|
||||
},
|
||||
"ruleContent": {
|
||||
"content":"class.row thumb-overlay-albums",
|
||||
"imageStyle": "Full"
|
||||
},
|
||||
"ruleExplore": {
|
||||
"bookList": "class.col-xs-6 col-sm-6 col-md-4 col-lg-3 list-col",
|
||||
"bookUrl": "tag.a.0@href",
|
||||
"coverUrl": "tag.img@src",
|
||||
"intro": "class.p-t-5 p-b-5.7@text",
|
||||
"kind": "class.title-truncate@tag.a@text",
|
||||
"name": "class.video-title title-truncate m-t-5@text"
|
||||
},
|
||||
"ruleSearch": {
|
||||
"bookList": "class.list-col",
|
||||
"bookUrl": "tag.a.0@href",
|
||||
"realUrl":"class.img@data-original",
|
||||
"coverUrl": "class.img@data-original",
|
||||
"kind": "class.title-truncate tags p-b-5@tag.a@text",
|
||||
"name": "tag.img@title"
|
||||
},
|
||||
"ruleToc": {
|
||||
"chapterList": "class.btn-toolbar.0@tag.a||class.col btn btn-primary dropdown-toggle reading",
|
||||
"chapterName": "text",
|
||||
"chapterUrl": "tag.a@href"
|
||||
},
|
||||
"searchUrl": "https:\/jmcomic1.me\/search\/photos?search_query={{key}}&main_tag=0",
|
||||
"weight": 0
|
||||
}
|
@ -0,0 +1,144 @@
|
||||
export default {
|
||||
/**
|
||||
* 从一个个书中获取属性
|
||||
*/
|
||||
getAttr(doc,str){
|
||||
let selector = "";
|
||||
top.testEle = doc;
|
||||
let sq = str?.split("@");// 必然分出前面tag. 或class. 或id. 最后是 某个属性或者text html
|
||||
for (let index = 0; index < sq.length-1; index++) {
|
||||
let regex = /^(\w+)\.([\w\s-]+)(?:\.(\d+))?$/
|
||||
let parm = sq[index].match(regex);
|
||||
if(parm[1]=="tag"){
|
||||
selector = selector + parm[2];
|
||||
if(parm[3]) {
|
||||
selector = selector + `:eq(${parm[3]})`
|
||||
}
|
||||
}
|
||||
if(parm[1]=="class"){
|
||||
selector = selector + `[class*='${parm[2]}']`
|
||||
if(parm[3]) {
|
||||
selector = selector + `:eq(${parm[3]})`
|
||||
}
|
||||
}
|
||||
if(parm[2]=="id"){
|
||||
selector = selector + `[id*='${parm[2]}']`
|
||||
}
|
||||
selector = selector + " ";
|
||||
}
|
||||
let res = undefined;
|
||||
if(sq[sq.length-1]){
|
||||
if(sq[sq.length-1]=="text"){
|
||||
let result = $(doc).find(selector);
|
||||
if(result.length>1) {
|
||||
res = result.map(function(index, item) {
|
||||
return $(item)?.text()
|
||||
});
|
||||
} else {
|
||||
res = $(doc).find(selector)?.text()
|
||||
}
|
||||
} else {
|
||||
let result = $(doc).find(selector);
|
||||
if(result.length>1) {
|
||||
res = result.map(function(index, item) {
|
||||
return $(item)?.attr(sq[sq.length-1])
|
||||
});
|
||||
} else {
|
||||
res = $(doc).find(selector)?.attr(sq[sq.length-1])
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
},
|
||||
getBookPreview(doc,str){
|
||||
return {
|
||||
"bookItem": doc,
|
||||
"bookUrl": this.getAttr(doc,str.bookUrl),
|
||||
"realUrl": this.getAttr(doc,str.realUrl),
|
||||
"coverUrl": this.getAttr(doc,str.coverUrl),
|
||||
"kind": this.getAttr(doc,str.kind),
|
||||
"name": this.getAttr(doc,str.name)
|
||||
}
|
||||
},
|
||||
getBookContent(doc,str){
|
||||
return {
|
||||
"content":this.selector(doc,str),
|
||||
}
|
||||
},
|
||||
getBookInfo(doc,str){
|
||||
return {
|
||||
"bookItem": doc,
|
||||
"coverUrl": this.getAttr(doc,str.coverUrl),
|
||||
// "init": "",
|
||||
"intro": this.getAttr(doc,str.intro),
|
||||
"kind": this.getAttr(doc,str.kind),
|
||||
"name": this.getAttr(doc,str.name),
|
||||
}
|
||||
},
|
||||
selector(doc,str){
|
||||
let selector = "";
|
||||
let sq = str.split("@");// 必然分出前面tag. 或class. 或id. 最后是 某个属性或者text html
|
||||
for (let index = 0; index < sq.length; index++) {
|
||||
let regex = /^(\w+)\.([\w\s-]+)(?:\.(\d+))?$/
|
||||
let parm = sq[index].match(regex);
|
||||
if(parm[1]=="tag"){
|
||||
selector = selector + parm[2];
|
||||
if(parm[3]) {
|
||||
selector = selector + `:eq(${parm[3]})`
|
||||
}
|
||||
}
|
||||
if(parm[1]=="class"){
|
||||
selector = selector + `[class*='${parm[2]}']`
|
||||
if(parm[3]) {
|
||||
selector = selector + `:eq(${parm[3]})`
|
||||
}
|
||||
}
|
||||
if(parm[2]=="id"){
|
||||
selector = selector + `[id*='${parm[2]}']`
|
||||
}
|
||||
selector = selector + " ";
|
||||
}
|
||||
console.log("selector,",doc.find(selector));
|
||||
return doc.find(selector);
|
||||
},
|
||||
//返回搜索页面
|
||||
ruleSearch(source,key){
|
||||
return fetch('/api/scrape', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ url: source.searchUrl.replace("{{key}}",key)??this.$route.query.url })
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(html => {
|
||||
const doc = $(html);
|
||||
return doc;
|
||||
})
|
||||
.catch(error => console.error(error));
|
||||
},
|
||||
ruleBookInfo(source,key){
|
||||
return fetch('/api/scrape', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ url: source.bookSourceUrl + key ?? this.$route.query.url })
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(html => {
|
||||
const doc = $(html);
|
||||
return doc;
|
||||
})
|
||||
.catch(error => console.error(error));
|
||||
},
|
||||
ruleContent(source,key){
|
||||
return fetch('/api/scrape', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ url: source.bookSourceUrl + key ?? this.$route.query.url })
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(html => {
|
||||
const doc = $(html);
|
||||
return doc;
|
||||
})
|
||||
.catch(error => console.error(error));
|
||||
}
|
||||
}
|
Loading…
Reference in new issue