ComicRead

为漫画站增加双页阅读、翻译等优化体验的增强功能。百合会(记录阅读历史、自动签到等)、百合会新站、E-Hentai(关联外站、快捷收藏、标签染色、识别广告页等)、nhentai(彻底屏蔽漫画、无限滚动)、Yurifans(自动签到)、拷贝漫画(copymanga)(显示最后阅读记录、解锁隐藏漫画)、再漫画、漫画柜(manhuagui)、动漫屋(dm5)、mangabz、komiic、無限動漫、绅士漫画(wnacg)、禁漫天堂、NoyAcg、熱辣漫畫、hanime1、hitomi、hdoujin、SchaleNetwork、nude-moon、HentaiZap、IMHentai、HentaiEra、HentaiEnvy、MangaDex、welovemanga、kemono、nekohouse、Pixiv、明日方舟泰拉记事社、最前線、芸能ヌード、Tachidesk、LANraragi

< Feedback on ComicRead

Review: Good - script works

§
Posted: 12.8.2025

最新版本阅读模式怎么不生效了。。。开哪个漫画网站都不生效,拷贝直出,吐槽也看不见了

hymbzAuthor
§
Posted: 16.8.2025

拷贝是在昨天失效的,目前还没找到办法解决,不过其他网站我这边测试都是正常的,你使用的浏览器和油猴扩展是什么?

§
Posted: 17.8.2025
Edited: 17.8.2025

拷贝是在昨天失效的,目前还没找到办法解决,不过其他网站我这边测试都是正常的,你使用的浏览器和油猴扩展是什么?

浏览器是360急速浏览器,谷歌内核122的,油猴拓展是篡改猴5.4.6228

hymbzAuthor
§
Posted: 18.8.2025

相同配置试了下也是正常的。。。你是具体哪个网站不生效了?

§
Posted: 18.8.2025

相同配置试了下也是正常的。。。你是具体哪个网站不生效了?

https://www.mangacopy.com/
https://www.copy20.com/
https://www.2025copy.com/

拷贝漫画都失效了

hymbzAuthor
§
Posted: 19.8.2025

拷贝是因为15号拷贝升级了限制导致的,目前我还找不到办法所以无能为力😢

只有拷贝是吗?其他漫画网站没问题吧?

§
Posted: 19.8.2025
Edited: 19.8.2025

拷贝是因为15号拷贝升级了限制导致的,目前我还找不到办法所以无能为力😢

只有拷贝是吗?其他漫画网站没问题吧?

昨天升级后阅读模式能用了,其他网站没试过,主要用的还是拷贝,拷贝对IP可能做限制了,不翻墙脚本读不出最后浏览的话数,也读不出评论,直接显示无法读取。

§
Posted: 19.8.2025
Edited: 19.8.2025

api不行的話,可以直接解密閱讀頁的加密變數。

const decrypt = async () => {

    // 取得代碼
    const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

    // 取得解碼key,key的變數名不固定。
    // 熱辣放在.disPass[contentkey]
    let a_index = code.indexOf("'") + 1;
    let b_index = code.indexOf("'", a_index);
    const decrypt_key = code.slice(a_index, b_index);
    console.log(decrypt_key);

    // 取得加密數據
    // 熱辣放在.disData[contentkey]
    a_index = code.indexOf("contentKey");
    b_index = code.indexOf("'", a_index) + 1;
    let c_index = code.indexOf("'", b_index);
    const raw = code.slice(b_index, c_index);
    console.log(raw);

    const encoder = new TextEncoder();
    const decoder = new TextDecoder();
    const dioKey = encoder.encode(decrypt_key);
    const header = raw.substring(0, 16);
    const body = raw.substring(16);
    const iv = encoder.encode(header);
    const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
    const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
        name: "AES-CBC"
    }, false, ["decrypt"]);
    const decryptedBytes = await crypto.subtle.decrypt({
        name: "AES-CBC",
        iv
    }, cryptoKey, bodyBytes);

    const stringData = await decoder.decode(decryptedBytes);
    console.log(stringData);

    const images = JSON.parse(stringData).map(({
        url
    }) => url);
    console.log(images);

};
decrypt();

跟解密漫畫目錄數據的方法應該是一樣的。

§
Posted: 19.8.2025

