Manhuagui 阅读增强 · 全量加载/沉浸式双页排版/自动跨页显示

漫画柜双页浏览,全屏显示,从右到左显示。横图跨页;点击半屏翻页;记忆进度;

< Feedback on Manhuagui 阅读增强 · 全量加载/沉浸式双页排版/自动跨页显示

Review: Good - script works

§
Posted: 2025-09-11

好評

但有幾點瑕疵

1.取得圖片網址是調用SMH.utils.goPage,需要等待加載來擷取圖片網址,也同時等於對所有圖片發送出了請求,併發上限等於虛設,這樣很容易被Manhuagui屏蔽IP一段時間。

2.可能是因為取得圖片網址的方式,在單行本上使用會有一段時間無法操作,SMH.utils.goPage加載圖片後會一直返回頂部。
例如https://www.manhuagui.com/comic/25882/726481.html

建議直接解析混淆代碼來取得圖片網址

let get = () => {
    let parseCode = str => {
        let si = str.indexOf("(");
        let li = str.lastIndexOf(")") + 1;
        str = str.slice(si, li);
        return new Function(`"use strict";return (${str})`)();
    };
    let getJson = () => {
        let code = [...document.scripts].find(script => script.textContent.includes('x6c"]')).textContent;
        let data = parseCode(code);
        let si = data.indexOf("{");
        let li = data.lastIndexOf("}") + 1;
        data = data.slice(si, li);
        return JSON.parse(data);
    };
    let {
        files,
        path,
        sl: {
            e,
            m
        }
    } = getJson();
    let serv = SMH.picserv.getHostName(pVars.curHost);
    return files.map(f => `https://${serv}.hamreus.com${path}${f}?e=${e}&m=${m}`);
};
get();
§
Posted: 2025-09-27

给后来者:

根据楼主的建议,使用gemini 2.5 pro进行了修改,将“主流程”部分代码替换为以下内容即可

// ===================== 主流程 =====================
(async function main() {
  // 等待 SMH 和 pVars 等核心对象加载完成
  const ok = await waitFor(() => window.SMH && window.pVars && document.querySelector('#mangaFile'));
  if (!ok) {
    console.error("阅读增强脚本:未能等到 Manhuagui 核心对象加载,脚本终止。");
    return;
  }

  const total = getTotalPages();
  if (!total) {
    console.error("阅读增强脚本:未能获取到总页数。");
    return;
  }

  // 使用您最初提出并验证有效的方案,并增加健壮性检查
  const getPageUrls = () => {
    // 内部函数,用于安全执行并解析返回的代码字符串
    let parseCode = str => {
        let si = str.indexOf("(");
        let li = str.lastIndexOf(")") + 1; // 注意这里是 +1,以包含最后的括号
        str = str.slice(si, li);
        return new Function(`"use strict";return (${str})`)();
    };

    let getJson = () => {
        // 1. 使用您最初发现的、有效的定位器
        const scriptElement = [...document.scripts].find(
            script => script.textContent.includes('x6c"]')
        );

        // 2. 检查是否成功找到脚本
        if (!scriptElement) {
            // 如果这个方法也失败了,说明网站结构确实发生了较大变化
            throw new Error("无法找到包含 '.x6c\"]' 特征的漫画数据脚本。");
        }

        const code = scriptElement.textContent;
        const data = parseCode(code);

        // 从返回的字符串中提取纯净的 JSON 部分
        let si = data.indexOf("{");
        let li = data.lastIndexOf("}") + 1;
        const jsonData = data.slice(si, li);
        return JSON.parse(jsonData);
    };

    // 解析并构建最终的 URL 列表
    const {
        files,
        path,
        sl: { e, m }
    } = getJson();

    const serv = window.SMH.picserv.getHostName(window.pVars.curHost);
    const urls = files.map(f => `https://${serv}.hamreus.com${path}${f}?e=${e}&m=${m}`);
    urls.unshift(''); // 保持与原脚本 1-indexed 兼容
    return urls;
  };

  let pageUrls = null;
  try {
    pageUrls = getPageUrls();
    // 验证获取到的页数是否与页面显示的总页数匹配
    if (!pageUrls || pageUrls.length - 1 !== total) {
        console.error("新方法解析失败,或页数不匹配", `解析到 ${pageUrls ? pageUrls.length - 1 : 0} 页`, `期望 ${total} 页`);
        return; 
    }
  } catch (error) {
      console.error("解析图片地址时出错:", error);
      return;
  }

  const cfg = loadCfg();
  buildReaderUI(pageUrls, total, cfg);
})();

Post reply

Sign in to post a reply.