Skip to content

Commit dd58dbd

Browse files
committed
更新文件
1 parent 4b7722f commit dd58dbd

File tree

5 files changed

+318
-13
lines changed

5 files changed

+318
-13
lines changed

config/map.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ AppFei@@https://ysa.yy-fun.cc/feiapp@@森林动漫[AF]
3838
AppGet@@{"host":"https://snysw.xyz/mf4kzs327.txt","key":"1234567887654321"}@@魔方[AG¹]
3939
AppGet@@{"host":"https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt","key":"88689667dce61725"}@@茉莉[AG¹]
4040
AppGet@@{"host":"http://ys.qist.top","key":"2SWSPFxugBLPPOKo"}@@旗星[AG¹]
41-
AppGet@@{"host":"https://api1.bffree.cn","key":"2015692015692015"}@@橘子[AG¹]
4241
AppGet@@{"host":"https://dy.58ys.vip","key":"JEWibY1AgWF0V1xx"}@@五八[AG¹]
4342
AppGet@@{"host":"https://mac.555618.xyz","key":"#getapp@TMD@2025"}@@玲珑[AG¹]
4443
AppGet@@{"host":"https://app.omofun1.top","key":"66dc309cbeeca454"}@@OMOfun[AG¹]
@@ -50,16 +49,13 @@ AppSk@@{"host":"https://sk.xiaoyaoys.top/skkkkkkk.txt","key":"ygcnbcczduwydmrs",
5049
AppV6@@{"api":"http://yjyi.juyongjiu.com/icciu_api.php/v1.vod","datasignkey":"6QQNUsP3PkD2ajJCPCY8","apisignkey":"lvdoutv-1.0.0"}@@剧永久[AV⁶]
5150
AppV6@@http://jxfmax.juxiafan.com/icciu_api.php/v1.vod@@剧下饭[AV⁶]
5251
AppToV5@@http://118.89.203.120:8762@@番喜[ATV⁵]
53-
AppToV5@@http://111.173.114.61:8762@@爱看剧Fax[ATV⁵]
5452
AppToV5@@http://38.55.237.41:8762@@皮皮虾[ATV⁵]
55-
AppV2²@@https://www.heli888.cc@@河狸![AV²]
5653
AppV2²@@http://38.47.213.61:41271@@闪影[AV²]
5754
AppV2²@@http://v.lnhaozhenjin.cn@@好震惊[AV²]
5855
AppV2²@@http://jxfmax.juxiafan.com@@剧下饭[AV²]
5956
AppV1@@http://ziyuncms.feifan12.xyz/api.php@@紫云[AV¹]
6057
getapp3.4.4@@{"host":"https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/2.txt","datakey":"staraugust123456","api":2}@@云云[AG³]
6158
getapp3.4.4@@{"host":"https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json","datakey":"AAdgrdghjfgswerA","api":2}@@鲸鱼影视[AG³]
62-
getapp3.4.4@@{"host":"https://www.guahd.com/1.txt","key":"f2A7D4B9E8C16531"}@@瓜萌[AG³]
6359
getapp3.4.4@@{"host":"https://99.jl8.top/1.txt","key":"xnybssspqtwotuwj"}@@七月[AG³]
6460
getapp3.4.4@@{"host":"http://tvb.yy-fun.cc","key":"jcTz6Jda2aKrH8Tk"}@@掌上追剧[AG³]
6561
AppHs@@{"host":"https://dy.jmzp.net.cn","app_id":"shiguang","deviceid":"","versionCode":"10000","UMENG_CHANNEL":"guan"}@@拾光视频[Hs]

json/App模板配置.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,6 @@
176176
"iv": "37kj83zs1q16jk6t",
177177
"verify": "true"
178178
},
179-
"橘子": {
180-
"muban": "AppQiji",
181-
"host": "https://juziapp.tpmbt.cn",
182-
"hosturl": "",
183-
"key": "K3h6YvSU8BTUfEcb",
184-
"iv": "K3h6YvSU8BTUfEcb",
185-
"verify": "true"
186-
},
187179
"丫丫动漫": {
188180
"muban": "AppGet",
189181
"host": "http://tv.yy-fun.cc",
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
设置中心
22
番茄小说
3-
大象影视
43
腾云驾雾
54
央视大全
65
IPTV
76
[优]
87
[盘]
98
[漫]
9+
[短]
1010
[官]
1111
[听]
12+
[书]
1213
[搜]
1314
DS
1415
cat
16+
DR2
1517
hipy
1618
推送

spider/js/去读书[书].js

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
/*
2+
@header({
3+
searchable: 1,
4+
filterable: 0,
5+
quickSearch: 1,
6+
title: '去读书[书]',
7+
author: 'EylinSir',
8+
'类型': '小说',
9+
logo: 'http://www.qudushu.com/favicon.ico',
10+
lang: 'ds'
11+
})
12+
*/
13+
14+
var rule = {
15+
类型: '小说',
16+
author: 'EylinSir',
17+
title: '去读书[书]',
18+
host: 'http://www.qudushu.com',
19+
url: '/book/fyclass/0/fypage.html',
20+
logo: 'http://www.qudushu.com/favicon.ico',
21+
class_name: '玄幻魔法&武侠修真&都市言情&历史军事&穿越架空&游戏竞技',
22+
class_url: 'sort1&sort2&sort3&sort4&sort5&sort6',
23+
searchUrl: '/modules/article/search.php?q=**',
24+
searchable: 1,
25+
quickSearch: 1,
26+
filterable: 0,
27+
timeout: 10000,
28+
play_parse: true,
29+
headers: {
30+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'
31+
},
32+
request: async function (url, obj) {
33+
obj = obj || {};
34+
try {
35+
const response = await _fetch(url, {
36+
method: obj.method || 'GET',
37+
headers: obj.headers || this.headers
38+
});
39+
return response.text();
40+
} catch (err) {
41+
return '';
42+
}
43+
},
44+
45+
一级: async function () {
46+
let {input, pdfa, pdfh, pd} = this;
47+
let url = input.startsWith('http') ? input : this.host + '/book/' + input + '/0/1.html';
48+
let html = await this.request(url);
49+
let d = [];
50+
let items = pdfa(html, '.blockcontent .c_row') || pdfa(html, '.c_row') || [];
51+
for (let item of items) {
52+
let title = pdfh(item, '.c_subject a:eq(1)&&Text');
53+
let itemUrl = pd(item, '.c_subject a:eq(1)&&href');
54+
if (!title || !itemUrl) continue;
55+
let remarks = pdfh(item, '.c_tag span:eq(1)&&Text') || '';
56+
let pic = pd(item, 'img&&src') || '';
57+
let content = pdfh(item, '.c_description&&Text') || '';
58+
d.push({
59+
title: title,
60+
url: itemUrl,
61+
desc: remarks,
62+
pic_url: pic,
63+
content: content,
64+
});
65+
}
66+
return setResult(d);
67+
},
68+
69+
二级: async function () {
70+
let {input, pdfa, pdfh, pd} = this;
71+
let html = await this.request(input);
72+
let VOD = {};
73+
VOD.vod_name = pdfh(html, '[property="og:novel:book_name"]&&content') || '';
74+
VOD.type_name = '';
75+
VOD.vod_pic = pd(html, '.divbox.cf img&&src') || '';
76+
VOD.vod_content = pdfh(html, '.tabcontent .tabvalue:eq(0)&&Text') || '';
77+
VOD.vod_remarks = pdfh(html, 'h3 a&&Text') || '';
78+
VOD.vod_year = '';
79+
VOD.vod_area = '';
80+
VOD.vod_actor = pdfh(html, '[property="og:novel:author"]&&content') || '';
81+
VOD.vod_director = VOD.vod_actor;
82+
VOD.vod_play_from = '去读书网';
83+
let toc_url = pd(html, 'a:contains(点击阅读)&&href') || '';
84+
if (toc_url && !toc_url.startsWith('http')) {
85+
toc_url = this.host + toc_url;
86+
}
87+
let toc_html = toc_url ? await this.request(toc_url) : '';
88+
let chapters = [];
89+
let chapterItems = pdfa(toc_html, '.index li') || [];
90+
for (let chapter of chapterItems) {
91+
let title = pdfh(chapter, 'a&&Text');
92+
let chapter_url = pd(chapter, 'a&&href');
93+
if (!title || !chapter_url) continue;
94+
if (!chapter_url.startsWith('http')) {
95+
chapter_url = this.host + chapter_url;
96+
}
97+
chapters.push(title + '$' + chapter_url);
98+
}
99+
VOD.vod_play_url = chapters.join('#');
100+
return VOD;
101+
},
102+
103+
搜索: async function () {
104+
let {KEY, pdfa, pdfh, pd} = this;
105+
let url = this.host + this.searchUrl.replace('**', encodeURIComponent(KEY));
106+
let html = await this.request(url);
107+
if (!html) {
108+
url = this.host + '/modules/article/search.php?q=' + encodeURIComponent(KEY);
109+
html = await this.request(url);
110+
}
111+
let d = [];
112+
let items = pdfa(html, '#jieqi_page_contents .c_row') || [];
113+
for (let item of items) {
114+
let title = pdfh(item, '.c_subject a&&Text');
115+
let itemUrl = pd(item, '.c_subject a&&href');
116+
if (!title || !itemUrl) continue;
117+
itemUrl = itemUrl.startsWith('http') ? itemUrl : this.host + itemUrl;
118+
let pic = pd(item, 'img&&src') || '';
119+
pic = pic.startsWith('http') ? pic : this.host + pic;
120+
d.push({
121+
title: title,
122+
url: itemUrl,
123+
desc: pdfh(item, '.c_tag span:eq(1)&&Text') || '',
124+
pic_url: pic,
125+
content: '',
126+
});
127+
}
128+
return setResult(d);
129+
},
130+
131+
lazy: async function () {
132+
let {input, pdfh} = this;
133+
let html = await this.request(input);
134+
let title = pdfh(html, 'h1&&Text') || '';
135+
let content = pdfh(html, '#acontent&&Html') || '';
136+
if (content) {
137+
content = content.replace(/<script[^>]*?>.*?<\/script>/gs, '')
138+
.replace(/<\/p>/g, '\n\n')
139+
.replace(/<br[^>]*?>/g, '\n')
140+
.replace(/<[^>]*?>/g, '')
141+
.replace(/.*| www\.qudushu\.la|.*便/g, '')
142+
.replace(/[()]/g, '')
143+
.replace(/&nbsp;/g, ' ')
144+
.replace(/[ \t]+/g, ' ')
145+
.replace(/\n[ \t]+|[ \t]+\n/g, '\n')
146+
.replace(/\n+/g, '\n\n')
147+
.trim();
148+
}
149+
return {
150+
parse: 0,
151+
url: 'novel://' + JSON.stringify({title, content}),
152+
js: ''
153+
};
154+
}
155+
};

spider/js/阅读助手[书].js

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
var rule = {
2+
类型: '小说',
3+
author: 'EylinSir',
4+
title: '阅读助手[书]',
5+
desc: '阅读助手小说源',
6+
host: 'https://api-bc.wtzw.com',
7+
homeUrl: 'https://api-bc.wtzw.com',
8+
url: '/api/v4/category/get-list?gender=fyclass&category_id=fyfilter&need_filters=1&page=fypage&need_category=1',
9+
class_name: '男生&女生&出版',
10+
class_url: '1&2&3',
11+
searchUrl: '/api/v5/search/words?gender=3&imei_ip=2937357107&page=fypage&wd=**',
12+
searchable: 2,
13+
quickSearch: 0,
14+
filterable: 1,
15+
filter: {
16+
"1": [{key: "type", name: "类型", value: [{"n":"玄幻奇幻","v":"202"},{"n":"都市人生","v":"203"},{"n":"武侠仙侠","v":"205"},{"n":"历史军事","v":"56"},{"n":"科幻末世","v":"64"},{"n":"游戏竞技","v":"75"},{"n":"体育赛事","v":"206"},{"n":"奇闻异事","v":"204"}]}],
17+
"2": [{key: "type", name: "类型", value: [{"n":"现代言情","v":"1"},{"n":"古代言情","v":"2"},{"n":"幻想言情","v":"4"},{"n":"宫闱宅斗","v":"209"}]}],
18+
"3": [{key: "type", name: "类型", value: [{"n":"悬疑推理","v":"262"},{"n":"文学艺术","v":"240"},{"n":"历史传记","v":"264"}]}]
19+
},
20+
filter_url: "{{fl.type}}",
21+
filter_def: {},
22+
headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'},
23+
sign_headers: {
24+
"app-version": "51110", "platform": "android", "reg": "0", "AUTHORIZATION": "",
25+
"application-id": "com.****.reader", "net-env": "1", "channel": "unknown", "qm-params": ""
26+
},
27+
timeout: 10000,
28+
play_parse: true,
29+
30+
request: async function (url, obj) {
31+
obj = obj || {};
32+
const response = await _fetch(url, {
33+
method: obj.method || 'GET',
34+
headers: obj.headers || this.headers
35+
});
36+
return response.text();
37+
},
38+
39+
预处理: async function () {
40+
this.sign_headers.sign = getSignStr(this.sign_headers);
41+
},
42+
43+
一级: async function (tid, pg, filter, extend) {
44+
let d = [];
45+
const cateMap = {'1':'202', '2':'1', '3':'262'};
46+
let gender = tid !== '-1' ? tid : '2';
47+
let category_id = cateMap[gender];
48+
const validSubTypes = ['202','203','205','56','64','75','206','204','1','2','4','209','262','240','264'];
49+
if (extend?.type && validSubTypes.includes(extend.type)) {
50+
category_id = extend.type;
51+
} else if (filter && validSubTypes.includes(filter)) {
52+
category_id = filter;
53+
}
54+
let params = {
55+
gender: gender,
56+
category_id: category_id,
57+
need_filters: '1',
58+
page: pg || '1',
59+
need_category: '1',
60+
imei_ip: '2937357107'
61+
};
62+
params.sign = getSignStr(params);
63+
let html = await this.request(buildUrl(`${this.host}/api/v4/category/get-list`, params), {headers: this.sign_headers});
64+
let json = JSON.parse(html);
65+
if (json?.data?.books) {
66+
d = json.data.books.map(it => ({
67+
title: it.title,
68+
url: `${this.host}/api/v4/book/detail?id=${it.id}`,
69+
desc: it.author,
70+
pic_url: it.image_link,
71+
content: it.intro
72+
}));
73+
}
74+
return setResult(d);
75+
},
76+
77+
二级: async function () {
78+
let VOD = {};
79+
let bookId = this.input.match(/id=(\d+)/)[1];
80+
let detailParams = {id: bookId, imei_ip: '2937357107', teeny_mode: '0'};
81+
detailParams.sign = getSignStr(detailParams);
82+
let detailHtml = await this.request(buildUrl(`${this.host}/api/v4/book/detail`, detailParams), {headers: this.sign_headers});
83+
let detailJson = JSON.parse(detailHtml);
84+
if (detailJson?.data?.book) {
85+
let book = detailJson.data.book;
86+
VOD = {
87+
vod_name: book.title,
88+
type_name: book.book_tag_list?.map(tag => tag.title).join(',') || '',
89+
vod_pic: book.image_link,
90+
vod_content: book.intro,
91+
vod_remarks: book.latest_chapter_title,
92+
vod_year: '', vod_area: '',
93+
vod_actor: book.author, vod_director: book.author,
94+
vod_play_from: '阅读助手'
95+
};
96+
let tocParams = {id: book.id};
97+
tocParams.sign = getSignStr(tocParams);
98+
let tocHtml = await this.request(buildUrl('https://api-ks.wtzw.com/api/v1/chapter/chapter-list', tocParams), {headers: this.sign_headers});
99+
let tocJson = JSON.parse(tocHtml);
100+
if (tocJson?.data?.chapter_lists) {
101+
VOD.vod_play_url = tocJson.data.chapter_lists.map(chapter =>
102+
`${chapter.title}$${book.id}@@${chapter.id}@@${chapter.title}`
103+
).join('#');
104+
}
105+
}
106+
return VOD;
107+
},
108+
109+
搜索: async function () {
110+
let d = [];
111+
let params = {
112+
gender: '3', imei_ip: '2937357107',
113+
page: this.MY_PAGE, wd: this.KEY
114+
};
115+
params.sign = getSignStr(params);
116+
let html = await this.request(buildUrl(`${this.host}/api/v5/search/words`, params), {headers: this.sign_headers});
117+
let json = JSON.parse(html);
118+
if (json?.data?.books) {
119+
d = json.data.books.map(it => ({
120+
title: it.original_title,
121+
desc: it.author,
122+
pic_url: it.image_link,
123+
url: `${this.host}/api/v4/book/detail?id=${it.id}`,
124+
content: it.intro
125+
}));
126+
}
127+
return setResult(d);
128+
},
129+
130+
lazy: async function () {
131+
let [bookId, chapterId, title] = this.input.split('@@');
132+
let content = '内容加载失败';
133+
let params = {id: bookId, chapterId};
134+
params.sign = getSignStr(params);
135+
let html = await this.request(buildUrl('https://api-ks.wtzw.com/api/v1/chapter/content', params), {headers: this.sign_headers});
136+
let json = JSON.parse(html);
137+
if (json?.data?.content) content = decodeContent(json.data.content);
138+
return {
139+
parse: 0,
140+
url: `novel://${JSON.stringify({title, content})}`,
141+
js: ''
142+
};
143+
}
144+
};
145+
146+
function getSignStr(params) {
147+
const sign_key = "d3dGiJc651gSQ8w1";
148+
return md5(Object.keys(params).sort().reduce((pre, n) => pre + n + "=" + params[n], "") + sign_key);
149+
}
150+
151+
function decodeContent(content) {
152+
let key = CryptoJS.enc.Utf8.parse("242ccb8230d709e1");
153+
let ivEncData = CryptoJS.enc.Base64.parse(content);
154+
let iv = CryptoJS.lib.WordArray.create(ivEncData.words.slice(0, 4));
155+
let encrypted = CryptoJS.lib.WordArray.create(ivEncData.words.slice(4));
156+
let decrypted = CryptoJS.AES.decrypt({ciphertext: encrypted}, key, {
157+
iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7
158+
});
159+
return decrypted.toString(CryptoJS.enc.Utf8);
160+
}

0 commit comments

Comments
 (0)