api不行的話,可以直接解密閱讀頁的加密變數。

const decrypt = async () => {

    // 取得代碼
    const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

    // 取得解碼key,key的變數名不固定。
    // 熱辣放在.disPass[contentkey]
    let a_index = code.indexOf("'") + 1;
    let b_index = code.indexOf("'", a_index);
    const decrypt_key = code.slice(a_index, b_index);
    console.log(decrypt_key);

    // 取得加密數據
    // 熱辣放在.disData[contentkey]
    a_index = code.indexOf("contentKey");
    b_index = code.indexOf("'", a_index) + 1;
    let c_index = code.indexOf("'", b_index);
    const raw = code.slice(b_index, c_index);
    console.log(raw);

    const encoder = new TextEncoder();
    const decoder = new TextDecoder();
    const dioKey = encoder.encode(decrypt_key);
    const header = raw.substring(0, 16);
    const body = raw.substring(16);
    const iv = encoder.encode(header);
    const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
    const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
        name: "AES-CBC"
    }, false, ["decrypt"]);
    const decryptedBytes = await crypto.subtle.decrypt({
        name: "AES-CBC",
        iv
    }, cryptoKey, bodyBytes);

    const stringData = await decoder.decode(decryptedBytes);
    console.log(stringData);

    const images = JSON.parse(stringData).map(({
        url
    }) => url);
    console.log(images);

};
decrypt();

跟解密漫畫目錄數據的方法應該是一樣的。

编程苦手,虽然不知道怎么搞,但是还是要感谢大佬

§
Posted: 19.8.2025

搜索
漫画不存在时才会出现的提示

把往下兩行的13870行
setState('comicMap'
替換成

                  setState('comicMap', '', {
                      async getImgList() {

                          setState('manga', {
                              onNext: helper.querySelectorClick('.comicContent-next a:not(.prev-null)'),
                              onPrev: helper.querySelectorClick('.comicContent-prev:not(.index,.list) a:not(.prev-null)')
                          });

                          const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

                          let a_index = code.indexOf("'") + 1;
                          let b_index = code.indexOf("'", a_index);
                          const decrypt_key = code.slice(a_index, b_index);

                          a_index = code.indexOf("contentKey");
                          b_index = code.indexOf("'", a_index) + 1;
                          let c_index = code.indexOf("'", b_index);
                          const raw = code.slice(b_index, c_index);

                          const encoder = new TextEncoder();
                          const decoder = new TextDecoder();
                          const dioKey = encoder.encode(decrypt_key);
                          const header = raw.substring(0, 16);
                          const body = raw.substring(16);
                          const iv = encoder.encode(header);
                          const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
                          const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
                              name: "AES-CBC"
                          }, false, ["decrypt"]);
                          const decryptedBytes = await crypto.subtle.decrypt({
                              name: "AES-CBC",
                              iv
                          }, cryptoKey, bodyBytes);

                          const stringData = await decoder.decode(decryptedBytes);

                          const images = JSON.parse(stringData).map(({
                              url
                          }) => url);

                          return images;
                      }
                  });
§
Posted: 19.8.2025

搜索
漫画不存在时才会出现的提示

把往下兩行的13870行
setState('comicMap'
替換成

                  setState('comicMap', '', {
                      async getImgList() {

                          setState('manga', {
                              onNext: helper.querySelectorClick('.comicContent-next a:not(.prev-null)'),
                              onPrev: helper.querySelectorClick('.comicContent-prev:not(.index,.list) a:not(.prev-null)')
                          });

                          const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

                          let a_index = code.indexOf("'") + 1;
                          let b_index = code.indexOf("'", a_index);
                          const decrypt_key = code.slice(a_index, b_index);

                          a_index = code.indexOf("contentKey");
                          b_index = code.indexOf("'", a_index) + 1;
                          let c_index = code.indexOf("'", b_index);
                          const raw = code.slice(b_index, c_index);

                          const encoder = new TextEncoder();
                          const decoder = new TextDecoder();
                          const dioKey = encoder.encode(decrypt_key);
                          const header = raw.substring(0, 16);
                          const body = raw.substring(16);
                          const iv = encoder.encode(header);
                          const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
                          const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
                              name: "AES-CBC"
                          }, false, ["decrypt"]);
                          const decryptedBytes = await crypto.subtle.decrypt({
                              name: "AES-CBC",
                              iv
                          }, cryptoKey, bodyBytes);

                          const stringData = await decoder.decode(decryptedBytes);

                          const images = JSON.parse(stringData).map(({
                              url
                          }) => url);

                          return images;
                      }
                  });

