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