├── .github └── ISSUE_TEMPLATE │ ├── 01-bugReport.yml │ ├── 02-featureRequest.yml │ ├── 03-autoPageRequest.yml │ └── config.yml ├── 3dm-Beautification.user.js ├── 3dm-Enhanced.user.js ├── 52pojie-Beautification.user.js ├── 52pojie-Enhanced.user.js ├── Autopage.user.js ├── CNAME ├── DarkMode.user.js ├── DuckDuckGo-Enhanced.user.js ├── GithubEnhanced-High-Speed-Download.user.js ├── GoogleTranslate-Beautification.user.js ├── HTML5Volume.user.js ├── Hostloc-Enhanced.user.js ├── LICENSE ├── Lanzou-Enhanced.user.js ├── Ping.Sx-Enhanced.user.js ├── README.md ├── RightClick_ScrollBar_BackToTop.user.js ├── SteamWorkshopImageRepair.user.js ├── TargetBlank.user.js ├── V2ex-Enhanced.user.js ├── Zhihu-Beautification.user.js ├── Zhihu-Enhanced.user.js ├── Zhiyoo-Beautification.user.js ├── Zhiyoo-Enhanced.user.js └── other └── Autopage ├── ruleUpdateTime.json └── rules.json /.github/ISSUE_TEMPLATE/01-bugReport.yml: -------------------------------------------------------------------------------- 1 | name: 反馈问题 (Bug report) 2 | description: xxx 脚本的 xxx 功能失效了,或出现其他预期之外的问题... 3 | title: "[脚本名称] xxx 功能失效(记得修改该标题示例,并移除该括号提示)" 4 | labels: 反馈问题 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | 发之前,请先搜下有没有类似的 [**Issues**](https://github.com/XIU2/UserScript/issues) 问题(包括[**关闭**](https://github.com/XIU2/UserScript/issues?q=is%3Aissue+is%3Aclosed)的),请勿重复发起! 10 | > [!NOTE] 11 | > 注意!**不接受**与其他脚本/扩展 `功能冲突` 的相关问题反馈(原因见 [#146](https://github.com/XIU2/UserScript/issues/146))! 12 | **** 13 | - type: textarea 14 | id: description 15 | attributes: 16 | label: 问题描述 17 | description: 必填,最好写上 复现问题 的步骤,越详细越好,特别是一些复杂的问题 18 | placeholder: 请输入... 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: screenshots 23 | attributes: 24 | label: 附加截图 25 | description: 可选,也可以是一些错误代码 26 | placeholder: 可在此粘贴图片,或点击下方 [Attach files by dragging & dropping, selecting or pasting them.] 文字来选择图片... -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/02-featureRequest.yml: -------------------------------------------------------------------------------- 1 | name: 功能建议 (Feature request) 2 | description: xxx 脚本的 xxx 功能有什么建议,或希望添加一些新功能... 3 | title: "[脚本名称] 希望添加 xxx 功能(记得修改该标题示例,并移除该括号提示)" 4 | labels: 功能建议 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | > [!NOTE] 10 | > ***注意:本项目已不再接受任何【新脚本请求】!*** 11 | **** 12 | 发之前,请先搜下有没有类似的 [**Issues**](https://github.com/XIU2/UserScript/issues) (包括[**关闭**](https://github.com/XIU2/UserScript/issues?q=is%3Aissue+is%3Aclosed)的),请勿重复发起! 13 | 14 | > [!NOTE] 15 | > 注意!**不接受**与其他脚本/扩展 `功能冲突` 的相关问题反馈(原因见 [#146](https://github.com/XIU2/UserScript/issues/146))! 16 | 17 | 另外,无论添加修改什么功能,都需要消耗大量时间与精力,因此请确保该功能建议是大家都需要的,而不是只为了满足个人小众需求! 18 | **** 19 | - type: textarea 20 | id: description 21 | attributes: 22 | label: 功能需求 23 | description: 必填,你要什么样的功能? 24 | placeholder: 请输入... 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: anticipation 29 | attributes: 30 | label: 预期目标 31 | description: 必填,你希望该功能具体是什么样子的?如果能提供 示例/截图/代码 就更好了 32 | placeholder: 请输入... 33 | validations: 34 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/03-autoPageRequest.yml: -------------------------------------------------------------------------------- 1 | name: 自动无缝翻页 - 申请添加支持 (Autopage request) 2 | description: 自动无缝翻页 脚本 申请添加支持 xxx 网站... 3 | title: "[自动无缝翻页] 申请添加支持 xxx 网站(记得修改该标题示例,并移除该括号提示)" 4 | labels: 功能建议 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | > [!NOTE] 10 | > ***注意:因为精力有限,目前主要维护现有规则,想要让我花费时间和精力帮你写规则,就请务必看完以下 `申请必读` !*** 11 | **** 12 | 发之前,请先搜下有没有类似的 [**Issues**](https://github.com/XIU2/UserScript/issues) (包括[**关闭**](https://github.com/XIU2/UserScript/issues?q=is%3Aissue+is%3Aclosed)的),请勿重复发起! 13 | 14 | > [!IMPORTANT] 15 | > ### \# 申请必读: 16 | > 1. 请先确认 **`不是动态加载内容`** 的网站(**鼠标指向页码,左下角不显示链接即代表是动态加载**),这类网站无法制作规则。 17 | > 2. 如 **`需要登录`** 才能看到内容,请先联系我**私下告诉账号**,否则我**无法凭空制作**翻页规则(网课类不会添加支持)。 18 | > 3. 请直接提供 **`具体页面的网页地址 URL`** (特别是一些**页面很多的网站**),尽量减少我的工作量,否则可能拒绝申请。 19 | 20 | > - 另外,对于**正版小说/漫画**网站,因为反爬防盗的原因也会导致无法制作规则(该脚本本质上也是爬虫,虽然只爬取下一页)。 21 | > - 另外,对于**没有 HTTPS** 的网站(这种网站目前全网占比极少,且大都是一些老旧网站),是不考虑添加支持。 22 | > - 另外,如果你要申请脚本对 `某个博客/论坛系统` 添加支持(即通用规则,所有使用这个博客/论坛系统的网站都会支持),那么需要提供 `官方博客/论坛地址` 及 其他**几个使用该博客/论坛系统的网站地址**,用于对比、验证,才能写出通用规则。 23 | **** 24 | - type: input 25 | id: websitename 26 | attributes: 27 | label: 申请添加支持的 网站名称 28 | description: 必填,网站名字叫什么?方便我一眼识别网站类型 29 | placeholder: 请输入... 30 | validations: 31 | required: true 32 | - type: textarea 33 | id: webaddress 34 | attributes: 35 | label: 申请添加支持的 网页地址 36 | description: 必填,请提供要添加自动翻页支持的 **`具体网页地址 URL`**(各类希望添加支持的页面地址都要写上,如首页、分类页、搜索页、阅读页什么的),***请勿只提供一个网站首页地址***(除非你只需要对 首页 添加支持),否则可能会直接拒绝申请。 37 | placeholder: https://xxx 38 | validations: 39 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false -------------------------------------------------------------------------------- /3dm-Beautification.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 3DM论坛美化 3 | // @version 1.0.2 4 | // @author X.I.U 5 | // @description 精简多余内容、样式优化 6 | // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC0klEQVR4nJ1TS0hUYRT+/nuvd2Z0nMbRrpPpTJozoZliQmEFFkT0QlwIRWlUi4jIaFGLqE0ELlsEElGrGCKimhaVVmhW9CBSy5ohk/I1pvO66R3nOt7X30IxoyTog8OBc/i+83EOB1gEoRP8Yq3fQP5WvHxqW7kkKfkmXgx+D3PCmjLLuPYmNXyotevfAud9XhQEHZtLKpe3uAozS+12MyRJRTSc7O7tCp9uOPe0Y1GBGAUeXdiyc8vuIr8gmHgQgFACSgwQg0L8oWtP7w3s2Z/vvKse9v0pcLup3FpWV97v8S5xElBMz2hgGIKRgQRcRZmYljVEo4r45E5gVVmtMNH3UC3ifvOfZ693OC3OB50jUFRAkjTIsoqjB7xo7YhgaERChpU4isuXHUsNs+Km7Y5K8rl1L2/PHld8gSFUa6V+r6TXhWMzMNW4EArFQCMRGNMywLFgLOnIXZoD0/PIuHXfSnvUwHUuqTNdJJFvW5+WfSs3z7TVnJiB25WJyXQNjpwl0LJXQVM4ECLDYorDXWJDPM/qzPJmYaxbjHBQlFfFlc4jqZRyyr3aDgYABYXJXIFl6esAws7vm1IFRvIteOktDB0IDYg9zMfP4ZbhwamUp2SWDBBQvhhsxgYQwoEBAQOAAQVD0sBaN0JPc6O/XwoyRk4bE+tLGmJUluSkDk2nSKVUwLIGhC48EQFAQOYyNa99FUiMVQ1Vt8kkPhHnfCd3OYXCjKYCj+0gz0Oo2nEGhDHNEX7BAKAbFIFnzxsrdzb5AIDJsmWh8eK9cUvDjrOv28dqCEsGDarOTgLmwwCgaho+vHx5M3i1+ca8N0opBwDJxAzux9/hffMlW3WF7cqKQk+9RXCBsCx0g079+BpgRjv9Zvtqwb31eHtooQADALquYzQmom/yGnofqzb3txe1kw6PKEOYoBmsbKaKmVeT6SNJ9kvPp68xv98v//FZ/4OfGzYzfKjarqcAAAAASUVORK5CYII= 7 | // @match *://bbs.3dmgame.com/* 8 | // @license GPL-3.0 License 9 | // @run-at document-start 10 | // @namespace https://greasyfork.org/scripts/413593 11 | // @supportURL https://github.com/XIU2/UserScript 12 | // @homepageURL https://github.com/XIU2/UserScript 13 | // ==/UserScript== 14 | 15 | (function() { 16 | 'use strict'; 17 | let style_Add = document.createElement('style'); 18 | style_Add.innerHTML = ` 19 | [url=home.php?mod=space&uid=945662]@media[/url] (min-width:1366px) { 20 | body { 21 | background: none; 22 | } 23 | .wp { 24 | width: 70%; 25 | } 26 | } 27 | @media (max-width:650px) { 28 | #postlist .favatar.pls .avatar img { 29 | margin: 0 0 2px; 30 | } 31 | } 32 | #toptb, .dnch_eo_pt,.dnch_eo_pr, .dnch_eo_f, .bml, dl.pil.cl, td.plc.plm .sign, .dnch_eo_pb,.dnch_eo_pt, .pls .side-star, .pls .side-group, div#h_nv, .res-footer-note, a>img[border="0"].zoom, .md_ctrl, .pls.favatar .xg1, .wp.a_h, .hd_table, .a_cn, .wp.a_f, .bm.lk, .a_pt { 33 | display: none !important; 34 | } 35 | .pls .avatar img { 36 | width: 100px; 37 | height: 100px; 38 | background: none; 39 | padding: 0; 40 | border: 4px solid #ffffff 41 | } 42 | .avtm img { 43 | width: 60px; 44 | } 45 | .pls .avatar { 46 | text-align: center; 47 | } 48 | .t_fsz { 49 | min-height: 60px; 50 | } 51 | .pls .pi { 52 | text-align: center; 53 | padding: 10px 0 0 0; 54 | border: none; 55 | overflow: visible; 56 | } 57 | .xw1 { 58 | font-size: 15px; 59 | } 60 | textarea#fastpostmessage { 61 | background: none !important; 62 | } 63 | .pcb img { 64 | max-width: 60%; 65 | margin: 4px; 66 | } 67 | .rate { 68 | margin: 0; 69 | } 70 | .ratl td { 71 | padding: 0px; 72 | } 73 | .xw1 { 74 | font-size: 12px; 75 | font-weight: 500; 76 | } 77 | .xi2,.xi2 a,.xi3 a { 78 | color: red; 79 | } 80 | .mtw { 81 | margin-top: 0px !important; 82 | } 83 | #p_btn { 84 | padding: 0px; 85 | margin: 0 0 0 1px; 86 | display: flex; 87 | justify-content: space-evenly; 88 | } 89 | #scbar { 90 | border-top: 0; 91 | border-bottom: 0; 92 | }`; 93 | if (document.head) { 94 | document.head.appendChild(style_Add); 95 | } else { 96 | let timer = setInterval(function(){ 97 | if (document.head) { 98 | document.head.appendChild(style_Add); 99 | clearInterval(timer); 100 | } 101 | }); 102 | } 103 | })(); -------------------------------------------------------------------------------- /3dm-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 3DM论坛增强 3 | // @version 1.1.3 4 | // @author X.I.U 5 | // @description 自动回复、自动无缝翻页、清理置顶帖子、自动滚动至隐藏内容 6 | // @match *://bbs.3dmgame.com/* 7 | // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC0klEQVR4nJ1TS0hUYRT+/nuvd2Z0nMbRrpPpTJozoZliQmEFFkT0QlwIRWlUi4jIaFGLqE0ELlsEElGrGCKimhaVVmhW9CBSy5ohk/I1pvO66R3nOt7X30IxoyTog8OBc/i+83EOB1gEoRP8Yq3fQP5WvHxqW7kkKfkmXgx+D3PCmjLLuPYmNXyotevfAud9XhQEHZtLKpe3uAozS+12MyRJRTSc7O7tCp9uOPe0Y1GBGAUeXdiyc8vuIr8gmHgQgFACSgwQg0L8oWtP7w3s2Z/vvKse9v0pcLup3FpWV97v8S5xElBMz2hgGIKRgQRcRZmYljVEo4r45E5gVVmtMNH3UC3ifvOfZ693OC3OB50jUFRAkjTIsoqjB7xo7YhgaERChpU4isuXHUsNs+Km7Y5K8rl1L2/PHld8gSFUa6V+r6TXhWMzMNW4EArFQCMRGNMywLFgLOnIXZoD0/PIuHXfSnvUwHUuqTNdJJFvW5+WfSs3z7TVnJiB25WJyXQNjpwl0LJXQVM4ECLDYorDXWJDPM/qzPJmYaxbjHBQlFfFlc4jqZRyyr3aDgYABYXJXIFl6esAws7vm1IFRvIteOktDB0IDYg9zMfP4ZbhwamUp2SWDBBQvhhsxgYQwoEBAQOAAQVD0sBaN0JPc6O/XwoyRk4bE+tLGmJUluSkDk2nSKVUwLIGhC48EQFAQOYyNa99FUiMVQ1Vt8kkPhHnfCd3OYXCjKYCj+0gz0Oo2nEGhDHNEX7BAKAbFIFnzxsrdzb5AIDJsmWh8eK9cUvDjrOv28dqCEsGDarOTgLmwwCgaho+vHx5M3i1+ca8N0opBwDJxAzux9/hffMlW3WF7cqKQk+9RXCBsCx0g079+BpgRjv9Zvtqwb31eHtooQADALquYzQmom/yGnofqzb3txe1kw6PKEOYoBmsbKaKmVeT6SNJ9kvPp68xv98v//FZ/4OfGzYzfKjarqcAAAAASUVORK5CYII= 8 | // @grant GM_xmlhttpRequest 9 | // @grant GM_registerMenuCommand 10 | // @grant GM_unregisterMenuCommand 11 | // @grant GM_openInTab 12 | // @grant GM_getValue 13 | // @grant GM_setValue 14 | // @grant GM_notification 15 | // @license GPL-3.0 License 16 | // @run-at document-end 17 | // @namespace https://greasyfork.org/scripts/412890 18 | // @supportURL https://github.com/XIU2/UserScript 19 | // @homepageURL https://github.com/XIU2/UserScript 20 | // ==/UserScript== 21 | 22 | (function() { 23 | 'use strict'; 24 | var menu_ALL = [ 25 | ['menu_autoReply', '自动回复', '自动回复', true], 26 | ['menu_cleanTopPost', '清理置顶帖子', '清理置顶帖子', true], 27 | ['menu_thread_pageLoading', '帖子内自动翻页', '帖子内自动翻页', true], 28 | ['menu_scrollToShowhide', '自动滚动至隐藏内容', '自动滚动至隐藏内容', true] 29 | ], menu_ID = []; 30 | for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 38 | for (let i=0;i div[id^="post_"]', 110 | HT_insert: ['css;div#postlist', 2], 111 | replaceE: 'css;#ct > .pgs' 112 | } 113 | }, 114 | search: { 115 | SiteTypeID: 3, 116 | pager: { 117 | nextLink: '//a[@class="nxt"][@href]', 118 | pageElement: 'css;div#threadlist > ul', 119 | HT_insert: ['css;div#threadlist', 2], 120 | replaceE: 'css;div.pg' 121 | } 122 | }, 123 | guide: { 124 | SiteTypeID: 4, 125 | pager: { 126 | nextLink: '//a[@class="nxt"][@href]', 127 | pageElement: 'css;div#threadlist div.bm_c table > tbody', 128 | HT_insert: ['css;div#threadlist div.bm_c table', 2], 129 | replaceE: 'css;div.pg' 130 | } 131 | }, 132 | youspace: { 133 | SiteTypeID: 5, 134 | pager: { 135 | nextLink: '//a[@class="nxt"][@href]', 136 | pageElement: 'css;tbody > tr:not(.th)', 137 | HT_insert: ['css;tbody', 2], 138 | replaceE: 'css;div.pg' 139 | } 140 | } 141 | }; 142 | 143 | // 用于脚本内部判断当前 URL 类型 144 | let SiteType = { 145 | FORUM: DBSite.forum.SiteTypeID, // 各板块帖子列表 146 | THREAD: DBSite.thread.SiteTypeID, // 帖子内 147 | GUIDE: DBSite.guide.SiteTypeID // 导读帖子列表 148 | }; 149 | 150 | // 下一页URL 151 | curSite.pageUrl = ""; 152 | 153 | // URL 匹配正则表达式 154 | let patt_thread = /\/thread-\d+-\d+\-\d+.html/, 155 | patt_forum = /\/forum-\d+-\d+\.html/ 156 | 157 | // URL 判断 158 | if (patt_thread.test(location.pathname) || location.search.indexOf('mod=viewthread') > -1){ 159 | // 帖子内 160 | hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮 161 | if(menu_value('menu_thread_pageLoading'))curSite = DBSite.thread; 162 | if(menu_value('menu_autoReply'))autoReply(); // 如果有隐藏内容,则自动回复 163 | if(menu_value('menu_scrollToShowhide'))setTimeout(function(){window.scrollTo(0,document.querySelector('.showhide').offsetTop)}, 500); // 滚动至隐藏内容 164 | } else if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1){ 165 | // 各板块帖子列表 166 | curSite = DBSite.forum; 167 | if(menu_value('menu_cleanTopPost'))cleanTopPost(); // 清理置顶帖子 168 | } else if (location.search.indexOf('mod=guide') > -1){ 169 | // 导读帖子列表 170 | curSite = DBSite.guide; 171 | } else if (location.pathname === '/search.php') { 172 | // 搜索结果列表 173 | curSite = DBSite.search; 174 | } else if(location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { 175 | // 别人的主题/回复 176 | curSite = DBSite.youspace; 177 | } else { 178 | curSite = DBSite.forum; 179 | } 180 | 181 | pageLoading(); // 自动翻页 182 | 183 | 184 | // 判断是否登陆 185 | function checkLogin(){ 186 | let checklogin = document.querySelectorAll('.wp.h_menu p a'); 187 | if (checklogin){ 188 | for (let value of checklogin) { 189 | if (value.textContent == '退出'){ 190 | loginStatus = true; 191 | } 192 | } 193 | } 194 | } 195 | 196 | 197 | // 自动回复 198 | function autoReply(){ 199 | if (loginStatus){ 200 | // 存在隐藏内容,则自动回复 201 | let autoreply = document.querySelector('.locked a'); 202 | if (autoreply){ 203 | writeReply(); 204 | // 滚动至隐藏内容 205 | if(menu_value('menu_scrollToShowhide')){ 206 | let showhideTime=setInterval(function(){ 207 | let showhide=document.querySelector('.showhide') 208 | if(showhide){ 209 | clearInterval(showhideTime) 210 | window.scrollTo(0,showhide.offsetTop) 211 | }}, 100) 212 | }else{ 213 | setTimeout(function(){window.scrollTo(0,0)}, 1000); 214 | } 215 | } 216 | } 217 | 218 | } 219 | 220 | 221 | // 写入自动回复内容 222 | function writeReply(){ 223 | let textarea = document.getElementById('fastpostmessage'); 224 | if (textarea){ 225 | textarea.value = textarea.value + replyList[Math.floor((Math.random()*replyList.length))] + replyList[Math.floor((Math.random()*replyList.length))]; 226 | let fastpostsubmit = document.getElementById('fastpostsubmit'); 227 | if (fastpostsubmit){ 228 | fastpostsubmit.click(); 229 | } 230 | } 231 | } 232 | 233 | 234 | // 清理置顶帖子 235 | function cleanTopPost(){ 236 | let showhide = document.querySelectorAll('a.showhide.y'); 237 | if (showhide.length > 0){ 238 | showhide.forEach(el=>el.click()); 239 | } 240 | } 241 | 242 | 243 | // 隐藏帖子内的 [下一页] 按钮 244 | function hidePgbtn() { 245 | document.lastChild.appendChild(document.createElement('style')).textContent = '.pgbtn {display: none;}'; 246 | } 247 | 248 | 249 | // 自动翻页 250 | function pageLoading() { 251 | if (curSite.SiteTypeID > 0){ 252 | windowScroll(function (direction, e) { 253 | if (direction === 'down') { // 下滑才准备翻页 254 | let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; 255 | let scrollDelta = 666; 256 | if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) { 257 | if (curSite.SiteTypeID === SiteType.FORUM) { // 如果是各版块帖子列表则直接点下一页就行了 258 | let autopbn = document.querySelector('#autopbn'); 259 | if (autopbn && autopbn.textContent == '下一页 »'){ // 如果已经在加载中了,就忽略 260 | autopbn.click(); 261 | } 262 | }else{ 263 | ShowPager.loadMorePage(); 264 | } 265 | } 266 | } 267 | }); 268 | } 269 | } 270 | 271 | 272 | // 滚动条事件 273 | function windowScroll(fn1) { 274 | var beforeScrollTop = document.documentElement.scrollTop, 275 | fn = fn1 || function () {}; 276 | setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件 277 | window.addEventListener('scroll', function (e) { 278 | var afterScrollTop = document.documentElement.scrollTop, 279 | delta = afterScrollTop - beforeScrollTop; 280 | if (delta == 0) return false; 281 | fn(delta > 0 ? 'down' : 'up', e); 282 | beforeScrollTop = afterScrollTop; 283 | }, false); 284 | }, 1000) 285 | } 286 | 287 | 288 | // 修改自 https://greasyfork.org/scripts/14178 , https://github.com/machsix/Super-preloader 289 | var ShowPager = { 290 | getFullHref: function (e) { 291 | if (e != null && e.nodeType === 1 && e.href && e.href.slice(0,4) === 'http') return e.href; 292 | return ''; 293 | }, 294 | createDocumentByString: function (e) { 295 | if (e) { 296 | if ('HTML' !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, 'application/xhtml+xml'); 297 | var t; 298 | try { t = (new DOMParser).parseFromString(e, 'text/html');} catch (e) {} 299 | if (t) return t; 300 | if (document.implementation.createHTMLDocument) { 301 | t = document.implementation.createHTMLDocument('ADocument'); 302 | } else { 303 | 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) {} 304 | } 305 | if (t) { 306 | var r = document.createRange(), 307 | n = r.createContextualFragment(e); 308 | r.selectNodeContents(document.body); 309 | t.body.appendChild(n); 310 | 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); 311 | return t; 312 | } 313 | } else console.error('没有找到要转成 DOM 的字符串'); 314 | }, 315 | loadMorePage: function () { 316 | if (curSite.pager) { 317 | let curPageEle = getElementByXpath(curSite.pager.nextLink); 318 | var url = this.getFullHref(curPageEle); 319 | //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`); 320 | if(url === '') return; 321 | if(curSite.pageUrl === url) return;// 不会重复加载相同的页面 322 | curSite.pageUrl = url; 323 | // 读取下一页的数据 324 | curSite.pager.startFilter && curSite.pager.startFilter(); 325 | GM_xmlhttpRequest({ 326 | url: url, 327 | method: "GET", 328 | timeout: 5000, 329 | onload: function (response) { 330 | try { 331 | var newBody = ShowPager.createDocumentByString(response.responseText); 332 | let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody); 333 | let toElement = getAllElements(curSite.pager.HT_insert[0])[0]; 334 | if (pageElems.length >= 0) { 335 | let addTo = "beforeend"; 336 | if (curSite.pager.HT_insert[1] == 1) addTo = "beforebegin"; 337 | // 插入新页面元素 338 | pageElems.forEach(function (one) { 339 | toElement.insertAdjacentElement(addTo, one); 340 | }); 341 | // 替换待替换元素 342 | try { 343 | let oriE = getAllElements(curSite.pager.replaceE); 344 | let repE = getAllElements(curSite.pager.replaceE, newBody, newBody); 345 | if (oriE.length === repE.length) { 346 | for (var i = 0; i < oriE.length; i++) { 347 | oriE[i].outerHTML = repE[i].outerHTML; 348 | } 349 | } 350 | } catch (e) { 351 | console.log(e); 352 | } 353 | } 354 | } catch (e) { 355 | console.log(e); 356 | } 357 | } 358 | }); 359 | } 360 | }, 361 | }; 362 | function getElementByCSS(css, contextNode = document) { 363 | return contextNode.querySelector(css); 364 | } 365 | function getAllElementsByCSS(css, contextNode = document) { 366 | return [].slice.call(contextNode.querySelectorAll(css)); 367 | } 368 | function getElementByXpath(xpath, contextNode, doc = document) { 369 | contextNode = contextNode || doc; 370 | try { 371 | const result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 372 | // 应该总是返回一个元素节点 373 | return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue; 374 | } catch (err) { 375 | throw new Error(`Invalid xpath: ${xpath}`); 376 | } 377 | } 378 | function getAllElementsByXpath(xpath, contextNode, doc = document) { 379 | contextNode = contextNode || doc; 380 | const result = []; 381 | try { 382 | const query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 383 | for (let i = 0; i < query.snapshotLength; i++) { 384 | const node = query.snapshotItem(i); 385 | // 如果是 Element 节点 386 | if (node.nodeType === 1) result.push(node); 387 | } 388 | } catch (err) { 389 | throw new Error(`无效 Xpath: ${xpath}`); 390 | } 391 | return result; 392 | } 393 | function getAllElements(selector, contextNode = undefined, doc = document, win = window, _cplink = undefined) { 394 | if (!selector) return []; 395 | contextNode = contextNode || doc; 396 | if (typeof selector === 'string') { 397 | if (selector.search(/^css;/i) === 0) { 398 | return getAllElementsByCSS(selector.slice(4), contextNode); 399 | } else { 400 | return getAllElementsByXpath(selector, contextNode, doc); 401 | } 402 | } else { 403 | const query = selector(doc, win, _cplink); 404 | if (!Array.isArray(query)) { 405 | throw new Error('getAllElements 返回错误类型'); 406 | } else { 407 | return query; 408 | } 409 | } 410 | } 411 | })(); -------------------------------------------------------------------------------- /52pojie-Beautification.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 吾爱破解论坛美化 3 | // @version 1.0.9 4 | // @author X.I.U 5 | // @description 精简多余内容、样式优化 6 | // @match *://www.52pojie.cn/* 7 | // @icon data:image/png;base64,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 8 | // @grant GM_registerMenuCommand 9 | // @grant GM_unregisterMenuCommand 10 | // @grant GM_openInTab 11 | // @grant GM_getValue 12 | // @grant GM_setValue 13 | // @grant GM_notification 14 | // @license GPL-3.0 License 15 | // @run-at document-start 16 | // @namespace https://greasyfork.org/scripts/412681 17 | // @supportURL https://github.com/XIU2/UserScript 18 | // @homepageURL https://github.com/XIU2/UserScript 19 | // ==/UserScript== 20 | 21 | (function() { 22 | 'use strict'; 23 | GM_registerMenuCommand('💬 反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/412681/feedback', {active: true,insert: true,setParent: true});}); 24 | addStyle(); 25 | function addStyle() { 26 | let style = `.bml {display:none !important;} 27 | #postlist .plc .t_f img, #postlist .plc .tattl img { 28 | max-height: 500px !important; 29 | width: auto !important; 30 | } 31 | a[href="connect.php?mod=config"], #toptb, #navmenu, #nv_ph, #nv, #pt .y, #chart, #ft, #custominfo_pmenu, .bm.lk, .dnch_eo_pt, .dnch_eo_pr, .dnch_eo_f, dl.pil.cl, td.plc.plm .sign, .dnch_eo_pb, .dnch_eo_pt, .pls .side-star, .pls .side-group, .res-footer-note, .comiis_nav, .scbar_hot_td, .md_ctrl, .pls.favatar .xg1 { 32 | display:none !important; 33 | } 34 | 35 | @media (max-width:650px) { 36 | #postlist .favatar.pls .avatar img { 37 | margin:0 0 2px; 38 | } 39 | .pls .avatar img { 40 | background:none; 41 | padding:0; 42 | border:4px solid #ffffff 43 | } 44 | .avtm img { 45 | width:60px; 46 | } 47 | } 48 | .t_fsz { 49 | min-height:60px; 50 | } 51 | .pls .pi { 52 | text-align:center; 53 | padding:10px 0 0 0; 54 | border:none; 55 | overflow:visible; 56 | } 57 | .xw1 { 58 | font-size:15px; 59 | } 60 | textarea#fastpostmessage { 61 | background:none !important; 62 | } 63 | .pcb img { 64 | max-width:60%; 65 | margin:4px; 66 | } 67 | .rate { 68 | margin:0; 69 | } 70 | .ratl td { 71 | padding:0px; 72 | } 73 | .xw1 { 74 | font-size:12px; 75 | font-weight:500; 76 | } 77 | .xi2,.xi2 a,.xi3 a { 78 | color:red; 79 | } 80 | .toptitle_7ree td { 81 | border-top: 1px solid #CDCDCD; 82 | } 83 | .mtw { 84 | margin-top:0px !important; 85 | } 86 | 87 | #p_btn { 88 | padding:0px; 89 | margin:0 0 0 1px; 90 | display:flex; 91 | justify-content:space-evenly; 92 | } 93 | #scbar { 94 | border-top:0; 95 | border-bottom:0; 96 | background:0; 97 | } 98 | 99 | .pls .o li { 100 | margin: 0 !important;; 101 | height: 20px !important;; 102 | line-height: 20px !important;; 103 | } 104 | 105 | /* 左侧层主信息 */ 106 | .pls .avatar img {width: auto !important;max-height: 100px !important;} 107 | .pls .avatar {text-align:center !important; margin: 0 !important;} 108 | .pls .tns {padding: 0 !important;} 109 | 110 | /* 链接点击后颜色变浅(灰白色) */ 111 | .tl th a:visited, .tl td.fn a:visited { 112 | color: #aaa; 113 | }`; 114 | document.lastChild.appendChild(document.createElement('style')).textContent = style; 115 | } 116 | })(); -------------------------------------------------------------------------------- /52pojie-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 吾爱破解论坛增强 - 自动签到、翻页 3 | // @version 1.3.7 4 | // @author X.I.U 5 | // @description 自动签到、自动无缝翻页、屏蔽导读悬赏贴(最新发表页) 6 | // @match *://www.52pojie.cn/* 7 | // @icon data:image/png;base64,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 8 | // @grant GM_xmlhttpRequest 9 | // @grant GM_registerMenuCommand 10 | // @grant GM_unregisterMenuCommand 11 | // @grant GM_openInTab 12 | // @grant GM_getValue 13 | // @grant GM_setValue 14 | // @grant GM_notification 15 | // @license GPL-3.0 License 16 | // @run-at document-end 17 | // @namespace https://greasyfork.org/scripts/412680 18 | // @supportURL https://github.com/XIU2/UserScript 19 | // @homepageURL https://github.com/XIU2/UserScript 20 | // ==/UserScript== 21 | 22 | (function() { 23 | 'use strict'; 24 | var menu_ALL = [ 25 | ['menu_autoClockIn', '自动签到', '自动签到', true], 26 | ['menu_pageLoading', '自动无缝翻页', '自动无缝翻页', true], 27 | ['menu_thread_pageLoading', '帖子内自动无缝翻页', '帖子内自动无缝翻页', true], 28 | ['menu_delateReward', '屏蔽导读悬赏贴(最新发表)', '屏蔽导读悬赏贴', true] 29 | ], menu_ID = []; 30 | for (let i=0;i menu_ALL.length) { // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 38 | for (let i=0;i div[id^="post_"]', 95 | HT_insert: ['css;div#postlist', 2], 96 | replaceE: 'css;#ct > .pgs', 97 | scrollDelta: 766 98 | } 99 | }, 100 | search: { 101 | SiteTypeID: 3, 102 | pager: { 103 | type: 1, 104 | nextLink: '//a[@class="nxt"][@href]', 105 | pageElement: 'css;div#threadlist > ul', 106 | HT_insert: ['css;div#threadlist', 2], 107 | replaceE: 'css;div.pg', 108 | scrollDelta: 766 109 | } 110 | }, 111 | guide: { 112 | SiteTypeID: 4, 113 | pager: { 114 | type: 1, 115 | nextLink: '//a[@class="nxt"][@href]', 116 | pageElement: 'css;div#threadlist div.bm_c table > tbody', 117 | HT_insert: ['css;div#threadlist div.bm_c table', 2], 118 | replaceE: 'css;div.pg', 119 | scrollDelta: 766 120 | } 121 | }, 122 | youspace: { 123 | SiteTypeID: 5, 124 | pager: { 125 | type: 1, 126 | nextLink: '//a[@class="nxt"][@href]', 127 | pageElement: 'css;tbody > tr:not(.th)', 128 | HT_insert: ['css;tbody', 2], 129 | replaceE: 'css;div.pg', 130 | scrollDelta: 1000 131 | } 132 | }, 133 | collection: { 134 | SiteTypeID: 6, 135 | pager: { 136 | type: 1, 137 | nextLink: '//a[@class="nxt"][@href]', 138 | pageElement: 'css;div#ct div.bm_c table > tbody', 139 | HT_insert: ['css;div#ct div.bm_c table', 2], 140 | replaceE: 'css;div.pg', 141 | scrollDelta: 899 142 | } 143 | }, 144 | favorite: { 145 | SiteTypeID: 7, 146 | pager: { 147 | type: 1, 148 | nextLink: '//a[@class="nxt"][@href]', 149 | pageElement: 'css;ul#favorite_ul > li', 150 | HT_insert: ['css;ul#favorite_ul', 2], 151 | replaceE: 'css;div.pg', 152 | scrollDelta: 899 153 | } 154 | } 155 | }; 156 | 157 | // URL 匹配正则表达式 158 | let patt_thread = /\/thread-\d+-\d+\-\d+.html/, 159 | patt_forum = /\/forum-\d+-\d+\.html/ 160 | 161 | // URL 判断 162 | if (patt_thread.test(location.pathname) || location.search.indexOf('mod=viewthread') > -1) { 163 | if (menu_value('menu_thread_pageLoading')) { 164 | curSite = DBSite.thread; // 帖子内 165 | hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮 166 | } 167 | } else if (patt_forum.test(location.pathname) || location.search.indexOf('mod=forumdisplay') > -1) { 168 | curSite = DBSite.forum; // 各板块帖子列表 169 | } else if (location.search.indexOf('mod=guide') > -1) { 170 | curSite = DBSite.guide; // 导读帖子列表 171 | delateReward(); // 屏蔽导读悬赏贴(最新发表) 172 | } else if (location.search.indexOf('mod=collection') > -1) { 173 | curSite = DBSite.collection; // 淘贴列表 174 | } else if (location.search.indexOf('do=favorite') > -1) { 175 | curSite = DBSite.favorite; // 收藏列表 176 | } else if (location.pathname === '/search.php') { 177 | curSite = DBSite.search; // 搜索结果列表 178 | } else if(location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { // 别人的主题/回复 179 | curSite = DBSite.youspace; 180 | } 181 | curSite.pageUrl = ''; // 下一页URL 182 | 183 | qianDao(); // 自动签到 184 | pageLoading(); // 自动翻页 185 | 186 | 187 | // 自动签到(后台) 188 | function qianDao() { 189 | if (!menu_value('menu_autoClockIn')) return 190 | if (location.pathname === '/home.php' && location.search.indexOf('mod=task') > -1) {return;} 191 | let qiandao = document.querySelector('#um a[href^="home.php?mod=task&do=apply&id=2"]'); 192 | if (qiandao) { 193 | let iframe = document.createElement('iframe'); // XHR 方式无法签到,改用 iframe 框架打开签到网页 194 | document.lastElementChild.appendChild(iframe); 195 | iframe.style = 'display: none;'; 196 | iframe.src = qiandao.href; 197 | qiandao.querySelector('.qq_bind').src = 'https://www.52pojie.cn/static/image/common/wbs.png'; // 修改 [打卡签到] 图标为 [签到完毕] 图标 198 | qiandao.href = 'javascript:void(0);' 199 | } 200 | } 201 | 202 | 203 | //屏蔽悬赏贴(导读-最新发表) 204 | function delateReward() { 205 | if (!menu_value('menu_delateReward')) return 206 | if (location.search.indexOf('mod=guide&view=newthread') > -1) { 207 | let tbody = document.querySelectorAll('#threadlist tbody[id^="normalthread"]'); 208 | Array.from(tbody).forEach(function (_this) { 209 | if (_this.querySelector('img[alt="悬赏"]')) { 210 | _this.remove(); 211 | } 212 | }) 213 | } 214 | 215 | if (document.body.scrollHeight < window.innerHeight) { 216 | // 如果屏蔽悬赏贴后,剩余帖子列表太少会没有滚动条,无法滚动页面触发自动翻页事件,需要手动触发 217 | ShowPager.loadMorePage(); 218 | } 219 | } 220 | 221 | 222 | // 隐藏帖子内的 [下一页] 按钮 223 | function hidePgbtn() { 224 | document.lastChild.appendChild(document.createElement('style')).textContent = '.pgbtn {display: none;}'; 225 | } 226 | 227 | 228 | // 自动翻页 229 | function pageLoading() { 230 | if (!menu_value('menu_pageLoading')) return 231 | if (curSite.SiteTypeID > 0) { 232 | windowScroll(function (direction, e) { 233 | if (direction === "down") { // 下滑才准备翻页 234 | let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; 235 | let scrollDelta = curSite.pager.scrollDelta; 236 | if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) { 237 | if (curSite.pager.type === 1) { 238 | ShowPager.loadMorePage(); 239 | } else { 240 | let autopbn = document.querySelector(curSite.pager.nextLink); 241 | if (autopbn && autopbn.textContent == curSite.pager.nextText) { // 如果正在加载,就不再点击 242 | autopbn.click(); 243 | } 244 | } 245 | } 246 | } 247 | }); 248 | } 249 | } 250 | 251 | 252 | // 滚动条事件 253 | function windowScroll(fn1) { 254 | var beforeScrollTop = document.documentElement.scrollTop, 255 | fn = fn1 || function () {}; 256 | setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件 257 | window.addEventListener('scroll', function (e) { 258 | var afterScrollTop = document.documentElement.scrollTop, 259 | delta = afterScrollTop - beforeScrollTop; 260 | if (delta == 0) return false; 261 | fn(delta > 0 ? 'down' : 'up', e); 262 | beforeScrollTop = afterScrollTop; 263 | }, false); 264 | }, 1000) 265 | } 266 | 267 | 268 | // 修改自 https://greasyfork.org/scripts/14178 , https://github.com/machsix/Super-preloader 269 | function showPager() { 270 | ShowPager = { 271 | getFullHref: function (e) { 272 | if (e != null && e.nodeType === 1 && e.href && e.href.slice(0,4) === 'http') return e.href; 273 | return ''; 274 | }, 275 | createDocumentByString: function (e) { 276 | if (e) { 277 | if ('HTML' !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, 'application/xhtml+xml'); 278 | var t; 279 | try { t = (new DOMParser).parseFromString(e, 'text/html');} catch (e) {} 280 | if (t) return t; 281 | if (document.implementation.createHTMLDocument) { 282 | t = document.implementation.createHTMLDocument('ADocument'); 283 | } else { 284 | 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) {} 285 | } 286 | if (t) { 287 | var r = document.createRange(), 288 | n = r.createContextualFragment(e); 289 | r.selectNodeContents(document.body); 290 | t.body.appendChild(n); 291 | 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); 292 | return t; 293 | } 294 | } else console.error('没有找到要转成 DOM 的字符串'); 295 | }, 296 | loadMorePage: function () { 297 | if (curSite.pager) { 298 | let curPageEle = getElementByXpath(curSite.pager.nextLink); 299 | var url = this.getFullHref(curPageEle); 300 | //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`); 301 | if(url === '') return; 302 | if(curSite.pageUrl === url) return;// 不会重复加载相同的页面 303 | curSite.pageUrl = url; 304 | // 读取下一页的数据 305 | curSite.pager.startFilter && curSite.pager.startFilter(); 306 | GM_xmlhttpRequest({ 307 | url: url, 308 | method: "GET", 309 | overrideMimeType: 'text/html; charset=' + (document.characterSet||document.charset||document.inputEncoding), 310 | timeout: 5000, 311 | onload: function (response) { 312 | try { 313 | var newBody = ShowPager.createDocumentByString(response.responseText); 314 | let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody); 315 | let toElement = getAllElements(curSite.pager.HT_insert[0])[0]; 316 | if (pageElems.length >= 0) { 317 | let addTo = "beforeend"; 318 | if (curSite.pager.HT_insert[1] == 1) addTo = "beforebegin"; 319 | // 插入新页面元素 320 | pageElems.forEach(function (one) { 321 | toElement.insertAdjacentElement(addTo, one); 322 | }); 323 | //删除悬赏贴 324 | delateReward(); 325 | // 替换待替换元素 326 | try { 327 | let oriE = getAllElements(curSite.pager.replaceE); 328 | let repE = getAllElements(curSite.pager.replaceE, newBody, newBody); 329 | if (oriE.length === repE.length) { 330 | for (var i = 0; i < oriE.length; i++) { 331 | oriE[i].outerHTML = repE[i].outerHTML; 332 | } 333 | } 334 | } catch (e) { 335 | console.log(e); 336 | } 337 | } 338 | } catch (e) { 339 | console.log(e); 340 | } 341 | } 342 | }); 343 | } 344 | }, 345 | }; 346 | } 347 | function getElementByCSS(css, contextNode = document) { 348 | return contextNode.querySelector(css); 349 | } 350 | function getAllElementsByCSS(css, contextNode = document) { 351 | return [].slice.call(contextNode.querySelectorAll(css)); 352 | } 353 | function getElementByXpath(xpath, contextNode, doc = document) { 354 | contextNode = contextNode || doc; 355 | try { 356 | const result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 357 | // 应该总是返回一个元素节点 358 | return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue; 359 | } catch (err) { 360 | throw new Error(`Invalid xpath: ${xpath}`); 361 | } 362 | } 363 | function getAllElementsByXpath(xpath, contextNode, doc = document) { 364 | contextNode = contextNode || doc; 365 | const result = []; 366 | try { 367 | const query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 368 | for (let i = 0; i < query.snapshotLength; i++) { 369 | const node = query.snapshotItem(i); 370 | // 如果是 Element 节点 371 | if (node.nodeType === 1) result.push(node); 372 | } 373 | } catch (err) { 374 | throw new Error(`无效 Xpath: ${xpath}`); 375 | } 376 | return result; 377 | } 378 | function getAllElements(selector, contextNode = undefined, doc = document, win = window, _cplink = undefined) { 379 | if (!selector) return []; 380 | contextNode = contextNode || doc; 381 | if (typeof selector === 'string') { 382 | if (selector.search(/^css;/i) === 0) { 383 | return getAllElementsByCSS(selector.slice(4), contextNode); 384 | } else { 385 | return getAllElementsByXpath(selector, contextNode, doc); 386 | } 387 | } else { 388 | const query = selector(doc, win, _cplink); 389 | if (!Array.isArray(query)) { 390 | throw new Error('getAllElements 返回错误类型'); 391 | } else { 392 | return query; 393 | } 394 | } 395 | } 396 | })(); -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | userscript.xiu2.xyz -------------------------------------------------------------------------------- /DarkMode.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Dark Mode 3 | // @name:zh-CN 护眼模式 4 | // @name:zh-TW 護眼模式 5 | // @name:ru Тёмный режим 6 | // @version 1.5.5 7 | // @author X.I.U 8 | // @description Simple and effective network-wide eye protection mode (night mode, dark mode, black mode) 9 | // @description:zh-CN 简单有效的全网通用护眼模式(夜间模式、暗黑模式、深色模式) 10 | // @description:zh-TW 簡單有效的全網通用護眼模式(夜間模式、暗黑模式、深色模式) 11 | // @description:ru Простой и эффективный режим защиты глаз по всей сети (ночной режим, тёмный режим, чёрный режим) 12 | // @match *://*/* 13 | // @icon data:image/png;base64,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 14 | // @grant GM_registerMenuCommand 15 | // @grant GM_unregisterMenuCommand 16 | // @grant GM_openInTab 17 | // @grant GM_getValue 18 | // @grant GM_setValue 19 | // @grant GM_notification 20 | // @sandbox JavaScript 21 | // @noframes 22 | // @license GPL-3.0 License 23 | // @run-at document-start 24 | // @namespace https://github.com/XIU2/UserScript 25 | // @supportURL https://github.com/XIU2/UserScript 26 | // @homepageURL https://github.com/XIU2/UserScript 27 | // ==/UserScript== 28 | 29 | (function() { 30 | 'use strict'; 31 | var menu_ALL = [ 32 | ['menu_disable', '✅ 已启用 (点击对当前网站禁用)', '❌ 已禁用 (点击对当前网站启用)', []], 33 | ['menu_runDuringTheDay', '白天保持开启 (比晚上亮一点点)', '白天保持开启', true], 34 | ['menu_darkModeAuto', '护眼模式跟随浏览器', '护眼模式跟随浏览器', false], 35 | ['menu_autoRecognition', '智能排除自带暗黑模式的网页 (beta)', '智能排除自带暗黑模式的网页 (beta)', true], 36 | ['menu_forcedToEnable', '✅ 已强制当前网站启用护眼模式 (👆)', '❌ 未强制当前网站启用护眼模式 (👆)', []], 37 | ['menu_darkModeType', '点击切换模式', '点击切换模式', 2], 38 | ['menu_customMode', '自定义当前模式', '自定义当前模式', true], ['menu_customMode1',,,'60|50'], ['menu_customMode2',,,'60|40|50|50'], ['menu_customMode3',,,'90'], ['menu_customMode3_exclude',,,'img, .img, video, [style*="background"][style*="url"], svg'], 39 | ['menu_customTime', '自定义昼夜时间', '自定义昼夜时间', '6:00|18:00'], 40 | ['menu_autoSwitch', '晚上自动切换模式', '晚上自动切换模式', ''], 41 | ], menu_ID = []; 42 | for (let i=0;i 1) {addStyle();} 51 | 52 | 53 | // 注册脚本菜单 54 | function registerMenuCommand() { 55 | if (menu_ID.length != []){ 56 | for (let i=0;i 3) { // 避免在减少 raw 数组后,用户储存的数据大于数组而报错 78 | menu_ALL[i][3] = 1; 79 | GM_setValue(menu_ALL[i][0], menu_ALL[i][3]); 80 | } 81 | let menu_newMode = getAutoSwitch(); 82 | menu_ID[i] = GM_registerMenuCommand(`${menu_num(menu_newMode)} ${menu_ALL[i][1]}`, function(){menu_toggle(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`)}); 83 | } 84 | else if (menu_ALL[i][0] === 'menu_customMode') 85 | { // 自定义当前模式 86 | GM_setValue(menu_ALL[i][0], menu_ALL[i][3]); 87 | menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customMode()}); 88 | } 89 | else if (menu_ALL[i][0] === 'menu_customTime') 90 | { // 自定义昼夜时间 91 | GM_setValue(menu_ALL[i][0], menu_ALL[i][3]); 92 | menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customTime()}); 93 | } 94 | else if (menu_ALL[i][0] === 'menu_customMode1' || menu_ALL[i][0] === 'menu_customMode2' || menu_ALL[i][0] === 'menu_customMode3' || menu_ALL[i][0] === 'menu_customMode3_exclude') 95 | { // 当前模式值 96 | GM_setValue(menu_ALL[i][0], menu_ALL[i][3]); 97 | } 98 | else if (menu_ALL[i][0] === 'menu_autoSwitch') 99 | { // 晚上自动切换模式 100 | menu_ID[i] = GM_registerMenuCommand(`#️⃣ ${menu_ALL[i][1]}`, function(){menu_customAutoSwitch()}); 101 | } 102 | else if (menu_ALL[i][0] === 'menu_forcedToEnable') 103 | { // 强制当前网站启用护眼模式 104 | if (menu_value('menu_autoRecognition')) { // 自动排除自带暗黑模式的网页 (beta) 105 | if (menu_forcedToEnable('check')) { // 当前网站是否已存在列表中 106 | menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][1]}`, function(){menu_forcedToEnable('del')}); 107 | } else { 108 | menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][2]}`, function(){menu_forcedToEnable('add')}); 109 | } 110 | } 111 | } 112 | else 113 | { 114 | menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][3]?'✅':'❌'} ${menu_ALL[i][1]}`, function(){menu_switch(`${menu_ALL[i][3]}`,`${menu_ALL[i][0]}`,`${menu_ALL[i][2]}`)}); 115 | } 116 | } 117 | menu_ID[menu_ID.length] = GM_registerMenuCommand('💬 反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/426377/feedback', {active: true,insert: true,setParent: true});}); 118 | } 119 | 120 | 121 | // 菜单数字图标 122 | function menu_num(num) { 123 | return ['0️⃣','1️⃣','2️⃣','3️⃣','4️⃣','5️⃣','6️⃣','7️⃣','8️⃣','9️⃣','🔟'][num] 124 | } 125 | 126 | 127 | // 晚上自动切换模式 128 | function menu_customAutoSwitch() { 129 | let newAutoSwitch = prompt('白天、晚上使用不同模式,修改后立即生效~\n格式:白天模式|晚上模式\n例如:1|3(即白天模式 1 晚上模式 3)\n默认:留空(即关闭该功能)', GM_getValue('menu_autoSwitch')); 130 | if (newAutoSwitch === '') { 131 | GM_setValue('menu_autoSwitch', ''); 132 | } else if (newAutoSwitch != null) { 133 | if (newAutoSwitch.split('|').length == 2) { 134 | GM_setValue('menu_autoSwitch', newAutoSwitch); 135 | } else { 136 | alert(`填入内容格式错误...`); 137 | } 138 | } 139 | registerMenuCommand(); // 重新注册脚本菜单 140 | if (document.getElementById('XIU2DarkMode')) { 141 | document.getElementById('XIU2DarkMode').remove(); // 即时修改样式 142 | addStyle(); 143 | } 144 | } 145 | // 获取当前模式 146 | function getAutoSwitch() { 147 | let darkModeType = GM_getValue('menu_darkModeType'), hours = new Date().getHours(), time = GM_getValue('menu_customTime').split('|').map(Number); 148 | if (GM_getValue('menu_autoSwitch') != '') { // 晚上自动切换模式 149 | if (isDaytime()) { // 白天 150 | darkModeType = GM_getValue('menu_autoSwitch').split('|')[0]; 151 | } else { // 晚上 152 | darkModeType = GM_getValue('menu_autoSwitch').split('|')[1]; 153 | } 154 | } 155 | return parseInt(darkModeType) 156 | } 157 | 158 | 159 | // 自定义当前模式 160 | function menu_customMode() { 161 | let newMods, tip, defaults, name; 162 | switch(getAutoSwitch()) { 163 | case 1: 164 | tip = '自定义 [模式 1],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|亮度 (晚上)\n默认:60|50(均为百分比 1~100,不需要 % 符号)'; 165 | defaults = '60|50'; 166 | name = 'menu_customMode1'; 167 | break; 168 | case 2: 169 | tip = '自定义 [模式 2],修改后立即生效 (部分网页可能需要刷新)~\n格式:亮度 (白天)|暖色 (白天)|亮度 (晚上)|暖色 (晚上)\n默认:60|40|50|50(均为百分比 1~100,不需要 % 符号)'; 170 | defaults = '60|40|50|50'; 171 | name = 'menu_customMode2'; 172 | break; 173 | case 3: 174 | tip = '自定义 [模式 3],修改后立即生效 (部分网页可能需要刷新)~\n格式:反色\n默认:90(均为百分比 50~100,不需要 % 符号)'; 175 | defaults = '90'; 176 | name = 'menu_customMode3'; 177 | break; 178 | } 179 | newMods = prompt(tip, GM_getValue(`${name}`)); 180 | if (newMods === '') { 181 | GM_setValue(`${name}`, defaults); 182 | registerMenuCommand(); // 重新注册脚本菜单 183 | } else if (newMods != null) { 184 | GM_setValue(`${name}`, newMods); 185 | registerMenuCommand(); // 重新注册脚本菜单 186 | } 187 | if (getAutoSwitch() == 3) { 188 | tip = '自定义 [模式 3] 排除目标,修改后立即生效 (部分网页可能需要刷新)~\n格式:CSS 选择器 (如果不会写可以找我)\n默认:img, .img, video, [style*="background"][style*="url"], svg\n (使用英文逗号间隔,末尾不要有逗号)'; 189 | defaults = 'img, .img, video, [style*="background"][style*="url"], svg'; 190 | name = 'menu_customMode3_exclude'; 191 | newMods = prompt(tip, GM_getValue(`${name}`)); 192 | if (newMods === '') { 193 | GM_setValue(`${name}`, defaults); 194 | registerMenuCommand(); // 重新注册脚本菜单 195 | } else if (newMods != null) { 196 | GM_setValue(`${name}`, newMods); 197 | registerMenuCommand(); // 重新注册脚本菜单 198 | } 199 | } 200 | if (document.getElementById('XIU2DarkMode')) { 201 | document.getElementById('XIU2DarkMode').remove(); // 即时修改样式 202 | addStyle(); 203 | } 204 | } 205 | 206 | 207 | // 自定义昼夜时间 208 | function menu_customTime() { 209 | let newMods = prompt('自定义脚本内和白天/晚上相关的时间,修改后刷新网页生效~\n格式:6:00|18:30 (即 6:00 ~ 18:30 之间是白天时间)\n也支持反向设置:14:00|12:00 (即 12:00 ~ 14:00 之间是夜晚时间)', GM_getValue('menu_customTime')); 210 | if (newMods === '') { 211 | GM_setValue('menu_customTime', '6:00|18:00'); 212 | registerMenuCommand(); // 重新注册脚本菜单 213 | } else if (newMods != null) { 214 | GM_setValue('menu_customTime', newMods); 215 | registerMenuCommand(); // 重新注册脚本菜单 216 | } 217 | } 218 | 219 | 220 | // 强制当前网站启用护眼模式 221 | function menu_forcedToEnable(type) { 222 | switch(type) { 223 | case 'check': 224 | if(check()) return true 225 | return false 226 | break; 227 | case 'add': 228 | add(); 229 | break; 230 | case 'del': 231 | del(); 232 | break; 233 | } 234 | 235 | function check() { // 存在返回真,不存在返回假 236 | let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表 237 | if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假 238 | return true 239 | } 240 | 241 | function add() { 242 | if (check()) return 243 | let websiteList = menu_value('menu_forcedToEnable'); // 读取网站列表 244 | websiteList.push(location.host); // 追加网站域名 245 | GM_setValue('menu_forcedToEnable', websiteList); // 写入配置 246 | location.reload(); // 刷新网页 247 | } 248 | 249 | function del() { 250 | if (!check()) return 251 | let websiteList = menu_value('menu_forcedToEnable'), // 读取网站列表 252 | index = websiteList.indexOf(location.host); 253 | websiteList.splice(index, 1); // 删除网站域名 254 | GM_setValue('menu_forcedToEnable', websiteList); // 写入配置 255 | location.reload(); // 刷新网页 256 | } 257 | } 258 | 259 | 260 | // 启用/禁用护眼模式 (当前网站) 261 | function menu_disable(type) { 262 | switch(type) { 263 | case 'check': 264 | if(check()) return true 265 | return false 266 | break; 267 | case 'add': 268 | add(); 269 | break; 270 | case 'del': 271 | del(); 272 | break; 273 | } 274 | 275 | function check() { // 存在返回真,不存在返回假 276 | let websiteList = menu_value('menu_disable'); // 读取网站列表 277 | if (websiteList.indexOf(location.host) === -1) return false // 不存在返回假 278 | return true 279 | } 280 | 281 | function add() { 282 | if (check()) return 283 | let websiteList = menu_value('menu_disable'); // 读取网站列表 284 | websiteList.push(location.host); // 追加网站域名 285 | GM_setValue('menu_disable', websiteList); // 写入配置 286 | location.reload(); // 刷新网页 287 | } 288 | 289 | function del() { 290 | if (!check()) return 291 | let websiteList = menu_value('menu_disable'), // 读取网站列表 292 | index = websiteList.indexOf(location.host); 293 | websiteList.splice(index, 1); // 删除网站域名 294 | GM_setValue('menu_disable', websiteList); // 写入配置 295 | location.reload(); // 刷新网页 296 | } 297 | } 298 | 299 | 300 | // 切换暗黑模式 301 | function menu_toggle(menu_status, Name) { 302 | menu_status = parseInt(menu_status) 303 | if (menu_status >= 3){ 304 | menu_status = 1; 305 | } else { 306 | menu_status += 1; 307 | } 308 | GM_setValue(`${Name}`, menu_status); 309 | registerMenuCommand(); // 重新注册脚本菜单 310 | if (document.getElementById('XIU2DarkMode')) { 311 | document.getElementById('XIU2DarkMode').remove(); // 即时修改样式 312 | addStyle(); 313 | } 314 | //location.reload(); // 刷新网页 315 | }; 316 | 317 | 318 | // 菜单开关 319 | function menu_switch(menu_status, Name, Tips) { 320 | if (menu_status == 'true'){ 321 | GM_setValue(`${Name}`, false); 322 | GM_notification({text: `已关闭 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}}); 323 | }else{ 324 | GM_setValue(`${Name}`, true); 325 | GM_notification({text: `已开启 [${Tips}] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}}); 326 | } 327 | if (Name === 'menu_autoRecognition') { 328 | location.reload(); // 刷新网页 329 | } 330 | registerMenuCommand(); // 重新注册脚本菜单 331 | }; 332 | 333 | 334 | // 返回菜单值 335 | function menu_value(menuName) { 336 | for (let menu of menu_ALL) { 337 | if (menu[0] == menuName) { 338 | return menu[3] 339 | } 340 | } 341 | } 342 | 343 | 344 | // 添加样式 345 | function addStyle() { 346 | let remove = false, style_Add = document.createElement('style'), 347 | hours = new Date().getHours(), 348 | style_10 = menu_value('menu_customMode1').split('|'), 349 | style_20 = menu_value('menu_customMode2').split('|'), 350 | style_30 = menu_value('menu_customMode3').split('|'), 351 | style = ``, 352 | style_00 = `html, body {background-color: #ffffff !important;}`, 353 | style_11 = `html {filter: brightness(${style_10[0]}%) !important;}`, 354 | style_11_firefox = `html {filter: brightness(${style_10[0]}%) !important; background-image: url();}`, 355 | style_12 = `html {filter: brightness(${style_10[1]}%) !important;}`, 356 | style_12_firefox = `html {filter: brightness(${style_10[1]}%) !important; background-image: url();}`, 357 | style_21 = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important;}`, 358 | style_21_firefox = `html {filter: brightness(${style_20[0]}%) sepia(${style_20[1]}%) !important; background-image: url();}`, 359 | style_22 = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important;}`, 360 | style_22_firefox = `html {filter: brightness(${style_20[2]}%) sepia(${style_20[3]}%) !important; background-image: url();}`, 361 | style_31 = `html {filter: invert(${style_30[0]}%) !important; text-shadow: 0 0 0 !important;} 362 | ${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;} 363 | img[alt="[公式]"] {filter: none !important;}`, 364 | style_31_firefox = `html {filter: invert(${style_30[0]}%) !important; background-image: url(); text-shadow: 0 0 0 !important;} 365 | ${menu_value('menu_customMode3_exclude')} {filter: invert(1) !important;} 366 | img[alt="[公式]"] {filter: none !important;}`, 367 | style_31_scrollbar = `::-webkit-scrollbar {height: 12px !important;} 368 | ::-webkit-scrollbar-thumb {border-radius: 0;border-color: transparent;border-style: dashed;background-color: #3f4752 !important;background-clip: padding-box;transition: background-color .32s ease-in-out;} 369 | ::-webkit-scrollbar-corner {background: #202020 !important;} 370 | ::-webkit-scrollbar-track {background-color: #22272e !important;} 371 | ::-webkit-scrollbar-thumb:hover {background: #3f4752 !important;}`; 372 | 373 | 374 | // Firefox 浏览器需要特殊对待 375 | if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { 376 | style_11 = style_11_firefox 377 | style_12 = style_12_firefox 378 | style_21 = style_21_firefox 379 | style_22 = style_22_firefox 380 | style_31 = style_31_firefox 381 | } 382 | 383 | // 白天 384 | if (isDaytime()) { 385 | if (menu_value('menu_runDuringTheDay')) { 386 | style_12 = style_11 387 | style_22 = style_21 388 | } else { 389 | style_12 = style_22 = '' 390 | } 391 | } 392 | 393 | 394 | let darkModeType = getAutoSwitch(); 395 | 396 | switch(darkModeType) { 397 | case 1: 398 | style += style_12; 399 | break; 400 | case 2: 401 | style += style_22; 402 | break; 403 | case 3: 404 | style += style_31 + style_31_scrollbar; 405 | if (location.hostname.indexOf('search.bilibili.com') > -1) { 406 | style += `ul.video-list img, ul.video-list .video-item .img .mask-video, ul.video-list .video-item .img .van-danmu, ul.video-list .video-item .img .van-framepreview {filter: none !important;}` 407 | } else if (location.hostname.indexOf('.bilibili.com') > -1) { 408 | style += ` 409 | .bpx-player-container[data-screen="full"] .bpx-player-video-wrap {filter: invert(1) !important;} 410 | .bpx-player-container[data-screen="web"] {filter: invert(1) !important;} 411 | .bpx-player-container[data-screen="web"] video {filter: none !important;} 412 | * {font-weight: bold !important;}` 413 | } else if (location.hostname.indexOf('.huya.com') > -1) { 414 | style += `#player-wrap[style="height: 100%;"], .player-loading, .sidebar-show, #player-ctrl-wrap {filter: invert(1) !important;}` 415 | } 416 | break; 417 | } 418 | style_Add.id = 'XIU2DarkMode'; 419 | style_Add.type = 'text/css'; 420 | //console.log(document,document.lastElementChild,document.querySelector('html')) 421 | if (document.lastElementChild) { 422 | document.lastElementChild.appendChild(style_Add).textContent = style; 423 | } else { // 发现个别网站速度太慢的话,就会出现脚本运行太早,连 html 标签都还没加载。。。 424 | let timer1 = setInterval(function(){ // 每 5 毫秒检查一下 html 是否已存在 425 | if (document.lastElementChild) { 426 | clearInterval(timer1); // 取消定时器 427 | document.lastElementChild.appendChild(style_Add).textContent = style; 428 | } 429 | }); 430 | } 431 | 432 | let websiteList = []; 433 | if (menu_value('menu_autoRecognition')) { // 智能排除自带暗黑模式的网页 (beta) 434 | websiteList = menu_value('menu_forcedToEnable'); // 强制当前网站启用护眼模式 435 | } 436 | 437 | // 为了避免 body 还没加载导致无法检查是否设置背景颜色 438 | let timer = setInterval(function(){ // 每 5 毫秒检查一下 body 是否已存在 439 | if (document.body) { 440 | clearInterval(timer); // 取消定时器(每 5 毫秒一次的) 441 | setTimeout(function(){ // 为了避免太快 body 的 CSS 还没加载上,先延迟 150 毫秒(缺点就是可能会出现短暂一闪而过的暗黑滤镜) 442 | console.log('[护眼模式] html:', window.getComputedStyle(document.lastElementChild).backgroundColor, 'body:', window.getComputedStyle(document.body).backgroundColor) 443 | if (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgba(0, 0, 0, 0)' && !(document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches)) { 444 | // 如果 body 没有 CSS 背景颜色(或是在资源页 且 浏览器为白天模式),那就需要添加一个背景颜色,否则影响滤镜效果 445 | let style_Add2 = document.createElement('style'); 446 | style_Add2.id = 'XIU2DarkMode2'; 447 | document.lastElementChild.appendChild(style_Add2).textContent = style_00; 448 | 449 | } else if ((document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches) || (document.querySelector('html[class*=dark], html[data-dark-theme*=dark], html[data-theme*=dark], html[data-color-mode*=dark], body[class*=dark]')) || (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)') || (getColorValue(document.body) > 0 && getColorValue(document.body) < 898989) || (getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989) || (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)')) { 450 | // 如果是在资源页 且 浏览器为暗黑模式,或 html/body 元素包含 dark 标识,或底色为黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜 451 | if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta) 452 | for (let i=0;imeta[name="color-scheme"],head>link[href^="resource:"]') && window.matchMedia('(prefers-color-scheme: dark)').matches) || (document.querySelector('html[class*=dark], html[data-dark-theme*=dark], html[data-theme*=dark], html[data-color-mode*=dark], body[class*=dark]')) || (window.getComputedStyle(document.body).backgroundColor === 'rgb(0, 0, 0)') || (getColorValue(document.body) > 0 && getColorValue(document.body) < 898989) || (getColorValue(document.lastElementChild) > 0 && getColorValue(document.lastElementChild) < 898989) || (window.getComputedStyle(document.body).backgroundColor === 'rgba(0, 0, 0, 0)' && window.getComputedStyle(document.lastElementChild).backgroundColor === 'rgb(0, 0, 0)')) { 466 | // 如果是在资源页 且 浏览器为暗黑模式,或 html/body 元素包含 dark 标识,或底色为黑色 (等于0,0,0) 或深色 (小于 89,89,89),就停用本脚本滤镜 467 | if (menu_value('menu_autoRecognition')) { // 排除自带暗黑模式的网页 (beta) 468 | for (let i=0;i time[0] && nowTime < time[1]) return true 506 | return false 507 | } else { 508 | if (nowTime > time[0] || nowTime < time[1]) return true 509 | return false 510 | } 511 | } 512 | })(); 513 | -------------------------------------------------------------------------------- /DuckDuckGo-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name DuckDuckGo Enhancements 3 | // @name:zh-CN DuckDuckGo 增强 4 | // @name:zh-TW DuckDuckGo 增強 5 | // @name:ru Улучшения DuckDuckGo 6 | // @version 1.0.5 7 | // @author X.I.U 8 | // @description Block the specified domain name, link without source, and quickly return to the top (the blank space on both sides of the right button)... 9 | // @description:zh-CN 屏蔽指定域名、链接不携来源、快捷回到顶部(右键两侧空白处) 10 | // @description:zh-TW 屏蔽指定域名、鏈接不攜來源、快捷回到頂部(右鍵兩側空白處) 11 | // @description:ru Блокирует указанные доменные имена, ссылки без источника и быстро возвращает наверх страницы (ПКМ по пустому месту с обеих сторон)... 12 | // @match https://duckduckgo.com/* 13 | // @icon data:image/png;base64,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 14 | // @grant GM_registerMenuCommand 15 | // @grant GM_unregisterMenuCommand 16 | // @grant GM_openInTab 17 | // @grant GM_getValue 18 | // @grant GM_setValue 19 | // @grant GM_notification 20 | // @license GPL-3.0 License 21 | // @run-at document-idle 22 | // @namespace https://github.com/XIU2/UserScript 23 | // @supportURL https://github.com/XIU2/UserScript 24 | // @homepageURL https://github.com/XIU2/UserScript 25 | // ==/UserScript== 26 | 27 | (function() { 28 | 'use strict'; 29 | var menu_ALL = [ 30 | ['menu_blockDomainBtn', '显示屏蔽按钮', '显示屏蔽按钮', true], 31 | ['menu_blockDomain', '编辑屏蔽域名', '编辑屏蔽域名', []], 32 | ['menu_backToTop', '快捷回到顶部', '快捷回到顶部', true] 33 | ], menu_ID = []; 34 | for (let i=0;i menu_ALL.length){for (let i=0;idiv[arial-label] {display: none;} 62 | a[data-testid="result-title-a"]{display: inline-block}` 63 | mutationObserver(); // 屏蔽指定域名 链接不携来源 64 | setTimeout(backToTop, 500); // 快捷回到顶部 65 | 66 | 67 | // 自定义屏蔽指定域名 68 | function customBlockDomain() { 69 | let nowBlockDomain = ''; 70 | GM_getValue('menu_blockDomain').forEach(function(item){nowBlockDomain += '|' + item}) 71 | let newBlockDomain = prompt('编辑 [屏蔽指定域名]\n(不同域名之间使用 "|" 分隔,例如:a.com|b.com|c.com )', nowBlockDomain.replace('|','')); 72 | if (newBlockDomain === '') { 73 | GM_setValue('menu_blockDomain', []); 74 | registerMenuCommand(); 75 | } else if (newBlockDomain != null) { 76 | GM_setValue('menu_blockDomain', newBlockDomain.split('|')); 77 | registerMenuCommand(); 78 | } 79 | } 80 | 81 | 82 | // 屏蔽指定域名 链接不携来源 83 | function mutationObserver() { 84 | const callback = (mutationsList, observer) => { 85 | for (const mutation of mutationsList) { 86 | for (const target of mutation.addedNodes) { 87 | if (target.nodeType != 1) break 88 | // 屏蔽指定域名 89 | if (target.tagName == 'LI' && target.dataset.layout == 'organic') { 90 | Process(target) 91 | } else if (target.tagName == 'OL' && target.className == 'react-results--main') { 92 | target.childNodes.forEach(li=>{Process(li);}) 93 | } 94 | } 95 | } 96 | }; 97 | const observer = new MutationObserver(callback); 98 | observer.observe(document, { childList: true, subtree: true }); 99 | 100 | function Process(target) { 101 | const a = target.querySelector('h2>a,a[data-testid=result-title-a]') 102 | if (a) { 103 | if (checkDomain(a.href.split('/')[2])) { 104 | target.hidden = true 105 | } else { 106 | // 链接不携来源 107 | addRel(target); 108 | 109 | // 添加屏蔽按钮 110 | addBlockDomainBtn(target, a, a.href.split('/')[2]); 111 | } 112 | } 113 | } 114 | } 115 | 116 | 117 | // 检查域名是否存在黑名单中 118 | function checkDomain(domain) { 119 | let blockDomain = GM_getValue('menu_blockDomain'); 120 | for (let i=0; i屏蔽`); 138 | doc.querySelector('button.blockDomainBtn').addEventListener('click', function(e) { 139 | e.stopPropagation(); 140 | // 追加屏蔽域名 141 | let blockDomain = GM_getValue('menu_blockDomain'); 142 | blockDomain.push(e.target.dataset.domain) 143 | GM_setValue('menu_blockDomain', blockDomain); 144 | // 隐藏该域名的所有搜索结果 145 | document.querySelectorAll(`button[data-domain="${e.target.dataset.domain}"].blockDomainBtn`).forEach(function(one){one.parentElement.parentElement.parentElement.parentElement.remove();}) 146 | }); 147 | } 148 | } 149 | 150 | 151 | // 快捷回到顶部(右键两侧空白处) 152 | function backToTop() { 153 | if (!GM_getValue('menu_backToTop')) return 154 | document.querySelectorAll('#react-layout>div, #react-layout>div>div, section[data-testid=sidebar]').forEach(ele => { 155 | ele.oncontextmenu = function(e) { 156 | if (e.target == this) { 157 | e.preventDefault(); 158 | window.scrollTo(0,0); 159 | } 160 | } 161 | }) 162 | } 163 | })(); 164 | -------------------------------------------------------------------------------- /GoogleTranslate-Beautification.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Google 翻译美化 3 | // @version 1.0.1 4 | // @author X.I.U 5 | // @description 精简多余内容、修复翻译结果溢出屏幕问题 6 | // @match *://translate.google.cn/* 7 | // @match *://translate.google.com/* 8 | // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFHklEQVR4nMWWW0ycRRTHfzPz7S4ssIWyFOiFy1ZKCyKJFG2tqZamtDHWahqNsTExadL6ZmITX3zhoS+NT1ofaqPx1fii9dKQWqtpoya92ZuUAgWhWCj3BXYpe5nxYdllv90FYiDxbCaZ2Znv/P/nNnPgfxYBcOzz8fLuSeuspWQNJrZh5gaAMfMfxOfahD45c6zgveUSkADd0/JHS8maZODkkQBPGjoUPdrS8ou1IgQsYdXCvHUmw8FUItKV7bopKxtXhIAx6eAJwExs5iTicB9dGQKkuztZMuUCgHSoQ0eOXHUsm0Aq2GLW2/ZElvXQm7dzOQSsjDgmw3QBMmXlhedv3GyncLUHy5KJg8YYTIrL4utwONw5ORlpqq+v6rcWUg7QUKHZW6upKNQA9I5Jzt6SXP173nH909kMjofIcs3g8biRUixlNE6ns6qgQJ0DatLKKM7lzcYIzbUaAwz4BRjweTXv7NB0DTkYD4o5q+DukBtvbhCnU+F2Zy1JAEAptQUWCEFDuaa5VjMyLTj5s0XvWAys0msIR2AiCRygYzSP7eUBAoEgSkmczqXzMh4OK1lRXJprowCc+lUlwDHQMyziU5v0B3LwBw1ZLk0wGMSYLFwu15IkEgRSpbIQxoOCrmGZAP/0UMh25t6g5OPz1hwZwd2RXLyeGYyB2dlZ/hkaIxgKUesrs1mckUDqlgGEsG8MT8WstyRsWG3wZBlbhdwbyaGhdAKEweGQ3OrqpvfRKFUb1toISCmwlErxQAqDnhHYVGyoKjZ0PhIYoOW7WFzr12veb44w4J/3DkDfVA6nvr2IZYWQyiBEbP/4l18jpYrdthi2bt7IyzsaUgikSOsdxabiCO++GOHkeUXPqMQYWFdgeHt7LD8udcoEuAEQiieqX6CueBynS2I5LAQxIt//dp3qivXUVG4gP8+9dAiu9UrO3la8VBel5UCEQT+AoHiVQQCtdyTtA+kJORJdC8KPUhYb15UgBPQ8HGJmdpbGzT7KStfYwpHmgeQ8+eqyomNQsK8uis8LCLg/JPmpTfJ7l0wDN8bQO5lLv2OKG13tHD7QRFG+hwvXb1NRUkRRfh7RaBQp7bd/xjJMeKJPcq0v6YMMV3SyNVEEIq+a/Jw+frh0nfK1XsYmpnl1/zMAhEIhHA4HSqn5pIwrW6wRSf7D3ikZ2xGAjjEPexrrGZmY5EpbB01b6/DmexLnIpEI0Wg0sU57DRdiktYdzYGnvp69/hy6B/2EI1EQ8GBoFK21jazWOkFC2rSkhCJjW5b0yqV5CYiguNA2y9PVPl7f9TydDx5y5uIVtLYr11rPE1gqBHHQhay2lSOQXVjHttpNlBV7ObhrG139g3xz8XKCRLI3Yh7Qob9sxiQBpsY5k9X2vAC/LiHwWBMOR6goWcPBpu3c7x/gdndvmk4LQM8E9mlH+JxSri2kSMYCsVVDEsG5aRhoH85mW24YgMrSIg7v381qTx7GGISY7xmW7h4WkQ+PX/zgjz8nT9jK2EB2tuHIW8VUlOWS7VJ2QCGQUiKEwOfzifQq+A8yPDX4mZASqeaGlCiH4tCBQtaVuFAyBrhYe7YsAqdPvOGvrFCDgvnfa825VPncOB0KKRbvDZdNAKC00P1RXOnOZ7NofCoPhyWRUiBEeh+Qul42gUfjj78wxvBktZPdz3mQMvbmywyak8EDgdm2FSFw+sQe/9Z6Og/uXYVUBinBGJ1wvdY6cfPF59PTM+2trbdeWS72isi//t1/7RwSS+MAAAAASUVORK5CYII= 9 | // @grant GM_registerMenuCommand 10 | // @grant GM_unregisterMenuCommand 11 | // @grant GM_openInTab 12 | // @grant GM_getValue 13 | // @grant GM_setValue 14 | // @grant GM_notification 15 | // @license GPL-3.0 License 16 | // @run-at document-start 17 | // @namespace https://greasyfork.org/scripts/413721 18 | // @supportURL https://github.com/XIU2/UserScript 19 | // @homepageURL https://github.com/XIU2/UserScript 20 | // ==/UserScript== 21 | 22 | 'use strict'; 23 | (function() { 24 | var menu_streamline = GM_getValue('xiu2_menu_streamline'); 25 | var menu_streamline_ID, menu_feedBack_ID; 26 | if (menu_streamline == null){menu_streamline = true; GM_setValue('xiu2_menu_streamline', menu_streamline)}; 27 | registerMenuCommand(); 28 | addStyle(); 29 | 30 | // 注册脚本菜单 31 | function registerMenuCommand() { 32 | var menu_streamline_; 33 | if (menu_feedBack_ID){ // 如果反馈菜单ID不是 null,则删除所有脚本菜单 34 | GM_unregisterMenuCommand(menu_streamline_ID); 35 | GM_unregisterMenuCommand(menu_feedBack_ID); 36 | menu_streamline = GM_getValue('xiu2_menu_streamline'); 37 | } 38 | 39 | if (menu_streamline){menu_streamline_ = "√";}else{menu_streamline_ = "×";} 40 | 41 | menu_streamline_ID = GM_registerMenuCommand(`[ ${menu_streamline_} ] 精简美化`, function(){menu_switch(menu_streamline,'xiu2_menu_streamline','精简美化')}); 42 | menu_feedBack_ID = GM_registerMenuCommand('反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});}); 43 | } 44 | 45 | // 菜单开关 46 | function menu_switch(menu_status, Name, Tips) { 47 | if (menu_status){ 48 | GM_setValue(`${Name}`, false); 49 | GM_notification(`已关闭 [${Tips}] 功能\n(刷新网页后生效)`); 50 | }else{ 51 | GM_setValue(`${Name}`, true); 52 | GM_notification(`已开启 [${Tips}] 功能\n(刷新网页后生效)`); 53 | } 54 | registerMenuCommand(); // 重新注册脚本菜单 55 | }; 56 | 57 | 58 | // 添加样式 59 | function addStyle() { 60 | var style, 61 | style_1 = ` 62 | /* 翻译结果的选择列表宽度 63 | .alt-menu { 64 | max-width: 35% !important; 65 | } */ 66 | /* 翻译结果选择时显示翻译结果的翻译结果 67 | .goog-menu.round-trip-content { 68 | white-space: normal !important; 69 | word-break: break-all !important; 70 | } */`, 71 | style_2 = ` 72 | /* 清理多余内容 73 | .rQKk7.zJmlgc { 74 | display: none !important; 75 | } */`, 76 | style_Add = document.createElement('style'); 77 | if (menu_streamline) { 78 | style = style_1 + style_2; 79 | }else{ 80 | style = style_1; 81 | } 82 | style_Add.innerHTML = style; 83 | document.head.appendChild(style_Add); 84 | } 85 | })(); -------------------------------------------------------------------------------- /HTML5Volume.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name HTML5 Video Audio Default Volume 3 | // @name:zh-CN HTML5 视频音频默认音量 4 | // @name:zh-TW HTML5 視訊音訊預設音量 5 | // @name:ru Громкость аудио-видео в формате HTML5 по умолчанию 6 | // @version 1.0.3 7 | // @author X.I.U 8 | // @description Avoid being startled by some video/audio with default 100% volume! And support each website to remember the volume separately... 9 | // @description:zh-CN 避免被一些默认 100% 音量的视频/音频吓一跳(或社死)!且支持各网站分别记住音量... 10 | // @description:zh-TW 避免被一些預設 100% 音量的視訊/音訊嚇一跳(或社死)!且支援各網站分別記住音量... 11 | // @description:ru Больше не пугайтесь при просмотре видео или прослушивании аудио со стандартной громкостью 100%! Так ещё каждый веб-сайт запоминает громкость отдельно... 12 | // @match *://*/* 13 | // @icon data:image/png;base64,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 14 | // @grant GM_registerMenuCommand 15 | // @grant GM_unregisterMenuCommand 16 | // @grant GM_openInTab 17 | // @grant GM_getValue 18 | // @grant GM_setValue 19 | // @grant GM_notification 20 | // @license GPL-3.0 License 21 | // @run-at document-start 22 | // @namespace https://github.com/XIU2/UserScript 23 | // ==/UserScript== 24 | 25 | (function() { 26 | 'use strict'; 27 | var menu_ID = []; 28 | registerMenuCommand(); // 注册脚本菜单 29 | function registerMenuCommand() { 30 | if (self != top) return 31 | // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 32 | if (menu_ID.length > 0){for (let i=0;i { 56 | for (const mutation of mutationsList) { 57 | for (const target of mutation.addedNodes) { 58 | if (target.nodeType != 1) break 59 | //console.log('所有插入:', target) 60 | if (target.tagName === 'VIDEO' || target.tagName === 'AUDIO') { 61 | //console.log('后续插入1:', target) 62 | isFirstEvent(target) 63 | } else if (target.tagName === 'DIV') { 64 | target.querySelectorAll('video, audio').forEach(function(_this){ 65 | //console.log('后续插入2:', _this) 66 | isFirstEvent(_this) 67 | }) 68 | } 69 | } 70 | } 71 | }; 72 | const observer = new MutationObserver(callback); 73 | observer.observe(document, { childList: true, subtree: true }); 74 | } 75 | 76 | 77 | // 音量变化事件(记住音量) 78 | function volumeChangeEvent(event) { 79 | if (event.target.muted) { // 判断是否静音 80 | localStorage.setItem('html5_xiu_currentVolume', 0) 81 | registerMenuCommand(); // 修改脚本菜单 82 | } else if (localStorage.getItem('html5_xiu_currentVolume') || ((event.target.volume * 100) !== GM_getValue('menu_defaultVolume', 30))) { 83 | localStorage.setItem('html5_xiu_currentVolume', event.target.volume * 100) 84 | registerMenuCommand(); // 修改脚本菜单 85 | } 86 | } 87 | 88 | 89 | // 判断该视频/音频元素是否已监听事件 90 | function isFirstEvent(target) { 91 | if (!target.controls) return; // 如果视频/音频已经有了自己的控件(即没有使用 HTML5 默认的控件),则退出 92 | modifyVolume(target); 93 | // 如果没有该属性,则代表是还未监听事件 94 | if (target.dataset.html5VolumeXiu != 'true') { 95 | target.dataset.html5VolumeXiu = 'true' 96 | target.addEventListener('volumechange', volumeChangeEvent); 97 | } 98 | } 99 | 100 | 101 | // 修改视频音量 102 | function modifyVolume(_this) { 103 | let nowVolume = parseFloat(localStorage.getItem('html5_xiu_currentVolume')); // 先看看 localStorage 有没有(即用户是否手动调整过音量) 104 | if (!nowVolume && nowVolume !== 0) nowVolume = GM_getValue('menu_defaultVolume', 30); // 如果 localStorage 没有,那就从脚本配置中获取 105 | if (!((typeof nowVolume === 'number') && nowVolume <= 100)) nowVolume = 30; // 如果获取到的音量数值不是数字,或大于 100,则重置为 30 106 | //console.log(_this, _this.volume, nowVolume, nowVolume / 100) 107 | _this.volume = nowVolume / 100; // 设置音量为 0.00~1.00 范围 108 | //console.log(_this.volume) 109 | } 110 | 111 | 112 | // 修改全局默认音量 113 | function customDefaultVolume() { 114 | let newValue = parseFloat(prompt('修改全局默认音量,不影响各网站记住的音量,当前网页需刷新后生效~\n范围:0~100 (即 0%~100%,不需要加 % 百分号)\n默认:30', GM_getValue('menu_defaultVolume', 30))); 115 | if (!Number.isNaN(newValue) && newValue >= 0 && newValue <= 100) {GM_setValue('menu_defaultVolume', newValue);} 116 | registerMenuCommand(); // 重新注册菜单(刷新菜单上的音量值) 117 | } 118 | 119 | 120 | // 忘记当前网站音量 121 | function resetCurrentVolume() { 122 | if (localStorage.getItem('html5_xiu_currentVolume')) localStorage.removeItem('html5_xiu_currentVolume') // 清理 localStorage 123 | currentPage(); // 重置当前网页的音量 124 | } 125 | })(); 126 | -------------------------------------------------------------------------------- /Ping.Sx-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Ping.Sx enhancement 3 | // @name:zh-CN Ping.Sx 增强 4 | // @name:zh-TW Ping.Sx 增強 5 | // @version 1.0.3 6 | // @author X.I.U 7 | // @description Copy all IPs with one click, clean IP links (click Copy instead of Jump), and quickly go back to the top (blank space on both sides of the right click). 8 | // @description:zh-CN 一键复制所有 IP、清理 IP 链接(点击复制而不是跳转)、快捷回到顶部(右键两侧空白处) 9 | // @description:zh-TW 一鍵複製所有 IP、清理 IP 鏈接(點擊複製而不是跳轉)、快捷回到頂部(右鍵兩側空白處) 10 | // @match https://ping.sx/ping* 11 | // @match https://ping.sx/dig* 12 | // @match https://ping.sx/check-port* 13 | // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAD7klEQVR4nO3WWYxfcxQH8M9//LWzdJuWaVMaI6WKKtKOfacVGuHFgy3E8iARDyKWBBEJ8SC2Jy9EeKCSqpoiBJF22k6JbdBqqqilqe4z05ol0xkP5/zz/6dPY3iQuN/kl3vv755z7lm+5/wuBQoUKFCgQIECBQoU+L+iNAb5OpRzHY5xGI8D2PMPfKlDK+qxNe2NyqHa+4k4EkdgWq6paM41GZNSrilXQ16/wE3YN8YAjsKKtH0NNo5GqVxzP6Ia9QHsQmM63IAJuSZmIBPS8UZMwfcYGKPzMA/z8Sl+G61SbQDzcbkoXxmnp7GVeX8+hrEM36bOqamzMeWm4rq0tRefYD36MRsXCJqMYAPeR3faOltQshO9KXsW9uMtQdMLU7+E7/BRbTBPpeEe/Jn33ViKP/J5BOsEzeCZ3HtEcPcVDGIH+kRPLEnZJ1J2qOb6XCarPoM5iGtxI7annTszsMcO0R9M3xC0WJ0vlmYWO/N5G+7Go5nJ3ThF0GetoM0loko9mdk2XIr7RR9VMnxr7j+QtjahBcfjd+zES5m4Llym2qdn1ujfJ2g+WJcvW3EifsFDeE2VJi/jedFg/Wl8D47DXEG5DZmR/YIqD4vp9HQGPCODPg1Xir4ZTCf6cn+6oODN6fQ9+DCTOF3QsqLfVPM9cEsKLhMlnSSoMoBFKXNDyqwQI+/2fH4dh+Xe9fhaUKE3ZZrxdn5wdcr/kLovpu1n87lX9M4w7sh3zVie+h2pvznl36vLaM9J4bWCY7NxAn4WzQLn1sgM47x8XpPGFuf9ItEbE3Bx6l2Bz3F1BtVVo9sk6HEQD+KF9OmqTGab6KMvU/82fJX6H5cFBxeKxl2fL9oy8g9EMzXjDEGhdYLXCzNjnWJCvSro0iHoNSLOhv5MSivuzeQsSdnPBP/niqq8gTm4S/TMSZn5IRyT+q0Z3G6sqRMTZSfaVQ+PyWm8PbM9TZwL7VmRlgysXZSzC4+nzOJ8/6RoyHWCIt1Zne25144tgt+bxKjcjW/wJn7MRHSKiu5L/R2pvxIbS2KEjUvHh7Js48Xo6s3KlEXjDefqFw03oNpIpdSbkjK7BC1KqoddT8rX57s+1V+RQdWDsCG/Wdkr5/cGD9UviTlbOUxmZ4bGZRa3pbMV1Gd1urAgHdibH+zI/Rli/M0SFW0SvyZb8I6g1r+GsuBfC37CTNFYU9OZNtHg9aIfmvCrKOVMUeZ5YhwuF9meg2MzkJPFaF4lqNdolD9po0UJF4msNIlG6UiHN4vZXemBVeK3oXK4VUZnhQaz8K74KWsRFDo6ZRekva25/nOoE9T6u7/nBQoUKFCgQIECBQoUKDBm/AXKhRvkgr+Z+wAAAABJRU5ErkJggg== 14 | // @grant GM_setClipboard 15 | // @grant GM_registerMenuCommand 16 | // @grant GM_unregisterMenuCommand 17 | // @grant GM_getValue 18 | // @grant GM_setValue 19 | // @grant window.onurlchange 20 | // @license GPL-3.0 License 21 | // @run-at document-end 22 | // @namespace https://github.com/XIU2/UserScript 23 | // @supportURL https://github.com/XIU2/UserScript 24 | // ==/UserScript== 25 | 26 | (function() { 27 | 'use strict'; 28 | // 注册脚本菜单 29 | let menu_separator_ID; 30 | if (GM_getValue('menu_separator') == null){GM_setValue('menu_separator', true)}; 31 | registerMenuCommand(); 32 | function registerMenuCommand() { 33 | if (menu_separator_ID) GM_unregisterMenuCommand(menu_separator_ID); 34 | menu_separator_ID = GM_registerMenuCommand(`🔁 当前复制 IP 分隔方式为:${GM_getValue('menu_separator')?'[一行一个]':'[逗号分隔]'}`, function(){GM_setValue('menu_separator', !GM_getValue('menu_separator'));registerMenuCommand();}, {title: '点击可切换:当前复制 IP 的分隔方式为 [一行一个](默认) 或 [逗号分隔],切换后立即生效。'}) 35 | } 36 | // 站长之家 37 | // let ip = new Array(); document.querySelectorAll('[name=ip]>a').forEach(function(_this) {ip.push(_this.innerText);});console.log(Array.from(new Set(ip)).sort().toString().replaceAll(',','\n')) 38 | 39 | window.addEventListener('urlchange', function() {addCopyButton(); cleanLinks(); backToTop();}); 40 | 41 | setTimeout(addCopyButton, 2000); // 添加复制按钮 42 | setTimeout(cleanLinks, 2000); // 清理链接(可以直接点击复制单个 IP) 43 | setTimeout(backToTop, 2000); // 快捷回到顶部(右键左右两侧空白处) 44 | 45 | 46 | // 添加复制按钮 47 | function addCopyButton() { 48 | if (document.querySelector('#copy_233, #copynocn_233')) return 49 | // 复制全部 50 | document.querySelector('header ul').insertAdjacentHTML('afterbegin', `
  • Copy
  • `); 51 | // 复制非 CN 的 IP 52 | document.querySelector('header ul').insertAdjacentHTML('afterbegin', `
  • Copy(Cn)
  • `); 53 | document.getElementById('copy_233').addEventListener('click', addCopyButtonEvent1) 54 | document.getElementById('copynocn_233').addEventListener('click', addCopyButtonEvent2) 55 | } 56 | 57 | 58 | // 复制按钮点击事件 59 | function addCopyButtonEvent1() { 60 | let ip = new Array(); 61 | document.querySelectorAll('span.select-all > a[href]').forEach(function(_this) {ip.push(_this.innerText);}) 62 | if (ip.length > 0) { 63 | if (GM_getValue('menu_separator')) { 64 | GM_setClipboard(unique(ip).toString().replaceAll(',','\n'), 'text'); 65 | } else { 66 | GM_setClipboard(unique(ip).toString(), 'text'); 67 | } 68 | } 69 | } 70 | function addCopyButtonEvent2() { 71 | let ip = new Array(); 72 | document.querySelectorAll('span.select-all > a[href]').forEach(function(_this) { 73 | let img = findParentElement(_this, 'TR').querySelector('img.max-w-none'); 74 | if (img) {if (img.alt != 'CN Flag') ip.push(_this.innerText);} 75 | }) 76 | if (ip.length > 0) { 77 | if (GM_getValue('menu_separator')) { 78 | GM_setClipboard(unique(ip).toString().replaceAll(',','\n'), 'text'); 79 | } else { 80 | GM_setClipboard(unique(ip).toString(), 'text'); 81 | } 82 | } 83 | } 84 | 85 | 86 | // 清理链接(可以直接点击复制单个 IP) 87 | function cleanLinks() { 88 | const callback = (mutationsList, observer) => { 89 | for (const mutation of mutationsList) { 90 | for (const target of mutation.addedNodes) { 91 | if (target.nodeType != 1) return 92 | if (target.tagName === 'TD' && target.className.indexOf('w-4/12') > -1) { 93 | target.querySelectorAll('span.select-all > a[href]').forEach(function(_this) { 94 | _this.href = 'javascript:void(0);'; 95 | _this.target = '_self'; 96 | }) 97 | } 98 | } 99 | } 100 | }; 101 | const observer = new MutationObserver(callback); 102 | observer.observe(document, { childList: true, subtree: true }); 103 | } 104 | 105 | 106 | // 快捷回到顶部(右键左右两侧空白处) 107 | function backToTop() { 108 | document.querySelector('section.relative').oncontextmenu = function(e){ 109 | if (e.target == this) { 110 | e.preventDefault(); 111 | window.scrollTo(0,0); 112 | } 113 | } 114 | } 115 | 116 | 117 | // 数组去重复 118 | function unique(arr) { 119 | return Array.from(new Set(arr)).sort(); 120 | } 121 | 122 | 123 | // 寻找父元素 124 | function findParentElement(item, tagName) { 125 | if (item.parentElement) { 126 | //console.log(item.parentElement) 127 | if (item.parentElement.tagName === tagName) { 128 | return item.parentElement; 129 | } else { 130 | let temp = findParentElement(item.parentElement, tagName) 131 | if (temp) return temp 132 | } 133 | } 134 | return 135 | } 136 | 137 | 138 | // 自动格式化输入框 139 | /*document.getElementById('target').addEventListener('focusout', function(){ 140 | if (this.value) { 141 | this.value = this.value.replace(/(http:\/\/|https:\/\/|\:.+|\/.*)/ig,""); 142 | this.setAttribute('value',this.value); 143 | this.dispatchEvent(new Event('input')); 144 | } 145 | }, true);*/ 146 | })(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # XIU2/UserScript 2 | 3 | [![GitHub license](https://img.shields.io/github/license/XIU2/UserScript.svg?style=flat-square&color=4285dd&logo=github)](https://github.com/XIU2/UserScript/) 4 | [![GitHub Star](https://img.shields.io/github/stars/XIU2/UserScript.svg?style=flat-square&label=Star&color=4285dd&logo=github)](https://github.com/XIU2/UserScript/) 5 | [![GitHub Fork](https://img.shields.io/github/forks/XIU2/UserScript.svg?style=flat-square&label=Fork&color=4285dd&logo=github)](https://github.com/XIU2/UserScript/) 6 | [![](https://data.jsdelivr.com/v1/package/gh/XIU2/UserScript/badge)](https://www.jsdelivr.com/package/gh/XIU2/UserScript) 7 | [![](https://img.shields.io/static/v1?label=%20&message=GreasyFork&style=flat-square&labelColor=7B0000&color=960000&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3ggEBCQHM3fXsAAAAVdJREFUOMudkz2qwkAUhc/goBaGJBgUtBCZyj0ILkpwAW7Bws4yO3AHLiCtEFD8KVREkoiFxZzX5A2KGfN4F04zMN+ce+5c4LMUgDmANYBnrnV+plBSi+FwyHq9TgA2LQpvCiEiABwMBtzv95RSfoNEHy8DYBzHrNVqVEr9BWKcqNFoxF6vx3a7zc1mYyC73a4MogBg7vs+z+czO50OW60Wt9stK5UKp9Mpj8cjq9WqDTBHnjAdxzGQZrPJw+HA31oulzbAWgLoA0CWZVBKIY5jzGYzdLtdE9DlcrFNrY98zobqOA6TJKHW2jg4nU5sNBpFDp6mhVe5rsvVasUwDHm9Xqm15u12o+/7Hy0gD8KatOd5vN/v1FozTVN6nkchxFuI6hsAAIMg4OPxMJCXdtTbR7JJCMEgCJhlGUlyPB4XfumozInrupxMJpRSRtZlKoNYl+m/6/wDuWAjtPfsQuwAAAAASUVORK5CYII=)](https://greasyfork.org/zh-CN/users/457025-x-i-u) 8 | 9 | 🔨 自用的一些乱七八糟油猴脚本,**有什么需求、建议、问题直接提 [Issues](https://github.com/XIU2/UserScript/issues/new/choose)**,觉得**好用请点个⭐鼓励一下叭~** 10 | 11 | > 也可以前往 GreasyFork 脚本页向我反馈,如果这两个网站你都没有账号,可以找个临时邮箱注册下(用完扔~ 12 | 13 | > _分享我其他开源项目:[**TrackersList.com** - 全网热门 BT Tracker 列表!有效提高 BT 下载速度~](https://github.com/XIU2/TrackersListCollection) _ 14 | > _[**CloudflareSpeedTest** - 🌩 测试 Cloudflare CDN 延迟和速度,获取最快 IP~](https://github.com/XIU2/CloudflareSpeedTest) _ 15 | 16 | ## 脚本列表 17 | 18 | > _详细的**脚本介绍、使用说明、截图演示**等信息,请点击 **\[安装\]** 前往 GreasyFork 查看~_ 19 | 20 | | | 脚本名称 | 脚本功能 | 安装 \| 备用 | 21 | | :----: | :---- | :---- | :----: | 22 | | [](https://github.com/XIU2) | **护眼模式** | 简单有效的全网通用护眼模式、夜间模式、暗黑模式~ | **[安装](https://greasyfork.org/zh-CN/scripts/426377)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/DarkMode.user.js)** | 23 | | [](https://www.zhihu.com/people/xiu2) | **知乎 美化** | 宽屏显示、**暗黑模式**、**屏蔽首页活动**、调整图片最大高度... | **[安装](https://greasyfork.org/zh-CN/scripts/412212)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Zhihu-Beautification.user.js)** | 24 | | [](https://www.zhihu.com/people/xiu2) | **知乎 增强** | **移除登录弹窗**、**屏蔽首页视频**、屏蔽用户、屏蔽关键词... | **[安装](https://greasyfork.org/zh-CN/scripts/419081)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Zhihu-Enhanced.user.js)** | 25 | | [](https://www.v2ex.com/) | **V2EX 增强** | **自动签到**、链接转图片、自动无缝翻页、新标签页打开链... | **[安装](https://greasyfork.org/zh-CN/scripts/424246)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/V2ex-Enhanced.user.js)** | 26 | | [](https://github.com/XIU2) | **Github 增强** | **高速下载** Git Clone/SSH、Release、Raw、Code(ZIP) ... | **[安装](https://greasyfork.org/zh-CN/scripts/412245)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/GithubEnhanced-High-Speed-Download.user.js)** | 27 | | [](https://ping.sx/ping) | **Ping.Sx 增强** | **一键复制所有 IP**、清理 IP 链接、快捷回到顶部 ... | **[安装](https://greasyfork.org/zh-CN/scripts/438704)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Ping.Sx-Enhanced.user.js)** | 28 | | [](https://github.com/XIU2) | **自动无缝翻页 \*** | 无缝衔接下一页内容 **(瀑布流)** 支持各论坛/漫画/百度/谷歌等... | **[安装](https://greasyfork.org/zh-CN/scripts/419215)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Autopage.user.js)** | 29 | | [](https://bbs.3dmgame.com) | **3DM论坛 美化** | 精简多余内容、样式优化 | **[安装](https://greasyfork.org/zh-CN/scripts/413593)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/3dm-Beautification.user.js)** | 30 | | [](https://bbs.3dmgame.com) | **3DM论坛 增强** | **自动回复**、自动无缝翻页、清理置顶帖子、自动滚至隐藏... | **[安装](https://greasyfork.org/zh-CN/scripts/412890)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/3dm-Enhanced.user.js)** | 31 | | [](https://www.lanzou.com) | **蓝奏云网盘 增强 \*** | **文件排序、右键显示菜单**、直接下载文件、显示更多文件... | **[安装](https://greasyfork.org/zh-CN/scripts/419224)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Lanzou-Enhanced.user.js)** | 32 | | [](https://duckduckgo.com) | **DuckDuckGo 增强** | **屏蔽指定域名**、修复图标加载、链接不携来源、快捷回到... | **[安装](https://greasyfork.org/zh-CN/scripts/436428)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/DuckDuckGo-Enhanced.user.js)** | 33 | | [](https://www.52pojie.cn) | **吾爱破解论坛 美化** | 精简多余内容、样式优化 | **[安装](https://greasyfork.org/zh-CN/scripts/412681)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/52pojie-Beautification.user.js)** | 34 | | [](https://www.52pojie.cn) | **吾爱破解论坛 增强** | **自动签到**、自动无缝翻页、屏蔽导读悬赏贴 (最新发表页)... | **[安装](https://greasyfork.org/zh-CN/scripts/412680)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/52pojie-Enhanced.user.js)** | 35 | | [](https://hostloc.com) | **全球主机交流论坛 增强 \*** | **自动访问空间(22积分)、屏蔽用户**、屏蔽关键词、自动翻... | **[安装](https://greasyfork.org/zh-CN/scripts/414005)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Hostloc-Enhanced.user.js)** | 36 | | [](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)** | 37 | | [](https://github.com/XIU2) | **HTML5 视频音频默认音量** | 避免被 100% 音量**吓一跳**!且支持各网站分别记住音量... | **[安装](https://greasyfork.org/zh-CN/scripts/438400)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/HTML5Volume.user.js)** | 38 | | [](https://github.com/XIU2) | **右键滚动条回到顶部** | 鼠标**右键**网页右侧的**滚动条**即可**回到顶部** | **[安装](https://greasyfork.org/zh-CN/scripts/506959)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/RightClick_ScrollBar_BackToTop.user.js)** | 39 | | [](https://github.com/XIU2) | **新标签页打开链接 \*** | 将网页中所有链接改为**新标签页打开**(可能存在兼容问题 | **[安装](https://greasyfork.org/zh-CN/scripts/429714)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/TargetBlank.user.js)** | 40 | | [](https://translate.google.cn) | ~~_**Google 翻译 美化**_~~ | ~~_精简多余内容、修复翻译结果溢出屏幕问题_~~ | ~~_**[安装](https://zhuanlan.zhihu.com/p/286815739)** \| **[备用](https://zhuanlan.zhihu.com/p/286815739)**_~~ | 41 | | [](http://bbs.zhiyoo.net/forum.php?mod=forumdisplay&fid=42&filter=author&orderby=dateline) | ~~_**智友邦论坛 美化**_~~ | ~~_精简多余内容、样式优化、宽屏显示_~~ | ~~_**[安装](https://greasyfork.org/zh-CN/scripts/412361)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Zhiyoo-Beautification.user.js)**_~~ | 42 | | [](http://bbs.zhiyoo.net/forum.php?mod=forumdisplay&fid=42&filter=author&orderby=dateline) | ~~_**智友邦论坛 增强**_~~ | ~~_自动签到、**自动回复**、自动无缝翻页、快捷回到顶部、附..._~~ | ~~_**[安装](https://greasyfork.org/zh-CN/scripts/412362)** \| **[备用](https://bitbucket.org/xiu2/userscript/raw/master/Zhiyoo-Enhanced.user.js)**_~~ | 43 | 44 | > [!TIP] 45 | > _脚本名称末尾 **`*`** 代表该脚本为**网友主动提出需求**而写的,不过现在已不再接受新脚本请求了。。。_ 46 | > _所有脚本均在 **Chrome、Firefox、Edge 浏览器 + Tampermonkey 扩展** 环境下测试通过!_ 47 | 48 | **** 49 | 50 | ## 如何安装/使用脚本? 51 | 52 | 要使用任何脚本,首先需要浏览器安装 **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))。** 53 | 54 | - 点击表格 **\[安装\]** 进入 GreasyFork 网页,点击 **\[安装脚本\]** 后弹出扩展提示,再点击 **\[安装\]** 即可。 55 | - 如果 GreasyFork 访问速度太慢,可以选择点击 **\[备用\]** 后弹出扩展提示,再去点击 **\[安装\]** 即可。 56 | 57 | > [!IMPORTANT] 58 | > - _其他基于 **Chromium** 内核的浏览器(如国内套皮浏览器)一般都可以使用 Chrome 扩展。_ 59 | > - _请确保使用 **Tampermonkey 正式版** 扩展,其他的用户脚本管理器可能导致**无法正常使用**脚本。_ 60 | > - _如果要重装脚本,请记得在 Tampermonkey 扩展的**回收站中彻底删除**脚本后再去重新安装脚本。_ 61 | 62 | > _**不会离线安装 .crx 扩展?[Chrome、Edge 重新开启隐藏的 [拖入安装 .crx 扩展] 功能!](https://zhuanlan.zhihu.com/p/276027099)**_ 63 | 64 | **** 65 | 66 | ## Tampermonkey `v5.0.0` 后脚本在 `部分网站` 无法正常运行? 67 | 68 | Tampermonkey 为了顺应 Chrome 的 Manifest V3 要求,在 v5.0.0 版本中修改了 CSP 相关选项的默认值。 69 | 70 | 你只需要去 Tampermonkey 设置中,先把最顶端的第一个选项 `配置模式:` 默认的 `新手` 改为 `高级`。 71 | 然后翻到下面的 `安全` 选项区域,找到 `修改内容安全策略(CSP)头信息:` 把默认的 `自动` 改为 **`全部移除`** 并点击下面一点的 `保存` 按钮即可解决。 72 | 73 | **** 74 | 75 | ## Tampermonkey `v5.2.0` 后脚本无法正常运行? 76 | 77 | 因为其 v5.2.0 版本转为了 Manifest V3,所以需要在浏览器的**扩展管理**界面**启用 `开发者模式`** 才能正常运行脚本! 78 | 79 | **** 80 | 81 | ## 如果脚本帮到你的话就 "打赏" 一下吧~🎉✨ 82 | 83 | ![微信赞赏](https://github.com/XIU2/XIU2/blob/master/img/zs-01.png)![支付宝赞赏](https://github.com/XIU2/XIU2/blob/master/img/zs-02.png) 84 | 85 | **** 86 | 87 | ## License 88 | 89 | The GPL-3.0 License. -------------------------------------------------------------------------------- /RightClick_ScrollBar_BackToTop.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Right click scroll bar back to top 3 | // @name:zh-CN 右键滚动条回到顶部 4 | // @name:zh-TW 右鍵滾動條回到頂部 5 | // @name:ru ПКМ по полоске прокрутки для перехода вверх 6 | // @version 1.0.0 7 | // @author X.I.U 8 | // @description Right-click the scroll bar on the right side of the webpage to return to the top 9 | // @description:zh-CN 鼠标右键网页右侧的滚动条即可回到顶部 10 | // @description:zh-TW 鼠標右鍵網頁右側的滾動條即可回到頂部 11 | // @description:ru Щёлкните правой кнопкой по полосе прокрутки в правой части веб-страницы, чтобы вернуться наверх 12 | // @match *://*/* 13 | // @icon data:image/png;base64,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 14 | // @grant none 15 | // @license GPL-3.0 License 16 | // @run-at document-end 17 | // @namespace https://github.com/XIU2/UserScript 18 | // ==/UserScript== 19 | 20 | (function() { 21 | 'use strict'; 22 | // 获取网页右侧滚动条宽度(如果获取不到就默认 15) 23 | const scrollBarWidth = getScrollBarWidth() || 15 24 | document.addEventListener('contextmenu', function(e) { 25 | // 检查右键点击的位置是否在滚动条区域(鼠标右键点击位置的水平坐标值 大于 网页宽度 - 滚动条宽度 - 10的冗余) 26 | const isScrollbar = e.clientX > window.innerWidth - scrollBarWidth - 10; 27 | if (isScrollbar) { 28 | // 如果右键点击到的元素是 HTML,说明确定是点到了滚动条上面(点击事件会被浏览器透过滚动条响应给网页最根部的 HTML) 29 | if (e.target.tagName === 'HTML') { 30 | window.scrollTo(0,0); 31 | } else if (e.target.tagName !== 'BODY') { // 如果右键点击到的既不是 HTML,也不是 BODY(因为右键单击滚动条左侧区域基本上都是 BODY 这个背景元素),那么可能是点击到了网页内嵌套元素的滚动条,那么就只需要这个元素回到顶部即可 32 | e.target.scrollTo(0,0); 33 | } 34 | e.preventDefault(); // 阻止默认事件(即弹出右键菜单) 35 | e.stopPropagation(); // 停止继续向上冒泡(即向上传播触发其他的委托点击事件) 36 | } 37 | }); 38 | 39 | // 获取网页右侧滚动条宽度 40 | function getScrollBarWidth() { 41 | // 创建一个临时的 div 元素 42 | const div = document.createElement('div'); 43 | div.style.overflow = 'scroll'; // 强制出现滚动条 44 | div.style.visibility = 'hidden'; // 不要显示出来 45 | //div.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps? 46 | div.style.width = '100px'; // 设置宽度 47 | div.style.height = '100px'; // 设置高度 48 | document.body.appendChild(div); // 将 div 添加到文档 49 | 50 | // 创建一个内嵌的 div 51 | const innerDiv = document.createElement('div'); 52 | innerDiv.style.width = '100%'; // 设置宽度为 100% 53 | innerDiv.style.height = '100%'; // 设置高度为 100% 54 | div.appendChild(innerDiv); // 将内嵌 div 添加到外部 div 55 | 56 | // 计算滚动条宽度 57 | const scrollBarWidth = div.offsetWidth - innerDiv.offsetWidth; 58 | 59 | // 移除临时 div 60 | div.parentNode.removeChild(div); 61 | 62 | return scrollBarWidth; // 返回滚动条宽度 63 | } 64 | })(); 65 | -------------------------------------------------------------------------------- /SteamWorkshopImageRepair.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Steam 创意工坊大图修复 3 | // @version 1.0.0 4 | // @author X.I.U 5 | // @description 修复 Steam 创意工坊预览大图无法显示的问题(Steam 不改的话,长期可用) 6 | // @match *://steamcommunity.com/sharedfiles/filedetails/* 7 | // @match *://steamcommunity.com/workshop/filedetails/* 8 | // @icon data:image/png;base64,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 9 | // @license GPL-3.0 License 10 | // @run-at document-end 11 | // @namespace https://github.com/XIU2/UserScript 12 | // @supportURL https://github.com/XIU2/UserScript 13 | // @homepageURL https://github.com/XIU2/UserScript 14 | // ==/UserScript== 15 | 16 | if(typeof onYouTubeIframeAPIReady == 'function') { 17 | onYouTubeIframeAPIReady(); 18 | } -------------------------------------------------------------------------------- /TargetBlank.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 新标签页打开链接 3 | // @version 1.0.9 4 | // @author X.I.U 5 | // @description 将网页中所有链接改为新标签页打开~ 6 | // @match *://*/* 7 | // @icon data:image/png;base64,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 8 | // @grant none 9 | // @license GPL-3.0 License 10 | // @run-at document-end 11 | // @namespace https://github.com/XIU2/UserScript 12 | // @supportURL https://github.com/XIU2/UserScript 13 | // @homepageURL https://github.com/XIU2/UserScript 14 | // @exclude https://accounts.google.com/* 15 | // @exclude https://accounts.google.com.hk/* 16 | // ==/UserScript== 17 | 18 | (function() { 19 | 'use strict'; 20 | targetBlank(); // 修改为新标签页打开 21 | targetDiscuz(); // 针对 Discuz! 论坛的帖子 22 | aObserver(); // 针对动态加载内容中的 a 标签 23 | 24 | 25 | // 修改为新标签页打开 26 | function targetBlank() { 27 | document.head.appendChild(document.createElement('base')).target = '_blank'; // 让所有链接默认以新标签页打开 28 | Array.from(document.links).forEach(function (_this) { // 排除特殊链接 29 | if (_this.onclick || _this.href.slice(0,4) != 'http' || _this.getAttribute('href').slice(0,1) === '#') { 30 | _this.target = '_self' 31 | } 32 | }) 33 | document.querySelectorAll('form').forEach(function (_this) { // 排除 form 标签 34 | if (!_this.target) {_this.target = '_self'} 35 | }); 36 | } 37 | 38 | 39 | // 针对 Discuz! 论坛的帖子 40 | function targetDiscuz() { 41 | if (document.querySelector('meta[name="author"][content*="Discuz!"], meta[name="generator"][content*="Discuz!"]') || document.querySelector('body[id="nv_forum"][class^="pg_"][onkeydown*="27"]') || document.querySelector('body[id="nv_search"][onkeydown*="27"]') || (document.querySelector('a[href*="www.discuz.net"]') && document.querySelector('a[href*="www.discuz.net"]').textContent.indexOf('Discuz!') > -1) || (document.getElementById('ft') && document.getElementById('ft').textContent.indexOf('Discuz!') > -1)) { 42 | let atarget = document.getElementById('atarget'); 43 | if (atarget && atarget.className.indexOf('atarget_1') === -1) { // 强制勾选 [新窗] 44 | atarget.click(); 45 | } 46 | } 47 | } 48 | 49 | 50 | // 针对动态加载内容中的 a 标签 51 | function aObserver() { 52 | const callback = (mutationsList, observer) => { 53 | for (const mutation of mutationsList) { 54 | for (const target of mutation.addedNodes) { 55 | if (target.nodeType != 1) return 56 | if (target.tagName === 'A') { 57 | if (target.onclick || target.href.slice(0,4) != 'http' || target.getAttribute('href').slice(0,1) === '#') { 58 | target.target = '_self' 59 | } 60 | } else { 61 | document.querySelectorAll('a').forEach(function (_this) { 62 | if (_this.onclick || _this.href.slice(0,4) != 'http' || _this.getAttribute('href').slice(0,1) === '#') { 63 | _this.target = '_self' 64 | } 65 | }); 66 | } 67 | } 68 | } 69 | }; 70 | const observer = new MutationObserver(callback); 71 | observer.observe(document, { childList: true, subtree: true }); 72 | } 73 | })(); -------------------------------------------------------------------------------- /V2ex-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name V2EX 增强 3 | // @version 1.2.2 4 | // @author X.I.U 5 | // @description 自动签到、链接转图片、自动无缝翻页、使用 SOV2EX 搜索、回到顶部(右键点击两侧空白处)、快速回复(左键双击两侧空白处)、新标签页打开链接、标签页伪装为 Github(摸鱼) 6 | // @match *://v2ex.com/* 7 | // @match *://*.v2ex.com/* 8 | // @match *://www.sov2ex.com/* 9 | // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAAgoAMABAAAAAEAAAAgAAAAAI9OQMkAAARKSURBVHicrVe7SzNLFP/t7CObbEg0WliJooUxcAsfYKFW2lh8NhdLwUIsbMTCBG3EIoid4J/xNd9t7ZSAIiJcNaSIYBcbNVlMsq/M3MK762YziVE8EGbYOTnnd55zRsD/xBiT7+/vf+u6vlir1VTLskApFfADRAhhiqIgEokYsVjsNJVK/S0Igg0AAgAUCoW/np+fr15fX5WfUPgZ9fT0WP39/dNjY2P/SowxOZfLXZXLZUVRFIyPjyORSCAUCkEQmh3AGIMgCGCMAYC3D/IFiVIKy7Lw8vKCfD6PcrmsALhijEWFu7u7P4+Pj78URcHMzAyi0WjXCoPnQeLxV6tVXFxcwLIsDA0N/UN0XV8EgGQyCU3TQClFo9FAo9EAY8xb/Xv33OWllIJSCsaYt/L4GWPQNA3JZBIAoOv6olSr1VQASCQS3h/9FgWtC54FPcDbB2UkEgkAQK1WUyXLsgAAiqK0MFNKIQgCKKVcl3ajMChPFEXIsgwAsCwLkltq/jh1K/C7RAhxAQmSX3DQwo2NDZydnbWcu4D9vKFQCNvb21hdXfUU8ZIwaIQHwD3w50Aul/PQflZyjuPg6OgIoVAIKysrbRUGc6wFgH8lhLRV2K4Es9ksotEolpaWuuobTSEAPhIPACSpCV/XtL+/D03TMD8/3ySP5xHiB+BnYIxBFEUQQkAI8faiKHJ/fh7GGPb29nB9fd0kryOAIBAXgCRJkCQJhBBv5QGSJKmJ33EcpNNp5PP5JpnBkHXMgcvLy65cXiqVsLm5iaenp6bvpmkinU7j+PgYw8PD3BJuCgEAr+kEAXXqCQMDAzg5OUFfX19LaN7e3pDJZGDbNtcLXA+4ICzL6nj5uHu3WtwwBIn3rQVAJws/6/WlUgmZTAa6rnvKXHDxeByHh4cghHgXFRcAT8Hy8nLXVy/P0nA4jGw2i8HBQTiO09kDfgD+PvDdWUCWZRwcHGB0dBTuhcczkhsCfyfslvwACSHY3d1FKpXy8oinvAlAEATw7tLPEjB4DgBbW1uYnJyEYRhfb8V+hJ0AtPPA+vo6ZmdnYZpmizy3urruhFNTU17n83dDf9dz6z0cDmNtbQ0LCwswDKNpNON1QK4Hgi7a2dnh/qkdMcZgmmbbCYo7DxBCGKVU4CWh/ybjCQwqNwyD2zWDSdhoNAC8P1gkWZZhmiYsy4KiKCCEeAz1ev1LpfdZqYqiCMaY1xNkWQZRVdUAgHK5/PHxY2bzVv/eb43fa/7RPMhPCPGGUVeXqqqGFI1GTyuVyq9isQhN0xCJRBAKhbqy8KvE2PvDpFgsAgA0TTsVGGPy+fn5m67riizLGBkZQTweh6Io31YUJEopbNtGpVLBw8MDbNtGLBaz5ubmopIgCPbt7e00gCtd15VCofAjSjtRLBazent7pwVBsD0TGWPyzc3N72q1uliv11XHcX70eS7LMlRVNSKRyOnExIT3PP8P91unlxYYZf4AAAAASUVORK5CYII= 10 | // @grant GM_xmlhttpRequest 11 | // @grant GM_registerMenuCommand 12 | // @grant GM_unregisterMenuCommand 13 | // @grant GM_openInTab 14 | // @grant GM_getValue 15 | // @grant GM_setValue 16 | // @grant GM_notification 17 | // @license GPL-3.0 License 18 | // @run-at document-end 19 | // @namespace https://github.com/XIU2/UserScript 20 | // @supportURL https://github.com/XIU2/UserScript 21 | // @homepageURL https://github.com/XIU2/UserScript 22 | // ==/UserScript== 23 | 24 | (function() { 25 | 'use strict'; 26 | var menu_ALL = [ 27 | ['menu_autoClockIn', '自动签到', '自动签到', true], 28 | ['menu_linksToImgs', '链接转图片', '链接转图片', true], 29 | ['menu_pageLoading', '自动无缝翻页', '自动无缝翻页', true], 30 | ['menu_pageLoading_reply', '帖子内自动翻页', '帖子内自动翻页', false], 31 | ['menu_backToTop', '回到顶部(右键点击两侧空白处)', '回到顶部', true], 32 | ['menu_quickReply', '快速回复(左键双击两侧空白处)', '快速回复', true], 33 | ['menu_linksBlank', '新标签页打开链接', '新标签页打开链接', true], 34 | ['menu_sov2ex', '使用 SOV2EX 搜索', '使用 SOV2EX 搜索', false], 35 | ['menu_fish', '标签页伪装为 Github(摸鱼)', '标签页伪装为 Github', false] 36 | ], menu_ID = [], pausePage = true; 37 | for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 46 | for (let i=0;i div', 101 | HT_insert: ['css;#notifications', 3], 102 | replaceE: '//a[@class="page_current"]/../..', 103 | scrollDelta: 1500 104 | } 105 | }, 106 | replies: { // 用户回复页 107 | SiteTypeID: 3, 108 | pager: { 109 | type: 1, 110 | nextLink: 'css;.page_current+a', 111 | pageElement: 'css;#Main>.box>.dock_area,#Main>.box>.dock_area+.inner,#Main>.box>.dock_area+.cell:not([style])', 112 | HT_insert: ['css;.cell.ps_container:last-of-type', 1], 113 | replaceE: '//a[@class="page_current"]/../..', 114 | scrollDelta: 1500 115 | } 116 | }, 117 | go: { // 分类主题页 118 | SiteTypeID: 4, 119 | pager: { 120 | type: 1, 121 | nextLink: 'css;.page_current+a', 122 | pageElement: 'css;#TopicsNode > div', 123 | HT_insert: ['css;#TopicsNode', 3], 124 | replaceE: '//a[@class="page_current"]/../..', 125 | scrollDelta: 1500 126 | } 127 | }, 128 | reply: { // 帖子内容页(从前往后) 129 | SiteTypeID: 5, 130 | pager: { 131 | type: 1, 132 | nextLink: 'css;.page_current+a', 133 | pageElement: 'css;.cell[id^="r_"]', 134 | HT_insert: ['css;.cell.ps_container:last-of-type', 1], 135 | replaceE: '//a[@class="page_current"]/../..', 136 | scrollDelta: 1500 137 | } 138 | }, 139 | reply_positive: { // 帖子内容页(从后往前) 140 | SiteTypeID: 6, 141 | pager: { 142 | type: 1, 143 | nextLink: 'css;.page_current+a', 144 | pageElement: 'css;.cell[id^="r_"]', 145 | HT_insert: ['css;.cell[id^="r_"]', 1], 146 | replaceE: '//a[@class="page_current"]/../..', 147 | scrollDelta: 1500 148 | } 149 | }, 150 | balance: { // 账户余额页 151 | SiteTypeID: 7, 152 | pager: { 153 | type: 1, 154 | nextLink: 'css;.page_current+a', 155 | pageElement: 'css;table.data>tbody>tr:not(:first-child)', 156 | HT_insert: ['css;table.data>tbody', 3], 157 | replaceE: '//a[@class="page_current"]/../..', 158 | scrollDelta: 1000 159 | } 160 | }, 161 | sov2ex: { // sov2ex 162 | SiteTypeID: 8, 163 | pager: { 164 | nextLink: '.paging>a', 165 | scrollDelta: 1000 166 | } 167 | } 168 | }; 169 | 170 | if (location.hostname === 'www.sov2ex.com') { 171 | curSite = DBSite.sov2ex; 172 | pageLoading(); 173 | } else { 174 | switch (location.pathname) { 175 | case '/': // 首页 176 | addChangesLink(); 177 | break; 178 | case '/recent': // 最近主题页 179 | curSite = DBSite.recent; 180 | break; 181 | case '/notifications': // 提醒消息页 182 | curSite = DBSite.notifications; 183 | break; 184 | case '/balance': // 账户余额页 185 | curSite = DBSite.balance; 186 | break; 187 | default: 188 | if (location.pathname.indexOf('/go/') > -1) { // 分类主题页 189 | curSite = DBSite.go; 190 | } else if (location.pathname.indexOf('/t/') > -1) { // 帖子内容页 191 | if(menu_value('menu_pageLoading_reply'))curSite = DBSite.reply; // 帖子内自动无缝翻页 192 | if(menu_value('menu_quickReply'))quickReply(); // 快速回复(双击左右两侧空白处) 193 | } else if (location.pathname.indexOf('/replies') > -1) { // 用户回复页 194 | curSite = DBSite.replies; 195 | } 196 | } 197 | 198 | curSite.pageUrl = ''; // 下一页URL 199 | if(menu_value('menu_linksBlank')) linksBlank(); // 新标签页打开链接 200 | if(menu_value('menu_fish')) fish(); // 标签页伪装为 Github(摸鱼) 201 | if(menu_value('menu_autoClockIn')) setTimeout(qianDao, 1000); // 自动签到(后台),延迟 1 秒执行是为了兼容 [V2ex Plus] 扩展 202 | if(menu_value('menu_pageLoading')) pageLoading(); // 自动翻页(无缝) 203 | if(menu_value('menu_backToTop')) backToTop(); // 回到顶部(右键点击左右两侧空白处) 204 | if(menu_value('menu_linksToImgs')) linksToImgs(); // 链接转图片 205 | if(menu_value('menu_sov2ex')) setTimeout(soV2ex, 1000); // 替换为 sov2ex 搜索 206 | } 207 | 208 | // 自动签到(后台) 209 | function qianDao() { 210 | let timeNow = new Date().getUTCFullYear() + '/' + (new Date().getUTCMonth() + 1) + '/' + new Date().getUTCDate() // 当前 UTC-0 时间(V2EX 按这个时间的) 211 | if (location.pathname == '/') { // 在首页 212 | let qiandao = document.querySelector('.box .inner a[href="/mission/daily"]'); 213 | if (qiandao) { // 如果找到了签到提示 214 | qianDao_(qiandao, timeNow); // 后台签到 215 | } else if (document.getElementById('gift_v2excellent')) { // 兼容 [V2ex Plus] 扩展 216 | document.getElementById('gift_v2excellent').click(); 217 | GM_setValue('menu_clockInTime', timeNow); // 写入签到时间以供后续比较 218 | console.info('[V2EX 增强] 自动签到完成!') 219 | } else { // 都没有找到,说明已经签过到了 220 | console.info('[V2EX 增强] 已经签过到了。') 221 | } 222 | } else { // 不在首页 223 | let timeOld = GM_getValue('menu_clockInTime') 224 | if (!timeOld || timeOld != timeNow) { 225 | qianDaoStatus_(timeNow) // 后台获取签到状态(并判断是否需要签到) 226 | }/* else { // 新旧签到时间一致 227 | console.info('[V2EX 增强] 已经签过到了。') 228 | }*/ 229 | } 230 | } 231 | 232 | 233 | // 后台签到 234 | function qianDao_(qiandao, timeNow) { 235 | let url = (location.origin + "/mission/daily/redeem?" + RegExp("once\\=(\\d+)").exec(document.querySelector('div#Top .tools, #menu-body').innerHTML)[0]); 236 | GM_xmlhttpRequest({ 237 | url: url, 238 | method: 'GET', 239 | timeout: 5000, 240 | onload: function (response) { 241 | let html = ShowPager.createDocumentByString(response.responseText); 242 | //console.log(html) 243 | if (html.querySelector('li.fa.fa-ok-sign')) { 244 | html = html.getElementById('Main').textContent.match(/已连续登录 (\d+?) 天/)[0]; 245 | GM_setValue('menu_clockInTime', timeNow); // 写入签到时间以供后续比较 246 | console.info('[V2EX 增强] 自动签到完成!') 247 | if (qiandao) { 248 | qiandao.textContent = `自动签到完成!${html}`; 249 | qiandao.href = 'javascript:void(0);'; 250 | } 251 | } else { 252 | GM_notification({text: '自动签到失败!请访问 V2EX 首页试试。\n如果连续几天都签到失败,请联系作者解决!', timeout: 4000, onclick() {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/424246/feedback', {active: true,insert: true,setParent: true});}}); 253 | console.warn('[V2EX 增强] 自动签到失败!请访问 V2EX 首页试试。如果连续几天都签到失败,请联系作者解决!') 254 | if (qiandao) qiandao.textContent = '自动签到失败!请尝试手动签到!'; 255 | } 256 | } 257 | }); 258 | } 259 | 260 | 261 | // 后台获取签到状态(并判断是否需要签到) 262 | function qianDaoStatus_(timeNow) { 263 | GM_xmlhttpRequest({ 264 | url: location.origin + '/mission/daily', 265 | method: 'GET', 266 | timeout: 5000, 267 | onload: function (response) { 268 | let html = ShowPager.createDocumentByString(response.responseText); 269 | if (html.querySelector('input[value^="领取"]')) { // 还没有签到... 270 | qianDao_(null, timeNow); // 后台签到 271 | } else { // 已经签到了... 272 | console.info('[V2EX 增强] 已经签过到了。') 273 | GM_setValue('menu_clockInTime', timeNow); // 写入签到时间以供后续比较 274 | } 275 | } 276 | }); 277 | } 278 | 279 | 280 | // 替换为 sov2ex 搜索,代码来自 v2ex-plus 扩展:https://github.com/sciooga/v2ex-plus (懒得重复造轮子了~ 281 | function soV2ex() { 282 | document.body.appendChild(document.createElement('script')).textContent = ` 283 | var $search = $('#search') 284 | var searchEvents = $._data($search[0], "events" ) 285 | var oKeydownEvent = searchEvents['keydown'][0]['handler'] 286 | var oInputEvent = searchEvents['input'][0]['handler'] 287 | $search.attr("placeholder","sov2ex") 288 | $search.unbind('keydown', oKeydownEvent) 289 | $search.unbind('input', oInputEvent) 290 | $search.on('input', function(e) { 291 | oInputEvent(e) 292 | $('.search-item:last').attr('href', 'https://www.sov2ex.com/?q=' + $search.val()).text('sov2ex ' +$search.val()); 293 | }) 294 | $search.keydown(function(e) { 295 | if (e.code == 'Enter' || e.code == 'NumpadEnter' || e.keyCode === 13) { 296 | if ($('.search-item:last').is('.active')) { 297 | $(this).val($(this).val().replace(/[#%&]/g,""));//用户输入不能包含特殊字符#%& 298 | window.open("https://www.sov2ex.com/?q=" + $(this).val()); 299 | return 0 300 | } 301 | } 302 | oKeydownEvent(e) 303 | }) 304 | `; 305 | } 306 | 307 | 308 | // 回到顶部(右键左右两侧空白处) 309 | function backToTop() { 310 | document.getElementById('Wrapper').oncontextmenu = document.querySelector('#Wrapper > .content').oncontextmenu = function(event){ 311 | if (event.target == this) { 312 | event.preventDefault(); 313 | window.scrollTo(0,0) 314 | } 315 | } 316 | } 317 | 318 | 319 | // 标签页伪装为 Github(摸鱼) 320 | function fish() { 321 | window.document.title = 'GitHub' 322 | if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { 323 | document.querySelector("link[rel*='shortcut icon']").href = 'https://github.githubassets.com/favicons/favicon-dark.png' 324 | } else { 325 | document.querySelector("link[rel*='shortcut icon']").href = 'https://github.githubassets.com/favicons/favicon.png' 326 | } 327 | } 328 | 329 | 330 | // 链接转图片 331 | function linksToImgs() { 332 | let links = document.links; 333 | Array.from(links).forEach(function (_this) { 334 | if (/^https.*\.(?:jpg|jpeg|jpe|bmp|png|gif)/i.test(_this.href) && !(/`; 336 | } else if (/^https:\/\/imgur\.com\/[a-z]+$/i.test(_this.href)) { // 针对没有文件后缀的 imgur 图床链接 337 | _this.innerHTML = ``; 338 | } 339 | }); 340 | } 341 | 342 | 343 | // 快速回复(双击左右两侧空白处) 344 | function quickReply() { 345 | document.getElementById('Wrapper').ondblclick = document.querySelector('#Wrapper > .content').ondblclick = function(event){ 346 | if (event.target==this) { 347 | if (document.querySelector('.box.reply-box-sticky')) { 348 | document.getElementById('undock-button').click(); 349 | } else { 350 | let _top = document.body.scrollTop + document.documentElement.scrollTop; 351 | document.getElementById('reply_content').focus(); 352 | window.scrollTo(0,_top);console.log(_top); 353 | } 354 | } 355 | } 356 | } 357 | 358 | 359 | // 新标签页打开链接 360 | function linksBlank() { 361 | if (location.pathname.indexOf('/settings') > -1) return 362 | document.head.appendChild(document.createElement('base')).target = '_blank'; // 让所有链接默认以新标签页打开 363 | Array.from(document.links).forEach(function (_this) { 364 | if (_this.onclick || _this.href.slice(0,4) != 'http' || _this.href.indexOf('#;') > -1 || _this.href.indexOf('night/toggle') > -1 || _this.href.indexOf('/favorite') > -1 || _this.href.indexOf('/?tab=') > -1) { 365 | _this.target = '_self' 366 | } 367 | }) 368 | document.querySelectorAll('form').forEach(function (_this) { 369 | if (!_this.target) {_this.target = '_self'} 370 | }); 371 | 372 | const callback = (mutationsList, observer) => { 373 | for (const mutation of mutationsList) { 374 | for (const target of mutation.addedNodes) { 375 | if (target.nodeType != 1) return 376 | if (target.tagName === 'A') { 377 | if (target.onclick || target.href.slice(0,4) != 'http' || target.href.indexOf('#;') > -1 || target.href.indexOf('night/toggle') > -1 || target.href.indexOf('/favorite') > -1) { 378 | target.target = '_self' 379 | } 380 | } else { 381 | document.querySelectorAll('a').forEach(function (_this) { 382 | if (_this.onclick || _this.href.slice(0,4) != 'http' || _this.href.indexOf('#;') > -1 || _this.href.indexOf('night/toggle') > -1 || _this.href.indexOf('/favorite') > -1) { 383 | _this.target = '_self' 384 | } 385 | }); 386 | } 387 | } 388 | } 389 | }; 390 | const observer = new MutationObserver(callback); 391 | observer.observe(document, { childList: true, subtree: true }); 392 | } 393 | 394 | 395 | // 添加全站最近更新主题链接 396 | function addChangesLink() { 397 | let links = document.querySelector('#Main .box .inner:last-child');if (!links) return 398 | links.innerHTML = `` 399 | } 400 | 401 | 402 | // 自动无缝翻页 403 | function pageLoading() { 404 | if (curSite.SiteTypeID > 0){ 405 | windowScroll(function (direction, e) { 406 | // 下滑 且 未暂停翻页 且 SiteTypeID > 0 时,才准备翻页 407 | if (direction != 'down' || !pausePage) return 408 | let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop, 409 | scrollHeight = window.innerHeight || document.documentElement.clientHeight, 410 | scrollDelta = curSite.pager.scrollDelta; 411 | if (document.documentElement.scrollHeight <= scrollHeight + scrollTop + scrollDelta) { 412 | if (curSite.pager.type === 1) { 413 | ShowPager.loadMorePage(); 414 | }else{ 415 | let autopbn = document.querySelector(curSite.pager.nextLink); 416 | if (autopbn){ 417 | autopbn.click(); 418 | pausePage = false 419 | setTimeout(function(){pausePage = true;}, 500) 420 | } 421 | } 422 | } 423 | }); 424 | } 425 | } 426 | 427 | 428 | // 滚动条事件 429 | function windowScroll(fn1) { 430 | var beforeScrollTop = document.documentElement.scrollTop || document.body.scrollTop, 431 | fn = fn1 || function () {}; 432 | setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件 433 | window.addEventListener('scroll', function (e) { 434 | var afterScrollTop = document.documentElement.scrollTop || document.body.scrollTop, 435 | delta = afterScrollTop - beforeScrollTop; 436 | if (delta == 0) return false; 437 | fn(delta > 0 ? 'down' : 'up', e); 438 | beforeScrollTop = afterScrollTop; 439 | }, false); 440 | }, 1000) 441 | } 442 | 443 | 444 | // 修改自 https://greasyfork.org/scripts/14178 , https://github.com/machsix/Super-preloader 445 | var ShowPager = { 446 | getFullHref: function (e) { 447 | if (e != null && e.nodeType === 1 && e.href && e.href.slice(0,4) === 'http') return e.href; 448 | return ''; 449 | }, 450 | createDocumentByString: function (e) { 451 | if (e) { 452 | if ('HTML' !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, 'application/xhtml+xml'); 453 | var t; 454 | try { t = (new DOMParser).parseFromString(e, 'text/html');} catch (e) {} 455 | if (t) return t; 456 | if (document.implementation.createHTMLDocument) { 457 | t = document.implementation.createHTMLDocument('ADocument'); 458 | } else { 459 | 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) {} 460 | } 461 | if (t) { 462 | var r = document.createRange(), 463 | n = r.createContextualFragment(e); 464 | r.selectNodeContents(document.body); 465 | t.body.appendChild(n); 466 | 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); 467 | return t; 468 | } 469 | } else console.error('没有找到要转成 DOM 的字符串'); 470 | }, 471 | loadMorePage: function () { 472 | if (curSite.pager) { 473 | let curPageEle = getOneElements(curSite.pager.nextLink); 474 | var url = this.getFullHref(curPageEle); 475 | console.log(`${url} ${curPageEle} ${curSite.pageUrl}`); 476 | if(url === '') return; 477 | if(curSite.pageUrl === url) return;// 不会重复加载相同的页面 478 | curSite.pageUrl = url; 479 | // 读取下一页的数据 480 | curSite.pager.startFilter && curSite.pager.startFilter(); 481 | GM_xmlhttpRequest({ 482 | url: url, 483 | method: "GET", 484 | timeout: 5000, 485 | onload: function (response) { 486 | try { 487 | var newBody = ShowPager.createDocumentByString(response.responseText); 488 | let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody); 489 | let toElement = getAllElements(curSite.pager.HT_insert[0])[0]; 490 | if (pageElems.length >= 0) { 491 | // 如果有插入前函数就执行函数 492 | if (curSite.function && curSite.function.before) { 493 | if (curSite.function.parameter) { // 如果指定了参数 494 | pageElems = curSite.function.before(curSite.function.parameter); 495 | }else{ 496 | pageElems = curSite.function.before(pageElems); 497 | } 498 | } 499 | // 插入位置 500 | let addTo; 501 | switch (curSite.pager.HT_insert[1]) { 502 | case 1: 503 | addTo = "beforebegin" 504 | break; 505 | case 2: 506 | addTo = "afterbegin" 507 | break; 508 | case 3: 509 | addTo = "beforeend" 510 | break; 511 | case 4: 512 | addTo = "afterend" 513 | break; 514 | } 515 | // 插入新页面元素 516 | pageElems.forEach(function (one) { 517 | toElement.insertAdjacentElement(addTo, one); 518 | }); 519 | // 替换待替换元素 520 | try { 521 | let oriE = getAllElements(curSite.pager.replaceE); 522 | let repE = getAllElements(curSite.pager.replaceE, newBody, newBody); 523 | if (oriE.length === repE.length) { 524 | for (var i = 0; i < oriE.length; i++) { 525 | oriE[i].outerHTML = repE[i].outerHTML; 526 | } 527 | } 528 | } catch (e) { 529 | console.log(e); 530 | } 531 | // 如果有插入后函数就执行函数 532 | if (curSite.function && curSite.function.after) { 533 | if (curSite.function.parameter) { // 如果指定了参数 534 | curSite.function.after(curSite.function.parameter); 535 | }else{ 536 | curSite.function.after(); 537 | } 538 | } 539 | } 540 | } catch (e) { 541 | console.log(e); 542 | } 543 | } 544 | }); 545 | } 546 | }, 547 | }; 548 | function getElementByCSS(css, contextNode = document) { 549 | return contextNode.querySelector(css); 550 | } 551 | function getAllElementsByCSS(css, contextNode = document) { 552 | return [].slice.call(contextNode.querySelectorAll(css)); 553 | } 554 | function getElementByXpath(xpath, contextNode, doc = document) { 555 | contextNode = contextNode || doc; 556 | try { 557 | const result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 558 | // 应该总是返回一个元素节点 559 | return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue; 560 | } catch (err) { 561 | throw new Error(`Invalid xpath: ${xpath}`); 562 | } 563 | } 564 | function getAllElementsByXpath(xpath, contextNode, doc = document) { 565 | contextNode = contextNode || doc; 566 | const result = []; 567 | try { 568 | const query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 569 | for (let i = 0; i < query.snapshotLength; i++) { 570 | const node = query.snapshotItem(i); 571 | // 如果是 Element 节点 572 | if (node.nodeType === 1) result.push(node); 573 | } 574 | } catch (err) { 575 | throw new Error(`无效 Xpath: ${xpath}`); 576 | } 577 | return result; 578 | } 579 | function getOneElements(selector, contextNode = undefined, doc = document) { 580 | if (!selector) return; 581 | contextNode = contextNode || doc; 582 | if (selector.search(/^css;/i) === 0) { 583 | return getElementByCSS(selector.slice(4), contextNode); 584 | } else { 585 | return getElementByXpath(selector, contextNode, doc); 586 | } 587 | } 588 | function getAllElements(selector, contextNode = undefined, doc = document, win = window, _cplink = undefined) { 589 | if (!selector) return []; 590 | contextNode = contextNode || doc; 591 | if (typeof selector === 'string') { 592 | if (selector.search(/^css;/i) === 0) { 593 | return getAllElementsByCSS(selector.slice(4), contextNode); 594 | } else { 595 | return getAllElementsByXpath(selector, contextNode, doc); 596 | } 597 | } else { 598 | const query = selector(doc, win, _cplink); 599 | if (!Array.isArray(query)) { 600 | throw new Error('getAllElements 返回错误类型'); 601 | } else { 602 | return query; 603 | } 604 | } 605 | } 606 | })(); -------------------------------------------------------------------------------- /Zhiyoo-Beautification.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 智友邦论坛美化 3 | // @version 1.0.2 4 | // @author X.I.U 5 | // @description 精简多余内容、样式优化、宽屏显示 6 | // @icon http://bbs.zhiyoo.net/favicon.ico 7 | // @match *://bbs.zhiyoo.net/* 8 | // @license GPL-3.0 License 9 | // @run-at document-start 10 | // @namespace https://greasyfork.org/scripts/412361 11 | // @supportURL https://github.com/XIU2/UserScript 12 | // @homepageURL https://github.com/XIU2/UserScript 13 | // ==/UserScript== 14 | 15 | 'use strict'; 16 | (function() { 17 | let style_Add = document.createElement('style'); 18 | style_Add.innerHTML = ` 19 | /* 精简多于内容 */ 20 | .forum_top,#main_sidebar,.drag,.nav,.tps,.bm.bml,.ct2 .sd,.mn div.box.cl:nth-of-type(3),#f_pst,.plc.plm,#diy_like1,#hm_qrcode_main,#ft,.po.bbd.reply_p,.ft_top.cl,div a[href="https://weibo.com/372458419"] { 21 | display: none !important; 22 | } 23 | /* 调整主体宽度(因为隐藏了右侧侧栏) */ 24 | .ct2 .mn,#wp .forum-left,#thread_types1 { 25 | width: auto !important; 26 | } 27 | /* 隐藏底部 */ 28 | #footer { 29 | height: 0 !important; 30 | margin: 0 !important; 31 | } 32 | /* 调整帖子内,标题文字大小 */ 33 | #thread_subject { 34 | font-size: 19px !important; 35 | } 36 | /* 调整帖子内,隐藏内容提示区域样式 */ 37 | .locked a { 38 | color: #ffffff; 39 | border: 1px dashed #ffffff; 40 | padding: 0 5px 3px; 41 | margin: 0 5px; 42 | font-size: 20px; 43 | background-color: #e24e72; 44 | } 45 | /* 调整帖子内,图片最大宽度(即一排可以放三个图片) */ 46 | #postlist .pcb img { 47 | max-width: 30%; 48 | }`; 49 | if (document.head) { 50 | document.head.appendChild(style_Add); 51 | } else { 52 | let timer = setInterval(function(){ 53 | if (document.head) { 54 | document.head.appendChild(style_Add); 55 | clearInterval(timer); 56 | } 57 | }, 1); 58 | } 59 | })(); -------------------------------------------------------------------------------- /Zhiyoo-Enhanced.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 智友邦论坛增强 3 | // @version 1.1.9 4 | // @author X.I.U 5 | // @description 自动签到、自动回复、自动无缝翻页、回到顶部(右键点击两侧空白处)、清理置顶帖子、简化附件兑换/下载、清理帖子标题〖XXX〗【XXX】文字 6 | // @icon http://bbs.zhiyoo.net/favicon.ico 7 | // @match *://bbs.zhiyoo.net/* 8 | // @match *://www.zhiyoo.net/search.php* 9 | // @grant GM_xmlhttpRequest 10 | // @grant GM_registerMenuCommand 11 | // @grant GM_unregisterMenuCommand 12 | // @grant GM_openInTab 13 | // @grant GM_getValue 14 | // @grant GM_setValue 15 | // @grant GM_notification 16 | // @license GPL-3.0 License 17 | // @run-at document-end 18 | // @namespace https://greasyfork.org/scripts/412362 19 | // @supportURL https://github.com/XIU2/UserScript 20 | // @homepageURL https://github.com/XIU2/UserScript 21 | // ==/UserScript== 22 | 23 | (function() { 24 | 'use strict'; 25 | var menu_ALL = [ 26 | ['menu_autoReply', '自动回复', '自动回复', true], 27 | ['menu_pageLoading', '自动无缝翻页', '自动无缝翻页', true], 28 | ['menu_backToTop', '回到顶部(右键点击两侧空白处)', '回到顶部', true], 29 | ['menu_cleanTopPost', '清理置顶帖子', '清理置顶帖子', true], 30 | ['menu_cleanPostTitle', '清理帖子标题开头〖〗【】文字', '清理帖子标题开头〖〗【】文字', true], 31 | ['menu_qianDaoRedirectURL', '当前页面设为签到后重定向地址', '已设置当前页面为签到后重定向地址', 'http://bbs.zhiyoo.net/forum.php?mod=forumdisplay&fid=42&filter=author&orderby=dateline'] 32 | ], menu_ID = []; 33 | for (let i=0;i menu_ALL.length){ // 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单 41 | for (let i=0;i tbody[id^="normalthread_"]', 121 | HT_insert: ['css;table#threadlisttableid', 2], 122 | replaceE: 'css;div.pg' 123 | } 124 | }, 125 | search: { 126 | SiteTypeID: 2, 127 | pager: { 128 | nextLink: '//a[@class="nxt"][@href]', 129 | pageElement: 'css;div#threadlist > ul', 130 | HT_insert: ['css;div#threadlist', 2], 131 | replaceE: 'css;div.pg' 132 | } 133 | } 134 | }; 135 | 136 | // 用于脚本内部判断当前 URL 类型 137 | let SiteType = { 138 | FORUMDISPLAY: DBSite.forumdisplay.SiteTypeID, // 各板块帖子列表 139 | SEARCH: DBSite.search.SiteTypeID // 搜索结果列表 140 | }; 141 | 142 | var attachmentHrefTime = 0; 143 | curSite.pageUrl = ""; // 下一页URL 144 | 145 | var patt_thread = /\/thread-\d+-\d+\-\d+.html/, // 匹配 /thread-XXX-X-X.html 帖子正则表达式 146 | patt_search = /\/thread-\d+-\d+\-\d+.html/, // 匹配搜索结果列表正则表达式 147 | patt_posttitle = /^〖.+〗(:)?|^【.+】(:)?/, // 匹配帖子标题中的〖XXX〗【XXX】正则表达式 148 | patt_attachment_href = /(?<=\\').+(?=\\')/ 149 | 150 | if (location.pathname === '/plugin.php'){ 151 | switch(getQueryVariable("id")) 152 | { 153 | case 'dsu_paulsign:sign': // 被重定向到签到页面 154 | qiandao(); // 自动签到 155 | break; 156 | case 'piaobo_attachment': // 兑换附件后的提示页面 157 | attachmentBack(); // 立即返回帖子 158 | break; 159 | case 'threed_attach:downld': // 附件下载页面 160 | goPan(); // 跳转至网盘页 161 | break; 162 | } 163 | }else if(location.pathname === '/forum.php'){ 164 | switch(getQueryVariable("mod")) 165 | { 166 | case 'viewthread': // 浏览帖子内容 167 | showHide(); // 先看看是否有隐藏内容,如果已显示则定位到隐藏内容区域,如果没有隐藏内容,则啥都不干 168 | autoReply(); // 自动回复(有隐藏内容才会回复),回复过就定位到底部(隐藏内容区域) 169 | var attachmentHref_Interval = setInterval(attachmentHref,100); // 兑换附件按钮改为直链(不再弹出确认提示框) 170 | break; 171 | case 'forumdisplay': // 浏览帖子列表 172 | curSite = DBSite.forumdisplay; // 帖子列表页(自动翻页) 173 | cleanTop(); // 清理置顶帖子 174 | cleanPostTitle(); // 清理帖子列表中帖子标题开头的〖XXX〗【XXX】文字 175 | pageLoading(); // 自动无缝翻页 176 | break; 177 | } 178 | backToTop(); // 回到顶部(右键点击两侧空白处) 179 | }else if(location.pathname === '/search.php'){ 180 | curSite = DBSite.search; // 搜索结果列表页(自动翻页) 181 | pageLoading(); // 自动无缝翻页 182 | }else if (patt_thread.test(location.pathname)){ // 对于 /thread-XXX-X-X.html 这种帖子页面也和上面一样 183 | showHide(); 184 | autoReply(); 185 | } 186 | 187 | 188 | // 自动签到 189 | function qiandao(){ 190 | if (loginStatus){ 191 | if(document.getElementById('yl')) 192 | { 193 | document.getElementById('yl').click(); 194 | document.querySelector('td.tr3.tac div a').click(); 195 | } 196 | setTimeout(location.href=menu_value('menu_qianDaoRedirectURL'), 2000); // 跳转到指定URL 197 | } 198 | } 199 | 200 | 201 | // 自动回复 202 | function autoReply(){ 203 | if (!menu_value('menu_autoReply')) return 204 | if (loginStatus){ 205 | // 存在隐藏内容,自动回复 206 | if (document.getElementsByClassName("showhide").length == 0){ 207 | writeReply(); 208 | // 如果使用了我的 [智友邦美化] 脚本,则定位至底部,反之定位至隐藏内容区域 209 | if (document.getElementById("fastpostmessage").offsetParent == null){ 210 | setTimeout(function(){window.scrollTo(0,99999999)}, 1000); 211 | }else{ 212 | setTimeout(function(){window.scrollTo(0,document.querySelector('.showhide').offsetTop)}, 1000); 213 | } 214 | } 215 | } 216 | } 217 | 218 | 219 | // 写入自动回复内容 220 | function writeReply(){ 221 | let textarea = document.getElementById("fastpostmessage"); 222 | if (textarea){ 223 | // 随机写入回复内容 224 | textarea.value = textarea.value + replyList[Math.floor((Math.random()*replyList.length))] + replyList[Math.floor((Math.random()*replyList.length))]; 225 | //console.log(`${textarea.value}`) 226 | let fastpostsubmit = document.getElementById("fastpostsubmit"); 227 | if (fastpostsubmit){ 228 | setTimeout(function(){fastpostsubmit.click()}, 200); 229 | } 230 | } 231 | } 232 | 233 | 234 | // 定位到隐藏内容区域 235 | function showHide(){ 236 | if (loginStatus){ 237 | // 如果已显示隐藏内容,则定位到隐藏内容区域 238 | // 如果没有发现已显示隐藏内容,就不定位了 239 | if (document.getElementsByClassName("showhide").length > 0){ 240 | // 如果使用了我的 [智友邦美化] 脚本,则定位至底部,反之定位至隐藏内容区域 241 | if (document.getElementById("fastpostmessage").offsetParent == null){ 242 | setTimeout(function(){window.scrollTo(0,99999999)}, 1000); 243 | }else{ 244 | setTimeout(function(){window.scrollTo(0,document.querySelector('.showhide').offsetTop)}, 1000); 245 | } 246 | } 247 | } 248 | } 249 | 250 | 251 | // 回到顶部(右键点击空白处) 252 | function backToTop() { 253 | if (!menu_value('menu_backToTop')) return 254 | document.getElementById("nv_forum").oncontextmenu = function(event){ 255 | if (event.target==this) { 256 | event.preventDefault(); 257 | window.scrollTo(0,0) 258 | } 259 | } 260 | } 261 | 262 | 263 | // 清理置顶帖子 264 | function cleanTop(){ 265 | if (!menu_value('menu_cleanTopPost')) return 266 | let showhide = document.querySelectorAll("a.showhide.y"); 267 | if (showhide.length > 0){ 268 | showhide.forEach(el=>el.click()); 269 | } 270 | } 271 | 272 | 273 | // 兑换附件后立即返回 274 | function attachmentBack() { 275 | let attachmentback = document.querySelector('#messagetext p.alert_btnleft a'); 276 | if (attachmentback){ 277 | attachmentback.click(); 278 | } 279 | } 280 | 281 | 282 | // 附件下载页直接跳转至网盘 283 | function goPan() { 284 | let gopan = document.querySelector('.threed_panbox .panframe .pan_left p a'); 285 | if (gopan){ 286 | location.href=gopan.href; 287 | } 288 | } 289 | 290 | 291 | // 兑换附件按钮改为直链(不再弹出确认提示框) 292 | function attachmentHref() { 293 | attachmentHrefTime += 1; // 计算该函数执行次数 294 | let attachmenthref = document.querySelector('.tab_button .button a'); 295 | if (attachmenthref && attachmenthref.href == "javascript:;"){ 296 | let attachmenthref_href = attachmenthref.onclick.toString(); 297 | attachmenthref.href = attachmenthref_href.match(patt_attachment_href)[0]; 298 | attachmenthref.onclick = null; 299 | } 300 | if (attachmentHrefTime == 50 || document.getElementsByClassName("showhide").length > 0){ // 当该函数执行超过50次(5秒),或没有隐藏内容时停止定时执行 301 | clearInterval(attachmentHref_Interval) 302 | } 303 | } 304 | 305 | 306 | // 清理帖子列表中帖子标题开头的〖XXX〗【XXX】文字 307 | function cleanPostTitle(){ 308 | if (!menu_value('menu_cleanPostTitle')) return 309 | let cleanposttitle = document.querySelectorAll("a.s.xst"); 310 | if (cleanposttitle.length > 0){ 311 | for(let num = postNum;num 0){ 323 | windowScroll(function (direction, e) { 324 | if (direction === 'down') { // 下滑才准备翻页 325 | let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; 326 | let scrollDelta = 666; 327 | if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) { 328 | ShowPager.loadMorePage(); 329 | } 330 | } 331 | }); 332 | } 333 | } 334 | 335 | 336 | // 滚动条事件 337 | function windowScroll(fn1) { 338 | var beforeScrollTop = document.documentElement.scrollTop, 339 | fn = fn1 || function () {}; 340 | setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件 341 | window.addEventListener('scroll', function (e) { 342 | var afterScrollTop = document.documentElement.scrollTop, 343 | delta = afterScrollTop - beforeScrollTop; 344 | if (delta == 0) return false; 345 | fn(delta > 0 ? 'down' : 'up', e); 346 | beforeScrollTop = afterScrollTop; 347 | }, false); 348 | }, 1000) 349 | } 350 | 351 | 352 | // 修改自 https://greasyfork.org/scripts/14178 , https://github.com/machsix/Super-preloader 353 | var ShowPager = { 354 | getFullHref: function (e) { 355 | if (e != null && e.nodeType === 1 && e.href && e.href.slice(0,4) === 'http') return e.href; 356 | return ''; 357 | }, 358 | createDocumentByString: function (e) { 359 | if (e) { 360 | if ('HTML' !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, 'application/xhtml+xml'); 361 | var t; 362 | try { t = (new DOMParser).parseFromString(e, 'text/html');} catch (e) {} 363 | if (t) return t; 364 | if (document.implementation.createHTMLDocument) { 365 | t = document.implementation.createHTMLDocument('ADocument'); 366 | } else { 367 | 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) {} 368 | } 369 | if (t) { 370 | var r = document.createRange(), 371 | n = r.createContextualFragment(e); 372 | r.selectNodeContents(document.body); 373 | t.body.appendChild(n); 374 | 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); 375 | return t; 376 | } 377 | } else console.error('没有找到要转成 DOM 的字符串'); 378 | }, 379 | loadMorePage: function () { 380 | if (curSite.pager) { 381 | let curPageEle = getElementByXpath(curSite.pager.nextLink); 382 | var url = this.getFullHref(curPageEle); 383 | //console.log(`${url} ${curSite.pageUrl}`); 384 | if(url === '') return; 385 | if(curSite.pageUrl === url) return;// 不会重复加载相同的页面 386 | curSite.pageUrl = url; 387 | // 读取下一页的数据 388 | curSite.pager.startFilter && curSite.pager.startFilter(); 389 | GM_xmlhttpRequest({ 390 | url: url, 391 | method: "GET", 392 | timeout: 5000, 393 | onload: function (response) { 394 | try { 395 | var newBody = ShowPager.createDocumentByString(response.responseText); 396 | let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody); 397 | let toElement = getAllElements(curSite.pager.HT_insert[0])[0]; 398 | if (pageElems.length >= 0) { 399 | let addTo = "beforeend"; 400 | if (curSite.pager.HT_insert[1] == 1) addTo = "beforebegin"; 401 | // 插入新页面元素 402 | pageElems.forEach(function (one) { 403 | toElement.insertAdjacentElement(addTo, one); 404 | }); 405 | // 清理帖子列表中帖子标题开头的〖XXX〗【XXX】文字 406 | cleanPostTitle(); 407 | // 替换待替换元素 408 | try { 409 | let oriE = getAllElements(curSite.pager.replaceE); 410 | let repE = getAllElements(curSite.pager.replaceE, newBody, newBody); 411 | if (oriE.length === repE.length) { 412 | for (var i = 0; i < oriE.length; i++) { 413 | oriE[i].outerHTML = repE[i].outerHTML; 414 | } 415 | } 416 | } catch (e) { 417 | console.log(e); 418 | } 419 | } 420 | } catch (e) { 421 | console.log(e); 422 | } 423 | } 424 | }); 425 | } 426 | }, 427 | }; 428 | function getElementByCSS(css, contextNode = document) { 429 | return contextNode.querySelector(css); 430 | } 431 | function getAllElementsByCSS(css, contextNode = document) { 432 | return [].slice.call(contextNode.querySelectorAll(css)); 433 | } 434 | function getElementByXpath(xpath, contextNode, doc = document) { 435 | contextNode = contextNode || doc; 436 | try { 437 | const result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 438 | // 应该总是返回一个元素节点 439 | return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue; 440 | } catch (err) { 441 | throw new Error(`Invalid xpath: ${xpath}`); 442 | } 443 | } 444 | function getAllElementsByXpath(xpath, contextNode, doc = document) { 445 | contextNode = contextNode || doc; 446 | const result = []; 447 | try { 448 | const query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 449 | for (let i = 0; i < query.snapshotLength; i++) { 450 | const node = query.snapshotItem(i); 451 | // 如果是 Element 节点 452 | if (node.nodeType === 1) result.push(node); 453 | } 454 | } catch (err) { 455 | throw new Error(`无效 Xpath: ${xpath}`); 456 | } 457 | return result; 458 | } 459 | function getAllElements(selector, contextNode = undefined, doc = document, win = window, _cplink = undefined) { 460 | if (!selector) return []; 461 | contextNode = contextNode || doc; 462 | if (typeof selector === 'string') { 463 | if (selector.search(/^css;/i) === 0) { 464 | return getAllElementsByCSS(selector.slice(4), contextNode); 465 | } else { 466 | return getAllElementsByXpath(selector, contextNode, doc); 467 | } 468 | } else { 469 | const query = selector(doc, win, _cplink); 470 | if (!Array.isArray(query)) { 471 | throw new Error('getAllElements 返回错误类型'); 472 | } else { 473 | return query; 474 | } 475 | } 476 | } 477 | 478 | 479 | // 获取GET参数 480 | function getQueryVariable(variable) { 481 | var query = window.location.search.substring(1); 482 | var vars = query.split("&"); 483 | for (var i=0;i