膜拜大佬!

§
Posted: 19.8.2025

搜索
漫画不存在时才会出现的提示

把往下兩行的13870行
setState('comicMap'
替換成

                  setState('comicMap', '', {
                      async getImgList() {

                          setState('manga', {
                              onNext: helper.querySelectorClick('.comicContent-next a:not(.prev-null)'),
                              onPrev: helper.querySelectorClick('.comicContent-prev:not(.index,.list) a:not(.prev-null)')
                          });

                          const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

                          let a_index = code.indexOf("'") + 1;
                          let b_index = code.indexOf("'", a_index);
                          const decrypt_key = code.slice(a_index, b_index);

                          a_index = code.indexOf("contentKey");
                          b_index = code.indexOf("'", a_index) + 1;
                          let c_index = code.indexOf("'", b_index);
                          const raw = code.slice(b_index, c_index);

                          const encoder = new TextEncoder();
                          const decoder = new TextDecoder();
                          const dioKey = encoder.encode(decrypt_key);
                          const header = raw.substring(0, 16);
                          const body = raw.substring(16);
                          const iv = encoder.encode(header);
                          const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
                          const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
                              name: "AES-CBC"
                          }, false, ["decrypt"]);
                          const decryptedBytes = await crypto.subtle.decrypt({
                              name: "AES-CBC",
                              iv
                          }, cryptoKey, bodyBytes);

                          const stringData = await decoder.decode(decryptedBytes);

                          const images = JSON.parse(stringData).map(({
                              url
                          }) => url);

                          return images;
                      }
                  });

大佬,读取上次阅读记录是成功了,但是阅读模式没了。。。感觉还是有点复杂啊。。。

§
Posted: 19.8.2025
大佬,读取上次阅读记录是成功了,但是阅读模式没了。。。感觉还是有点复杂啊。。。

我自己改了後是能用的,不行的話就等作者更新。

或者可以用我的腳本先頂一下
https://sleazyfork.org/scripts/463305

hymbzAuthor
§
Posted: 14.9.2025

api不行的話,可以直接解密閱讀頁的加密變數。

const decrypt = async () => {

    // 取得代碼
    const code = [...document.scripts].find(script => script.textContent.includes("contentKey")).textContent;

    // 取得解碼key,key的變數名不固定。
    // 熱辣放在.disPass[contentkey]
    let a_index = code.indexOf("'") + 1;
    let b_index = code.indexOf("'", a_index);
    const decrypt_key = code.slice(a_index, b_index);
    console.log(decrypt_key);

    // 取得加密數據
    // 熱辣放在.disData[contentkey]
    a_index = code.indexOf("contentKey");
    b_index = code.indexOf("'", a_index) + 1;
    let c_index = code.indexOf("'", b_index);
    const raw = code.slice(b_index, c_index);
    console.log(raw);

    const encoder = new TextEncoder();
    const decoder = new TextDecoder();
    const dioKey = encoder.encode(decrypt_key);
    const header = raw.substring(0, 16);
    const body = raw.substring(16);
    const iv = encoder.encode(header);
    const bodyBytes = new Uint8Array(body.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
    const cryptoKey = await crypto.subtle.importKey("raw", dioKey, {
        name: "AES-CBC"
    }, false, ["decrypt"]);
    const decryptedBytes = await crypto.subtle.decrypt({
        name: "AES-CBC",
        iv
    }, cryptoKey, bodyBytes);

    const stringData = await decoder.decode(decryptedBytes);
    console.log(stringData);

    const images = JSON.parse(stringData).map(({
        url
    }) => url);
    console.log(images);

};
decrypt();

跟解密漫畫目錄數據的方法應該是一樣的。

非常感谢你的代码!你要是有在 github 上回复就好了,greasyfork 的评论混在一起一个不小心就会漏看,搞得我现在才看到你的代码。。。

Post reply

Sign in to post a reply.