11// ==UserScript==
22// @name ComicRead
33// @namespace ComicRead
4- // @version 11.12.0
4+ // @version 11.12.1
55// @description 为漫画站增加双页阅读、翻译等优化体验的增强功能。百合会(记录阅读历史、自动签到等)、百合会新站、动漫之家(解锁隐藏漫画)、E-Hentai(关联外站、快捷收藏、标签染色、识别广告页等)、nhentai(彻底屏蔽漫画、无限滚动)、Yurifans(自动签到)、拷贝漫画(copymanga)(显示最后阅读记录、解锁隐藏漫画)、Pixiv、PonpomuYuri、再漫画、明日方舟泰拉记事社、禁漫天堂、漫画柜(manhuagui)、漫画DB(manhuadb)、动漫屋(dm5)、绅士漫画(wnacg)、mangabz、komiic、MangaDex、NoyAcg、無限動漫、新新漫画、熱辣漫畫、hitomi、SchaleNetwork、kemono、nekohouse、welovemanga、HentaiZap、Tachidesk
66// @description:en Add enhanced features to the comic site for optimized experience, including dual-page reading and translation. E-Hentai (Associate nhentai, Quick favorite, Colorize tags, Floating tag list, etc.) | nhentai (Totally block comics, Auto page turning) | hitomi | Anchira | kemono | nekohouse | welovemanga.
77// @description:ru Добавляет расширенные функции для удобства на сайт, такие как двухстраничный режим и перевод.
@@ -9685,7 +9685,7 @@ const handleVersionUpdate = async () => {
96859685 _el$.firstChild;
96869686 web.insert(_el$, () => GM.info.script.version, null);
96879687 return _el$;
9688- })(), web.template(\`<h3>新增 \`)(), web.template(\`<ul><li><p>实现自动滚动功能 </p></li><li><p>支持 HentaiZap </p></li><li><p>ehentai 的「关联 nhentai」功能改为「关联外站」,增加关联 hitomi 的漫画\`)(), web.template(\`<h3>修复\`)(), web.template(\`<ul><li><p>调整滚动和翻页快捷键在卷轴模式下的行为,使之分别更接近方向键和 PageDown/PageUp 的表现 </p></li><li><p>修复在 pixiv 上失效的 bug \`)(), web.createComponent(solidJs.Show, {
9688+ })(), web.template(\`<h3>修复 \`)(), web.template(\`<ul><li>修复拷贝漫画加载出错的 bug (提示「請下載安裝正版之後等待1小時」的话,重新登录一下就可以了) \`)(), web.createComponent(solidJs.Show, {
96899689 get when() {
96909690 return versionLt(version, '10.8.0');
96919691 },
@@ -13022,14 +13022,33 @@ const main = require('main');
1302213022const helper = require('helper');
1302313023
1302413024
13025- const headers = {
13026- webp: '1',
13027- region: '1',
13028- 'User-Agent': 'COPY/2.0.7|',
13029- version: '2.0.7',
13030- source: 'copyApp',
13031- referer: 'com.copymanga.app-2.0.7'
13032- };
13025+ const mobileApi = new class {
13026+ headers = {
13027+ webp: '1',
13028+ region: '1',
13029+ 'User-Agent': 'COPY/2.0.7|',
13030+ version: '2.0.7',
13031+ source: 'copyApp',
13032+ referer: 'com.copymanga.app-2.0.7'
13033+ };
13034+ get = async (url, details, ...args) => main.request(url, {
13035+ responseType: 'json',
13036+ headers: this.headers,
13037+ ...details
13038+ }, ...args);
13039+ }();
13040+ const pcApi = new class {
13041+ headers = {
13042+ 'User-Agent': navigator.userAgent,
13043+ referer: location.href
13044+ };
13045+ get = async (url, details, ...args) => main.request(`https://mapi.copy20.com${url}`, {
13046+ responseType: 'json',
13047+ headers: this.headers,
13048+ fetch: false,
13049+ ...details
13050+ }, ...args);
13051+ }();
1303313052
1303413053// 在目录页显示上次阅读记录
1303513054const handleLastChapter = comicName => {
@@ -13049,11 +13068,7 @@ const handleLastChapter = comicName => {
1304913068 })();
1305013069 a.textContent = '獲取中';
1305113070 a.removeAttribute('href');
13052- const res = await main.request(`/api/v3/comic2/${comicName}/query?platform=3`, {
13053- responseType: 'json',
13054- fetch: false,
13055- headers
13056- });
13071+ const res = await pcApi.get(`/api/v3/comic2/${comicName}/query?platform=3`);
1305713072 const data = res.response?.results?.browse;
1305813073 if (!data) {
1305913074 a.textContent = data === null ? '無' : '未返回數據';
@@ -13084,11 +13099,8 @@ const buildChapters = async (comicName, hiddenType) => {
1308413099 response: {
1308513100 results
1308613101 }
13087- } = await main.request(`/comicdetail/${comicName}/chapters`, {
13088- responseType: 'json',
13089- errorText: '加載漫畫目錄失敗',
13090- headers,
13091- fetch: false
13102+ } = await mobileApi.get(`/comicdetail/${comicName}/chapters`, {
13103+ errorText: '加載漫畫目錄失敗'
1309213104 });
1309313105 // 解码 api 返回的数据
1309413106 const decryptData = async (cipher, key, iv) => {
@@ -13100,7 +13112,7 @@ const buildChapters = async (comicName, hiddenType) => {
1310013112 }, false, ['decrypt']), new Uint8Array(cipher.match(/.{1,2}/g).map(byte => Number.parseInt(byte, 16))).buffer);
1310113113 return JSON.parse(new TextDecoder().decode(decryptedBuffer));
1310213114 };
13103- const data = await decryptData(results.slice(16), unsafeWindow.dio || 'xxxmanga.woo .key', results.slice(0, 16));
13115+ const data = await decryptData(results.slice(16), unsafeWindow.dio || 'xxymanga.zzl .key', results.slice(0, 16));
1310413116 helper.log(data);
1310513117 const {
1310613118 build: {
@@ -13333,7 +13345,7 @@ const buildChapters = async (comicName, hiddenType) => {
1333313345};
1333413346(async () => {
1333513347 const token = document.cookie.split('; ').find(cookie => cookie.startsWith('token='))?.replace('token=', '');
13336- if (token) Reflect.set(headers, 'Authorization', `Token ${token}`);
13348+ if (token) Reflect.set(mobileApi. headers, 'Authorization', `Token ${token}`);
1333713349 let comicName = '';
1333813350 let id = '';
1333913351 if (window.location.href.includes('/chapter/')) [,, comicName,, id] = window.location.pathname.split('/');else if (window.location.href.includes('/comicContent/')) [,,, comicName, id] = window.location.pathname.split('/');
@@ -13348,9 +13360,7 @@ const buildChapters = async (comicName, hiddenType) => {
1334813360 if (titleDom) titleDom.textContent = 'ComicRead 提示您:你訪問的內容暫不存在,請點選右下角按鈕嘗試加載漫畫';
1334913361 setComicLoad(async () => {
1335013362 if (titleDom) titleDom.textContent = '漫畫加載中,請坐和放寬';
13351- const res = await main.request(`/api/v3/comic/${comicName}/chapter2/${id}?platform=3`, {
13352- responseType: 'json',
13353- headers,
13363+ const res = await pcApi.get(`/api/v3/comic/${comicName}/chapter2/${id}?platform=3`, {
1335413364 noCheckCode: true
1335513365 });
1335613366 if (res.status !== 200) {
@@ -13395,8 +13405,7 @@ const buildChapters = async (comicName, hiddenType) => {
1339513405 });
1339613406 const getCommentList = async () => {
1339713407 const chapter_id = window.location.pathname.split('/').at(-1);
13398- const res = await main.request(`/api/v3/roasts?chapter_id=${chapter_id}&limit=100&offset=0&_update=true`, {
13399- responseType: 'json',
13408+ const res = await pcApi.get(`/api/v3/roasts?chapter_id=${chapter_id}&limit=100&offset=0&_update=true`, {
1340013409 errorText: '获取漫画评论失败'
1340113410 });
1340213411 return res.response.results.list.map(({
@@ -13455,7 +13464,14 @@ const buildChapters = async (comicName, hiddenType) => {
1345513464 if (titleDom) {
1345613465 titleDom.textContent = 'ComicRead 提示您:你訪問的內容暫不存在,請坐和放寬,等待目錄生成';
1345713466 }
13458- await buildChapters(comicName, hiddenType);
13467+ try {
13468+ await buildChapters(comicName, hiddenType);
13469+ } catch {
13470+ if (titleDom) titleDom.textContent = 'ComicRead 提示您:目錄生成失敗😢';
13471+ main.toast.error('目錄生成失敗😢', {
13472+ duration: Number.POSITIVE_INFINITY
13473+ });
13474+ }
1345913475 }
1346013476 if (!isMobile && token) handleLastChapter(comicName);
1346113477 }
@@ -13607,9 +13623,9 @@ const buildChapters = async (comicName, hiddenType) => {
1360713623 // #[禁漫天堂](https://18comic.vip)
1360813624 case 'jmcomic-zzz.one':
1360913625 case 'jmcomic-zzz.org':
13610- case '18comic-phliu .club':
13611- case '18comic-phliu.vip ':
13612- case '18comic-phliu .cc':
13626+ case '18comic-cnye .club':
13627+ case '18comic-cnye.org ':
13628+ case '18comic-xq .cc':
1361313629 case '18comic.org':
1361413630 case '18comic.vip':
1361513631 {
0 commit comments