├── 52pojie.plugin ├── AEON.plugin ├── AppleIntelligence.list ├── AssppProFix.plugin ├── Asspp_Pro.js ├── CCBLife.plugin ├── CCBLife.sgmodule ├── ChatGPT.sgmodule ├── Cloud189_Cookie.plugin ├── Cloud189_Cookie.sgmodule ├── EasyMoney.plugin ├── Github429.plugin ├── Github429.sgmodule ├── PParking.plugin ├── QX-VVeboTimeline.js ├── Twitter.user.js ├── V2EX.user.js ├── VIF.sgmodule ├── VVebo.module ├── VVebo.plugin ├── VVebo.sgmodule ├── VVebo.snippet ├── VVebo_gitlab.module ├── VVebo_gitlab.plugin ├── VVebo_gitlab.sgmodule ├── VVebo_gitlab.snippet ├── Wanda.plugin ├── Wanda.sgmodule ├── WeChatAntiAD.plugin ├── WeChatAntiAD.sgmodule ├── WeChatDNS.plugin ├── WeChatPay.plugin ├── WeChatPay.sgmodule ├── apple-cdn.plugin ├── autohome.user.js ├── blockAD.snippet ├── cloud189_cookie.js ├── dlm.js ├── dml.plugin ├── dml.sgmodule ├── douban.plugin ├── fengniao.plugin ├── fix-vvebo-user-timeline.js ├── githubSorted.user.js ├── goofish.js ├── goofish.plugin ├── goofish.sgmodule ├── goofish.snippet ├── goofishSearch.js ├── hifini.sgmodule ├── hlbdy.plugin ├── hlbdy.sgmodule ├── hlw.plugin ├── hp-black-list.user.js ├── jdSearch.js ├── jdSearch.plugin ├── jdSearch.sgmodule ├── jparking.plugin ├── jparking.sgmodule ├── jparking_AD.plugin ├── meiyou.plugin ├── mxbc.plugin ├── mxbc.sgmodule ├── myxj_vip.js ├── myxj_vip.plugin ├── naixue.plugin ├── naixue.sgmodule ├── reddit.js ├── reddit.sgmodule ├── samsclub.sgmodule ├── suiyuran ├── fix-vvebo-fans.js └── fix-vvebo-user-timeline.js ├── taobaoWeb.user.js ├── tbSearch.js ├── tbSearch.sgmodule ├── tonghuashun.js ├── tonghuashun.plugin ├── tonghuashun.sgmodule ├── tuhu.plugin ├── tuhu.sgmodule ├── xxyx.plugin └── xxyx.sgmodule /52pojie.plugin: -------------------------------------------------------------------------------- 1 | #!name=52pojie每日签到 2 | #!desc=@Yuheng0101 52破解每日签到 3 | #!category=Androidcn 4 | #!icon=https://raw.githubusercontent.com/Yuheng0101/X/main/Assets/52pojie.png 5 | 6 | [MITM] 7 | hostname = www.52pojie.cn 8 | 9 | [Script] 10 | http-request ^https:\/\/www\.52pojie\.cn\/home\.php\? tag=吾爱破解获取Cookie, script-path=https://raw.githubusercontent.com/Yuheng0101/X/main/Tasks/52pojie.js,requires-body=0 11 | 12 | cron "0 9 * * *" script-path=https://raw.githubusercontent.com/Yuheng0101/X/main/Tasks/52pojie.js, timeout=10, tag=吾爱破解签到, img-url=https://raw.githubusercontent.com/Yuheng0101/X/main/Assets/52pojie.png 13 | 14 | -------------------------------------------------------------------------------- /AEON.plugin: -------------------------------------------------------------------------------- 1 | #!name=永旺AEON签到 2 | #!desc=永旺AEON签到 3 | #!author=@Fokit 4 | #!category=能蟹仔 5 | 6 | [MITM] 7 | hostname = api.aeonbuy.com 8 | 9 | [Script] 10 | http-response https:\/\/api\.aeonbuy\.com\/api\/access-auth-api\/auth\/third\/silentWechatMiniLogin tag=永旺 Aeon²,script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/aeon_sign.js,requires-body=1 11 | 12 | cron "20 8 * * *" script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/aeon_sign.js,tag=永旺 Aeon,enable=true 13 | -------------------------------------------------------------------------------- /AppleIntelligence.list: -------------------------------------------------------------------------------- 1 | 2 | # > Apple Intelligence 3 | DOMAIN-SUFFIX, apple-relay.apple.com 4 | DOMAIN-SUFFIX, apple-relay.cloudflare.com 5 | DOMAIN-KEYWORD, apple-relay -------------------------------------------------------------------------------- /AssppProFix.plugin: -------------------------------------------------------------------------------- 1 | #!name=Asspp_Pro修复版本号获取 2 | #!desc=修复版本号获取 3 | #!category=Androidcn 4 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1010.png 5 | 6 | [Script] 7 | http-response ^https:\/\/api\.timbrd\.com\/apple\/app-version\/index\.php\?id=\d+$ script-path=https://raw.githubusercontent.com/androidcn/userscripts/main/Asspp_Pro.js, requires-body=true, timeout=60, tag=AssppProFix 8 | 9 | [MITM] 10 | hostname = api.timbrd.com 11 | -------------------------------------------------------------------------------- /Asspp_Pro.js: -------------------------------------------------------------------------------- 1 | const url = $request.url; 2 | if(!$response.body) { 3 | $done({}); 4 | } 5 | var body = JSON.parse($response.body); 6 | // 遍历对象并将 external_identifier 转换为字符串 7 | body = body.map(item => { 8 | return { 9 | created_at: String(item.created_at), 10 | external_identifier: String(item.external_identifier), // 将 int 转换为 string 11 | bundle_version: String(item.bundle_version) 12 | }; 13 | }); 14 | body = JSON.stringify(body); 15 | console.log("已处理"); 16 | $done({ 17 | body 18 | }); 19 | -------------------------------------------------------------------------------- /CCBLife.plugin: -------------------------------------------------------------------------------- 1 | #!name=建行生活签到 2 | #!desc=建行生活@Fokit 3 | #!author=@Fokit 4 | #!category=能蟹仔 5 | 6 | [MITM] 7 | hostname = yunbusiness.ccb.com 8 | 9 | [Script] 10 | http-request ^https:\/\/yunbusiness\.ccb\.com\/(clp_coupon|clp_service)\/txCtrl\?txcode=(A3341A038|autoLogin) tag=建行数据, script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/jhsh_checkIn.js,requires-body=1 11 | 12 | cron "17 7 * * *" script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/jhsh_checkIn.js,tag = 建行生活,enable=true 13 | -------------------------------------------------------------------------------- /CCBLife.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=建行生活签到 2 | #!desc=建行生活 3 | #!author=@Fokit 4 | #!category=能蟹仔 5 | [MITM] 6 | hostname = yunbusiness.ccb.com 7 | [Script] 8 | 建行数据 = type=http-request,pattern=^https:\/\/yunbusiness\.ccb\.com\/(clp_coupon|clp_service)\/txCtrl\?txcode=(A3341A038|autoLogin),requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/jhsh_checkIn.js 9 | 10 | 建行生活 = type=cron,cronexp=17 7 * * *,timeout=60,script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/jhsh_checkIn.js,script-update-interval=0 11 | 12 | -------------------------------------------------------------------------------- /ChatGPT.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=ChatGPT Desktop 2 | #!desc=破解GPT访问限制 3 | #!author=@Androidcn 4 | #!category=能蟹仔 5 | [MITM] 6 | hostname = ab.chatgpt.com 7 | [Body Rewrite] 8 | http-response ^https://ab\.chatgpt\.com/v1/ '"gateValue":"false"' '"gateValue":"true"' '"value":false' '"value":true' 9 | -------------------------------------------------------------------------------- /Cloud189_Cookie.plugin: -------------------------------------------------------------------------------- 1 | #!name=cloud.189.cn Cookie 提取器 2 | #!desc=仅在访问 https://h5.cloud.189.cn/main.html#/my 时提取 Cookie,确保用户已登录 3 | #!author=androidcn 4 | #!version=1.0.0 5 | #!icon=https://cloud.189.cn/favicon.ico 6 | 7 | [Script] 8 | http-request ^https:\/\/api\.cloud\.189\.cn\/open\/file\/listFiles\.action script-path=https://github.com/androidcn/userscripts/raw/refs/heads/main/cloud189_cookie.js, tag=提取 cloud.189.cn Cookie, requires-body=false 9 | 10 | [MITM] 11 | hostname = h5.cloud.189.cn 12 | -------------------------------------------------------------------------------- /Cloud189_Cookie.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=cloud.189.cn Cookie 提取器 2 | #!desc=仅在访问 https://h5.cloud.189.cn/main.html#/my 时提取 Cookie,确保登录状态 3 | #!author=androidcn 4 | #!homepage=https://cloud.189.cn/ 5 | #!icon=https://cloud.189.cn/favicon.ico 6 | 7 | [Script] 8 | http-request ^https:\/\/api\.cloud\.189\.cn\/open\/user\/getUserInfo\.action script-path=https://github.com/androidcn/userscripts/raw/refs/heads/main/cloud189_cookie.js, tag=提取 cloud.189.cn Cookie, requires-body=false 9 | 10 | [MITM] 11 | hostname = h5.cloud.189.cn 12 | -------------------------------------------------------------------------------- /EasyMoney.plugin: -------------------------------------------------------------------------------- 1 | #!name = 东方财富 去广告(Loon版) 2 | #!desc = @事儿 没啥 去除开屏广告及活动背景图,需清除缓存后生效 3 | #!date = 2024-11-18 21:37 4 | 5 | [Rewrite] 6 | ^https:\/\/emdcadvertise(?:pj)?\.eastmoney\.com\/infoService\/v2 response-body-json-replace data.adpositionidlist [] 7 | ^https:\/\/swdlcdn\.eastmoney\.com\/app\/adimg\/ url reject-dict 8 | 9 | [MITM] 10 | hostname= emdcadvertise.eastmoney.com, emdcadvertisepj.eastmoney.com, swdlcdn.eastmoney.com -------------------------------------------------------------------------------- /Github429.plugin: -------------------------------------------------------------------------------- 1 | #!name=Github 429 2 | #!desc=解除 Github 429 限制 3 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1042.png 4 | 5 | 6 | [Rewrite] 7 | # 解决github速率限制返回429问题 8 | ^https:\/\/(raw|gist)\.githubusercontent\.com\/ header-replace Accept-Language en-us 9 | ^https:\/\/github\.com\/ header-replace Accept-Language en-us 10 | 11 | 12 | [MITM] 13 | hostname = raw.githubusercontent.com, gist.githubusercontent.com 14 | -------------------------------------------------------------------------------- /Github429.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=Github 429 2 | #!desc=解除 Github 429 限制 3 | 4 | 5 | [Header Rewrite] 6 | http-request (raw|gist).githubusercontent.com header-replace Accept-Language en-us 7 | 8 | [MITM] 9 | hostname = %APPEND% raw.githubusercontent.com,gist.githubusercontent.com 10 | -------------------------------------------------------------------------------- /PParking.plugin: -------------------------------------------------------------------------------- 1 | #!name=PP停车 2 | #!desc=PP停车 3 | [MITM] 4 | hostname = api.660pp.com 5 | 6 | [Script] 7 | http-request ^https:\/\/api\.660pp\.com\/rest\/[\d\.]+?\/user\/token tag=PP 停车#, script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/pp_parking.js,requires-body=0 8 | 9 | cron "17 7 * * *" script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/pp_parking.js,tag = PP 停车,enable=true 10 | -------------------------------------------------------------------------------- /QX-VVeboTimeline.js: -------------------------------------------------------------------------------- 1 | let url = $request.url; 2 | let hasUid = (url) => url.includes("uid"); 3 | let getUid = (url) => (hasUid(url) ? url.match(/uid=(\d+)/)[1] : undefined); 4 | if (url.includes("remind/unread_count")) { 5 | $prefs.setValueForKey(getUid(url), "uid"); 6 | $done({}); 7 | } else if (url.includes("statuses/user_timeline")) { 8 | let uid = getUid(url) || $prefs.valueForKey("uid"); 9 | url = url.replace("statuses/user_timeline", "profile/statuses/tab").replace("max_id", "since_id"); 10 | url = url + `&containerid=230413${uid}_-_WEIBO_SECOND_PROFILE_WEIBO`; 11 | $done({ url }); 12 | } else if (url.includes("profile/statuses/tab")) { 13 | let data = JSON.parse($response.body); 14 | let statuses = data.cards 15 | .map((card) => (card.card_group ? card.card_group : card)) 16 | .flat() 17 | .filter((card) => card.card_type === 9) 18 | .map((card) => card.mblog) 19 | .map((status) => (status.isTop ? { ...status, label: "置顶" } : status)); 20 | let sinceId = data.cardlistInfo.since_id; 21 | $done({ body: JSON.stringify({ statuses, since_id: sinceId, total_number: 100 }) }); 22 | } else { 23 | $done({}); 24 | } 25 | -------------------------------------------------------------------------------- /Twitter.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Make Twitter Great Again 3 | // @namespace https://github.com/androidcn/userscripts/ 4 | // @version 2024-12-25 5 | // @description 为Twitter增加两个按钮,快速让Twitter算法知道你“不感兴趣的推文“ From Chrome Extension "Make Twitter Great Again" not interesting this post 6 | // @author theopenprojects.io 7 | // @match https://twitter.com/home 8 | // @match https://x.com/home 9 | // @updateURL https://github.com/androidcn/userscripts/raw/main/Twitter.user.js 10 | // @downloadURL https://github.com/androidcn/userscripts/raw/main/Twitter.user.js 11 | // @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com 12 | // @grant GM_setValue 13 | // @grant GM_getValue 14 | // @license MIT 15 | // ==/UserScript== 16 | 17 | var hideButton = document.createElement('button'); 18 | function createButton() { 19 | // Create a button element 20 | hideButton.textContent = '隐藏'; 21 | hideButton.style.position = 'fixed'; 22 | hideButton.style.top = '60px'; 23 | hideButton.style.right = '20px'; 24 | hideButton.style.zIndex = '9999'; 25 | // Append the button to the body 26 | document.body.appendChild(hideButton); 27 | // Add click event listener to the button 28 | hideButton.addEventListener('click', performHidedAction); 29 | } 30 | function hideIt(){ 31 | document.querySelector("header[role='banner']").style="display:none;"; 32 | document.querySelector('div[aria-label="Home timeline"] div:first-child').style="display:none;"; 33 | //console.log('已隐藏'); 34 | hideButton.textContent = '显示'; 35 | //GM_setValue("leftSideBar_hide",true); 36 | } 37 | function showIt(){ 38 | document.querySelector("header[role='banner']").style=""; 39 | document.querySelector('div[aria-label="Home timeline"] div:first-child').style=""; 40 | //console.log('已显示'); 41 | hideButton.textContent = '隐藏'; 42 | //GM_setValue("leftSideBar_hide",false); 43 | } 44 | function performHidedAction() { 45 | var HideText = hideButton.textContent ; 46 | if (HideText == "隐藏"){ 47 | hideIt(); 48 | } 49 | else{ 50 | showIt(); 51 | } 52 | } 53 | 54 | // Wait for the page to load 55 | window.addEventListener('load', createButton); 56 | //Scroll to hide lefe bar and top bar 57 | //window.addEventListener('scroll',hideIt); 58 | 59 | const silencePath = 'path[d="M18 6.59V1.2L8.71 7H5.5C4.12 7 3 8.12 3 9.5v5C3 15.88 4.12 17 5.5 17h2.09l-2.3 2.29 1.42 1.42 15.5-15.5-1.42-1.42L18 6.59zm-8 8V8.55l6-3.75v3.79l-6 6zM5 9.5c0-.28.22-.5.5-.5H8v6H5.5c-.28 0-.5-.22-.5-.5v-5zm6.5 9.24l1.45-1.45L16 19.2V14l2 .02v8.78l-6.5-4.06z"]' 60 | const shitPath = 'path[d="M9.5 7c.828 0 1.5 1.119 1.5 2.5S10.328 12 9.5 12 8 10.881 8 9.5 8.672 7 9.5 7zm5 0c.828 0 1.5 1.119 1.5 2.5s-.672 2.5-1.5 2.5S13 10.881 13 9.5 13.672 7 14.5 7zM12 22.25C6.348 22.25 1.75 17.652 1.75 12S6.348 1.75 12 1.75 22.25 6.348 22.25 12 17.652 22.25 12 22.25zm0-18.5c-4.549 0-8.25 3.701-8.25 8.25s3.701 8.25 8.25 8.25 8.25-3.701 8.25-8.25S16.549 3.75 12 3.75zM8.947 17.322l-1.896-.638C7.101 16.534 8.322 13 12 13s4.898 3.533 4.949 3.684l-1.897.633c-.031-.09-.828-2.316-3.051-2.316s-3.021 2.227-3.053 2.322z"]' 61 | const moreProfilePath = 'path[d="M3 12c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2zm9 2c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm7 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"]' 62 | 63 | const sleep = ms => new Promise(r => setTimeout(r, ms)); 64 | 65 | const waitForElm = (selector) => { 66 | return new Promise((resolve, reject) => { 67 | const observer = new MutationObserver((mutations) => { 68 | mutations.forEach((mutation) => { 69 | const elm = mutation.target.querySelector(selector); 70 | if (elm) { 71 | observer.disconnect(); 72 | resolve(elm); 73 | } 74 | }); 75 | }); 76 | observer.observe(document.body, { 77 | childList: true, 78 | subtree: true, 79 | }); 80 | }); 81 | }; 82 | 83 | const setTabStatusToBody = () => { 84 | const body = document.querySelector('body') 85 | if (!body || !document.querySelectorAll('[role="tablist"] [role="tab"]')) return 86 | //if (document.URL !== 'https://twitter.com/home') return; 87 | 88 | if (!Array.from(document.querySelectorAll('[role="tablist"] [role="tab"][data-index]')).length > 0) Array.from(document.querySelectorAll('[role="tablist"] [role="tab"]')).map((el, idx) => el.closest('div').setAttribute('data-index', idx + 1)) 89 | 90 | const selectedIndexElm = document.querySelector('[role="tablist"] [role="tab"][aria-selected="true"]') 91 | if (selectedIndexElm) { 92 | const parent = selectedIndexElm.closest('div') 93 | if (parent) { 94 | body.setAttribute('data-make-twitter-great-again', parent.getAttribute('data-index')) 95 | } 96 | } 97 | } 98 | 99 | const createShityBtn = (tweet) => { 100 | if (!tweet || tweet.querySelector('.shitBtn')) return; 101 | //if (document.URL !== 'https://twitter.com/home') return; 102 | 103 | const button = document.createElement('button'); 104 | tweet.setAttribute('data-shit', true); 105 | button.classList.add('shitBtn'); 106 | button.innerHTML = '没兴趣'; 107 | 108 | const navAction = tweet.querySelector('div[role="group"][id*="id__"]'); 109 | if (navAction) navAction.appendChild(button); 110 | } 111 | 112 | const createSilenceBtn = tweet => { 113 | if (!tweet || tweet.querySelector('.silenceBtn')) return; 114 | // if (document.URL !== 'https://twitter.com/home') return; 115 | 116 | const button = document.createElement('button'); 117 | tweet.setAttribute('data-silence', true); 118 | button.classList.add('silenceBtn'); 119 | button.innerHTML = '封禁'; 120 | 121 | const navAction = tweet.querySelector('div[role="group"][id*="id__"]'); 122 | if (navAction) navAction.appendChild(button); 123 | } 124 | 125 | const handleBtnClick = async (e, selector) => { 126 | const tweet = e.target.closest('article'); 127 | document.querySelector('body').setAttribute('data-pop-open', true) 128 | 129 | const btnDropdown = tweet.querySelector('[aria-haspopup="menu"][role="button"][data-testid="caret"]'); 130 | if (!btnDropdown) return 131 | 132 | btnDropdown.click(); 133 | 134 | await sleep(5); 135 | const dropdown = document.querySelector('[data-testid="Dropdown"],[data-testid="sheetDialog"]'); 136 | if (!dropdown) return; 137 | 138 | const item = dropdown.querySelector(selector) 139 | if (item) item.closest('[role]').click() 140 | 141 | btnDropdown.click(); 142 | 143 | if (document.querySelector('body').getAttribute('data-make-twitter-great-again') !== "1" || document.querySelector('body').getAttribute('data-make-twitter-great-again') !== "2") tweet.remove() 144 | } 145 | 146 | const handleProfileBtnClick = async (e, selector) => { 147 | const userActions = document.querySelector('[role="main"] [data-testid="userActions"]') 148 | if (!userActions) return 149 | 150 | document.querySelector('body').setAttribute('data-pop-open', true) 151 | 152 | const path = userActions.querySelector(moreProfilePath); 153 | if (!path) return 154 | const btnDropdown = path.closest('div[dir]') 155 | if (!btnDropdown) return 156 | 157 | btnDropdown.click(); 158 | 159 | await sleep(5); 160 | const dropdown = document.querySelector('[data-testid="Dropdown"]'); 161 | if (!dropdown) return; 162 | 163 | const item = dropdown.querySelector(selector) 164 | if (item) item.closest('[role]').click() 165 | 166 | dropdown.remove() 167 | } 168 | 169 | const addBtnToTweets = () => { 170 | const tweets = document.querySelectorAll('[role="region"] article:not([data-shit]):not([data-silence])'); 171 | if (tweets && tweets.length > 0) tweets.forEach(tweet => { 172 | createShityBtn(tweet) 173 | createSilenceBtn(tweet) 174 | }); 175 | } 176 | 177 | const addProfileSilenceBtn = () => { 178 | const userActions = document.querySelector('[role="main"] [data-testid="userActions"]') 179 | if (!userActions) return 180 | 181 | const contentActions = userActions.parentElement 182 | if (!contentActions || contentActions.getAttribute('data-silence') === 'true') return 183 | 184 | const button = document.createElement('button'); 185 | contentActions.setAttribute('data-silence', true); 186 | button.classList.add('profileSilence'); 187 | button.innerHTML = '🤫'; 188 | 189 | contentActions.insertBefore(button, contentActions.firstChild); 190 | } 191 | 192 | const isProfile = () => { 193 | if (document.querySelector('head meta[content*="twitter://user?screen_name="]')) { 194 | document.querySelector('body').setAttribute('data-profile', true) 195 | 196 | addProfileSilenceBtn() 197 | } 198 | else document.querySelector('body').removeAttribute('data-profile') 199 | } 200 | 201 | const observeTweets = () => { 202 | const observer = new MutationObserver((mutations) => { 203 | setTabStatusToBody(); 204 | isProfile() 205 | if (!document.querySelector('[data-make-twitter-great-again] [role="group"] > div > [role="menu"]')) document.querySelector('body').removeAttribute('data-pop-open') 206 | mutations.forEach(() => addBtnToTweets()); 207 | }); 208 | observer.observe(document.body, { 209 | childList: true, 210 | subtree: true, 211 | }); 212 | return observer; 213 | } 214 | 215 | (async () => { 216 | await waitForElm('[role="region"] article'); 217 | 218 | setTabStatusToBody(); 219 | isProfile(); 220 | addBtnToTweets(); 221 | 222 | document.addEventListener('click', (e) => { 223 | if (e.target.classList.contains('shitBtn')) handleBtnClick(e, shitPath); 224 | if (e.target.classList.contains('silenceBtn')) handleBtnClick(e, silencePath); 225 | if (e.target.classList.contains('profileSilence')) handleProfileBtnClick(e, silencePath); 226 | }) 227 | 228 | const tweetsObserver = observeTweets(); 229 | window.addEventListener('beforeunload', () => { 230 | tweetsObserver.disconnect(); 231 | }); 232 | })(); 233 | -------------------------------------------------------------------------------- /V2EX.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name V2EX隐藏右侧栏 3 | // @namespace https://github.com/androidcn/userscripts/ 4 | // @version 2024-05-03 5 | // @description V2EX隐藏右侧栏,可设置记忆 6 | // @author @androidcn 7 | // @match https://www.v2ex.com/* 8 | // @icon https://www.google.com/s2/favicons?sz=64&domain=v2ex.com 9 | // @updateURL https://github.com/androidcn/userscripts/raw/main/V2EX.user.js 10 | // @downloadURL https://github.com/androidcn/userscripts/raw/main/V2EX.user.js 11 | // @grant GM_setValue 12 | // @grant GM_getValue 13 | 14 | // ==/UserScript== 15 | 16 | (function() { 17 | 'use strict'; 18 | 19 | function getHide(){ 20 | return GM_getValue("V2EXSideBar_isHide"); 21 | } 22 | if (getHide()){ 23 | V2EXhide("显示"); 24 | HideItNow(); 25 | }else{ 26 | V2EXhide("隐藏"); 27 | ShowItNow(); 28 | } 29 | 30 | function ToggleitNow(){ 31 | if (getHide()){ 32 | ShowItNow(); 33 | }else{ 34 | HideItNow(); 35 | } 36 | } 37 | function HideItNow(){ 38 | $("#Rightbar").hide(); 39 | GM_setValue("V2EXSideBar_isHide",true); 40 | $("#hideSideBar").text("显示"); 41 | } 42 | function ShowItNow(){ 43 | $("#Rightbar").show(); 44 | GM_setValue("V2EXSideBar_isHide",false); 45 | $("#hideSideBar").text("隐藏"); 46 | } 47 | 48 | function V2EXhide(displayText){ 49 | var hideSideBar = document.createElement("a"); 50 | hideSideBar.href = "#;"; 51 | hideSideBar.id = "hideSideBar"; 52 | hideSideBar.classList.add("top"); 53 | hideSideBar.classList.add("v2p-hover-btn"); 54 | hideSideBar.text = displayText; 55 | $(".tools").prepend(hideSideBar); 56 | $("#hideSideBar").click(()=>ToggleitNow()); 57 | } 58 | })(); 59 | -------------------------------------------------------------------------------- /VIF.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=VIF Excluded Routes 2 | #!desc=解决投屏异常 3 | #!category=能蟹仔 4 | 5 | [General] 6 | tun-excluded-routes = %INSERT% 239.255.255.250/32 -------------------------------------------------------------------------------- /VVebo.module: -------------------------------------------------------------------------------- 1 | #!name=  VVebo 小火箭专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | 5 | [Script] 6 | 7 | fix-vvebo-user-timeline = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\?, requires-body=1,script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 8 | 9 | fix-vvebo-user-timeline2 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\?, requires-body=1,script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 10 | 11 | fix-vvebo-user-timeline3 = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\?,requires-body=1, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 12 | 13 | fix-vvebo-user-timeline4 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/users\/show\?,requires-body=1, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 14 | 15 | fix-vvebo-fans = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/cardlist\?,requires-body=1, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-fans.js, requires-body=true 16 | 17 | 18 | 19 | [MITM] 20 | hostname = %INSERT% api.weibo.cn 21 | -------------------------------------------------------------------------------- /VVebo.plugin: -------------------------------------------------------------------------------- 1 | #!name=  VVebo Loon专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | #!icon = http://www.kkx.net/uploadfile/2023/0302/20230302170522851.png 5 | #!openUrl = https://apps.apple.com/app/id670910957 6 | [Script] 7 | http-request ^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\? script-path = https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js, tag = 修复时间线1 8 | http-request ^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\? script-path = https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js, tag = 修复时间线2 9 | http-response ^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\? script-path = https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js, requires-body = true, tag = 修复时间线3 10 | http-response ^https:\/\/api\.weibo\.cn\/2\/cardlist\? script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-fans.js, requires-body=true,tag = 修复「我的」页面 11 | 12 | [MITM] 13 | 14 | hostname = %APPEND% api.weibo.cn 15 | -------------------------------------------------------------------------------- /VVebo.sgmodule: -------------------------------------------------------------------------------- 1 | #!name= VVebo 2 | #!desc=修复 VVebo 用户主页时间线显示和粉丝列表 3 | #!author=suiyuran 4 | #!category=能蟹仔 5 | 6 | [Script] 7 | 8 | fix-vvebo-user-timeline = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\?, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 9 | 10 | fix-vvebo-user-timeline2 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\?, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js 11 | 12 | fix-vvebo-user-timeline3 = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\?, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-user-timeline.js, requires-body=true 13 | 14 | fix-vvebo-fans = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/cardlist\?, script-path=https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-fans.js, requires-body=true 15 | 16 | [MITM] 17 | 18 | hostname = %APPEND% api.weibo.cn 19 | -------------------------------------------------------------------------------- /VVebo.snippet: -------------------------------------------------------------------------------- 1 | #!name=  VVebo QuantumultX专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | 5 | [mitm] 6 | hostname = api.weibo.cn 7 | [rewrite_local] 8 | 9 | ^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\? url script-request-header https://github.com/androidcn/userscripts/raw/main/QX-VVeboTimeline.js 10 | ^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\? url script-request-header https://github.com/androidcn/userscripts/raw/main/QX-VVeboTimeline.js 11 | ^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\? url script-response-body https://github.com/androidcn/userscripts/raw/main/QX-VVeboTimeline.js 12 | ^https:\/\/api\.weibo\.cn\/2\/cardlist\? url script-response-body https://raw.githubusercontent.com/suiyuran/stash/main/scripts/fix-vvebo-fans.js 13 | -------------------------------------------------------------------------------- /VVebo_gitlab.module: -------------------------------------------------------------------------------- 1 | #!name=  VVebo 小火箭专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | 5 | [Script] 6 | 7 | fix-vvebo-user-timeline = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\?, requires-body=1,script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 8 | 9 | fix-vvebo-user-timeline2 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\?, requires-body=1,script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 10 | 11 | fix-vvebo-user-timeline3 = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\?,requires-body=1, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 12 | 13 | fix-vvebo-user-timeline4 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/users\/show\?,requires-body=1, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 14 | 15 | fix-vvebo-fans = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/cardlist\?,requires-body=1, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/ix-vvebo-fans.js, requires-body=true 16 | 17 | 18 | 19 | [MITM] 20 | hostname = %INSERT% api.weibo.cn 21 | -------------------------------------------------------------------------------- /VVebo_gitlab.plugin: -------------------------------------------------------------------------------- 1 | #!name=  VVebo Loon专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | 5 | [Script] 6 | http-request ^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\? script-path = https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js, tag = 修复时间线1 7 | http-request ^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\? script-path = https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js, tag = 修复时间线2 8 | http-response ^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\? script-path = https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js, requires-body = true, tag = 修复时间线3 9 | http-response ^https:\/\/api\.weibo\.cn\/2\/cardlist\? script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-fans.js, requires-body=true,tag = 修复「我的」页面 10 | 11 | [MITM] 12 | 13 | hostname = %APPEND% api.weibo.cn 14 | -------------------------------------------------------------------------------- /VVebo_gitlab.sgmodule: -------------------------------------------------------------------------------- 1 | #!name= VVebo 2 | #!desc=修复 VVebo 用户主页时间线显示和粉丝列表 3 | #!author=suiyuran 4 | #!category=能蟹仔 5 | 6 | [Script] 7 | 8 | fix-vvebo-user-timeline = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\?, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 9 | 10 | fix-vvebo-user-timeline2 = type=http-request, pattern=^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\?, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js 11 | 12 | fix-vvebo-user-timeline3 = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\?, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-user-timeline.js, requires-body=true 13 | 14 | fix-vvebo-fans = type=http-response, pattern=^https:\/\/api\.weibo\.cn\/2\/cardlist\?, script-path=https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-fans.js, requires-body=true 15 | 16 | [MITM] 17 | 18 | hostname = %APPEND% api.weibo.cn 19 | -------------------------------------------------------------------------------- /VVebo_gitlab.snippet: -------------------------------------------------------------------------------- 1 | #!name=  VVebo QuantumultX专用 2 | #!desc=修复VVebo用户主页时间线显示和粉丝列表 @androidcn适配 3 | #!author=suiyuran 4 | 5 | [mitm] 6 | hostname = api.weibo.cn 7 | [rewrite_local] 8 | 9 | ^https:\/\/api\.weibo\.cn\/2\/remind\/unread_count\? url script-request-header https://gitlab.com/androidcn/userscripts/-/raw/main/QX-VVeboTimeline.js 10 | ^https:\/\/api\.weibo\.cn\/2\/statuses\/user_timeline\? url script-request-header https://gitlab.com/androidcn/userscripts/-/raw/main/QX-VVeboTimeline.js 11 | ^https:\/\/api\.weibo\.cn\/2\/profile\/statuses\/tab\? url script-response-body https://gitlab.com/androidcn/userscripts/-/raw/main/QX-VVeboTimeline.js 12 | ^https:\/\/api\.weibo\.cn\/2\/cardlist\? url script-response-body https://gitlab.com/androidcn/userscripts/-/raw/main/suiyuran/fix-vvebo-fans.js 13 | -------------------------------------------------------------------------------- /Wanda.plugin: -------------------------------------------------------------------------------- 1 | #!name= 万达智慧商业 2 | #!desc= 万达智慧商业 3 | #!author=@leiyiyan 4 | [MITM] 5 | hostname = www.wandawic.com 6 | 7 | [Script] 8 | http-response ^https?:\/\/www\.wandawic\.com\/api\/foreground\/loginregister\/queryUser tag=万达智慧商业²,script-path=https://raw.githubusercontent.com/leiyiyan/resource/main/script/wdzhsy/wdzhsy.js,requires-body=1 9 | 10 | cron "30 9 * * *" script-path=https://raw.githubusercontent.com/leiyiyan/resource/main/script/wdzhsy/wdzhsy.js,tag=万达智慧商业,enable=true -------------------------------------------------------------------------------- /Wanda.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=万达智慧商业 2 | #!desc=万达签到 3 | #!author=@leiyiyan 4 | #!category=能蟹仔 5 | [MITM] 6 | hostname = %APPEND% www.wandawic.com 7 | 8 | [Script] 9 | 万达智慧商业² = type=http-response,pattern=^https?:\/\/www\.wandawic\.com\/api\/foreground\/loginregister\/queryUser,requires-body=1,max-size=0,binary-body-mode=0,timeout=30,script-path=https://raw.githubusercontent.com/leiyiyan/resource/main/script/wdzhsy/wdzhsy.js,script-update-interval=0 10 | 11 | 万达智慧商业 = type=cron,cronexp=30 9 * * *,timeout=60,script-path=https://raw.githubusercontent.com/leiyiyan/resource/main/script/wdzhsy/wdzhsy.js,script-update-interval=0 12 | -------------------------------------------------------------------------------- /WeChatAntiAD.plugin: -------------------------------------------------------------------------------- 1 | #!name=WeChat公众号屏蔽小程序广告 2 | #!desc=WeChat公众号屏蔽小程序广告,不影响获得奖励 3 | #!author=@Lentin 4 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1053.png 5 | #!tag=能蟹仔 6 | 7 | [Rule] 8 | DOMAIN,wxa.wxs.qq.com,REJECT 9 | DOMAIN,wximg.wxs.qq.com,REJECT 10 | DOMAIN,wxsmw.wxs.qq.com,REJECT 11 | 12 | [MITM] 13 | hostname = wxa.wxs.qq.com, wximg.wxs.qq.com, wxsmw.wxs.qq.com 14 | -------------------------------------------------------------------------------- /WeChatAntiAD.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=WeChat公众号屏蔽小程序广告 2 | #!desc=WeChat公众号屏蔽小程序广告,不影响获得奖励 3 | #!author=@Lentin 4 | #!category=能蟹仔 5 | [Rule] 6 | DOMAIN,wxa.wxs.qq.com,REJECT 7 | DOMAIN,wximg.wxs.qq.com,REJECT 8 | DOMAIN,wxsmw.wxs.qq.com,REJECT 9 | 10 | [MITM] 11 | hostname = %APPEND% wxa.wxs.qq.com,wximg.wxs.qq.com,wxsmw.wxs.qq.com 12 | -------------------------------------------------------------------------------- /WeChatDNS.plugin: -------------------------------------------------------------------------------- 1 | #!name= 腾讯专用DNS 2 | #!desc= 微信DNS,QQ,腾讯 3 | #!author=Androidcn 4 | 5 | [Host] 6 | *.qq.com = server:119.28.28.28 7 | *.exmail.qq.com = server:119.29.29.29 8 | *.weixin.qq.com = server:119.29.29.29 9 | *.weixin.qq.com.cn = server:119.29.29.29 10 | *.weixin.com.cn = server:119.29.29.29 11 | *.tencent.com = server:119.29.29.29 12 | *.weixin.com = server:119.29.29.29 13 | -------------------------------------------------------------------------------- /WeChatPay.plugin: -------------------------------------------------------------------------------- 1 | #!name=微付金币 2 | #!desc=微付金币 3 | [MITM] 4 | hostname = payapp.weixin.qq.com 5 | 6 | [Script] 7 | http-response https:\/\/payapp\.weixin\.qq\.com\/coupon-center-user\/home\/login tag=微付金币², script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/wechat_pay_coupon.js,requires-body=1 8 | 9 | cron "30 9 * * 0" script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/wechat_pay_coupon.js,tag = 微付金币,enable=true 10 | -------------------------------------------------------------------------------- /WeChatPay.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=微付金币 2 | #!desc=微付金币 3 | #!author=@Fokit 4 | #!category=能蟹仔 5 | [MITM] 6 | hostname = payapp.weixin.qq.com 7 | 8 | [Script] 9 | 微付金币² = type=http-response, pattern=https:\/\/payapp\.weixin\.qq\.com\/coupon-center-user\/home\/login, requires-body=1, max-size=0, script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/wechat_pay_coupon.js 10 | 11 | 微付金币 = type=cron,cronexp=30 9 * * 0, timeout=60, script-path=https://raw.githubusercontent.com/FoKit/Scripts/main/scripts/wechat_pay_coupon.js, script-update-interval=0 12 | 13 | -------------------------------------------------------------------------------- /apple-cdn.plugin: -------------------------------------------------------------------------------- 1 | #!name=Apple CDN-深圳电信 2 | #!desc=解决App Store下载巨慢 3 | #!category=能蟹仔 4 | 5 | [Host] 6 | iosapps.itunes.apple.com = iosapps.itunes.apple.com.download.ks-cdn.com 7 | -------------------------------------------------------------------------------- /autohome.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 汽车之家净化 3 | // @namespace http://tampermonkey.net/ 4 | // @version 1.6.8 5 | // @description AllCleanAutoHome 6 | // @author androidcn 7 | // @license GPL-3.0 License 8 | // @match *://club.autohome.com.cn/bbs/* 9 | // @match *://club.m.autohome.com.cn/bbs/* 10 | // @match *://www.autohome.com.cn/* 11 | // @icon https://www.google.com/s2/favicons?sz=64&domain=autohome.com.cn 12 | // @grant none 13 | // @namespace https://greasyfork.org/scripts/442256 14 | // @updateURL https://raw.githubusercontent.com/androidcn/userscripts/main/autohome.user.js 15 | // @downloadURL https://raw.githubusercontent.com/androidcn/userscripts/main/autohome.user.js 16 | 17 | // @require http://code.jquery.com/jquery-latest.js 18 | 19 | // ==/UserScript== 20 | 21 | (function() { 22 | var $ = window.$; 23 | 'use strict'; 24 | var KEYWORDS = ['车衣', 25 | 'XPEL', 26 | '膜', 27 | '优惠', 28 | '出一台', 29 | '联系我', 30 | '一手', 31 | '求购', 32 | '出手', 33 | '实表', 34 | '收', 35 | '成新', 36 | '自用', 37 | '转让', 38 | '租', 39 | '转单', 40 | '批发', 41 | '自驾游', 42 | '傻', 43 | '卖', 44 | '喜欢', 45 | '相聚', 46 | '乌克兰', 47 | '精品', 48 | '版主', 49 | '留情', 50 | '组团', 51 | '车商', 52 | '出', 53 | '年卡', 54 | '转', 55 | '转让',]; 56 | 57 | //$(document).ready(function(){$.each(KEYWORDS,function(i,val){$('li:contains("'+val+'")').hide();});}); 58 | $(window).load(function(){ 59 | $.each(KEYWORDS,function(i,val){ 60 | $.each($('li>div>p.post-title>a:contains("'+val+'")'),function(index, value) { 61 | $(this).parent().parent().parent().hide() 62 | }) 63 | $.each($('div.athm-card-album43__caption:contains("'+val+'")'),function(index, value) { 64 | $(this).parent().parent().parent().hide() 65 | }) 66 | //$('li:contains("'+val+'")').hide(); 67 | }); 68 | $('#js-related-cars').hide() 69 | $('#js-related-topics').hide() 70 | $('section.fn-container.bbs-recommend').hide() 71 | $('#js-related-questions').hide() 72 | $('#js-float-video-container').hide() 73 | $('#js-sticky-aside').hide() 74 | $('#js-usedcar-container').hide() 75 | $('.bbs-guide-recomm').hide() 76 | $('.entry-pill').hide() 77 | 78 | //MobileAutohome 79 | //移动推荐阅读 80 | $(".recommend").hide() 81 | //移动相关车系 82 | $("section.generalize-series").hide() 83 | //隐藏移动版打开APP 84 | $("#skip-app").hide() 85 | //隐藏新VR广告 86 | $('#auto-brand-vr').hide() 87 | //论坛广告 88 | $('.union-ad-placeholder').hide() 89 | //主页APP下载 90 | $(".activity-app-layer").hide() 91 | //论坛APP广告推荐二维码 92 | $('.diversion-fixed-wrap').hide() 93 | //进一步精简 94 | $('.bbs-title-more').hide() 95 | $('.athm-footer').hide() 96 | $('.bbs-aside').hide() 97 | $('.athm-bbs-title-more').hide() 98 | //隐藏论坛首发帖子 99 | $(".pop-first-reply").hide() 100 | 101 | }); 102 | $(window).on('scroll', 103 | function() { 104 | $.each(KEYWORDS,function(i,val){ 105 | $.each($('li>div>p.post-title>a:contains("'+val+'")'),function(index, value) { 106 | $(this).parent().parent().parent().hide() 107 | }) 108 | //$('li:contains("'+val+'")').hide(); 109 | $.each($('div.athm-card-album43__caption:contains("'+val+'")'),function(index, value) { 110 | $(this).parent().parent().parent().hide() 111 | }) 112 | }); 113 | $('#js-sticky-aside').hide() 114 | }); 115 | })(); 116 | -------------------------------------------------------------------------------- /blockAD.snippet: -------------------------------------------------------------------------------- 1 | #同花顺 2 | ^https?:\/\/adm\.10jqka\.com\.cn\/interface\/ad\/recommend url reject 3 | #汽车之家 4 | hostname = *autohome* 5 | ^https?:\/\/adproxy\.autohome\.com\.cn\/AdvertiseService\/ url reject-img 6 | ^https?:\/\/app2\.autoimg\.cn\/apppdfs\/ url reject-img 7 | #zhibo8 8 | hostname =a.qiumibao.com 9 | ^https?:\/\/a\.qiumibao\.com\/activities\/config\.php$ url reject 10 | ^https?:\/\/a\.qiumibao\.com\/ios\/config\/\?version_code= url reject 11 | 12 | # > zhongguoyidong中国移动 13 | ^https?:\/\/client\.app\.coc\.10086\.cn\/biz-orange\/DN\/init\/startInit url reject 14 | ^https?:\/\/client\.app\.coc\.10086\.cn\/biz-orange\/DN\/explorePage\/getAdverList url reject 15 | 16 | # > TianTianJiJin天天基金 17 | ^https?:\/\/appactive\.1234567\.com\.cn\/AppoperationApi\/OperationService\/GetAppStartImg url reject 18 | 19 | #IMDB 20 | hostname = www.imdb.com, api.imdbws.com; 21 | ^https?:\/\/api\.imdbws\.com\/ads\/ url reject 22 | ^https?:\/\/www\.imdb\.com\.ads url reject 23 | 24 | #掌上生活 25 | ^https?:\/\/mlife\.cmbchina\.com\/ClientFaceService\/api\/mlife\.clientface\.clientservice\.api\.advertiseService\/preCacheAdvertiseSec url reject 26 | 27 | #中国银行 28 | ^https?:\/\/mbs\.boc\.cn\/ubas-mgateway-static\/images\/advertType\/.+.jpg url reject-img 29 | hostname = mbs.boc.cn 30 | 31 | -------------------------------------------------------------------------------- /cloud189_cookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview 提取 cloud.189.cn 登录后的 Cookie 3 | * @supported Surge & Loon 4 | * @version 1.1 5 | */ 6 | 7 | let cookie = $request.headers['Cookie'] || $request.headers['cookie']; 8 | 9 | if (cookie) { 10 | const saved = $persistentStore.write(cookie, "cloud189_cookie"); 11 | 12 | if ($httpAPI) { 13 | // Surge:写入剪贴板 14 | $httpAPI("POST", "/v1/device/clipboard", { text: cookie }, (resp) => { 15 | if (saved) { 16 | $notification.post("cloud.189.cn 登录成功", "", "Cookie 已保存并复制到剪贴板"); 17 | } else { 18 | $notification.post("Cookie 保存失败", "", "写入本地失败"); 19 | } 20 | }); 21 | } else { 22 | // Loon:通知 + 手动复制 23 | if (saved) { 24 | $notification.post("cloud.189.cn 登录成功", "", "Cookie 已保存,请手动复制:\n" + cookie); 25 | } else { 26 | $notification.post("Cookie 保存失败", "", "写入本地失败"); 27 | } 28 | } 29 | } else { 30 | $notification.post("Cookie 获取失败", "", "请求未包含 Cookie 头"); 31 | } 32 | 33 | $done({}); 34 | -------------------------------------------------------------------------------- /dlm.js: -------------------------------------------------------------------------------- 1 | /************************************** 2 | @Name:达乐美披萨 优惠券抽奖 3 | @Author:Sliverkiss 4 | @Date:2023-10-18 08:43:44 5 | 6 | 2024.01.25 7 | - 更新活动接口,修复抽奖提示不匹配的问题 8 | 9 | 10 | 脚本兼容:Surge、QuantumultX、Loon、Shadowrocket、Node.js 11 | 只测试过loon和青龙,其它环境请自行尝试 12 | 13 | 使用方法: 14 | 青龙: 15 | 1.登录后抓包 https://game.dominos.com.cn/loong/game/gameDone接口的body,填写到dlm_data,多账号用 @ 分割 16 | 2.可选推送:将bark的key填写到bark_key,不填默认使用青龙自带的推送 17 | 18 | Surge、QuantumultX、Loon、Shadowrocket: 19 | 1.将获取Cookie脚本保存到本地 20 | 2.打开达乐美披萨公众号->优惠|咨询->有奖游戏->手动完成一次游戏,若提示获取Cookie成功则可以使用该脚本 21 | 3.关闭获取ck脚本,避免产生不必要的mitm。 22 | 23 | [Script] 24 | cron "30 10 * * *" script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js,timeout=300, tag=达乐美披萨 25 | http-request ^https:\/\/game\.dominos\.com\.cn\/loong\/game\/gameDone script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js,requires-body=true, timeout=10, tag=达乐美披萨获取token 26 | [MITM] 27 | hostname =game.dominos.com.cn 28 | 29 | ==================================== 30 | ⚠️【免责声明】 31 | ------------------------------------------ 32 | 1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。 33 | 2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。 34 | 3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。 35 | 4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。 36 | 5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。 37 | 6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。 38 | 7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。 39 | ******************************************/ 40 | 41 | // env.js 全局 42 | const $ = new Env("🍕达乐美披萨"); 43 | const ckName = "dlm_data"; 44 | $.host="loong";//活动名称 45 | $.gameDate="2024.01.22-2024.02.29"; 46 | //-------------------- 一般不动变量区域 ------------------------------------- 47 | const SakuraUtils = creatUtils(); 48 | const Notify = 1;//0为关闭通知,1为打开通知,默认为1 49 | const notify = $.isNode() ? require('./sendNotify') : ''; 50 | let envSplitor = ["@"]; //多账号分隔符 51 | let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || ''; 52 | let userList = []; 53 | let userIdx = 0; 54 | let userCount = 0; 55 | // 为通知准备的空数组 56 | $.notifyMsg = []; 57 | //bark推送 58 | $.barkKey = ($.isNode() ? process.env["bark_key"] : $.getdata("bark_key")) || ''; 59 | //---------------------- 自定义变量区域 ----------------------------------- 60 | const giftName = { 61 | "001": '一等奖 免费海参鲍鱼大虾手拍披萨券', 62 | "002": '二等奖 半价海参鲍鱼大虾手拍披萨券', 63 | "003": '三等奖 免费滋牟牟考牛肉券', 64 | "004": '四等奖 免费任意口味一对烤翅券', 65 | "005": "五等奖 免费招牌蛋挞券", 66 | } 67 | //脚本入口函数main() 68 | async function main() { 69 | console.log('\n================== 任务 ==================\n'); 70 | let taskall = []; 71 | for (let user of userList) { 72 | if (user.ckStatus) { 73 | //ck未过期,开始执行任务 74 | // DoubleLog(`🔷账号${user.index} >> Start work`) 75 | console.log(`随机延迟${user.getRandomTime()}ms`); 76 | taskall.push(await user.todoList()); 77 | await $.wait(user.getRandomTime()); 78 | } else { 79 | //将ck过期消息存入消息数组 80 | $.notifyMsg.push(`❌账号${user.index} >> Check ck error!`) 81 | } 82 | } 83 | await Promise.all(taskall); 84 | } 85 | 86 | class UserInfo { 87 | constructor(str) { 88 | this.index = ++userIdx; 89 | this.ckInfo = str.split("&"); 90 | this.openid = this.ckInfo[0];; 91 | this.body = str; 92 | this.ckStatus = true; 93 | this.drawStatus = true; 94 | this.sharingStatus = true; 95 | this.headers = { 96 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.42(0x18002a2c) NetType/WIFI Language/zh_CN", 97 | "Content-Type": "application/x-www-form-urlencoded" 98 | }; 99 | } 100 | getRandomTime() { 101 | return randomInt(1000, 3000) 102 | } 103 | 104 | //抽奖函数 105 | async gameDone() { 106 | try { 107 | const options = { 108 | //签到任务调用签到接口 109 | url: `https://game.dominos.com.cn/${$.host}/game/gameDone`, 110 | //请求头, 所有接口通用 111 | headers: this.headers, 112 | body: this.body 113 | }; 114 | //post方法 115 | let result = await httpRequest(options); 116 | console.log(result) 117 | if (result?.statusCode == 0) { 118 | //obj.error是0代表完成 119 | console.log(`✅抽奖成功!获得${result?.content?.name},剩余分享次数:${result?.extra?.sharingNum},当前奖券总数:${result?.extra?.doneNum}`); 120 | } else { 121 | console.log(`❌${result?.errorMessage}`) 122 | this.drawStatus = false; 123 | } 124 | } catch (e) { 125 | console.log(e); 126 | } 127 | } 128 | //分享函数 129 | async sharingDone() { 130 | try { 131 | const options = { 132 | //签到任务调用签到接口 133 | url: `https://game.dominos.com.cn/${$.host}/game/sharingDone`, 134 | //请求头, 所有接口通用 135 | headers: this.headers, 136 | body: `${this.openid}&from=1&target=0` 137 | }; 138 | //post方法 139 | let result = await httpRequest(options); 140 | console.log(result) 141 | if (result?.statusCode == 0) { 142 | //obj.error是0代表完成 143 | console.log(`✅分享成功,抽奖次数+${result?.content?.gameNum}`); 144 | } else { 145 | console.log(`❌${result?.errorMessage}`) 146 | this.sharingStatus = false; 147 | } 148 | } catch (e) { 149 | console.log(e); 150 | } 151 | } 152 | //任务列表 153 | async todoList() { 154 | //执行分享,将抽奖次数最大化 155 | do{ 156 | await this.sharingDone(); 157 | await $.wait(this.getRandomTime()); 158 | }while(this.sharingStatus); 159 | //循环抽奖,直到使用全部次数 160 | do{ 161 | await this.gameDone(); 162 | await $.wait(this.getRandomTime()); 163 | }while(this.drawStatus); 164 | //最后打印奖品信息 165 | await this.point(); 166 | } 167 | //查询用户信息 168 | async point() { 169 | try { 170 | const options = { 171 | //签到任务调用签到接口 172 | url: `https://game.dominos.com.cn/${$.host}/game/myPrize?${this.openid}&pageSize=1000&pageNum=1`, 173 | //请求头, 所有接口通用 174 | headers: this.headers, 175 | }; 176 | //post方法 177 | let result = await httpRequest(options); 178 | if (result?.statusCode == 0) { 179 | //obj.error是0代表完成 180 | let total = getTotal(result?.content); 181 | DoubleLog(`账号[${SakuraUtils.phone_num(result?.extra)}] 奖品:`) 182 | for (let item of total) { 183 | DoubleLog(`${giftName[item.name]}x${item.value}`) 184 | } 185 | } else { 186 | console.log(`❌${result?.errorMessage}`) 187 | //console.log(result); 188 | } 189 | } catch (e) { 190 | console.log(e); 191 | } 192 | } 193 | } 194 | //获取Cookie 195 | async function getCookie() { 196 | if ($request && $request.method != 'OPTIONS') { 197 | const tokenValue = $request.body; 198 | if (tokenValue) { 199 | $.setdata(tokenValue, ckName); 200 | $.msg($.name, "", `获取签到Cookie成功🎉\n${tokenValue}`); 201 | } else { 202 | $.msg($.name, "", "错误获取签到Cookie失败"); 203 | } 204 | } 205 | } 206 | 207 | 208 | //主程序执行入口 209 | !(async () => { 210 | //没有设置变量,执行Cookie获取 211 | if (typeof $request != "undefined") { 212 | await getCookie(); 213 | return; 214 | } 215 | //未检测到ck,退出 216 | if (!(await checkEnv())) { throw new Error(`❌未检测到ck,请添加环境变量`) }; 217 | if (userList.length > 0) { 218 | await main(); 219 | } 220 | if ($.barkKey) { //如果已填写Bark Key 221 | await BarkNotify($, $.barkKey, $.name, $.notifyMsg.join('\n')); //推送Bark通知 222 | }; 223 | })() 224 | .catch((e) => $.notifyMsg.push(e.message || e))//捕获登录函数等抛出的异常, 并把原因添加到全局变量(通知) 225 | .finally(async () => { 226 | await SendMsg($.notifyMsg.join('\n'))//带上总结推送通知 227 | $.done(); //调用Surge、QX内部特有的函数, 用于退出脚本执行 228 | }); 229 | 230 | /** --------------------------------辅助函数区域------------------------------------------- */ 231 | 232 | // 双平台log输出 233 | function DoubleLog(data) { 234 | if ($.isNode()) { 235 | if (data) { 236 | console.log(`${data}`); 237 | $.notifyMsg.push(`${data}`); 238 | } 239 | } else { 240 | console.log(`${data}`); 241 | $.notifyMsg.push(`${data}`); 242 | } 243 | } 244 | 245 | //统计奖品数量 246 | function getTotal(data) { 247 | let dataContainer = {}; //存分组的 248 | data.map((item) => { 249 | //对数据进行遍历 250 | dataContainer[item.id] = dataContainer[item.id] || []; 251 | dataContainer[item.id].push(item); 252 | }); 253 | // console.log(dataContainer); 254 | let total = []; 255 | let dataName = Object.keys(dataContainer); 256 | dataName.map((nameItem) => { 257 | let count = 0; 258 | dataContainer[nameItem].map((item) => { 259 | count++; 260 | }); 261 | total.push({ name: nameItem, value: count }); 262 | }); 263 | return total; 264 | } 265 | 266 | //检查变量 267 | async function checkEnv() { 268 | if (userCookie) { 269 | // console.log(userCookie); 270 | let e = envSplitor[0]; 271 | for (let o of envSplitor) 272 | if (userCookie.indexOf(o) > -1) { 273 | e = o; 274 | break; 275 | } 276 | for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n)); 277 | userCount = userList.length; 278 | } else { 279 | console.log("未找到CK"); 280 | return; 281 | } 282 | return console.log(`共找到${userCount}个账号`), true;//true == !0 283 | } 284 | 285 | /** 286 | * 随机整数生成 287 | */ 288 | function randomInt(min, max) { 289 | return Math.round(Math.random() * (max - min) + min); 290 | } 291 | // 发送消息 292 | async function SendMsg(message) { 293 | if (!message) return; 294 | if (Notify > 0) { 295 | if ($.isNode()) { 296 | await notify.sendNotify($.name, message) 297 | } else { 298 | $.msg($.name, `活动时间:${$.gameDate}`,message) 299 | } 300 | } else { 301 | console.log(message) 302 | } 303 | } 304 | 305 | /** ---------------------------------固定不动区域----------------------------------------- */ 306 | // prettier-ignore 307 | //Sakura工具包 308 | function creatUtils(){return new(class{MD5_Encrypt(a){function b(a,b){return(a<>>(32-b));}function c(a,b){var c,d,e,f,g;return((e=2147483648&a),(f=2147483648&b),(c=1073741824&a),(d=1073741824&b),(g=(1073741823&a)+(1073741823&b)),c&d?2147483648^g^e^f:c|d?1073741824&g?3221225472^g^e^f:1073741824^g^e^f:g^e^f);}function d(a,b,c){return(a&b)|(~a&c);}function e(a,b,c){return(a&c)|(b&~c);}function f(a,b,c){return a^b^c;}function g(a,b,c){return b^(a|~c);}function h(a,e,f,g,h,i,j){return(a=c(a,c(c(d(e,f,g),h),j))),c(b(a,i),e);}function i(a,d,f,g,h,i,j){return(a=c(a,c(c(e(d,f,g),h),j))),c(b(a,i),d);}function j(a,d,e,g,h,i,j){return(a=c(a,c(c(f(d,e,g),h),j))),c(b(a,i),d);}function k(a,d,e,f,h,i,j){return(a=c(a,c(c(g(d,e,f),h),j))),c(b(a,i),d);}function l(a){for(var b,c=a.length,d=c+8,e=(d-(d%64))/64,f=16*(e+1),g=new Array(f-1),h=0,i=0;c>i;)(b=(i-(i%4))/4),(h=(i%4)*8),(g[b]=g[b]|(a.charCodeAt(i)<>>29),g);}function m(a){var b,c,d="",e="";for(c=0;3>=c;c++)(b=(a>>>(8*c))&255),(e="0"+b.toString(16)),(d+=e.substr(e.length-2,2));return d;}function n(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;cd?(b+=String.fromCharCode(d)):d>127&&2048>d?((b+=String.fromCharCode((d>>6)|192)),(b+=String.fromCharCode((63&d)|128))):((b+=String.fromCharCode((d>>12)|224)),(b+=String.fromCharCode(((d>>6)&63)|128)),(b+=String.fromCharCode((63&d)|128)));}return b;}var o,p,q,r,s,t,u,v,w,x=[],y=7,z=12,A=17,B=22,C=5,D=9,E=14,F=20,G=4,H=11,I=16,J=23,K=6,L=10,M=15,N=21;for(a=n(a),x=l(a),t=1732584193,u=4023233417,v=2562383102,w=271733878,o=0;o>>6<<4)+16,s=new Uint8Array(l<<2);s.set(new Uint8Array(data.buffer)),s=new Uint32Array(s.buffer);for(t=new DataView(s.buffer),i=0;i>2]|=0x80<<(24-(data.length&3)*8);s[l-1]=data.length<<3;var w=[],f=[function(){return m[1]&m[2]|~m[1]&m[3];},function(){return m[1]^m[2]^m[3];},function(){return m[1]&m[2]|m[1]&m[3]|m[2]&m[3];},function(){return m[1]^m[2]^m[3];}],rol=function(n,c){return n<>>(32-c);},k=[1518500249,1859775393,-1894007588,-899497514],m=[1732584193,-271733879,null,null,-1009589776];m[2]=~m[0],m[3]=~m[1];for(i=0;i>6&0x1F),0x80+(c&0x3F));else{if((x=c^0xD800)>>10==0) 314 | c=(x<<10)+(s.charCodeAt(++i)^0xDC00)+0x10000,r.push(0xF0+(c>>18&0x7),0x80+(c>>12&0x3F));else r.push(0xE0+(c>>12&0xF));r.push(0x80+(c>>6&0x3F),0x80+(c&0x3F));};return r;} 315 | randomMac(){return"XX:XX:XX:XX:XX:XX".replace(/X/g,function(){return"0123456789ABCDEF".charAt(Math.floor(Math.random()*16))});} 316 | guid(){function S4(){return(((1+Math.random())*0x10000)|0).toString(16).substring(1);} 317 | return(S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());} 318 | phone_num(phone_num){if(phone_num.length==11){let data=phone_num.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2");return data;}else{return phone_num;}} 319 | randomszdx(e){e=e||32;var t="QWERTYUIOPASDFGHJKLZXCVBNM1234567890",a=t.length,n="";for(i=0;i { $[method](options, (err, resp, data) => { try { if (err) { console.log(`${method}请求失败`); $.logErr(err) } else { if (data) { typeof JSON.parse(data) == 'object' ? data = JSON.parse(data) : data = data; resolve(data) } else { console.log(`请求api返回数据为空,请检查自身原因`) } } } catch (e) { $.logErr(e, resp) } finally { resolve() } }) }) } 340 | //Bark APP notify 341 | async function BarkNotify(c, k, t, b) { for (let i = 0; i < 3; i++) { console.log(`🔷Bark notify >> Start push (${i + 1})`); const s = await new Promise((n) => { c.post({ url: 'https://api.day.app/push', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: t, body: b, device_key: k, ext_params: { group: t } }) }, (e, r, d) => r && r.status == 200 ? n(1) : n(d || e)) }); if (s === 1) { console.log('✅Push success!'); break } else { console.log(`❌Push failed! >> ${s.message || s}`) } } }; 342 | //From chavyleung's Env.js 343 | function Env(t, e) { class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, a) => { s.call(this, t, (t, s, r) => { t ? a(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.encoding = "utf-8", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`) } getEnv() { return "undefined" != typeof $environment && $environment["surge-version"] ? "Surge" : "undefined" != typeof $environment && $environment["stash-version"] ? "Stash" : "undefined" != typeof module && module.exports ? "Node.js" : "undefined" != typeof $task ? "Quantumult X" : "undefined" != typeof $loon ? "Loon" : "undefined" != typeof $rocket ? "Shadowrocket" : void 0 } isNode() { return "Node.js" === this.getEnv() } isQuanX() { return "Quantumult X" === this.getEnv() } isSurge() { return "Surge" === this.getEnv() } isLoon() { return "Loon" === this.getEnv() } isShadowrocket() { return "Shadowrocket" === this.getEnv() } isStash() { return "Stash" === this.getEnv() } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const a = this.getdata(t); if (a) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, a) => e(a)) }) } runScript(t, e) { return new Promise(s => { let a = this.getdata("@chavy_boxjs_userCfgs.httpapi"); a = a ? a.replace(/\n/g, "").trim() : a; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [i, o] = a.split("@"), n = { url: `http://${o}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": i, Accept: "*/*" }, timeout: r }; this.post(n, (t, e, a) => s(a)) }).catch(t => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), a = !s && this.fs.existsSync(e); if (!s && !a) return {}; { const a = s ? t : e; try { return JSON.parse(this.fs.readFileSync(a)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), a = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : a ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const a = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of a) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, a) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[a + 1]) >> 0 == +e[a + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } getdata(t) { let e = this.getval(t); if (/^@/.test(t)) { const [, s, a] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : ""; if (r) try { const t = JSON.parse(r); e = t ? this.lodash_get(t, a, "") : e } catch (t) { e = "" } } return e } setdata(t, e) { let s = !1; if (/^@/.test(e)) { const [, a, r] = /^@(.*?)\.(.*?)$/.exec(e), i = this.getval(a), o = a ? "null" === i ? null : i || "{}" : "{}"; try { const e = JSON.parse(o); this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), a) } catch (e) { const i = {}; this.lodash_set(i, r, t), s = this.setval(JSON.stringify(i), a) } } else s = this.setval(t, e); return s } getval(t) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.read(t); case "Quantumult X": return $prefs.valueForKey(t); case "Node.js": return this.data = this.loaddata(), this.data[t]; default: return this.data && this.data[t] || null } } setval(t, e) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.write(t, e); case "Quantumult X": return $prefs.setValueForKey(t, e); case "Node.js": return this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0; default: return this.data && this.data[e] || null } } initGotEnv(t) { this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { switch (t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"], delete t.headers["content-type"], delete t.headers["content-length"]), t.params && (t.url += "?" + this.queryStr(t.params)), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, a) => { !t && s && (s.body = a, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), e(t, s, a) }); break; case "Quantumult X": this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: a, headers: r, body: i, bodyBytes: o } = t; e(null, { status: s, statusCode: a, headers: r, body: i, bodyBytes: o }, i, o) }, t => e(t && t.error || "UndefinedError")); break; case "Node.js": let s = require("iconv-lite"); this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: a, statusCode: r, headers: i, rawBody: o } = t, n = s.decode(o, this.encoding); e(null, { status: a, statusCode: r, headers: i, rawBody: o, body: n }, n) }, t => { const { message: a, response: r } = t; e(a, r, r && s.decode(r.rawBody, this.encoding)) }) } } post(t, e = (() => { })) { const s = t.method ? t.method.toLocaleLowerCase() : "post"; switch (t.body && t.headers && !t.headers["Content-Type"] && !t.headers["content-type"] && (t.headers["content-type"] = "application/x-www-form-urlencoded"), t.headers && (delete t.headers["Content-Length"], delete t.headers["content-length"]), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient[s](t, (t, s, a) => { !t && s && (s.body = a, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), e(t, s, a) }); break; case "Quantumult X": t.method = s, this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: a, headers: r, body: i, bodyBytes: o } = t; e(null, { status: s, statusCode: a, headers: r, body: i, bodyBytes: o }, i, o) }, t => e(t && t.error || "UndefinedError")); break; case "Node.js": let a = require("iconv-lite"); this.initGotEnv(t); const { url: r, ...i } = t; this.got[s](r, i).then(t => { const { statusCode: s, statusCode: r, headers: i, rawBody: o } = t, n = a.decode(o, this.encoding); e(null, { status: s, statusCode: r, headers: i, rawBody: o, body: n }, n) }, t => { const { message: s, response: r } = t; e(s, r, r && a.decode(r.rawBody, this.encoding)) }) } } time(t, e = null) { const s = e ? new Date(e) : new Date; let a = { "M+": s.getMonth() + 1, "d+": s.getDate(), "H+": s.getHours(), "m+": s.getMinutes(), "s+": s.getSeconds(), "q+": Math.floor((s.getMonth() + 3) / 3), S: s.getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in a) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? a[e] : ("00" + a[e]).substr(("" + a[e]).length))); return t } queryStr(t) { let e = ""; for (const s in t) { let a = t[s]; null != a && "" !== a && ("object" == typeof a && (a = JSON.stringify(a)), e += `${s}=${a}&`) } return e = e.substring(0, e.length - 1), e } msg(e = t, s = "", a = "", r) { const i = t => { switch (typeof t) { case void 0: return t; case "string": switch (this.getEnv()) { case "Surge": case "Stash": default: return { url: t }; case "Loon": case "Shadowrocket": return t; case "Quantumult X": return { "open-url": t }; case "Node.js": return }case "object": switch (this.getEnv()) { case "Surge": case "Stash": case "Shadowrocket": default: { let e = t.url || t.openUrl || t["open-url"]; return { url: e } } case "Loon": { let e = t.openUrl || t.url || t["open-url"], s = t.mediaUrl || t["media-url"]; return { openUrl: e, mediaUrl: s } } case "Quantumult X": { let e = t["open-url"] || t.url || t.openUrl, s = t["media-url"] || t.mediaUrl, a = t["update-pasteboard"] || t.updatePasteboard; return { "open-url": e, "media-url": s, "update-pasteboard": a } } case "Node.js": return }default: return } }; if (!this.isMute) switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: $notification.post(e, s, a, i(r)); break; case "Quantumult X": $notify(e, s, a, i(r)); break; case "Node.js": }if (!this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), a && t.push(a), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: this.log("", `❗️${this.name}, 错误!`, t); break; case "Node.js": this.log("", `❗️${this.name}, 错误!`, t.stack) } } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; switch (this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: $done(t); break; case "Node.js": process.exit(1) } } }(t, e) } -------------------------------------------------------------------------------- /dml.plugin: -------------------------------------------------------------------------------- 1 | #!name=达美乐匹萨 2 | #!desc=达美乐@Sliverkiss 3 | #!category=能蟹仔 4 | #!arguments=interval:"30 10 * * *" 5 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1013.png 6 | 7 | [Script] 8 | cron "30 10 * * *" script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js, timeout=300, tag=达乐美披萨 9 | 10 | http-request ^https:\/\/game\.dominos\.com\.cn\/.+\/game\/gameDone script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js, requires-body=true, timeout=10, tag=达美乐披萨获取token 11 | 12 | [MITM] 13 | hostname = game.dominos.com.cn 14 | -------------------------------------------------------------------------------- /dml.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=达美乐匹萨 2 | #!desc=达美乐@Sliverkiss 3 | #!category=能蟹仔 4 | #!arguments=interval:"30 10 * * *" 5 | [Script] 6 | 达乐美披萨 = type=cron, cronexp={{{interval}}}, script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js, timeout=300 7 | 达美乐披萨获取token = type=http-request, pattern=^https:\/\/game\.dominos\.com\.cn\/.+\/game\/gameDone, script-path=https://gist.githubusercontent.com/Sliverkiss/6b4da0d367d13790a9fd1d928c82bdf8/raw/dlm.js, requires-body=true, timeout=10 8 | 9 | 10 | [MITM] 11 | hostname =game.dominos.com.cn 12 | -------------------------------------------------------------------------------- /douban.plugin: -------------------------------------------------------------------------------- 1 | #!name=豆瓣 2 | #!desc=豆瓣电影网页插件@Neurogram 3 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1021.png 4 | 5 | [Argument] 6 | api_key = input,"",tag=TMDB-API,desc=TMDB削刮API 7 | region = select,"US","HK","CN",tag=地区,desc=选择地区 8 | 9 | [Script] 10 | http-response https:\/\/m(ovie)*\.douban\.com\/(movie\/)*subject\/.+ script-path=https://github.com/androidcn/Surge/raw/refs/heads/patch-1/Douban.js, requires-body=true, timeout=30, tag=Douban,argument=[{api_key},{region}] 11 | 12 | [MITM] 13 | hostname = m.douban.com, movie.douban.com 14 | -------------------------------------------------------------------------------- /fengniao.plugin: -------------------------------------------------------------------------------- 1 | #!name=补充风鸟去广告 2 | #!desc=补充风鸟去广告 3 | #!author=@能蟹仔 4 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1053.png 5 | #!tag=能蟹仔 6 | [Rule] 7 | DOMAIN-SUFFIX,wwads.cn,REJECT-DICT 8 | -------------------------------------------------------------------------------- /fix-vvebo-user-timeline.js: -------------------------------------------------------------------------------- 1 | let url = $request.url; 2 | let hasUid = (url) => url.includes("uid"); 3 | let getUid = (url) => (hasUid(url) ? url.match(/uid=(\d+)/)[1] : undefined); 4 | if (url.includes("users/show")) { 5 | $persistentStore.write(getUid(url), "uid"); 6 | $done({}); 7 | } else if (url.includes("statuses/user_timeline")) { 8 | let uid = getUid(url) || $persistentStore.read("uid"); 9 | url = url.replace("statuses/user_timeline", "profile/statuses/tab").replace("max_id", "since_id"); 10 | url = url + `&containerid=230413${uid}_-_WEIBO_SECOND_PROFILE_WEIBO`; 11 | $done({ url }); 12 | } else if (url.includes("profile/statuses/tab")) { 13 | let data = JSON.parse($response.body); 14 | let statuses = data.cards 15 | .map((card) => (card.card_group ? card.card_group : card)) 16 | .flat() 17 | .filter((card) => card.card_type === 9) 18 | .map((card) => card.mblog); 19 | let sinceId = data.cardlistInfo.since_id; 20 | $done({ body: JSON.stringify({ statuses, since_id: sinceId, total_number: 100 }) }); 21 | } else { 22 | $done({}); 23 | } 24 | -------------------------------------------------------------------------------- /githubSorted.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Github按文件更新日期排序 3 | // @namespace https://github.com/androidcn/ 4 | // @version 1.1 5 | // @description Github按文件更新日期排序... 6 | // @author @Androidcn 7 | // @match https://github.com/* 8 | // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com 9 | // @grant none 10 | // @updateURL https://github.com/androidcn/userscripts/raw/main/githubSorted.user.js 11 | // @downloadURL https://github.com/androidcn/userscripts/raw/main/githubSorted.user.js 12 | 13 | // ==/UserScript== 14 | (function() { 15 | 'use strict'; 16 | 17 | function createButton() { 18 | // Create a button element 19 | const button = document.createElement('button'); 20 | button.textContent = '排序'; 21 | button.style.position = 'fixed'; 22 | button.style.top = '60px'; 23 | button.style.right = '20px'; 24 | button.style.zIndex = '9999'; 25 | 26 | // Append the button to the body 27 | document.body.appendChild(button); 28 | 29 | // Add click event listener to the button 30 | button.addEventListener('click', performSortedAction); 31 | } 32 | 33 | function performSortedAction() { 34 | 35 | var files = document.querySelector('[aria-labelledby="folders-and-files"] tbody'); 36 | var children = [...files.children]; 37 | files.replaceChildren( 38 | children[0],...[...files.querySelectorAll('.react-directory-row')].sort((a, b) => new Date(a.querySelector('relative-time').datetime) < new Date(b.querySelector('relative-time').datetime) ? 1 : -1),children.at(-1), 39 | ); 40 | console.log('已按文件更新日期排序'); 41 | } 42 | 43 | // Wait for the page to load 44 | window.addEventListener('load', createButton); 45 | })(); 46 | -------------------------------------------------------------------------------- /goofish.js: -------------------------------------------------------------------------------- 1 | var body = JSON.parse($response.body); 2 | var allSections = body.data.sections; 3 | allSections = allSections.filter((item) => { 4 | return item.data.bizType == "item"; 5 | }) 6 | body.data.sections = allSections; 7 | body.data.feedsCount = allSections.length; 8 | body = JSON.stringify(body); 9 | console.log("已删除咸鱼广告"); 10 | $done({ 11 | body 12 | }); 13 | -------------------------------------------------------------------------------- /goofish.plugin: -------------------------------------------------------------------------------- 1 | #!name=闲鱼广告说再见 2 | #!desc=去除咸鱼首页与搜索页广告 3 | #!category=Androidcn 4 | #!icon=https://github.com/Toperlock/Quantumult/raw/main/icon/Doraemon/Doraemon-1063.png 5 | 6 | [Script] 7 | http-response ^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlehome\.home\.nextfresh\/ script-path=https://raw.githubusercontent.com/androidcn/userscripts/main/goofish.js, requires-body=true, timeout=60, tag=goofish 8 | 9 | http-response ^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlemtopsearch\.search\/ script-path=https://raw.githubusercontent.com/androidcn/userscripts/main/goofishSearch.js, requires-body=true, timeout=60, tag=goofishSearch 10 | 11 | [MITM] 12 | hostname = g-acs.m.goofish.com 13 | -------------------------------------------------------------------------------- /goofish.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=咸鱼广告再见 2 | #!desc=去除咸鱼首页与搜索页广告 3 | #!category=能蟹仔 4 | [Script] 5 | goofish = type=http-response, pattern=^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlehome\.home\.nextfresh\/, requires-body=true, max-size=3145728, script-path=https://raw.githubusercontent.com/androidcn/userscripts/main/goofish.js, timeout=60, script-update-interval=0 6 | goofishSearch = type=http-response, pattern=^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlemtopsearch\.search\/, requires-body=true, max-size=3145728, script-path=https://raw.githubusercontent.com/androidcn/userscripts/main/goofishSearch.js, timeout=60, script-update-interval=0 7 | 8 | [MITM] 9 | hostname = %APPEND% g-acs.m.goofish.com 10 | -------------------------------------------------------------------------------- /goofish.snippet: -------------------------------------------------------------------------------- 1 | hostname = g-acs.m.goofish.com 2 | //首页广告 3 | ^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlehome\.home\.nextfresh\/ url script-response-body https://raw.githubusercontent.com/androidcn/userscripts/main/goofish.js 4 | //搜索广告 5 | ^https:\/\/g-acs\.m\.goofish\.com\/gw\/mtop\.taobao\.idlemtopsearch\.search\/ url script-response-body https://raw.githubusercontent.com/androidcn/userscripts/main/goofishSearch.js 6 | -------------------------------------------------------------------------------- /goofishSearch.js: -------------------------------------------------------------------------------- 1 | var body = JSON.parse($response.body); 2 | var allSections = body.data.resultList; 3 | allSections = allSections.filter((item) => { 4 | return item.data.item.main.clickParam.args.item_type == "goods"; 5 | }) 6 | body.data.resultList = allSections; 7 | //body.data.feedsCount = allSections.length; 8 | body = JSON.stringify(body); 9 | console.log("已删除咸鱼搜索广告"); 10 | $done({ 11 | body 12 | }); 13 | -------------------------------------------------------------------------------- /hifini.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=HiFini签到 2 | #!desc=HiFini签到@lowking 3 | #!category=能蟹仔 4 | 5 | [Script] 6 | # > hifini签到 7 | hifini签到cookie = type=http-request,pattern=https:\/\/www.hifini.com\/my.htm,script-path=https://raw.githubusercontent.com/lowking/Scripts/master/hifini/hifiniSign.js 8 | hifini签到 = type=cron,cronexp="0 10 0 * * ?",wake-system=1,script-path=https://raw.githubusercontent.com/lowking/Scripts/master/hifini/hifiniSign.js 9 | 10 | [MITM] 11 | hostname = %APPEND% *.hifini.com 12 | -------------------------------------------------------------------------------- /hlbdy.plugin: -------------------------------------------------------------------------------- 1 | #!name= 黑料不打烊 2 | #!desc= 黑料不打烊 3 | #!author=@Yuheng0101 4 | #!category=能蟹仔 5 | 6 | [Script] 7 | cron "0 9,15 * * *" script-path=https://raw.githubusercontent.com/Yuheng0101/X/main/Tasks/hlbdy.js, timeout=60, tag=黑料不打烊, img-url=https://raw.githubusercontent.com/Toperlock/Quantumult/main/icon/heiliao.png 8 | -------------------------------------------------------------------------------- /hlbdy.sgmodule: -------------------------------------------------------------------------------- 1 | #!name= 黑料不打烊 2 | #!desc= 黑料不打烊 3 | #!author=@Yuheng0101 4 | #!category=能蟹仔 5 | [Script] 6 | 黑料不打烊 = type=cron,cronexp=0 9,15 * * *,wake-system=1,script-path=https://raw.githubusercontent.com/Yuheng0101/X/main/Tasks/hlbdy.js,timeout=60 7 | -------------------------------------------------------------------------------- /hlw.plugin: -------------------------------------------------------------------------------- 1 | #!name = 黑料网去广告 2 | #!desc = 去除部分广告,优先使用海外永久入口,其次使用国内入口(会变动),走代理 3 | #!openUrl = https://155.fun/ 4 | #!author = fishdown 5 | #!tag = 去广告 6 | #!homepage = https://155.fun/ 7 | #!icon = https://lneuk.rslsilne.cc/static/pc/icons/icon_512x512.qscd.png 8 | #!date = 2024-11-20 9 | 10 | [Rewrite] 11 | # 其他页面随机去广告 12 | ^https?:\/\/[^\/]+\/category\/6\.html$ response-body-replace-regex