diff --git a/.github/ISSUE_TEMPLATE/03-autoPageRequest.yml b/.github/ISSUE_TEMPLATE/03-autoPageRequest.yml index ec1f4a675..f812450ec 100644 --- a/.github/ISSUE_TEMPLATE/03-autoPageRequest.yml +++ b/.github/ISSUE_TEMPLATE/03-autoPageRequest.yml @@ -14,12 +14,13 @@ body: > [!IMPORTANT] > ### \# 申请必读: > 1. 请先确认 **`不是动态加载内容`** 的网站(**鼠标指向页码,左下角不显示链接即代表是动态加载**),这类网站无法制作规则。 - > 2. 如 **`需要登录`** 才能看到内容,请先联系我**私下告诉账号**,否则我**无法凭空制作**翻页规则(网课类不会添加支持)。 - > 3. 请直接提供 **`具体页面的网页地址 URL`** (特别是一些**页面很多的网站**),尽量减少我的工作量,否则可能拒绝申请。 + > 2. 如 **`需要登录`** 才能看到内容(无论注册有多简单),请**告诉我账号**,否则我**无法凭空制作**翻页规则(网课类不会支持)。 + > 3. 请直接提供 **`具体页面的网页地址 URL`** (特别是一些**页面很多的网站**),尽量减少我的工作量,否则可能拒绝申请。 + > 4. 对于 **`正版小说/漫画`** 网站,因为**反爬防盗**的原因也会导致无法制作规则(该脚本本质上也是爬虫,虽然只爬取下一页,但也会被阻碍)。 + > 5. 对于 **`没有 HTTPS`** 的网站(这种网站目前全网占比极少,且大都是一些老旧网站),是不考虑添加支持的。 + > 6. 如果你要申请对 `某个博客/论坛系统` 添加支持(即通用规则,所有使用这个博客/论坛系统的网站都会支持),那么需要提供 `官方博客/论坛地址` 及 其他**几个使用该博客/论坛系统的网站地址**,用于对比、验证,才能写出通用规则。 - > - 另外,对于**正版小说/漫画**网站,因为反爬防盗的原因也会导致无法制作规则(该脚本本质上也是爬虫,虽然只爬取下一页)。 - > - 另外,对于**没有 HTTPS** 的网站(这种网站目前全网占比极少,且大都是一些老旧网站),是不考虑添加支持。 - > - 另外,如果你要申请脚本对 `某个博客/论坛系统` 添加支持(即通用规则,所有使用这个博客/论坛系统的网站都会支持),那么需要提供 `官方博客/论坛地址` 及 其他**几个使用该博客/论坛系统的网站地址**,用于对比、验证,才能写出通用规则。 + > - 对于需要登录才能看的网页,哪怕注册再简单我也不会去主动注册,你可以用一些 **`阅后即焚`** 的网站来告诉我你的账号密码(毕竟 Github 没有私信功能,你可以提前把密码改成别的,我用完了你再改回去),也可以用各种 **`在线临时邮箱`** 网站随便申请个账号给我用,但不管如何你必须提供一个账号给我才能编写规则,这是基本原则。 **** - type: input id: websitename diff --git a/Autopage.user.js b/Autopage.user.js index 491292aca..030f01e51 100644 --- a/Autopage.user.js +++ b/Autopage.user.js @@ -3,7 +3,7 @@ // @name:zh-CN 自动无缝翻页 // @name:zh-TW 自動無縫翻頁 // @name:ru Автостраничник -// @version 6.6.56 +// @version 6.6.71 // @author X.I.U // @description ⭐Append the next page content to the bottom seamlessly (like a waterfall, Unlimited scrolling, no need to manually click on the next page) ⭐, support various forums, social networking, games, comics, novels, academics, search engines (Google, Bing, Yahoo...) and other websites~ // @description:zh-CN ⭐无缝加载 下一页内容 至网页底部(类似瀑布流,无限滚动,无需手动点击下一页)⭐,目前支持:【所有「Discuz!、Flarum、phpBB、MyBB、Xiuno、XenForo、NexusPHP...」论坛】【百度、谷歌(Google)、必应(Bing)、搜狗、微信、360、Yahoo、Yandex 等搜索引擎...】、贴吧、豆瓣、知乎、NGA、V2EX、起点中文、千图网、千库网、Pixabay、Pixiv、3DM、游侠网、游民星空、NexusMods、Steam 创意工坊、CS.RIN.RU、RuTracker、BT之家、萌番组、动漫花园、樱花动漫、爱恋动漫、AGE 动漫、Nyaa、SrkBT、RARBG、SubHD、423Down、不死鸟、扩展迷、小众软件、【动漫狂、动漫屋、漫画猫、漫画屋、漫画 DB、HiComic、Mangabz、Xmanhua 等漫画网站...】、PubMed、Z-Library、GreasyFork、Github、StackOverflow(以上仅一小部分常见网站,更多的写不下了... @@ -22,9 +22,7 @@ // @connect raw.github.site // @connect raw.github.store // @connect raw.dgithub.xyz -// @connect gh-proxy.ygxz.in // @connect ghproxy.net -// @connect github.moeyy.xyz // @connect github.7boe.top // @connect github.starrlzy.cn // @connect cdn.jsdmirror.com @@ -36,6 +34,7 @@ // @connect jsd.proxy.aks.moe // @connect jsdelivr.pai233.top // @connect gh-proxy.com +// @connect hk.gh-proxy.org // @connect www.xuexiniu.com // @connect bbs.xuexiniu.com // @connect weili.ooopic.com @@ -105,8 +104,9 @@ //'https://gcore.jsdelivr.net/gh/XIU2/UserScript/other/Autopage/rules.json', 'https://fastly.jsdelivr.net/gh/XIU2/UserScript/other/Autopage/rules.json', //'https://jsd.proxy.aks.moe/gh/XIU2/UserScript/other/Autopage/rules.json', - 'https://jsdelivr.pai233.top/gh/XIU2/UserScript/other/Autopage/rules.json', + //'https://jsdelivr.pai233.top/gh/XIU2/UserScript/other/Autopage/rules.json', 'https://gh-proxy.com/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', + 'https://hk.gh-proxy.org/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', ] const urlArr2 = [ 'https://userscript.h233.eu.org/other/Autopage/rules.json', @@ -117,13 +117,11 @@ 'https://cdn.wget.la/gh/XIU2/UserScript/other/Autopage/rules.json', 'https://ghfast.top/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', //'https://raw.ixnic.net/XIU2/UserScript/master/other/Autopage/rules.json', // 解析空 - 'https://ghproxy.cfd/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', + //'https://ghproxy.cfd/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', // 超时 //'https://raw.github.site/XIU2/UserScript/master/other/Autopage/rules.json', // 挂了 //'https://raw.github.store/XIU2/UserScript/master/other/Autopage/rules.json', // 挂了 'https://raw.dgithub.xyz/XIU2/UserScript/master/other/Autopage/rules.json', - 'https://gh-proxy.ygxz.in/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', - 'https://ghproxy.net/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', - 'https://github.moeyy.xyz/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', + //'https://ghproxy.net/https://raw.githubusercontent.com/XIU2/UserScript/master/other/Autopage/rules.json', // 挂了 ], loadMoreExclude1 = ['.smzdm.com','stackoverflow.com'], loadMoreExclude2 = ['.steampowered.com','.zcool.com.cn']; @@ -327,11 +325,11 @@ } else if (getAllCSS('.entry-content .single-content img').length > 3) { DBSite.wp_article_post.pager.pageE = '.entry-content .single-content' } else if (getAllCSS('.entry-content').length == 1) { - DBSite.wp_article_post.pager.pageE = '.entry-content>*:not(.wbp-cbm):not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer)' + DBSite.wp_article_post.pager.pageE = '.entry-content>*:not(.wbp-cbm):not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer):not([class*=pagination])' } else if (getAllCSS('.article-content').length == 1) { - DBSite.wp_article_post.pager.pageE = '.article-content>*:not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer)' + DBSite.wp_article_post.pager.pageE = '.article-content>*:not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer):not([class*=pagination])' } else if (getAllCSS('article').length == 1) { - DBSite.wp_article_post.pager.pageE = 'article>*:not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer)' + DBSite.wp_article_post.pager.pageE = 'article>*:not(.page-links):not(.post-links):not(.article-paging):not(.entry-pagination):not(.pagination):not(.fenye):not(.open-message):not(#social):not(.article-social):not(.single-cat-tag):not(.single-meta):not(#fontsize):not(.clear):not(.tg-m):not(.tg-site):not(footer):not([class*=pagination])' } if (DBSite.wp_article_post.pager.pageE != undefined) console.info(`[自动无缝翻页] - 部分使用 WordPress 的网站 - 文章内`); return 11; } @@ -378,7 +376,7 @@ if (getAllCSS('.posts-wrapper.row>div>article').length > 3) { DBSite.wp_article.pager.pageE = '.posts-wrapper.row>div' } else if (getAllXpath('//div[contains(@class,"row")]/div/article').length > 3) { - DBSite.wp_article.pager.pageE = '//div[contains(@class,"row")]/div/article/parent::div' + DBSite.wp_article.pager.pageE = '//div[contains(@class,"row")]/div/article' } else if (getAllCSS('article[id^="post-"]').length > 3) { DBSite.wp_article.pager.pageE = 'article[id^="post-"]' } else if (getAllCSS('article[class]').length > 3) { @@ -419,8 +417,8 @@ console.info(`[自动无缝翻页] - <笔趣阁 1 - 手机版> 模板的小说网站`); return 201; } else if (getCSS('#txt, .txt') && getCSS('#pb_next, .url_next') && getCSS('.chapter-control, .chapter-page-btn')) { console.info(`[自动无缝翻页] - <笔趣阁 2> 模板的小说网站`); return 202; - } else if ((getCSS('meta[name="description" i][content*="小说"], meta[name="description" i][content*="章节"], meta[name="description" i][content*="阅读"], meta[name="keywords" i][content*="笔趣"]') || location.hostname.indexOf('biqu')!=-1 || document.title.match(/笔趣阁|小说|章/)!=null) && getXpath('//a[contains(text(), "下一章") or contains(text(), "下一页") or contains(text(), "下一节")]')) { - let biquge3_pageE= ['[id="chapter_content" i]','[class~="chapter_content" i]','[id="chaptercontent" i]','[class~="chaptercontent" i]','[class~="read_chapterdetail" i]','[id="booktext" i]','[class~="booktext" i]','[id="txtcontent" i]','[class~="txtcontent" i]','[id="textcontent" i]','[class~="textcontent" i]','[id="read-content" i]','[class~="read-content" i]','[id="txtnav" i]','[class~="txtnav" i]','[id="txt" i][class~="txt" i]','[id="contents" i]','[class~="contents" i]','[id="content" i]','[class~="content" i]','[id="contentbox" i]'] + } else if ((getCSS('meta[name="description" i][content*="小说"], meta[name="description" i][content*="章节"], meta[name="description" i][content*="阅读"], meta[name="description" i][content*="小說"], meta[name="description" i][content*="章節"], meta[name="description" i][content*="閲讀"], meta[name="keywords" i][content*="笔趣"]') || location.hostname.indexOf('biqu')!=-1 || document.title.match(/笔趣阁|小说|小說|章/)!=null) && getXpath('//a[contains(text(), "下一章") or contains(text(), "下一页") or contains(text(), "下一节")][not(starts-with(@href,"javascript:"))]')) { + let biquge3_pageE= ['[id="chapter_content" i]','[class~="chapter_content" i]','[id="chaptercontent" i]','[class~="chaptercontent" i]','[class~="read_chapterdetail" i]','[id="booktext" i]','[class~="booktext" i]','[id="txtcontent" i]','[class~="txtcontent" i]','[id="textcontent" i]','[class~="textcontent" i]','[id="read-content" i]','[class~="read-content" i]','[id="txtnav" i]','[class~="txtnav" i]','[id="txt" i][class~="txt" i]','[id="contents" i]','[class~="contents" i]','[id="content" i]','[class~="content" i]','[id="contentbox" i]','.container>.con'] for(let biquge3_pageE_ of biquge3_pageE) {if (getAllCSS(biquge3_pageE_).length === 1) {DBSite.biquge3.pager.pageE = biquge3_pageE_;DBSite.biquge3.pager.insertP = [biquge3_pageE_,6];DBSite.biquge3.style = biquge3_pageE_+'>.readinline, ' + DBSite.biquge3.style;break;}} if (DBSite.biquge3.pager.pageE != undefined) {console.info(`[自动无缝翻页] - <笔趣阁 3> 模板的小说网站`); return 203;} } @@ -484,7 +482,7 @@ /* inherits: 继承标识,仅用于自定义规则,用于增删改某个外置规则的部分规则时,可使用该标识来省略不需要修改的规则,只写有变化的规则 - url: 匹配到该域名后要执行的函数/正则(一般用于根据 URL 分配相应翻页规则) + url: 匹配到该域名后要执行的函数/正则(一般用于根据 URL 分配相应翻页规则,url 规则中可通过操作 rule 这个对象变量来修改当前网页实际应用的规则) urlC: 对于使用 pjax 技术的网站,需要监听 URL 变化来重新判断翻页规则(需要放在 url: 中,自定义规则的话需要使用 fun.isUrlC()) noReferer: 获取下一页内容时,不携带 Referer(部分网站携带与不携带可能不一样) @@ -987,6 +985,20 @@ function: { replaceE: '//p[@align][./font[@class="gray"]]' } }, // NexusPHP 论坛 + "必应搜索 + 手机版": { + host: ['www.bing.com','cn.bing.com','www4.bing.com','global.bing.com'], + url: ()=> {urlC = true;if (lp == '/search') {curSite = DBSite["必应搜索 + 手机版"];if (isMobile()){curSite.blank=3;curSite.pager.type=6;curSite.pager.loadTime=1500;curSite.pager.scrollD=3000;}}}, + style: '#b_footer,.b_msg,#bnp_rich_div,.cn_related_search_upsell_container', + history: true, + pager: { + nextL: 'a.sb_pagN,a.sb_halfnext,a.sb_fullnpl', + pageE: '#b_results>li.b_algo', + replaceE: '#b_results>.b_pag,#b_PagAboveFooter' + }, + function: { + bF: (pageE)=>{pageE.forEach(function (one) {getAllCSS('div.rms_iac[data-src]',one).forEach(function (one1) {one1.outerHTML = ``; }) }); return pageE} + } + }, // 必应搜索 + 手机版 为了解决部分用户/浏览器下因为 CSP 无法使用的问题,暂时先移动到内置规则 nexusmods: { host: 'www.nexusmods.com', url: ()=> {urlC = true; if (indexOF(/\/(mods|users)\/\d+/)) {if (indexOF('tab=posts','s')){curSite = DBSite.nexusmods_posts;} else if (indexOF('tab=user+files','s')){curSite = DBSite.nexusmods;}} else if (lp !== '/' && getCSS('.pagination a.page-selected')) {curSite = DBSite.nexusmods;}}, @@ -1675,8 +1687,44 @@ function: { // 翻页类型 1/3 function getPageE(url) { - if (!curSite.gmxhr) { - // 依靠原生 XMLHttpRequest 尝试解决因缺失跨域 cookie 导致的问题(比如一些使用 Cloudflare CDN 人机验证的网站,会出现脚本后台获取到人机验证页面) + // Chrome 浏览器可以依靠改用原生 XMLHttpRequest 尝试解决因缺失跨域 cookie 导致的问题(比如一些使用 Cloudflare CDN 人机验证的网站,会出现脚本后台获取到人机验证页面) + // Firefox 浏览器则需要使用 GM_xmlhttpRequest 的 cookiePartition 参数来解决(该参数要 Tampermonkey v5.2 及以上才有) + // 如果翻页规则有 curSite.gmxhr 或是 Firefox 浏览器,则依然使用 GM_xmlhttpRequest+cookiePartition,反之则使用原生 XMLHttpRequest + if (curSite.gmxhr || navigator.userAgent.includes('Firefox')) { + GM_xmlhttpRequest({ + url: url, + method: 'GET', + //overrideMimeType: 'text/html; charset=' + (document.characterSet||document.charset||document.inputEncoding), + responseType: 'arraybuffer', // Firefox 浏览器下 Tampermonkey 访问 GBK 网站时会乱码,只能改为 TextDecoder 手动转换编码 + headers: { + 'x-requested-with': (curSite.xRequestedWith === true) ? 'XMLHttpRequest':null, + 'Referer': (curSite.noReferer === true) ? null:location.href, + 'Accept': 'text/html,application/xhtml+xml,application/xml' + }, + cookiePartition: { // https://github.com/Tampermonkey/tampermonkey/issues/2057 + topLevelSite: location.origin + }, + timeout: 5000, + onload: function (response) { + try { + //console.log('URL:' + url, '最终 URL:' + response.finalUrl, '返回内容:' + response.responseText, response) + processElems(createDocumentByString((new TextDecoder((document.characterSet||document.charset||document.inputEncoding))).decode(response.response))); + //processElems(createDocumentByString(response.responseText)); + } catch (e) { + console.error('[自动无缝翻页] - 处理获取到的下一页内容时出现问题,请检查!\n', e, '\nURL:' + url, '\n最终 URL:' + response.finalUrl, '\n返回状态:' + response.statusText, '\n返回内容:' + response.responseText); + } + }, + onerror: function (response) { + console.log('URL:' + url, response) + GM_notification({text: '❌ 获取下一页失败...', timeout: 5000}); + }, + ontimeout: function (response) { + setTimeout(function(){curSite.pageUrl = '';}, 3000) + console.log('URL:' + url, response) + GM_notification({text: '❌ 获取下一页超时,可 3 秒后再次滚动网页重试(或尝试刷新网页)...', timeout: 5000}); + } + }); + } else { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/html; charset=' + (document.characterSet||document.charset||document.inputEncoding)); @@ -1704,37 +1752,9 @@ function: { GM_notification({text: '❌ 获取下一页超时,可 3 秒后再次滚动网页重试(或尝试刷新网页)...', timeout: 5000}); }; xhr.send(); - } else { - GM_xmlhttpRequest({ - url: url, - method: 'GET', - overrideMimeType: 'text/html; charset=' + (document.characterSet||document.charset||document.inputEncoding), - headers: { - 'x-requested-with': (curSite.xRequestedWith === true) ? 'XMLHttpRequest':null, - 'Referer': (curSite.noReferer === true) ? null:location.href, - 'Accept': 'text/html,application/xhtml+xml,application/xml' - }, - timeout: 5000, - onload: function (response) { - try { - //console.log('URL:' + url, '最终 URL:' + response.finalUrl, '返回内容:' + response.responseText) - processElems(createDocumentByString(response.responseText)); - } catch (e) { - console.error('[自动无缝翻页] - 处理获取到的下一页内容时出现问题,请检查!\n', e, '\nURL:' + url, '\n最终 URL:' + response.finalUrl, '\n返回状态:' + response.statusText, '\n返回内容:' + response.responseText); - } - }, - onerror: function (response) { - console.log('URL:' + url, response) - GM_notification({text: '❌ 获取下一页失败...', timeout: 5000}); - }, - ontimeout: function (response) { - setTimeout(function(){curSite.pageUrl = '';}, 3000) - console.log('URL:' + url, response) - GM_notification({text: '❌ 获取下一页超时,可 3 秒后再次滚动网页重试(或尝试刷新网页)...', timeout: 5000}); - } - }); } } + // 翻页类型 4 function getPageE_(url, type = '', method = 'GET', data = '', type2) { let mimeType,accept; @@ -1891,7 +1911,7 @@ function: { let scrollHeight = (iframe.contentWindow.document.documentElement.scrollHeight || iframe.contentWindow.document.body.scrollHeight)/10 iframe.contentWindow.scrollTo(0, 999999); iframe.contentWindow.scrollTo(0, scrollHeight*time1); - if (++time1 == 10) { + if (++time1 == 12) { clearInterval(time2); processElems(iframe.contentWindow.document); // 插入/替换元素等 pausePage = true; // 恢复翻页 @@ -2178,7 +2198,7 @@ function: { if (endP && (parseInt(nextNum) > parseInt(endP))) return '' } else { nextNum = initP; - if (endP && (parseInt(nextNum) >= parseInt(endP))) return '' + if (endP && (parseInt(nextNum) > parseInt(endP))) return '' } let url = ''; if (location.pathname) { @@ -2195,13 +2215,13 @@ function: { } // 通用型获取下一页地址(从 URL 中获取页码,并页码+1,URL 替换 page= 参数,后三个参数可以省略) function getNextUP(pf, reg, lp = location.pathname, initP = '2', endP) { - let nextNum = getSearch(pf.replace('=','')); - if (nextNum) { - nextNum = String(parseInt(nextNum)+1); - if (endP && (parseInt(nextNum) > parseInt(endP))) return '' - } else { - nextNum = initP; - if (endP && (parseInt(nextNum) >= parseInt(endP))) return '' + let nextNum = getSearch(pf.replace('=','')); // 获取参数中的 page= 值 + if (nextNum) { // 如果参数中存在 page= + nextNum = String(parseInt(nextNum)+1); // 下一页页码就是当前页码参数值 +1 + if (endP && (parseInt(nextNum) > parseInt(endP))) return '' // 如果 endP 为真且 下一页页码 大于 endP(页码最大值)则终止 + } else { // 如果参数中不存在 page= + nextNum = initP; // 因为不存在,所以一般都代表当前是位于第 1 页,那么下一页页码就设置为初始页码(默认 2) + if (endP && (parseInt(nextNum) > parseInt(endP))) return '' // 如果 endP 为真且 下一页页码 大于 endP(页码最大值)则终止 } let url = ''; if (location.search) { @@ -2422,7 +2442,7 @@ function: { } else if (curSite.blank === 5 || curSite.blank === 6) { // 清理 元素的点击事件 if (!pageE) pageE = getAll(curSite.pager.pageE) pageE.forEach(function (dd) { - getAllCSS('a[href]:not([target="_blank"]):not([onclick]):not([href^="#"]):not([href^="javascript:"])',dd).forEach(function (a) { + getAllCSS('a[href]:not([target="_blank"]):not([href^="#"]):not([href^="javascript:"])',dd).forEach(function (a) { if (a.href.slice(0,4) == 'http') { const clonedLink = a.cloneNode(true); // 克隆原 a 元素 clonedLink.target = '_blank'; // 通过添加 target="_blank" 属性来新标签页打开,可以解决大部分情况 @@ -2635,7 +2655,7 @@ function: { // "aaa" 是规则名,唯一,因为 自定义翻页规则 优先级最高,所以会覆盖同名的 外置翻页规则 // "host" 是域名,支持正则表达式(如 示例四),也可以像这样 示例三 那样写多个域名或正则表达式(当然也可以混用),如果省略,则默认匹配所有域名(会对所有域名匹配 url 规则判断,可以当成一个简单的外置/自定义通用规则的方案) -// "url" 是用来控制哪些网站中页面适用该规则,省略后代表该规则应用于全站(如果不知道写什么,那么就写 return fun.isPager() 这样脚本会默认自动匹配当前网站下存在 nextL 及 pageE 元素的网页,大部分网站是没问题的,如果改为匹配 replaceE 或者其他组合,那么请去上面的 Github Issues 里的 内置函数 中查看具体使用方法) +// "url" 是用来控制哪些网站中页面适用该规则,省略后代表该规则应用于全站(如果不知道写什么,那么就写 return fun.isPager() 这样脚本会默认自动匹配当前网站下存在 nextL 及 pageE 元素的网页,大部分网站是没问题的,如果改为匹配 replaceE 或者其他组合,那么请去上面的 Github Issues 里的 内置函数 中查看具体使用方法;另外,url 规则中可通过操作 rule 这个对象变量来修改当前网页实际应用的规则,如 rule.pager.pageE='#a' 具体示例也见 Github Issues 里) // "nextL" 是用来指定含有下一页地址的元素选择器(CSS 或 XPath 都行,一般都是 <a> 元素) // "pageE" 是指定要从下一页获取的元素选择器(也就是网页主体内容),并将其插入当前网页中同样元素的末尾 @@ -2724,7 +2744,13 @@ function: { GM_setValue('menu_customRules', customRules) location.reload(); } catch (e) { - const match = e.message.match(/at position (\d+)/),position = parseInt(match[1]); + let match = e.message.match(/at position (\d+)/),position; + if (match) { + position = parseInt(match[1]); + } else { + match = e.message.match(/line (\d+) column (\d+)/i); + position = calculatePositionFromLineColumn(customRules,match[1],match[2]) + } console.error('自定义规则存在格式错误:\n' + e.message + '\n错误位置为该区域中间:\n------\n' + customRules.slice((position<30)?0:position-30,position+29) + '\n------\n\n常见格式错误:\n1. 逗号:每组 { } 中的最后一个值末尾不能加逗号\n2. 转义:如果正则表达式中含有转义符 \\ 那就要对其再次转义为 \\\\\n3. 引号:规则中冒号左右的内容都需要加上双引号,如果内容中含有双引号则需要对双引号转义(即 \\" 这样),或改为单引号') window.alert('自定义规则存在格式错误:\n' + e.message + '\n错误位置为该区域中间:\n------\n' + customRules.slice((position<30)?0:position-30,position+29) + '\n------\n点击【确定】后脚本会为你定位并选中编辑框中格式错误的文本(部分格式错误定位可能不太精确,但错误一定是在选中文本的附近,如果是选中了行首的空格,则说明格式错误来自上一行末尾逗号)\n\n常见格式错误:\n1. 逗号:每组 { } 中的最后一个值末尾不能加逗号\n2. 转义:如果正则表达式中含有转义符 \\ 那就要对其再次转义为 \\\\\n3. 引号:规则中冒号左右的内容都需要加上双引号,如果内容中含有双引号则需要对双引号转义(即 \\" 这样),或改为单引号'); customRules_textarea.selectionStart = position-1; // 选中开始位置 @@ -2735,6 +2761,40 @@ function: { getCSS('#Autopage_customRules_cancel', shadowRoot).onclick = function () {document.documentElement.style.overflow = document.body.style.overflow = ''; getCSS('#Autopage_customRules').remove();} } + /** + * 根据行号和列号计算字符串中的 position 位置 + * @param {string} text - 完整的文本内容 + * @param {number} line - 行号(从1开始) + * @param {number} column - 列号(从1开始) + * @returns {number} position 位置(从0开始) + */ + function calculatePositionFromLineColumn(text, line, column) { + if (!text || line < 1 || column < 1) { + return -1; + } + + const lines = text.split('\n'); + + // 如果指定行超过文本行数,返回-1 + if (line > lines.length) { + return -1; + } + + let position = 0; + + // 计算前 (line-1) 行的总长度(包括换行符) + for (let i = 0; i < line - 1; i++) { + position += lines[i].length + 1; // +1 表示换行符 + } + + // 计算当前行的列位置(列号从1开始,position从0开始) + // 注意:列号不能超过当前行的长度+1(+1表示可以指向行尾) + const currentLine = lines[line - 1]; + const columnPosition = Math.min(column - 1, currentLine.length); + + return position + columnPosition; + } + // 自定义的 stringify 函数,将 [ ] 内的元素从默认的 换行显示 格式化为 一行显示,用于显示自定义翻页规则等给用户看的场景 function customStringify(obj) { return JSON.stringify(obj, null, 4) diff --git a/GithubEnhanced-High-Speed-Download.user.js b/GithubEnhanced-High-Speed-Download.user.js index 0af4b9c78..72d28a06d 100644 --- a/GithubEnhanced-High-Speed-Download.user.js +++ b/GithubEnhanced-High-Speed-Download.user.js @@ -3,7 +3,7 @@ // @name:zh-CN Github 增强 - 高速下载 // @name:zh-TW Github 增強 - 高速下載 // @name:ru Улучшение GitHub – быстрое скачивание -// @version 2.6.19 +// @version 2.6.34 // @author X.I.U // @description High-speed download of Git Clone/SSH, Release, Raw, Code(ZIP) and other files (Based on public welfare), project list file quick download (☁) // @description:zh-CN 高速下载 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (公益加速)、项目列表单文件快捷下载 (☁) @@ -15,6 +15,7 @@ // @match *://kkgithub.com/* // @match *://github.site/* // @match *://github.store/* +// @match *://bgithub.xyz/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACEUExURUxpcRgWFhsYGBgWFhcWFh8WFhoYGBgWFiUlJRcVFRkWFhgVFRgWFhgVFRsWFhgWFigeHhkWFv////////////r6+h4eHv///xcVFfLx8SMhIUNCQpSTk/r6+jY0NCknJ97e3ru7u+fn51BOTsPCwqGgoISDg6empmpoaK2srNDQ0FhXV3eXcCcAAAAXdFJOUwCBIZXMGP70BuRH2Ze/LpIMUunHkpQR34sfygAAAVpJREFUOMt1U+magjAMDAVb5BDU3W25b9T1/d9vaYpQKDs/rF9nSNJkArDA9ezQZ8wPbc8FE6eAiQUsOO1o19JolFibKCdHGHC0IJezOMD5snx/yE+KOYYr42fPSufSZyazqDoseTPw4lGJNOu6LBXVUPBG3lqYAOv/5ZwnNUfUifzBt8gkgfgINmjxOpgqUA147QWNaocLniqq3QsSVbQHNp45N/BAwoYQz9oUJEiE4GMGfoBSMj5gjeWRIMMqleD/CAzUHFqTLyjOA5zjNnwa4UCEZ2YK3khEcBXHjVBtEFeIZ6+NxYbPqWp1DLKV42t6Ujn2ydyiPi9nX0TTNAkVVZ/gozsl6FbrktkwaVvL2TRK0C8Ca7Hck7f5OBT6FFbLATkL2ugV0tm0RLM9fedDvhWstl8Wp9AFDjFX7yOY/lJrv8AkYuz7fuP8dv9izCYH+x3/LBnj9fYPBTpJDNzX+7cAAAAASUVORK5CYII= // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand @@ -34,105 +35,107 @@ (function() { 'use strict'; - var menu_rawFast = GM_getValue('xiu2_menu_raw_fast'), menu_rawFast_ID, menu_rawDownLink_ID, menu_gitClone_ID, menu_feedBack_ID; + var menu_rawFast = GM_getValue('xiu2_menu_raw_fast'), menu_rawFast_ID, menu_rawDownLink_ID, menu_gitClone_ID, menu_customUrl_ID, menu_feedBack_ID; const download_url_us = [ ['https://gh.h233.eu.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@X.I.U/XIU2] 提供'], - //['https://gh.api.99988866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [hunshcn/gh-proxy] 提供'], // 官方演示站用的人太多了 - ['https://ghproxy.1888866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'], - ['https://gh.ddlc.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@mtr-static-official] 提供'], + //['https://gh.api.99988866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/hunshcn/gh-proxy] 提供'], // 官方演示站用的人太多了 + //['https://ghproxy.1888866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'],//挂了 + ['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], + ['https://gh.ddlc.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@mtr-static-official] 提供'], // Error 1027 //['https://gh2.yanqishui.work/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@HongjieCN] 提供'], // 错误 //['https://dl.ghpig.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [feizhuqwq.com] 提供'], // ERR_SSL_VERSION_OR_CIPHER_MISMATCH //['https://gh.flyinbug.top/gh/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [Mintimate] 提供'], // 错误 - ['https://slink.ltd/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [知了小站] 提供'], //['https://gh.con.sh/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.con.sh] 提供'], // Suspent due to abuse report. //['https://ghps.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghps.cc] 提供'], // 提示 blocked - ['https://gh-proxy.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + ['https://gh-proxy.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + //['https://hk.gh-proxy.org/https://github.com', '其他', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供'], + ['https://cdn.gh-proxy.org/https://github.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + ['https://edgeone.gh-proxy.org/https://github.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], ['https://cors.isteed.cc/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@Lufs\'s] 提供'], - ['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], - ['https://down.sciproxy.com/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [sciproxy.com] 提供'], - ['https://ghproxy.cfd/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], + //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], // 域名无解析 + //['https://down.sciproxy.com/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [sciproxy.com] 提供'], // 522 + ['https://ghproxy.it/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], //['https://github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 //['https://github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 //['https://gh.jiasu.in/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 ['https://github.boki.moe/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供'], - ['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], + //['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], // 墙了 ['https://gh-proxy.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], - ['https://github.yongyong.online/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], - ['https://ghdd.862510.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], - ['https://hub.whtrys.space', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [FastGit 群组成员] 提供'], + //['https://github.yongyong.online/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], // 空白 + //['https://ghdd.862510.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], // turnstile token missing ['https://gh.jasonzeng.dev/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.jasonzeng.dev] 提供'], ['https://gh.monlor.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.monlor.com] 提供'], ['https://fastgit.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [fastgit.cc] 提供'], ['https://github.tbedu.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.tbedu.top] 提供'], - ['https://github.geekery.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.geekery.cn] 提供'], - ['https://gh-proxy.linioi.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.linioi.com] 提供'], + //['https://github.geekery.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.geekery.cn] 提供'], // 下载认证信息 用户名:123123 密 码:123123 ['https://firewall.lxstd.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [firewall.lxstd.org] 提供'], - ['https://mirrors.chenby.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [mirrors.chenby.cn] 提供'], ['https://github.ednovas.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.ednovas.xyz] 提供'], ['https://ghfile.geekertao.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghfile.geekertao.top] 提供'], - ['https://ghp.keleyaa.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghp.keleyaa.com] 提供'], - ['https://github.wuzhij.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.wuzhij.com] 提供'], - ['https://gh.cache.cloudns.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.cache.cloudns.org] 提供'], + ['https://ghp.keleyaa.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghp.keleyaa.com] 提供'], // Error 1027 + //['https://github.wuzhij.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.wuzhij.com] 提供'], // 404 ['https://gh.chjina.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.chjina.com] 提供'], ['https://ghpxy.hwinzniej.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghpxy.hwinzniej.top] 提供'], ['https://cdn.crashmc.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [cdn.crashmc.com] 提供'], - ['https://ghproxy.imciel.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghproxy.imciel.com] 提供'], + ['https://git.yylx.win/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [git.yylx.win] 提供'], ['https://gitproxy.mrhjx.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gitproxy.mrhjx.cn] 提供'], ['https://ghproxy.cxkpro.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghproxy.cxkpro.top] 提供'], ['https://gh.xxooo.cf/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.xxooo.cf] 提供'], - ['https://ghproxy.xiaopa.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghproxy.xiaopa.cc] 提供'], - ['https://gh.944446.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.944446.xyz] 提供'], ['https://github.limoruirui.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.limoruirui.com] 提供'], - ['https://api-gh.muran.eu.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [api-gh.muran.eu.org] 提供'], - ['https://gh.idayer.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.idayer.com] 提供'], - ['https://gh.zwnes.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.zwnes.xyz] 提供'], + ['https://gh.idayer.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.idayer.com] 提供'], // Error 1027 + //['https://gh.zwnes.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.zwnes.xyz] 提供'], // 超时 ['https://gh.llkk.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.llkk.cc] 提供'], ['https://down.npee.cn/?https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [npee社区] 提供'], + ['https://raw.ihtw.moe/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [raw.ihtw.moe] 提供'], + ['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], ['https://dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供'], - ['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], + //['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], // 被蔷 ['https://gh.nxnow.top/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.nxnow.top] 提供'], - ['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh-proxy.ygxz.in] 提供'], - ['https://gh.zwy.me/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.zwy.me] 提供'], + ['https://gh.zwy.one/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.zwy.one] 提供'], ['https://ghproxy.monkeyray.net/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [ghproxy.monkeyray.net] 提供'], ['https://gh.xx9527.cn/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.xx9527.cn] 提供'], - //['https://download.ixnic.net', '美国', '[美国 洛杉矶] - 该公益加速源由 [@黃埔興國] 提供'], // 解析空 //], download_url = [ // 为了缓解非美国公益节点压力(考虑到很多人无视前面随机的美国节点),干脆也将其加入随机 - ['https://ghproxy.net/https://github.com', '英国', '[英国伦敦] - 该公益加速源由 [ghproxy.net] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], + //['https://ghproxy.net/https://github.com', '英国', '[英国伦敦] - 该公益加速源由 [ghproxy.net] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], // 挂了 ['https://ghfast.top/https://github.com', '其他', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy.link] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], ['https://wget.la/https://github.com', '其他', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], - ['https://kkgithub.com', '其他', '[中国香港、日本、韩国、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], + //['https://hub.glowp.xyz/https://github.com', '其他', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], + //['https://kkgithub.com', '其他', '[中国香港、日本、韩国、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], // 404 ], clone_url = [ ['https://gitclone.com', '国内', '[中国 国内] - 该公益加速源由 [GitClone] 提供 - 缓存:有 - 首次比较慢,缓存后较快'], ['https://kkgithub.com', '香港', '[中国香港、日本、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供'], //['https://gitdl.cn/https://github.com', '香港', '[中国香港] - 该公益加速源由 [gitdl] 提供'], // 输出文件错误 //['https://gitproxy.click/https://github.com', '香港', '[中国 香港] - 该公益加速源由 [gitproxy.click] 提供'], //['https://cdn.moran233.xyz/https://github.com', '香港', '[中国 香港] - 该公益加速源由 [cdn.moran233.xyz] 提供'], + //['https://hub.glowp.xyz/https://github.com', '香港', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供'], ['https://wget.la/https://github.com', '香港', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供'], + ['https://hk.gh-proxy.org/https://github.com', '香港', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供'], ['https://ghfast.top/https://github.com', '韩国', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy] 提供'], - //['https://gh.catmak.name/https://github.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], + //['https://gh.catmak.name/https://raw.githubusercontent.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], ['https://githubfast.com', '韩国', '[韩国] - 该公益加速源由 [Github Fast] 提供'], - ['https://ghproxy.net/https://github.com', '日本', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供'], + //['https://ghproxy.net/https://github.com', '日本', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供'], // 挂了 //['https://proxy.yaoyaoling.net/https://github.com', '日本', '[日本 东京] - 该公益加速源由 [proxy.yaoyaoling.net] 提供'], //['https://g.blfrp.cn/https://github.com', '日本', '[日本 东京] - 该公益加速源由 [g.blfrp.cn] 提供'], //['https://github.3x25.com/https://github.com', '新加坡', '[新加坡] - 该公益加速源由 [github.3x25.com] 提供'], + //['https://raw.bgithub.xyz', '荷兰', '[荷兰] - 该公益加速源由 [bgithub.xyz] 提供 - 缓存:有'], //['https://ghproxy.1888866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'], - //['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], + //['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], // 墙了 //['https://gh-proxy.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], + //['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], //['https://github.yongyong.online/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], //['https://ghdd.862510.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], - //['https://slink.ltd/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [知了小站] 提供'], - //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], - //['https://gh-proxy.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://sciproxy.com/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [sciproxy.com] 提供'], - //['https://ghproxy.cfd/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], + //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], // 域名无解析 + //['https://gh-proxy.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + //['https://cdn.gh-proxy.org/https://github.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + //['https://edgeone.gh-proxy.org/https://github.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], + //['https://ghproxy.it/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], //['https://github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 //['https://github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 //['https://gh.jiasu.in/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 //['https://github.boki.moe/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供'], + //['https://raw.ihtw.moe/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [raw.ihtw.moe] 提供'], + //['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], //['https://dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供'], - //['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], + //['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], // 被蔷 //['https://hub.scholar.rr.nu', '美国', '[美国 纽约] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 - //['https://hub.whtrys.space', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [FastGit 群组成员] 提供'], ], clone_ssh_url = [ ['ssh://git@ssh.github.com:443/', 'Github 原生', '[日本、新加坡等] - Github 官方提供的 443 端口的 SSH(依然是 SSH 协议),适用于限制访问 22 端口的网络环境'], //['git@ssh.fastgit.org:', '香港', '[中国 香港] - 该公益加速源由 [FastGit] 提供'], // 挂了 @@ -142,40 +145,47 @@ ['https://raw.kkgithub.com', '香港 1', '[中国香港、日本、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供 - 缓存:有'], //['https://jsd.proxy.aks.moe/gh', '香港 2', '[中国 香港] - 该公益加速源由 [cdn.akass.cn] 提供'], // 证书错误 ['https://wget.la/https://raw.githubusercontent.com', '香港 2', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供 - 缓存:无(或很短)'], + ['https://hk.gh-proxy.org/https://raw.githubusercontent.com', '香港 3', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有(官方注明 2 小时)'], + ['https://hub.glowp.xyz/https://raw.githubusercontent.com', '香港 4', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供 - 缓存:有'], //['https://cdn.wget.la/gh', '香港 2', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供 - 缓存:无(或很短)'], - //['https://gitproxy.click/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [gitproxy.click] 提供'], - //['https://cdn.moran233.xyz/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [cdn.moran233.xyz] 提供'], + //['https://gitproxy.click/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [gitproxy.click] 提供'], // 输出错误 + //['https://cdn.moran233.xyz/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [cdn.moran233.xyz] 提供'], // 404 //['https://gitdl.cn/https://raw.githubusercontent.com', '香港 3', '[中国香港] - 该公益加速源由 [gitdl] 提供 - 缓存:有'], // 输出文件错误 ['https://ghfast.top/https://raw.githubusercontent.com', '韩国', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy.link] 提供 - 缓存:无(或很短)'], - ['https://gh.catmak.name/https://github.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], - ['https://ghproxy.net/https://raw.githubusercontent.com', '日本 1', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供 - 缓存:有(约 10 分钟)'], - ['https://fastly.jsdelivr.net/gh', '日本 2', '[日本 东京] - 该公益加速源由 [JSDelivr CDN] 提供 - 缓存:有 - 不支持大小超过 50 MB 的文件 - 不支持版本号格式的分支名(如 v1.2.3)'], - ['https://jsdelivr.pai233.top/gh', '日本 3', '[日本 东京](Vercel Anycast) - 该公益加速源由 [blog.pai233.top] 提供 - 缓存:有'], - //['https://proxy.yaoyaoling.net/https://raw.githubusercontent.com', '日本', '[日本 东京] - 该公益加速源由 [proxy.yaoyaoling.net] 提供'], - //['https://g.blfrp.cn/https://raw.githubusercontent.com', '日本', '[日本 东京] - 该公益加速源由 [g.blfrp.cn] 提供'], + ['https://gh.catmak.name/https://raw.githubusercontent.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], + //['https://ghproxy.net/https://raw.githubusercontent.com', '日本 1', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供 - 缓存:有(约 10 分钟)'], // 挂了 + ['https://fastly.jsdelivr.net/gh', '日本 1', '[日本 东京] - 该公益加速源由 [JSDelivr CDN] 提供 - 缓存:有 - 不支持大小超过 50 MB 的文件 - 不支持版本号格式的分支名(如 v1.2.3)'], + ['https://cdn.gh-proxy.org/https://raw.githubusercontent.com', '日本 2', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有'], + //['https://jsdelivr.pai233.top/gh', '日本 3', '[日本 东京](Vercel Anycast) - 该公益加速源由 [blog.pai233.top] 提供 - 缓存:有'], // This deployment is temporarily paused + //['https://proxy.yaoyaoling.net/https://raw.githubusercontent.com', '日本', '[日本 东京] - 该公益加速源由 [proxy.yaoyaoling.net] 提供'], // 空白 + ['https://g.blfrp.cn/https://raw.githubusercontent.com', '日本 3', '[日本 东京] - 该公益加速源由 [g.blfrp.cn] 提供'], ['https://github.3x25.com/https://raw.githubusercontent.com', '新加坡', '[新加坡] - 该公益加速源由 [github.3x25.com] 提供'], - //['https://raw.ixnic.net', '日本 4', '[日本 东京] - 该公益加速源由 [@黃埔興國] 提供 - 缓存:无(或很短)'], // 解析空 + //['https://raw.bgithub.xyz', '荷兰', '[荷兰] - 该公益加速源由 [bgithub.xyz] 提供 - 缓存:有'], //['https://gcore.jsdelivr.net/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [JSDelivr CDN] 提供 - 缓存:有 - 不支持大小超过 50 MB 的文件 - 不支持版本号格式的分支名(如 v1.2.3)'], // 变成 美国 Cloudflare CDN 了 //['https://jsdelivr.b-cdn.net/gh', '其他', '[中国香港、中国台湾、日本、新加坡等](CDN 不固定) - 该公益加速源由 [@rttwyjz] 提供 - 缓存:有'], // 疑似 SNI 阻断 + //['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], //['https://ghproxy.1888866.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'], - //['https://github.moeyy.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供 - 缓存:有(约 10 分钟)'], + //['https://github.moeyy.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供 - 缓存:有(约 10 分钟)'], // 墙了 //['https://gh-proxy.net/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], + //['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], //['https://github.yongyong.online/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], //['https://ghdd.862510.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], //['https://raw.cachefly.998111.xyz', '其他 4', '[新加坡、日本、印度等](Anycast CDN 不固定) - 该公益加速源由 [@XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX0] 提供 - 缓存:有(约 12 小时)'], // 证书到期 - //['https://ghproxy.cfd/https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], + //['https://ghproxy.it/https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], //['https://raw.github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], // 挂了 //['https://raw.github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], // 挂了 //['https://gh.jiasu.in/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 //['https://github.boki.moe/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供 - 缓存:无(或很短)'], - //['https://gh-proxy.com/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有'], + //['https://gh-proxy.org/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有'], + //['https://cdn.gh-proxy.org/https://raw.githubusercontent.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], + //['https://edgeone.gh-proxy.org/https://raw.githubusercontent.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], //['https://cdn.githubraw.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [githubraw.com] 提供 - 缓存:有(几乎永久)'], //['https://raw.dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供 - 缓存:无(或很短)'], - //['https://gh-proxy.ygxz.in//https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供 - 缓存:无(或很短)'], + //['https://gh-proxy.ygxz.in//https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供 - 缓存:无(或很短)'], // 被蔷 //['https://raw.nuaa.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 //['https://raw.yzuu.cf', '美国', '[美国 纽约] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 - //['https://raw.gitmirror.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供 - 缓存:无(或很短)'], - //['https://jsdelivr-cdn.prpservice.990989.xyz/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [PencilNavigator] 提供 - 缓存:有'], + //['https://hub.gitmirror.com/raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供 - 缓存:无(或很短)'], // 域名无解析 + //['https://jsdelivr-cdn.pencilnavrp.990989.xyz/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [PencilNavigator] 提供 - 缓存:有'], //['https://git.yumenaka.net/https://raw.githubusercontent.com', '美国', '[美国 圣何塞]'], // 连接超时 ], svg = [ '' @@ -184,16 +194,36 @@ if (menu_rawFast == null){menu_rawFast = 1; GM_setValue('xiu2_menu_raw_fast', 1)}; if (GM_getValue('menu_rawDownLink') == null){GM_setValue('menu_rawDownLink', true)}; if (GM_getValue('menu_gitClone') == null){GM_setValue('menu_gitClone', true)}; + // 如果自定义加速源不存在或为空则忽略,如果自定义加速源地址存在,则添加到 raw_url、clone_url 数组中 + if (GM_getValue('custom_raw_url')) {raw_url.splice(1, 0, [GM_getValue('custom_raw_url'), '自定义', '[由你自定义的 Raw 加速源] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。'])}; + if (GM_getValue('custom_clone_url')) {clone_url.unshift([GM_getValue('custom_clone_url'), '自定义', '[由你自定义的 Git Clone 加速源] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。'])}; registerMenuCommand(); // 注册脚本菜单 function registerMenuCommand() { // 如果反馈菜单ID不是 null,则删除所有脚本菜单 - if (menu_feedBack_ID) {GM_unregisterMenuCommand(menu_rawFast_ID); GM_unregisterMenuCommand(menu_rawDownLink_ID); GM_unregisterMenuCommand(menu_gitClone_ID); GM_unregisterMenuCommand(menu_feedBack_ID); menu_rawFast = GM_getValue('xiu2_menu_raw_fast');} + if (menu_feedBack_ID) {GM_unregisterMenuCommand(menu_rawFast_ID); GM_unregisterMenuCommand(menu_rawDownLink_ID); GM_unregisterMenuCommand(menu_gitClone_ID); GM_unregisterMenuCommand(menu_customUrl_ID); GM_unregisterMenuCommand(menu_feedBack_ID); menu_rawFast = GM_getValue('xiu2_menu_raw_fast');} // 避免在减少 raw 数组后,用户储存的数据大于数组而报错 if (menu_rawFast > raw_url.length - 1) menu_rawFast = 0 if (GM_getValue('menu_rawDownLink')) menu_rawFast_ID = GM_registerMenuCommand(`${['0️⃣','1️⃣','2️⃣','3️⃣','4️⃣','5️⃣','6️⃣','7️⃣','8️⃣','9️⃣','🔟'][menu_rawFast]} [ ${raw_url[menu_rawFast][1]} ] 加速源 (☁) - 点击切换`, menu_toggle_raw_fast); menu_rawDownLink_ID = GM_registerMenuCommand(`${GM_getValue('menu_rawDownLink')?'✅':'❌'} 项目列表单文件快捷下载 (☁)`, function(){if (GM_getValue('menu_rawDownLink') == true) {GM_setValue('menu_rawDownLink', false); GM_notification({text: `已关闭 [项目列表单文件快捷下载 (☁)] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_rawDownLink', true); GM_notification({text: `已开启 [项目列表单文件快捷下载 (☁)] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); menu_gitClone_ID = GM_registerMenuCommand(`${GM_getValue('menu_gitClone')?'✅':'❌'} 添加 git clone 命令`, function(){if (GM_getValue('menu_gitClone') == true) {GM_setValue('menu_gitClone', false); GM_notification({text: `已关闭 [添加 git clone 命令] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_gitClone', true); GM_notification({text: `已开启 [添加 git clone 命令] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); + menu_customUrl_ID = GM_registerMenuCommand(`#️⃣ 自定义加速源`, function () { + // 定义三种自定义加速源的键名和描述 + const customKeys = [ + { key: 'custom_raw_url', desc: 'Raw 加速源', placeholder: 'https://example.com/https://raw.githubusercontent.com' }, + { key: 'custom_clone_url', desc: 'Git Clone 加速源', placeholder: 'https://example.com/https://github.com' }, + { key: 'custom_download_url', desc: 'Release/Code(ZIP) 加速源', placeholder: 'https://example.com/https://github.com' } + ]; + // 递归弹出输入框 + function promptCustomUrl(index = 0) { + if (index >= customKeys.length) {GM_notification({ text: '自定义加速源设置已完成!\n(点击刷新网页后生效)', timeout: 3500, onclick: function () { location.reload(); } });return;} + const { key, desc, placeholder } = customKeys[index]; + let current = GM_getValue(key, ''); + let input = prompt(`请输入自定义${desc}地址:\n- 当前:\n${current || '(未设置)'}\n\n- 示例:\n${placeholder}\n\n- 留空为不设置\n- 点击 [确定] 保存 并 继续设置下一个\n- 点击 [取消] 不保存 并 终止后续设置`,current); + if (input !== null) {GM_setValue(key, input.trim());promptCustomUrl(index + 1);}// 如果用户点击 取消 按钮,则不再继续弹出 + } + promptCustomUrl(); + }); menu_feedBack_ID = GM_registerMenuCommand('💬 反馈 & 建议 [Github]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/412245/feedback', {active: true,insert: true,setParent: true});}); } @@ -260,9 +290,13 @@ // download_url 随机几个美国加速源 function get_New_download_url() { //return download_url_us // 全输出调试用 - let shuffled = download_url_us.slice(0), i = download_url_us.length, min = i - 6, temp, index; + let minnum = 6; // 随机输出几个美国加速源 + if (GM_getValue('custom_download_url')) {minnum = 5;} // 如果有自定义加速源,则只随机输出 5 个美国加速源 + let shuffled = download_url_us.slice(0), i = download_url_us.length, min = i - minnum, temp, index; while (i-- > min) {index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp;} - return shuffled.slice(min)//.concat(download_url); // 随机洗牌 download_url_us 数组并取前几个,然后将其合并至 download_url 数组 + // 如果有自定义加速源,则将其添加到随机数组的开头 + if (GM_getValue('custom_download_url')) {return [[GM_getValue('custom_download_url'), '自定义', '[由你自定义的 Release/Code(ZIP) 加速源地址] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。']].concat(shuffled.slice(min));} + return shuffled.slice(min) // 随机洗牌 download_url_us 数组并取前几个,然后将其合并至 download_url 数组 // 为了缓解非美国公益节点压力(考虑到很多人无视前面随机的美国节点),干脆也将其加入随机 } @@ -271,6 +305,7 @@ let html = document.querySelectorAll('.Box-footer'); if (html.length == 0 || location.pathname.indexOf('/releases') == -1) return let divDisplay = 'margin-left: -90px;', new_download_url = get_New_download_url(); if (document.documentElement.clientWidth > 755) {divDisplay = 'margin-top: -3px;margin-left: 8px;display: inherit;';}; // 调整小屏幕时的样式 + html[0].appendChild(document.createElement('style')).textContent = '@media (min-width: 768px) {.Box-footer li.Box-row>div>span.color-fg-muted {min-width: 27px !important;}}'; for (const current of html) { if (current.querySelector('.XIU2-RS')) continue current.querySelectorAll('li.Box-row a').forEach(function (_this) { @@ -283,7 +318,7 @@ } else { url = new_download_url[i][0] + href[1] } - _html += `${new_download_url[i][1]}` + _html += `${new_download_url[i][1]}` } _this.parentElement.nextElementSibling.insertAdjacentHTML('beforeend', _html + ''); }); @@ -313,7 +348,9 @@ url = new_download_url[i][0] + href } html_clone_a.href = url - html_clone_a.setAttribute('title', new_download_url[i][2].replaceAll(' ','\n')) + html_clone_a.setAttribute('title', new_download_url[i][2].replaceAll(' ','\n') + '\n\n提示:如果不想要点击链接在前台打开空白新标签页(一闪而过影响体验),\n可以 [鼠标中键] 或 [Ctrl+鼠标左键] 点击加速链接即可在后台打开新标签页!'); + html_clone_a.setAttribute('target', '_blank'); + html_clone_a.setAttribute('rel', 'noreferrer noopener nofollow'); html_clone_span.textContent = 'Download ZIP ' + new_download_url[i][1] _html += html_clone.outerHTML } @@ -396,7 +433,7 @@ } else { url = raw_url[i][0] + href2; } - _html += `${raw_url[i][1].replace(/ \d/,'')}` + _html += `${raw_url[i][1].replace(/ \d/,'')}` } if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()}) html.insertAdjacentHTML('afterend', _html); @@ -441,7 +478,7 @@ url = raw_url[menu_rawFast][0] + href2; } - fileElm.insertAdjacentHTML('afterend', ``); + fileElm.insertAdjacentHTML('afterend', ``); // 绑定鼠标事件 trElm.onmouseover = mouseOverHandler; trElm.onmouseout = mouseOutHandler; @@ -537,4 +574,4 @@ window.dispatchEvent(new Event('urlchange')) }); } -})(); +})(); \ No newline at end of file diff --git a/HTML5Volume.user.js b/HTML5Volume.user.js index 6bcc4388e..1938bca0f 100644 --- a/HTML5Volume.user.js +++ b/HTML5Volume.user.js @@ -3,7 +3,7 @@ // @name:zh-CN HTML5 视频音频默认音量 // @name:zh-TW HTML5 視訊音訊預設音量 // @name:ru Громкость аудио-видео в формате HTML5 по умолчанию -// @version 1.0.3 +// @version 1.0.5 // @author X.I.U // @description Avoid being startled by some video/audio with default 100% volume! And support each website to remember the volume separately... // @description:zh-CN 避免被一些默认 100% 音量的视频/音频吓一跳(或社死)!且支持各网站分别记住音量... @@ -34,12 +34,58 @@ let nowVolume = ' (跟随全局)' if (localStorage.getItem('html5_xiu_currentVolume')) nowVolume = ' [ ' + parseInt(localStorage.getItem('html5_xiu_currentVolume')) + '% ]' menu_ID[1] = GM_registerMenuCommand('🔁 忘记当前网站音量' + nowVolume, function(){resetCurrentVolume()}); - menu_ID[2] = GM_registerMenuCommand('💬 反馈 & 建议', function () {GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true}); GM_openInTab('https://greasyfork.org/zh-CN/scripts/438400/feedback', {active: true,insert: true,setParent: true});}); + // 强制当前网站使用全局音量(针对部分不支持调节音量的网站) + if (menu_forcedToEnable('check')) { // 当前网站是否已存在强制列表中 + menu_ID[2] = GM_registerMenuCommand('✅ 已强制当前网站使用全局音量 (针对不支持调节音量的)', function(){menu_forcedToEnable('del')}); + menu_ID[4] = GM_registerMenuCommand('#️⃣ 修改当前网站默认音量 (针对不支持调节音量的)', function(){customCurrentDefaultVolume()}); + } else { + menu_ID[2] = GM_registerMenuCommand('❌ 未强制当前网站使用全局音量 (针对不支持调节音量的)', function(){menu_forcedToEnable('add')}); + } + menu_ID[3] = GM_registerMenuCommand('💬 反馈 & 建议', function () {GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true}); GM_openInTab('https://greasyfork.org/zh-CN/scripts/438400/feedback', {active: true,insert: true,setParent: true});}); } insPage(); currentPage(); + // 强制当前网站使用全局音量(针对部分不支持调节音量的网站) + function menu_forcedToEnable(type) { + switch(type) { + case 'check': + if(check()) return true + return false + break; + case 'add': + add(); + break; + case 'del': + del(); + break; + } + + function check() { // 存在返回真,不存在返回假 + let websiteList = GM_getValue('menu_forcedToEnable',[]); // 读取网站列表 + if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假 + return true + } + + function add() { + if (check()) return + let websiteList = GM_getValue('menu_forcedToEnable',[]); // 读取网站列表 + websiteList.push(location.host); // 追加网站域名 + GM_setValue('menu_forcedToEnable', websiteList); // 写入配置 + location.reload(); // 刷新网页 + } + + function del() { + if (!check()) return + let websiteList = GM_getValue('menu_forcedToEnable',[]), // 读取网站列表 + index = websiteList.indexOf(location.host); + websiteList.splice(index, 1); // 删除网站域名 + GM_setValue('menu_forcedToEnable', websiteList); // 写入配置 + location.reload(); // 刷新网页 + } + } + // 网页本身的 Video Audio 标签 function currentPage() { @@ -88,12 +134,16 @@ // 判断该视频/音频元素是否已监听事件 function isFirstEvent(target) { - if (!target.controls) return; // 如果视频/音频已经有了自己的控件(即没有使用 HTML5 默认的控件),则退出 + if (!menu_forcedToEnable('check')) { // 如果未强制当前网站使用全局音量(针对部分不支持调节音量的网站) + if (!target.controls) return; // 如果视频/音频已经有了自己的控件(即没有使用 HTML5 默认的控件),则退出 + } modifyVolume(target); - // 如果没有该属性,则代表是还未监听事件 - if (target.dataset.html5VolumeXiu != 'true') { - target.dataset.html5VolumeXiu = 'true' - target.addEventListener('volumechange', volumeChangeEvent); + if (!menu_forcedToEnable('check')) { // 如果未强制当前网站使用全局音量(针对部分不支持调节音量的网站),毕竟不支持音量调节的网站监听音量变化是没有意义的,反而可能会被网站默认静音什么的搞乱 + // 如果没有该属性,则代表是还未监听事件 + if (target.dataset.html5VolumeXiu != 'true') { + target.dataset.html5VolumeXiu = 'true' + target.addEventListener('volumechange', volumeChangeEvent); + } } } @@ -111,8 +161,18 @@ // 修改全局默认音量 function customDefaultVolume() { - let newValue = parseFloat(prompt('修改全局默认音量,不影响各网站记住的音量,当前网页需刷新后生效~\n范围:0~100 (即 0%~100%,不需要加 % 百分号)\n默认:30', GM_getValue('menu_defaultVolume', 30))); + let newValue = parseFloat(prompt('修改全局默认音量,不影响各网站记住的音量,修改后当前网页立即生效~\n范围:0~100 (即 0%~100%,不需要加 % 百分号)\n默认:30', GM_getValue('menu_defaultVolume', 30))); if (!Number.isNaN(newValue) && newValue >= 0 && newValue <= 100) {GM_setValue('menu_defaultVolume', newValue);} + currentPage(); // 重置当前网页的音量 + registerMenuCommand(); // 重新注册菜单(刷新菜单上的音量值) + } + + + // 修改当前网站默认音量 (针对不支持调节音量的网站) + function customCurrentDefaultVolume() { + let newValue = parseFloat(prompt('修改当前网站默认音量 (针对不支持调节音量的网站),修改后立即生效~\n范围:0~100 (即 0%~100%,不需要加 % 百分号)\n默认:全局默认音量', localStorage.getItem('html5_xiu_currentVolume') || GM_getValue('menu_defaultVolume', 30))); + if (!Number.isNaN(newValue) && newValue >= 0 && newValue <= 100) {localStorage.setItem('html5_xiu_currentVolume', newValue);} + currentPage(); // 重置当前网页的音量 registerMenuCommand(); // 重新注册菜单(刷新菜单上的音量值) } @@ -121,5 +181,6 @@ function resetCurrentVolume() { if (localStorage.getItem('html5_xiu_currentVolume')) localStorage.removeItem('html5_xiu_currentVolume') // 清理 localStorage currentPage(); // 重置当前网页的音量 + registerMenuCommand(); // 重新注册菜单(刷新菜单上的音量值) } })(); diff --git a/Hostloc-Enhanced.user.js b/Hostloc-Enhanced.user.js index 4ab680d1c..2a8b2aaca 100644 --- a/Hostloc-Enhanced.user.js +++ b/Hostloc-Enhanced.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 全球主机交流论坛增强 -// @version 1.4.9 +// @version 1.5.2 // @author X.I.U // @description 自动签到(访问空间 +22 积分)、屏蔽用户(黑名单)、屏蔽关键词(帖子标题)、回帖小尾巴、自动无缝翻页、快捷回到顶部(右键网页两侧空白处)、收起预览帖子(左键网页两侧空白处)、屏蔽投票贴、快速添加链接、屏蔽阅读权限 255 帖子、预览帖子快速回复带签名、显示是否在线、显示帖子内隐藏回复 // @match *://hostloc.com/* @@ -20,8 +20,7 @@ // @supportURL https://github.com/XIU2/UserScript // @homepageURL https://github.com/XIU2/UserScript // ==/UserScript== - -(function() { +(function () { 'use strict'; var menu_ALL = [ ['menu_autoSignIn', '自动签到(22 积分)', '自动签到', true], @@ -35,48 +34,45 @@ ['menu_delate255', '屏蔽阅读权限 255 帖子', '屏蔽阅读权限 255 帖子', true], ['menu_delatePolls', '屏蔽投票帖子', '屏蔽投票帖子', false] ], menu_ID = []; - for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 - for (let i=0;i menu_ALL.length) { // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 + for (let i = 0; i < menu_ID.length; i++) { GM_unregisterMenuCommand(menu_ID[i]); } } - for (let i=0;i -1) { // 帖子内 if (menu_value('menu_thread_pageLoading')) { @@ -161,6 +151,7 @@ showPosts(); // 自动显示帖子内被隐藏的回复 blockUsers('thread'); // 屏蔽用户(黑名单) onlineStatus(); // 显示是否在线 + addBlockButton(); // 添加屏蔽按钮 replyCustom('thread'); // 回复自定义 } else if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1) { // 各板块帖子列表 curSite = DBSite.forum; @@ -172,28 +163,25 @@ vfastpostDOMNodeInserted(); // 监听插入事件(预览快速回复带签名) replyCustom('forum'); // 回复自定义 if (patt_forum.test(location.pathname)) blockDOMNodeInserted(); //监听插入事件(有新的回复主题,点击查看) - }else if (location.search.indexOf('mod=guide') > -1) { // 导读帖子列表 + } else if (location.search.indexOf('mod=guide') > -1) { // 导读帖子列表 curSite = DBSite.guide; - } else if(location.pathname === '/search.php') { // 搜索结果列表 + } else if (location.pathname === '/search.php') { // 搜索结果列表 curSite = DBSite.search; blockUsers('search'); // 屏蔽用户(黑名单) - } else if(location.pathname === '/home.php' && location.search.indexOf('mod=space&do=notice&view=mypost') > -1) { // 消息(帖子/点评/提到) + } else if (location.pathname === '/home.php' && location.search.indexOf('mod=space&do=notice&view=mypost') > -1) { // 消息(帖子/点评/提到) blockUsers('notice'); // 屏蔽用户(黑名单) - } else if(location.pathname === '/home.php' && location.search.indexOf('mod=space&do=pm') > -1) { // 消息(私人聊天) + } else if (location.pathname === '/home.php' && location.search.indexOf('mod=space&do=pm') > -1) { // 消息(私人聊天) blockUsers('pm'); // 屏蔽用户(黑名单) - } else if(location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { // 别人的主题/回复 + } else if (location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { // 别人的主题/回复 curSite = DBSite.youreply; - } else if(location.pathname === '/forum.php' && location.search.indexOf('mod=post&action=reply') > -1 || location.pathname === '/forum.php' && location.search.indexOf('mod=post&action=newthread') > -1) { // 回复:高级回复 + } else if (location.pathname === '/forum.php' && location.search.indexOf('mod=post&action=reply') > -1 || location.pathname === '/forum.php' && location.search.indexOf('mod=post&action=newthread') > -1) { // 回复:高级回复 replyCustom('reply'); // 回复自定义 } - curSite.pageUrl = ""; // 下一页URL pageLoading(); // 自动翻页 - backToTop(); // 回到顶部(右键点击左右两侧空白处) - if(menu_value('menu_autoSignIn')) autoSignIn(); // 自动签到(访问空间 10 次 = 20 积分) + backToTop(); // 回到顶部(右键点击左右两侧空白处) + if (menu_value('menu_autoSignIn')) autoSignIn(); // 自动签到(访问空间 10 次 = 20 积分) //replyIntervalDOMNodeInserted(); // 监听插入事件(回帖间隔) - - // 自动签到(访问空间 10 次 = 20 积分 + 当天首次访问论坛 2 积分) function autoSignIn() { if (!loginStatus) return @@ -201,13 +189,13 @@ timeOld = GM_getValue('menu_signInTime'); if (!timeOld || timeOld != timeNow) { // 是新的一天 GM_setValue('menu_signInTime', timeNow); // 写入签到时间以供后续比较 - GM_notification({text: '请不要关闭/刷新本页!耐心等待 60 秒~\n在此期间可以在 "其他标签页" 浏览论坛!', timeout: 10000}); + GM_notification({ text: '请不要关闭/刷新本页!耐心等待 60 秒~\n在此期间可以在 "其他标签页" 浏览论坛!', timeout: 10000 }); let url_list = [], url = 0; // 随机生成 12 个空间地址(2 个冗余) - for(let i = 0;i < 12;i++){url_list[i] = "https://" + location.host + "/space-uid-" + Math.floor(Math.random()*(50000-10000+1)+10000) + ".html";} + for (let i = 0; i < 12; i++) { url_list[i] = "https://" + location.host + "/space-uid-" + Math.floor(Math.random() * (50000 - 10000 + 1) + 10000) + ".html"; } // 每 5 秒访问一次(避免触发网站防御机制,而且还可以适当浏览论坛) - let signIn = setInterval(function(){ + let signIn = setInterval(function () { GM_xmlhttpRequest({ url: url_list[url++], method: 'GET', @@ -217,25 +205,21 @@ if (url === 11) { // 次数够了就取消定时循环 clearInterval(signIn); console.log('[全球主机交流论坛 增强] 签到完成!'); - GM_notification({text: '签到完成!积分 +22 ~', timeout: 3500}); + GM_notification({ text: '签到完成!积分 +22 ~', timeout: 3500 }); } }, 5000); } } - - // 重新签到 function reAutoSignIn() { GM_setValue('menu_signInTime', '1970/1/1'); // 设置为比当前日期更早 location.reload(); // 刷新网页 } - - // 自定义屏蔽用户 function customBlockUsers() { let nowBlockUsers = ''; - GM_getValue('menu_customBlockUsers').forEach(function(item){nowBlockUsers += '|' + item}) - let newBlockUsers = prompt('编辑 [自定义屏蔽用户],刷新网页后生效\n(不同用户名之间使用 "|" 分隔,\n(例如:用户A|用户B|用户C,如果只有一个就不需要 "|" 了。', nowBlockUsers.replace('|','')); + GM_getValue('menu_customBlockUsers').forEach(function (item) { nowBlockUsers += '|' + item }) + let newBlockUsers = prompt('编辑 [自定义屏蔽用户],刷新网页后生效\n(不同用户名之间使用 "|" 分隔,\n(例如:用户A|用户B|用户C,如果只有一个就不需要 "|" 了。', nowBlockUsers.replace('|', '')); if (newBlockUsers === '') { GM_setValue('menu_customBlockUsers', []); registerMenuCommand(); // 重新注册脚本菜单 @@ -244,12 +228,10 @@ registerMenuCommand(); // 重新注册脚本菜单 } }; - - // 屏蔽用户 function blockUsers(type) { if (!menu_value('menu_customBlockUsers') || menu_value('menu_customBlockUsers').length < 1) return - switch(type) { + switch (type) { case 'thread': // 帖子内 blockUsers_('[id^="post_"]', 'a[href^="space-uid"]'); blockUsers_('[id^="comment_"] > div', 'a.xi2.xw1'); // 点评 @@ -269,10 +251,9 @@ blockUsers_('dl[id^="pmlist_"]', '.ptm.pm_c a[href^="space-uid"]'); break; } - function blockUsers_(list1, list2, type) { - document.querySelectorAll(list1).forEach(function(item){ // 遍历所有帖子 - menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 + document.querySelectorAll(list1).forEach(function (item) { // 遍历所有帖子 + menu_value('menu_customBlockUsers').forEach(function (item1) { // 遍历用户黑名单 let itemName = item.querySelector(list2); // 寻找用户名 if (itemName) { if (type && type === 1 && itemName.textContent.split(' ')[0] === item1) { // 回复引用 @@ -286,12 +267,11 @@ }) }) } - function blockUsers_vfastpost() { let vfastpost = e => { if (e.target.nodeType == 1 && e.target.outerHTML && e.target.outerHTML.indexOf('class="fastpreview"') > -1) { - e.target.querySelectorAll('.bm_c > [id^="post_"]').forEach(function(item){ // 遍历所有回复 - menu_value('menu_customBlockUsers').forEach(function(item1){ // 遍历用户黑名单 + e.target.querySelectorAll('.bm_c > [id^="post_"]').forEach(function (item) { // 遍历所有回复 + menu_value('menu_customBlockUsers').forEach(function (item1) { // 遍历用户黑名单 let itemName = item.querySelector('a.xi2'); // 寻找用户名 if (itemName && itemName.textContent === item1) { console.log(`屏蔽用户:${item1}`); @@ -309,13 +289,11 @@ document.addEventListener('DOMNodeInserted', vfastpost); // 监听插入事件 } } - - // 自定义屏蔽关键词(帖子标题) function customBlockKeywords() { let nowBlockKeywords = ''; - GM_getValue('menu_customBlockKeywords').forEach(function(item){nowBlockKeywords += '|' + item}) - let newBlockKeywords = prompt('编辑 [自定义屏蔽关键词],刷新网页后生效\n(不同关键词之间使用 "|" 分隔,\n(例如:助力|互助|互点,如果只有一个就不需要 "|" 了。', nowBlockKeywords.replace('|','')); + GM_getValue('menu_customBlockKeywords').forEach(function (item) { nowBlockKeywords += '|' + item }) + let newBlockKeywords = prompt('编辑 [自定义屏蔽关键词],刷新网页后生效\n(不同关键词之间使用 "|" 分隔,\n(例如:助力|互助|互点,如果只有一个就不需要 "|" 了。', nowBlockKeywords.replace('|', '')); if (newBlockKeywords === '') { GM_setValue('menu_customBlockKeywords', []); registerMenuCommand(); // 重新注册脚本菜单 @@ -324,13 +302,11 @@ registerMenuCommand(); // 重新注册脚本菜单 } }; - - // 屏蔽关键词(帖子标题) function blockKeywords() { if (!menu_value('menu_customBlockKeywords') || menu_value('menu_customBlockKeywords').length < 1) return - document.querySelectorAll('[id^="normalthread_"]').forEach(function(item){ // 遍历所有帖子标题 - menu_value('menu_customBlockKeywords').forEach(function(item1){ // 遍历关键词 + document.querySelectorAll('[id^="normalthread_"]').forEach(function (item) { // 遍历所有帖子标题 + menu_value('menu_customBlockKeywords').forEach(function (item1) { // 遍历关键词 let itemName = item.querySelector('a.s.xst'); // 寻找帖子标题 if (itemName && itemName.textContent.toLowerCase().indexOf(item1.toLowerCase()) > -1) { console.log(`屏蔽关键词:[${item1}]`, `,帖子标题:[${itemName.textContent}]`); @@ -339,8 +315,6 @@ }) }) } - - // 监听插入事件(有新的回复主题,点击查看) function blockDOMNodeInserted() { let block = e => { @@ -353,8 +327,6 @@ } document.addEventListener('DOMNodeInserted', block); // 监听插入事件 } - - // 监听插入事件(预览快速回复带签名) function vfastpostDOMNodeInserted() { let vfastpost = e => { @@ -364,8 +336,6 @@ } document.addEventListener('DOMNodeInserted', vfastpost); // 监听插入事件 } - - // 自定义小尾巴内容 function customLittleTail() { let newLittleTail = prompt('编辑 [自定义小尾巴内容],刷新网页后生效(换行请使用 \\n\n提示①:记得在小尾巴前面加上几个 \\n 换行,用来分隔开回帖内容~\n提示②:建议使用 [align=right] 标签来使小尾巴居右~\n提示③:支持论坛富文本标签(建议先找个回复编辑预览好~\n示例:\\n\\n\\n\\n[align=right]第一行内容~\\n第二行内容~[/align]', GM_getValue('menu_customLittleTail')); @@ -377,11 +347,9 @@ registerMenuCommand(); // 重新注册脚本菜单 } }; - - // 回复自定义 function replyCustom(type) { - switch(type) { + switch (type) { case 'forum': // 各版块帖子列表的预览帖子 replyCustom_0(); // 预览帖子 快速回复(底部) replyCustom_1(); // 预览帖子 回复(悬浮) @@ -394,26 +362,24 @@ replyCustom_3(); break; } - function replyCustom_0() { let vfastpost = e => { if (e.target.nodeType == 1 && e.target.innerHTML && e.target.innerHTML.indexOf('id="vfastpost"') > -1) { let message = e.target.querySelector('input[name="message"]'), id = message.id.match(/\d+/g)[0]; message.parentNode.innerHTML = `` - document.getElementById(`vreplysubmit_${id}`).onclick = function(){ + document.getElementById(`vreplysubmit_${id}`).onclick = function () { if (GM_getValue('menu_customLittleTail')) document.getElementById(`vmessage_${id}`).value += GM_getValue('menu_customLittleTail').replaceAll('\\n', '\n'); } } } document.addEventListener('DOMNodeInserted', vfastpost); // 监听插入事件 } - function replyCustom_1() { let floatlayout_reply = e => { if (e.target.nodeType == 1 && e.target.innerHTML && e.target.innerHTML.indexOf('id="floatlayout_reply"') > -1) { // 快速回复(悬浮)中添加 URL 按钮 document.querySelector('#floatlayout_reply .fbld').insertAdjacentHTML('afterend', `URL`); - document.getElementById('postsubmit').onclick = function(){ + document.getElementById('postsubmit').onclick = function () { if (GM_getValue('menu_customLittleTail')) document.getElementById('postmessage').value += GM_getValue('menu_customLittleTail').replaceAll('\\n', '\n'); } } @@ -422,24 +388,20 @@ // 快速发帖(各版块帖子列表底部)中添加 URL 按钮 document.querySelector('#fastposteditor .fbld').insertAdjacentHTML('afterend', `URL`); } - function replyCustom_2() { // 帖子底部的回复框 - document.getElementById('fastpostsubmit').onclick = function(){ + document.getElementById('fastpostsubmit').onclick = function () { if (GM_getValue('menu_customLittleTail')) document.getElementById('fastpostmessage').value += GM_getValue('menu_customLittleTail').replaceAll('\\n', '\n'); } } - function replyCustom_3() { let postsubmit = document.getElementById('postsubmit'); if (postsubmit && postsubmit.textContent === '\n参与/回复主题\n' || postsubmit && postsubmit.textContent === '\n发表帖子\n') { - postsubmit.onclick = function(){ + postsubmit.onclick = function () { if (GM_getValue('menu_customLittleTail')) document.getElementById('e_textarea').value += GM_getValue('menu_customLittleTail').replaceAll('\\n', '\n'); } } } } - - // 监听插入事件(回帖间隔) /*function replyIntervalDOMNodeInserted() { let replyInterval = e => { @@ -449,72 +411,113 @@ } document.addEventListener('DOMNodeInserted', replyInterval); // 监听插入事件 }*/ - - // 自动显示帖子内被隐藏的回复 function showPosts() { - if(menu_value('menu_showhide')){ + if (menu_value('menu_showhide')) { let showposts = document.querySelector('#hiddenpoststip a'); - if (showposts){ // 如果存在 + if (showposts) { // 如果存在 showposts.click(); } } } - - // 隐藏帖子内的 [下一页] 按钮 function hidePgbtn() { document.lastChild.appendChild(document.createElement('style')).textContent = '.pgbtn {display: none;}'; } - - // 快捷回到顶部(右键左右两侧空白处) function backToTop() { - document.body.oncontextmenu = function(event){ + document.body.oncontextmenu = function (event) { if (event.target == this) { event.preventDefault(); - window.scrollTo(0,0) + window.scrollTo(0, 0) } } } - - // 收起帖子预览(左键左右两侧空白处) function collapsedNowPost() { - document.body.onclick = function(event){ + document.body.onclick = function (event) { if (event.target == this) { document.querySelectorAll('[id^="threadPreviewTR_"] .closeprev').forEach(function (el) { if (!el.parentElement.querySelector('[name="message"]') || el.parentElement.querySelector('[name="message"]').value === '' && !document.getElementById('fwin_reply')) { // 避免快速回复过程中误点收起了 let parentElement = el.parentElement.parentElement.parentElement.parentElement.parentElement, top = parentElement.offsetTop + parentElement.offsetParent.offsetTop + parentElement.offsetParent.offsetParent.offsetTop; // 元素距离顶部的高度 - if (top < document.documentElement.scrollTop) window.scrollTo(0,top) // 帖子标题在上面时才会滚动到该帖子处 + if (top < document.documentElement.scrollTop) window.scrollTo(0, top) // 帖子标题在上面时才会滚动到该帖子处 el.click() } }); } } } - - // 显示在线状态 function onlineStatus() { - document.querySelectorAll('[id^="favatar"]').forEach(function(item){ // 遍历所有帖子 + document.querySelectorAll('[id^="favatar"]').forEach(function (item) { // 遍历所有帖子 if (item.querySelector('[id^="userinfo"] > .i.y em')) { let icon = (item.querySelector('[id^="userinfo"] > .i.y em').textContent === '当前在线') ? '🌝' : '🌚'; let divStatus = document.createElement('div'); - divStatus.style = 'position: absolute;margin: -8px 0 0 8px;padding: 0 1px 1.2px;background-color: #ffffff;border-radius: 50%;'; + divStatus.style = 'position: absolute;margin: -8px 0 0 8px;padding: 0px 1px;background-color: #ffffff;border-radius: 50%;z-index: 302;'; divStatus.textContent = icon; let mochu = item.querySelector('.avatar'); - mochu.parentNode.insertBefore(divStatus,mochu); + mochu.parentNode.insertBefore(divStatus, mochu); } }) } + // 添加屏蔽按钮 + function addBlockButton() { + document.querySelectorAll('[id^="favatar"]').forEach(function (item) { // 遍历所有帖子 + let usernameLink = item.querySelector('a[href^="space-uid"]'); + if (usernameLink) { + const username = usernameLink.textContent, avatar = item.querySelector('.avatar'); + if (avatar && !avatar.parentNode.querySelector('.XIU-block-button')) { + // 创建屏蔽按钮 + let blockButton = document.createElement('div'); + blockButton.className = 'XIU-block-button'; + blockButton.title = `屏蔽用户: ${username}`; + blockButton.textContent = '🚫'; + blockButton.style.cssText = 'position: absolute;margin: -8px 0px 0px 8px;padding: 0px 0.5px;top: 0px;right: 10px;background-color: #F26C4F;border-radius: 50%;cursor: pointer;z-index: 302;box-shadow: 0 2px 4px rgba(0,0,0,0.2);transition: all 0.3s ease;'; + + // 鼠标悬停效果 + if (!document.getElementById('XIU-block-style')) { + let blockStyle = document.createElement('style'); + blockStyle.id = 'XIU-block-style'; + document.documentElement.appendChild(blockStyle).textContent = '.XIU-block-button:hover{transform: scale(1.2);background-color: #ff6666;}' + } + // 点击事件 + blockButton.addEventListener('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + + if (confirm(`确定要将用户 "${username}" 添加到黑名单吗?\n添加后该用户发布的任何内容都会被屏蔽`)) { + let blockList = GM_getValue('menu_customBlockUsers') || []; + if (!blockList.includes(username)) { + blockList.push(username); + GM_setValue('menu_customBlockUsers', blockList); + GM_notification({ text: `已将用户 "${username}" 添加到黑名单!\n刷新页面后生效。`, timeout: 3000 }); + + // 立即隐藏当前用户的帖子 + let postElement = item.closest('[id^="post_"]'); + if (postElement) { + postElement.style.opacity = '0.5'; + postElement.style.transition = 'opacity 0.5s ease'; + setTimeout(() => { postElement.hidden = true; }, 500); + } + } else { + GM_notification({ text: `用户 "${username}" 已在黑名单中!`, timeout: 2000 }); + } + } + }); + // 将按钮添加到头像旁边 + avatar.parentNode.style.position = 'relative'; + avatar.parentNode.appendChild(blockButton); + } + } + }); + } // 屏蔽阅读权限 255 的帖子 function delate255() { if (!menu_value('menu_delate255')) return - if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1){ + if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1) { document.querySelectorAll('tbody[id^="normalthread_"] .xw1').forEach(function (_this) { if (_this.textContent === '255') { _this.parentNode.parentNode.parentNode.hidden = true; @@ -522,32 +525,28 @@ }) } } - - // 屏蔽投票贴 function delatePolls() { if (!menu_value('menu_delatePolls')) return - if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1){ + if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1) { document.querySelectorAll('tbody[id^="normalthread_"] .icn>a>img[alt="投票"]').forEach(function (_this) { - _this.parentNode.parentNode.parentNode.parentNode.hidden = true; + _this.parentNode.parentNode.parentNode.parentNode.hidden = true; }) } } - - // 自动翻页 function pageLoading() { if (!menu_value('menu_pageLoading')) return - if (curSite.SiteTypeID > 0){ + if (curSite.SiteTypeID > 0) { windowScroll(function (direction, e) { if (direction === 'down') { // 下滑才准备翻页 let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + 999) { if (curSite.SiteTypeID === SiteType.FORUM) { // 如果是各版块帖子列表则直接点下一页就行了 let autopbn = document.querySelector('#autopbn'); - if (autopbn && autopbn.textContent === "下一页 »"){ // 如果已经在加载中了,就忽略 + if (autopbn && autopbn.textContent === "下一页 »") { // 如果已经在加载中了,就忽略 autopbn.click(); - let timer = setInterval(function(){ // 在下一页加载完成后 + let timer = setInterval(function () { // 在下一页加载完成后 if (document.querySelector('#autopbn').textContent === '下一页 »') { delate255(); // 屏蔽 255 权限帖子 delatePolls(); // 屏蔽投票贴子 @@ -565,12 +564,10 @@ }); } } - - // 滚动条事件 function windowScroll(fn1) { var beforeScrollTop = document.documentElement.scrollTop, - fn = fn1 || function () {}; + fn = fn1 || function () { }; setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件 window.addEventListener('scroll', function (e) { var afterScrollTop = document.documentElement.scrollTop, @@ -581,31 +578,29 @@ }, false); }, 1000) } - - // 修改自 https://greasyfork.org/scripts/14178 , https://github.com/machsix/Super-preloader var ShowPager = { getFullHref: function (e) { - if (e != null && e.nodeType === 1 && e.href && e.href.slice(0,4) === 'http') return e.href; + if (e != null && e.nodeType === 1 && e.href && e.href.slice(0, 4) === 'http') return e.href; return ''; }, createDocumentByString: function (e) { if (e) { if ('HTML' !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, 'application/xhtml+xml'); var t; - try { t = (new DOMParser).parseFromString(e, 'text/html');} catch (e) {} + try { t = (new DOMParser).parseFromString(e, 'text/html'); } catch (e) { } if (t) return t; if (document.implementation.createHTMLDocument) { t = document.implementation.createHTMLDocument('ADocument'); } else { - try {((t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)), t.documentElement.appendChild(t.createElement('head')), t.documentElement.appendChild(t.createElement('body')));} catch (e) {} + try { ((t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)), t.documentElement.appendChild(t.createElement('head')), t.documentElement.appendChild(t.createElement('body'))); } catch (e) { } } if (t) { var r = document.createRange(), n = r.createContextualFragment(e); r.selectNodeContents(document.body); t.body.appendChild(n); - for (var a, o = { TITLE: !0, META: !0, LINK: !0, STYLE: !0, BASE: !0}, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a); + for (var a, o = { TITLE: !0, META: !0, LINK: !0, STYLE: !0, BASE: !0 }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a); return t; } } else console.error('没有找到要转成 DOM 的字符串'); @@ -614,8 +609,8 @@ if (curSite.pager) { let curPageEle = document.querySelector(curSite.pager.nextLink); var url = this.getFullHref(curPageEle); - if(url === '') return; - if(curSite.pageUrl === url) return;// 不会重复加载相同的页面 + if (url === '') return; + if (curSite.pageUrl === url) return;// 不会重复加载相同的页面 curSite.pageUrl = url; // 读取下一页的数据 curSite.pager.startFilter && curSite.pager.startFilter(); @@ -632,9 +627,12 @@ let addTo = "beforeend"; if (curSite.pager.HT_insert[1] == 1) addTo = 'beforebegin'; // 插入新页面元素 - pageElems.forEach(function (one) {toElement.insertAdjacentElement(addTo, one);}); + pageElems.forEach(function (one) { toElement.insertAdjacentElement(addTo, one); }); // 屏蔽用户(黑名单) - if (patt_thread.test(location.pathname) || location.search.indexOf('mod=viewthread') > -1) {blockUsers('thread');} else if (location.pathname === '/search.php') {blockUsers('search');} + if (patt_thread.test(location.pathname) || location.search.indexOf('mod=viewthread') > -1) { + blockUsers('thread'); + addBlockButton(); // 添加屏蔽按钮 + } else if (location.pathname === '/search.php') { blockUsers('search'); } delate255(); // 屏蔽 255 权限帖子 delatePolls(); // 屏蔽投票贴子 // 替换待替换元素 diff --git a/Lanzou-Enhanced.user.js b/Lanzou-Enhanced.user.js index f0a30b9ef..ed8e63cd4 100644 --- a/Lanzou-Enhanced.user.js +++ b/Lanzou-Enhanced.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 蓝奏云网盘增强 -// @version 1.5.6 +// @version 1.5.8 // @author X.I.U // @description 文件排序、刷新不回根目录、快捷返回上一级(右键网页空白处)、后退返回上一级、右键文件显示菜单、点击直接下载文件、点击空白进入目录、自动显示更多文件、一键复制所有分享链接、自定义分享链接域名、自动打开/复制分享链接、带密码的分享链接自动输密码、拖入文件自动显示上传框、输入密码后回车确认、优化编辑框初始大小 // @match *://lanzou.com/u @@ -52,6 +52,7 @@ // @match *://*.lanzj.com/* // @match *://*.lanzl.com/* // @match *://*.lanzm.com/* +// @match *://*.lanzn.com/* // @match *://*.lanzo.com/* // @match *://*.lanzp.com/* // @match *://*.lanzq.com/* @@ -347,10 +348,10 @@ if (iframe) { // 只有找到 iframe 框架时才会继续运行脚本 iframe = iframe.contentWindow; let timer = setInterval(function(){ - if (iframe.document.querySelector('.load>[href]')) { - //iframe.document.querySelector('.load>a[href]').target = '_top' - //iframe.document.querySelector('.load>a[href]').click(); - GM_openInTab(iframe.document.querySelector('.load>a[href]').href, {active: false, insert: true, setParent: false}); // 后台打开 + if (iframe.document.querySelector('.load [href]')) { + //iframe.document.querySelector('.load a[href]').target = '_top' + //iframe.document.querySelector('.load a[href]').click(); + GM_openInTab(iframe.document.querySelector('.load a[href]').href, {active: false, insert: true, setParent: false}); // 后台打开 clearInterval(timer); // 关闭该后台标签页 if (GM_info.scriptHandler === 'Violentmonkey') { // Violentmonkey 需要延迟一会儿 diff --git a/README.md b/README.md index 2aa0477e8..d59032f38 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ ## 脚本列表 -> _详细的**脚本介绍、使用说明、截图演示**等信息,请点击 **\[安装\]** 前往 GreasyFork 查看~_ +> _详细的**脚本介绍、使用说明、截图演示**等信息,请点击 **`[安装]`** 查看~(或去本项目 [Wiki](https://github.com/XIU2/UserScript/wiki) 查看_ | | 脚本名称 | 脚本功能 | 安装 \| 备用 | | :----: | :---- | :---- | :----: | @@ -33,7 +33,7 @@ | [](https://www.52pojie.cn) | **吾爱破解论坛 美化** | 精简多余内容、样式优化 | **[安装](https://greasyfork.org/zh-CN/scripts/412681)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/52pojie-Beautification.user.js)** | | [](https://www.52pojie.cn) | **吾爱破解论坛 增强** | **自动签到**、自动无缝翻页、屏蔽导读悬赏贴 (最新发表页)... | **[安装](https://greasyfork.org/zh-CN/scripts/412680)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/52pojie-Enhanced.user.js)** | | [](https://hostloc.com) | **全球主机交流论坛 增强 \*** | **自动访问空间(22积分)、屏蔽用户**、屏蔽关键词、自动翻... | **[安装](https://greasyfork.org/zh-CN/scripts/414005)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Hostloc-Enhanced.user.js)** | -| [](https://store.steampowered.com) | **Steam 创意工坊大图 修复** | 修复 Steam 创意工坊预览大图无法显示的问题 | **[安装](https://bitbucket.org/xiu2/userscript/raw/master/SteamWorkshopImageRepair.user.js)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/SteamWorkshopImageRepair.user.js)** | +| [](https://store.steampowered.com) | **Steam 创意工坊大图 修复** | 修复 Steam 创意工坊预览大图无法显示的问题 | **[安装](https://github.com/XIU2/UserScript/wiki/Steam-%E5%88%9B%E6%84%8F%E5%B7%A5%E5%9D%8A%E5%A4%A7%E5%9B%BE-%E4%BF%AE%E5%A4%8D)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/SteamWorkshopImageRepair.user.js)** | | [](https://github.com/XIU2) | **HTML5 视频音频默认音量** | 避免被 100% 音量**吓一跳**!且支持各网站分别记住音量... | **[安装](https://greasyfork.org/zh-CN/scripts/438400)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/HTML5Volume.user.js)** | | [](https://github.com/XIU2) | **右键滚动条回到顶部** | 鼠标**右键**网页右侧的**滚动条**即可**回到顶部** | **[安装](https://greasyfork.org/zh-CN/scripts/506959)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/RightClick_ScrollBar_BackToTop.user.js)** | | [](https://github.com/XIU2) | **新标签页打开链接 \*** | 将网页中所有链接改为**新标签页打开**(可能存在兼容问题 | **[安装](https://greasyfork.org/zh-CN/scripts/429714)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/TargetBlank.user.js)** | @@ -49,10 +49,10 @@ ## 如何安装/使用脚本? -要使用任何脚本,首先需要浏览器安装 **Tampermonkey 脚本管理器扩展([Chrome](https://pan.lanpw.com/b073l8d1e)** / **[Firefox](https://addons.mozilla.org/firefox/addon/tampermonkey/)** / **[Edge](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd?hl=zh-CN))。** +要使用任何脚本,首先需要浏览器安装 **Tampermonkey 脚本管理器扩展([Chrome](https://xiu.lanzoub.com/b073l8d1e)** / **[Firefox](https://addons.mozilla.org/firefox/addon/tampermonkey/)** / **[Edge](https://microsoftedge.microsoft.com/addons/detail/tampermonkey/iikmkjmpaadaobahmlepeloendndfphd?hl=zh-CN))。** -- 点击表格 **\[安装\]** 进入 GreasyFork 网页,点击 **\[安装脚本\]** 后弹出扩展提示,再点击 **\[安装\]** 即可。 -- 如果 GreasyFork 访问速度太慢,可以选择点击 **\[备用\]** 后弹出扩展提示,再去点击 **\[安装\]** 即可。 +- 点击表格 **`[安装]`** 进入脚本介绍页,点击 **`[安装此脚本]`** 后弹出扩展提示,再点击 **`[安装]`** 即可。 +- 如果 GreasyFork 访问速度太慢,可以选择点击 **`[备用]`** 后弹出扩展提示,再去点击 **`[安装]`** 即可。 > [!IMPORTANT] > - _其他基于 **Chromium** 内核的浏览器(如国内套皮浏览器)一般都可以使用 Chrome 扩展。_ @@ -78,12 +78,22 @@ Tampermonkey 为了顺应 Chrome 的 Manifest V3 要求,在 v5.0.0 版本中 **** +## 新版本 Chrome 系浏览器无法运行任何脚本? + +新版本需要在**扩展管理**界面 Tampermonkey(篡改猴) 详情中**启用 `允许运行用户脚本`** 才能正常运行脚本! + +**** + ## 如果脚本帮到你的话就 "打赏" 一下吧~🎉✨ ![微信赞赏](https://github.com/XIU2/XIU2/blob/master/img/zs-01.png)![支付宝赞赏](https://github.com/XIU2/XIU2/blob/master/img/zs-02.png) **** +## Sponsor + +Powered by DartNode + ## License The GPL-3.0 License. \ No newline at end of file diff --git a/Zhihu-Beautification.user.js b/Zhihu-Beautification.user.js index fdc846182..584671e36 100644 --- a/Zhihu-Beautification.user.js +++ b/Zhihu-Beautification.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 知乎美化 -// @version 1.5.12 +// @version 1.5.20 // @author X.I.U // @description 宽屏显示、暗黑模式(4种)、暗黑模式跟随浏览器、屏蔽首页活动广告、隐藏文章开头大图、调整图片最大高度、向下翻时自动隐藏顶栏 // @match *://www.zhihu.com/* @@ -44,6 +44,8 @@ } registerMenuCommand(); addStyle(); + // 向下翻时自动隐藏顶栏 + if (menu_value('menu_hideTitle')) setTimeout(hideTitle, 2000); // 注册脚本菜单 function registerMenuCommand() { @@ -138,8 +140,10 @@ .zhihuE_SettingRoot .zhihuE_SettingHeader {padding: 10px 20px;color: #fff;font-weight: bold;background-color: #3994ff;border-radius: 3px 3px 0 0;} .zhihuE_SettingRoot .zhihuE_SettingMain {padding: 10px 20px;border-radius: 0 0 3px 3px;} .zhihuE_SettingHeader span {float: right;cursor: pointer;} -.zhihuE_SettingMain input {margin: 10px 6px 10px 0;cursor: pointer;vertical-align:middle} -.zhihuE_SettingMain label {margin-right: 20px;user-select: none;cursor: pointer;vertical-align:middle} +.zhihuE_SettingMain input {margin: 10px 6px 10px 0;vertical-align:middle;} +.zhihuE_SettingMain input[type=text] {margin: 5px 6px 5px 0;padding-block: 0;} +.zhihuE_SettingMain input[name=zhihuE_Setting_Checkbox] {cursor: pointer;} +.zhihuE_SettingMain label {margin-right: 20px;user-select: none;cursor: pointer;vertical-align:middle;} .zhihuE_SettingMain hr {border: 0.5px solid #f4f4f4;} [data-theme="dark"] .zhihuE_SettingRoot {color: #adbac7;background-color: #343A44;} [data-theme="dark"] .zhihuE_SettingHeader {color: #d0d0d0;background-color: #2D333B;} @@ -150,7 +154,7 @@ if (line) _br = '
' for (let i=0; i${menu[i][2]}:${_br}` + _html += `${_br}` } else if (GM_getValue(menu[i][0])) { _html += `${_br}` } else { @@ -160,15 +164,20 @@ _html += `` document.body.insertAdjacentHTML('beforeend', _html); // 插入网页末尾 setTimeout(function() { // 延迟 100 毫秒,避免太快 + const doc = document.querySelector('.zhihuE_SettingBackdrop_1'); + if (!doc) return // 关闭按钮 点击事件 - document.querySelector('.zhihuE_SettingClose').onclick = function(){this.parentElement.parentElement.parentElement.remove();document.querySelector('.zhihuE_SettingStyle').remove();} + doc.querySelector('.zhihuE_SettingClose').onclick = function(){this.parentElement.parentElement.parentElement.remove();document.querySelector('.zhihuE_SettingStyle').remove();} // 点击周围空白处 = 点击关闭按钮 - document.querySelector('.zhihuE_SettingBackdrop_2').onclick = function(event){if (event.target == this) {document.querySelector('.zhihuE_SettingClose').click();};} + doc.querySelector('.zhihuE_SettingBackdrop_2').onclick = function(event){if (event.target == this) {document.querySelector('.zhihuE_SettingClose').click();};} // 复选框 点击事件 - document.getElementsByName('zhihuE_Setting_Checkbox').forEach(function (checkBox) { + doc.querySelectorAll('input[name=zhihuE_Setting_Checkbox]').forEach(function (checkBox) { checkBox.addEventListener('click', function(){if (this.checked) {GM_setValue(this.value, true);} else {GM_setValue(this.value, false);}}); }) - document.getElementsByName('menu_widescreenDisplayWidth')[0].onchange = function(){GM_setValue(this.name, this.value);}; + // 输入框 变化事件 + doc.querySelectorAll('input[type=text]').forEach(function (checkBox) { + checkBox.onchange = function(){GM_setValue(this.name, this.value);}; + }) }, 100) } @@ -203,41 +212,52 @@ html[data-theme=light] .AppHeader-notifications:not([aria-label=通知])>div:fir `, style_widescreenDisplayIndex = `/* 宽屏显示 - 首页 */ .Topstory-mainColumn, .QuestionWaiting-mainColumn {width: inherit !important;} -.Topstory-mainColumn+div,[data-za-detail-view-path-module="RightSideBar"] {display: none !important;} +.Topstory-mainColumn~div,[data-za-detail-view-path-module="RightSideBar"] {display: none !important;} .Topstory-container {width: ${GM_getValue('menu_widescreenDisplayWidth')}px;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.Topstory-container {width: 97% !important;}} `, style_widescreenDisplayQuestion = `/* 宽屏显示 - 问题页 */ .Question-mainColumn, .ListShortcut, .QuestionWaiting-mainColumn {width: inherit !important;} .Question-mainColumn+div,[data-za-detail-view-path-module="RightSideBar"], .Question-sideColumn, .GlobalSideBar {display: none !important;} .QuestionWaiting-mainColumn {margin-right: 0 !important;} .Question-main {width: ${GM_getValue('menu_widescreenDisplayWidth')}px;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.Question-main {width: auto !important;}} +@media only screen and (max-width: ${GM_getValue('menu_widescreenDisplayWidth')-100}px) {.Question-main {width: 98.5% !important;}} .AuthorInfo {max-width: 100% !important;} `, style_widescreenDisplaySearch = `/* 宽屏显示 - 搜索页 */ .SearchMain, .ContentLayout-mainColumn, .Club-mainColumn, .Post-mainColumn, [data-za-detail-view-path-module=TopicItem]>div:first-child {width: inherit !important;} .SearchMain+div, .ContentLayout-sideColumn, .Card.QuestionHeaderTopicMeta, .ClubSideBar, [data-za-detail-view-path-module=TopicItem]>div:not(:first-child) {display: none !important;} .Search-container, .ContentLayout, .Club-container, .Post-container, [data-za-detail-view-path-module=TopicItem] {width: ${GM_getValue('menu_widescreenDisplayWidth')}px;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.Search-container, .ContentLayout, .Club-container, .Post-container, [data-za-detail-view-path-module=TopicItem] {width: 97.5% !important;}} `, style_widescreenDisplayCollection = `/* 宽屏显示 - 收藏页 */ .CollectionsDetailPage-mainColumn {width: inherit !important;} -.CollectionsDetailPage-mainColumn+div, {display: none !important;} +.CollectionsDetailPage-mainColumn+div {display: none !important;} .CollectionsDetailPage {width: ${GM_getValue('menu_widescreenDisplayWidth')}px;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.CollectionsDetailPage {width: 98.5% !important;}} `, style_widescreenDisplayPost = `/* 宽屏显示 - 文章页 */ +.Post-content {min-width: auto !important;} .Post-SideActions {left: calc(10vw) !important;} -.Post-NormalMain .Post-Header, .Post-NormalMain>div, .Post-NormalSub>div {width: ${GM_getValue('menu_widescreenDisplayWidth')}px !important;} +.Post-Row-Content-right {display: none !important;} +.Post-Row-Content, .Post-Row-Content-left, .RichContent-actions {width: ${GM_getValue('menu_widescreenDisplayWidth')}px !important;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.Post-Row-Content, .Post-Row-Content-left, .RichContent-actions {width: auto !important;}} +@media only screen and (max-width: ${GM_getValue('menu_widescreenDisplayWidth')-100}px) {.Post-Row-Content, .Post-Row-Content-left, .RichContent-actions {width: 98% !important;}} `, style_widescreenDisplayPeople = `/* 宽屏显示 - 用户主页 */ .Profile-mainColumn {width: inherit !important;} .Profile-mainColumn+div,[data-za-module="RightSideBar"],.Profile-sideColumn {display: none !important;} .Profile-main, #ProfileHeader {width: ${GM_getValue('menu_widescreenDisplayWidth')}px !important;} +@media only screen and (max-width: ${Number(GM_getValue('menu_widescreenDisplayWidth'))+50}px) {.Profile-main, #ProfileHeader {width: auto !important;}} +@media only screen and (max-width: ${GM_getValue('menu_widescreenDisplayWidth')-100}px) {.Profile-main, #ProfileHeader {width: 98.5% !important;}} `, style_2 = `/* 隐藏在各列表中查看文章时开头显示的大图,不影响文章、专栏页面 */ .RichContent img.ArticleItem-image {display: none !important;} `, - style_3 = `/* 向下翻时自动隐藏顶栏*/ -header.is-hidden {display: none;} -`, +// style_3 = `/* 向下翻时自动隐藏顶栏*/ +//header.is-hidden {display: none;} +//`, style_4 = `/* 调整图片最大高度 */ .ztext .content_image, .ztext .origin_image, .GifPlayer img {max-height: 500px !important;width: auto !important;} `, @@ -273,6 +293,9 @@ html[data-theme=dark] .LinkCard-backdrop {background-image: url() !important;} html[data-theme=dark] .Avatar, html[data-theme=dark] .UserAvatar {background-color: #2d333b !important;} html[data-theme=dark] .UserAvatar {border: 4px solid #2d333b !important;} +/* 划词提示文字和背景颜色 */ +html[data-theme=dark] .css-fg13ww {color: #adbac7 !important; background-color: #363d47 !important; border-radius: 10px !important;} + /* 通知信息中点评论链接时,在弹出的评论框中 "高亮" 目标评论 */ html[data-theme=dark] .CommentItemV2[tabindex='-1'] {background-color: #343a44 !important;} @@ -308,7 +331,7 @@ html[data-theme=dark] img.UserCover-image, html[data-theme=dark] img.TitleImage /* 其他图片 */ html[data-theme=dark] img {opacity: 0.8 !important;} /* GIF 动图、放大图除外 */ -html[data-theme=dark] .GifPlayer img, html[data-theme=dark] .ImageView-img {opacity: 1 !important;} +html[data-theme=dark] .GifPlayer img, html[data-theme=dark] .ImageView-img, html[data-theme=dark]>body>img {opacity: 1 !important;} /* 边框 */ html[data-theme=dark] .Topbar, html[data-theme=dark] .CommentsV2-footer, html[data-theme=dark] .Topstory-mainColumnCard .Card:not(.Topstory-tabCard), html[data-theme=dark] .NestComment:not(:last-child):after, html[data-theme=dark] .NestComment--rootComment:after, html[data-theme=dark] .NestComment .NestComment--child:after, html[data-theme=dark] .NestComment .NestComment--child:after, html[data-theme=dark] .CommentsV2-replyNum, html[data-theme=dark] .CommentItemV2:not(:first-child):after, html[data-theme=dark] .Tabs, html[data-theme=dark] .Popover-arrow:after, html[data-theme=dark] .SelfCollectionItem-innerContainer, html[data-theme=dark] .CollectionDetailPageItem-innerContainer {border-bottom: 1px solid #282d35 !important;} @@ -334,7 +357,7 @@ html {scrollbar-width: thin; scrollbar-color: #3f4752 #22272e;} .MessagesBox, .Messages-list, .PushNotifications-list, .CommentListV2, .ChatListGroup-SectionContent, .ChatSideBar-Search-ResultListWrap {scrollbar-width: thin; scrollbar-color: #3f4752 #2D333B;} /* 背景颜色 - 专栏/文章 */ -html[data-theme=dark] .WhiteBg-body, html[data-theme=dark] .Post-content {background: #22272E !important;} +html[data-theme=dark] .WhiteBg-body, html[data-theme=dark] .Post-content, html[data-theme=dark] .Post-Row-Content .Post-Row-Content-left {background: #22272E !important;} html[data-theme=dark] .ColumnPageHeader, html[data-theme=dark] .BottomInfo {background: #1c2129 !important;} /* 按钮颜色 */ @@ -350,6 +373,9 @@ html[data-theme=dark] .Reward-TipjarDialog-amountList .Button--red, html[data-th /* 赞同 */ html[data-theme=dark] .VoteButton.is-active {color: #d6edff !important;} + +/* 创作中心 - 分析图表 */ +html[data-theme=dark] .CreatorSection-body .AnalyticsChart text {fill: #adbac7 !important;} `, style_darkMode_1_x = `/* 问题日志页 */ html[data-theme=dark] .zu-top {background: #2D333B !important;border: none !important;} @@ -460,8 +486,6 @@ html {filter: brightness(65%) sepia(30%) !important; background-image: url();} if (menu_value('menu_picHeight')) style += style_4; // 隐藏文章开头大图 if (menu_value('menu_postimg')) style += style_2; - // 向下翻时自动隐藏顶栏 - if (menu_value('menu_hideTitle')) style += style_3; if (document.lastChild) { document.lastChild.appendChild(style_Add).textContent = style; @@ -475,6 +499,27 @@ html {filter: brightness(65%) sepia(30%) !important; background-image: url();} } } + function hideTitle() { + // 获取需要控制的元素 + const floatingElement = document.getElementsByTagName('header')[0]; + let beforeScrollTop = document.documentElement.scrollTop || document.body.scrollTop, + scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop, + scrollHeight = window.innerHeight || document.documentElement.clientHeight + + window.addEventListener('scroll', function (e) { + var afterScrollTop = document.documentElement.scrollTop || document.body.scrollTop, + delta = afterScrollTop - beforeScrollTop; + //console.log(delta,floatingElement) + if (delta == 0) return false; + if (delta > 0) {// 向下滚动 隐藏 + floatingElement.hidden = true; + } else { + // 向上滚动 显示 + floatingElement.hidden = false; + } + beforeScrollTop = afterScrollTop; + }, false); + } // 获取知乎 Cookie 中的主题类型 function getTheme() { diff --git a/Zhihu-Enhanced.user.js b/Zhihu-Enhanced.user.js index c9b3b673e..f33be9ca2 100644 --- a/Zhihu-Enhanced.user.js +++ b/Zhihu-Enhanced.user.js @@ -3,11 +3,11 @@ // @name:zh-CN 知乎增强 // @name:zh-TW 知乎增強 // @name:ru Улучшение Zhihu -// @version 2.3.12 +// @version 2.3.25 // @author X.I.U // @description A more personalized Zhihu experience~ -// @description:zh-CN 屏蔽指定类别(视频、盐选、文章、想法、关注[赞同了XX/关注了XX]等等)、屏蔽用户、屏蔽关键词、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回到顶部(右键两侧)、区分问题文章、移除高亮链接、净化搜索热门、净化标题消息、展开问题描述、显示问题作者、默认高清原图(无水印)、置顶显示时间、完整问题时间、直达问题按钮、默认站外直链... -// @description:zh-TW 屏蔽指定類別(視頻、鹽選、文章、想法、關注[贊同了XX/關注了XX]等等)、屏蔽用戶、屏蔽關鍵詞、默認收起回答、快捷收起回答/評論、快捷回到頂部、區分問題文章、移除高亮鏈接、默認高清原圖(無水印)、默認站外直鏈... +// @description:zh-CN 移除登录弹窗、屏蔽指定类别(视频、盐选、文章、想法、关注[赞同/关注了XX]等)、屏蔽低赞/低评回答、屏蔽用户、屏蔽关键词、默认收起回答、快捷收起回答/评论(左键两侧)、快捷回到顶部(右键两侧)、区分问题文章、移除高亮链接、净化搜索热门、净化标题消息、展开问题描述、显示问题作者、默认高清原图(无水印)、置顶显示时间、完整问题时间、直达问题按钮、默认站外直链... +// @description:zh-TW 移除登錄彈窗、屏蔽指定類別(視頻、鹽選、文章、想法、關注[贊同/關注了XX]等)、屏蔽低贊/低評回答、屏蔽用戶、屏蔽關鍵詞、默認收起回答、快捷收起回答/評論、快捷回到頂部、區分問題文章、移除高亮鏈接、默認高清原圖(無水印)、默認站外直鏈... // @description:ru Более персонализированный опыт пользования сайтом Zhihu~ // @match *://www.zhihu.com/* // @match *://zhuanlan.zhihu.com/* @@ -36,6 +36,13 @@ var menu_ALL = [ ['menu_collapsedAnswer', '一键收起回答/评论', '一键收起回答/评论', true], ['menu_collapsedNowAnswer', '快捷收起回答/评论 (点击两侧空白处)', '快捷收起回答/评论', true], ['menu_backToTop', '快捷回到顶部 (右键两侧空白处)', '快捷回到顶部', true], + ['menu_blockLowCount', '屏蔽低赞低评', '设置要屏蔽 低于多少赞同/评价 的回答(默认不需要留空即可)
(例如设置 0 则无人赞同/评价的回答会被屏蔽
(例如设置 20 则赞同/评价数量低于 20 的回答会被屏蔽
(修改后,后续加载的回答会立即生效,但不影响当前网页已有内容', ''], + ['menu_blockLowUpvoteCount', '最低赞同数 [首页]', '最低赞同数(首页)', ''], + ['menu_blockLowCommentCount', '最低评价数 [首页]', '最低评价数(首页)', ''], + ['menu_blockLowUpvoteCountQuestion', '最低赞同数 [问题页]', '最低赞同数(问题页)', ''], + ['menu_blockLowCommentCountQuestion', '最低评价数 [问题页]', '最低评价数(问题页)', ''], + ['menu_blockLowUpvoteCountFollow', '最低赞同数 [关注页]', '最低赞同数(关注页)', ''], + ['menu_blockLowCommentCountFollow', '最低评价数 [关注页]', '最低评价数(关注页)', ''], ['menu_blockUsers', '屏蔽指定用户', '屏蔽指定用户', true], ['menu_customBlockUsers', '自定义屏蔽用户', '自定义屏蔽用户', ['故事档案局', '盐选推荐', '盐选科普', '盐选成长计划', '知乎盐选会员', '知乎盐选创作者', '盐选心理', '盐选健康必修课', '盐选奇妙物语', '盐选生活馆', '盐选职场', '盐选文学甄选', '盐选作者小管家', '盐选博物馆', '盐选点金', '盐选测评室', '盐选科技前沿', '盐选会员精品']], ['menu_blockKeywords', '屏蔽指定关键词', '屏蔽指定关键词', true], @@ -73,7 +80,12 @@ function registerMenuCommand() { } for (let i=0;i

${tips}


` if (line) _br = '
' for (let i=0; i${menu[i][1]}${_br}` + if (menu[i][0].indexOf('menu_blockLow') === 0) { + _html += `${_br}` + } else if (GM_getValue(menu[i][0])) { + _html += `${_br}` } else { - _html += `${_br}` + _html += `${_br}` } } _html += `` document.body.insertAdjacentHTML('beforeend', _html); // 插入网页末尾 setTimeout(function() { // 延迟 100 毫秒,避免太快 + const doc = document.querySelector('.zhihuE_SettingBackdrop_1'); + if (!doc) return // 关闭按钮 点击事件 - document.querySelector('.zhihuE_SettingClose').onclick = function(){this.parentElement.parentElement.parentElement.remove();document.querySelector('.zhihuE_SettingStyle').remove();} + doc.querySelector('.zhihuE_SettingClose').onclick = function(){this.parentElement.parentElement.parentElement.remove();document.querySelector('.zhihuE_SettingStyle').remove();} // 点击周围空白处 = 点击关闭按钮 - document.querySelector('.zhihuE_SettingBackdrop_2').onclick = function(event){if (event.target == this) {document.querySelector('.zhihuE_SettingClose').click();};} + doc.querySelector('.zhihuE_SettingBackdrop_2').onclick = function(event){if (event.target == this) {document.querySelector('.zhihuE_SettingClose').click();};} // 复选框 点击事件 - document.getElementsByName('zhihuE_Setting').forEach(function (checkBox) { - checkBox.addEventListener('click', function(){if (this.checked) {GM_setValue(this.value, true);} else {GM_setValue(this.value, false);}}); + doc.querySelectorAll('input[name=zhihuE_Setting_Checkbox]').forEach(function (checkBox) { + checkBox.addEventListener('click', function(){if (this.checked) {console.log('this.value',true);GM_setValue(this.value, true);} else {console.log('this.value',false);GM_setValue(this.value, false);}}); + }) + // 输入框 变化事件 + doc.querySelectorAll('input[type=text]').forEach(function (checkBox) { + checkBox.onchange = function(){GM_setValue(this.name, this.value);}; }) }, 100) } @@ -423,6 +445,71 @@ function isElementInViewport_(el) { } +// 屏蔽低赞/低评回答 +function blockLowCount(type) { + switch(type) { + case 'index': + blockLowCount_('.Card.TopstoryItem.TopstoryItem-isRecommend', 'Card TopstoryItem TopstoryItem-isRecommend', 'menu_blockLowUpvoteCount', 'menu_blockLowCommentCount'); + break; + case 'follow': + blockLowCount_('.Card.TopstoryItem.TopstoryItem-isFollow', 'Card TopstoryItem TopstoryItem-isFollow', 'menu_blockLowUpvoteCountFollow', 'menu_blockLowCommentCountFollow'); + break; + case 'question': + blockLowCount_('.List-item', 'List-item', 'menu_blockLowUpvoteCountQuestion', 'menu_blockLowCommentCountQuestion'); + break; + } + + + function blockLowCount_(className1, className2, menuUpvote, menuComment) { + // 前几条因为是直接加载的,而不是动态插入网页的,所以需要单独判断 + function blockLowCount_now() { + document.querySelectorAll(className1).forEach(function(item1){ + blockLowCount_1(item1,menuUpvote,'meta[itemprop=upvoteCount]'); + blockLowCount_1(item1,menuComment,'meta[itemprop=commentCount]'); + }) + } + + blockLowCount_now(); + window.addEventListener('urlchange', function(){ + setTimeout(blockLowCount_now, 1000); // 网页 URL 变化后再次执行 + }) + + // 这个是监听网页插入事件,用来判断后续网页动态插入的元素 + const callback = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.className === className2) { + blockLowCount_1(target,menuUpvote,'meta[itemprop=upvoteCount]'); + blockLowCount_1(target,menuComment,'meta[itemprop=commentCount]'); + } + } + } + }; + const observer = new MutationObserver(callback); + observer.observe(document, { childList: true, subtree: true }); + } + + + function blockLowCount_1(item1, menu, css) { + if (GM_getValue(menu)) { + let item = item1.querySelector(css); + //console.log(item) + if (item && item.content && Number(item.content) < Number(GM_getValue(menu))) { + if (menu.indexOf('Upvote') !== -1) { + console.log('已屏蔽低赞回答:', item.content + '<' + GM_getValue(menu), item1, type); + } else { + console.log('已屏蔽低评回答:', item.content + '<' + GM_getValue(menu), item1, type); + } + item1.hidden = true; + item1.style.display = 'none'; + } + } + } +} + + + // 自定义屏蔽用户 function customBlockUsers() { let nowBlockUsers = ''; @@ -447,6 +534,9 @@ function blockUsers(type) { case 'index': blockUsers_('.Card.TopstoryItem.TopstoryItem-isRecommend', 'Card TopstoryItem TopstoryItem-isRecommend'); break; + case 'follow': + blockUsers_('.Card.TopstoryItem.TopstoryItem-isFollow', 'Card TopstoryItem TopstoryItem-isFollow'); + break; case 'question': blockUsers_question(); break; @@ -1115,6 +1205,8 @@ function addTypeTips() { let style = `font-weight: bold;font-size: 13px;padding: 1px 4px 0;border-radius: 2px;display: inline-block;vertical-align: top;margin: ${(location.pathname === '/search') ? '2' : '4'}px 4px 0 0;` document.body.appendChild(document.createElement('style')).textContent = `/* 区分问题文章 */ .AnswerItem .ContentItem-title a:not(.zhihu_e_toQuestion)::before {content:'问题';color: #f68b83;background-color: #f68b8333;${style}} +/* 针对的是部分搜索词下搜索页开头的 "最新讨论" 之类的非常规元素 */ +.HotLanding-contentItem .ContentItem[data-za-detail-view-path-module=Content] .ContentItem-title a:not(.zhihu_e_toQuestion)::before {content:'问题';color: #f68b83;background-color: #f68b8333;${style}} .TopstoryQuestionAskItem .ContentItem-title a:not(.zhihu_e_toQuestion)::before {content:'问题';color: #ff5a4e;background-color: #ff5a4e33;${style}} .ZVideoItem .ContentItem-title a::before, .ZvideoItem .ContentItem-title a::before {content:'视频';color: #00BCD4;background-color: #00BCD433;${style}} .PinItem .ContentItem-title a::before {content:'想法';color: #4CAF50;background-color: #4CAF5033;${style}} @@ -1157,7 +1249,9 @@ function addToQuestion() { titleA.innerHTML = titleA.innerHTML.replace('?', "?") } if (/answer\/\d+/.test(titleA.href)) { // 如果是指向回答的问题(而非指向纯问题的链接) - titleA.insertAdjacentHTML('afterend', `直达问题`); + const titleA_meta = titleA.parentElement.parentElement.querySelector('meta[itemprop="url"]'); // 获取该问题页地址 + if (!titleA_meta) return // 判断元素是否存在(针对的是部分搜索词下搜索页开头的 "最新讨论" 之类的非常规元素) + titleA.insertAdjacentHTML('afterend', `直达问题`); } } @@ -1180,6 +1274,38 @@ function questionRichTextMore() { if (button) button.click() } +// 移除登录弹窗 +function removeLogin() { + const removeLoginModal = (mutationsList, observer) => { + for (const mutation of mutationsList) { + for (const target of mutation.addedNodes) { + if (target.nodeType != 1) return + if (target.querySelector('.signFlowModal')) { + let button = target.querySelector('.Button.Modal-closeButton.Button--plain'); + if (button) button.click(); + } else if (getXpath('//button[text()="立即登录/注册"]',target)) { + target.remove(); + } + } + } + }; + + // 未登录时才会监听并移除登录弹窗 + if(location.hostname === 'zhuanlan.zhihu.com') { // 如果是文章页 + if (!document.querySelector('.ColumnPageHeader-profile>.AppHeader-menu')) { // 未登录 + const observer = new MutationObserver(removeLoginModal); + observer.observe(document, { childList: true, subtree: true }); + if (getXpath('//button[text()="登录/注册"]')) getXpath('//button[text()="登录/注册"]').outerHTML = ''; // [登录] 按钮跳转至登录页面 + } + } else { // 不是文章页 + if (!document.querySelector('.AppHeader-profile>.AppHeader-menu')) { // 未登录 + const observer = new MutationObserver(removeLoginModal); + observer.observe(document, { childList: true, subtree: true }); + document.lastElementChild.appendChild(document.createElement('style')).textContent = '.Question-mainColumnLogin, button.AppHeader-login {display: none !important;}'; // 屏蔽问题页中间的登录提示 + if (getXpath('//button[text()="登录/注册"]')) getXpath('//button[text()="登录/注册"]').outerHTML = ''; // [登录] 按钮跳转至登录页面 + } + } +} // 净化标题消息 function cleanTitles() { @@ -1292,7 +1418,7 @@ function getXpath(xpath, contextNode, doc = document) { // 显示问题作者 function question_author() { - if (document.querySelector('.BrandQuestionSymbol, .QuestionAuthor')) return + if (document.querySelector('.BrandQuestionSymbol, .QuestionAuthor, .SpecialQuestionAuthor')) return let qJson = JSON.parse(document.querySelector('#js-initialData').textContent).initialState.entities.questions[/\d+/.exec(location.pathname)[0]].author, html = ``; //html = `` @@ -1306,7 +1432,7 @@ function question_author() { function topTime_(css, classs) { document.querySelectorAll(css).forEach(function(_this) { let t = _this.querySelector('.ContentItem-time'); if (!t) return - if (!(t.classList.contains('full')) && t.querySelector('span') && t.querySelector('span').textContent != null) { + if (!(t.classList.contains('full')) && t.querySelector('a') && t.querySelector('a').textContent != null) { // 完整显示时间 topTime_allTime(t) // 发布时间置顶 @@ -1339,10 +1465,10 @@ function topTime_post() { // 完整显示时间 function topTime_allTime(t) { if (t.textContent.indexOf('发布于') > -1 && t.textContent.indexOf('编辑于') == -1) { - t.querySelector('span').textContent = (t.querySelector('span').dataset.tooltip); + t.querySelector('a').textContent = (t.querySelector('a').dataset.tooltip); t.classList.add('full'); } else if (t.textContent.indexOf('发布于') == -1 && t.textContent.indexOf('编辑于') > -1) { - t.querySelector('span').textContent = (t.querySelector('span').dataset.tooltip) + ' ,' + (t.querySelector('span').textContent); + t.querySelector('a').textContent = (t.querySelector('a').dataset.tooltip) + ' ,' + (t.querySelector('a').textContent); t.classList.add('full'); } } @@ -1455,49 +1581,32 @@ function blockHotOther() { block(); } +// 将关注/推荐/热榜/专栏的选项去掉默认的点击事件改成静态链接(针对首页互相切换(知乎这里切换是动态加载的),为了避免功能交叉混乱 +// 针对所有页面 +function switchHome() { + document.querySelectorAll('header.AppHeader nav').forEach((a)=>{a.outerHTML = a.outerHTML;}) +} +// 针对首页几个页面 +function switchHomeRecommend() { + document.querySelectorAll('header.AppHeader nav>a:not([target])[href="https://www.zhihu.com/"]').forEach((a)=>{a.addEventListener('click', function(e){e.preventDefault();document.cookie='tst=r; expires=Thu, 18 Dec 2099 12:00:00 GMT; domain=.zhihu.com; path=/';location.href=this.href;return false;})}) +} (function() { if (window.onurlchange === undefined) {addUrlChangeEvent();} // Tampermonkey v4.11 版本添加的 onurlchange 事件 grant,可以监控 pjax 等网页的 URL 变化 - window.addEventListener('urlchange', function(){ // 针对的是从单个回答页跳转到完整回答页时 - if (location.pathname.indexOf('question') > -1 && location.pathname.indexOf('waiting') === -1 && location.pathname.indexOf('/answer/') === -1) { // 回答页 // - setTimeout(function(){ - collapsedNowAnswer('.QuestionPage'); // 收起当前回答 + 快捷返回顶部 - collapsedNowAnswer('.Question-main'); // 收起当前回答 + 快捷返回顶部 - questionRichTextMore(); // 展开问题描述 - blockUsers('question'); // 屏蔽指定用户 - blockYanXuan(); // 屏蔽盐选内容 - }, 300); - } else if (location.pathname == '/') { // 推荐 - setTimeout(()=>{ - blockUsers('index'); // 屏蔽指定用户 - blockKeywords('index'); // 屏蔽指定关键词 - blockType(); // 屏蔽指定类别(视频/文章等) - }, 500); - } else if (location.pathname == '/hot') { // 热榜 - setTimeout(()=>{ - blockKeywords('index'); // 屏蔽指定关键词 - blockHotOther(); // 移除热播杂项 - }, 500); - } else if (location.pathname == '/follow') { // 关注 - setTimeout(()=>{ - blockKeywords('follow'); // 屏蔽指定关键词 - blockType(); // 屏蔽指定类别(视频/文章等) - blockType('follow'); // 屏蔽指定类别(赞同了XX/关注了XX等) - }, 500); - } - }) + removeLogin(); // 移除登录弹窗,Violentmonkey 不能延迟执行这个 cleanTitles(); // 净化标题消息,不能延迟执行 // Violentmonkey 比 Tampermonkey 加载更早,会导致一些元素还没加载,因此需要延迟一会儿 // Tampermonkey 4.18.0 版本可能需要延迟一会执行 if (GM_info.scriptHandler === 'Violentmonkey' || (GM_info.scriptHandler === 'Tampermonkey' && parseFloat(GM_info.version.slice(0,4)) >= 4.18)) { - setTimeout(start, 300); + setTimeout(start, 200); } else { start(); } function start(){ - cleanHighlightLink(); // 移除高亮链接 + switchHome(); // 将关注/推荐/热榜/专栏的选项去掉默认的点击事件改成静态链接(针对首页互相切换(知乎这里切换是动态加载的),为了避免功能交叉混乱 + cleanHighlightLink(); // 移除高亮链接 originalPic();directLink(); // 先立即执行一次 setInterval(originalPic,500); // 默认高清原图(无水印) setInterval(directLink, 500); // 默认站外直链 @@ -1514,6 +1623,11 @@ function blockHotOther() { collapsedNowAnswer('.QuestionPage'); // 收起当前回答 + 快捷返回顶部 collapsedNowAnswer('.Question-main'); // 收起当前回答 + 快捷返回顶部 questionRichTextMore(); // 展开问题描述 + if (location.pathname.indexOf('answer') == -1) { // 问题页而不是回答页 + blockLowCount('question'); // 屏蔽低赞/低评回答 + } else { // 将回答页的的查看全部回答选项去掉默认的点击事件改成静态链接,为了避免功能交叉混乱 + document.querySelectorAll('div.Card.ViewAll>a').forEach((a)=>{a.outerHTML = a.outerHTML;}) + } blockUsers('question'); // 屏蔽指定用户 blockYanXuan(); // 屏蔽盐选内容 blockType('question'); // 屏蔽指定类别(视频/文章等) @@ -1545,8 +1659,8 @@ function blockHotOther() { } } else if (location.hostname === 'zhuanlan.zhihu.com'){ // 文章 // - backToTop('article.Post-Main.Post-NormalMain'); // 快捷返回顶部 - backToTop('div.Post-Sub.Post-NormalSub'); // 快捷返回顶部 + backToTop('.Post-content'); // 快捷返回顶部 + backToTop('.Post-Row-Content'); // 快捷返回顶部 setTimeout(topTime_post, 300); // 置顶显示时间 blockUsers(); // 屏蔽指定用户 @@ -1581,29 +1695,33 @@ function blockHotOther() { backToTop('main[role=main]'); // 快捷返回顶部 setInterval(function(){topTime_('.ContentItem.PinItem', 'ContentItem-meta')}, 300); // 置顶显示时间 - } else { // 首页 // + } else if (['/','/hot','/follow','/column-square','/ring-feeds'].indexOf(location.pathname) !== -1) { // 首页 // + switchHomeRecommend(); // 针对首页推荐 // 解决屏蔽类别后,因为首页信息流太少而没有滚动条导致无法加载更多内容的问题 document.lastElementChild.appendChild(document.createElement('style')).textContent = '.Topstory-container {min-height: 1500px;}'; if (menu_value('menu_blockTypeVideo')) document.lastChild.appendChild(document.createElement('style')).textContent = `.Card .ZVideoItem-video, nav.TopstoryTabs > a[aria-controls="Topstory-zvideo"] {display: none !important;}`; collapsedNowAnswer('main div'); // 收起当前回答 + 快捷返回顶部 collapsedNowAnswer('.Topstory-container'); // 收起当前回答 + 快捷返回顶部 - setInterval(function(){topTime_('.TopstoryItem', 'ContentItem-meta')}, 300); // 置顶显示时间 - addTypeTips(); // 区分问题文章 - addToQuestion(); // 直达问题按钮 - if (location.pathname == '/') { // 推荐 - blockUsers('index'); // 屏蔽指定用户 - blockKeywords('index'); // 屏蔽指定关键词 - blockType(); // 屏蔽指定类别(视频/文章等) - } else if (location.pathname == '/hot') { // 热榜 - blockKeywords('index'); // 屏蔽指定关键词 - blockHotOther(); // 屏蔽热榜杂项 - } else if (location.pathname == '/follow') { // 关注 - blockKeywords('follow'); // 屏蔽指定关键词 - blockType(); // 屏蔽指定类别(视频/文章等) - blockType('follow'); // 屏蔽指定类别(赞同了XX/关注了XX等) - } else { - blockUsers(); + if (location.pathname !== '/column-square'){ // 不是首页 - 专栏时 + setInterval(function(){topTime_('.TopstoryItem', 'ContentItem-meta')}, 300); // 置顶显示时间 + addTypeTips(); // 区分问题文章 + addToQuestion(); // 直达问题按钮 + if (location.pathname == '/') { // 推荐 + blockLowCount('index'); // 屏蔽低赞/低评回答 + blockUsers('index'); // 屏蔽指定用户 + blockKeywords('index'); // 屏蔽指定关键词 + blockType(); // 屏蔽指定类别(视频/文章等) + } else if (location.pathname == '/hot') { // 热榜 + blockKeywords('index'); // 屏蔽指定关键词 + blockHotOther(); // 屏蔽热榜杂项 + } else if (location.pathname == '/follow') { // 关注 + blockLowCount('follow'); // 屏蔽低赞/低评回答 + blockUsers('follow'); // 屏蔽指定用户 + blockKeywords('follow'); // 屏蔽指定关键词 + blockType(); // 屏蔽指定类别(视频/文章等) + blockType('follow'); // 屏蔽指定类别(赞同了XX/关注了XX等) + } } } } diff --git a/other/Autopage/rules.json b/other/Autopage/rules.json index eb4354267..b10398998 100644 --- a/other/Autopage/rules.json +++ b/other/Autopage/rules.json @@ -2,7 +2,7 @@ "百度搜索": { "host": ["www.baidu.com","ipv6.baidu.com"], "url": "fun.isUrlC(); if (fun.isMobile()) {location.hostname = 'm.baidu.com';} else {return (fun.lp() == '/s')}", - "style": ".new-pmd .c-img-border {position: initial !important;} .op-bk-polysemy-video__wrap.c-gap-bottom {display: none !important;}", + "style": ".new-pmd .c-img-border {position: initial !important;} .op-bk-polysemy-video__wrap.c-gap-bottom, #content_left:not([style])>.result-op[tpl='new_baikan_index'], #content_left:not([style])>.result-op[tpl='ai_ask'] {display: none !important;}", "history": true, "pager": { "nextL": "#page strong+a:not(.n)", @@ -35,14 +35,9 @@ "host": "/^www\\.google\\./", "url": "return (fun.lp() == '/search' && (!fun.indexOF('tbm=','s') || (fun.indexOF('tbm=nws','s') || fun.indexOF('tbm=vid','s') || fun.indexOF('tbm=bks','s'))) && (fun.indexOF('sclient=mobile','s') || fun.isMobile()))", "pager": { - "nextL": "footer>div:first-child a[aria-label]", - "pageE": "id('main')/div[position()>1][position()div", + "isHidden": true } }, "谷歌搜索": { @@ -51,19 +46,16 @@ "history": true, "pager": { "nextL": "#pnnext,footer>div:first-child a[aria-label]", - "pageE": "id('search')/div | id('rso')/div | //style[not(contains(text(),'table,div,span,p{display:none}'))] | //body/script[@nonce][not(@src)][starts-with(text(),'(function(){var s=') or starts-with(text(),'(function(){google.ldi')]", + "pageE": "id('search')/div | id('rso')/div | //style[not(contains(text(),'table,div,span,p{display:none}'))] | //body//script[@nonce][not(@src)][contains(text(),'_setImagesSrc')]", "replaceE": "#navcnt,#rcnt div[role='navigation'],#botstuff div[role='navigation'],#main>footer>div:first-child", "scriptT": 2, "scrollD": 2500 - }, - "function": { - "bF": "fun.getAllCSS('#search img[id^=dimg],#search img[id^=rimg],#rso img[id^=dimg],#rso img[id^=rimg]').forEach(function (img) {img.id = 'old_'+img.id;}); if(!fun.indexOF('tbm=vid','s') && fun.indexOF('tbm=','s')){return pageE}else{pageE.forEach(function (img) {fun.getAllCSS('img[id^=dimg]:not([data-atf])',img).forEach(function (img1) {img1.setAttribute('data-atf','1');})}); return pageE}" } }, "必应搜索 + 手机版": { "host": ["www.bing.com","cn.bing.com","www4.bing.com","global.bing.com"], - "url": "if (fun.lp() == '/search') {if (fun.isMobile() && document.documentElement.lang != 'zh') {return false;} else {return true;}}", - "style": "#b_footer,.b_msg,#bnp_rich_div", + "url": "fun.isUrlC();if (fun.lp() == '/search') {if (fun.isMobile()){rule.blank=3;rule.pager.type=6;rule.pager.loadTime=1000;};return true;}", + "style": "#b_footer,.b_msg,#bnp_rich_div,.cn_related_search_upsell_container", "history": true, "pager": { "nextL": "a.sb_pagN,a.sb_halfnext,a.sb_fullnpl", @@ -182,11 +174,21 @@ "url": "/\\/search/", "history": false, "pager": { - "nextL": "js; return fun.getNextF('//div[contains(@class,\"pagination\")]/form[./button[@class=\"pagination__next-prev-button next\"]]')", - "pageE": "section.w-gl--desktop>div", + "nextL": "js; return fun.getNextF('//div[contains(@class,\"pagination\")]/form[last()]')", + "pageE": ".result,head>style[data-emotion]", "replaceE": ".pagination" } }, + "Libre Search": { + "host": "so.ddns-ip.net", + "url": "/^\\/search/", + "history": false, + "pager": { + "nextL": "js; return fun.getNextF('.next_page')", + "pageE": "#urls>[class^=template_group_], #urls>.result", + "replaceE": "#pagination" + } + }, "Yandex 搜索": { "host": ["yandex.com","yandex.ru","yandex.ua","yandex.by","yandex.kz","yandex.uz","yandex.com.tr"], "url": "/^\\/search\\//", @@ -288,6 +290,15 @@ "replaceE": ".pagination" } }, + "4get.ca 搜索": { + "host": "4get.ca", + "url": "/^\\/(web|images|videos|news|music)/", + "blank": 3, + "pager": { + "nextL": ".nextpage", + "pageE": ".text-result, .image-wrapper" + } + }, "百度贴吧 - 搜索页": { "host": "tieba.baidu.com", "url": "/^\\/f\\/search\\/res/", @@ -345,9 +356,10 @@ "豆瓣 - top250/分集短评/剧评影评/在看/想看/看过/作品/图片": { "host": ["movie.douban.com","music.douban.com","book.douban.com"], "url": "return (fun.lp() == '/top250' || fun.indexOF(/^\\/subject\\/\\d+\\/(episode|tv_discuss|reviews|photos)/) || fun.indexOF(/^\\/people\\/.+\\/(do|wish|collect)/) || fun.indexOF(/^\\/celebrity\\/\\d+\\/(movies|photos)/))", + "blank": 5, "pager": { "nextL": "link[rel='next']", - "pageE": ".grid_view,#comments,.review-list,.interest-list,.grid-view,.grid_view>ul>li,.poster-col3>li", + "pageE": ".grid_view,.article>.indent>p.ul,.article>.indent>table,#comments,.review-list,.interest-list,.grid-view,.grid_view>ul>li,.poster-col3>li", "replaceE": ".paginator", "scrollD": 2500 } @@ -556,40 +568,16 @@ "煎蛋网": { "host": "jandan.net", "url": "/^(\\/$|\\/page\\/)/", - "style": "#nav_prev,#nav_next,.post.f:not(.list-post)", - "history": false, + "style": ".nav_prev,.nav_next,.post-item>.col-md-12,.post.f:not(.list-post)", "pager": { - "nextL": "//div[@class='wp-pagenavi']/a[contains(text(),'下一页') or contains(text(),'更多文章')]", - "pageE": "#content>.list-post", - "replaceE": ".wp-pagenavi" + "nextL": "//div[@class='page-navi']/a[contains(text(),'下一页') or contains(text(),'更多文章')]", + "pageE": ".post-list>.post-item", + "replaceE": ".page-navi" }, "function": { "bF": "return fun.src_bF(pageE)" } }, - "煎蛋网 - 大杂烩": { - "host": "jandan.net", - "url": "/^\\/dzh$/", - "pager": { - "type": 2, - "nextL": ".show_more", - "interval": 1500 - } - }, - "煎蛋网 - 吐槽": { - "host": "jandan.net", - "url": "/^\\/(qa|pic|ooxx|treehole)/", - "style": "#nav_prev,#nav_next,#tucao-gg {display: none !important;} .jandan-vote a.tucao-btn23:link {color: #c8c7cc !important;} .jandan-tucao {background-color: #fafaf9 !important;}", - "pager": { - "nextL": "a.previous-comment-page", - "pageE": "ol.commentlist>li[id^='comment-'],head>script:not([src])", - "replaceE": ".cp-pagenavi", - "scriptT": 2 - }, - "function": { - "bF": "fun.getAllCSS('a.tucao-btn,a.comment-like.like,a.comment-unlike.unlike').forEach(function (now) {now.className = now.className.replace('tucao-btn','tucao-btn23').replace('comment-unlike','comment-unlike23').replace('comment-like','comment-like23');}); return pageE" - } - }, "龙的天空": { "host": "www.lkong.com", "url": "fun.isUrlC(); return (fun.indexOF('/forum/'))", @@ -654,21 +642,12 @@ } }, "番组计划": { - "host": ["bgm.tv","bangumi.tv"], - "url": "return (fun.indexOF(/\\/(browser|subject_search|tag|wish)/) || fun.isPager())", + "host": ["bgm.tv","bangumi.tv","chii.in"], + "url": "return (fun.indexOF(/\\/(browser|subject_search|tag|wish|forum|comments)/) || fun.isPager())", "blank": 3, "pager": { "nextL": "//div[@class='page_inner']/a[text()='››']", - "pageE": "ul#browserItemList>li", - "replaceE": ".page_inner" - } - }, - "番组计划 - 小组帖子列表": { - "host": ["bgm.tv","bangumi.tv"], - "url": "/\\/forum/", - "pager": { - "nextL": "//div[@class='page_inner']/a[text()='››']", - "pageE": ".topic_list>tbody:last-of-type>tr.topic", + "pageE": "ul#browserItemList>li,.topic_list>tbody:last-of-type>tr.topic,#comment_box>.item", "replaceE": ".page_inner" } }, @@ -822,6 +801,19 @@ "bF": "return fun.src_bF(pageE)" } }, + "淘股吧 - 帖子内 - 只看楼主": { + "host": "www.tgb.cn", + "url": "/^\\/topic\\/lookUserTopic/", + "thread": true, + "pager": { + "nextL": "js; let next = fun.getXpath('//div[contains(@class,\"t_page01\")]/a[contains(text(),\"下一页\")]');if (next) {next = next.getAttribute('onclick').replace('gotoPageLookTopic(','').replace(')','').split(',');return fun.getNextUP('pageNo=',/pageNo=\\d+/,location.pathname,'2',next[1])}; return '';", + "pageE": ".comment-data", + "replaceE": ".t_page" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "芥子空间论坛": { "host": "bbs.lieyou888.com", "url": "/^\\/forum/", @@ -916,6 +908,24 @@ "replaceE": ".pagination" } }, + "CPC中文印刷社区": { + "host": "www.cnprint.org", + "url": "if(fun.indexOF(/^\\/bbs\\/forumdisplay\\.php/)){rule.blank=3;return true;}else if(fun.indexOF(/^\\/bbs\\/showthread\\.php/)){return true;}", + "pager": { + "nextL": "a[rel=next]", + "pageE": "tbody[id^=threadbits_forum_]>tr, #posts>div[align]", + "replaceE": ".pagenav" + } + }, + "Mobile01 - 论坛": { + "host": "www.mobile01.com", + "url": "if(fun.indexOF(/^\\/topicdetail\\.php/)){rule.thread=true;return true;}else if(fun.indexOF(/^\\/forumtopic\\.php/)){rule.blank=3;return true;}", + "pager": { + "nextL": ".l-pagination__page.is-active+li>a", + "pageE": ".l-listTable__tbody>.l-listTable__tr,.l-articlePage:not(:nth-child(2))", + "replaceE": ".l-pagination" + } + }, "TGFC Lifestyle": { "host": "bbs.tgfcer.com", "url": "return (fun.lp() == '/forumdisplay.php' || fun.indexOF('/forum'))", @@ -936,6 +946,36 @@ "replaceE": ".pages" } }, + "archlinux - bbs": { + "host": ["bbs.archlinux.org","bbs.archlinuxcn.org"], + "url": "/^\\/(viewforum|viewtopic)\\.php/", + "blank": 3, + "pager": { + "nextL": "a[rel=next]", + "pageE": "#vf tbody>tr, .blockpost[id]", + "replaceE": ".pagelink" + } + }, + "archlinux - wiki": { + "host": ["wiki.archlinux.org","wiki.archlinuxcn.org"], + "url": "/^\\/wzh\\/index\\.php/", + "blank": 3, + "pager": { + "nextL": "a.mw-nextlink", + "pageE": ".mw-search-result", + "replaceE": ".mw-pager-navigation-bar" + } + }, + "archlinux - aur": { + "host": ["archlinux.org","aur.archlinux.org"], + "url": "/^\\/packages/", + "blank": 3, + "pager": { + "nextL": ".next>a,span.page+a.page", + "pageE": "#pkglist-results tbody>tr", + "replaceE": ".pkglist-nav" + } + }, "北+": { "host": ["/^((www|bbs)\\.)?(soul|snow|south|spring|summer|north|white|level|east)-plus\\.(net|org)$/","bbs.imoutolove.me"], "url": "return (fun.lp() == '/thread.php' || fun.lp() == '/search.php')", @@ -1164,7 +1204,7 @@ } }, "nodeseek": { - "host": "www.nodeseek.com", + "host": ["www.nodeseek.com","www.deepflood.com"], "url": "return fun.isPager()", "pager": { "nextL": "a.pager-next", @@ -1453,6 +1493,19 @@ "bF": "return fun.src_bF(pageE)" } }, + "觅元素": { + "host": "www.51yuansu.com", + "url": "return fun.isPager()", + "style": "li.pic-item{max-height: 330px;width: auto;} #f-content>div{position: static !important; float: left !important; width: 285px !important;}", + "pager": { + "nextL": ".nextpage", + "pageE": "li.pic-item,#f-content>div", + "replaceE": ".pager-wrap" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "vcg.com": { "host": "www.vcg.com", "url": "fun.isUrlC(); return fun.indexOF(/^\\/creative-(image|illustration)\\//)", @@ -1977,11 +2030,22 @@ }, "CurseForge": { "host": "www.curseforge.com", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".btn-next", + "pageE": ".results-container>div", + "replaceE": ".pagination" + } + }, + "CurseForge - legacy": { + "host": "legacy.curseforge.com", + "url": "return fun.isPager()", + "blank": 3, "pager": { "nextL": ".pagination-next>a", "pageE": "div.my-2", - "replaceE": ".pagination", - "scrollD": 2500 + "replaceE": ".pagination" } }, "Planet Minecraft": { @@ -2055,6 +2119,20 @@ "replaceE": ".ajax-pager" } }, + "koyso": { + "host": "koyso.to", + "url": "return fun.isPager()", + "style": ".skeleton", + "blank": 4, + "pager": { + "nextL": "js; return fun.getNextEP('.page_num[style]+a.page_num','page=',/page=\\d+/)", + "pageE": ".games_content", + "replaceE": ".pagination" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "cs.rin.ru - 帖子列表": { "host": "cs.rin.ru", "url": "return (fun.lp() == '/forum/viewforum.php')", @@ -2098,8 +2176,8 @@ "replaceE": ".post-pagination" } }, - "RuTracker - 帖子列表": { - "host": ["rutracker.org","rutracker.net"], + "RuTracker / Pornolab - 帖子列表": { + "host": ["rutracker.org","rutracker.net","pornolab.net"], "url": "/(viewforum|tracker)\\.php/", "blank": 4, "pager": { @@ -2108,8 +2186,8 @@ "replaceE": "#pagination,.bottom_info>.nav" } }, - "RuTracker - 帖子内": { - "host": ["rutracker.org","rutracker.net"], + "RuTracker / Pornolab - 帖子内": { + "host": ["rutracker.org","rutracker.net","pornolab.net"], "url": "/viewtopic\\.php/", "thread": true, "pager": { @@ -2138,6 +2216,16 @@ "replaceE": ".bottom-page" } }, + "byrutgame": { + "host": "byrutgame.org", + "url": "if(fun.getCSS('.show_more')){rule.pager.type=2;rule.pager.nextL='.active .show_more:not(.disabled)';return true;}else{return fun.isPager();}", + "blank": 3, + "pager": { + "nextL": ".page_next>a", + "pageE": ".short_item", + "replaceE": ".navigation" + } + }, "steamrip": { "host": "steamrip.com", "url": "return fun.isPager()", @@ -2183,6 +2271,16 @@ "pageE": "a[data-id]" } }, + "SteamUnlocked": { + "host": "steamunlocked.org", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": "span.page-numbers.current+a", + "pageE": ".cover-item.category", + "replaceE": ".nav-links" + } + }, "bilibili - 搜索页": { "host": "search.bilibili.com", "url": "fun.isUrlC(); return ((fun.lp() == '/all' || fun.lp() == '/video' || fun.lp() == '/pgc' || fun.lp() == '/article') && !fun.getCSS('ul.video-list') && !fun.getCSS('#article-list'))", @@ -2651,7 +2749,7 @@ } }, "YTS": { - "host": "yts.mx", + "host": ["yts.bz","yts.lt","yts.gg","yts.am","yts.ag"], "url": "/^\\/browse-movies/", "blank": 3, "pager": { @@ -2731,7 +2829,7 @@ } }, "Kickass Torrents": { - "host": ["kickasss.to","katcr.to"], + "host": ["kickasss.to","katcr.to","kickasstorrent.cr"], "url": "return (fun.lp() != '/' && !fun.indexOF('.html') && !fun.indexOF('/popular'))", "blank": 3, "pager": { @@ -2750,6 +2848,16 @@ "replaceE": ".pagination" } }, + "TorrentDownloads": { + "host": "www.torrentdownloads.pro", + "url": "return fun.isPager('r')", + "blank": 3, + "pager": { + "nextL": "//div[@class='pagination_box']//a[text()='>>']", + "pageE": ".inner_container>.grey_bar3", + "replaceE": ".pagination_box" + } + }, "LimeTorrents": { "host": "/^www\\.limetorrents\\./", "url": "return (fun.isTitle('LimeTorrents') && (fun.indexOF('/search/') || fun.indexOF('/browse-torrents')))", @@ -2852,8 +2960,9 @@ "SubHD - 论坛": { "host": ["subhd.tv","subhdtw.com","subhd.la","subhd.cc","subhd.me"], "url": "/^\\/forum\\/(forum|ask)/", + "blank": 3, "pager": { - "nextL": "//a[@class='page-link'][text()='下一页']", + "nextL": ".page-item.active+li>a", "pageE": ".bg-white.shadow-sm.rounded-3>div", "replaceE": "nav.clearfix" } @@ -2861,8 +2970,9 @@ "SubHD": { "host": ["subhd.tv","subhdtw.com","subhd.la","subhd.cc","subhd.me"], "url": "return fun.isPager('r')", + "blank": 3, "pager": { - "nextL": "//a[@class='page-link'][text()='下一页']", + "nextL": ".page-item.active+li>a", "pageE": ".bg-white.shadow-sm.rounded-3", "insertP": ["nav.clearfix",1], "replaceE": "nav.clearfix" @@ -2889,7 +2999,7 @@ } }, "字幕库 zmk": { - "host": ["zmk.pw","zimuku.org","zimuku.pw"], + "host": ["srtku.com","zmk.pw","zimuku.org","zimuku.pw"], "url": "if (!fun.indexOF('/detail/') && !fun.indexOF('/subs/')) {if (fun.lp() == '/') {fun.getCSS('.box>.table').insertAdjacentHTML('beforebegin','
')}; return true;}", "pager": { "nextL": "a.next", @@ -3166,6 +3276,32 @@ "bF": "return fun.src_bF(pageE)" } }, + "SF漫画": { + "host": "manhua.sfacg.com", + "url": "if (fun.indexOF(/^\\/mh\\/.+\\/\\d+\\//)) {setTimeout(()=>{let _img=''; for (let i=0;i`;}; document.getElementById('curPic').parentElement.outerHTML = _img;rule.pager.scrollD = 3000;},1000); rule.pager.scrollD = -9999999; return true;}", + "style": ".page_turning>a[href='javascript:PrePage();'], .page_turning>a[href='javascript:NextPage();'], #pageSel, #Pages, .tucao {display: none !important;} .Reduction_left{width: auto !important;}", + "history": true, + "pager": { + "nextL": "js; if(nextChap != 0) {return (location.origin + '/mh/' + comicFolder + '/' + nextChap + '/');}", + "pageE": "#PicArea>tbody>tr>td>script", + "insertP": ["body",3], + "replaceE": ".Reduction_left", + "scriptT": 2, + "interval": 4000 + }, + "function": { + "aF": "common.getPics(c,chapId,nv,fn,function (json) {picAy = json.data;if (picAy.length == 0) {return;} else {let _img=''; for (let i=0;i`;}; fun.getCSS('#PicArea>tbody>tr>td>img').parentElement.insertAdjacentHTML('beforeend',_img);};}, function (info) {Message(info, 2);});" + } + }, + "SF漫画 - 书库": { + "host": "manhua.sfacg.com", + "url": "return fun.isPager()", + "pager": { + "nextL": ".pagebarNext>a", + "pageE": "ul.Comic_Pic_List", + "replaceE": ".pagebar" + } + }, "快岸漫画": { "host": "www.kanbook.net", "url": "if (fun.indexOF(/^\\/\\d+\\/\\d+\\/\\d+/)) {if (fun.getCSS('img.img-fluid')){fun.getCSS('img.img-fluid').style.display = 'none';}; setTimeout(()=>{let _img = '';for (let i = 0; i < imagesUrlArr.length; i++) {_img += ``;};document.querySelector('.content-wrapper').insertAdjacentHTML('beforeend',_img);},500); return true;}", @@ -3382,7 +3518,7 @@ } }, "古风漫画网 / 优酷漫画 / 36 漫画 / 360 漫画 / 漫漫台 / 古漫画 / 前未漫画 / 下拉式漫画 / 漫画1234 - 分类页": { - "host": ["www.gufengmh.com","/^www\\.gufengmh\\d/","www.123gf.com","36manga.com","www.36manga.com","36manhua.com","www.36manhua.com","www.36man.cc","www.manmantai.com","www.xlsmh.com","www.gmh1234.com"], + "host": ["www.gufengmh.com","/^www\\.gufengmh\\d/","/^www\\.ykmh\\.[a-z]+$/","www.123gf.com","36manga.com","www.36manga.com","36manhua.com","www.36manhua.com","www.36man.cc","www.manmantai.com","www.xlsmh.com","www.gmh1234.com"], "url": "/^\\/(comic\\/)?(update|list|search)/", "blank": 3, "pager": { @@ -3392,12 +3528,12 @@ } }, "古风漫画网 / 优酷漫画 / 36 漫画 / 360 漫画 / 漫漫台 / 古漫画 / 前未漫画 / 下拉式漫画 / 漫画1234": { - "host": ["www.gufengmh.com","/^www\\.gufengmh\\d/","www.123gf.com","36manga.com","www.36manga.com","36manhua.com","www.36manhua.com","www.36man.cc","www.manmantai.com","www.xlsmh.com","www.gmh1234.com"], - "url": "if (fun.indexOF(/\\/\\d+\\.html$/)) {if (/^www\\.(123gf|ykmh|izhegu|qianwee|manmantai)\\.com$/.test(location.hostname)|| location.hostname.indexOf('36man') != -1) {if (localStorage.getItem('chapterScroll') != '\"pagination\"') {localStorage.setItem('chapterScroll','\"pagination\"'); location.reload();} else {setTimeout(()=>{let _img = '',host = SinMH.getResHostDomain(); if (/^www\\.(ykmh|izhegu)\\.com$/.test(location.hostname)) {chapterPath=''}else if (location.hostname.indexOf('36man') == -1||location.hostname=='www.123gf.com'||location.hostname=='www.gmh1234.com'){host+='/'}; if (location.hostname == 'www.36man.cc' ||(location.hostname == 'www.manmantai.com' && chapterImages[0].slice(0,4) == 'http')){host=''}; for (let i=0;i`;}; document.getElementById('images').innerHTML = _img;},500); return true;}} else if (localStorage.getItem('chapterScroll') != '\"scroll\"') {localStorage.setItem('chapterScroll','\"scroll\"'); location.reload();}else{return true}}", + "host": ["www.gufengmh.com","/^www\\.gufengmh\\d/","/^www\\.ykmh\\.[a-z]+$/","www.123gf.com","36manga.com","www.36manga.com","36manhua.com","www.36manhua.com","www.36man.cc","www.manmantai.com","www.xlsmh.com","www.gmh1234.com"], + "url": "if (fun.indexOF(/\\/\\d+\\.html$/)) {if (/^www\\.(123gf|ykmh|izhegu|qianwee|manmantai)\\.[a-z]+$/.test(location.hostname)|| location.hostname.indexOf('36man') != -1) {if (localStorage.getItem('chapterScroll') != '\"pagination\"') {localStorage.setItem('chapterScroll','\"pagination\"'); location.reload();} else {setTimeout(()=>{let _img = '',host = SinMH.getResHostDomain(); if (/^www\\.(ykmh|izhegu)\\.[a-z]+$/.test(location.hostname)) {chapterPath=''}else if (location.hostname.indexOf('36man') == -1||location.hostname=='www.123gf.com'||location.hostname=='www.gmh1234.com'){host+='/'}; if (/^www\\.(ykmh)\\.[a-z]+$/.test(location.hostname) || location.hostname == 'www.36man.cc' ||(location.hostname == 'www.manmantai.com' && chapterImages[0].slice(0,4) == 'http')){host=''}; for (let i=0;i`;}; document.getElementById('images').innerHTML = _img;},500); return true;}} else if (localStorage.getItem('chapterScroll') != '\"scroll\"') {localStorage.setItem('chapterScroll','\"scroll\"'); location.reload();}else{return true}}", "style": ".img_land_prev,.img_land_next,#sider-left,#sider-right,p.img_info,.tc,.chapter-view + .w996,.chapter-view>div[style]:not([id]):not([class]) {display: none !important;} #images{min-height: 6000px !important;} #images>img {display: inline-block !important;min-height: 400px;margin: 0 auto !important;border: none !important;padding: 0 !important;max-width: 99% !important;height: auto !important;}", "history": true, "pager": { - "nextL": "js; let url = comicUrl.replace('.html','/') + nextChapterData.id + '.html'; if (nextChapterData.id != null && url && url != '.html' && url != location.href) return url", + "nextL": "js; let url = comicUrl.replace('.html','/').replace('http://',location.protocol+'//') + nextChapterData.id + '.html'; if (nextChapterData.id != null && url && url != '.html' && url != location.href) return url", "pageE": "//script[contains(text(),'chapterImages')]", "insertP": ["body",3], "scriptT": 2, @@ -3405,7 +3541,7 @@ "scrollD": 4000 }, "function": { - "aF": "let _img = '',host = SinMH.getResHostDomain(); if (/^www\\.(ykmh|100fanwo|izhegu|xlsmh)\\.com$/.test(location.hostname)) {chapterPath=''}else if (location.hostname.indexOf('36man') == -1||location.hostname=='www.123gf.com'||location.hostname=='www.gmh1234.com'){host+='/'}; if (location.hostname == 'www.36man.cc' ||(location.hostname == 'www.manmantai.com' && chapterImages[0].slice(0,4) == 'http') ||location.hostname == 'www.xlsmh.com'){host=''}; for (let i=0;i`;}; document.getElementById('images').insertAdjacentHTML('beforeend',_img);" + "aF": "let _img = '',host = SinMH.getResHostDomain(); if (/^www\\.(ykmh|100fanwo|izhegu|xlsmh)\\.[a-z]+$/.test(location.hostname)) {chapterPath=''}else if (location.hostname.indexOf('36man') == -1||location.hostname=='www.123gf.com'||location.hostname=='www.gmh1234.com'){host+='/'}; if (/^www\\.(ykmh)\\.[a-z]+$/.test(location.hostname) || location.hostname == 'www.36man.cc' ||(location.hostname == 'www.manmantai.com' && chapterImages[0].slice(0,4) == 'http') ||location.hostname == 'www.xlsmh.com'){host=''}; for (let i=0;i`;}; document.getElementById('images').insertAdjacentHTML('beforeend',_img);" } }, "爱漫之家 / 733 动漫": { @@ -3461,6 +3597,28 @@ "replaceE": ".pagination" } }, + "G站漫画": { + "host": ["manhuafree.com","manhuascans.org"], + "url": "return fun.isPager('n')", + "pager": { + "type": 6, + "nextL": "#nextChapterLink", + "pageE": "#chapcontent>div", + "replaceE": "#nextChapterLink,#preChapterLink", + "loadTime": 1000, + "scrollD": 4000 + } + }, + "G站漫画 - 分类页": { + "host": ["manhuafree.com","manhuascans.org"], + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": "a[aria-label^=下]", + "pageE": ".cardlist>div", + "replaceE": ".cardlist+div" + } + }, "COLAMANGA 漫画": { "host": "www.colamanga.com", "url": "if (fun.indexOF('.html')){if (!(fun.getCookie('mh_readmode') === '' || fun.getCookie('mh_readmode') === '3')) {document.cookie='mh_readmode=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'; location.reload();}; return true;} else if (fun.indexOF(/\\/\\d+\\/$/)) {setTimeout(()=>{if (document.querySelector('a.website-display-all')) document.querySelector('a.website-display-all').click();},500);}", @@ -3558,6 +3716,16 @@ "replaceE": ".pagination" } }, + "起点图数据 - 书单": { + "host": "www.qidiantu.com", + "url": "/^\\/booklist\\/\\d+/", + "blank": 3, + "pager": { + "nextL": "//a[@class='btn btn-primary'][text()='后十本'][1]", + "pageE": ".well.well-sm.table-responsive", + "replaceE": "//a[@class='btn btn-primary'][text()='后十本'][1]" + } + }, "七猫中文 - 阅读页": { "host": "www.qimao.com", "url": "return (fun.indexOF(/\\/shuku\\/\\d+-\\d+\\//) || fun.indexOF('/reader/index/'))", @@ -3783,6 +3951,28 @@ "replaceE": ".prenext,.page" } }, + "爱下电子书": { + "host": "ixdzs8.com", + "url": "/^\\/read\\/.+\\.html$/", + "pager": { + "nextL": ".chapter-next", + "pageE": ".page-content>section", + "replaceE": "chapter-act" + } + }, + "飘天文学": { + "host": "www.piaotia.com", + "url": "/^\\/html\\/\\d+\\/\\d+\\/\\d+\\.html", + "style": "#content>*:not(br):not(:nth-child(1))", + "pager": { + "type": 6, + "nextL": "(//a[contains(text(), '下一章')])[last()]", + "pageE": "#content", + "insertP": ["#content",6], + "replaceE": ".bottomlink", + "loadTime": 500 + } + }, "皇帝之家": { "host": "www.huangdizhijia.com", "url": "/chapter-\\d+\\.html/", @@ -3827,15 +4017,17 @@ }, "哔哩轻小说": { "host": "www.linovelib.com", - "url": "return fun.indexOF(/\\/novel\\/\\d+\\/.+\\.html/)", + "url": "if (fun.indexOF(/\\/novel\\/\\d+\\/.+\\.html/)){setTimeout(()=>{let ac=fun.getCSS('#TextContent');if(ac){ac.classList.add('a123456');ac.classList.remove('adv-box');ac.style='display: block !important;';let ax=fun.getXpath(\"//head/style[not(@type)][normalize-space()='']\");document.head.appendChild(document.createElement('style')).textContent = Array.from(ax.sheet.cssRules).map(r => {return r.cssText;}).join(' ').replaceAll('#TextContent ','.a123456#TextContent ');ax.remove();}},300);return true;}", "history": true, "pager": { + "type": 6, "nextL": "//div[@class='mlfy_page']/a[contains(text(),'下一页') or contains(text(),'下一章')]", - "pageE": "#TextContent>*:not(div),head>style", - "replaceE": ".mlfy_page" + "pageE": "//div[@id='TextContent'] | //head/style[not(@type)][normalize-space()='']", + "replaceE": ".mlfy_page", + "loadTime": 1000 }, "function": { - "bF": "if(pageE[0].tagName=='STYLE'){pageE[pageE.length-1].style='font-family: read !important;';pageE[0].textContent=pageE[0].textContent.replace(' p:last-of-type','666')}; return pageE", + "bF": "const ra='a'+Math.random().toString(36).slice(-6);pageE.forEach(function (a) {if(a.tagName=='STYLE'){a.textContent=Array.from(a.sheet.cssRules).map(r => {return r.cssText;}).join(' ').replaceAll('#TextContent ','.'+ra+'#TextContent ');}else if(a.tagName=='DIV'){a.classList.add(ra);a.classList.remove('adv-box');a.style='display: block !important;'};}); return pageE", "aF": "document.body.appendChild(document.createElement('script')).textContent='yuedu()'" } }, @@ -3865,15 +4057,17 @@ }, "哔哩轻小说 - 手机版": { "host": "www.bilinovel.com", - "url": "/\\/novel\\/\\d+\\/.+\\.html/", + "url": "if (fun.indexOF(/\\/novel\\/\\d+\\/.+\\.html/)){setTimeout(()=>{let ac=fun.getCSS('#acontent');if(ac){ac.classList.add('a123456');ac.classList.remove('adv-box');ac.style='display: block !important;';let ax=fun.getXpath(\"//head/style[not(@type)][normalize-space()='']\");document.head.appendChild(document.createElement('style')).textContent = Array.from(ax.sheet.cssRules).map(r => {return r.cssText;}).join(' ').replaceAll('#acontent ','.a123456#acontent ');ax.remove();}},300);return true;}", "history": true, "pager": { + "type": 6, "nextL": "js; if (ReadParams.url_next.slice(ReadParams.url_next.length-5) === '.html') return (location.origin + ReadParams.url_next)", - "pageE": "id('acontent')/*[name()='p' or name()='img' or name()='br'] | //body/script[contains(text(),'var ReadParams')] | //body/script[contains(@src,'/readtools.js')] | //head/style", - "scriptT": 2 + "pageE": "//div[@id='acontent'] | //body/script[contains(text(),'var ReadParams')] | //head/style[not(@type)][normalize-space()='']", + "scriptT": 2, + "loadTime": 1000 }, "function": { - "bF": "if(pageE[0].tagName=='STYLE'){pageE[pageE.length-2].style='font-family: read !important;';pageE[0].textContent=pageE[0].textContent.replace(' p:last-of-type','666')}; return pageE" + "bF": "const ra='a'+Math.random().toString(36).slice(-6);pageE.forEach(function (a) {if(a.tagName=='STYLE'){a.textContent=Array.from(a.sheet.cssRules).map(r => {return r.cssText;}).join(' ').replaceAll('#acontent ','.'+ra+'#acontent ');}else if(a.tagName=='DIV'){a.classList.add(ra);a.classList.remove('adv-box');a.style='display: block !important;'};}); return pageE" } }, "哔哩轻小说 - 手机版 - 文库": { @@ -3888,6 +4082,36 @@ "bF": "return fun.src_bF(pageE)" } }, + "刺猬猫阅读": { + "host": "www.ciweimao.com", + "url": "/^\\/chapter\\/\\d+/", + "pager": { + "type": 6, + "nextL": "#J_BtnPageNext", + "pageE": "#J_BookRead>p", + "replaceE": ".book-read-page", + "loadTime": 1000 + } + }, + "SF轻小说": { + "host": "book.sfacg.com", + "url": "/^\\/Novel\\/\\d+\\/\\d+\\/\\d+\\//", + "pager": { + "nextL": "//div[@class='fn-btn']/a[text()='下一章']", + "pageE": "#ChapterBody>p", + "replaceE": "#article>.fn-btn" + } + }, + "SF轻小说 - 书库": { + "host": "book.sfacg.com", + "url": "/^\\/List\\//", + "pager": { + "nextL": ".pagebarNext>a", + "pageE": ".Comic_Pic_List", + "replaceE": ".pagebar", + "forceHTTPS": true + } + }, "必读推荐": { "host": "www.bidutuijian.com", "url": "/^\\/books\\/.+\\/(?:(?!0000)\\d{4})\\.html/", @@ -3960,6 +4184,17 @@ "replaceE": ".pager" } }, + "八叉书库": { + "host": "www.8xsk.xyz", + "url": "/^\\/novel\\d+\\/chapter/", + "pager": { + "type": 6, + "nextL": "#next_chap", + "pageE": "#chapter-content", + "replaceE": ".chapter-nav", + "loadTime": 1000 + } + }, "蓝鲨": { "host": "www.lan-sha.com", "url": "return (!fun.indexOF('.html'))", @@ -4837,11 +5072,20 @@ "replaceE": ".pagination" } }, + "Github - Issue/Discussions/Pull - loadmore": { + "host": "github.com", + "url": "return fun.indexOF(/\\/(issues|discussions|pull)\\/\\d+$/)", + "pager": { + "type": 2, + "nextL": "button[data-testid=issue-timeline-load-more-load-top][aria-disabled=false], button.ajax-pagination-btn[data-disable-with=Loading…]:not([disabled])", + "scrollD": 9999 + } + }, "Github - Issues": { "host": "github.com", "url": "return fun.indexOF(/\\/issues$/)", "style": "[class*='IssueItem-module__ListItem_'] div[class*=LoadingSkeleton]", - "blank": 4, + "blank": 6, "pager": { "nextL": "js; return fun.getNextUP('page=',/page=\\d+/,fun.lp(),'2',fun.getXpath('//a[@rel=\\'next\\'][not(@aria-disabled)]/preceding-sibling::a[1][not(@aria-current)]').textContent)", "pageE": "div[class^='IssueRow-module_']", @@ -4855,7 +5099,7 @@ "blank": 4, "pager": { "nextL": "a[data-testid=pagination-next-button]:not([aria-disabled])", - "pageE": "div[class^='prc-Timeline-Timeline-']>div>div" + "pageE": "div[class^='prc-Timeline-Timeline-']>div" } }, "Github - Tags": { @@ -5000,6 +5244,17 @@ "pageE": ".column-list>li" } }, + "Chiphell": { + "host": "www.chiphell.com", + "url": "/^\\/(article-|portal\\.php)/", + "pager": { + "type": 3, + "nextL": ".nxt", + "pageE": "td#article_content,.bm_c.xld>dl", + "insertP": ["td#article_content,.bm_c.xld",6], + "replaceE": ".pg" + } + }, "致美化": { "host": "zhutix.com", "url": "return fun.isPager('p')", @@ -5194,7 +5449,7 @@ "pager": { "type": 6, "nextL": ".a-selected+li.a-normal>a", - "pageE": "#gridItemRoot", + "pageE": ".a-ordered-list>li.zg-no-numbers", "replaceE": ".a-pagination", "loadTime": 7000, "scrollD": 1000 @@ -5292,7 +5547,7 @@ } }, "kmoe": { - "host": ["mox.moe","kox.moe","kxo.moe","koz.moe"], + "host": ["mox.moe","kox.moe","kxo.moe","koz.moe","kxx.moe","kzz.moe"], "url": "return fun.isPager()", "blank": 3, "pager": { @@ -5367,6 +5622,17 @@ "replaceE": ".pg_pointer" } }, + "哲风壁纸": { + "host": "haowallpaper.com", + "url": "/^\\/(homeView|mobileView)($|\\?)/", + "blank": 3, + "pager": { + "type": 6, + "nextL": "js; return fun.getNextEP('.page-content>.current+.isDefault','page=',/page=\\d+/)", + "pageE": "#main-content .card", + "replaceE": ".page-main" + } + }, "Anime Pictures": { "host": "anime-pictures.net", "url": "return (fun.indexOF('/pictures/') && !fun.indexOF('/view_post/'))", @@ -5546,6 +5812,16 @@ "replaceE": ".pagination" } }, + "中国科普博览 - 科学大院": { + "host": "www.kepu.net.cn", + "url": "/^\\/dayuan\\//", + "pager": { + "type": 6, + "nextL": ".text_align_center.mt50>span+a", + "pageE": ".dy>li", + "replaceE": ".text_align_center.mt50" + } + }, "学佛网": { "host": "www.xuefo.tw", "pager": { @@ -5691,8 +5967,18 @@ "replaceE": "#paging" } }, + "91pron.men": { + "host": ["91pron.men","/^.+\\.(yennew\\.com|scvhuen\\.click|bbbsss\\.org)$/"], + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": "span[aria-current]+a", + "pageE": ".grid.grid-cols-2.md\\:grid-cols-3.xl\\:grid-cols-4.gap-5>div", + "replaceE": "//span[@aria-current]/../../.." + } + }, "xHamster": { - "host": ["/^[a-z]{2}\\.xhamster\\.com$/","/^[a-z]{2}\\..*(xh).*\\.[a-z]{2,}$/"], + "host": ["xhamster.com","/^[a-z]{2}\\.xhamster\\.com$/","/^[a-z]{2}\\..*(xh).*\\.[a-z]{2,}$/"], "url": "return ((fun.isTitle('xHamster') || fun.getCSS('meta[name=application-name][content=xHamster]')) && !fun.indexOF('/videos/') && !fun.indexOF('/photos/gallery'))", "blank": 3, "pager": { @@ -5786,6 +6072,26 @@ "replaceE": ".pages" } }, + "M系镜像": { + "host": "mirror.chromaso.net", + "url": "if(fun.indexOF(/^\\/thread\\/.+/)){rule.thread=true;rule.pager.pageE='.container>.mm-post';return true;}else if(fun.indexOF(/^\\/(forum|search)\\/.+/)){rule.blank=3;return true;}", + "pager": { + "nextL": ".pagination>.active+li>a", + "pageE": "#thread-table-main>tbody>tr", + "replaceE": ".pagination" + } + }, + "肉视频": { + "host": ["rou.video","rouva2.xyz"], + "url": "/^\\/(t\\/|(v|search)($|\\?))/", + "style": ".grid>div[data-slot=card]+div:not([data-slot=card])", + "blank": 3, + "pager": { + "nextL": "a[aria-current=page]+a", + "pageE": ".grid>div[data-slot=card]", + "replaceE": "//nav[@aria-label='Pagination']/../.." + } + }, "Latino Hentai": { "host": "latinohentai.com", "url": "return (!fun.indexOF('/ver/'))", @@ -5806,6 +6112,15 @@ "replaceE": ".navigation" } }, + "underhentai": { + "host": "www.underhentai.net", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": "span.page-num.active+a.page-num", + "pageE": "article.data-block" + } + }, "Avbebe": { "host": "avbebe.com", "url": "return (!fun.indexOF(/^\\/archives\\/\\d/))", @@ -5831,15 +6146,36 @@ "url": "if((fun.indexOF(/^\\/dm\\d+\\//) || fun.indexOF('/search/') || fun.indexOF(/\\/\\(actresses|actors|genres|series|makers|directors\\)\\//)) && fun.isPager('n')){if(fun.isMobile()){rule.blank=0;};return true;}", "blank": 3, "pager": { + "type": 3, "nextL": "a[rel=next]", "pageE": "div[x-init*=initLozad]>div", - "replaceE": "//span[@aria-current='page']/..", - "scrollD": 1000 + "replaceE": "//span[@aria-current='page']/../../..", + "scrollD": 500 }, "function": { "bF": "return fun.src_bF(pageE)" } }, + "123av": { + "host": ["/^123av\\.[a-z]+$/","/^1av\\.[a-z]+$/"], + "url": "return fun.isPager()", + "pager": { + "nextL": "a[rel=next]", + "pageE": ".box-item-list>div, body>script[src*='app.js']", + "replaceE": ".pagination", + "scriptT": 2 + } + }, + "javxx": { + "host": "javxx.com", + "url": "fun.isUrlC();return (!fun.indexOF(/^\\/[a-z]+\\/v\\//) && !fun.indexOF(/^\\/[a-z]+$/))", + "blank": 3, + "pager": { + "nextL": ".page-item.active+li>a", + "pageE": ".vid-items>.item", + "replaceE": "ul.pagination" + } + }, "av6k.org": { "host": "/^([0-9a-z-]+\\.)?av6k([0-9a-z]+)?\\.[a-z]+$/", "url": "fun.insStyle('.clickadu,.clickadulist,#footer,.links,.links-top,.links-top2,.links-top3,a[href^=\\'http://\\'],.footlink,body>div[id][style],#shareQrcode');if(fun.isTitle('AV6K') && fun.lp() !== '/' && fun.getAllCSS('.pages_c').length === 2)return fun.isPager()", @@ -5890,6 +6226,9 @@ "nextL": "js; let next = fun.getXpath(\"//li[@class='page-item' and ./span[contains(@class,'active')]]/following-sibling::li/a\"); if (next) {return `${location.origin}${location.pathname}?mode=async&function=get_block&block_id=${next.dataset.blockId}&${next.dataset.parameters.replace('from_videos+','from_videos=' + next.textContent + '&').replaceAll(':','=').replaceAll(';','&').replaceAll('+','&')}&_=${+new Date()}`;}", "pageE": "section>.row", "replaceE": ".pagination" + }, + "function": { + "aF": "const newItems = fun.getAll('img[data-preview]:not(.preview-initialized)'); newItems.forEach(item => item.classList.add('preview-initialized')); $(newItems).videopreview();" } }, "JavDisk": { @@ -5918,6 +6257,16 @@ "bF": "return fun.src_bF(pageE)" } }, + "JAV吧 JAV8": { + "host": ["jav98.xyz","/^jav8\\.[a-z]+$/"], + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".pagination-next", + "pageE": "a.work", + "replaceE": ".pagination" + } + }, "JieAV": { "host": ["www.jieav.com","www.qinav.com","www.qinimg.com","www.yinmh.com","www.txtxi.com","www.dnaav.com","www.jiedm.com","www.ruav.xyz","www.feiav.com"], "url": "return fun.isPager('r')", @@ -5953,12 +6302,12 @@ }, "Netflav": { "host": "netflav.com", - "url": "return (fun.lp() != '/' && !fun.indexOF(/^\\/(video|actress|browse|genre)$/))", + "url": "fun.isUrlC(); return (fun.lp() != '/' && !fun.indexOF(/^\\/(video|actress|browse|genre)$/))", "blank": 3, "pager": { "type": 6, "nextL": "js; return fun.getNextEP('a.active.item+a.item:not(.icon)','page=',/page=\\d+/)", - "pageE": ".grid_cell", + "pageE": ".grid_0_cell", "replaceE": ".pagination", "loadTime": 1200, "scrollD": 3000 @@ -6130,6 +6479,16 @@ "replaceE": ".pages" } }, + "caribbeancom": { + "host": ["www.caribbeancom.com","en.caribbeancom.com"], + "url": "return (fun.isPager()|fun.indexOF(/\\/(listpages|search)\\//))", + "blank": 3, + "pager": { + "nextL": "a[rel=next]", + "pageE": ".list>.flex-grid>.grid-item, .grid.is-movie>.entry", + "replaceE": ".pagination" + } + }, "16k.club": { "host": "www.16k.club", "url": "return fun.isPager()", @@ -6313,8 +6672,8 @@ } }, "禁漫天堂": { - "host": ["18comic.vip","18comic.org","/^jm-?comic[0-9]?\\.[a-z]+$/"], - "url": "if (fun.indexOF(/^\\/photo\\//)){fun.src_bF(fun.getAllCSS('.scramble-page'),[0,'img[data-original]:not(.lazy-loaded)','data-original']); setTimeout(()=>{document.body.appendChild(document.createElement('script')).textContent = `var old_onImageLoaded = onImageLoaded; onImageLoaded = function(e){aid = parseInt(/photos\\\\/\\\\d+/.exec(e.src)[0].replace('photos/','')); if(aid>scramble_id){old_onImageLoaded(e);}}`},3000); return true}", + "host": ["18comic.vip","18comic.org","/^jmcomic-zzz.[a-z]+$/","/^18comic-[a-z]+.[a-z]+$/","/^jm-?comic[0-9]?\\.[a-z]+$/"], + "url": "if (fun.indexOF(/^\\/photo\\//)){setTimeout(()=>{document.body.appendChild(document.createElement('script')).textContent = `var old_onImageLoaded = onImageLoaded; onImageLoaded = function(e){aid = parseInt(/photos\\\\/\\\\d+/.exec(e.src)[0].replace('photos/','')); if(aid>scramble_id){old_onImageLoaded(e);}}`; fun.src_bF(fun.getAllCSS('.scramble-page'),[0,'img[data-original]:not(.lazy-loaded)','data-original']);},3000); return true}", "style": "[data-group],div[data-page],.thumb-overlay-albums>*:not(.scramble-page):not(.scramble-page1) {display: none !important;} #Comic_Top_Nav[style*='display: block'] {opacity: 0.3;}", "history": true, "pager": { @@ -6329,7 +6688,7 @@ } }, "禁漫天堂 - 分类页": { - "host": ["18comic.vip","18comic.org","/^jm-?comic[0-9]?\\.[a-z]+$/"], + "host": ["18comic.vip","18comic.org","/^jmcomic-zzz.[a-z]+$/","/^18comic-[a-z]+.[a-z]+$/","/^jm-?comic[0-9]?\\.[a-z]+$/"], "url": "/^\\/(albums|search|blogs|videos|movies)/", "style": ".row>[style='z-index: 0;'],.col-lg-3.col-md-3.col-sm-3.col-xs-6", "blank": 3, @@ -6515,6 +6874,16 @@ "loadTime": 500 } }, + "xxxclub": { + "host": "xxxclub.to", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".browsepagination>a:not(.page-link)", + "pageE": ".browsetableinside>ul>li:not(:first-child)", + "replaceE": ".browsepagination" + } + }, "Orzqwq": { "host": "orzqwq.com", "url": "if(fun.indexOF(/\\/p\\/\\d\\/$/)){let t = setInterval(()=>{if(typeof chapter_preloaded_images !== 'undefined'){let _img=''; for (let i=0;i<=chapter_preloaded_images.length;i++){_img += ``;}; document.querySelector('.reading-content').innerHTML = _img;clearInterval(t);}},500); return true;}", @@ -6588,6 +6957,7 @@ "Danbooru": { "host": ["danbooru.donmai.us","e621.net"], "url": "return (fun.lp() == '/' || fun.lp() == '/posts')", + "style": ".post-preview:not(.blacklist-initialized),.image-container:not(.blacklist-initialized){visibility: initial !important;}", "blank": 3, "pager": { "nextL": "a[rel='next']", @@ -6607,19 +6977,39 @@ "loadTime": 1000 } }, + "BepisDB": { + "host": "db.bepis.moe", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".page-item.active+li>a", + "pageE": "#inner-card-body>div", + "replaceE": ".pagination" + } + }, "xchina.co": { "host": ["xchina.co","/^xchina\\.[a-z]+$/","crxs.me","litu100.xyz","8se.me","shise.me"], "url": "return fun.isPager()", - "style": ".quickGuide,.outer-banner,.item[class*=exoclick],.photos>div,.media,.static-container-4,.static-container-5,.recommendation_widget", + "style": ".quickGuide,.outer-banner,.item[class*=exoclick],.item[class=item],.photos>div,.media,.static-container-4,.static-container-5,.recommendation_widget", "pager": { "type": 3, "nextL": "a.next", - "pageE": ".videos>div.item:not([class*=exoclick]), .videos>.video, .list>div.item:not([class*=exoclick]), .photos>a, .fiction-body>.content>p, .fiction-body>.content>.chapters, .lists>a, .comic>div:not([class])", + "pageE": ".videos>div.item:not([class*=exoclick]):not([class=item]), .videos>.video, .list>div.item:not([class*=exoclick]):not([class=item]), .photos>a, .fiction-body>.content>p, .fiction-body>.content>.chapters, .lists>a, .comic>div:not([class])", "replaceE": ".pager,.prevNext", "scrollE": ".pager+div+.pager,.prevNext", "scrollD": 1000 } }, + "西斯新聞": { + "host": "sexynews.gamme.com.tw", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".navi-next", + "pageE": ".List-4", + "replaceE": ".navi-pages" + } + }, "Hentai Foundry": { "host": "www.hentai-foundry.com", "url": "return (fun.lp() != '/' && fun.isPager('p'))", @@ -6709,7 +7099,7 @@ } }, "绅士漫画": { - "host": ["/^(www\\.)?(wnacg|htcomic)\\.[a-z]+$/","/^(www\\.)?(qy|wn)\\d+\\.[a-z]+$/"], + "host": ["/^(www\\.)?(wnacg|htcomic)(\\d+)?\\.[a-z]+$/","/^(www\\.)?(qy|wn)\\d+\\.[a-z]+$/"], "url": "/^\\/(albums|search|photos-index)/", "style": "a.btn[href^='/photos-slide-']{color:#fff !important;background:#ff604a !important;font-weight:bold !important;font-size:22px !important;letter-spacing:10px !important;width:210px !important;height:30px !important;}", "blank": 3, @@ -6720,7 +7110,7 @@ } }, "绅士漫画 - 阅读页(非下拉阅读)": { - "host": ["/^(www\\.)?(wnacg|htcomic)\\.[a-z]+$/","/^(www\\.)?(qy|wn)\\d+\\.[a-z]+$/"], + "host": ["/^(www\\.)?(wnacg|htcomic)(\\d+)?\\.[a-z]+$/","/^(www\\.)?(qy|wn)\\d+\\.[a-z]+$/"], "url": "if(fun.indexOF(/^\\/photos-view-id-\\d+\\.html/) || fun.indexOF('?ctl=photos&act=view&id=','s')){const img=fun.getCSS('#picarea');img.parentElement.outerHTML=img.outerHTML;return true;}", "style": "#tuzaoblock,#bodywrap,.tocaowrap", "pager": { @@ -6729,6 +7119,25 @@ "replaceE": ".newpagewrap" } }, + "巴卡漫画": { + "host": ["bakamh.com","bakamh.ru","/^baka\\d\\.[a-z]+$/"], + "url": "/^\\/manga\\/.+\\/c-/", + "pager": { + "nextL": ".nav-next>a", + "pageE": ".reading-content>.page-break", + "replaceE": ".select-pagination,.select-view" + } + }, + "巴卡漫画 - 列表页": { + "host": ["bakamh.com","bakamh.ru","/^baka\\d\\.[a-z]+$/"], + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": "a.nextpostslink", + "pageE": "#loop-content>.page-listing-item", + "replaceE": ".wp-pagenavi" + } + }, "鸟鸟韩漫": { "host": ["/^nnhanman\\.[a-z]+/","/^nnhanman\\d\\.com/","/^nnhm\\d\\.[a-z]+/"], "url": "/^\\/comic\\/.+\\/chapter-\\d+\\.html/", @@ -6760,6 +7169,19 @@ "replaceE": "nav[role=navigation]" } }, + "fulitu.cc": { + "host": "www.fulitu.cc", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".next>a", + "pageE": "#masonry>.item", + "replaceE": ".page-navigator" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "xiutaku": { "host": "xiutaku.com", "url": "return fun.isPager()", @@ -6832,6 +7254,23 @@ "bF": "return fun.src_bF(pageE)" } }, + "chottie": { + "host": "chottie.com", + "url": "if (fun.indexOF(/^\\/blog\\/archives/)){fun.insStyle('div[pagetotal]>div>div {display: block !important;} a>.v-image {width: auto !important;}');setTimeout(()=>{fun.getCSS('.v-btn-toggle>button:last-of-type').click();},1000)}" + }, + "XiuRenBox": { + "host": "www.xiurenbox.com", + "url": "return fun.isPager()", + "style": ".page-click-zone", + "pager": { + "nextL": ".next", + "pageE": ".wp-block-image>img", + "replaceE": ".simple-page-nav" + }, + "function": { + "bF": "return fun.src_bF(pageE, [0,'img[data-lazy-src]','data-lazy-src'])" + } + }, "MrCong": { "host": "mrcong.com", "pager": { @@ -6867,6 +7306,20 @@ "bF": "return fun.src_bF(pageE)" } }, + "74P福利社": { + "host": "www.74p.net", + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "type": 3, + "nextL": "a.next.page-numbers", + "pageE": "#image_div>p>img,#index_ajax_list>li", + "replaceE": ".nav-links" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "美图乐": { "host": "meitulu.cc", "url": "return fun.isPager()", @@ -7212,6 +7665,19 @@ "replaceE": "#d_list_page,#d_list_foot,table.dc_bar" } }, + "Theav": { + "host": ["theavporn.com","the01.fun","/^theav\\d{3}\\.com/","/^thepa\\d{2}\\.xyz$/","/^tav\\d{3}\\.xyz$/"], + "url": "return fun.isPager()", + "blank": 3, + "pager": { + "nextL": ".pagination>.item.active+div[class=item]>a", + "pageE": ".thumbs>.thumb", + "replaceE": ".pagination" + }, + "function": { + "bF": "return fun.src_bF(pageE)" + } + }, "taotuxp.com": { "host": "www.taotuxp.com", "url": "/^\\/\\d+\\.html/", @@ -7221,6 +7687,16 @@ "replaceE": ".pagelist" } }, + "4khd.com": { + "host": ["4khd.com","www.4khd.com","/^(.+)\\.xxtt\\.ink$/","/^(.+)\\.uuss\\.uk$/"], + "url": "/^\\/content\\//", + "pager": { + "type": 3, + "nextL": ".numpages.current+li>a", + "pageE": "#basicExample>a", + "replaceE": ".page-links" + } + }, "俊美图": { "host": "www.meijuntu.com", "url": "return fun.isPager('r')", @@ -7232,6 +7708,15 @@ "replaceE": ".pages" } }, + "愛麗絲書屋 - 分类/搜索": { + "host": ["www.alicesw.com","www.alicesw.tw","/^(.+)\\.(alicesw2|als1006)\\.([a-z]+)$/"], + "url": "/^\\/(lists|search\\.html)/", + "pager": { + "nextL": ".layui-laypage-next,.active+li>a", + "pageE": ".list-group-item,.rec_rullist>ul,ul.txt-list>li", + "replaceE": ".pagination,.pager" + } + }, "黑料网": { "host": ["18hlw.com","www.hlwxx.com","/.*/"], "url": "return (!fun.indexOF('/archives/') && fun.isTitle('黑料网') && fun.isPager())",