refactor(zaimanhua): 使用API接口替代HTML解析获取漫画数据

移除parseCoverComic方法,改为通过API接口获取漫画数据并重构parseJsonComic方法处理返回的JSON数据。同时修改首页加载逻辑,直接调用API接口获取推荐漫画列表,提高数据获取的稳定性和效率。
This commit is contained in:
morning-start
2025-07-27 01:20:28 +08:00
parent f812964e55
commit 631298ce1b

View File

@@ -42,41 +42,27 @@ class ZaiManHua extends ComicSource {
return JSON.parse(res.body).data; return JSON.parse(res.body).data;
} }
/**
* parse comic from html element
* @param comic {HtmlElement}
* @returns {Comic}
*/
parseCoverComic(comic) {
let title = comic.querySelector("p > a").text.trim();
let url = comic.querySelector("p > a").attributes["href"];
let id = url.split("/").pop().split(".")[0];
let cover = comic.querySelector("img").attributes["src"];
let subtitle = comic.querySelector(".auth")?.text.trim();
if (!subtitle) {
subtitle = comic
.querySelector(".con_author")
?.text.replace("作者:", "")
.trim();
}
let description = comic.querySelector(".tip")?.text.trim();
return new Comic({ title, id, subtitle, url, cover, description });
}
/** /**
* parse json content * parse json content
* @param e object * @param e object
* @returns {Comic} * @returns {Comic}
*/ */
parseJsonComic(e) { parseJsonComic(e) {
let id = e.comic_py;
if (!id) {
id = id.comicPy;
}
let title = e?.name;
if (!title) {
title = e?.title;
}
return new Comic({ return new Comic({
id: e.comic_py, id: id.toString(),
title: e.name, title: title.toString(),
subtitle: e.authors, subtitle: e?.authors,
tags: e.types.split("/"), tags: e?.types?.split("/"),
cover: e.cover, cover: e?.cover,
description: e.last_update_chapter_name, description: e?.last_update_chapter_name.toString(),
}); });
} }
@@ -109,24 +95,31 @@ class ZaiManHua extends ComicSource {
*/ */
load: async (page) => { load: async (page) => {
let result = {}; let result = {};
let document = await this.fetchHtml(this.domain); // https://manhua.zaimanhua.com/api/v1/comic1/recommend/list?
// 推荐 // channel=pc&app_name=zmh&version=1.0.0&timestamp=1753547675981&uid=0
let recommend_title = document.querySelector( let api = `${this.baseUrl}/api/v1/comic1/recommend/list`;
".new_recommend_l h2" let params = {
)?.text; channel: "pc",
let recommend_comics = document app_name: "zmh",
.querySelectorAll(".new_recommend_l li") version: "1.0.0",
.map(this.parseCoverComic); timestamp: Date.now(),
result[recommend_title] = recommend_comics; uid: 0,
// 更新 };
let update_title = document.querySelector(".new_update_l h2")?.text; let params_str = Object.keys(params)
let update_comics = document .map((key) => `${key}=${params[key]}`)
.querySelectorAll(".new_update_l li") .join("&");
.map(this.parseCoverComic); let url = `${api}?${params_str}`;
result[update_title] = update_comics; const json = await this.fetchJson(url);
// 少男漫画 let data = json.list;
// 少女漫画 data.shift(); // 去掉第一个
// 冒险,搞笑,奇幻 data.pop(); // 去掉最后一个
data.map((arr) => {
let title = arr.name;
let comic_list = arr.list.map((item) => this.parseJsonComic(item));
result[title] = comic_list;
});
log("error", "再看漫画", result);
return result; return result;
}, },
}, },