diff --git a/52pojie-DailyBonus/52pojie.js b/52pojie-DailyBonus/52pojie.js new file mode 100644 index 0000000000..c7e169b703 --- /dev/null +++ b/52pojie-DailyBonus/52pojie.js @@ -0,0 +1,133 @@ +/* +吾爱破解签到脚本 + +更新时间: 2022.6.18 +脚本兼容: QuantumultX, Surge, Loon, Node.js +电报频道: @NobyDa +问题反馈: @NobyDa_bot + +************************ +QX, Surge, Loon说明: +************************ +手动登录 https://www.52pojie.cn/home.php 如通知成功获取cookie, 则可以使用此签到脚本. +获取Cookie后, 请将Cookie脚本禁用并移除主机名, 以免产生不必要的MITM. +脚本将在每天上午9点执行, 您可以修改执行时间. + +************************ +Node.js说明: +************************ +需自行安装"got"与"iconv-lite"模块. 例: npm install got iconv-lite -g + +抓取Cookie说明: +浏览器打开 https://www.52pojie.cn/home.php 登录账号后, 开启抓包软件并刷新页面. +抓取该URL请求头下的Cookie字段, 填入以下CookieWA的单引号内即可. */ + +const CookieWA = ''; + +//Bark APP 通知推送Key +const barkKey = ''; + +/*********************** +Surge 4.2.0+ 脚本配置: +************************ + +[Script] +吾爱签到 = type=cron,cronexp=0 9 * * *,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +吾爱获取Cookie = type=http-request,pattern=https:\/\/www\.52pojie\.cn\/home\.php\?,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +[MITM] +hostname= www.52pojie.cn + +************************ +QuantumultX 远程脚本配置: +************************ + +[task_local] +# 吾爱签到 +0 9 * * * https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +[rewrite_local] +# 获取Cookie +https:\/\/www\.52pojie\.cn\/home\.php\? url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +[mitm] +hostname= www.52pojie.cn + +************************ +Loon 2.1.0+ 脚本配置: +************************ + +[Script] +# 吾爱签到 +cron "0 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +# 获取Cookie +http-request https:\/\/www\.52pojie\.cn\/home\.php\? script-path=https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js + +[Mitm] +hostname= www.52pojie.cn +*/ + +const $ = API('nobyda_52pojie'); +const date = new Date(); +const reqData = { + url: 'https://www.52pojie.cn/home.php?mod=task&do=apply&id=2', + headers: { + Cookie: CookieWA || $.read("COOKIE"), + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0", + } +}; +if ($.env.isRequest) { + GetCookie() +} else if (!reqData.headers.Cookie) { + $.notify('吾爱破解', ``, `未填写/未获取Cookie!`); +} else if (!reqData.headers.Cookie.includes('_auth=')) { + $.notify('吾爱破解', ``, `Cookie关键授权字段缺失, 需重新获取!`); +} else { + $.http.put(reqData) + .then((resp) => { + if (resp.body.match(/(ÒÑÍê³É|\u606d\u559c\u60a8|��̳΢�š��ᰮ�ƽ�)/)) { + $.msgBody = date.getMonth() + 1 + "月" + date.getDate() + "日, 签到成功 🎉" + } else if (resp.body.match(/(ÄúÒÑ|\u4e0b\u671f\u518d\u6765|>��Ǹ������)/)) { + $.msgBody = date.getMonth() + 1 + "月" + date.getDate() + "日, 已签过 ⚠️" + } else if (resp.body.match(/(ÏȵǼ|\u9700\u8981\u5148\u767b\u5f55|�Ҫ�ȵ�¼���ܼ�)/)) { + $.msgBody = "签到失败, Cookie失效 ‼️‼️" + } else if (resp.statusCode == 403) { + $.msgBody = "服务器暂停签到 ⚠️" + } else { + $.msgBody = "脚本待更新 ‼️‼️" + } + }) + .catch((err) => ($.msgBody = `签到失败 ‼️‼️\n${err || err.message}`)) + .finally(async () => { + if (barkKey) { + await BarkNotify($, barkKey, '吾爱破解', $.msgBody); + } + $.notify('吾爱破解', ``, $.msgBody); + $.done(); + }) +} + +function GetCookie() { + const TM = $.read("TIME"); + const CK = $request.headers['Cookie'] || $request.headers['cookie']; + if (CK && CK.includes('_auth=')) { + $.write(CK, "COOKIE"); + if (!TM || TM && (Date.now() - TM) / 1000 >= 21600) { + $.notify("吾爱破解", "", `写入Cookie成功 🎉`); + $.write(JSON.stringify(Date.now()), "TIME"); + } else { + $.info(`吾爱破解\n写入Cookie成功 🎉`) + } + } else { + $.info(`吾爱破解\n写入Cookie失败, 关键值缺失`) + } + $.done() +} + +//Bark APP notify +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}`) } } }; + +//https://github.com/Peng-YM/QuanX/tree/master/Tools/OpenAPI +function ENV() { const e = "function" == typeof require && "undefined" != typeof $jsbox; return { isQX: "undefined" != typeof $task, isLoon: "undefined" != typeof $loon, isSurge: "undefined" != typeof $httpClient && "undefined" == typeof $loon, isBrowser: "undefined" != typeof document, isNode: "function" == typeof require && !e, isJSBox: e, isRequest: "undefined" != typeof $request, isScriptable: "undefined" != typeof importModule } } function HTTP(e = { baseURL: "" }) { function t(t, a) { a = "string" == typeof a ? { url: a } : a; const h = e.baseURL; h && !d.test(a.url || "") && (a.url = h ? h + a.url : a.url), a.body && a.headers && !a.headers["Content-Type"] && (a.headers["Content-Type"] = "application/x-www-form-urlencoded"), a = { ...e, ...a }; const c = a.timeout, l = { onRequest: () => { }, onResponse: e => e, onTimeout: () => { }, ...a.events }; let f, y; if (l.onRequest(t, a), s) f = $task.fetch({ method: t, ...a }); else if (o || n) f = new Promise((e, s) => { $httpClient[t.toLowerCase()](a, (t, o, n) => { t ? s(t) : e({ statusCode: o.status || o.statusCode, headers: o.headers, body: n }) }) }); else if (r) { const e = require("got"), s = require("iconv-lite"); f = new Promise((o, n) => { e[t.toLowerCase()](a).then(e => o({ statusCode: e.statusCode, headers: e.headers, body: s.decode(e.rawBody, "utf-8") })).catch(n) }) } else if (i) { const e = new Request(a.url); e.method = t, e.headers = a.headers, e.body = a.body, f = new Promise((t, s) => { e.loadString().then(s => { t({ statusCode: e.response.statusCode, headers: e.response.headers, body: s }) }).catch(e => s(e)) }) } else u && (f = new Promise((e, s) => { fetch(a.url, { method: t, headers: a.headers, body: a.body }).then(e => e.json()).then(t => e({ statusCode: t.status, headers: t.headers, body: t.data })).catch(s) })); const p = c ? new Promise((e, s) => { y = setTimeout(() => (l.onTimeout(), s(`${t} URL: ${a.url} exceeds the timeout ${c} ms`)), c) }) : null; return (p ? Promise.race([p, f]).then(e => (clearTimeout(y), e)) : f).then(e => l.onResponse(e)) } const { isQX: s, isLoon: o, isSurge: n, isScriptable: i, isNode: r, isBrowser: u } = ENV(), a = ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"], d = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/, h = {}; return a.forEach(e => h[e.toLowerCase()] = (s => t(e, s))), h } function API(e = "untitled", t = !1) { const { isQX: s, isLoon: o, isSurge: n, isNode: i, isJSBox: r, isScriptable: u } = ENV(); return new class { constructor(e, t) { this.name = e, this.debug = t, this.http = HTTP(), this.env = ENV(), this.node = (() => { if (i) { const e = require("fs"); return { fs: e } } return null })(), this.initCache(); const s = (e, t) => new Promise(function (s) { setTimeout(s.bind(null, t), e) }); Promise.prototype.delay = function (e) { return this.then(function (t) { return s(e, t) }) } } initCache() { if (s && (this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}")), (o || n) && (this.cache = JSON.parse($persistentStore.read(this.name) || "{}")), i) { let e = "root.json"; this.node.fs.existsSync(e) || this.node.fs.writeFileSync(e, JSON.stringify({}), { flag: "wx" }, e => console.log(e)), this.root = {}, e = `${this.name}.json`, this.node.fs.existsSync(e) ? this.cache = JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)) : (this.node.fs.writeFileSync(e, JSON.stringify({}), { flag: "wx" }, e => console.log(e)), this.cache = {}) } } persistCache() { const e = JSON.stringify(this.cache, null, 2); s && $prefs.setValueForKey(e, this.name), (o || n) && $persistentStore.write(e, this.name), i && (this.node.fs.writeFileSync(`${this.name}.json`, e, { flag: "w" }, e => console.log(e)), this.node.fs.writeFileSync("root.json", JSON.stringify(this.root, null, 2), { flag: "w" }, e => console.log(e))) } write(e, t) { if (this.log(`SET ${t}`), -1 !== t.indexOf("#")) { if (t = t.substr(1), n || o) return $persistentStore.write(e, t); if (s) return $prefs.setValueForKey(e, t); i && (this.root[t] = e) } else this.cache[t] = e; this.persistCache() } read(e) { return this.log(`READ ${e}`), -1 === e.indexOf("#") ? this.cache[e] : (e = e.substr(1), n || o ? $persistentStore.read(e) : s ? $prefs.valueForKey(e) : i ? this.root[e] : void 0) } delete(e) { if (this.log(`DELETE ${e}`), -1 !== e.indexOf("#")) { if (e = e.substr(1), n || o) return $persistentStore.write(null, e); if (s) return $prefs.removeValueForKey(e); i && delete this.root[e] } else delete this.cache[e]; this.persistCache() } notify(e, t = "", a = "", d = {}) { const h = d["open-url"], c = d["media-url"]; if (s && $notify(e, t, a, d), n && $notification.post(e, t, a + `${c ? "\n多媒体:" + c : ""}`, { url: h }), o) { let s = {}; h && (s.openUrl = h), c && (s.mediaUrl = c), "{}" === JSON.stringify(s) ? $notification.post(e, t, a) : $notification.post(e, t, a, s) } if (i || u) { const s = a + (h ? `\n点击跳转: ${h}` : "") + (c ? `\n多媒体: ${c}` : ""); if (r) { const o = require("push"); o.schedule({ title: e, body: (t ? t + "\n" : "") + s }) } else console.log(`${e}\n${t}\n${s}\n\n`) } } log(e) { this.debug && console.log(`[${this.name}] LOG: ${this.stringify(e)}`) } info(e) { console.log(`[${this.name}] INFO: ${this.stringify(e)}`) } error(e) { console.log(`[${this.name}] ERROR: ${this.stringify(e)}`) } wait(e) { return new Promise(t => setTimeout(t, e)) } done(e = {}) { s || o || n ? $done(e) : i && !r && "undefined" != typeof $context && ($context.headers = e.headers, $context.statusCode = e.statusCode, $context.body = e.body) } stringify(e) { if ("string" == typeof e || e instanceof String) return e; try { return JSON.stringify(e, null, 2) } catch (e) { return "[object Object]" } } }(e, t) } \ No newline at end of file diff --git a/BDTieBa-DailyBonus/TieBa.js b/BDTieBa-DailyBonus/TieBa.js new file mode 100644 index 0000000000..104b018db5 --- /dev/null +++ b/BDTieBa-DailyBonus/TieBa.js @@ -0,0 +1,315 @@ +/********************************* +百度贴吧签到脚本 + +脚本原作者: @sazs34 +平台兼容: QuantumultX, Surge, Loon +更新日期: 2024/06/01 + +获取Cookie说明: +打开百度贴吧App后(AppStore中国区, 非内部版),点击"我的", 如通知成功获取cookie则可以使用该脚本. + +********************************* +Surge(iOS 5.9.0+/macOS 5.5.0+)模块: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/TieBaDailyBonus.sgmodule + +********************************* +QuantumultX 任务仓库(Gallery)订阅: +https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +工具&分析->HTTP请求->右上角添加任务仓库->选择百度贴吧签到脚本添加定时任务和附加组件 + +********************************* +Loon 脚本订阅(非插件): +https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_Daily_bonus.plugin + +添加后请按需启用脚本 + +*********************************/ + + +var $nobyda = nobyda(); +var cookieVal = $nobyda.read("CookieTB"); +var useParallel = 0; //0自动切换,1串行,2并行(当贴吧数量大于30个以后,并行可能会导致QX崩溃,所以您可以自动切换) +var singleNotifyCount = 20; //想签到几个汇总到一个通知里,这里就填几个(比如我有13个要签到的,这里填了5,就会分三次消息通知过去) +var process = { + total: 0, + result: [ + // { + // bar:'', + // level:0, + // exp:0, + // errorCode:0, + // errorMsg:'' + // } + ] +}; +var url_fetch_sign = { + url: "https://tieba.baidu.com/mo/q/newmoindex", + headers: { + "Content-Type": "application/octet-stream", + Referer: "https://tieba.baidu.com/index/tbwise/forum", + Cookie: cookieVal, + "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A366" + } +}; +var url_fetch_add = { + url: "https://tieba.baidu.com/sign/add", + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Cookie: cookieVal, + "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/14B100 UCBrowser/10.7.5.650 Mobile" + }, + body: "" +}; +if ($nobyda.isRequest) { + GetCookie() +} else { + signTieBa() +} + + +function signTieBa() { + useParallel = $nobyda.read("BDTB_DailyBonus_Mode") || useParallel + singleNotifyCount = $nobyda.read("BDTB_DailyBonus_notify") || singleNotifyCount + if (!cookieVal) { + $nobyda.notify("贴吧签到", "签到失败", "未获取到cookie"); + return $nobyda.done() + } + $nobyda.get(url_fetch_sign, function(error, response, data) { + if (error) { + $nobyda.notify("贴吧签到", "签到失败", "未获取到签到列表"); + $nobyda.done() + } else { + // $nobyda.notify("贴吧签到", "贴吧列表", response.body); + var body = JSON.parse(data); + var isSuccessResponse = body && body.no == 0 && body.error == "success" && body.data.tbs; + if (!isSuccessResponse) { + $nobyda.notify("贴吧签到", "签到失败", (body && body.error) ? body.error : "接口数据获取失败"); + return $nobyda.done() + } + process.total = body.data.like_forum.length; + if (body.data.like_forum && body.data.like_forum.length > 0) { + if (useParallel == 1 || (useParallel == 0 && body.data.like_forum.length >= 30)) { + signBars(body.data.like_forum, body.data.tbs, 0); + } else { + for (const bar of body.data.like_forum) { + signBar(bar, body.data.tbs); + } + } + } else { + $nobyda.notify("贴吧签到", "签到失败", "请确认您有关注的贴吧"); + return $nobyda.done() + } + } + }) +} + +function signBar(bar, tbs) { + if (bar.is_sign == 1) { //已签到的,直接不请求接口了 + process.result.push({ + bar: `${bar.forum_name}`, + level: bar.user_level, + exp: bar.user_exp, + errorCode: 9999, + errorMsg: "已签到" + }); + checkIsAllProcessed(); + } else { + url_fetch_add.body = `tbs=${tbs}&kw=${bar.forum_name}&ie=utf-8`; + $nobyda.post(url_fetch_add, function(error, response, data) { + if (error) { + process.result.push({ + bar: bar.forum_name, + errorCode: 999, + errorMsg: '接口错误' + }); + checkIsAllProcessed(); + } else { + try { + var addResult = JSON.parse(data); + if (addResult.no == 0) { + process.result.push({ + bar: bar.forum_name, + errorCode: 0, + errorMsg: `获得${addResult.data.uinfo.cont_sign_num}积分,第${addResult.data.uinfo.user_sign_rank}个签到` + }); + } else { + process.result.push({ + bar: bar.forum_name, + errorCode: addResult.no, + errorMsg: addResult.error + }); + } + } catch (e) { + $nobyda.notify("贴吧签到", "贴吧签到数据处理异常", JSON.stringify(e)); + $nobyda.done() + } + checkIsAllProcessed(); + } + }) + } +} + +function signBars(bars, tbs, index) { + //$nobyda.notify("贴吧签到", `进度${index}/${bars.length}`, ""); + if (index >= bars.length) { + //$nobyda.notify("贴吧签到", "签到已满", `${process.result.length}`); + checkIsAllProcessed(); + } else { + var bar = bars[index]; + if (bar.is_sign == 1) { //已签到的,直接不请求接口了 + process.result.push({ + bar: `${bar.forum_name}`, + level: bar.user_level, + exp: bar.user_exp, + errorCode: 9999, + errorMsg: "已签到" + }); + signBars(bars, tbs, ++index); + } else { + url_fetch_add.body = `tbs=${tbs}&kw=${bar.forum_name}&ie=utf-8`; + $nobyda.post(url_fetch_add, function(error, response, data) { + if (error) { + process.result.push({ + bar: bar.forum_name, + errorCode: 999, + errorMsg: '接口错误' + }); + signBars(bars, tbs, ++index); + } else { + try { + var addResult = JSON.parse(data); + if (addResult.no == 0) { + process.result.push({ + bar: bar.forum_name, + errorCode: 0, + errorMsg: `获得${addResult.data.uinfo.cont_sign_num}积分,第${addResult.data.uinfo.user_sign_rank}个签到` + }); + } else { + process.result.push({ + bar: bar.forum_name, + errorCode: addResult.no, + errorMsg: addResult.error + }); + } + } catch (e) { + $nobyda.notify("贴吧签到", "贴吧签到数据处理异常", JSON.stringify(e)); + $nobyda.done() + } + signBars(bars, tbs, ++index) + } + }) + } + } +} + +function checkIsAllProcessed() { + //$nobyda.notify("贴吧签到", `最终进度${process.result.length}/${process.total}`, ""); + if (process.result.length != process.total) return; + for (var i = 0; i < Math.ceil(process.total / singleNotifyCount); i++) { + var notify = ""; + var spliceArr = process.result.splice(0, singleNotifyCount); + var notifySuccessCount = 0; + for (const res of spliceArr) { + if (res.errorCode == 0 || res.errorCode == 9999) { + notifySuccessCount++; + } + if (res.errorCode == 9999) { + notify += `【${res.bar}】已经签到,当前等级${res.level},经验${res.exp} +`; + } else { + notify += `【${res.bar}】${res.errorCode==0?'签到成功':'签到失败'},${res.errorCode==0?res.errorMsg:('原因:'+res.errorMsg)} +`; + } + } + $nobyda.notify("贴吧签到", `签到${spliceArr.length}个,成功${notifySuccessCount}个`, notify); + $nobyda.done() + } +} + +function GetCookie() { + let headerCookie = $request.headers["Cookie"] || $request.headers["cookie"]; + if (headerCookie && headerCookie.includes('BDUSS=')) { + if (!cookieVal) { + $nobyda.notify("写入百度贴吧Cookie成功 🎉", "", ""); + } else { + console.log(`写入百度贴吧Cookie成功 🎉`); + } + $nobyda.write(headerCookie, "CookieTB") + } else { + console.log(`写入Cookie失败, BDUSS值缺失. `); + } + return $nobyda.done(); +} + +function nobyda() { + const isRequest = typeof $request != "undefined" + const isSurge = typeof $httpClient != "undefined" + const isQuanX = typeof $task != "undefined" + const notify = (title, subtitle, message) => { + if (isQuanX) $notify(title, subtitle, message) + if (isSurge) $notification.post(title, subtitle, message) + } + const write = (value, key) => { + if (isQuanX) return $prefs.setValueForKey(value, key) + if (isSurge) return $persistentStore.write(value, key) + } + const read = (key) => { + if (isQuanX) return $prefs.valueForKey(key) + if (isSurge) return $persistentStore.read(key) + } + const adapterStatus = (response) => { + if (response) { + if (response.status) { + response["statusCode"] = response.status + } else if (response.statusCode) { + response["status"] = response.statusCode + } + } + return response + } + const get = (options, callback) => { + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "GET" + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) $httpClient.get(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + const post = (options, callback) => { + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "POST" + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + $httpClient.post(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + } + const done = (value = {}) => { + if (isQuanX) return $done(value) + if (isSurge) isRequest ? $done(value) : $done() + } + return { + isRequest, + notify, + write, + read, + get, + post, + done + } +}; \ No newline at end of file diff --git a/Bahamut/BahamutAnimeAds.js b/Bahamut/BahamutAnimeAds.js new file mode 100644 index 0000000000..09a88fcc7e --- /dev/null +++ b/Bahamut/BahamutAnimeAds.js @@ -0,0 +1,68 @@ +/************************ + +动画疯,屏蔽播放广告脚本 (黑屏25秒自动播放) +由于动画疯强制验证观看广告时间,无法实现真正意义上的跳过广告。 + +Surge(4.11+)模块: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/BahamutAnimeAds.sgmodule + +QX(1.0.27+)用户请自行搭配KOP-XIAO资源解析器重写引用Surge模块。 + +************************/ + +let [req, rsp] = [$request, JSON.parse($response.body || '{}')]; + +runs().catch((err) => { + console.log(`[BahamutAnime] ERROR: ${err.message||err}`) +}).finally(() => $done({ + body: JSON.stringify(rsp) +})); + +async function runs() { + if (req.url.includes('token.php')) { + if (rsp.ad) { + rsp.ad.minor = []; + rsp.ad.major = []; + } + if (rsp.data && rsp.data.ad) { + rsp.data.ad.minor = []; + rsp.data.ad.major = []; + } + } + if (req.url.includes('m3u8.php') && (rsp.message || rsp.error)) { + await adURL(''); + await new Promise(r => setTimeout(r, 25000)); + await adURL('end'); + rsp = await playURL(); + } +} + +function adURL(str) { + return new Promise((res) => { + get({ + url: `https://api.gamer.com.tw/mobile_app/anime/v1/stat_ad.php?ad=${str}&schedule=0&sn=${req.url.split(/sn=(\d+)/i)[1]}`, + headers: req.headers + }, (err, resp, data) => res()) + }) +} + +function playURL() { + return new Promise((res) => { + get({ + url: req.url, + headers: req.headers + }, (err, resp, data) => res(JSON.parse(data || '{}'))) + }) +} + +function get(options, callback) { + if (typeof $task != "undefined") { + $task.fetch(options).then(response => { + response["status"] = response.statusCode + callback(null, response, response.body) + }, reason => callback(reason.error, null, null)) + } + if (typeof $httpClient != "undefined") { + $httpClient.get(options, callback) + } +} \ No newline at end of file diff --git a/Bahamut/BahamutDailyBonus.js b/Bahamut/BahamutDailyBonus.js new file mode 100644 index 0000000000..42ca42997a --- /dev/null +++ b/Bahamut/BahamutDailyBonus.js @@ -0,0 +1,358 @@ +/************************ + +巴哈姆特签到脚本 +包含主站签到、公会签到、动画疯答题等 + +脚本兼容: Surge、QuantumultX、Loon、Shadowrocket、Node.js +适配过程: https://nobyda.github.io/2021/07/24/Bahamut_daily_bonus_js_example +BoxJs订阅: https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +************************* +【 签到脚本注意事项 】: +************************* + +1. 该脚本需要进入BoxJs或脚本内填写账号密码后, 方可使用. +2. 不建议在凌晨执行,因需要获取动画疯题目答案; 默认配置将在每天的早上8:00执行. +3. 如需使用Node.js运行该脚本, 则需安装got、tough-cookie模块 + +************************* +【 Surge & Loon 脚本配置 】: +************************* + +[Script] +cron "0 8 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js, wake-system=1, timeout=300 + +************************* +【 QX 1.0.10+ 脚本配置 】 : +************************* + +[task_local] +0 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js, tag=巴哈姆特签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/bahamutGame.png + +************************/ + +// 以下全局变量中的持久化接口为BoxJs预留, 以便修改 +// 把兼容函数定义到$中, 以便统一调用 +const $ = new Env('巴哈姆特'); + +// 用户名 +$.uid = $.getdata('@ND_BAHA.ID') || 'YourUserName'; + +// 用户密码 +$.pwd = $.getdata('@ND_BAHA.PW') || 'YourUserPassword'; + +// 两步验证Token, 16位数, 未设置请保持默认 +$.totp = $.getdata('@ND_BAHA.TOTP') || ''; + +// 是否开启广告签到,true/false,默认关闭 (该功能耗时过长) +$.needSignAds = $.getdata('@ND_BAHA.ADS') || false; + +// 是否自动签到公会,true/false,默认开启 +$.needSignGuild = $.getdata('@ND_BAHA.GUILD') || true; + +// 是否自动答题动画疯,true/false,默认开启 (不保证100%答题正确) +$.needAnswer = $.getdata('@ND_BAHA.ANSWER') || true; + +//Bark APP 通知推送Key +$.barkKey = ''; + +// 为通知准备的空数组 +$.notifyMsg = []; + +(async function() { // 立即运行的匿名异步函数 + await BahamutLogin(); // 登录 + await BahamutGuildSign(); //签到巴哈公会 + await BahamutSign(); //签到巴哈 + await BahamutAnswer(); //动画疯答题 +})().catch((e) => $.notifyMsg.push(e.message || e)) //捕获登录函数等抛出的异常, 并把原因添加到全局变量(通知) + .finally(async () => { //finally在catch之后无论有无异常都会执行 + if ($.barkKey) { //如果已填写Bark Key + await BarkNotify($, $.barkKey, $.name, $.notifyMsg.join('\n')); //推送Bark通知 + }; + $.msg($.name, ``, $.notifyMsg.join('\n'), { + 'open-url': 'crazyanime://', //动画疯url scheme + 'media-url': 'https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/bahamutClear.png' //通知图片 + }); //带上总结推送通知 + $.done(); //调用Surge、QX内部特有的函数, 用于退出脚本执行 + }); + +async function BahamutLogin(retry = 3, interval = 1000) { //登录函数,拿到Set-Cookie + + //登录成功: {"success":true,"userid":"DGIE","nickname":"coco","gold":152769,"gp":0,"avatar":"https:\/\/avatar2.bahamut.com.tw\/avataruserpic\/dgie.png","avatar_s":"https:\/\/avatar2.bahamut.com.tw\/avataruserpic\/dgie_s.png","lv":6} + //账号错误: {"code":0,"message":"查無此人:SDFOUGB"} + //密码错误: {"code":0,"message":"帳號、密碼或驗證碼錯誤!"} + //验证码错误: {"code":0,"message":"驗證碼錯誤"} + + for (let i = 0; i < retry; i++) { //循环登录(默认三次) + if (i > 0) { + $.log('', `🔶尝试第${i+1}次登录...`); + await $.wait(interval); //延迟一秒 + }; + const reqUrl = { + url: 'https://api.gamer.com.tw/mobile_app/user/v3/do_login.php', //登录接口 + headers: { //请求头 + 'Cookie': 'ckAPP_VCODE=6666' //Cookie中的ckAPP_VCODE为必须 + }, + //请求体放入用户名和密码,并把它uri编码 + body: `uid=${encodeURIComponent($.uid)}&passwd=${encodeURIComponent($.pwd)}&vcode=6666${$.totp?`&twoStepAuth=${TOTP($.totp)}`:``}` + }; + const res = await $.http.post(reqUrl) //使用post请求查询 (兼容函数实际上返回Promise实例对象,以便后续调用时可以实现顺序执行异步函数) + .then(async (resp) => { //请求成功的处理 + const body = JSON.parse(resp.body); //解析响应体json为对象 + if (body.userid) { //如果成功返回用户信息 + $.BAHARUNE = JSON.stringify(resp.headers).split(/(BAHARUNE=\w+)/)[1]; + return `✅巴哈姆特登录成功`; + } else { //否则登录失败 (例如密码错误) + const failMsg = body.error ? body.error.message : null; //判断签到失败原因 + throw new Error(`${body.message||failMsg||'原因未知'}`); //带上原因抛出异常 + } + }).catch((err) => `❌登录失败\n❌${err.message || err}`); + $.log('', res.message || res); + if (res === `✅巴哈姆特登录成功`) { + break; //登录成功则跳出循环 + } else if (retry == i + 1) { //如果最后一次重试仍登录失败 + throw new Error(res.message || res); //抛出错误, 被调用该函数时的catch捕获, 脚本结束. + } + } +} + +function BahamutSign() { //查询巴哈姆特签到Token + return $.http.get({ //使用get方法 (Promise实例对象) 查询签到Token + url: 'https://www.gamer.com.tw/ajax/get_csrf_token.php', // 查询Token接口 + headers: {} //请求头, 客户端将自动设置Cookie字段 + }).then(async (resp) => { //网络请求成功的处理, 实例函数带有async关键字, 表示里面有异步操作 + if (resp.body) { //如果签到Token获取成功 + $.log('', '✅获取签到令牌成功'); //打印日志 + const sign = await StartSignBahamut(resp.body); //带上Token开始签到 + $.notifyMsg.push(`主页签到: 成功, 已连续签到${sign}天`); //添加到全局变量备用 (通知) + await StartAdsBonus(resp.body.slice(0, 16), 'start'); //执行广告签到 + } else { //否则抛出异常 + throw new Error('获取签到令牌失败'); //带上原因被下面catch捕获 + } + }) + .catch(err => { + $.notifyMsg.push(`主页签到: ${err.message||err}`); //添加到全局变量备用 (通知) + $.log('', `❌巴哈姆特签到失败`, `❌${err.message||err}`); + }); // 捕获异常, 打印日志 +} + +function StartSignBahamut(token) { //巴哈姆特签到 + + //签到成功: {"data":{"days":1,"dialog":"","prjSigninDays":0}} + //已签过: {"error":{"code":0,"message":"今天您已經簽到過了喔","status":"","details":[]}} + //未登录: {"error":{"code":401,"message":"尚未登入","status":"NO_LOGIN","details":[]}} + //令牌过期: {"error":{"code":403,"message":"網頁已過期","status":"CSRF_TOKEN_ERROR","details":[]}} + + return $.http.post({ //使用post方法 (Promise实例对象) 进行签到 + url: 'https://www.gamer.com.tw/ajax/signin.php', //巴哈姆特签到接口 + headers: {}, //请求头, 客户端将自动设置Cookie字段 + body: `action=1&token=${token}` //请求体带上查询到的签到Token + }) + .then(res => { // 网络请求成功的处理 + const body = JSON.parse(res.body); //解析响应体json为对象 + if (body.data) { // 如果签到成功 (判断预期响应格式) + $.log('', '✅巴哈姆特签到成功', `✅已连续签到${body.data.days}天`); //打印日志 + return body.data.days; //返回签到天数 + } else { //否则签到失败 + const failMsg = body.error ? body.error.message : null; //判断签到失败原因 + throw new Error(failMsg || body.message || '未知'); //带上原因抛出异常 + } + }); //未写catch,如果签到失败或其他错误,则被调用该函数时的catch捕获 +} + +function StartAdsBonus(token, type) { + if ($.needSignAds === false || $.needSignAds === 'false') { //如果用户选择不签到广告 + return; //退出广告签到函数 + } + return $.http.post({ //使用post方法 (Promise实例对象) 进行签到 + url: 'https://api.gamer.com.tw/mobile_app/bahamut/v1/sign_in_ad_' + type + '.php', //双倍巴币广告奖励接口 + headers: { + 'X-Bahamut-Csrf-Token': token, //前16位签到Token + 'Cookie': `ckBahamutCsrfToken=${token};${$.BAHARUNE}` //前16位签到Token和重新设置的Cookie + } + }) + .then(async (res) => { //网络请求成功的处理, 实例函数带有async关键字, 表示里面有异步操作 + const body = JSON.parse(res.body); //解析响应体json为对象 + if (body.data && body.data.finished == 0 && type == 'start') { //如果成功激活广告奖励 + $.log('', '🔶正在执行广告签到 (30s)'); //打印日志 + await $.wait(30000); //等待30秒 + await StartAdsBonus(token, 'finished'); //领取奖励函数 + } else if (body.data && body.data.finished == 1) { //如果广告奖励领取成功 + $.log('', '✅领取广告奖励成功'); //打印日志 + $.notifyMsg.push('广告签到: 成功, 已领取双倍签到奖励'); //添加到全局变量备用 (通知) + } else { + const failMsg = body.error ? body.error.message : null; //判断签到失败原因 + throw new Error(failMsg || body.message || '未知'); //带上原因抛出异常 + } + }) + .catch(err => { + $.notifyMsg.push(`广告签到: ${err.message||err}`); //添加到全局变量备用 (通知) + $.log('', `❌广告奖励签到失败`, `❌${err.message||err}`); + }); // 捕获异常, 打印日志 +} + +function BahamutGuildSign() { //巴哈姆特查询公会列表 + if ($.needSignGuild === false || $.needSignGuild === 'false') { //如果用户选择不签到公会 + return; //退出公会签到函数 + } + return $.http.get({ //使用get请求查询公会列表 (Promise实例对象) + url: 'https://api.gamer.com.tw/ajax/common/topBar.php?type=forum', // 查询公会列表接口 + headers: {} //请求头, 客户端将自动设置Cookie字段 + }) + .then(async (resp) => { //网络请求成功的处理, 实例函数带有async关键字, 表示里面有异步操作 + const list = (resp.body.replace(/\n/g, '').match(/guild\.php\?g?sn=\d.+?<\/p>/g) || []) //正则过滤公会列表大致内容 + .map(n => { //使用map遍历每个大致内容 + return { //返回包含公会ID和公会名称的对象 + sn: n.split(/guild\.php\?g?sn=(\d+)/)[1], //正则进一步提取公会ID + name: n.split(/

(.+?)<\/p>/)[1] //正则进一步提取公会名称 + } + }); + if (list.length) { //过滤后, 如果包含公会列表 + $.log('', `✅获取公会列表成功`); //打印日志 + //按照公会数量进行并发签到, map结合Promise.all后可以实现并发签到并且都完成后才进行下一行操作 + const sign = await Promise.all(list.map(StartSignGuild)); + const sucs = sign.filter(n => n === 1).length; //过滤后得到成功数量 + const fail = sign.filter(n => n === 0).length; //过滤后得到失败数量 + //添加到全局变量备用 (通知) + $.notifyMsg.push(`公会签到: ${sucs?`成功${sucs}个`:``}${sucs&&fail?`, `:``}${fail?`失败${fail}个`:``}`); + } else { + throw new Error('公会列表为空'); //无公会列表则抛出异常 + } + }) + .catch(err => { //捕获异常, 打印日志 + $.notifyMsg.push(`公会签到: ${err.message || err}`); //添加到全局变量备用 (通知) + $.log('', `❌巴哈姆特公会签到失败`, `❌${err.message || err}`); //打印日志 + }); +} + +function StartSignGuild(v) { //巴哈姆特公会签到 + + //签到成功: {"ok":1,"msg":"本日簽到成功!獲得5貢獻度"} + //已签过: {"error":1,"msg":"您今天已經簽到過了!"} + //公会ID错误: {"error":1,"msg":"此公會社團不存在。"} + //未加入公会: {"error":1,"msg":"你還不是成員,歡迎加入!"} + //未登录: {"error":1,"msg":"請先登入"} + + return $.http.post({ //使用post方法签到公会 (Promise实例对象) + url: 'https://guild.gamer.com.tw/ajax/guildSign.php', //公会签到接口 + headers: {}, //请求头, 客户端将自动设置Cookie字段 + body: `sn=${v.sn}` //把查询到的公会ID放进请求体 + }) + .then((res) => { //网络请求成功后的处理 + const body = JSON.parse(res.body); //解析响应体json为对象 + $.log('', `🔷<${v.name}>`, `${body.ok?`✅`:`❌`}${body.msg}`); //打印日志, 包含签到结果 + if (body.ok) { //如果签到成功 + return 1; //返回1表示成功 + } else { + return 0; //返回0表示失败 + } + }) + .catch(e => { //捕获异常, 打印日志 + $.log('', `🔷<${v.name}>`, `❌签到失败: ${e.message||e}`); + return 0; //返回0表示失败 + }); +} + +function BahamutAnswer() { //动画疯答题 + + //未答题: {"game":"灌籃高手","question":"流川楓的號碼是下列何者?","a1":"7","a2":"11","a3":"23","a4":"59","userid":"GN32964174","token":"01092fe463ab36ab47cb298e229c4f8fb298e229cc260fa7baf"} + //已答题: {"error":1,"msg":"今日已經答過題目了,一天僅限一次機會"} + //未登录: {"error":1,"nologin":1,"msg":"請先登入"} + + if ($.needAnswer === false || $.needAnswer === 'false') { //如果用户关闭动画疯答题 + return; //退出答题函数 + } + return $.http.get({ //使用get方获取题目 (Promise实例对象) + url: 'https://ani.gamer.com.tw/ajax/animeGetQuestion.php?t=' + Date.now(), //获取题目接口 + headers: {} //请求头, 客户端将自动设置Cookie字段 + }) + .then(async (res) => { //网络请求成功的处理, 实例函数带有async关键字, 表示里面有异步操作 + const r = JSON.parse(res.body); //解析响应体json为对象 + if (r.token) { //如果有题目 + $.log('', `✅获取动画疯题目成功`, ``, `🔶<${r.game}> ${r.question}`, + `1️⃣${r.a1}`, `2️⃣${r.a2}`, `3️⃣${r.a3}`, `4️⃣${r.a4}`); //打印日志 + const article = await GetAanswerArticles(); //获取答案文章ID + const getAnswer = await StartSearchAnswers(article); //传入文章ID, 再从文章内获取答案 + const sendAnswer = await StartBahamutAnswer(getAnswer, r.token); //传入答案和题目令牌, 开始答题 + $.notifyMsg.push(`动画答题: ${sendAnswer}`); //答题后的结果添加到全局变量备用 (通知) + } else { //未获取到题目 + throw new Error(r.msg || `获取题目失败`); //带上原因抛出异常 + } + }) + .catch(e => { //捕获异常, 打印日志 + $.notifyMsg.push(`动画答题: ${e.message||e||`失败`}`); //添加到全局变量备用 (通知) + $.log('', `❌动画疯答题失败`, `❌${e.message||e}`); //打印日志 + }); +} + +function GetAanswerArticles() { // 从blackxblue的小屋查询含答案的文章ID + $.log('', `🔶开始获取文章`); //打印日志 + return $.http.get({ //使用get方法获取文章ID (Promise实例对象) + url: 'https://api.gamer.com.tw/mobile_app/bahamut/v1/home.php?owner=blackXblue&page=1', //获取文章ID接口 + headers: {} + }) + .then((res) => { //网络请求成功后的处理 + const body = JSON.parse(res.body); //解析响应体json为对象 + const tDate = $.time('MM/dd'); //返回今日日期 + const title = (body.creation || []).filter(t => t.title.includes(tDate)); //过滤后返回今日答案文章 + if (title.length && title[0].sn) { //如果有答案文章 + $.log('', `✅获取文章成功 (${title[0].sn})`); //打印日志 + return title[0].sn; //返回文章ID + } else { //否则带上原因抛出异常, 被调用该函数时的catch捕获 + throw new Error('今日答案未发表'); + } + }) +} + +function StartSearchAnswers(id) { //获取文章内答案 + $.log('', `🔶开始获取答案`); //打印日志 + return $.http.get({ //使用get方法获取答案 (Promise实例对象) + url: 'https://api.gamer.com.tw/mobile_app/bahamut/v1/home_creation_detail.php?sn=' + id, //获取答案接口 + headers: {} + }) + .then((res) => { //网络请求成功后的处理 + const body = JSON.parse(res.body); //解析响应体json为对象 + const answers = body.content.split(/A:(\d)/)[1]; //正则提取答案 + if (answers) { //如果成功提取答案 + $.log('', `✅获取答案成功 (${answers})`); //打印日志 + return answers; //返回答案 + } else { //否则带上原因抛出异常, 被调用该函数时的catch捕获 + throw new Error('提取答案失败'); + } + }) +} + +function StartBahamutAnswer(answer, token) { //动画疯答题 + + //答题正确: {"ok":1,"gift":"恭喜您得到:300 巴幣"} + //答题错误: {"error":1,"msg":"答題錯誤"} + //令牌过期: {"error":1,"msg":"很抱歉!本題目已超過時效!"} + //已答题: {"error":1,"msg":"今日已經答過題目了,一天僅限一次機會"} + //未登录: {"error":1,"nologin":1,"msg":"請先登入"} + + $.log('', `🔶开始答题`); //打印日志 + return $.http.post({ //使用post方法提交答案 (Promise实例对象) + url: 'https://ani.gamer.com.tw/ajax/animeAnsQuestion.php', //提交答案接口 + headers: {}, //请求头, 客户端将自动设置Cookie字段 + body: `token=${token}&ans=${answer}&t=${Date.now()}`, //请求体带上答案和答案令牌 + }) + .then((res) => { //网络请求成功后的处理 + const body = JSON.parse(res.body); //解析响应体json为对象 + if (body.ok) { //如果答题成功 + $.log('', `✅${body.gift}`); //打印奖励日志 + return body.gift; //返回奖励内容 + } else { //否则答题失败 + const failMsg = body.error ? body.error.message : null; //提取签到失败原因 + throw new Error(body.msg || failMsg || '未知'); //否则带上原因抛出异常, 被调用该函数时的catch捕获 + } + }) +} + +//Bark APP notify +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}`)}}}; + +//修改自 https://github.com/chavyleung/scripts/blob/master/Env.js 的兼容函数 +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,i)=>{s.call(this,t,(t,s,r)=>{t?i(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.ua="Anime/2.13.9 (tw.com.gamer.anime;build:437;iOS 14.5.0) Alamofire/5.4.1",this.logs=[],this.isMute=!1,this.isNeedRewrite=!0,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}isShadowrocket(){return"undefined"!=typeof $rocket}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 i=this.getdata(t);if(i)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,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http:\/\/${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).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),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}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),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)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,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):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||/ckAPP_VCODE/.test(t.headers.Cookie))&&void 0===t.cookieJar)&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(t.headers["User-Agent"]=this.ua,delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(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:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){const s=t.method?t.method.toLocaleLowerCase():"post";if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&(t.headers["User-Agent"]=this.ua,delete t.headers["Content-Length"]),this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient[s](t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method=s,this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:i,...r}=t;this.got[s](i,r).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"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 i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","================================="];t.push(e),s&&t.push(s),i&&t.push(i),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){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name},\u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name},\u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`${s}\u79d2`,`=================================`),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}; + +// 从 https://jsfiddle.net/russau/rbyjk774 魔改的TOTP两部验证算法, 完全使用原生javascript实现 +function TOTP(token){function t(e,a,d){var g=0,c=[],b=0,f,k,l,h,m,w,n,y,p=!1,q=[],t=[],v,u=!1;d=d||{};f=d.encoding||"UTF8";v=d.numRounds||1;l=z(a,f);if(v!==parseInt(v,10)||1>v)throw Error("numRounds must a integer >= 1");if("SHA-1"===e)m=512,w=A,n=H,h=160,y=function(a){return a.slice()};else throw Error("Chosen SHA variant is not supported");k=x(e);this.setHMACKey=function(a,b,c){var d;if(!0===p)throw Error("HMAC key already set");if(!0===u)throw Error("Cannot set HMAC key after calling update");f=(c||{}).encoding||"UTF8";b=z(b,f)(a);a=b.binLen;b=b.value;d=m>>>3;c=d/4-1;if(da/8){for(;b.length<=c;)b.push(0);b[c]&=4294967040}for(a=0;a<=c;a+=1)q[a]=b[a]^909522486,t[a]=b[a]^1549556828;k=w(q,k);g=m;p=!0};this.update=function(a){var d,e,f,h=0,n=m>>>5;d=l(a,c,b);a=d.binLen;e=d.value;d=a>>>5;for(f=0;f>>5);b=a%m;u=!0};this.getHash=function(a,d){var f,l,m,r;if(!0===p)throw Error("Cannot call getHash after setting HMAC key");m=B(d);switch(a){case"HEX":f=function(a){return C(a,h,m)};break;case"B64":f=function(a){return D(a,h,m)};break;case"BYTES":f=function(a){return E(a,h)};break;case"ARRAYBUFFER":try{l=new ArrayBuffer(0)}catch(I){throw Error("ARRAYBUFFER not supported by this environment");}f=function(a){return F(a,h)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}r=n(c.slice(),b,g,y(k),h);for(l=1;l>>3;if(0!==g%2)throw Error("String of HEX type must be in byte increments");for(c=0;c>>1)+l;for(f=k>>>2;a.length<=f;)a.push(0);a[f]|=b<<8*(3-k%4)}return{value:a,binLen:4*g+d}}function K(e,a,d){var g=[],c,b,f,k,g=a||[0];d=d||0;b=d>>>3;for(c=0;c>>2,g.length<=f&&g.push(0),g[f]|=a<<8*(3-k%4);return{value:g,binLen:8*e.length+d}}function L(e,a,d){var g=[],c=0,b,f,k,l,h,m,g=a||[0];d=d||0;a=d>>>3;if(-1===e.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");f=e.indexOf("=");e=e.replace(/\=/g,"");if(-1!==f&&f=str.length){str=Array(len+1-str.length).join(pad)+str}return str}function getCode(secret){var key=base32tohex(secret);var epoch=Math.round(new Date().getTime()/1000.0);var time=leftpad(dec2hex(Math.floor(epoch/30)),16,'0');var shaObj=new t("SHA-1","HEX");shaObj.setHMACKey(key,"HEX");shaObj.update(time);var hmac=shaObj.getHMAC("HEX");var offset=hex2dec(hmac.substring(hmac.length-1));var otp=(hex2dec(hmac.substr(offset*2,8))&hex2dec('7fffffff'))+'';otp=(otp).substr(otp.length-6,6);return otp};const res=getCode(token);return res}; \ No newline at end of file diff --git a/Bilibili-DailyBonus/ExchangePoints.js b/Bilibili-DailyBonus/ExchangePoints.js new file mode 100644 index 0000000000..f66e06761b --- /dev/null +++ b/Bilibili-DailyBonus/ExchangePoints.js @@ -0,0 +1,272 @@ +/******************************** +哔哩哔哩漫画积分商城自动抢购脚本 + +默认兑换积分商城中的"【超特惠】限量-0点秒杀" +兑换数量为用户积分可兑换的最大值 (可于BoxJs内修改) +默认执行时间为:每周日、每周一的凌晨 0:00:00 - 0:00:30 之间每秒执行一次 + +该脚本需要使用签到脚本获取Cookie后方可使用,支持多账号。 + +脚本作者:@NobyDa is powered by AI +更新时间:2025/12/19 +平台兼容:Surge / QuantumultX / Loon / Stash + +********************************* +Surge(iOS 5.9.0+/macOS 5.5.0+)模块: +********************************* + +https://raw.githubusercontent.com/NobyDa/Script/refs/heads/master/Surge/Module/BiliComicsExchangePoints.sgmodule + +********************************* +QuantumultX 任务仓库(Gallery)订阅: +********************************* + +https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json +工具&分析->HTTP请求->右上角添加任务仓库->选择相关脚本添加定时任务和附加组件 + +或者添加QuantumultX配置: +[task_local] +0-59 0 0 * * 0-1 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/ExchangePoints.js, tag=哔哩哔哩漫画抢券, enabled=true + +*********************************/ + +const $ = new Env('BILI_COMICS_CHECKIN'); +const barkKey = $.isNode() && process.env['BM_BARK_KEY'] || ''; +const notifyMsg = []; + +!(async () => { + $.logLevel = $.getdata(`@${$.name}.Debug`) == 'true' && 'debug' || 'info'; + const args = argsList(typeof $argument == "string" && $argument || ''); + const user = JSON.parse($.getdata($.name) || ($.isNode() && process.env[$.name]) || '{}'); + const userNum = Object.keys(user.account || {}).length; + const todayFlag = getTodayFlag(); + // 读取配置参数 + const productName = args.ProductName || user.ProductName || '【超特惠】限量-0点秒杀'; + const productNum = args.ProductNum || parseInt(user.ProductNum) || 0; + const exchangeNum = args.ExchangeNum || parseInt(user.ExchangeNum) || 100; + if (userNum) { + for (const i in user.account) { + // 检查今日是否已抢购成功 + if (user.account[i].lastSuccessDate === todayFlag) { + const text = `账号(${i})今日已抢购成功,跳过执行`; + $.info(text); + continue + } + // 检查今日是否已标记积分不足 + if (user.account[i].lastInsufficientDate === todayFlag) { + const text = `账号(${i})今日积分不足,跳过执行`; + $.info(text); + continue + } + const accountPrefix = userNum > 1 ? `[账号(${i})]` : ''; + try { + const result = await ExchangeForAccount(user.account[i], productName, productNum, exchangeNum); + const text = accountPrefix ? `${accountPrefix} ${result.message}` : result.message; + $.info(text); + // 只有抢购成功时才加入通知消息并标记成功 + if (result.success) { + notifyMsg.push(text); + user.account[i].lastSuccessDate = todayFlag; + // 清除积分不足标记 + delete user.account[i].lastInsufficientDate; + $.setjson(user, $.name); + $.info(`账号 ${i} 已标记今日抢购成功`); + } + // 如果是积分不足(非异常情况),标记今日积分不足 + else if (result.insufficient) { + user.account[i].lastInsufficientDate = todayFlag; + $.setjson(user, $.name); + $.info(`账号 ${i} 已标记今日积分不足`); + } + } catch (err) { + const text = `${accountPrefix} 抢购错误: ${err.message}`; + $.error(text); + notifyMsg.push(text); + } + } + } else { + notifyMsg.push(`抢购Cookie失效/未获取 ⚠️`); + } +})() + .catch((err) => notifyMsg.push(`错误: ${err}`) && $.error(err)) + .finally(async () => { + if (notifyMsg.length) { + if (barkKey) { + await BarkNotify($, barkKey, `哔哩哔哩漫画抢券`, notifyMsg.join('\n')); + } + $.msg(`哔哩哔哩漫画抢券`, ``, notifyMsg.join('\n')); + } + $.done({}); + }); + +async function ExchangeForAccount(account, productName, productNum, exchangeNum) { + // 先只查询商品信息(不查询积分) + const productList = await ListProduct(account); + + // 查找目标商品 + const product = productList.find(t => t.title == productName); + if (!product) { + return { success: false, insufficient: false, message: `查询商品失败: 未找到"${productName}"` }; + } + + // 先检查商品库存,如果库存为0则直接返回,不查询积分 + if (!product.remain_amount) { + $.info(`查询商品: ${productName}, 库存: 0`); + return { success: false, insufficient: false, message: `抢购终止: 商品库存为0` }; + } + + // 库存充足时才查询积分 + const userPoint = await GetUserPoint(account); + $.info(`查询商品: ${productName}, 库存: ${product.remain_amount}, 当前积分: ${userPoint}`); + + // 检查积分是否足够 + if (userPoint < product.real_cost) { + return { + success: false, + insufficient: true, + message: `抢购终止: 积分不足 (需要${product.real_cost}, 当前${userPoint})` + }; + } + + // 计算兑换数量 + const num = productNum > 0 ? Math.min(productNum, Math.floor(userPoint / product.real_cost)) : Math.floor(userPoint / product.real_cost); + + if (num <= 0) { + return { + success: false, + insufficient: true, + message: `抢购终止: 积分不足以兑换` + }; + } + + // 开始抢购 + for (let i = 0; i < exchangeNum; i++) { + const result = await StartExchange(account, product, num, i); + if (result.success) { + return { + success: true, + insufficient: false, + message: `抢购成功: 第${i + 1}次, 数量: ${num}, 消耗积分: ${num * product.real_cost}` + }; + } + if (i === exchangeNum - 1) { + return { + success: false, + insufficient: false, + message: `抢购失败: 已尝试${exchangeNum}次 (${result.message})` + }; + } + } +} + +function GetUserPoint(account) { + const opts = { + url: 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint', + headers: { + "User-Agent": "comic-universal/3412 CFNetwork/1410.0.3 Darwin/22.6.0 os/ios model/iPhone 12 mobi_app/iphone_comic build/3412 osVer/16.6 network/2 channel/AppStore", + "Cookie": account.cookie + }, + throwHttpErrors: false + }; + + $.debug(`Send GetUserPoint request:`, $.toStr(opts, null, null, 1)); + + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive GetUserPoint response:`, $.toStr(resp, null, null, 1)); + const body = JSON.parse(resp.body?.startsWith('{') && resp.body || '{}'); + if (body.code == 0 && body.data) { + return parseInt(body.data.point); + } else { + throw new Error(body.msg || '查询积分失败'); + } + }) + .catch((err) => { + $.error(`GetUserPoint error:`, err); + throw err; + }); +} + +function ListProduct(account) { + const opts = { + url: 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct', + headers: { + "User-Agent": "comic-universal/3412 CFNetwork/1410.0.3 Darwin/22.6.0 os/ios model/iPhone 12 mobi_app/iphone_comic build/3412 osVer/16.6 network/2 channel/AppStore" + }, + throwHttpErrors: false + }; + + $.debug(`Send ListProduct request:`, $.toStr(opts, null, null, 1)); + + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive ListProduct response:`, $.toStr(resp, null, null, 1)); + const body = JSON.parse(resp.body?.startsWith('{') && resp.body || '{}'); + if (body.code == 0 && body.data && body.data.length >= 1) { + return body.data; + } else { + throw new Error(body.msg || '查询商品列表失败'); + } + }) + .catch((err) => { + $.error(`ListProduct error:`, err); + throw err; + }); +} + +function StartExchange(account, product, num, attempt) { + const opts = { + url: 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange', + headers: { + "User-Agent": "comic-universal/3412 CFNetwork/1410.0.3 Darwin/22.6.0 os/ios model/iPhone 12 mobi_app/iphone_comic build/3412 osVer/16.6 network/2 channel/AppStore", + "Content-Type": "application/json", + "Cookie": account.cookie + }, + body: JSON.stringify({ + product_id: product.id, + product_num: num, + point: num * product.real_cost + }), + throwHttpErrors: false + }; + + $.debug(`Send Exchange request (attempt ${attempt + 1}):`, $.toStr(opts, null, null, 1)); + + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive Exchange response (attempt ${attempt + 1}):`, $.toStr(resp, null, null, 1)); + const body = JSON.parse(resp.body?.startsWith('{') && resp.body || '{}'); + if (body.code == 0) { + return { success: true, message: '兑换成功' }; + } else { + return { success: false, message: body.msg || '未知错误' }; + } + }) + .catch((err) => { + $.error(`Exchange error (attempt ${attempt + 1}):`, err); + return { success: false, message: err.message || '请求失败' }; + }); +} + +function getTodayFlag() { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + const day = String(now.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +function argsList(data) { + return Array.from( + data.split("&") + .map((i) => i.split("=")) + .map(([k, v]) => [k, decodeURIComponent(v)]) + ) + .reduce((a, [k, v]) => Object.assign(a, { [k]: v }), {}) +} + +//Bark APP notify +async function BarkNotify(c, k, t, b) { for (let i = 0; i < 3; i++) { c.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) { c.log('✅Push success!'); break } else { c.log(`❌Push failed! >> ${s.message || s}`) } } }; + +// https://github.com/chavyleung/scripts/blob/master/Env.min.js +function Env(e, t) { class s { constructor(e) { this.env = e } send(e, t = "GET") { e = "string" == typeof e ? { url: e } : e; let s = this.get; "POST" === t && (s = this.post); const i = new Promise(((t, i) => { s.call(this, e, ((e, s, o) => { e ? i(e) : t(s) })) })); return e.timeout ? ((e, t = 1e3) => Promise.race([e, new Promise(((e, s) => { setTimeout((() => { s(new Error("请求超时")) }), t) }))]))(i, e.timeout) : i } get(e) { return this.send.call(this.env, e) } post(e) { return this.send.call(this.env, e, "POST") } } return new class { constructor(e, t) { this.logLevels = { debug: 0, info: 1, warn: 2, error: 3 }, this.logLevelPrefixs = { debug: "[DEBUG] ", info: "[INFO] ", warn: "[WARN] ", error: "[ERROR] " }, this.logLevel = "info", this.name = e, 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, t) } 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(e, t = null) { try { return JSON.parse(e) } catch { return t } } toStr(e, t = null, ...s) { try { return JSON.stringify(e, ...s) } catch { return t } } getjson(e, t) { let s = t; if (this.getdata(e)) try { s = JSON.parse(this.getdata(e)) } catch { } return s } setjson(e, t) { try { return this.setdata(JSON.stringify(e), t) } catch { return !1 } } getScript(e) { return new Promise((t => { this.get({ url: e }, ((e, s, i) => t(i))) })) } runScript(e, t) { return new Promise((s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); o = o ? 1 * o : 20, o = t && t.timeout ? t.timeout : o; const [r, a] = i.split("@"), n = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: e, mock_type: "cron", timeout: o }, headers: { "X-Key": r, Accept: "*/*" }, policy: "DIRECT", timeout: o }; this.post(n, ((e, t, i) => s(i))) })).catch((e => this.logErr(e))) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const e = this.path.resolve(this.dataFile), t = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(e), i = !s && this.fs.existsSync(t); if (!s && !i) return {}; { const i = s ? e : t; try { return JSON.parse(this.fs.readFileSync(i)) } catch (e) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const e = this.path.resolve(this.dataFile), t = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(e), i = !s && this.fs.existsSync(t), o = JSON.stringify(this.data); s ? this.fs.writeFileSync(e, o) : i ? this.fs.writeFileSync(t, o) : this.fs.writeFileSync(e, o) } } lodash_get(e, t, s) { const i = t.replace(/\[(\d+)\]/g, ".$1").split("."); let o = e; for (const e of i) if (o = Object(o)[e], void 0 === o) return s; return o } lodash_set(e, t, s) { return Object(e) !== e || (Array.isArray(t) || (t = t.toString().match(/[^.[\]]+/g) || []), t.slice(0, -1).reduce(((e, s, i) => Object(e[s]) === e[s] ? e[s] : e[s] = Math.abs(t[i + 1]) >> 0 == +t[i + 1] ? [] : {}), e)[t[t.length - 1]] = s), e } getdata(e) { let t = this.getval(e); if (/^@/.test(e)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(e), o = s ? this.getval(s) : ""; if (o) try { const e = JSON.parse(o); t = e ? this.lodash_get(e, i, "") : t } catch (e) { t = "" } } return t } setdata(e, t) { let s = !1; if (/^@/.test(t)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(t), r = this.getval(i), a = i ? "null" === r ? null : r || "{}" : "{}"; try { const t = JSON.parse(a); this.lodash_set(t, o, e), s = this.setval(JSON.stringify(t), i) } catch (t) { const r = {}; this.lodash_set(r, o, e), s = this.setval(JSON.stringify(r), i) } } else s = this.setval(e, t); return s } getval(e) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.read(e); case "Quantumult X": return $prefs.valueForKey(e); case "Node.js": return this.data = this.loaddata(), this.data[e]; default: return this.data && this.data[e] || null } } setval(e, t) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.write(e, t); case "Quantumult X": return $prefs.setValueForKey(e, t); case "Node.js": return this.data = this.loaddata(), this.data[t] = e, this.writedata(), !0; default: return this.data && this.data[t] || null } } initGotEnv(e) { 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, e && (e.headers = e.headers ? e.headers : {}, e && (e.headers = e.headers ? e.headers : {}, void 0 === e.headers.cookie && void 0 === e.headers.Cookie && void 0 === e.cookieJar && (e.cookieJar = this.ckjar))) } get(e, t = (() => { })) { switch (e.headers && (delete e.headers["Content-Type"], delete e.headers["Content-Length"], delete e.headers["content-type"], delete e.headers["content-length"]), e.params && (e.url += "?" + this.queryStr(e.params)), void 0 === e.followRedirect || e.followRedirect || ((this.isSurge() || this.isLoon()) && (e["auto-redirect"] = !1), this.isQuanX() && (e.opts ? e.opts.redirection = !1 : e.opts = { redirection: !1 })), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (e.headers = e.headers || {}, Object.assign(e.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(e, ((e, s, i) => { !e && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), t(e, s, i) })); break; case "Quantumult X": this.isNeedRewrite && (e.opts = e.opts || {}, Object.assign(e.opts, { hints: !1 })), $task.fetch(e).then((e => { const { statusCode: s, statusCode: i, headers: o, body: r, bodyBytes: a } = e; t(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (e => t(e && e.error || "UndefinedError"))); break; case "Node.js": let s = require("iconv-lite"); this.initGotEnv(e), this.got(e).on("redirect", ((e, t) => { try { if (e.headers["set-cookie"]) { const s = e.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), t.cookieJar = this.ckjar } } catch (e) { this.logErr(e) } })).then((e => { const { statusCode: i, statusCode: o, headers: r, rawBody: a } = e, n = s.decode(a, this.encoding); t(null, { status: i, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (e => { const { message: i, response: o } = e; t(i, o, o && s.decode(o.rawBody, this.encoding)) })); break } } post(e, t = (() => { })) { const s = e.method ? e.method.toLocaleLowerCase() : "post"; switch (e.body && e.headers && !e.headers["Content-Type"] && !e.headers["content-type"] && (e.headers["content-type"] = "application/x-www-form-urlencoded"), e.headers && (delete e.headers["Content-Length"], delete e.headers["content-length"]), void 0 === e.followRedirect || e.followRedirect || ((this.isSurge() || this.isLoon()) && (e["auto-redirect"] = !1), this.isQuanX() && (e.opts ? e.opts.redirection = !1 : e.opts = { redirection: !1 })), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (e.headers = e.headers || {}, Object.assign(e.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient[s](e, ((e, s, i) => { !e && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), t(e, s, i) })); break; case "Quantumult X": e.method = s, this.isNeedRewrite && (e.opts = e.opts || {}, Object.assign(e.opts, { hints: !1 })), $task.fetch(e).then((e => { const { statusCode: s, statusCode: i, headers: o, body: r, bodyBytes: a } = e; t(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (e => t(e && e.error || "UndefinedError"))); break; case "Node.js": let i = require("iconv-lite"); this.initGotEnv(e); const { url: o, ...r } = e; this.got[s](o, r).then((e => { const { statusCode: s, statusCode: o, headers: r, rawBody: a } = e, n = i.decode(a, this.encoding); t(null, { status: s, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (e => { const { message: s, response: o } = e; t(s, o, o && i.decode(o.rawBody, this.encoding)) })); break } } time(e, t = null) { const s = t ? new Date(t) : new Date; let i = { "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(e) && (e = e.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let t in i) new RegExp("(" + t + ")").test(e) && (e = e.replace(RegExp.$1, 1 == RegExp.$1.length ? i[t] : ("00" + i[t]).substr(("" + i[t]).length))); return e } queryStr(e) { let t = ""; for (const s in e) { let i = e[s]; null != i && "" !== i && ("object" == typeof i && (i = JSON.stringify(i)), t += `${s}=${i}&`) } return t = t.substring(0, t.length - 1), t } msg(t = e, s = "", i = "", o = {}) { const r = e => { const { $open: t, $copy: s, $media: i, $mediaMime: o } = e; switch (typeof e) { case void 0: return e; case "string": switch (this.getEnv()) { case "Surge": case "Stash": default: return { url: e }; case "Loon": case "Shadowrocket": return e; case "Quantumult X": return { "open-url": e }; case "Node.js": return }case "object": switch (this.getEnv()) { case "Surge": case "Stash": case "Shadowrocket": default: { const r = {}; let a = e.openUrl || e.url || e["open-url"] || t; a && Object.assign(r, { action: "open-url", url: a }); let n = e["update-pasteboard"] || e.updatePasteboard || s; n && Object.assign(r, { action: "clipboard", text: n }); let h = e.mediaUrl || e["media-url"] || i; if (h) { let e, t; if (h.startsWith("http")); else if (h.startsWith("data:")) { const [s] = h.split(";"), [, i] = h.split(","); e = i, t = s.replace("data:", "") } else { e = h, t = (e => { const t = { JVBERi0: "application/pdf", R0lGODdh: "image/gif", R0lGODlh: "image/gif", iVBORw0KGgo: "image/png", "/9j/": "image/jpg" }; for (var s in t) if (0 === e.indexOf(s)) return t[s]; return null })(h) } Object.assign(r, { "media-url": h, "media-base64": e, "media-base64-mime": o ?? t }) } return Object.assign(r, { "auto-dismiss": e["auto-dismiss"], sound: e.sound }), r } case "Loon": { const s = {}; let o = e.openUrl || e.url || e["open-url"] || t; o && Object.assign(s, { openUrl: o }); let r = e.mediaUrl || e["media-url"] || i; return r && Object.assign(s, { mediaUrl: r }), console.log(JSON.stringify(s)), s } case "Quantumult X": { const o = {}; let r = e["open-url"] || e.url || e.openUrl || t; r && Object.assign(o, { "open-url": r }); let a = e.mediaUrl || e["media-url"] || i; a && Object.assign(o, { "media-url": a }); let n = e["update-pasteboard"] || e.updatePasteboard || s; return n && Object.assign(o, { "update-pasteboard": n }), console.log(JSON.stringify(o)), o } case "Node.js": return }default: return } }; if (!this.isMute) switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: $notification.post(t, s, i, r(o)); break; case "Quantumult X": $notify(t, s, i, r(o)); break; case "Node.js": break }if (!this.isMuteLog) { let e = ["", "============================"]; e.push(t), s && e.push(s), i && e.push(i), console.log(e.join("\n")), this.logs = this.logs.concat(e) } } debug(...e) { this.logLevels[this.logLevel] <= this.logLevels.debug && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.debug}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } info(...e) { this.logLevels[this.logLevel] <= this.logLevels.info && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.info}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } warn(...e) { this.logLevels[this.logLevel] <= this.logLevels.warn && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.warn}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } error(...e) { this.logLevels[this.logLevel] <= this.logLevels.error && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.error}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } log(...e) { e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(e.map((e => e ?? String(e))).join(this.logSeparator)) } logErr(e, t) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: this.log("", `❗️${this.name}, 错误!`, t, e); break; case "Node.js": this.log("", `❗️${this.name}, 错误!`, t, void 0 !== e.message ? e.message : e, e.stack); break } } wait(e) { return new Promise((t => setTimeout(t, e))) } done(e = {}) { const t = ((new Date).getTime() - this.startTime) / 1e3; switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: $done(e); break; case "Node.js": process.exit(1) } } }(e, t) } diff --git a/Bilibili-DailyBonus/Manga.js b/Bilibili-DailyBonus/Manga.js new file mode 100644 index 0000000000..45a06ceb9d --- /dev/null +++ b/Bilibili-DailyBonus/Manga.js @@ -0,0 +1,143 @@ +/******************************** +哔哩哔哩漫画签到脚本 + +支持多账号,支持Node.js,支持Bark推送。 +打开哔哩哔哩/漫画后 (AppStore中国区),单击"我的", 即可获取cookie + +脚本作者:@NobyDa +更新时间:2025/12/19 +平台兼容:Surge / QuantumultX / Loon / Stash / Node.js +模块依赖(Node.js):iconv-lite / got / tough-cookie +环境变量(Node.js):BILI_COMIC_DAILY_BONUS / BM_BARK_KEY + +********************************* +Surge(iOS 5.9.0+/macOS 5.5.0+)模块: +********************************* + +https://raw.githubusercontent.com/NobyDa/Script/refs/heads/master/Surge/Module/BiliComicsDailyBonus.sgmodule + +********************************* +QuantumultX 任务仓库(Gallery)订阅: +********************************* + +https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json +工具&分析->HTTP请求->右上角添加任务仓库->选择相关脚本添加定时任务和附加组件 + +或者添加QuantumultX配置: +[task_local] +0 9 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, tag=哔哩哔哩漫画签到 + +[rewrite_local] +^https:\/\/app\.bilibili\.com\/x\/v2\/account\/myinfo url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js + +[mitm] +hostname = app.bilibili.com +*********************************/ + +const $ = new Env('BILI_COMICS_CHECKIN'); +const barkKey = $.isNode() && process.env['BM_BARK_KEY'] || ''; // bark key +const notifyMsg = []; +const auth = ''; // '{"account":{"user1":{"cookie":"xxx","access_key":"xxx"},"user2":{"cookie":"xxx","access_key":"xxx"}}}' + +!(async () => { + $.logLevel = $.getdata(`@${$.name}.Debug`) == 'true' && 'debug' || 'info'; + const user = JSON.parse(auth || $.getdata($.name) || ($.isNode() && process.env[$.name]) || '{}'); + const userNum = Object.keys(user.account || {}).length; + if (typeof $request !== 'undefined') { + return GetAuth($request, user); + } + if (userNum) { + const invalidUser = []; + for (const i in user.account) { + const text = [ + userNum > 1 && `[账号${notifyMsg.length + 1}(${i})]`, + await Checkin(user.account[i], i), + ].filter((v) => v).join(' '); + if (text.includes('登陆失效')) { + invalidUser.push(i) + } + $.info(text); + notifyMsg.push(text); + } + invalidUser.forEach((i) => delete user.account[i] && !$.isNode() && $.setjson(user, $.name)); + } else { + notifyMsg.push(`签到Cookie失效/未获取 ⚠️`); + } +})() + .catch((err) => notifyMsg.push(`错误: ${err}`) && $.error(err)) + .finally(async () => { + const finalContent = notifyMsg.filter((v) => !v.includes('已签过')); + if (finalContent.length) { + if (barkKey) { + await BarkNotify($, barkKey, `哔哩哔哩漫画`, finalContent.join('\n')); + } + $.msg(`哔哩哔哩漫画`, ``, finalContent.join('\n')) + } + $.done({}); + }); + +function Checkin(key) { + const opts = { + url: `https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn?platform=ios`, + headers: { + "User-Agent": "comic-universal/3412 CFNetwork/1410.0.3 Darwin/22.6.0 os/ios model/iPhone 12 mobi_app/iphone_comic build/3412 osVer/16.6 network/2 channel/AppStore" + }, + throwHttpErrors: false // a fucking legacy in Env.js + }; + if (key.cookie) { opts.headers.Cookie = key.cookie } + if (key.access_key) { opts.url = `${opts.url}&access_key=${key.access_key}` } + $.debug(`Send checkin request:`, $.toStr(opts, null, null, 1)); + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive checkin request response:`, $.toStr(resp, null, null, 1)) + resp.body = JSON.parse((resp.body?.startsWith('{') && resp.body) || '{}'); + if (resp.body.code == 0) { + return '签到成功!🎉' + } else if (resp.body.code == 1) { + return '今日已签过 ⚠️' + } else if (resp.body.msg == 'uid must > 0') { + return '签到失败, 登陆失效 ⚠️' + } else { + return `签到失败(${resp.body.msg})` + } + }) + .catch((err) => { + $.error(`Send checkin request error:`, err); + return `签到错误 ⚠️` + }) +} + +function GetAuth(raw, data) { + raw.headers = formatHeaders(raw.headers); + const uid = raw.headers['x-bili-mid']; + // cookies may not always be present in app. + const cookie = raw.headers.cookie?.split(/(SESSDATA=[a-zA-Z0-9%_-]+)/)[1]; + const access_key = raw.url.split(/access_key=([a-zA-Z0-9_-]+)/)[1]; + if (uid && (cookie?.includes('SESSDATA=') || access_key)) { + if (!data.account || !data.account[uid]) { + notifyMsg.push(`账号: ${uid} 写入鉴权成功!🎉`); + } else { + $.info(`账号: ${uid} 更新鉴权成功!🎉`); + } + data.account = { + ...data.account, [uid]: { + ...data.account?.[uid], + ...(cookie && { cookie }), + ...(access_key && { access_key }) + } + } + } else { + $.error(`写入授权失败, 数据缺失.`) + } + return $.setjson(data, $.name); +} + +function formatHeaders(h) { + return Object.keys(h).reduce((t, i) => (t[i.toLowerCase()] = h[i], t), {}) +} + +//Bark APP notify +async function BarkNotify(c, k, t, b) { for (let i = 0; i < 3; i++) { c.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) { c.log('✅Push success!'); break } else { c.log(`❌Push failed! >> ${s.message || s}`) } } }; + +// https://github.com/chavyleung/scripts/blob/master/Env.min.js +function Env(e, t) { class s { constructor(e) { this.env = e } send(e, t = "GET") { e = "string" == typeof e ? { url: e } : e; let s = this.get; "POST" === t && (s = this.post); const i = new Promise(((t, i) => { s.call(this, e, ((e, s, o) => { e ? i(e) : t(s) })) })); return e.timeout ? ((e, t = 1e3) => Promise.race([e, new Promise(((e, s) => { setTimeout((() => { s(new Error("请求超时")) }), t) }))]))(i, e.timeout) : i } get(e) { return this.send.call(this.env, e) } post(e) { return this.send.call(this.env, e, "POST") } } return new class { constructor(e, t) { this.logLevels = { debug: 0, info: 1, warn: 2, error: 3 }, this.logLevelPrefixs = { debug: "[DEBUG] ", info: "[INFO] ", warn: "[WARN] ", error: "[ERROR] " }, this.logLevel = "info", this.name = e, 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, t) } 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(e, t = null) { try { return JSON.parse(e) } catch { return t } } toStr(e, t = null, ...s) { try { return JSON.stringify(e, ...s) } catch { return t } } getjson(e, t) { let s = t; if (this.getdata(e)) try { s = JSON.parse(this.getdata(e)) } catch { } return s } setjson(e, t) { try { return this.setdata(JSON.stringify(e), t) } catch { return !1 } } getScript(e) { return new Promise((t => { this.get({ url: e }, ((e, s, i) => t(i))) })) } runScript(e, t) { return new Promise((s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); o = o ? 1 * o : 20, o = t && t.timeout ? t.timeout : o; const [r, a] = i.split("@"), n = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: e, mock_type: "cron", timeout: o }, headers: { "X-Key": r, Accept: "*/*" }, policy: "DIRECT", timeout: o }; this.post(n, ((e, t, i) => s(i))) })).catch((e => this.logErr(e))) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const e = this.path.resolve(this.dataFile), t = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(e), i = !s && this.fs.existsSync(t); if (!s && !i) return {}; { const i = s ? e : t; try { return JSON.parse(this.fs.readFileSync(i)) } catch (e) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const e = this.path.resolve(this.dataFile), t = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(e), i = !s && this.fs.existsSync(t), o = JSON.stringify(this.data); s ? this.fs.writeFileSync(e, o) : i ? this.fs.writeFileSync(t, o) : this.fs.writeFileSync(e, o) } } lodash_get(e, t, s) { const i = t.replace(/\[(\d+)\]/g, ".$1").split("."); let o = e; for (const e of i) if (o = Object(o)[e], void 0 === o) return s; return o } lodash_set(e, t, s) { return Object(e) !== e || (Array.isArray(t) || (t = t.toString().match(/[^.[\]]+/g) || []), t.slice(0, -1).reduce(((e, s, i) => Object(e[s]) === e[s] ? e[s] : e[s] = Math.abs(t[i + 1]) >> 0 == +t[i + 1] ? [] : {}), e)[t[t.length - 1]] = s), e } getdata(e) { let t = this.getval(e); if (/^@/.test(e)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(e), o = s ? this.getval(s) : ""; if (o) try { const e = JSON.parse(o); t = e ? this.lodash_get(e, i, "") : t } catch (e) { t = "" } } return t } setdata(e, t) { let s = !1; if (/^@/.test(t)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(t), r = this.getval(i), a = i ? "null" === r ? null : r || "{}" : "{}"; try { const t = JSON.parse(a); this.lodash_set(t, o, e), s = this.setval(JSON.stringify(t), i) } catch (t) { const r = {}; this.lodash_set(r, o, e), s = this.setval(JSON.stringify(r), i) } } else s = this.setval(e, t); return s } getval(e) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.read(e); case "Quantumult X": return $prefs.valueForKey(e); case "Node.js": return this.data = this.loaddata(), this.data[e]; default: return this.data && this.data[e] || null } } setval(e, t) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": return $persistentStore.write(e, t); case "Quantumult X": return $prefs.setValueForKey(e, t); case "Node.js": return this.data = this.loaddata(), this.data[t] = e, this.writedata(), !0; default: return this.data && this.data[t] || null } } initGotEnv(e) { 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, e && (e.headers = e.headers ? e.headers : {}, e && (e.headers = e.headers ? e.headers : {}, void 0 === e.headers.cookie && void 0 === e.headers.Cookie && void 0 === e.cookieJar && (e.cookieJar = this.ckjar))) } get(e, t = (() => { })) { switch (e.headers && (delete e.headers["Content-Type"], delete e.headers["Content-Length"], delete e.headers["content-type"], delete e.headers["content-length"]), e.params && (e.url += "?" + this.queryStr(e.params)), void 0 === e.followRedirect || e.followRedirect || ((this.isSurge() || this.isLoon()) && (e["auto-redirect"] = !1), this.isQuanX() && (e.opts ? e.opts.redirection = !1 : e.opts = { redirection: !1 })), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (e.headers = e.headers || {}, Object.assign(e.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(e, ((e, s, i) => { !e && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), t(e, s, i) })); break; case "Quantumult X": this.isNeedRewrite && (e.opts = e.opts || {}, Object.assign(e.opts, { hints: !1 })), $task.fetch(e).then((e => { const { statusCode: s, statusCode: i, headers: o, body: r, bodyBytes: a } = e; t(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (e => t(e && e.error || "UndefinedError"))); break; case "Node.js": let s = require("iconv-lite"); this.initGotEnv(e), this.got(e).on("redirect", ((e, t) => { try { if (e.headers["set-cookie"]) { const s = e.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), t.cookieJar = this.ckjar } } catch (e) { this.logErr(e) } })).then((e => { const { statusCode: i, statusCode: o, headers: r, rawBody: a } = e, n = s.decode(a, this.encoding); t(null, { status: i, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (e => { const { message: i, response: o } = e; t(i, o, o && s.decode(o.rawBody, this.encoding)) })); break } } post(e, t = (() => { })) { const s = e.method ? e.method.toLocaleLowerCase() : "post"; switch (e.body && e.headers && !e.headers["Content-Type"] && !e.headers["content-type"] && (e.headers["content-type"] = "application/x-www-form-urlencoded"), e.headers && (delete e.headers["Content-Length"], delete e.headers["content-length"]), void 0 === e.followRedirect || e.followRedirect || ((this.isSurge() || this.isLoon()) && (e["auto-redirect"] = !1), this.isQuanX() && (e.opts ? e.opts.redirection = !1 : e.opts = { redirection: !1 })), this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: this.isSurge() && this.isNeedRewrite && (e.headers = e.headers || {}, Object.assign(e.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient[s](e, ((e, s, i) => { !e && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), t(e, s, i) })); break; case "Quantumult X": e.method = s, this.isNeedRewrite && (e.opts = e.opts || {}, Object.assign(e.opts, { hints: !1 })), $task.fetch(e).then((e => { const { statusCode: s, statusCode: i, headers: o, body: r, bodyBytes: a } = e; t(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (e => t(e && e.error || "UndefinedError"))); break; case "Node.js": let i = require("iconv-lite"); this.initGotEnv(e); const { url: o, ...r } = e; this.got[s](o, r).then((e => { const { statusCode: s, statusCode: o, headers: r, rawBody: a } = e, n = i.decode(a, this.encoding); t(null, { status: s, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (e => { const { message: s, response: o } = e; t(s, o, o && i.decode(o.rawBody, this.encoding)) })); break } } time(e, t = null) { const s = t ? new Date(t) : new Date; let i = { "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(e) && (e = e.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let t in i) new RegExp("(" + t + ")").test(e) && (e = e.replace(RegExp.$1, 1 == RegExp.$1.length ? i[t] : ("00" + i[t]).substr(("" + i[t]).length))); return e } queryStr(e) { let t = ""; for (const s in e) { let i = e[s]; null != i && "" !== i && ("object" == typeof i && (i = JSON.stringify(i)), t += `${s}=${i}&`) } return t = t.substring(0, t.length - 1), t } msg(t = e, s = "", i = "", o = {}) { const r = e => { const { $open: t, $copy: s, $media: i, $mediaMime: o } = e; switch (typeof e) { case void 0: return e; case "string": switch (this.getEnv()) { case "Surge": case "Stash": default: return { url: e }; case "Loon": case "Shadowrocket": return e; case "Quantumult X": return { "open-url": e }; case "Node.js": return }case "object": switch (this.getEnv()) { case "Surge": case "Stash": case "Shadowrocket": default: { const r = {}; let a = e.openUrl || e.url || e["open-url"] || t; a && Object.assign(r, { action: "open-url", url: a }); let n = e["update-pasteboard"] || e.updatePasteboard || s; n && Object.assign(r, { action: "clipboard", text: n }); let h = e.mediaUrl || e["media-url"] || i; if (h) { let e, t; if (h.startsWith("http")); else if (h.startsWith("data:")) { const [s] = h.split(";"), [, i] = h.split(","); e = i, t = s.replace("data:", "") } else { e = h, t = (e => { const t = { JVBERi0: "application/pdf", R0lGODdh: "image/gif", R0lGODlh: "image/gif", iVBORw0KGgo: "image/png", "/9j/": "image/jpg" }; for (var s in t) if (0 === e.indexOf(s)) return t[s]; return null })(h) } Object.assign(r, { "media-url": h, "media-base64": e, "media-base64-mime": o ?? t }) } return Object.assign(r, { "auto-dismiss": e["auto-dismiss"], sound: e.sound }), r } case "Loon": { const s = {}; let o = e.openUrl || e.url || e["open-url"] || t; o && Object.assign(s, { openUrl: o }); let r = e.mediaUrl || e["media-url"] || i; return r && Object.assign(s, { mediaUrl: r }), console.log(JSON.stringify(s)), s } case "Quantumult X": { const o = {}; let r = e["open-url"] || e.url || e.openUrl || t; r && Object.assign(o, { "open-url": r }); let a = e.mediaUrl || e["media-url"] || i; a && Object.assign(o, { "media-url": a }); let n = e["update-pasteboard"] || e.updatePasteboard || s; return n && Object.assign(o, { "update-pasteboard": n }), console.log(JSON.stringify(o)), o } case "Node.js": return }default: return } }; if (!this.isMute) switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": default: $notification.post(t, s, i, r(o)); break; case "Quantumult X": $notify(t, s, i, r(o)); break; case "Node.js": break }if (!this.isMuteLog) { let e = ["", "============================"]; e.push(t), s && e.push(s), i && e.push(i), console.log(e.join("\n")), this.logs = this.logs.concat(e) } } debug(...e) { this.logLevels[this.logLevel] <= this.logLevels.debug && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.debug}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } info(...e) { this.logLevels[this.logLevel] <= this.logLevels.info && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.info}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } warn(...e) { this.logLevels[this.logLevel] <= this.logLevels.warn && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.warn}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } error(...e) { this.logLevels[this.logLevel] <= this.logLevels.error && (e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(`${this.logLevelPrefixs.error}${e.map((e => e ?? String(e))).join(this.logSeparator)}`)) } log(...e) { e.length > 0 && (this.logs = [...this.logs, ...e]), console.log(e.map((e => e ?? String(e))).join(this.logSeparator)) } logErr(e, t) { switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: this.log("", `❗️${this.name}, 错误!`, t, e); break; case "Node.js": this.log("", `❗️${this.name}, 错误!`, t, void 0 !== e.message ? e.message : e, e.stack); break } } wait(e) { return new Promise((t => setTimeout(t, e))) } done(e = {}) { const t = ((new Date).getTime() - this.startTime) / 1e3; switch (this.getEnv()) { case "Surge": case "Loon": case "Stash": case "Shadowrocket": case "Quantumult X": default: $done(e); break; case "Node.js": process.exit(1) } } }(e, t) } \ No newline at end of file diff --git a/Ctrip-DailyBonus/Ctrip.js b/Ctrip-DailyBonus/Ctrip.js new file mode 100644 index 0000000000..b20a3ccdcb --- /dev/null +++ b/Ctrip-DailyBonus/Ctrip.js @@ -0,0 +1,140 @@ +/******************************** +携程旅行签到脚本 + +支持多账号,支持Node.js,支持Bark推送。 +配置脚本后登陆"携程旅行"微信小程序或"携程网页版"(https://m.ctrip.com/)即可获取账号授权。多账号请勿"退出登陆"。 + +脚本作者:@NobyDa +更新时间:2024/05/09 +平台兼容:Surge / QuantumultX / Loon / Stash / Node.js +模块依赖(Node.js):iconv-lite / got@11.8.3 / tough-cookie +环境变量(Node.js):CTRIP_AUTH / CTRIP_BARK_KEY + +********************************* +Surge(iOS 5.9.0+/macOS 5.5.0+)模块: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/CtripDailyBonus.sgmodule + +********************************* +QuantumultX 任务仓库(Gallery)订阅: +https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +工具&分析->HTTP请求->右上角添加任务仓库->选择携程脚本添加定时任务和附加组件 + +*********************************/ + +const $ = new Env('CTRIP_DAILY_BONUS'); +const barkKey = $.isNode() && process.env['CTRIP_BARK_KEY'] || ''; // bark key +const notifyMsg = []; +const auth = ''; // '{"account":{"user1":{"auth":"xxx"},"user2":{"auth":"xxx"}}}' + +!(async () => { + $.logLevel = $.getdata(`@${$.name}.Debug`) == 'true' && 'debug' || 'info'; + const user = JSON.parse(auth || $.getdata($.name) || ($.isNode() && process.env['CTRIP_AUTH']) || '{}'); + const userNum = Object.keys(user.account || {}).length; + if (typeof $response !== 'undefined') { + const body = JSON.parse($response.body || '{}'); + return GetAuth(body, user); + } + if (userNum) { + const invalidUser = []; + for (const i in user.account) { + const text = [ + userNum > 1 && `[账号${notifyMsg.length + 1}(${i.slice(-4)})]`, + await Checkin(user.account[i].auth), + await Points(user.account[i].auth) + ].filter((v) => v).join(', '); + if (text.includes('登陆失效')) { + invalidUser.push(i) + } + $.info(text); + notifyMsg.push(text); + } + invalidUser.forEach((i) => delete user.account[i] && !$.isNode() && $.setjson(user, $.name)); + } else { + notifyMsg.push(`未获取授权!`); + } +})() + .catch((err) => notifyMsg.push(`错误: ${err}`) && $.error(err)) + .finally(async () => { + if (notifyMsg.length) { + $.msg(`携程旅行`, ``, notifyMsg.join('\n')) + } + if (barkKey) { + await BarkNotify($, barkKey, `携程旅行`, notifyMsg.join('\n')); + } + $.done({}); + }); + +function Checkin(key) { + const opts = { + url: 'https://m.ctrip.com/restapi/soa2/22769/signToday', + headers: { + "Content-Type": "application/json", + "User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/21E219 MicroMessenger/8.0.49' + }, + body: JSON.stringify({ head: { auth: key } }) + }; + $.debug(`Send checkin request:`, $.toStr(opts, 'error', null, 1)); + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive checkin request response:`, $.toStr(resp)) + resp.body = JSON.parse(resp.body?.startsWith('{') && resp.body || '{}'); + if (resp.body.code == 0) { + return '签到成功' + } else if (resp.body.code == 400001) { + return '已签过' + } else if (resp.body.code == 404001) { + return '登陆失效, 尝试移除账号...' + } else { + return `签到失败(${resp.body.message})` + } + }) + .catch((err) => { + $.error(`Send checkin request error:`, err); + return `签到错误` + }) +} + +function Points(key) { + const opts = { + url: 'https://m.ctrip.com/restapi/soa2/15634/json/getPointsOrderUserInfo', + headers: { + "Content-Type": "application/json", + "User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/21E219 MicroMessenger/8.0.49' + }, + body: JSON.stringify({ needUserInfo: true, head: { auth: key } }) + }; + $.debug(`Send points request:`, $.toStr(opts, 'error', null, 1)); + return $.http.post(opts) + .then((resp) => { + $.debug(`Receive points request response:`, $.toStr(resp)) + resp.body = JSON.parse(resp.body?.startsWith('{') && resp.body || '{}'); + if (resp.body.isLogin) { + return `总积分: ${resp.body.availableCredits || 0}` + } + }) + .catch((err) => { + $.error(`Send points request error:`, err) + return `总积分: 查询错误` + }) +} + +function GetAuth(body, data) { + if (body.ticket && body.uid) { + if (!data.account || !data.account[body.uid]) { + notifyMsg.push(`账号: ${body.uid}\n写入授权成功!`); + } else { + $.info(`账号: ${body.uid}\n更新授权成功!`); + } + data.account = { ...data.account, ...{ [body.uid]: { auth: body.ticket } } }; + } else { + $.error(`写入授权失败, 授权值缺失.`) + } + return $.setjson(data, $.name); +} + +//Bark APP notify +async function BarkNotify(c, k, t, b) { for (let i = 0; i < 3; i++) { c.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) { c.log('✅Push success!'); break } else { c.log(`❌Push failed! >> ${s.message || s}`) } } }; + +// https://github.com/chavyleung/scripts/blob/master/Env.min.js +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, i) => { s.call(this, t, ((t, s, o) => { t ? i(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.logLevels = { debug: 0, info: 1, warn: 2, error: 3 }, this.logLevelPrefixs = { debug: "[DEBUG] ", info: "[INFO] ", warn: "[WARN] ", error: "[ERROR] " }, this.logLevel = "info", 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, ...s) { try { return JSON.stringify(t, ...s) } catch { return e } } getjson(t, e) { let s = e; if (this.getdata(t)) 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, i) => e(i))) })) } runScript(t, e) { return new Promise((s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); o = o ? 1 * o : 20, o = e && e.timeout ? e.timeout : o; const [r, a] = i.split("@"), n = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: o }, headers: { "X-Key": r, Accept: "*/*" }, timeout: o }; this.post(n, ((t, e, i) => s(i))) })).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), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; try { return JSON.parse(this.fs.readFileSync(i)) } 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), i = !s && this.fs.existsSync(e), o = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(e, o) : this.fs.writeFileSync(t, o) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let o = t; for (const t of i) if (o = Object(o)[t], void 0 === o) return s; return o } lodash_set(t, e, s) { return Object(t) !== t || (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce(((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}), t)[e[e.length - 1]] = s), t } getdata(t) { let e = this.getval(t); if (/^@/.test(t)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), o = s ? this.getval(s) : ""; if (o) try { const t = JSON.parse(o); e = t ? this.lodash_get(t, i, "") : e } catch (t) { e = "" } } return e } setdata(t, e) { let s = !1; if (/^@/.test(e)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(e), r = this.getval(i), a = i ? "null" === r ? null : r || "{}" : "{}"; try { const e = JSON.parse(a); this.lodash_set(e, o, t), s = this.setval(JSON.stringify(e), i) } catch (e) { const r = {}; this.lodash_set(r, o, t), s = this.setval(JSON.stringify(r), i) } } 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 : {}, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.cookie && 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)), void 0 === t.followRedirect || t.followRedirect || ((this.isSurge() || this.isLoon()) && (t["auto-redirect"] = !1), this.isQuanX() && (t.opts ? t.opts.redirection = !1 : t.opts = { redirection: !1 })), 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, i) => { !t && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), e(t, s, i) })); 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: i, headers: o, body: r, bodyBytes: a } = t; e(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (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: i, statusCode: o, headers: r, rawBody: a } = t, n = s.decode(a, this.encoding); e(null, { status: i, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (t => { const { message: i, response: o } = t; e(i, o, o && s.decode(o.rawBody, this.encoding)) })); break } } 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"]), void 0 === t.followRedirect || t.followRedirect || ((this.isSurge() || this.isLoon()) && (t["auto-redirect"] = !1), this.isQuanX() && (t.opts ? t.opts.redirection = !1 : t.opts = { redirection: !1 })), 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, i) => { !t && s && (s.body = i, s.statusCode = s.status ? s.status : s.statusCode, s.status = s.statusCode), e(t, s, i) })); 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: i, headers: o, body: r, bodyBytes: a } = t; e(null, { status: s, statusCode: i, headers: o, body: r, bodyBytes: a }, r, a) }), (t => e(t && t.error || "UndefinedError"))); break; case "Node.js": let i = require("iconv-lite"); this.initGotEnv(t); const { url: o, ...r } = t; this.got[s](o, r).then((t => { const { statusCode: s, statusCode: o, headers: r, rawBody: a } = t, n = i.decode(a, this.encoding); e(null, { status: s, statusCode: o, headers: r, rawBody: a, body: n }, n) }), (t => { const { message: s, response: o } = t; e(s, o, o && i.decode(o.rawBody, this.encoding)) })); break } } time(t, e = null) { const s = e ? new Date(e) : new Date; let i = { "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 i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length))); return t } queryStr(t) { let e = ""; for (const s in t) { let i = t[s]; null != i && "" !== i && ("object" == typeof i && (i = JSON.stringify(i)), e += `${s}=${i}&`) } return e = e.substring(0, e.length - 1), e } msg(e = t, s = "", i = "", o = {}) { const r = t => { const { $open: e, $copy: s, $media: i, $mediaMime: o } = 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: { const r = {}; let a = t.openUrl || t.url || t["open-url"] || e; a && Object.assign(r, { action: "open-url", url: a }); let n = t["update-pasteboard"] || t.updatePasteboard || s; if (n && Object.assign(r, { action: "clipboard", text: n }), i) { let t, e, s; if (i.startsWith("http")) t = i; else if (i.startsWith("data:")) { const [t] = i.split(";"), [, o] = i.split(","); e = o, s = t.replace("data:", "") } else { e = i, s = (t => { const e = { JVBERi0: "application/pdf", R0lGODdh: "image/gif", R0lGODlh: "image/gif", iVBORw0KGgo: "image/png", "/9j/": "image/jpg" }; for (var s in e) if (0 === t.indexOf(s)) return e[s]; return null })(i) } Object.assign(r, { "media-url": t, "media-base64": e, "media-base64-mime": o ?? s }) } return Object.assign(r, { "auto-dismiss": t["auto-dismiss"], sound: t.sound }), r } case "Loon": { const s = {}; let o = t.openUrl || t.url || t["open-url"] || e; o && Object.assign(s, { openUrl: o }); let r = t.mediaUrl || t["media-url"]; return i?.startsWith("http") && (r = i), r && Object.assign(s, { mediaUrl: r }), console.log(JSON.stringify(s)), s } case "Quantumult X": { const o = {}; let r = t["open-url"] || t.url || t.openUrl || e; r && Object.assign(o, { "open-url": r }); let a = t["media-url"] || t.mediaUrl; i?.startsWith("http") && (a = i), a && Object.assign(o, { "media-url": a }); let n = t["update-pasteboard"] || t.updatePasteboard || s; return n && Object.assign(o, { "update-pasteboard": n }), console.log(JSON.stringify(o)), o } 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, i, r(o)); break; case "Quantumult X": $notify(e, s, i, r(o)); break; case "Node.js": break }if (!this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } debug(...t) { this.logLevels[this.logLevel] <= this.logLevels.debug && (t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(`${this.logLevelPrefixs.debug}${t.map((t => t ?? String(t))).join(this.logSeparator)}`)) } info(...t) { this.logLevels[this.logLevel] <= this.logLevels.info && (t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(`${this.logLevelPrefixs.info}${t.map((t => t ?? String(t))).join(this.logSeparator)}`)) } warn(...t) { this.logLevels[this.logLevel] <= this.logLevels.warn && (t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(`${this.logLevelPrefixs.warn}${t.map((t => t ?? String(t))).join(this.logSeparator)}`)) } error(...t) { this.logLevels[this.logLevel] <= this.logLevels.error && (t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(`${this.logLevelPrefixs.error}${t.map((t => t ?? String(t))).join(this.logSeparator)}`)) } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.map((t => t ?? String(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}, 错误!`, e, t); break; case "Node.js": this.log("", `❗️${this.name}, 错误!`, e, void 0 !== t.message ? t.message : t, t.stack); break } } wait(t) { return new Promise((e => setTimeout(e, t))) } done(t = {}) { const e = ((new Date).getTime() - this.startTime) / 1e3; switch (this.log("", `🔔${this.name}, 结束! 🕛 ${e} 秒`), 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) } \ No newline at end of file diff --git a/Debug/Real-time-debug.js b/Debug/Real-time-debug.js new file mode 100644 index 0000000000..7abff11a82 --- /dev/null +++ b/Debug/Real-time-debug.js @@ -0,0 +1,64 @@ +/* + * LAN script real-time debug + * + * PC: Use "Live Server" plugin in VSCode to create a LAN backend + * APP: After backend address is modified in script, use this script as script path + */ + +!async function() { + const _$ = new nobyda(); + const _r = await new Promise(e => { + _$.get({ + url: 'http://192.168.1.66:5500/debug.js' // LAN backend address + }, (t, c, o) => { + if (c && c.status == 200 && o) { + _$.write(o, 'Real-time-debug'); + e(o); + } + }); + setTimeout(e, 100); + }); + if (_r) { + console.log("🌐 Run local network script..."); + eval(_r); + } else { + console.log("⚠️ Run cache script..."); + eval(_$.read('Real-time-debug')) + } + + function nobyda() { + const isSurge = typeof $httpClient != "undefined"; + const isQuanX = typeof $task != "undefined"; + const adapterStatus = (response) => { + if (response) { + if (response.status) { + response["statusCode"] = response.status + } else if (response.statusCode) { + response["status"] = response.statusCode + } + } + return response + }; + this.write = (value, key) => { + if (isQuanX) return $prefs.setValueForKey(value, key); + if (isSurge) return $persistentStore.write(value, key); + }; + this.read = (key) => { + if (isQuanX) return $prefs.valueForKey(key); + if (isSurge) return $persistentStore.read(key); + }; + this.get = (options, callback) => { + if (isQuanX) { + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + $httpClient.get(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + }; + this.done = (value = {}) => $done(value) + } +}(); \ No newline at end of file diff --git a/Disney/DisneyRating.js b/Disney/DisneyRating.js new file mode 100644 index 0000000000..8ea74acf29 --- /dev/null +++ b/Disney/DisneyRating.js @@ -0,0 +1,253 @@ +/********************************* +Disney+ 显示IMDb评分 / 烂番茄评分 / 豆瓣评分 + +脚本作者: @NobyDa +脚本兼容: Surge、QuantumultX、Loon +系统兼容: iOS14+ +更新时间: 2024/05/04 +脚本参考: https://github.com/yichahucha/surge/blob/master/nf_rating.js + +Surge模块: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/DisneyRating.sgmodule + +QuantumultX重写引用: +https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/DisneyRating.snippet + +*********************************/ + +const $tool = new Tool(); +const consoleLog = false; +let obj = $response.body; +let IMDbApikeys = IMDbApikeyList(); +let IMDbApikey = $tool.read("ImdbApikeyCacheKey"); +if (!IMDbApikey) { + updateIMDbApikey(); +} + +const requestRatings = async () => { + if (consoleLog) console.log("Disney Original Body:\n" + obj); + obj = JSON.parse(obj); + const sliced = obj?.data?.page?.actions?.[0]?.internalTitle?.split(' - '); + let title = sliced?.[0] || obj?.data?.page?.visuals?.title; + if (title) { + title = title.replace(/.+?:\s|\s?\(.+?\)\s?/g,''); + } else { + throw 'NO TITLE'; + } + const year = obj?.data?.page?.visuals?.metastringParts?.releaseYearRange?.startYear; + const type = (sliced?.[1]?.startsWith('s') && 'series') || (sliced?.[1] == 'movie' && 'movie'); + const IMDb = await requestIMDbRating(title, year, type); + const Douban = await requestDoubanRating(IMDb.id); + const IMDbrating = IMDb.msg.rating; + const tomatoes = IMDb.msg.tomatoes; + const country = IMDb.msg.country; + // const awards = IMDb.msg.awards; + const doubanRating = Douban.rating; + // const message = `${awards.length > 0 ? awards + "\n" : ""}${country}\n${IMDbrating}\n${doubanRating}${tomatoes.length > 0 ? "\n" + tomatoes + "\n" : "\n"}`; + return { country, tomatoes, IMDbrating, doubanRating }; +} + +requestRatings() + .then(data => { + if (obj?.data?.page?.visuals) { + obj.data.page.visuals.promoLabel = { + promoLabelType: "generic", + header: `${data.country}${data.tomatoes ? `\n${data.tomatoes}` : ``}`, + subheader: `${data.IMDbrating}${data.doubanRating ? `\n${data.doubanRating}` : ``}` + } + } + if (consoleLog) console.log("Disney Modified Body:\n" + JSON.stringify(obj)); + }) + .catch(error => console.log(`ERROR: ${error}`)) + .finally(() => $done({ body: typeof obj == 'object' ? JSON.stringify(obj) : obj })); + +function requestDoubanRating(imdbId) { + return new Promise(function (resolve, reject) { + const url = `https://www.douban.com/search?cat=1002&q=${imdbId}`; + if (consoleLog) console.log("Disney Douban Rating URL:\n" + url); + $tool.get(url, function (error, response, data) { + if (!error) { + if (consoleLog) console.log("Disney Douban Rating Data:\n" + data); + if (response.status == 200) { + const rating = get_douban_rating_message(data); + resolve({ rating }); + } else { + resolve({}); + } + } else { + console.log("Disney Douban Rating Error: " + error); + resolve({}); + } + }); + }); +} + +function requestIMDbRating(title, year, type) { + return new Promise(function (resolve, reject) { + let url = "https://www.omdbapi.com/?t=" + encodeURIComponent(title) + "&apikey=" + IMDbApikey; + if (year) url += "&y=" + year; + if (type) url += "&type=" + type; + if (consoleLog) console.log("Disney IMDb Rating URL:\n" + url); + $tool.get(url, function (error, response, data) { + if (!error) { + if (consoleLog) console.log("Disney IMDb Rating Data:\n" + data); + if (response.status == 200) { + const obj = JSON.parse(data); + if (obj.Response == "True") { + const id = obj.imdbID; + const msg = get_IMDb_message(obj); + resolve({ id, msg }); + } else { + reject(`Title [${title}] IMDb data not found`); + } + } else if (response.status == 401) { + if (IMDbApikeys.length > 1) { + updateIMDbApikey(); + requestIMDbRating(title, year, type); + } else { + reject(`IMDb Key invalid`); + } + } else { + reject(`Unknown status: ${response.status}, Data: ${data}`); + } + } else { + reject(`IMDB data response failed: ${error}`); + } + }); + }); +} + +function updateIMDbApikey() { + if (IMDbApikey) IMDbApikeys.splice(IMDbApikeys.indexOf(IMDbApikey), 1); + const index = Math.floor(Math.random() * IMDbApikeys.length); + IMDbApikey = IMDbApikeys[index]; + $tool.write(IMDbApikey, "ImdbApikeyCacheKey"); +} + +function get_IMDb_message(data) { + let rating_message = "IMDb: ⭐️ N/A"; + let tomatoes_message = ""; + let country_message = ""; + let ratings = data.Ratings; + let awards_message = ""; + if (data.Awards && data.Awards != "N/A") { + awards_message = "🏆 " + data.Awards; + } + if (ratings.length > 0) { + const imdb_source = ratings[0]["Source"]; + if (imdb_source == "Internet Movie Database") { + const imdb_votes = data.imdbVotes; + const imdb_rating = ratings[0]["Value"]; + rating_message = "IMDb: ⭐️ " + imdb_rating + " " + imdb_votes; + if (data.Type == "movie") { + if (ratings.length > 1) { + const source = ratings[1]["Source"]; + if (source == "Rotten Tomatoes") { + const tomatoes = ratings[1]["Value"]; + tomatoes_message = "Tomatoes: 🍅 " + tomatoes; + } + } + } + } + } + country_message = get_country_message(data.Country); + return { rating: rating_message, tomatoes: tomatoes_message, country: country_message, awards: awards_message } +} + +function get_douban_rating_message(data) { + const s = data.replace(/\n| |&#\d{2}/g, '') + .match(/\[(\u7535\u5f71|\u7535\u89c6\u5267)\].+?subject-cast\">.+?<\/span>/g); + const average = s ? s[0].split(/">(\d\.\d) { + emoji_country += countryEmoji(item) + " " + item + ", "; + }); + return emoji_country.slice(0, -2); +} + +// function errorTip() { +// return { noData: "⭐️ N/A", error: "❌ N/A" } +// } + +function IMDbApikeyList() { + const apikeys = [ + "f75e0253", "d8bb2d6b", + "ae64ce8d", "7218d678", + "b2650e38", "8c4a29ab", + "9bd135c2", "953dbabe", + "1a66ef12", "3e7ea721", + "457fc4ff", "d2131426", + "9cc1a9b7", "e53c2c11", + "f6dfce0e", "b9db622f", + "e6bde2b9", "d324dbab", + "d7904fa3", "aeaf88b9", + "4e89234e",]; + return apikeys; +} + +function countryEmoji(name) { const emojiMap = { "Chequered": "🏁", "Triangular": "🚩", "Crossed": "🎌", "Black": "🏴", "White": "🏳", "Rainbow": "🏳️‍🌈", "Pirate": "🏴‍☠️", "Ascension Island": "🇦🇨", "Andorra": "🇦🇩", "United Arab Emirates": "🇦🇪", "Afghanistan": "🇦🇫", "Antigua & Barbuda": "🇦🇬", "Anguilla": "🇦🇮", "Albania": "🇦🇱", "Armenia": "🇦🇲", "Angola": "🇦🇴", "Antarctica": "🇦🇶", "Argentina": "🇦🇷", "American Samoa": "🇦🇸", "Austria": "🇦🇹", "Australia": "🇦🇺", "Aruba": "🇦🇼", "Åland Islands": "🇦🇽", "Azerbaijan": "🇦🇿", "Bosnia & Herzegovina": "🇧🇦", "Barbados": "🇧🇧", "Bangladesh": "🇧🇩", "Belgium": "🇧🇪", "Burkina Faso": "🇧🇫", "Bulgaria": "🇧🇬", "Bahrain": "🇧🇭", "Burundi": "🇧🇮", "Benin": "🇧🇯", "St. Barthélemy": "🇧🇱", "Bermuda": "🇧🇲", "Brunei": "🇧🇳", "Bolivia": "🇧🇴", "Caribbean Netherlands": "🇧🇶", "Brazil": "🇧🇷", "Bahamas": "🇧🇸", "Bhutan": "🇧🇹", "Bouvet Island": "🇧🇻", "Botswana": "🇧🇼", "Belarus": "🇧🇾", "Belize": "🇧🇿", "Canada": "🇨🇦", "Cocos (Keeling) Islands": "🇨🇨", "Congo - Kinshasa": "🇨🇩", "Congo": "🇨🇩", "Central African Republic": "🇨🇫", "Congo - Brazzaville": "🇨🇬", "Switzerland": "🇨🇭", "Côte d’Ivoire": "🇨🇮", "Cook Islands": "🇨🇰", "Chile": "🇨🇱", "Cameroon": "🇨🇲", "China": "🇨🇳", "Colombia": "🇨🇴", "Clipperton Island": "🇨🇵", "Costa Rica": "🇨🇷", "Cuba": "🇨🇺", "Cape Verde": "🇨🇻", "Curaçao": "🇨🇼", "Christmas Island": "🇨🇽", "Cyprus": "🇨🇾", "Czechia": "🇨🇿", "Czech Republic": "🇨🇿", "Germany": "🇩🇪", "Diego Garcia": "🇩🇬", "Djibouti": "🇩🇯", "Denmark": "🇩🇰", "Dominica": "🇩🇲", "Dominican Republic": "🇩🇴", "Algeria": "🇩🇿", "Ceuta & Melilla": "🇪🇦", "Ecuador": "🇪🇨", "Estonia": "🇪🇪", "Egypt": "🇪🇬", "Western Sahara": "🇪🇭", "Eritrea": "🇪🇷", "Spain": "🇪🇸", "Ethiopia": "🇪🇹", "European Union": "🇪🇺", "Finland": "🇫🇮", "Fiji": "🇫🇯", "Falkland Islands": "🇫🇰", "Micronesia": "🇫🇲", "Faroe Islands": "🇫🇴", "France": "🇫🇷", "Gabon": "🇬🇦", "United Kingdom": "🇬🇧", "UK": "🇬🇧", "Grenada": "🇬🇩", "Georgia": "🇬🇪", "French Guiana": "🇬🇫", "Guernsey": "🇬🇬", "Ghana": "🇬🇭", "Gibraltar": "🇬🇮", "Greenland": "🇬🇱", "Gambia": "🇬🇲", "Guinea": "🇬🇳", "Guadeloupe": "🇬🇵", "Equatorial Guinea": "🇬🇶", "Greece": "🇬🇷", "South Georgia & South Sandwich Is lands": "🇬🇸", "Guatemala": "🇬🇹", "Guam": "🇬🇺", "Guinea-Bissau": "🇬🇼", "Guyana": "🇬🇾", "Hong Kong SAR China": "🇭🇰", "Hong Kong": "🇭🇰", "Heard & McDonald Islands": "🇭🇲", "Honduras": "🇭🇳", "Croatia": "🇭🇷", "Haiti": "🇭🇹", "Hungary": "🇭🇺", "Canary Islands": "🇮🇨", "Indonesia": "🇮🇩", "Ireland": "🇮🇪", "Israel": "🇮🇱", "Isle of Man": "🇮🇲", "India": "🇮🇳", "British Indian Ocean Territory": "🇮🇴", "Iraq": "🇮🇶", "Iran": "🇮🇷", "Iceland": "🇮🇸", "Italy": "🇮🇹", "Jersey": "🇯🇪", "Jamaica": "🇯🇲", "Jordan": "🇯🇴", "Japan": "🇯🇵", "Kenya": "🇰🇪", "Kyrgyzstan": "🇰🇬", "Cambodia": "🇰🇭", "Kiribati": "🇰🇮", "Comoros": "🇰🇲", "St. Kitts & Nevis": "🇰🇳", "North Korea": "🇰🇵", "South Korea": "🇰🇷", "Kuwait": "🇰🇼", "Cayman Islands": "🇰🇾", "Kazakhstan": "🇰🇿", "Laos": "🇱🇦", "Lebanon": "🇱🇧", "St. Lucia": "🇱🇨", "Liechtenstein": "🇱🇮", "Sri Lanka": "🇱🇰", "Liberia": "🇱🇷", "Lesotho": "🇱🇸", "Lithuania": "🇱🇹", "Luxembourg": "🇱🇺", "Latvia": "🇱🇻", "Libya": "🇱🇾", "Morocco": "🇲🇦", "Monaco": "🇲🇨", "Moldova": "🇲🇩", "Montenegro": "🇲🇪", "St. Martin": "🇲🇫", "Madagascar": "🇲🇬", "Marshall Islands": "🇲🇭", "North Macedonia": "🇲🇰", "Mali": "🇲🇱", "Myanmar (Burma)": "🇲🇲", "Mongolia": "🇲🇳", "Macau Sar China": "🇲🇴", "Northern Mariana Islands": "🇲🇵", "Martinique": "🇲🇶", "Mauritania": "🇲🇷", "Montserrat": "🇲🇸", "Malta": "🇲🇹", "Mauritius": "🇲🇺", "Maldives": "🇲🇻", "Malawi": "🇲🇼", "Mexico": "🇲🇽", "Malaysia": "🇲🇾", "Mozambique": "🇲🇿", "Namibia": "🇳🇦", "New Caledonia": "🇳🇨", "Niger": "🇳🇪", "Norfolk Island": "🇳🇫", "Nigeria": "🇳🇬", "Nicaragua": "🇳🇮", "Netherlands": "🇳🇱", "Norway": "🇳🇴", "Nepal": "🇳🇵", "Nauru": "🇳🇷", "Niue": "🇳🇺", "New Zealand": "🇳🇿", "Oman": "🇴🇲", "Panama": "🇵🇦", "Peru": "🇵🇪", "French Polynesia": "🇵🇫", "Papua New Guinea": "🇵🇬", "Philippines": "🇵🇭", "Pakistan": "🇵🇰", "Poland": "🇵🇱", "St. Pierre & Miquelon": "🇵🇲", "Pitcairn Islands": "🇵🇳", "Puerto Rico": "🇵🇷", "Palestinian Territories": "🇵🇸", "Portugal": "🇵🇹", "Palau": "🇵🇼", "Paraguay": "🇵🇾", "Qatar": "🇶🇦", "Réunion": "🇷🇪", "Romania": "🇷🇴", "Serbia": "🇷🇸", "Russia": "🇷🇺", "Rwanda": "🇷🇼", "Saudi Arabia": "🇸🇦", "Solomon Islands": "🇸🇧", "Seychelles": "🇸🇨", "Sudan": "🇸🇩", "Sweden": "🇸🇪", "Singapore": "🇸🇬", "St. Helena": "🇸🇭", "Slovenia": "🇸🇮", "Svalbard & Jan Mayen": "🇸🇯", "Slovakia": "🇸🇰", "Sierra Leone": "🇸🇱", "San Marino": "🇸🇲", "Senegal": "🇸🇳", "Somalia": "🇸🇴", "Suriname": "🇸🇷", "South Sudan": "🇸🇸", "São Tomé & Príncipe": "🇸🇹", "El Salvador": "🇸🇻", "Sint Maarten": "🇸🇽", "Syria": "🇸🇾", "Swaziland": "🇸🇿", "Tristan Da Cunha": "🇹🇦", "Turks & Caicos Islands": "🇹🇨", "Chad": "🇹🇩", "French Southern Territories": "🇹🇫", "Togo": "🇹🇬", "Thailand": "🇹🇭", "Tajikistan": "🇹🇯", "Tokelau": "🇹🇰", "Timor-Leste": "🇹🇱", "Turkmenistan": "🇹🇲", "Tunisia": "🇹🇳", "Tonga": "🇹🇴", "Turkey": "🇹🇷", "Trinidad & Tobago": "🇹🇹", "Tuvalu": "🇹🇻", "Taiwan": "🇨🇳", "Tanzania": "🇹🇿", "Ukraine": "🇺🇦", "Uganda": "🇺🇬", "U.S. Outlying Islands": "🇺🇲", "United Nations": "🇺🇳", "United States": "🇺🇸", "USA": "🇺🇸", "Uruguay": "🇺🇾", "Uzbekistan": "🇺🇿", "Vatican City": "🇻🇦", "St. Vincent & Grenadines": "🇻🇨", "Venezuela": "🇻🇪", "British Virgin Islands": "🇻🇬", "U.S. Virgin Islands": "🇻🇮", "Vietnam": "🇻🇳", "Vanuatu": "🇻🇺", "Wallis & Futuna": "🇼🇫", "Samoa": "🇼🇸", "Kosovo": "🇽🇰", "Yemen": "🇾🇪", "Mayotte": "🇾🇹", "South Africa": "🇿🇦", "Zambia": "🇿🇲", "Zimbabwe": "🇿🇼", "England": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "Scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "Wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", }; return emojiMap[name] ? emojiMap[name] : emojiMap["Chequered"] } + +function Tool() { + _node = (() => { + if (typeof require == "function") { + const request = require('request') + return ({ request }) + } else { + return (null) + } + })() + _isSurge = typeof $httpClient != "undefined" + _isQuanX = typeof $task != "undefined" + this.isSurge = _isSurge + this.isQuanX = _isQuanX + this.isResponse = typeof $response != "undefined" + this.notify = (title, subtitle, message) => { + if (_isQuanX) $notify(title, subtitle, message) + if (_isSurge) $notification.post(title, subtitle, message) + if (_node) console.log(JSON.stringify({ title, subtitle, message })); + } + this.write = (value, key) => { + if (_isQuanX) return $prefs.setValueForKey(value, key) + if (_isSurge) return $persistentStore.write(value, key) + } + this.read = (key) => { + if (_isQuanX) return $prefs.valueForKey(key) + if (_isSurge) return $persistentStore.read(key) + } + this.get = (options, callback) => { + if (_isQuanX) { + if (typeof options == "string") options = { url: options } + options["method"] = "GET" + $task.fetch(options).then(response => { callback(null, _status(response), response.body) }, reason => callback(reason.error, null, null)) + } + if (_isSurge) $httpClient.get(options, (error, response, body) => { callback(error, _status(response), body) }) + if (_node) _node.request(options, (error, response, body) => { callback(error, _status(response), body) }) + } + this.post = (options, callback) => { + if (_isQuanX) { + if (typeof options == "string") options = { url: options } + options["method"] = "POST" + $task.fetch(options).then(response => { callback(null, _status(response), response.body) }, reason => callback(reason.error, null, null)) + } + if (_isSurge) $httpClient.post(options, (error, response, body) => { callback(error, _status(response), body) }) + if (_node) _node.request.post(options, (error, response, body) => { callback(error, _status(response), body) }) + } + _status = (response) => { + if (response) { + if (response.status) { + response["statusCode"] = response.status + } else if (response.statusCode) { + response["status"] = response.statusCode + } + } + return response + } +} diff --git a/IPA-Installer/IPA-Installer-JSBox.js b/IPA-Installer/IPA-Installer-JSBox.js new file mode 100644 index 0000000000..1284aaac21 --- /dev/null +++ b/IPA-Installer/IPA-Installer-JSBox.js @@ -0,0 +1,144 @@ +/* + * IPA-installer JSBox script. This script is not available stand alone, checkout the demo from TG channel @NobyDa + * + * Modified from https://github.com/axelburks/JSBox/blob/master/IPA%20Installer.js by @NobyDa + */ + +var port_number = 8070 +var plist_url = `itms-services://?action=download-manifest&url=https://nobyda.app/install%3Fclient%3Djsbox%26url%3Dhttp%253A%252F%252F127.0.0.1%253A${port_number}%252Fdownload%253Fpath%253D%25252Fapp.ipa` + +$app.strings = { + "en": { + "starterror": "Not support running in this way", + "ftypeerror": " is not ipa file", + "installtitle": "Installing...", + "installmsg": "\n\nYou can check on Homescreen.\nPlease tap \"Done\" button after finished", + "inerrtitle": "IPA file import error", + "inerrmsg": "Please rerun the script" + }, + "zh-Hans": { + "starterror": "不支持此方式运行!", + "ftypeerror": " 非 ipa 文件!", + "installtitle": "正在安装…", + "installmsg": "\n\n可前往桌面查看安装进度\n完成后请点击\"Done\"按钮", + "inerrtitle": "IPA文件导入失败", + "inerrmsg": "请重新运行此脚本" + } +} + +// 从应用内启动 +if ($app.env == $env.app) { + $drive.open({ + handler: function(data) { + fileCheck(data) + } + }) +} +// 从 Action Entension 启动 +else if ($app.env == $env.action) { + fileCheck($context.data) +} + +else { + $ui.error($l10n("starterror")) + delayClose(2) +} + + +function startServer(port) { + $http.startServer({ + port: port, + path: "", + handler: function(result) { + console.info(result.url) + } + }) +} + +function fileCheck(data) { + if (data && data.fileName) { + var fileName = data.fileName; + if (fileName.indexOf(".ipa") == -1) { + $ui.error(fileName + $l10n("ftypeerror")) + delayClose(2) + } else { + install(fileName, data); + } + } +} + +function install(fileName, file) { + var result = $file.write({ + data: file, + path: "app.ipa" + }) + if (result) { + startServer(port_number) + $location.startUpdates({ + handler: function(resp) { + console.info(resp.lat + " " + resp.lng + " " + resp.alt) + } + }) + var preResult = $app.openURL(plist_url); + if (preResult) { + $ui.alert({ + title: $l10n("installtitle"), + message: "\n" + fileName + $l10n("installmsg"), + actions: [{ + title: "Cancel", + style: "Cancel", + handler: function() { + $http.stopServer() + $file.delete("app.ipa") + delayClose(0.2) + } + }, + { + title: "Done", + handler: function() { + $http.stopServer() + $file.delete("app.ipa") + delayClose(0.2) + } + }] + }) + } else { + $ui.alert({ + title: "Open itms-services scheme failed", + message: "Please rerun the script or restart device", + actions: [ + { + title: "OK", + handler: function() { + delayClose(0.2) + } + }] + }) + } + } else { + $ui.alert({ + title: $l10n("inerrtitle"), + message: $l10n("inerrmsg"), + actions: [{ + title: "OK", + style: "Cancel", + handler: function() { + delayClose(0.2) + } + }] + }) + } +} + +function delayClose(time) { + $location.stopUpdates() + $thread.main({ + delay: time, + handler: function() { + if ($app.env == $env.action || $app.env == $env.safari) { + $context.close() + } + $app.close() + } + }) +} diff --git a/IPA-Installer/IPA-Installer-Pythonista.py b/IPA-Installer/IPA-Installer-Pythonista.py new file mode 100644 index 0000000000..a929058fe7 --- /dev/null +++ b/IPA-Installer/IPA-Installer-Pythonista.py @@ -0,0 +1,74 @@ +# IPA-installer pythonista script. This script is not available stand alone, checkout the demo from TG channel @NobyDa +# +# Modified from https://github.com/axelburks/Pythonista/blob/master/IPA%20Installer.py by @NobyDa + +import os, appex, console, shutil, http.server, webbrowser, time +from os import path +from threading import Thread + +port_number = 8090 +plist_url = f'itms-services://?action=download-manifest&url=https://nobyda.app/install%3Fclient%3Dpythonista%26url%3Dhttp%253A%252F%252F127.0.0.1%253A{port_number}%252Fipa%252Fapp.ipa' +save_dir = path.expanduser('./ipa') +if not path.exists(save_dir): + os.makedirs(save_dir) + +httpd = None +def startServer(port): + Handler = http.server.SimpleHTTPRequestHandler + + global httpd + httpd = http.server.HTTPServer(("", port), Handler) + + print("Start server at port", port) + httpd.serve_forever() + +def start(port): + thread = Thread(target=startServer, args=[port]) + thread.start() + + startTime = int(time.time()) + while not httpd: + if int(time.time()) > startTime + 60: + print("Time out") + break + return httpd + +def stop(): + if httpd: + httpd.shutdown() + +def main(): + if appex.is_running_extension(): + get_path = appex.get_file_path() + file_name = path.basename(get_path) + file_ext = path.splitext(file_name)[-1] + if file_ext == '.ipa': + dstpath = path.join(save_dir, 'app.ipa') + try: + shutil.copy(get_path, dstpath) + + except Exception as eer: + print(eer) + console.hud_alert('导入失败!','error',1) + start(port_number) + if httpd: + webbrowser.open(plist_url) + try: + finish = console.alert(file_name, '\n正在安装...请返回桌面查看进度...\n\n安装完成后请返回点击已完成','已完成', hide_cancel_button=False) + if finish == 1: + stop() + shutil.rmtree('./ipa') + print("Server stopped") + except: + stop() + shutil.rmtree('./ipa') + print("Cancelled") + appex.finish() + else: + console.hud_alert('非 ipa 文件无法导入安装', 'error', 2) + appex.finish() + else: + console.hud_alert('请在分享扩展中打开本脚本','error',2) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/IPA-Installer/IPA-Installer.js b/IPA-Installer/IPA-Installer.js new file mode 100644 index 0000000000..0592bed685 --- /dev/null +++ b/IPA-Installer/IPA-Installer.js @@ -0,0 +1,148 @@ +/* + * iOS IPA应用辅助安装脚本. + * + * 兼容: QuantumultX、Surge5,Loon、Shadowrocket、Stash + * 作者: @NobyDa + * + * 快捷指令 + Shu配合安装: + * 导入IPA文件至Shu -> Shu长按IPA文件 -> 导出文件 -> WiFi传输 -> 本机 -> 系统共享 -> 分享至IPA-Installer快捷指令 + * + * 快捷指令 + JSBox/Pythonista配合安装: + * IPA文件长按分享至IPA-Installer快捷指令(iOS14跳过),完成后再分享至Jsbox/pythonista分享扩展. + * + * + * QuanX重写: https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/IPA-Installer.snippet + * + * Surge模块: https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/IPA_install.sgmodule + * + * loon插件: https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_IPA_Installer.plugin + * + * Stash覆写: https://raw.githubusercontent.com/NobyDa/Script/master/Stash/IPA-Installer.stoverride + * + * 快捷指令(iOS15+): https://www.icloud.com/shortcuts/4a121aa54cae4619a952baa29e044e30 + * + * 快捷指令(iOS14): https://www.icloud.com/shortcuts/179dfcd7505e44f89207086d2b1a32ea + * + * JSBox脚本: https://xteko.com/redir?url=https%3A%2F%2Fraw.githubusercontent.com%2FNobyDa%2FScript%2Fmaster%2FIPA-Installer%2FIPA-Installer-JSBox.js&name=IPA%20Installer%20%28NobyDa%29 + * + * Pythonista脚本: https://github.com/NobyDa/Script/blob/master/IPA-Installer/IPA-Installer-Pythonista.py + */ + +const $ = new compatible_tool(); + +(async function () { + const args = urlArgs($request.url); + const plist = ` + + + + items + + + assets + + + kind + software-package + url + https://nobyda.app/download?url=${encodeURIComponent(args.url)} + + + metadata + + bundle-identifier + ${args.bundleId || $.read("nobyda_ipa_bundle_id") || "*"} + bundle-version + 1.0 + kind + software + title + IPA + + + + +`; + if ($request.url.includes("/install?")) { + if (args.bundleId) { + $.write(args.bundleId, "nobyda_ipa_bundle_id"); + }; + $.resp = { response: { status: 200, body: args.client && plist || "{}" } }; + } else { + if ($request.method == "GET") { + const size = await ipaSize(args.url); + $.notify(`IPA Installer`, ``, size && `Installing IPA, Size: ${size} MB` || `HTTP local server read failed!`); + } + $.resp = { response: { status: 307, headers: { Location: args.url }, body: "{}" } }; + } +})() + .catch((e) => $.notify(`IPA Installer`, ``, `ERROR: ${e.message || e}\nPATH: ${e.stack}`)) + .finally(() => $.done($.resp)) + + +function ipaSize(url) { + return new Promise((r, e) => { + $.http({ method: "head", url: url, policy: "DIRECT", }, (e, h, d) => { + r(h && h.status == 200 && `${((h.headers["Content-Length"] || 0) / 1000 / 1000).toFixed(2)}`) + }); + setTimeout(() => r(), 1000) + }); +} + +function urlArgs(str) { + return Object.fromEntries( + (str.startsWith("http") && str.split("?")[1] || str).split("&") + .map((item) => item.split("=")) + .map(([k, v]) => [k, decodeURIComponent(v)]) + ); +} + +function compatible_tool() { + const isSurge = typeof $httpClient != "undefined"; + const isQuanX = typeof $task != "undefined"; + const isStash = typeof $environment == "object" && $environment["stash-version"]; + const adapterStatus = (response) => { + if (response && response.statusCode) { + response.status = response.statusCode; + } + return response + }; + this.read = (key) => { + if (isQuanX) return $prefs.valueForKey(key); + if (isSurge) return $persistentStore.read(key); + }; + this.write = (value, key) => { + if (isQuanX) return $prefs.setValueForKey(value, key); + if (isSurge) return $persistentStore.write(value, key); + }; + this.notify = (title, subtitle, message) => { + if (isQuanX) $notify(title, subtitle, message); + if (isSurge) $notification.post(title, subtitle, message); + }; + this.http = (options, callback) => { + if (options.policy) { + options.node = options.policy; + options.opts = { policy: options.policy }; + if (isStash) options.headers = { + ...options.headers, + ...{ "X-Stash-Selected-Proxy": encodeURIComponent(options.policy) } + }; + } + if (isQuanX) { + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + $httpClient[options.method](options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + }; + this.done = (value = {}) => { + if (value.response && isQuanX) { + value.response.status = `HTTP/1.1 ${value.response.status}`; + } + $done((value.response && isQuanX) ? value.response : value) + } +}; \ No newline at end of file diff --git a/JD-DailyBonus/JD_DailyBonus.js b/JD-DailyBonus/JD_DailyBonus.js new file mode 100644 index 0000000000..05386ea125 --- /dev/null +++ b/JD-DailyBonus/JD_DailyBonus.js @@ -0,0 +1,1972 @@ +/************************* + +京东多合一签到脚本 + +更新时间: 2021.09.09 20:20 v2.1.3 +有效接口: 20+ +脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js +电报频道: @NobyDa +问题反馈: @NobyDa_bot +如果转载: 请注明出处 + +************************* +【 QX, Surge, Loon 说明 】 : +************************* + +初次使用时, app配置文件添加脚本配置, 并启用Mitm后: + +Safari浏览器打开登录 https://home.m.jd.com/myJd/newhome.action 点击"我的"页面 +或者使用旧版网址 https://bean.m.jd.com/bean/signIndex.action 点击签到并且出现签到日历 +如果通知获取Cookie成功, 则可以使用此签到脚本. 注: 请勿在京东APP内获取!!! + +获取京东金融签到Body说明: 正确添加脚本配置后, 进入"京东金融"APP, 在"首页"点击"签到"并签到一次, 待通知提示成功即可. + +由于cookie的有效性(经测试网页Cookie有效周期最长31天),如果脚本后续弹出cookie无效的通知,则需要重复上述步骤。 +签到脚本将在每天的凌晨0:05执行, 您可以修改执行时间。 因部分接口京豆限量领取, 建议调整为凌晨签到。 + +BoxJs或QX Gallery订阅地址: https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +************************* +【 配置多京东账号签到说明 】 : +************************* + +正确配置QX、Surge、Loon后, 并使用此脚本获取"账号1"Cookie成功后, 请勿点击退出账号(可能会导致Cookie失效), 需清除浏览器资料或更换浏览器登录"账号2"获取即可; 账号3或以上同理. +注: 如需清除所有Cookie, 您可开启脚本内"DeleteCookie"选项 (第114行) + +************************* +【 JSbox, Node.js 说明 】 : +************************* + +开启抓包app后, Safari浏览器登录 https://home.m.jd.com/myJd/newhome.action 点击个人中心页面后, 返回抓包app搜索关键字 info/GetJDUserInfoUnion 复制请求头Cookie字段填入json串数据内即可 + +如需获取京东金融签到Body, 可进入"京东金融"APP (iOS), 在"首页"点击"签到"并签到一次, 返回抓包app搜索关键字 h5/m/appSign 复制请求体填入json串数据内即可 +*/ + +var Key = ''; //该参数已废弃; 仅用于下游脚本的兼容, 请使用json串数据 ↓ + +var DualKey = ''; //该参数已废弃; 仅用于下游脚本的兼容, 请使用json串数据 ↓ + +var OtherKey = ``; //无限账号Cookie json串数据, 请严格按照json格式填写, 具体格式请看以下样例: + +/*以下样例为双账号("cookie"为必须,其他可选), 第一个账号仅包含Cookie, 第二个账号包含Cookie和金融签到Body: + +var OtherKey = `[{ + "cookie": "pt_key=xxx;pt_pin=yyy;" +}, { + "cookie": "pt_key=yyy;pt_pin=xxx;", + "jrBody": "reqData=xxx" +}]` + + 注1: 以上选项仅针对于JsBox或Node.js, 如果使用QX,Surge,Loon, 请使用脚本获取Cookie. + 注2: 多账号用户抓取"账号1"Cookie后, 请勿点击退出账号(可能会导致Cookie失效), 需清除浏览器资料或更换浏览器登录"账号2"抓取. + 注3: 如果使用Node.js, 需自行安装'request'模块. 例: npm install request -g + 注4: Node.js或JSbox环境下已配置数据持久化, 填写Cookie运行一次后, 后续更新脚本无需再次填写, 待Cookie失效后重新抓取填写即可. + 注5: 脚本将自动处理"持久化数据"和"手动填写cookie"之间的重复关系, 例如填写多个账号Cookie后, 后续其中一个失效, 仅需填写该失效账号的新Cookie即可, 其他账号不会被清除. + +************************* +【Surge 4.2+ 脚本配置】: +************************* + +[Script] +京东多合一签到 = type=cron,cronexp=5 0 * * *,wake-system=1,timeout=60,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +获取京东Cookie = type=http-request,requires-body=1,pattern=^https:\/\/(api\.m|me-api|ms\.jr)\.jd\.com\/(client\.action\?functionId=signBean|user_new\/info\/GetJDUserInfoUnion\?|gw\/generic\/hy\/h5\/m\/appSign\?),script-path=https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +[MITM] +hostname = ms.jr.jd.com, me-api.jd.com, api.m.jd.com + +************************* +【Loon 2.1+ 脚本配置】: +************************* + +[Script] +cron "5 0 * * *" tag=京东多合一签到, script-path=https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +http-request ^https:\/\/(api\.m|me-api|ms\.jr)\.jd\.com\/(client\.action\?functionId=signBean|user_new\/info\/GetJDUserInfoUnion\?|gw\/generic\/hy\/h5\/m\/appSign\?) tag=获取京东Cookie, requires-body=true, script-path=https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +[MITM] +hostname = ms.jr.jd.com, me-api.jd.com, api.m.jd.com + +************************* +【 QX 1.0.10+ 脚本配置 】 : +************************* + +[task_local] +# 京东多合一签到 +5 0 * * * https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js, tag=京东多合一签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/jd.png,enabled=true + +[rewrite_local] +# 获取京东Cookie. +^https:\/\/(api\.m|me-api)\.jd\.com\/(client\.action\?functionId=signBean|user_new\/info\/GetJDUserInfoUnion\?) url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +# 获取钢镚签到body. +^https:\/\/ms\.jr\.jd\.com\/gw\/generic\/hy\/h5\/m\/appSign\? url script-request-body https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js + +[mitm] +hostname = ms.jr.jd.com, me-api.jd.com, api.m.jd.com + +*************************/ + +var LogDetails = false; //是否开启响应日志, true则开启 + +var stop = '0'; //自定义延迟签到, 单位毫秒. 默认分批并发无延迟; 该参数接受随机或指定延迟(例: '2000'则表示延迟2秒; '2000-5000'则表示延迟最小2秒,最大5秒内的随机延迟), 如填入延迟则切换顺序签到(耗时较长), Surge用户请注意在SurgeUI界面调整脚本超时; 注: 该参数Node.js或JSbox环境下已配置数据持久化, 留空(var stop = '')即可清除. + +var DeleteCookie = false; //是否清除所有Cookie, true则开启. + +var boxdis = true; //是否开启自动禁用, false则关闭. 脚本运行崩溃时(如VPN断连), 下次运行时将自动禁用相关崩溃接口(仅部分接口启用), 崩溃时可能会误禁用正常接口. (该选项仅适用于QX,Surge,Loon) + +var ReDis = false; //是否移除所有禁用列表, true则开启. 适用于触发自动禁用后, 需要再次启用接口的情况. (该选项仅适用于QX,Surge,Loon) + +var out = 0; //接口超时退出, 用于可能发生的网络不稳定, 0则关闭. 如QX日志出现大量"JS Context timeout"后脚本中断时, 建议填写6000 + +var $nobyda = nobyda(); + +var merge = {}; + +var KEY = ''; + +async function all(cookie, jrBody) { + KEY = cookie; + merge = {}; + $nobyda.num++; + switch (stop) { + case 0: + await Promise.all([ + JingDongBean(stop), //京东京豆 + JingDongStore(stop), //京东超市 + JingRongSteel(stop, jrBody), //金融钢镚 + JingDongTurn(stop), //京东转盘 + JDFlashSale(stop), //京东闪购 + JingDongCash(stop), //京东现金红包 + JDMagicCube(stop, 2), //京东小魔方 + JingDongSubsidy(stop), //京东金贴 + JingDongGetCash(stop), //京东领现金 + JingDongShake(stop), //京东摇一摇 + JDSecKilling(stop), //京东秒杀 + // JingRongDoll(stop, 'JRDoll', '京东金融-签壹', '4D25A6F482'), + // JingRongDoll(stop, 'JRThreeDoll', '京东金融-签叁', '69F5EC743C'), + // JingRongDoll(stop, 'JRFourDoll', '京东金融-签肆', '30C4F86264'), + // JingRongDoll(stop, 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F') + ]); + await Promise.all([ + JDUserSignPre(stop, 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆 + JDUserSignPre(stop, 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'), //京东卡包 + // JDUserSignPre(stop, 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'), //京东定制 + JDUserSignPre(stop, 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'), //京东陪伴 + JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴 + JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆 + JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆 + JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆 + JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆 + JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书 + // JDUserSignPre(stop, 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'), //京东-领京豆 + JingRongDoll(stop, 'JTDouble', '京东金贴-双签', '1DF13833F7'), //京东金融 金贴双签 + // JingRongDoll(stop, 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin') //京东金融 现金双签 + ]); + await Promise.all([ + JDUserSignPre(stop, 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'), //失眠补贴 + JDUserSignPre(stop, 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'), //手机小时达 + JDUserSignPre(stop, 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'), //京东电竞 + JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰 + JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆 + JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'), //京东校园 + JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康 + JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手 + JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆 + JDUserSignPre(stop, 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'), //京东个人护理馆 + JDUserSignPre(stop, 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'), // 京东小家电 + // JDUserSignPre(stop, 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'), //京东珠宝馆 + // JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'), //京东美妆馆 + JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'), //京东菜场 + // JDUserSignPre(stop, 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ') //京东智能生活 + ]); + await JingRongDoll(stop, 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签 + break; + default: + await JingDongBean(0); //京东京豆 + await JingDongStore(Wait(stop)); //京东超市 + await JingRongSteel(Wait(stop), jrBody); //金融钢镚 + await JingDongTurn(Wait(stop)); //京东转盘 + await JDFlashSale(Wait(stop)); //京东闪购 + await JingDongCash(Wait(stop)); //京东现金红包 + await JDMagicCube(Wait(stop), 2); //京东小魔方 + await JingDongGetCash(Wait(stop)); //京东领现金 + await JingDongSubsidy(Wait(stop)); //京东金贴 + await JingDongShake(Wait(stop)); //京东摇一摇 + await JDSecKilling(Wait(stop)); //京东秒杀 + // await JingRongDoll(Wait(stop), 'JRThreeDoll', '京东金融-签叁', '69F5EC743C'); + // await JingRongDoll(Wait(stop), 'JRFourDoll', '京东金融-签肆', '30C4F86264'); + // await JingRongDoll(Wait(stop), 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F'); + // await JingRongDoll(Wait(stop), 'JRDoll', '京东金融-签壹', '4D25A6F482'); + // await JingRongDoll(Wait(stop), 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin'); //京东金融 现金双签 + await JingRongDoll(Wait(stop), 'JTDouble', '京东金贴-双签', '1DF13833F7'); //京东金融 金贴双签 + await JDUserSignPre(Wait(stop), 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'); //失眠补贴 + await JDUserSignPre(Wait(stop), 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'); //手机小时达 + await JDUserSignPre(Wait(stop), 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'); //京东卡包 + await JDUserSignPre(Wait(stop), 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'); //京东内衣馆 + await JDUserSignPre(Wait(stop), 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'); //京东电竞 + // await JDUserSignPre(Wait(stop), 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'); //京东定制 + await JDUserSignPre(Wait(stop), 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'); //京东箱包馆 + await JDUserSignPre(Wait(stop), 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'); //京东服饰 + await JDUserSignPre(Wait(stop), 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'); //京东校园 + await JDUserSignPre(Wait(stop), 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'); //京东健康 + await JDUserSignPre(Wait(stop), 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'); //京东鞋靴 + await JDUserSignPre(Wait(stop), 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆 + await JDUserSignPre(Wait(stop), 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆 + await JDUserSignPre(Wait(stop), 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆 + await JDUserSignPre(Wait(stop), 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆 + await JDUserSignPre(Wait(stop), 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书 + await JDUserSignPre(Wait(stop), 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手 + // await JDUserSignPre(Wait(stop), 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'); //京东美妆馆 + await JDUserSignPre(Wait(stop), 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'); //京东菜场 + await JDUserSignPre(Wait(stop), 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'); //京东陪伴 + // await JDUserSignPre(Wait(stop), 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ'); //京东智能生活 + await JDUserSignPre(Wait(stop), 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'); //京东清洁馆 + await JDUserSignPre(Wait(stop), 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'); //京东个人护理馆 + await JDUserSignPre(Wait(stop), 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'); // 京东小家电馆 + // await JDUserSignPre(Wait(stop), 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'); //京东-领京豆 + // await JDUserSignPre(Wait(stop), 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'); //京东珠宝馆 + await JingRongDoll(Wait(stop), 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签 + break; + } + await Promise.all([ + TotalSteel(), //总钢镚查询 + TotalCash(), //总红包查询 + TotalBean(), //总京豆查询 + TotalSubsidy(), //总金贴查询 + TotalMoney() //总现金查询 + ]); + await notify(); //通知模块 +} + +function notify() { + return new Promise(resolve => { + try { + var bean = 0; + var steel = 0; + var cash = 0; + var money = 0; + var subsidy = 0; + var success = 0; + var fail = 0; + var err = 0; + var notify = ''; + for (var i in merge) { + bean += merge[i].bean ? Number(merge[i].bean) : 0 + steel += merge[i].steel ? Number(merge[i].steel) : 0 + cash += merge[i].Cash ? Number(merge[i].Cash) : 0 + money += merge[i].Money ? Number(merge[i].Money) : 0 + subsidy += merge[i].subsidy ? Number(merge[i].subsidy) : 0 + success += merge[i].success ? Number(merge[i].success) : 0 + fail += merge[i].fail ? Number(merge[i].fail) : 0 + err += merge[i].error ? Number(merge[i].error) : 0 + notify += merge[i].notify ? "\n" + merge[i].notify : "" + } + var Cash = merge.TotalCash && merge.TotalCash.TCash ? `${merge.TotalCash.TCash}红包` : "" + var Steel = merge.TotalSteel && merge.TotalSteel.TSteel ? `${merge.TotalSteel.TSteel}钢镚` : `` + var beans = merge.TotalBean && merge.TotalBean.Qbear ? `${merge.TotalBean.Qbear}京豆${Steel?`, `:``}` : "" + var Money = merge.TotalMoney && merge.TotalMoney.TMoney ? `${merge.TotalMoney.TMoney}现金${Cash?`, `:``}` : "" + var Subsidy = merge.TotalSubsidy && merge.TotalSubsidy.TSubsidy ? `${merge.TotalSubsidy.TSubsidy}金贴${Money||Cash?", ":""}` : "" + var Tbean = bean ? `${bean.toFixed(0)}京豆${steel?", ":""}` : "" + var TSteel = steel ? `${steel.toFixed(2)}钢镚` : "" + var TCash = cash ? `${cash.toFixed(2)}红包${subsidy||money?", ":""}` : "" + var TSubsidy = subsidy ? `${subsidy.toFixed(2)}金贴${money?", ":""}` : "" + var TMoney = money ? `${money.toFixed(2)}现金` : "" + var Ts = success ? `成功${success}个${fail||err?`, `:``}` : `` + var Tf = fail ? `失败${fail}个${err?`, `:``}` : `` + var Te = err ? `错误${err}个` : `` + var one = `【签到概览】: ${Ts+Tf+Te}${Ts||Tf||Te?`\n`:`获取失败\n`}` + var two = Tbean || TSteel ? `【签到奖励】: ${Tbean+TSteel}\n` : `` + var three = TCash || TSubsidy || TMoney ? `【其他奖励】: ${TCash+TSubsidy+TMoney}\n` : `` + var four = `【账号总计】: ${beans+Steel}${beans||Steel?`\n`:`获取失败\n`}` + var five = `【其他总计】: ${Subsidy+Money+Cash}${Subsidy||Money||Cash?`\n`:`获取失败\n`}` + var DName = merge.TotalBean && merge.TotalBean.nickname ? merge.TotalBean.nickname : "获取失败" + var cnNum = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]; + const Name = DualKey || OtherKey.length > 1 ? `【签到号${cnNum[$nobyda.num]||$nobyda.num}】: ${DName}\n` : `` + const disables = $nobyda.read("JD_DailyBonusDisables") + const amount = disables ? disables.split(",").length : 0 + const disa = !notify || amount ? `【温馨提示】: 检测到${$nobyda.disable?`上次执行意外崩溃, `:``}已禁用${notify?`${amount}个`:`所有`}接口, 如需开启请前往BoxJs或查看脚本内第118行注释.\n` : `` + $nobyda.notify("", "", Name + one + two + three + four + five + disa + notify, { + 'media-url': $nobyda.headUrl || 'https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/jd.png' + }); + $nobyda.headUrl = null; + if ($nobyda.isJSBox) { + $nobyda.st = (typeof($nobyda.st) == 'undefined' ? '' : $nobyda.st) + Name + one + two + three + four + five + "\n" + } + } catch (eor) { + $nobyda.notify("通知模块 " + eor.name + "‼️", JSON.stringify(eor), eor.message) + } finally { + resolve() + } + }); +} + +(async function ReadCookie() { + const EnvInfo = $nobyda.isJSBox ? "JD_Cookie" : "CookieJD"; + const EnvInfo2 = $nobyda.isJSBox ? "JD_Cookie2" : "CookieJD2"; + const EnvInfo3 = $nobyda.isJSBox ? "JD_Cookies" : "CookiesJD"; + const move = CookieMove($nobyda.read(EnvInfo) || Key, $nobyda.read(EnvInfo2) || DualKey, EnvInfo, EnvInfo2, EnvInfo3); + const cookieSet = $nobyda.read(EnvInfo3); + if (DeleteCookie) { + const write = $nobyda.write("", EnvInfo3); + throw new Error(`Cookie清除${write?`成功`:`失败`}, 请手动关闭脚本内"DeleteCookie"选项`); + } else if ($nobyda.isRequest) { + GetCookie() + } else if (Key || DualKey || (OtherKey || cookieSet || '[]') != '[]') { + if (($nobyda.isJSBox || $nobyda.isNode) && stop !== '0') $nobyda.write(stop, "JD_DailyBonusDelay"); + out = parseInt($nobyda.read("JD_DailyBonusTimeOut")) || out; + stop = Wait($nobyda.read("JD_DailyBonusDelay"), true) || Wait(stop, true); + boxdis = $nobyda.read("JD_Crash_disable") === "false" || $nobyda.isNode || $nobyda.isJSBox ? false : boxdis; + LogDetails = $nobyda.read("JD_DailyBonusLog") === "true" || LogDetails; + ReDis = ReDis ? $nobyda.write("", "JD_DailyBonusDisables") : ""; + $nobyda.num = 0; + if (Key) await all(Key); + if (DualKey && DualKey !== Key) await all(DualKey); + if ((OtherKey || cookieSet || '[]') != '[]') { + try { + OtherKey = checkFormat([...JSON.parse(OtherKey || '[]'), ...JSON.parse(cookieSet || '[]')]); + const updateSet = OtherKey.length ? $nobyda.write(JSON.stringify(OtherKey, null, 2), EnvInfo3) : ''; + for (let i = 0; i < OtherKey.length; i++) { + const ck = OtherKey[i].cookie; + const jr = OtherKey[i].jrBody; + if (ck != Key && ck != DualKey) { + await all(ck, jr) + } + } + } catch (e) { + throw new Error(`账号Cookie读取失败, 请检查Json格式. \n${e.message}`) + } + } + $nobyda.time(); + } else { + throw new Error('脚本终止, 未获取Cookie ‼️') + } +})().catch(e => { + $nobyda.notify("京东签到", "", e.message || JSON.stringify(e)) +}).finally(() => { + if ($nobyda.isJSBox) $intents.finish($nobyda.st); + $nobyda.done(); +}) + +function JingDongBean(s) { + merge.JDBean = {}; + return new Promise(resolve => { + if (disable("JDBean")) return resolve() + setTimeout(() => { + const JDBUrl = { + url: 'https://api.m.jd.com/client.action', + headers: { + Cookie: KEY + }, + body: 'functionId=signBeanIndex&appid=ld' + }; + $nobyda.post(JDBUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.code == 3) { + console.log("\n" + "京东商城-京豆Cookie失效 " + Details) + merge.JDBean.notify = "京东商城-京豆: 失败, 原因: Cookie失效‼️" + merge.JDBean.fail = 1 + } else if (data.match(/跳转至拼图/)) { + merge.JDBean.notify = "京东商城-京豆: 失败, 需要拼图验证 ⚠️" + merge.JDBean.fail = 1 + } else if (data.match(/\"status\":\"?1\"?/)) { + console.log("\n" + "京东商城-京豆签到成功 " + Details) + if (data.match(/dailyAward/)) { + merge.JDBean.notify = "京东商城-京豆: 成功, 明细: " + cc.data.dailyAward.beanAward.beanCount + "京豆 🐶" + merge.JDBean.bean = cc.data.dailyAward.beanAward.beanCount + } else if (data.match(/continuityAward/)) { + merge.JDBean.notify = "京东商城-京豆: 成功, 明细: " + cc.data.continuityAward.beanAward.beanCount + "京豆 🐶" + merge.JDBean.bean = cc.data.continuityAward.beanAward.beanCount + } else if (data.match(/新人签到/)) { + const quantity = data.match(/beanCount\":\"(\d+)\".+今天/) + merge.JDBean.bean = quantity ? quantity[1] : 0 + merge.JDBean.notify = "京东商城-京豆: 成功, 明细: " + (quantity ? quantity[1] : "无") + "京豆 🐶" + } else { + merge.JDBean.notify = "京东商城-京豆: 成功, 明细: 无京豆 🐶" + } + merge.JDBean.success = 1 + } else { + merge.JDBean.fail = 1 + console.log("\n" + "京东商城-京豆签到失败 " + Details) + if (data.match(/(已签到|新人签到)/)) { + merge.JDBean.notify = "京东商城-京豆: 失败, 原因: 已签过 ⚠️" + } else if (data.match(/人数较多|S101/)) { + merge.JDBean.notify = "京东商城-京豆: 失败, 签到人数较多 ⚠️" + } else { + merge.JDBean.notify = "京东商城-京豆: 失败, 原因: 未知 ⚠️" + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-京豆", "JDBean", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +// function JingDongTurn(s) { +// merge.JDTurn = {}, merge.JDTurn.notify = "", merge.JDTurn.success = 0, merge.JDTurn.bean = 0; +// return new Promise((resolve, reject) => { +// if (disable("JDTurn")) return reject() +// const JDTUrl = { +// url: 'https://api.m.jd.com/client.action?functionId=wheelSurfIndex&body=%7B%22actId%22%3A%22jgpqtzjhvaoym%22%2C%22appSource%22%3A%22jdhome%22%7D&appid=ld', +// headers: { +// Cookie: KEY, +// } +// }; +// $nobyda.get(JDTUrl, async function(error, response, data) { +// try { +// if (error) { +// throw new Error(error) +// } else { +// const cc = JSON.parse(data) +// const Details = LogDetails ? "response:\n" + data : ''; +// if (cc.data && cc.data.lotteryCode) { +// console.log("\n" + "京东商城-转盘查询成功 " + Details) +// return resolve(cc.data.lotteryCode) +// } else { +// merge.JDTurn.notify = "京东商城-转盘: 失败, 原因: 查询错误 ⚠️" +// merge.JDTurn.fail = 1 +// console.log("\n" + "京东商城-转盘查询失败 " + Details) +// } +// } +// } catch (eor) { +// $nobyda.AnError("京东转盘-查询", "JDTurn", eor, response, data) +// } finally { +// reject() +// } +// }) +// if (out) setTimeout(reject, out + s) +// }).then(data => { +// return JingDongTurnSign(s, data); +// }, () => {}); +// } + +function JingDongTurn(s) { + if (!merge.JDTurn) merge.JDTurn = {}, merge.JDTurn.notify = "", merge.JDTurn.success = 0, merge.JDTurn.bean = 0; + return new Promise(resolve => { + if (disable("JDTurn")) return resolve(); + setTimeout(() => { + const JDTUrl = { + url: `https://api.m.jd.com/client.action?functionId=babelGetLottery`, + headers: { + Cookie: KEY + }, + body: 'body=%7B%22enAwardK%22%3A%2295d235f2a09578c6613a1a029b26d12d%22%2C%22riskParam%22%3A%7B%7D%7D&client=wh5' + }; + $nobyda.post(JDTUrl, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + const also = merge.JDTurn.notify ? true : false + if (cc.code == 3) { + console.log("\n" + "京东转盘Cookie失效 " + Details) + merge.JDTurn.notify = "京东商城-转盘: 失败, 原因: Cookie失效‼️" + merge.JDTurn.fail = 1 + } else if (data.match(/(\"T216\"|活动结束)/)) { + merge.JDTurn.notify = "京东商城-转盘: 失败, 原因: 活动结束 ⚠️" + merge.JDTurn.fail = 1 + } else if (data.match(/\d+京豆/)) { + console.log("\n" + "京东商城-转盘签到成功 " + Details) + merge.JDTurn.bean += (cc.prizeName && cc.prizeName.split(/(\d+)/)[1]) || 0 + merge.JDTurn.notify += `${also?`\n`:``}京东商城-转盘: ${also?`多次`:`成功`}, 明细: ${merge.JDTurn.bean||`无`}京豆 🐶` + merge.JDTurn.success += 1 + if (cc.chances > 0) { + await JingDongTurnSign(2000) + } + } else if (data.match(/未中奖|擦肩而过/)) { + merge.JDTurn.notify += `${also?`\n`:``}京东商城-转盘: ${also?`多次`:`成功`}, 状态: 未中奖 🐶` + merge.JDTurn.success += 1 + if (cc.chances > 0) { + await JingDongTurnSign(2000) + } + } else { + console.log("\n" + "京东商城-转盘签到失败 " + Details) + merge.JDTurn.fail = 1 + if (data.match(/(机会已用完|次数为0)/)) { + merge.JDTurn.notify = "京东商城-转盘: 失败, 原因: 已转过 ⚠️" + } else if (data.match(/(T210|密码)/)) { + merge.JDTurn.notify = "京东商城-转盘: 失败, 原因: 无支付密码 ⚠️" + } else { + merge.JDTurn.notify += `${also?`\n`:``}京东商城-转盘: 失败, 原因: 未知 ⚠️${also?` (多次)`:``}` + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-转盘", "JDTurn", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingRongSteel(s, body) { + merge.JRSteel = {}; + return new Promise(resolve => { + if (disable("JRSteel")) return resolve(); + if (!body) { + merge.JRSteel.fail = 1; + merge.JRSteel.notify = "京东金融-钢镚: 失败, 未获取签到Body ⚠️"; + return resolve(); + } + setTimeout(() => { + const JRSUrl = { + url: 'https://ms.jr.jd.com/gw/generic/hy/h5/m/appSign', + headers: { + Cookie: KEY + }, + body: body || '' + }; + $nobyda.post(JRSUrl, function(error, response, data) { + try { + if (error) throw new Error(error) + const cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.resultCode == 0 && cc.resultData && cc.resultData.resBusiCode == 0) { + console.log("\n" + "京东金融-钢镚签到成功 " + Details) + merge.JRSteel.notify = `京东金融-钢镚: 成功, 获得钢镚奖励 💰` + merge.JRSteel.success = 1 + } else { + console.log("\n" + "京东金融-钢镚签到失败 " + Details) + merge.JRSteel.fail = 1 + if (cc.resultCode == 0 && cc.resultData && cc.resultData.resBusiCode == 15) { + merge.JRSteel.notify = "京东金融-钢镚: 失败, 原因: 已签过 ⚠️" + } else if (data.match(/未实名/)) { + merge.JRSteel.notify = "京东金融-钢镚: 失败, 账号未实名 ⚠️" + } else if (cc.resultCode == 3) { + merge.JRSteel.notify = "京东金融-钢镚: 失败, 原因: Cookie失效‼️" + } else { + const ng = (cc.resultData && cc.resultData.resBusiMsg) || cc.resultMsg + merge.JRSteel.notify = `京东金融-钢镚: 失败, ${`原因: ${ng||`未知`}`} ⚠️` + } + } + } catch (eor) { + $nobyda.AnError("京东金融-钢镚", "JRSteel", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingDongShake(s) { + if (!merge.JDShake) merge.JDShake = {}, merge.JDShake.success = 0, merge.JDShake.bean = 0, merge.JDShake.notify = ''; + return new Promise(resolve => { + if (disable("JDShake")) return resolve() + setTimeout(() => { + const JDSh = { + url: 'https://api.m.jd.com/client.action?appid=vip_h5&functionId=vvipclub_shaking', + headers: { + Cookie: KEY, + } + }; + $nobyda.get(JDSh, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + const also = merge.JDShake.notify ? true : false + if (data.match(/prize/)) { + console.log("\n" + "京东商城-摇一摇签到成功 " + Details) + merge.JDShake.success += 1 + if (cc.data.prizeBean) { + merge.JDShake.bean += cc.data.prizeBean.count || 0 + merge.JDShake.notify += `${also?`\n`:``}京东商城-摇摇: ${also?`多次`:`成功`}, 明细: ${merge.JDShake.bean || `无`}京豆 🐶` + } else if (cc.data.prizeCoupon) { + merge.JDShake.notify += `${also?`\n`:``}京东商城-摇摇: ${also?`多次, `:``}获得满${cc.data.prizeCoupon.quota}减${cc.data.prizeCoupon.discount}优惠券→ ${cc.data.prizeCoupon.limitStr}` + } else { + merge.JDShake.notify += `${also?`\n`:``}京东商城-摇摇: 成功, 明细: 未知 ⚠️${also?` (多次)`:``}` + } + if (cc.data.luckyBox.freeTimes != 0) { + await JingDongShake(s) + } + } else { + console.log("\n" + "京东商城-摇一摇签到失败 " + Details) + if (data.match(/true/)) { + merge.JDShake.notify += `${also?`\n`:``}京东商城-摇摇: 成功, 明细: 无奖励 🐶${also?` (多次)`:``}` + merge.JDShake.success += 1 + if (cc.data.luckyBox.freeTimes != 0) { + await JingDongShake(s) + } + } else { + merge.JDShake.fail = 1 + if (data.match(/(无免费|8000005|9000005)/)) { + merge.JDShake.notify = "京东商城-摇摇: 失败, 原因: 已摇过 ⚠️" + } else if (data.match(/(未登录|101)/)) { + merge.JDShake.notify = "京东商城-摇摇: 失败, 原因: Cookie失效‼️" + } else { + merge.JDShake.notify += `${also?`\n`:``}京东商城-摇摇: 失败, 原因: 未知 ⚠️${also?` (多次)`:``}` + } + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-摇摇", "JDShake", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JDUserSignPre(s, key, title, ac) { + merge[key] = {}; + if ($nobyda.isJSBox) { + return JDUserSignPre2(s, key, title, ac); + } else { + return JDUserSignPre1(s, key, title, ac); + } +} + +function JDUserSignPre1(s, key, title, acData, ask) { + return new Promise((resolve, reject) => { + if (disable(key, title, 1)) return reject() + const JDUrl = { + url: 'https://api.m.jd.com/?client=wh5&functionId=qryH5BabelFloors', + headers: { + Cookie: KEY + }, + opts: { + 'filter': 'try{var od=JSON.parse(body);var params=(od.floatLayerList||[]).filter(o=>o.params&&o.params.match(/enActK/)).map(o=>o.params).pop()||(od.floorList||[]).filter(o=>o.template=="signIn"&&o.signInfos&&o.signInfos.params&&o.signInfos.params.match(/enActK/)).map(o=>o.signInfos&&o.signInfos.params).pop();var tId=(od.floorList||[]).filter(o=>o.boardParams&&o.boardParams.turnTableId).map(o=>o.boardParams.turnTableId).pop();var page=od.paginationFlrs;return JSON.stringify({qxAct:params||null,qxTid:tId||null,qxPage:page||null})}catch(e){return `=> 过滤器发生错误: ${e.message}`}' + }, + body: `body=${encodeURIComponent(`{"activityId":"${acData}"${ask?`,"paginationParam":"2","paginationFlrs":"${ask}"`:``}}`)}` + }; + $nobyda.post(JDUrl, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const od = JSON.parse(data || '{}'); + const turnTableId = od.qxTid || (od.floorList || []).filter(o => o.boardParams && o.boardParams.turnTableId).map(o => o.boardParams.turnTableId).pop(); + const page = od.qxPage || od.paginationFlrs; + if (data.match(/enActK/)) { // 含有签到活动数据 + let params = od.qxAct || (od.floatLayerList || []).filter(o => o.params && o.params.match(/enActK/)).map(o => o.params).pop() + if (!params) { // 第一处找到签到所需数据 + // floatLayerList未找到签到所需数据,从floorList中查找 + let signInfo = (od.floorList || []).filter(o => o.template == 'signIn' && o.signInfos && o.signInfos.params && o.signInfos.params.match(/enActK/)) + .map(o => o.signInfos).pop(); + if (signInfo) { + if (signInfo.signStat == '1') { + console.log(`\n${title}重复签到`) + merge[key].notify = `${title}: 失败, 原因: 已签过 ⚠️` + merge[key].fail = 1 + } else { + params = signInfo.params; + } + } else { + merge[key].notify = `${title}: 失败, 活动查找异常 ⚠️` + merge[key].fail = 1 + } + } + if (params) { + return resolve({ + params: params + }); // 执行签到处理 + } + } else if (turnTableId) { // 无签到数据, 但含有关注店铺签到 + const boxds = $nobyda.read("JD_Follow_disable") === "false" ? false : true + if (boxds) { + console.log(`\n${title}关注店铺`) + return resolve(parseInt(turnTableId)) + } else { + merge[key].notify = `${title}: 失败, 需要关注店铺 ⚠️` + merge[key].fail = 1 + } + } else if (page && !ask) { // 无签到数据, 尝试带参查询 + const boxds = $nobyda.read("JD_Retry_disable") === "false" ? false : true + if (boxds) { + console.log(`\n${title}二次查询`) + return resolve(page) + } else { + merge[key].notify = `${title}: 失败, 请尝试开启增强 ⚠️` + merge[key].fail = 1 + } + } else { + merge[key].notify = `${title}: 失败, ${!data ? `需要手动执行` : `不含活动数据`} ⚠️` + merge[key].fail = 1 + } + } + reject() + } catch (eor) { + $nobyda.AnError(title, key, eor, response, data) + reject() + } + }) + if (out) setTimeout(reject, out + s) + }).then(data => { + disable(key, title, 2) + if (typeof(data) == "object") return JDUserSign1(s, key, title, encodeURIComponent(JSON.stringify(data))); + if (typeof(data) == "number") return JDUserSign2(s, key, title, data); + if (typeof(data) == "string") return JDUserSignPre1(s, key, title, acData, data); + }, () => disable(key, title, 2)) +} + +function JDUserSignPre2(s, key, title, acData) { + return new Promise((resolve, reject) => { + if (disable(key, title, 1)) return reject() + const JDUrl = { + url: `https://pro.m.jd.com/mall/active/${acData}/index.html`, + headers: { + Cookie: KEY, + } + }; + $nobyda.get(JDUrl, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const act = data.match(/\"params\":\"\{\\\"enActK.+?\\\"\}\"/) + const turnTable = data.match(/\"turnTableId\":\"(\d+)\"/) + const page = data.match(/\"paginationFlrs\":\"(\[\[.+?\]\])\"/) + if (act) { // 含有签到活动数据 + return resolve(act) + } else if (turnTable) { // 无签到数据, 但含有关注店铺签到 + const boxds = $nobyda.read("JD_Follow_disable") === "false" ? false : true + if (boxds) { + console.log(`\n${title}关注店铺`) + return resolve(parseInt(turnTable[1])) + } else { + merge[key].notify = `${title}: 失败, 需要关注店铺 ⚠️` + merge[key].fail = 1 + } + } else if (page) { // 无签到数据, 尝试带参查询 + const boxds = $nobyda.read("JD_Retry_disable") === "false" ? false : true + if (boxds) { + console.log(`\n${title}二次查询`) + return resolve(page[1]) + } else { + merge[key].notify = `${title}: 失败, 请尝试开启增强 ⚠️` + merge[key].fail = 1 + } + } else { + merge[key].notify = `${title}: 失败, ${!data ? `需要手动执行` : `不含活动数据`} ⚠️` + merge[key].fail = 1 + } + } + reject() + } catch (eor) { + $nobyda.AnError(title, key, eor, response, data) + reject() + } + }) + if (out) setTimeout(reject, out + s) + }).then(data => { + disable(key, title, 2) + if (typeof(data) == "object") return JDUserSign1(s, key, title, encodeURIComponent(`{${data}}`)); + if (typeof(data) == "number") return JDUserSign2(s, key, title, data) + if (typeof(data) == "string") return JDUserSignPre1(s, key, title, acData, data) + }, () => disable(key, title, 2)) +} + +function JDUserSign1(s, key, title, body) { + return new Promise(resolve => { + setTimeout(() => { + const JDUrl = { + url: 'https://api.m.jd.com/client.action?functionId=userSign', + headers: { + Cookie: KEY + }, + body: `body=${body}&client=wh5` + }; + $nobyda.post(JDUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? `response:\n${data}` : ''; + if (data.match(/签到成功/)) { + console.log(`\n${title}签到成功(1)${Details}`) + if (data.match(/\"text\":\"\d+京豆\"/)) { + merge[key].bean = data.match(/\"text\":\"(\d+)京豆\"/)[1] + } + merge[key].notify = `${title}: 成功, 明细: ${merge[key].bean || '无'}京豆 🐶` + merge[key].success = 1 + } else { + console.log(`\n${title}签到失败(1)${Details}`) + if (data.match(/(已签到|已领取)/)) { + merge[key].notify = `${title}: 失败, 原因: 已签过 ⚠️` + } else if (data.match(/(不存在|已结束|未开始)/)) { + merge[key].notify = `${title}: 失败, 原因: 活动已结束 ⚠️` + } else if (data.match(/\"code\":\"?3\"?/)) { + merge[key].notify = `${title}: 失败, 原因: Cookie失效‼️` + } else { + const ng = data.match(/\"(errorMessage|subCodeMsg)\":\"(.+?)\"/) + merge[key].notify = `${title}: 失败, ${ng?ng[2]:`原因: 未知`} ⚠️` + } + merge[key].fail = 1 + } + } + } catch (eor) { + $nobyda.AnError(title, key, eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +async function JDUserSign2(s, key, title, tid) { + return console.log(`\n${title} >> 可能需要拼图验证, 跳过签到 ⚠️`); + await new Promise(resolve => { + $nobyda.get({ + url: `https://jdjoy.jd.com/api/turncard/channel/detail?turnTableId=${tid}&invokeKey=ztmFUCxcPMNyUq0P`, + headers: { + Cookie: KEY + } + }, function(error, response, data) { + resolve() + }) + if (out) setTimeout(resolve, out + s) + }); + return new Promise(resolve => { + setTimeout(() => { + const JDUrl = { + url: 'https://jdjoy.jd.com/api/turncard/channel/sign?invokeKey=ztmFUCxcPMNyUq0P', + headers: { + lkt: '1629984131120', + lks: 'd7db92cf40ad5a8d54b9da2b561c5f84', + Cookie: KEY + }, + body: `turnTableId=${tid}` + }; + $nobyda.post(JDUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? `response:\n${data}` : ''; + if (data.match(/\"success\":true/)) { + console.log(`\n${title}签到成功(2)${Details}`) + if (data.match(/\"jdBeanQuantity\":\d+/)) { + merge[key].bean = data.match(/\"jdBeanQuantity\":(\d+)/)[1] + } + merge[key].notify = `${title}: 成功, 明细: ${merge[key].bean || '无'}京豆 🐶` + merge[key].success = 1 + } else { + const captcha = /请进行验证/.test(data); + if (data.match(/(已经签到|已经领取)/)) { + merge[key].notify = `${title}: 失败, 原因: 已签过 ⚠️` + } else if (data.match(/(不存在|已结束|未开始)/)) { + merge[key].notify = `${title}: 失败, 原因: 活动已结束 ⚠️` + } else if (data.match(/(没有登录|B0001)/)) { + merge[key].notify = `${title}: 失败, 原因: Cookie失效‼️` + } else if (!captcha) { + const ng = data.match(/\"(errorMessage|subCodeMsg)\":\"(.+?)\"/) + merge[key].notify = `${title}: 失败, ${ng?ng[2]:`原因: 未知`} ⚠️` + } + if (!captcha) merge[key].fail = 1; + console.log(`\n${title}签到失败(2)${captcha?`\n需要拼图验证, 跳过通知记录 ⚠️`:``}${Details}`) + } + } + } catch (eor) { + $nobyda.AnError(title, key, eor, response, data) + } finally { + resolve() + } + }) + }, 200 + s) + if (out) setTimeout(resolve, out + s + 200) + }); +} + +function JDFlashSale(s) { + merge.JDFSale = {}; + return new Promise(resolve => { + if (disable("JDFSale")) return resolve() + setTimeout(() => { + const JDPETUrl = { + url: 'https://api.m.jd.com/client.action?functionId=partitionJdSgin', + headers: { + Cookie: KEY + }, + body: "body=%7B%22version%22%3A%22v2%22%7D&client=apple&clientVersion=9.0.8&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=6768e2cf625427615dd89649dd367d41&st=1597248593305&sv=121" + }; + $nobyda.post(JDPETUrl, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (cc.result && cc.result.code == 0) { + console.log("\n" + "京东商城-闪购签到成功 " + Details) + merge.JDFSale.bean = cc.result.jdBeanNum || 0 + merge.JDFSale.notify = "京东商城-闪购: 成功, 明细: " + (merge.JDFSale.bean || "无") + "京豆 🐶" + merge.JDFSale.success = 1 + } else { + console.log("\n" + "京东商城-闪购签到失败 " + Details) + if (data.match(/(已签到|已领取|\"2005\")/)) { + merge.JDFSale.notify = "京东商城-闪购: 失败, 原因: 已签过 ⚠️" + } else if (data.match(/不存在|已结束|\"2008\"|\"3001\"/)) { + await FlashSaleDivide(s); //瓜分京豆 + return + } else if (data.match(/(\"code\":\"3\"|\"1003\")/)) { + merge.JDFSale.notify = "京东商城-闪购: 失败, 原因: Cookie失效‼️" + } else { + const msg = data.match(/\"msg\":\"([\u4e00-\u9fa5].+?)\"/) + merge.JDFSale.notify = `京东商城-闪购: 失败, ${msg ? msg[1] : `原因: 未知`} ⚠️` + } + merge.JDFSale.fail = 1 + } + } + } catch (eor) { + $nobyda.AnError("京东商城-闪购", "JDFSale", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function FlashSaleDivide(s) { + return new Promise(resolve => { + setTimeout(() => { + const Url = { + url: 'https://api.m.jd.com/client.action?functionId=partitionJdShare', + headers: { + Cookie: KEY + }, + body: "body=%7B%22version%22%3A%22v2%22%7D&client=apple&clientVersion=9.0.8&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=49baa3b3899b02bbf06cdf41fe191986&st=1597682588351&sv=111" + }; + $nobyda.post(Url, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (cc.result.code == 0) { + merge.JDFSale.success = 1 + merge.JDFSale.bean = cc.result.jdBeanNum || 0 + merge.JDFSale.notify = "京东闪购-瓜分: 成功, 明细: " + (merge.JDFSale.bean || "无") + "京豆 🐶" + console.log("\n" + "京东闪购-瓜分签到成功 " + Details) + } else { + merge.JDFSale.fail = 1 + console.log("\n" + "京东闪购-瓜分签到失败 " + Details) + if (data.match(/已参与|已领取|\"2006\"/)) { + merge.JDFSale.notify = "京东闪购-瓜分: 失败, 原因: 已瓜分 ⚠️" + } else if (data.match(/不存在|已结束|未开始|\"2008\"|\"2012\"/)) { + merge.JDFSale.notify = "京东闪购-瓜分: 失败, 原因: 活动已结束 ⚠️" + } else if (data.match(/\"code\":\"1003\"|未获取/)) { + merge.JDFSale.notify = "京东闪购-瓜分: 失败, 原因: Cookie失效‼️" + } else { + const msg = data.match(/\"msg\":\"([\u4e00-\u9fa5].+?)\"/) + merge.JDFSale.notify = `京东闪购-瓜分: 失败, ${msg ? msg[1] : `原因: 未知`} ⚠️` + } + } + } + } catch (eor) { + $nobyda.AnError("京东闪购-瓜分", "JDFSale", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingDongCash(s) { + merge.JDCash = {}; + return new Promise(resolve => { + if (disable("JDCash")) return resolve() + setTimeout(() => { + const JDCAUrl = { + url: 'https://api.m.jd.com/client.action?functionId=ccSignInNew', + headers: { + Cookie: KEY + }, + body: "body=%7B%22pageClickKey%22%3A%22CouponCenter%22%2C%22eid%22%3A%22O5X6JYMZTXIEX4VBCBWEM5PTIZV6HXH7M3AI75EABM5GBZYVQKRGQJ5A2PPO5PSELSRMI72SYF4KTCB4NIU6AZQ3O6C3J7ZVEP3RVDFEBKVN2RER2GTQ%22%2C%22shshshfpb%22%3A%22v1%5C%2FzMYRjEWKgYe%2BUiNwEvaVlrHBQGVwqLx4CsS9PH1s0s0Vs9AWk%2B7vr9KSHh3BQd5NTukznDTZnd75xHzonHnw%3D%3D%22%2C%22childActivityUrl%22%3A%22openapp.jdmobile%253a%252f%252fvirtual%253fparams%253d%257b%255c%2522category%255c%2522%253a%255c%2522jump%255c%2522%252c%255c%2522des%255c%2522%253a%255c%2522couponCenter%255c%2522%257d%22%2C%22monitorSource%22%3A%22cc_sign_ios_index_config%22%7D&client=apple&clientVersion=8.5.0&d_brand=apple&d_model=iPhone8%2C2&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&scope=11&screen=1242%2A2208&sign=1cce8f76d53fc6093b45a466e93044da&st=1581084035269&sv=102" + }; + $nobyda.post(JDCAUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (cc.busiCode == "0") { + console.log("\n" + "京东现金-红包签到成功 " + Details) + merge.JDCash.success = 1 + merge.JDCash.Cash = cc.result.signResult.signData.amount || 0 + merge.JDCash.notify = `京东现金-红包: 成功, 明细: ${merge.JDCash.Cash || `无`}红包 🧧` + } else { + console.log("\n" + "京东现金-红包签到失败 " + Details) + merge.JDCash.fail = 1 + if (data.match(/(\"busiCode\":\"1002\"|完成签到)/)) { + merge.JDCash.notify = "京东现金-红包: 失败, 原因: 已签过 ⚠️" + } else if (data.match(/(不存在|已结束)/)) { + merge.JDCash.notify = "京东现金-红包: 失败, 原因: 活动已结束 ⚠️" + } else if (data.match(/(\"busiCode\":\"3\"|未登录)/)) { + merge.JDCash.notify = "京东现金-红包: 失败, 原因: Cookie失效‼️" + } else { + const msg = data.split(/\"msg\":\"([\u4e00-\u9fa5].+?)\"/)[1]; + merge.JDCash.notify = `京东现金-红包: 失败, ${msg||`原因: 未知`} ⚠️` + } + } + } + } catch (eor) { + $nobyda.AnError("京东现金-红包", "JDCash", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JDMagicCube(s, sign) { + merge.JDCube = {}; + return new Promise((resolve, reject) => { + if (disable("JDCube")) return reject() + const JDUrl = { + url: `https://api.m.jd.com/client.action?functionId=getNewsInteractionInfo&appid=smfe${sign?`&body=${encodeURIComponent(`{"sign":${sign}}`)}`:``}`, + headers: { + Cookie: KEY, + } + }; + $nobyda.get(JDUrl, async (error, response, data) => { + try { + if (error) throw new Error(error) + const Details = LogDetails ? "response:\n" + data : ''; + console.log(`\n京东魔方-尝试查询活动(${sign}) ${Details}`) + if (data.match(/\"interactionId\":\d+/)) { + resolve({ + id: data.match(/\"interactionId\":(\d+)/)[1], + sign: sign || null + }) + } else if (data.match(/配置异常/) && sign) { + await JDMagicCube(s, sign == 2 ? 1 : null) + reject() + } else { + resolve(null) + } + } catch (eor) { + $nobyda.AnError("京东魔方-查询", "JDCube", eor, response, data) + reject() + } + }) + if (out) setTimeout(reject, out + s) + }).then(data => { + return JDMagicCubeSign(s, data) + }, () => {}); +} + +function JDMagicCubeSign(s, id) { + return new Promise(resolve => { + setTimeout(() => { + const JDMCUrl = { + url: `https://api.m.jd.com/client.action?functionId=getNewsInteractionLotteryInfo&appid=smfe${id?`&body=${encodeURIComponent(`{${id.sign?`"sign":${id.sign},`:``}"interactionId":${id.id}}`)}`:``}`, + headers: { + Cookie: KEY, + } + }; + $nobyda.get(JDMCUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (data.match(/(\"name\":)/)) { + console.log("\n" + "京东商城-魔方签到成功 " + Details) + merge.JDCube.success = 1 + if (data.match(/(\"name\":\"京豆\")/)) { + merge.JDCube.bean = cc.result.lotteryInfo.quantity || 0 + merge.JDCube.notify = `京东商城-魔方: 成功, 明细: ${merge.JDCube.bean || `无`}京豆 🐶` + } else { + merge.JDCube.notify = `京东商城-魔方: 成功, 明细: ${cc.result.lotteryInfo.name || `未知`} 🎉` + } + } else { + console.log("\n" + "京东商城-魔方签到失败 " + Details) + merge.JDCube.fail = 1 + if (data.match(/(一闪而过|已签到|已领取)/)) { + merge.JDCube.notify = "京东商城-魔方: 失败, 原因: 无机会 ⚠️" + } else if (data.match(/(不存在|已结束)/)) { + merge.JDCube.notify = "京东商城-魔方: 失败, 原因: 活动已结束 ⚠️" + } else if (data.match(/(\"code\":3)/)) { + merge.JDCube.notify = "京东商城-魔方: 失败, 原因: Cookie失效‼️" + } else { + merge.JDCube.notify = "京东商城-魔方: 失败, 原因: 未知 ⚠️" + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-魔方", "JDCube", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingDongSubsidy(s) { + merge.subsidy = {}; + return new Promise(resolve => { + if (disable("subsidy")) return resolve() + setTimeout(() => { + const subsidyUrl = { + url: 'https://ms.jr.jd.com/gw/generic/uc/h5/m/signIn7', + headers: { + Referer: "https://active.jd.com/forever/cashback/index", + Cookie: KEY + } + }; + $nobyda.get(subsidyUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (cc.resultCode == 0 && cc.resultData.data && cc.resultData.data.thisAmount) { + console.log("\n" + "京东商城-金贴签到成功 " + Details) + merge.subsidy.subsidy = cc.resultData.data.thisAmountStr + merge.subsidy.notify = `京东商城-金贴: 成功, 明细: ${merge.subsidy.subsidy||`无`}金贴 💰` + merge.subsidy.success = 1 + } else { + console.log("\n" + "京东商城-金贴签到失败 " + Details) + merge.subsidy.fail = 1 + if (data.match(/已存在|"thisAmount":0/)) { + merge.subsidy.notify = "京东商城-金贴: 失败, 原因: 无金贴 ⚠️" + } else if (data.match(/请先登录/)) { + merge.subsidy.notify = "京东商城-金贴: 失败, 原因: Cookie失效‼️" + } else { + const msg = data.split(/\"msg\":\"([\u4e00-\u9fa5].+?)\"/)[1]; + merge.subsidy.notify = `京东商城-金贴: 失败, ${msg||`原因: 未知`} ⚠️` + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-金贴", "subsidy", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingRongDoll(s, key, title, code, type, num, award, belong) { + merge[key] = {}; + return new Promise(resolve => { + if (disable(key)) return resolve() + setTimeout(() => { + const DollUrl = { + url: "https://nu.jr.jd.com/gw/generic/jrm/h5/m/process", + headers: { + Cookie: KEY + }, + body: `reqData=${encodeURIComponent(`{"actCode":"${code}","type":${type?type:`3`}${code=='F68B2C3E71'?`,"frontParam":{"belong":"${belong}"}`:code==`1DF13833F7`?`,"frontParam":{"channel":"JR","belong":4}`:``}}`)}` + }; + $nobyda.post(DollUrl, async function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + var cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.resultCode == 0) { + if (cc.resultData.data.businessData != null) { + console.log(`\n${title}查询成功 ${Details}`) + if (cc.resultData.data.businessData.pickStatus == 2) { + if (data.match(/\"rewardPrice\":\"\d.*?\"/)) { + const JRDoll_bean = data.match(/\"rewardPrice\":\"(\d.*?)\"/)[1] + const JRDoll_type = data.match(/\"rewardName\":\"金贴奖励\"/) ? true : false + await JingRongDoll(s, key, title, code, '4', JRDoll_bean, JRDoll_type) + } else { + merge[key].success = 1 + merge[key].notify = `${title}: 成功, 明细: 无奖励 🐶` + } + } else if (code == 'F68B2C3E71' || code == '1DF13833F7') { + if (!data.match(/"businessCode":"30\dss?q"/)) { + merge[key].success = 1 + const ct = data.match(/\"count\":\"?(\d.*?)\"?,/) + if (code == 'F68B2C3E71' && belong == 'xianjin') { + merge[key].Money = ct ? ct[1] > 9 ? `0.${ct[1]}` : `0.0${ct[1]}` : 0 + merge[key].notify = `${title}: 成功, 明细: ${merge[key].Money||`无`}现金 💰` + } else if (code == 'F68B2C3E71' && belong == 'jingdou') { + merge[key].bean = ct ? ct[1] : 0; + merge[key].notify = `${title}: 成功, 明细: ${merge[key].bean||`无`}京豆 🐶` + } else if (code == '1DF13833F7') { + merge[key].subsidy = ct ? ct[1] : 0; + merge[key].notify = `${title}: 成功, 明细: ${merge[key].subsidy||`无`}金贴 💰` + } + } else { + const es = cc.resultData.data.businessMsg + const ep = cc.resultData.data.businessData.businessMsg + const tp = data.match(/已领取|300ss?q/) ? `已签过` : `${ep||es||cc.resultMsg||`未知`}` + merge[key].notify = `${title}: 失败, 原因: ${tp} ⚠️` + merge[key].fail = 1 + } + } else { + merge[key].notify = `${title}: 失败, 原因: 已签过 ⚠️`; + merge[key].fail = 1 + } + } else if (cc.resultData.data.businessCode == 200) { + console.log(`\n${title}签到成功 ${Details}`) + if (!award) { + merge[key].bean = num ? num.match(/\d+/)[0] : 0 + } else { + merge[key].subsidy = num || 0 + } + merge[key].success = 1 + merge[key].notify = `${title}: 成功, 明细: ${(award?num:merge[key].bean)||`无`}${award?`金贴 💰`:`京豆 🐶`}` + } else { + console.log(`\n${title}领取异常 ${Details}`) + if (num) console.log(`\n${title} 请尝试手动领取, 预计可得${num}${award?`金贴`:`京豆`}: \nhttps://uf1.jr.jd.com/up/redEnvelopes/index.html?actCode=${code}\n`); + merge[key].fail = 1; + merge[key].notify = `${title}: 失败, 原因: 领取异常 ⚠️`; + } + } else { + console.log(`\n${title}签到失败 ${Details}`) + const redata = typeof(cc.resultData) == 'string' ? cc.resultData : '' + merge[key].notify = `${title}: 失败, ${cc.resultCode==3?`原因: Cookie失效‼️`:`${redata||'原因: 未知 ⚠️'}`}` + merge[key].fail = 1; + } + } + } catch (eor) { + $nobyda.AnError(title, key, eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingDongGetCash(s) { + merge.JDGetCash = {}; + return new Promise(resolve => { + if (disable("JDGetCash")) return resolve() + setTimeout(() => { + const GetCashUrl = { + url: 'https://api.m.jd.com/client.action?functionId=cash_sign&body=%7B%22remind%22%3A0%2C%22inviteCode%22%3A%22%22%2C%22type%22%3A0%2C%22breakReward%22%3A0%7D&client=apple&clientVersion=9.0.8&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=7e2f8bcec13978a691567257af4fdce9&st=1596954745073&sv=111', + headers: { + Cookie: KEY, + } + }; + $nobyda.get(GetCashUrl, function(error, response, data) { + try { + if (error) { + throw new Error(error) + } else { + const cc = JSON.parse(data); + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.data.success && cc.data.result) { + console.log("\n" + "京东商城-现金签到成功 " + Details) + merge.JDGetCash.success = 1 + merge.JDGetCash.Money = cc.data.result.signCash || 0 + merge.JDGetCash.notify = `京东商城-现金: 成功, 明细: ${cc.data.result.signCash||`无`}现金 💰` + } else { + console.log("\n" + "京东商城-现金签到失败 " + Details) + merge.JDGetCash.fail = 1 + if (data.match(/\"bizCode\":201|已经签过/)) { + merge.JDGetCash.notify = "京东商城-现金: 失败, 原因: 已签过 ⚠️" + } else if (data.match(/\"code\":300|退出登录/)) { + merge.JDGetCash.notify = "京东商城-现金: 失败, 原因: Cookie失效‼️" + } else { + merge.JDGetCash.notify = "京东商城-现金: 失败, 原因: 未知 ⚠️" + } + } + } + } catch (eor) { + $nobyda.AnError("京东商城-现金", "JDGetCash", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JingDongStore(s) { + merge.JDGStore = {}; + return new Promise(resolve => { + if (disable("JDGStore")) return resolve() + setTimeout(() => { + $nobyda.get({ + url: 'https://api.m.jd.com/api?appid=jdsupermarket&functionId=smtg_sign&clientVersion=8.0.0&client=m&body=%7B%7D', + headers: { + Cookie: KEY, + Origin: `https://jdsupermarket.jd.com` + } + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const cc = JSON.parse(data); + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.data && cc.data.success === true && cc.data.bizCode === 0) { + console.log(`\n京东商城-超市签到成功 ${Details}`) + merge.JDGStore.success = 1 + merge.JDGStore.bean = cc.data.result.jdBeanCount || 0 + merge.JDGStore.notify = `京东商城-超市: 成功, 明细: ${merge.JDGStore.bean||`无`}京豆 🐶` + } else { + if (!cc.data) cc.data = {} + console.log(`\n京东商城-超市签到失败 ${Details}`) + const tp = cc.data.bizCode == 811 ? `已签过` : cc.data.bizCode == 300 ? `Cookie失效` : `${cc.data.bizMsg||`未知`}` + merge.JDGStore.notify = `京东商城-超市: 失败, 原因: ${tp}${cc.data.bizCode==300?`‼️`:` ⚠️`}` + merge.JDGStore.fail = 1 + } + } catch (eor) { + $nobyda.AnError("京东商城-超市", "JDGStore", eor, response, data) + } finally { + resolve() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }); +} + +function JDSecKilling(s) { //领券中心 + merge.JDSecKill = {}; + return new Promise((resolve, reject) => { + if (disable("JDSecKill")) return reject(); + setTimeout(() => { + $nobyda.post({ + url: 'https://api.m.jd.com/client.action', + headers: { + Cookie: KEY, + Origin: 'https://h5.m.jd.com' + }, + body: 'functionId=homePageV2&appid=SecKill2020' + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data); + if (cc.code == 203 || cc.code == 3 || cc.code == 101) { + merge.JDSecKill.notify = `京东秒杀-红包: 失败, 原因: Cookie失效‼️`; + } else if (cc.result && cc.result.projectId && cc.result.taskId) { + console.log(`\n京东秒杀-红包查询成功 ${Details}`) + return resolve({ + projectId: cc.result.projectId, + taskId: cc.result.taskId + }) + } else { + merge.JDSecKill.notify = `京东秒杀-红包: 失败, 暂无有效活动 ⚠️`; + } + merge.JDSecKill.fail = 1; + console.log(`\n京东秒杀-红包查询失败 ${Details}`) + reject() + } catch (eor) { + $nobyda.AnError("京东秒杀-查询", "JDSecKill", eor, response, data) + reject() + } + }) + }, s) + if (out) setTimeout(resolve, out + s) + }).then(async (id) => { + await new Promise(resolve => { + $nobyda.post({ + url: 'https://api.m.jd.com/client.action', + headers: { + Cookie: KEY, + Origin: 'https://h5.m.jd.com' + }, + body: `functionId=doInteractiveAssignment&body=%7B%22encryptProjectId%22%3A%22${id.projectId}%22%2C%22encryptAssignmentId%22%3A%22${id.taskId}%22%2C%22completionFlag%22%3Atrue%7D&client=wh5&appid=SecKill2020` + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data); + if (cc.code == 0 && cc.subCode == 0) { + console.log(`\n京东秒杀-红包签到成功 ${Details}`); + const qt = data.match(/"discount":(\d.*?),/); + merge.JDSecKill.success = 1; + merge.JDSecKill.Cash = qt ? qt[1] : 0; + merge.JDSecKill.notify = `京东秒杀-红包: 成功, 明细: ${merge.JDSecKill.Cash||`无`}红包 🧧`; + } else { + console.log(`\n京东秒杀-红包签到失败 ${Details}`); + merge.JDSecKill.fail = 1; + merge.JDSecKill.notify = `京东秒杀-红包: 失败, ${cc.subCode==103?`原因: 已领取`:cc.msg?cc.msg:`原因: 未知`} ⚠️`; + } + } catch (eor) { + $nobyda.AnError("京东秒杀-领取", "JDSecKill", eor, response, data); + } finally { + resolve(); + } + }) + }) + }, () => {}); +} + +function TotalSteel() { + merge.TotalSteel = {}; + return new Promise(resolve => { + if (disable("TSteel")) return resolve() + $nobyda.get({ + url: 'https://coin.jd.com/m/gb/getBaseInfo.html', + headers: { + Cookie: KEY + } + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const Details = LogDetails ? "response:\n" + data : ''; + if (data.match(/(\"gbBalance\":\d+)/)) { + console.log("\n" + "京东-总钢镚查询成功 " + Details) + const cc = JSON.parse(data) + merge.TotalSteel.TSteel = cc.gbBalance + } else { + console.log("\n" + "京东-总钢镚查询失败 " + Details) + } + } catch (eor) { + $nobyda.AnError("账户钢镚-查询", "TotalSteel", eor, response, data) + } finally { + resolve() + } + }) + if (out) setTimeout(resolve, out) + }); +} + +function TotalBean() { + merge.TotalBean = {}; + return new Promise(resolve => { + if (disable("Qbear")) return resolve() + $nobyda.get({ + url: 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion', + headers: { + Cookie: KEY + } + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const Details = LogDetails ? "response:\n" + data : ''; + const cc = JSON.parse(data) + if (cc.msg == 'success' && cc.retcode == 0) { + merge.TotalBean.nickname = cc.data.userInfo.baseInfo.nickname || "" + merge.TotalBean.Qbear = cc.data.assetInfo.beanNum || 0 + $nobyda.headUrl = cc.data.userInfo.baseInfo.headImageUrl || "" + console.log(`\n京东-总京豆查询成功 ${Details}`) + } else { + const name = decodeURIComponent(KEY.split(/pt_pin=(.+?);/)[1] || ''); + merge.TotalBean.nickname = cc.retcode == 1001 ? `${name} (CK失效‼️)` : ""; + console.log(`\n京东-总京豆查询失败 ${Details}`) + } + } catch (eor) { + $nobyda.AnError("账户京豆-查询", "TotalBean", eor, response, data) + } finally { + resolve() + } + }) + if (out) setTimeout(resolve, out) + }); +} + +function TotalCash() { + merge.TotalCash = {}; + return new Promise(resolve => { + if (disable("TCash")) return resolve() + $nobyda.post({ + url: 'https://api.m.jd.com/client.action?functionId=myhongbao_balance', + headers: { + Cookie: KEY + }, + body: "body=%7B%22fp%22%3A%22-1%22%2C%22appToken%22%3A%22apphongbao_token%22%2C%22childActivityUrl%22%3A%22-1%22%2C%22country%22%3A%22cn%22%2C%22openId%22%3A%22-1%22%2C%22childActivityId%22%3A%22-1%22%2C%22applicantErp%22%3A%22-1%22%2C%22platformId%22%3A%22appHongBao%22%2C%22isRvc%22%3A%22-1%22%2C%22orgType%22%3A%222%22%2C%22activityType%22%3A%221%22%2C%22shshshfpb%22%3A%22-1%22%2C%22platformToken%22%3A%22apphongbao_token%22%2C%22organization%22%3A%22JD%22%2C%22pageClickKey%22%3A%22-1%22%2C%22platform%22%3A%221%22%2C%22eid%22%3A%22-1%22%2C%22appId%22%3A%22appHongBao%22%2C%22childActiveName%22%3A%22-1%22%2C%22shshshfp%22%3A%22-1%22%2C%22jda%22%3A%22-1%22%2C%22extend%22%3A%22-1%22%2C%22shshshfpa%22%3A%22-1%22%2C%22activityArea%22%3A%22-1%22%2C%22childActivityTime%22%3A%22-1%22%7D&client=apple&clientVersion=8.5.0&d_brand=apple&networklibtype=JDNetworkBaseAF&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=fdc04c3ab0ee9148f947d24fb087b55d&st=1581245397648&sv=120" + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const Details = LogDetails ? "response:\n" + data : ''; + if (data.match(/(\"totalBalance\":\d+)/)) { + console.log("\n" + "京东-总红包查询成功 " + Details) + const cc = JSON.parse(data) + merge.TotalCash.TCash = cc.totalBalance + } else { + console.log("\n" + "京东-总红包查询失败 " + Details) + } + } catch (eor) { + $nobyda.AnError("账户红包-查询", "TotalCash", eor, response, data) + } finally { + resolve() + } + }) + if (out) setTimeout(resolve, out) + }); +} + +function TotalSubsidy() { + merge.TotalSubsidy = {}; + return new Promise(resolve => { + if (disable("TotalSubsidy")) return resolve() + $nobyda.get({ + url: 'https://ms.jr.jd.com/gw/generic/uc/h5/m/mySubsidyBalance', + headers: { + Cookie: KEY, + Referer: 'https://active.jd.com/forever/cashback/index?channellv=wojingqb' + } + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.resultCode == 0 && cc.resultData && cc.resultData.data) { + console.log("\n京东-总金贴查询成功 " + Details) + merge.TotalSubsidy.TSubsidy = cc.resultData.data.balance || 0 + } else { + console.log("\n京东-总金贴查询失败 " + Details) + } + } catch (eor) { + $nobyda.AnError("账户金贴-查询", "TotalSubsidy", eor, response, data) + } finally { + resolve() + } + }) + if (out) setTimeout(resolve, out) + }); +} + +function TotalMoney() { + merge.TotalMoney = {}; + return new Promise(resolve => { + if (disable("TotalMoney")) return resolve() + $nobyda.get({ + url: 'https://api.m.jd.com/client.action?functionId=cash_exchangePage&body=%7B%7D&build=167398&client=apple&clientVersion=9.1.9&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=762a8e894dea8cbfd91cce4dd5714bc5&st=1602179446935&sv=102', + headers: { + Cookie: KEY + } + }, (error, response, data) => { + try { + if (error) throw new Error(error); + const cc = JSON.parse(data) + const Details = LogDetails ? "response:\n" + data : ''; + if (cc.code == 0 && cc.data && cc.data.bizCode == 0 && cc.data.result) { + console.log("\n京东-总现金查询成功 " + Details) + merge.TotalMoney.TMoney = cc.data.result.totalMoney || 0 + } else { + console.log("\n京东-总现金查询失败 " + Details) + } + } catch (eor) { + $nobyda.AnError("账户现金-查询", "TotalMoney", eor, response, data) + } finally { + resolve() + } + }) + if (out) setTimeout(resolve, out) + }); +} + +function disable(Val, name, way) { + const read = $nobyda.read("JD_DailyBonusDisables") + const annal = $nobyda.read("JD_Crash_" + Val) + if (annal && way == 1 && boxdis) { + var Crash = $nobyda.write("", "JD_Crash_" + Val) + if (read) { + if (read.indexOf(Val) == -1) { + var Crash = $nobyda.write(`${read},${Val}`, "JD_DailyBonusDisables") + console.log(`\n${name}-触发自动禁用 ‼️`) + merge[Val].notify = `${name}: 崩溃, 触发自动禁用 ‼️` + merge[Val].error = 1 + $nobyda.disable = 1 + } + } else { + var Crash = $nobyda.write(Val, "JD_DailyBonusDisables") + console.log(`\n${name}-触发自动禁用 ‼️`) + merge[Val].notify = `${name}: 崩溃, 触发自动禁用 ‼️` + merge[Val].error = 1 + $nobyda.disable = 1 + } + return true + } else if (way == 1 && boxdis) { + var Crash = $nobyda.write(name, "JD_Crash_" + Val) + } else if (way == 2 && annal) { + var Crash = $nobyda.write("", "JD_Crash_" + Val) + } + if (read && read.indexOf(Val) != -1) { + return true + } else { + return false + } +} + +function Wait(readDelay, ini) { + if (!readDelay || readDelay === '0') return 0 + if (typeof(readDelay) == 'string') { + var readDelay = readDelay.replace(/"|"|'|'/g, ''); //prevent novice + if (readDelay.indexOf('-') == -1) return parseInt(readDelay) || 0; + const raw = readDelay.split("-").map(Number); + const plan = parseInt(Math.random() * (raw[1] - raw[0] + 1) + raw[0], 10); + if (ini) console.log(`\n初始化随机延迟: 最小${raw[0]/1000}秒, 最大${raw[1]/1000}秒`); + // else console.log(`\n预计等待: ${(plan / 1000).toFixed(2)}秒`); + return ini ? readDelay : plan + } else if (typeof(readDelay) == 'number') { + return readDelay > 0 ? readDelay : 0 + } else return 0 +} + +function CookieMove(oldCk1, oldCk2, oldKey1, oldKey2, newKey) { + let update; + const move = (ck, del) => { + console.log(`京东${del}开始迁移!`); + update = CookieUpdate(null, ck).total; + update = $nobyda.write(JSON.stringify(update, null, 2), newKey); + update = $nobyda.write("", del); + } + if (oldCk1) { + const write = move(oldCk1, oldKey1); + } + if (oldCk2) { + const write = move(oldCk2, oldKey2); + } +} + +function checkFormat(value) { //check format and delete duplicates + let n, k, c = {}; + return value.reduce((t, i) => { + k = ((i.cookie || '').match(/(pt_key|pt_pin)=.+?;/g) || []).sort(); + if (k.length == 2) { + if ((n = k[1]) && !c[n]) { + i.userName = i.userName ? i.userName : decodeURIComponent(n.split(/pt_pin=(.+?);/)[1]); + i.cookie = k.join('') + if (i.jrBody && !i.jrBody.includes('reqData=')) { + console.log(`异常钢镚Body已过滤: ${i.jrBody}`) + delete i.jrBody; + } + c[n] = t.push(i); + } + } else { + console.log(`异常京东Cookie已过滤: ${i.cookie}`) + } + return t; + }, []) +} + +function CookieUpdate(oldValue, newValue, path = 'cookie') { + let item, type, name = (oldValue || newValue || '').split(/pt_pin=(.+?);/)[1]; + let total = $nobyda.read('CookiesJD'); + try { + total = checkFormat(JSON.parse(total || '[]')); + } catch (e) { + $nobyda.notify("京东签到", "", "Cookie JSON格式不正确, 即将清空\n可前往日志查看该数据内容!"); + console.log(`京东签到Cookie JSON格式异常: ${e.message||e}\n旧数据内容: ${total}`); + total = []; + } + for (let i = 0; i < total.length; i++) { + if (total[i].cookie && new RegExp(`pt_pin=${name};`).test(total[i].cookie)) { + item = i; + break; + } + } + if (newValue && item !== undefined) { + type = total[item][path] === newValue ? -1 : 2; + total[item][path] = newValue; + item = item + 1; + } else if (newValue && path === 'cookie') { + total.push({ + cookie: newValue + }); + type = 1; + item = total.length; + } + return { + total: checkFormat(total), + type, //-1: same, 1: add, 2:update + item, + name: decodeURIComponent(name) + }; +} + +function GetCookie() { + const req = $request; + if (req.method != 'OPTIONS' && req.headers) { + const CV = (req.headers['Cookie'] || req.headers['cookie'] || ''); + const ckItems = CV.match(/(pt_key|pt_pin)=.+?;/g); + if (/^https:\/\/(me-|)api(\.m|)\.jd\.com\/(client\.|user_new)/.test(req.url)) { + if (ckItems && ckItems.length == 2) { + const value = CookieUpdate(null, ckItems.join('')) + if (value.type !== -1) { + const write = $nobyda.write(JSON.stringify(value.total, null, 2), "CookiesJD") + $nobyda.notify(`用户名: ${value.name}`, ``, `${value.type==2?`更新`:`写入`}京东 [账号${value.item}] Cookie${write?`成功 🎉`:`失败 ‼️`}`) + } else { + console.log(`\n用户名: ${value.name}\n与历史京东 [账号${value.item}] Cookie相同, 跳过写入 ⚠️`) + } + } else { + throw new Error("写入Cookie失败, 关键值缺失\n可能原因: 非网页获取 ‼️"); + } + } else if (/^https:\/\/ms\.jr\.jd\.com\/gw\/generic\/hy\/h5\/m\/appSign\?/.test(req.url) && req.body) { + const value = CookieUpdate(CV, req.body, 'jrBody'); + if (value.type) { + const write = $nobyda.write(JSON.stringify(value.total, null, 2), "CookiesJD") + $nobyda.notify(`用户名: ${value.name}`, ``, `获取京东 [账号${value.item}] 钢镚Body${write?`成功 🎉`:`失败 ‼️`}`) + } else { + throw new Error("写入钢镚Body失败\n未获取该账号Cookie或关键值缺失‼️"); + } + } else if (req.url === 'http://www.apple.com/') { + throw new Error("类型错误, 手动运行请选择上下文环境为Cron ⚠️"); + } + } else if (!req.headers) { + throw new Error("写入Cookie失败, 请检查匹配URL或配置内脚本类型 ⚠️"); + } +} + +// Modified from yichahucha +function nobyda() { + const start = Date.now() + const isRequest = typeof $request != "undefined" + const isSurge = typeof $httpClient != "undefined" + const isQuanX = typeof $task != "undefined" + const isLoon = typeof $loon != "undefined" + const isJSBox = typeof $app != "undefined" && typeof $http != "undefined" + const isNode = typeof require == "function" && !isJSBox; + const NodeSet = 'CookieSet.json' + const node = (() => { + if (isNode) { + const request = require('request'); + const fs = require("fs"); + const path = require("path"); + return ({ + request, + fs, + path + }) + } else { + return (null) + } + })() + const notify = (title, subtitle, message, rawopts) => { + const Opts = (rawopts) => { //Modified from https://github.com/chavyleung/scripts/blob/master/Env.js + if (!rawopts) return rawopts + if (typeof rawopts === 'string') { + if (isLoon) return rawopts + else if (isQuanX) return { + 'open-url': rawopts + } + else if (isSurge) return { + url: rawopts + } + else return undefined + } else if (typeof rawopts === 'object') { + if (isLoon) { + let openUrl = rawopts.openUrl || rawopts.url || rawopts['open-url'] + let mediaUrl = rawopts.mediaUrl || rawopts['media-url'] + return { + openUrl, + mediaUrl + } + } else if (isQuanX) { + let openUrl = rawopts['open-url'] || rawopts.url || rawopts.openUrl + let mediaUrl = rawopts['media-url'] || rawopts.mediaUrl + return { + 'open-url': openUrl, + 'media-url': mediaUrl + } + } else if (isSurge) { + let openUrl = rawopts.url || rawopts.openUrl || rawopts['open-url'] + return { + url: openUrl + } + } + } else { + return undefined + } + } + console.log(`${title}\n${subtitle}\n${message}`) + if (isQuanX) $notify(title, subtitle, message, Opts(rawopts)) + if (isSurge) $notification.post(title, subtitle, message, Opts(rawopts)) + if (isJSBox) $push.schedule({ + title: title, + body: subtitle ? subtitle + "\n" + message : message + }) + } + const write = (value, key) => { + if (isQuanX) return $prefs.setValueForKey(value, key) + if (isSurge) return $persistentStore.write(value, key) + if (isNode) { + try { + if (!node.fs.existsSync(node.path.resolve(__dirname, NodeSet))) + node.fs.writeFileSync(node.path.resolve(__dirname, NodeSet), JSON.stringify({})); + const dataValue = JSON.parse(node.fs.readFileSync(node.path.resolve(__dirname, NodeSet))); + if (value) dataValue[key] = value; + if (!value) delete dataValue[key]; + return node.fs.writeFileSync(node.path.resolve(__dirname, NodeSet), JSON.stringify(dataValue)); + } catch (er) { + return AnError('Node.js持久化写入', null, er); + } + } + if (isJSBox) { + if (!value) return $file.delete(`shared://${key}.txt`); + return $file.write({ + data: $data({ + string: value + }), + path: `shared://${key}.txt` + }) + } + } + const read = (key) => { + if (isQuanX) return $prefs.valueForKey(key) + if (isSurge) return $persistentStore.read(key) + if (isNode) { + try { + if (!node.fs.existsSync(node.path.resolve(__dirname, NodeSet))) return null; + const dataValue = JSON.parse(node.fs.readFileSync(node.path.resolve(__dirname, NodeSet))) + return dataValue[key] + } catch (er) { + return AnError('Node.js持久化读取', null, er) + } + } + if (isJSBox) { + if (!$file.exists(`shared://${key}.txt`)) return null; + return $file.read(`shared://${key}.txt`).string + } + } + const adapterStatus = (response) => { + if (response) { + if (response.status) { + response["statusCode"] = response.status + } else if (response.statusCode) { + response["status"] = response.statusCode + } + } + return response + } + const get = (options, callback) => { + options.headers['User-Agent'] = 'JD4iPhone/167169 (iPhone; iOS 13.4.1; Scale/3.00)' + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "GET" + //options["opts"] = { + // "hints": false + //} + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + options.headers['X-Surge-Skip-Scripting'] = false + $httpClient.get(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isNode) { + node.request(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isJSBox) { + if (typeof options == "string") options = { + url: options + } + options["header"] = options["headers"] + options["handler"] = function(resp) { + let error = resp.error; + if (error) error = JSON.stringify(resp.error) + let body = resp.data; + if (typeof body == "object") body = JSON.stringify(resp.data); + callback(error, adapterStatus(resp.response), body) + }; + $http.get(options); + } + } + const post = (options, callback) => { + options.headers['User-Agent'] = 'JD4iPhone/167169 (iPhone; iOS 13.4.1; Scale/3.00)' + if (options.body) options.headers['Content-Type'] = 'application/x-www-form-urlencoded' + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "POST" + //options["opts"] = { + // "hints": false + //} + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + options.headers['X-Surge-Skip-Scripting'] = false + $httpClient.post(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isNode) { + node.request.post(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isJSBox) { + if (typeof options == "string") options = { + url: options + } + options["header"] = options["headers"] + options["handler"] = function(resp) { + let error = resp.error; + if (error) error = JSON.stringify(resp.error) + let body = resp.data; + if (typeof body == "object") body = JSON.stringify(resp.data) + callback(error, adapterStatus(resp.response), body) + } + $http.post(options); + } + } + const AnError = (name, keyname, er, resp, body) => { + if (typeof(merge) != "undefined" && keyname) { + if (!merge[keyname].notify) { + merge[keyname].notify = `${name}: 异常, 已输出日志 ‼️` + } else { + merge[keyname].notify += `\n${name}: 异常, 已输出日志 ‼️ (2)` + } + merge[keyname].error = 1 + } + return console.log(`\n‼️${name}发生错误\n‼️名称: ${er.name}\n‼️描述: ${er.message}${JSON.stringify(er).match(/\"line\"/)?`\n‼️行列: ${JSON.stringify(er)}`:``}${resp&&resp.status?`\n‼️状态: ${resp.status}`:``}${body?`\n‼️响应: ${resp&&resp.status!=503?body:`Omit.`}`:``}`) + } + const time = () => { + const end = ((Date.now() - start) / 1000).toFixed(2) + return console.log('\n签到用时: ' + end + ' 秒') + } + const done = (value = {}) => { + if (isQuanX) return $done(value) + if (isSurge) isRequest ? $done(value) : $done() + } + return { + AnError, + isRequest, + isJSBox, + isSurge, + isQuanX, + isLoon, + isNode, + notify, + write, + read, + get, + post, + time, + done + } +}; \ No newline at end of file diff --git a/KuaiKan-DailyBonus/KKMH.js b/KuaiKan-DailyBonus/KKMH.js new file mode 100644 index 0000000000..c7a94517c6 --- /dev/null +++ b/KuaiKan-DailyBonus/KKMH.js @@ -0,0 +1,204 @@ +/* +快看漫画签到脚本 + +更新时间: 2022.06.18 +脚本兼容: QuantumultX, Surge4, Loon, Node.js +电报频道: @NobyDa +问题反馈: @NobyDa_bot + +获取Cookie说明: +打开快看漫画App后(AppStore中国区),点击"我的", 如通知成功获取cookie, 则可以使用此签到脚本. +获取Cookie后, 请将Cookie脚本禁用并移除主机名,以免产生不必要的MITM. +脚本将在每天上午9:00执行, 您可以修改执行时间。 + +如果使用Node.js, 需自行安装got与tough-cookie模块. 例: npm install got tough-cookie -g + +Node.js用户抓取Cookie说明: +开启抓包, 打开快看漫画App后(AppStore中国区),点击"我的" 返回抓包app搜索关键字 passport/user 复制请求头Cookie填入以下cookie处的单引号内即可 +*/ + +var cookie = '' + +var barkKey = ''; //Bark APP 通知推送key + +/********************* +QuantumultX 远程脚本配置: +********************** +[task_local] +0 9 * * * https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js, tag=快看漫画, img-url=https://ftp.bmp.ovh/imgs/2020/09/a3345da5e9094363.png, enabled=true + +[rewrite_local] +# 获取Cookie +^https:\/\/api\.kkmh\.com\/v\d\/passport\/user url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +[mitm] +hostname= api.kkmh.com + +********************** +Surge 4.2.0+ 脚本配置: +********************** +[Script] +快看漫画签到 = type=cron,cronexp=0 9 * * *,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +快看漫画获取Cookie = type=http-request,pattern=^https:\/\/api\.kkmh\.com\/v\d\/passport\/user,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +[MITM] +hostname= api.kkmh.com + +************************ +Loon 2.1.0+ 脚本配置: +************************ + +[Script] +# 快看漫画签到 +cron "0 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +# 获取Cookie +http-request ^https:\/\/api\.kkmh\.com\/v\d\/passport\/user script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +[Mitm] +hostname= api.kkmh.com + +*/ +var LogDetails = false; //响应日志 +var $ = new Env('快看漫画'); +var date = new Date() +var imgUrl = { + 'open-url': 'kuaikan://', + 'media-url': 'https://ftp.bmp.ovh/imgs/2020/09/16da56c186ffa6a2.png' +}; + +(async () => { + if (typeof $request != "undefined") { + GetCookie() + } else if (cookie || $.getdata("@KKMH.COOKIE")) { + if (cookie) $.setdata(cookie, "@KKMH.COOKIE"); + LogDetails = $.getdata("@KKMH.LOG") === "true" || LogDetails + await Checkin(); + } else { + $.msg($.name, "", "签到终止, 未获取Cookie ⚠️", imgUrl); + } +})().finally(() => { + $.done(); +}) + +function Checkin() { + return new Promise(resolve => { + $.get({ + url: 'https://h5.kuaikanmanhua.com/v2/checkin/task_center/checkin', + headers: { + 'Cookie': cookie || $.getdata("@KKMH.COOKIE"), + 'User-Agent': 'Kuaikan/5.75.0/575000(iPhone;Scale/3.00) (iPhone; CPU)', + 'X-Device': '0' + } + }, async (error, response, data) => { + try { + if (error) throw new Error(error) + const cc = JSON.parse(data) + const Details = LogDetails ? data ? `response:\n${data}` : '' : '' + if (cc.code == 200) { + $.log(`${$.name} 成功${Details}`) + const pop = cc.data.check_in_home_info.pop_title + const text = cc.data.check_in_home_info.check_in_bubble_text + const title = cc.data.check_in_home_info.check_in_title + const score = cc.data.check_in_home_info.user_score + const kkb = cc.data.check_in_home_info.user_kkb + const uid = $.getdata("@KKMH.COOKIE") ? $.getdata("@KKMH.COOKIE").match(/uid=(\d+)/) : '' + const rep = $.getdata("@KKMH.DATE") == date.getDate() && (uid ? uid[1] : '') == $.getdata("@KKMH.UID") + const gift = await GiftPack(title); + $.subtitle = rep ? '今天已签过!' : pop; + $.msgBody = `${rep?``:text+', '}现有${$.score||score}积分, ${$.kkb||kkb}KK币\n${gift||title} 🎉`; + $.setdata(JSON.stringify(date.getDate()), "@KKMH.DATE") + $.setdata(uid ? uid[1] : '', "@KKMH.UID") + } else { + $.log(`${$.name} 失败${Details}`) + if (cc.code == 401) { + $.msgBody = 'Cookie失效 ⚠️'; + } else { + $.msgBody = cc.message || '未知错误 ⚠️'; + } + } + } catch (err) { + $.logErr(err) + $.msgBody = `错误, 已输出日志 ⚠️`; + } finally { + $.msg($.name, $.subtitle || '', $.msgBody, imgUrl); + if (barkKey) { + await BarkNotify($, barkKey, $.name, $.msgBody); + } + resolve() + } + }) + }) +} + +function GiftPack(type) { + return new Promise(resolve => { + if (!type.match(/今(日|天)可领/)) return resolve(); + $.get({ + url: 'https://h5.kuaikanmanhua.com/v1/checkin/api/check/open_gift_bag', + headers: { + 'Cookie': cookie || $.getdata("@KKMH.COOKIE"), + 'User-Agent': 'Kuaikan/5.75.0/575000(iPhone;Scale/3.00) (iPhone; CPU)', + 'X-Device': '0' + } + }, (error, response, data) => { + try { + if (error) throw new Error(error) + const cc = JSON.parse(data) + const Details = LogDetails ? data ? `response:\n${data}` : '' : '' + if (cc.code == 200 && cc.data) { + $.log(`${$.name} 成功${Details}`) + $.kkb = cc.data.giftBagKkb ? cc.data.giftBagKkb + cc.data.kkb : cc.data.kkb + $.score = cc.data.score; + $.gifts = `领取连签礼包成功`; + if (cc.data.giftBagScore) $.gifts += `, +${cc.data.giftBagScore}积分`; + if (cc.data.giftBagKkb) $.gifts += `, +${cc.data.giftBagKkb}KK币`; + if (cc.data.giftBagSupplement) $.gifts += `, +1 补签胶囊`; + if (cc.data.giftBagCardCoupon) $.gifts += `, +1 ${cc.data.cardCoupon.title}`; + if (cc.data.giftBagYouzanCoupon) $.gifts += `, +1 ${cc.data.youzanCoupon.title}`; + } else { + $.log(`${$.name} 失败${Details}`) + $.gifts = `领取连签礼包失败, ${cc.message || '未知错误'}` + } + } catch (err) { + $.logErr(err) + $.gifts = `领取连签礼包错误, 已输出日志` + } finally { + resolve($.gifts) + } + }) + }) +} + +function GetCookie() { + const RA = $.getdata("@KKMH.COOKIE") + const TM = $.getdata("@KKMH.TIME") + const CK = $request.headers['Cookie'] || $request.headers['cookie']; + if (JSON.stringify($request.headers).match(/session=/) && CK) { + if (RA != CK) { + if ($.setdata(CK, "@KKMH.COOKIE")) { + $.setdata(JSON.stringify(Date.now()), "@KKMH.TIME") + if (!TM || TM && (Date.now() - TM) / 1000 >= 21600) { + $.msg(`${RA?`更新`:`首次写入`}${$.name}Cookie成功 🎉`, "", "", imgUrl) + } else if (RA.match(/uid=\d+/)[0] == CK.match(/uid=\d+/)[0]) { + $.log(`\n更新${$.name}Cookie成功! 🎉\n检测到频繁通知, 已转为输出日志`) + } else { + $.msg(`更新${$.name}Cookie成功 🎉`, "", "", imgUrl) + } + } else { + $.msg(`${RA?`更新`:`首次写入`}${$.name}Cookie失败‼️`, "", "", imgUrl) + } + } else { + $.log(`${$.name}-Cookie相同, 跳过写入 ⚠️`) + } + } else { + $.log(`${$.name}-请求不含Cookie, 跳过写入 ‼️`) + } +} + +//Bark APP notify +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}`)}}} + +//Compatible code from https://github.com/chavyleung/scripts/blob/master/Env.min.js +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,i)=>{s.call(this,t,(t,s,r)=>{t?i(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.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}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 i=this.getdata(t);if(i)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,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).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),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}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),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)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,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):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=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(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();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Loon/Loon_Bahamut_ADS.plugin b/Loon/Loon_Bahamut_ADS.plugin new file mode 100644 index 0000000000..ca1888d4eb --- /dev/null +++ b/Loon/Loon_Bahamut_ADS.plugin @@ -0,0 +1,11 @@ +#!name= 巴哈姆特动画疯 +#!desc= 该Loon插件用以屏蔽动画疯播放广告 (由于强制验证观看广告时间,故以黑屏25秒的方式屏蔽) +#!author= NobyDa +#!homepage= https://github.com/NobyDa/Script/tree/master +#!icon= https://raw.githubusercontent.com/NobyDa/mini/master/Color/bahamutGame.png + +[Script] +http-response ^https:\/\/api\.gamer\.com\.tw\/mobile_app\/anime\/v\d/(token|m3u8).php\? requires-body=1,timeout=40,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutAnimeAds.js, tag=屏蔽动画疯广告 + +[MITM] +hostname = api.gamer.com.tw \ No newline at end of file diff --git a/Loon/Loon_Daily_bonus.plugin b/Loon/Loon_Daily_bonus.plugin new file mode 100644 index 0000000000..fb8a2f2a76 --- /dev/null +++ b/Loon/Loon_Daily_bonus.plugin @@ -0,0 +1,38 @@ +#!name= 🐻 NobyDa签到脚本 +#!desc= 包括哔哩漫画、贴吧、快看、爱奇艺,携程旅行、巴哈姆特。部分脚本获取Cookie方法请看脚本注释。注意,该Loon链接目前仅适用于"订阅脚本",非"插件"。添加脚本订阅后请按需启用脚本。 +#!author= NobyDa +#!homepage= https://github.com/NobyDa/Script/tree/master +#!icon= https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/javascript/javascript.png + + +[Script] +cron "30 8 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/ctrip.png, timeout=300, enabled=false, tag=携程旅行 [签到] + +http-response ^https:\/\/m\.ctrip\.com\/restapi\/soa2\/\d+\/[a-zA-Z]+Login(?:$|\?) script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/ctrip.png, requires-body=true, enabled=false, tag=携程旅行 [Cookie] + + +cron "10 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/iQIYI.png, timeout=300, enabled=false, tag=爱奇艺 [会员签到] + +http-request ^https:\/\/passport\.iqiyi\.com\/apis\/user\/ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/iQIYI.png, enabled=false, tag=爱奇艺 [Cookie] + + +cron "0 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png, timeout=300, enabled=false, tag=哔哩漫画 [签到] + +http-request ^https:\/\/app\.bilibili\.com\/x\/v2\/account\/myinfo script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png, enabled=false, tag=哔哩漫画 [Cookie] + + +cron "40 8 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/tieba.png, timeout=300, enabled=false, tag=百度贴吧 [签到] + +http-request ^https?:\/\/(c\.tieba|tiebac)\.baidu\.com\/c\/s\/login script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/tieba.png, enabled=false, tag=百度贴吧 [Cookie] + + +cron "10 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/KuaiKan.png, timeout=300, enabled=false, tag=快看漫画 [签到] + +http-request ^https?:\/\/api\.kkmh\.com\/v\d\/passport\/user script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/KuaiKan.png, enabled=false, tag=快看漫画 [Cookie] + + +cron "20 8 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/bahamutGame.png, timeout=300, enabled=false, tag=巴哈姆特 [签到] + + +[MITM] +hostname = passport.iqiyi.com, app.bilibili.com, c.tieba.baidu.com, tiebac.baidu.com, api.kkmh.com, m.ctrip.com \ No newline at end of file diff --git a/Loon/Loon_GetCookie.plugin b/Loon/Loon_GetCookie.plugin new file mode 100644 index 0000000000..078e52b0ee --- /dev/null +++ b/Loon/Loon_GetCookie.plugin @@ -0,0 +1,19 @@ +#!name= NobyDa签到脚本Cookie获取 +#!desc= 包括哔哩漫画、贴吧、快看、爱奇艺,携程旅行。获取方法请看脚本注释;建议使用后手动将该插件禁用, 以避免无意义的MITM。 +#!author= NobyDa +#!homepage= https://github.com/NobyDa/Script/tree/master +#!icon= https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/javascript/javascript.png + +[Script] +http-request ^https:\/\/passport\.iqiyi\.com\/apis\/user\/ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js, tag=爱奇艺Cookie + +http-request ^https:\/\/app\.bilibili\.com\/x\/v2\/account\/myinfo script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, tag=哔哩漫画Cookie + +http-request ^https?:\/\/(c\.tieba|tiebac)\.baidu\.com\/c\/s\/login script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js, tag=百度贴吧Cookie + +http-request ^https?:\/\/api\.kkmh\.com\/v\d\/passport\/user script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js, tag=快看漫画Cookie + +http-response ^https:\/\/m\.ctrip\.com\/restapi\/soa2\/\d+\/[a-zA-Z]+Login(?:$|\?) script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js, requires-body=true, tag=携程旅行Cookie + +[MITM] +hostname = passport.iqiyi.com, app.bilibili.com, c.tieba.baidu.com, tiebac.baidu.com, api.kkmh.com, m.ctrip.com \ No newline at end of file diff --git a/Loon/Loon_Google_CAPTCHA.plugin b/Loon/Loon_Google_CAPTCHA.plugin new file mode 100644 index 0000000000..7baec65ae4 --- /dev/null +++ b/Loon/Loon_Google_CAPTCHA.plugin @@ -0,0 +1,14 @@ +#!name = Google人机验证 +#!desc = Google搜索内容时并发使用多个策略/策略组,以避免可能出现的人机验证。注意:需要在插件参数填写策略/策略组名的正则表达式。 +#!author = NobyDa +#!input = GOOGLE_CAPTCHA_REGEX +#!homepage = https://github.com/NobyDa/Script/tree/master +#!icon = https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/Google.png +#!date = 2024-05-19 12:00:00 + + +[Script] +http-response ^https:\/\/www\.google\.com(?:\.[a-z]+|)\/(?:search\?(?:|.+?&)q=|$) requires-body=1,timeout=30,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Google_CAPTCHA.js,tag=Google人机验证 + +[MITM] +hostname = www.google.com* \ No newline at end of file diff --git a/Loon/Loon_IPA_Installer.plugin b/Loon/Loon_IPA_Installer.plugin new file mode 100644 index 0000000000..47c5531465 --- /dev/null +++ b/Loon/Loon_IPA_Installer.plugin @@ -0,0 +1,12 @@ +#!name=IPA应用辅助安装器 +#!desc=该模块可在iOS端辅助安装商店版或已签名IPA(需使用快捷指令 + Shu/Jsbox/pythonista), 查看脚本注释以了解具体方法; 安装演示可查看TG频道 @NobyDa +#!author=NobyDa +#!homepage=https://github.com/NobyDa/Script/tree/master +#!icon=https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/Apple.png + + +[Script] +http-request ^https:\/\/nobyda.app/(install|download) requires-body=true, script-path=https://raw.githubusercontent.com/NobyDa/Script/master/IPA-Installer/IPA-Installer.js, timeout=10, tag=IPA-Installer + +[MITM] +hostname = nobyda.app \ No newline at end of file diff --git a/Loon/Loon_TF_Account.plugin b/Loon/Loon_TF_Account.plugin new file mode 100644 index 0000000000..7f1aca81f0 --- /dev/null +++ b/Loon/Loon_TF_Account.plugin @@ -0,0 +1,14 @@ +#!name=TestFlight账户管理 +#!desc=自动存储/合并多个TestFlight账户列表, 并可分享/导出TestFlight APP. +#!author= NobyDa +#!homepage= https://github.com/NobyDa/Script/tree/master +#!icon= https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/testflight.png + +[General] +skip-proxy = iosapps.itunes.apple.com + +[Script] +http-request ^https:\/\/testflight\.apple\.com\/v\d\/(app|account|invite)s\/ requires-body=1,timeout=120,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/TestFlight/TestFlightAccount.js,tag=TestFlight账户管理 + +[MITM] +hostname = testflight.apple.com \ No newline at end of file diff --git a/Loon/Loon_TF_Download.plugin b/Loon/Loon_TF_Download.plugin new file mode 100644 index 0000000000..628dde3490 --- /dev/null +++ b/Loon/Loon_TF_Download.plugin @@ -0,0 +1,14 @@ +#!name= TestFlight区域限制解除 +#!desc= 该Loon插件用以解决更新TestFlight App时, 提示"APP不可用"问题. +#!author= NobyDa +#!homepage= https://github.com/NobyDa/Script/tree/master +#!icon= https://cdn.jsdelivr.net/gh/NobyDa/mini@master/Color/testflight.png + +[General] +skip-proxy = iosapps.itunes.apple.com + +[Script] +http-request ^https?:\/\/testflight\.apple\.com\/v\d\/accounts\/.+?\/install$ requires-body=1,max-size=0,script-path=https://gist.githubusercontent.com/NobyDa/9be418b93afc5e9c8a8f4d28ae403cf2/raw/TF_Download.js, tag=TF区域限制解除 + +[MITM] +hostname = testflight.apple.com diff --git a/NobyDa_BoxJs.json b/NobyDa_BoxJs.json new file mode 100644 index 0000000000..0a5d5e8aa9 --- /dev/null +++ b/NobyDa_BoxJs.json @@ -0,0 +1,738 @@ +{ + "id": "NobyDa.app.sub", + "name": "NobyDa 脚本订阅", + "description": "该订阅兼容BoxJs以及QX Gallery", + "author": "@NobyDa", + "icon": "https://avatars2.githubusercontent.com/u/53217160", + "repo": "https://github.com/NobyDa/Script/tree/master", + "apps": [ + { + "id": "多合一签到", + "name": "京东", + "keys": [ + "CookiesJD" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

", + "

如需修改Cookie列表请严格按照JSON格式修改

", + "

建议通过脚本获取Cookie

", + "
", + "

签到相关教程

", + "

" + ], + "settings": [ + { + "id": "JD_DailyBonusLog", + "name": "详细响应日志", + "val": false, + "type": "boolean", + "desc": "打印原始签到结果, 用于调试脚本, 一般用户建议关闭." + }, + { + "id": "JD_Crash_disable", + "name": "崩溃自动禁用", + "val": true, + "type": "boolean", + "desc": "脚本运行崩溃时(如VPN断连), 下次运行时将自动禁用相关崩溃接口(仅部分接口启用), 注: 崩溃时可能会误禁用正常接口." + }, + { + "id": "JD_Retry_disable", + "name": "签到接口增强", + "val": true, + "type": "boolean", + "desc": "用于部分接口提示\"不含活动数据\"问题, 开启后会进行二次查询, 注: 可能会导致崩溃(小概率)." + }, + { + "id": "JD_Follow_disable", + "name": "自动关注店铺", + "val": true, + "type": "boolean", + "desc": "部分接口签到过程可能需要关注店铺, 如介意可选择关闭." + }, + { + "id": "JD_DailyBonusDisables", + "name": "签到接口禁用", + "val": "", + "type": "checkboxes", + "desc": "", + "items": [ + { + "key": "JDBean", + "label": "京东京豆" + }, + { + "key": "JRSteel", + "label": "金融钢镚" + }, + { + "key": "JDTurn", + "label": "京东转盘" + }, + { + "key": "JDGStore", + "label": "京东超市" + }, + { + "key": "JDCard", + "label": "京东卡包" + }, + { + "key": "JD3C", + "label": "京东数码" + }, + { + "key": "JDSuitcase", + "label": "京东箱包" + }, + { + "key": "JDChild", + "label": "京东童装" + }, + { + "key": "JDBaby", + "label": "京东母婴" + }, + { + "key": "JDCash", + "label": "京东红包" + }, + { + "key": "JDFSale", + "label": "京东闪购" + }, + { + "key": "JDBook", + "label": "京东图书" + }, + { + "key": "JDStory", + "label": "失眠补贴" + }, + { + "key": "JDPhone", + "label": "手机小时达" + }, + { + "key": "JDSchool", + "label": "京东校园" + }, + { + "key": "JDUndies", + "label": "京东内衣" + }, + { + "key": "JDShoes", + "label": "京东鞋靴" + }, + { + "key": "JDShand", + "label": "京东二手" + }, + { + "key": "JDHealth", + "label": "京东健康" + }, + { + "key": "JDWomen", + "label": "京东女装" + }, + { + "key": "JDSecKill", + "label": "京东秒杀" + }, + { + "key": "JTDouble", + "label": "金贴双签" + }, + { + "key": "JDVege", + "label": "京东菜场" + }, + { + "key": "JDClean", + "label": "京东清洁" + }, + { + "key": "JDCare", + "label": "京东个护" + }, + { + "key": "JDaccompany", + "label": "京东陪伴" + }, + { + "key": "JDCube", + "label": "京东魔方" + }, + { + "key": "JDJiaDian", + "label": "京东家电" + }, + { + "key": "JDDouble", + "label": "京豆双签" + }, + { + "key": "subsidy", + "label": "京东金贴" + }, + { + "key": "JDGetCash", + "label": "京东现金" + }, + { + "key": "JDShake", + "label": "京东摇一摇" + }, + { + "key": "Qbear", + "label": "总京豆查询" + }, + { + "key": "TCash", + "label": "总红包查询" + }, + { + "key": "TSteel", + "label": "总钢镚查询" + }, + { + "key": "TotalSubsidy", + "label": "总金贴查询" + }, + { + "key": "TotalMoney", + "label": "总现金查询" + } + ] + }, + { + "id": "JD_DailyBonusTimeOut", + "name": "超时退出 (毫秒)", + "val": "", + "type": "number", + "placeholder": "默认无超时 (点击以展开说明)", + "desc": "按需填写, 用于由网络不稳定引起的脚本中断, 正常或越狱用户建议留空. 如QX日志出现大量\"JS Context timeout\"后脚本中断时, 建议填写6000" + }, + { + "id": "JD_DailyBonusDelay", + "name": "接口延迟 (毫秒)", + "val": "", + "type": "number", + "placeholder": "默认并发无延迟 (点击以展开说明)", + "desc": "延迟作用于每个签到接口, 该参数接受随机或指定延迟(例: '2000'则表示延迟2秒; '2000-5000'则表示延迟最小2秒,最大5秒内的随机延迟), 如填入延迟则切换顺序签到(耗时较长); VPN重启或越狱用户建议填写1(顺序执行), Surge用户请注意在SurgeUI界面调整脚本超时." + }, + { + "id": "CookiesJD", + "name": "Cookie列表", + "type": "textarea", + "autoGrow": false, + "rows": 9, + "val": "[\n {\n \"cookie\": \"此处填写账号1 Cookie\"\n },\n {\n \"cookie\": \"此处填写账号2 Cookie\",\n \"jrBody\": \"此处填写账号2 钢镚Body\"\n }\n]", + "placeholder": "[ {\"cookie\": \"pt_key=xxx;pt_pin=yyy;\", \"jrBody\": \"reqData=zzz\"} ]", + "desc": "Cookie和钢镚签到Body列表, 如需修改请严格按照JSON格式填写; \"cookie\"为必须, 其他为可选." + } + ], + "scripts": [ + { + "name": "京东签到", + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js" + }, + { + "name": "初始化设置", + "script": "https://gist.githubusercontent.com/NobyDa/91cbe57dd50b3588a975af8922507a72/raw/JD_initial.js" + } + ], + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/tree/master/JD-DailyBonus", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/jd.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/jd.png" + ] + }, + { + "id": "iQIYI", + "name": "爱奇艺", + "keys": [ + "CookieQY" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

" + ], + "settings": [ + { + "id": "iQIYI_LogDetails", + "name": "响应日志", + "val": false, + "type": "boolean", + "desc": "" + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/iQIYI-DailyBonus/iQIYI.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/iQIYI.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/iQIYI.png" + ] + }, + { + "id": "BiliManga", + "name": "哔哩漫画", + "keys": [ + "BILI_COMICS_CHECKIN" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

" + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Bilibili-DailyBonus/Manga.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/manga.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png" + ] + }, + { + "id": "BiliMangaPoints", + "name": "哔哩漫画抢券", + "descs_html": [ + "

脚本配置请查看脚本注释

" + ], + "keys": [ + "BM_ProductName", + "BM_ProductNum", + "BM_ExchangeNum" + ], + "settings": [ + { + "id": "@BILI_COMICS_CHECKIN.ProductName", + "name": "商品名", + "val": "积分兑换", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "要抢购的积分商城商品名" + }, + { + "id": "@BILI_COMICS_CHECKIN.ProductNum", + "name": "兑换数量", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "要兑换的数量, 默认为积分可兑换的最大值" + }, + { + "id": "@BILI_COMICS_CHECKIN.ExchangeNum", + "name": "抢购次数", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "默认暴力抢购100次" + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/ExchangePoints.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Bilibili-DailyBonus/ExchangePoints.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/manga.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png" + ] + }, + { + "id": "BaiduTB", + "name": "百度贴吧", + "keys": [ + "CookieTB" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

" + ], + "settings": [ + { + "id": "BDTB_DailyBonus_Mode", + "name": "签到模式", + "val": "0", + "type": "radios", + "desc": "", + "items": [ + { + "key": "0", + "label": "自动切换" + }, + { + "key": "1", + "label": "顺序执行" + }, + { + "key": "2", + "label": "并发执行" + } + ] + }, + { + "id": "BDTB_DailyBonus_notify", + "name": "通知汇总", + "val": "", + "type": "number", + "placeholder": "默认20 (点击以展开说明)", + "desc": "想签到几个汇总到一个通知里, 这里就填几个(比如我有13个要签到的, 这里填了5, 就会分三次推送通知)" + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js", + "author": "@sazs34, @NobyDa", + "repo": "https://github.com/sazs34/TaskConfig/blob/master/task/sign_baidu_tieba_v2.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/tieba.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/tieba.png" + ] + }, + { + "id": "52poje", + "name": "吾爱破解", + "keys": [ + "nobyda_52pojie" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

" + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/52pojie-DailyBonus/52pojie.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/52pojie-DailyBonus/52pojie.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/52pj.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/52pj.png" + ] + }, + { + "id": "KuaiKan", + "name": "快看漫画", + "keys": [ + "@KKMH.COOKIE", + "@KKMH.TIME", + "@KKMH.UID", + "@KKMH.DATE" + ], + "descs_html": [ + "

获取Cookie以及脚本配置请查看脚本注释

" + ], + "settings": [ + { + "id": "@KKMH.LOG", + "name": "响应日志", + "val": false, + "type": "boolean", + "desc": "打印原始签到结果, 用于调试脚本, 一般用户建议关闭." + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/KuaiKan-DailyBonus/KKMH.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/KuaiKan.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/KuaiKan.png" + ] + }, + { + "id": "Bahamut", + "name": "巴哈姆特", + "keys": [ + "@ND_BAHA.ID", + "@ND_BAHA.PW", + "@ND_BAHA.TOTP", + "@ND_BAHA.GUILD", + "@ND_BAHA.ANSWER", + "@ND_BAHA.ADS" + ], + "descs_html": [ + "

脚本配置请查看脚本注释

" + ], + "settings": [ + { + "id": "@ND_BAHA.ADS", + "name": "签到广告", + "val": false, + "type": "boolean", + "desc": "开启后将签到双倍巴币奖励, 默认关闭. 请注意, 此功能耗时过长(30秒以上), 如果使用Surge请调整该脚本超时为300秒" + }, + { + "id": "@ND_BAHA.GUILD", + "name": "签到公会", + "val": true, + "type": "boolean", + "desc": "开启后将自动签到公会" + }, + { + "id": "@ND_BAHA.ANSWER", + "name": "动画疯答题", + "val": true, + "type": "boolean", + "desc": "开启后将自动答题" + }, + { + "id": "@ND_BAHA.ID", + "name": "用户名", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "输入用户名(账号)" + }, + { + "id": "@ND_BAHA.PW", + "name": "用户密码", + "val": "", + "type": "text", + "placeholder": "", + "desc": "输入用户密码" + }, + { + "id": "@ND_BAHA.TOTP", + "name": "两步验证令牌", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "输入网站生成的16位令牌, 如未设置两步验证, 请留空" + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Bahamut/BahamutDailyBonus.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/bahamutGame.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/bahamutGame.png" + ] + }, + { + "id": "BiliRegion", + "name": "哔哩番剧自动地区", + "descs_html": [ + "

脚本配置请查看脚本注释

" + ], + "keys": [ + "BiliArea_Policy", + "BiliArea_CN", + "BiliArea_HK", + "BiliArea_TW", + "BiliArea_DF", + "BiliArea_disabled" + ], + "settings": [ + { + "id": "BiliAreaNotify", + "name": "静默运行", + "val": false, + "type": "boolean", + "desc": "开启后将不再发出切换策略通知" + }, + { + "id": "BiliDoubanRating", + "name": "豆瓣评分", + "val": true, + "type": "boolean", + "desc": "关闭后将不再查询豆瓣评分, 可显著提高相关页面载入速度" + }, + { + "id": "BiliArea_Policy", + "name": "策略组名", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "哔哩哔哩分流的策略组名" + }, + { + "id": "BiliArea_CN", + "name": "中国大陆-子策略名", + "val": "DIRECT", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "哔哩哔哩分流策略组里的中国大陆子策略名" + }, + { + "id": "BiliArea_HK", + "name": "中国香港-子策略名", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "哔哩哔哩分流策略组里的香港子策略名" + }, + { + "id": "BiliArea_TW", + "name": "中国台湾-子策略名", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "哔哩哔哩分流策略组里的台湾子策略名" + }, + { + "id": "BiliArea_DF", + "name": "后备-子策略名", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "部分番剧可能会被屏蔽, 使用该策略以避免页面加载失败. 建议填写台湾子策略" + }, + { + "id": "BiliArea_disabled", + "name": "WiFi黑名单", + "val": "", + "type": "text", + "placeholder": "(点击以展开说明)", + "desc": "WiFi名称以逗号分隔, 名单内将跳过策略切换" + } + ], + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Surge/JS/Bili_Auto_Regions.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/bilibili.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/bilibili.png" + ] + }, + { + "id": "TestFlightAccount", + "name": "TestFlight账户管理", + "keys": [ + "TESTFLIGHT-ACCOUNT" + ], + "descs_html": [ + "

脚本说明以及配置请查看脚本注释

" + ], + "settings": [ + { + "id": "@TESTFLIGHT-ACCOUNT.Debug", + "name": "开发者模式", + "val": false, + "type": "boolean", + "desc": "用于调试脚本, 一般用户请勿开启." + }, + { + "id": "@TESTFLIGHT-ACCOUNT.EnableCache", + "name": "启用缓存", + "val": true, + "type": "boolean", + "desc": "用于缓存APP列表, 改善列表页面加载过慢,需与\"请求超时\"配合使用。开启缓存并刷新列表后,可适当调小超时" + }, + { + "id": "@TESTFLIGHT-ACCOUNT.Timeout", + "name": "请求超时", + "val": "", + "type": "number", + "placeholder": "30", + "desc": "默认为30, 单位: 秒" + }, + { + "id": "@TESTFLIGHT-ACCOUNT.ForceIOSlist", + "name": "使用iOS应用列表", + "val": false, + "type": "boolean", + "desc": "强制使用iOS应用列表, 用于改善 macOS TestFlight 加载过慢, iOS用户无需开启" + } + ], + "scripts": [ + { + "name": "清除缓存", + "script": "https://gist.githubusercontent.com/NobyDa/d025c53d3922657f921b983ce129fc1d/raw/TestFlightAccountRemoveCache.js" + } + ], + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/TestFlight/TestFlightAccount.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/testflight.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/testflight.png" + ] + }, + { + "id": "Ctrip", + "name": "携程旅行", + "keys": [ + "CTRIP_DAILY_BONUS" + ], + "descs_html": [ + "

脚本说明以及配置请查看脚本注释

" + ], + "settings": [ + { + "id": "@CTRIP_DAILY_BONUS.Debug", + "name": "开发者模式", + "val": false, + "type": "boolean", + "desc": "用于调试脚本, 一般用户请勿开启." + } + ], + "script": "https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js", + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Ctrip-DailyBonus/Ctrip.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/ctrip.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/ctrip.png" + ] + }, + { + "id": "GoogleCAPTCHA", + "name": "Google搜索人机验证", + "keys": [ + "GOOGLE_CAPTCHA" + ], + "descs_html": [ + "

脚本说明以及配置请查看脚本注释

" + ], + "settings": [ + { + "id": "@GOOGLE_CAPTCHA.Regex", + "name": "代理策略/策略组正则表达式", + "val": "", + "type": "text", + "placeholder": "^(🇸🇬|🇭🇰)\\s.*\\d+$", + "desc": "筛选的代理策略/策略组, 限制20个, 留空则表示随机使用。" + }, + { + "id": "@GOOGLE_CAPTCHA.RegexTest", + "name": "正则表达式测试", + "val": "", + "type": "text", + "placeholder": "(🇸🇬|🇭🇰)", + "desc": "填写并保存后可在右上角测试匹配的策略/策略组。" + } + ], + "scripts": [ + { + "name": "测试匹配的策略/策略组", + "script": "https://gist.githubusercontent.com/NobyDa/830932e4526c9c84169020a56c3ef199/raw/GOOGLE_CAPTCHA_TEST_POLICY.js" + } + ], + "author": "@NobyDa", + "repo": "https://github.com/NobyDa/Script/blob/master/Surge/JS/Google_CAPTCHA.js", + "icons": [ + "https://raw.githubusercontent.com/NobyDa/mini/master/Alpha/Google.png", + "https://raw.githubusercontent.com/NobyDa/mini/master/Color/Google.png" + ] + } + ], + "task": [ + { + "config": "30 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js, tag=携程旅行签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/ctrip.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/CtripAuth.snippet, tag=携程旅行(获取授权)" + }, + { + "config": "5 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js, tag=爱奇艺签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/iQIYI.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/iQiYiCookie.snippet, tag=爱奇艺(获取Cookie)" + }, + { + "config": "10 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js, tag=哔哩漫画签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/BiliComicCookie.snippet, tag=哔哩漫画(获取Cookie)" + }, + { + "config": "10,20,30 0 12 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/ExchangePoints.js, tag=哔哩漫画抢券, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/manga.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/BiliComicCookie.snippet, tag=哔哩漫画(获取Cookie)" + }, + { + "config": "15 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js, tag=百度贴吧签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/tieba.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/TieBaCookie.snippet, tag=百度贴吧(获取Cookie)" + }, + { + "config": "25 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js, tag=快看漫画签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/KuaiKan.png", + "addons": "https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/KuaiKanCookie.snippet, tag=快看漫画(获取Cookie)" + }, + { + "config": "0 8 * * * https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js, tag=巴哈姆特签到, img-url=https://raw.githubusercontent.com/NobyDa/mini/master/Color/bahamutGame.png" + } + ] +} \ No newline at end of file diff --git a/QuantumultX/AdRule.list b/QuantumultX/AdRule.list index a1b068f129..f077f195cb 100644 --- a/QuantumultX/AdRule.list +++ b/QuantumultX/AdRule.list @@ -1,5 +1,5 @@ -# Update-2019.10.23 Self-use rule, Remove versus shenji duplicates and optimizations -# This rule does not include shenji +# Update > 2023/12/23 +DOMAIN-SUFFIX,api-access.pangolin-sdk-toutiao-b.com,REJECT DOMAIN-SUFFIX,apoll.m.taobao.com,REJECT DOMAIN-SUFFIX,comet.yahoo.com,REJECT DOMAIN-SUFFIX,gemini.yahoo.com,REJECT @@ -17,7 +17,6 @@ DOMAIN-SUFFIX,cupid.iqiyi.com,REJECT DOMAIN-SUFFIX,emoticon.sns.iqiyi.com,REJECT DOMAIN-SUFFIX,game.pps.tv,REJECT DOMAIN-SUFFIX,gamecenter.iqiyi.com,REJECT -DOMAIN-SUFFIX,hotchat-im.iqiyi.com,REJECT DOMAIN-SUFFIX,mbdlog.iqiyi.com,REJECT DOMAIN-SUFFIX,msg.iqiyi.com,REJECT DOMAIN-SUFFIX,msg.video.qiyi.com,REJECT @@ -136,7 +135,6 @@ DOMAIN-SUFFIX,m-78.jp,REJECT DOMAIN-SUFFIX,nichibenren.or.jp,REJECT DOMAIN-SUFFIX,nicorette.co.kr,REJECT DOMAIN-SUFFIX,adnet.sohu.com,REJECT -DOMAIN-SUFFIX,data.vod.itc.cn,REJECT DOMAIN-SUFFIX,epro.sogou.com,REJECT DOMAIN-SUFFIX,go.sohu.com,REJECT DOMAIN-SUFFIX,golden1.sogou.com,REJECT @@ -168,7 +166,6 @@ DOMAIN-SUFFIX,ad.video.51togic.com,REJECT DOMAIN-SUFFIX,biz5.kankan.com,REJECT DOMAIN-SUFFIX,c.algovid.com,REJECT DOMAIN-SUFFIX,cms.laifeng.com,REJECT -DOMAIN-SUFFIX,da.mmarket.com,REJECT DOMAIN-SUFFIX,dotcounter.douyutv.com,REJECT DOMAIN-SUFFIX,g.uusee.com,REJECT DOMAIN-SUFFIX,gcdn.2mdn.net,REJECT @@ -1296,7 +1293,6 @@ DOMAIN-SUFFIX,alertserver.ushaqi.com,REJECT DOMAIN-SUFFIX,alipay.dajiadou6.com,REJECT DOMAIN-SUFFIX,aliqqjd.cn,REJECT DOMAIN-SUFFIX,alisinak.com,REJECT -DOMAIN-SUFFIX,alissl.ucdl.pp.uc.cn,REJECT DOMAIN-SUFFIX,alistatic.cn,REJECT DOMAIN-SUFFIX,alitianxia168.com,REJECT DOMAIN-SUFFIX,alitui.weibo.com,REJECT @@ -1413,7 +1409,6 @@ DOMAIN-SUFFIX,api-flow.flyme.cn,REJECT DOMAIN-SUFFIX,api-game.meizu.com,REJECT DOMAIN-SUFFIX,apihk.growingio.com,REJECT DOMAIN-SUFFIX,api-push.meizu.com,REJECT -DOMAIN-SUFFIX,api-shoulei-ssl.xunlei.com,REJECT DOMAIN-SUFFIX,apisoft.df0535.com,REJECT DOMAIN-SUFFIX,apk.idate520.com,REJECT DOMAIN-SUFFIX,apk.supfast.net,REJECT @@ -2015,7 +2010,6 @@ DOMAIN-SUFFIX,cc.yac8.com,REJECT DOMAIN-SUFFIX,cca.mob.com,REJECT DOMAIN-SUFFIX,ccb.uncle-ad.com,REJECT DOMAIN-SUFFIX,ccbaihehq.com,REJECT -DOMAIN-SUFFIX,ccclub.cmbchina.com,REJECT DOMAIN-SUFFIX,cccrir.com,REJECT DOMAIN-SUFFIX,ccr.yxdown.com,REJECT DOMAIN-SUFFIX,cctyly.com,REJECT @@ -2055,7 +2049,6 @@ DOMAIN-SUFFIX,cdn.mdotm.com,REJECT DOMAIN-SUFFIX,cdn.media.innity.net,REJECT DOMAIN-SUFFIX,cdn.millennialmedia.com,REJECT DOMAIN-SUFFIX,cdn.mingmingtehui.com,REJECT -DOMAIN-SUFFIX,cdn.moji.com,REJECT DOMAIN-SUFFIX,cdn.moji002.com,REJECT DOMAIN-SUFFIX,cdn.moogos.com,REJECT DOMAIN-SUFFIX,cdn.ndapp.com,REJECT @@ -2187,7 +2180,6 @@ DOMAIN-SUFFIX,clkservice.union.youdao.com,REJECT DOMAIN-SUFFIX,clkservice.youdao.com,REJECT DOMAIN-SUFFIX,clkservice2.dict.youdao.com,REJECT DOMAIN-SUFFIX,cloud.codenow.cn,REJECT -DOMAIN-SUFFIX,cloud.rovio.com,REJECT DOMAIN-SUFFIX,cloud.zyiis.net,REJECT DOMAIN-SUFFIX,cloudad.asia,REJECT DOMAIN-SUFFIX,cloudcdn.yousee.com,REJECT @@ -2240,7 +2232,6 @@ DOMAIN-SUFFIX,co.dtech.baofeng.com,REJECT DOMAIN-SUFFIX,cocounion.com,REJECT DOMAIN-SUFFIX,cod.southmoney.com,REJECT DOMAIN-SUFFIX,code.3shangyou.com,REJECT -DOMAIN-SUFFIX,code.createjs.com,REJECT DOMAIN-SUFFIX,code.fastclick.net,REJECT DOMAIN-SUFFIX,code.hajuwang.cn,REJECT DOMAIN-SUFFIX,code.hot-mob.com,REJECT @@ -2528,7 +2519,6 @@ DOMAIN-SUFFIX,daima.youbian.com,REJECT DOMAIN-SUFFIX,daima123.cc,REJECT DOMAIN-SUFFIX,dairuqi.com,REJECT DOMAIN-SUFFIX,dajean.com,REJECT -DOMAIN-SUFFIX,dajiyuan.com,REJECT DOMAIN-SUFFIX,dajiyuan.org,REJECT DOMAIN-SUFFIX,dalianhengtai.com,REJECT DOMAIN-SUFFIX,dandan11.top,REJECT @@ -3159,8 +3149,6 @@ DOMAIN-SUFFIX,ent1.12584.cn,REJECT DOMAIN-SUFFIX,entry.baidu.com,REJECT DOMAIN-SUFFIX,e-p4p.163.com,REJECT DOMAIN-SUFFIX,epernn.cn,REJECT -DOMAIN-SUFFIX,epochtimes.org,REJECT -DOMAIN-SUFFIX,epochweekly.com,REJECT DOMAIN-SUFFIX,epowernetworktrackerimages.s3.amazonaws.com,REJECT DOMAIN-SUFFIX,er.dlhygj.com,REJECT DOMAIN-SUFFIX,erebor.douban.com,REJECT @@ -3302,7 +3290,6 @@ DOMAIN-SUFFIX,fge9vbrzwt.bid,REJECT DOMAIN-SUFFIX,fghm.ga25.com,REJECT DOMAIN-SUFFIX,fghmc.ga25.com,REJECT DOMAIN-SUFFIX,fghmimg.ga25.com,REJECT -DOMAIN-SUFFIX,fgmtv.org,REJECT DOMAIN-SUFFIX,file.bmob.cn,REJECT DOMAIN-SUFFIX,files2.sogou.com,REJECT DOMAIN-SUFFIX,fimserve.ign.com,REJECT @@ -3766,7 +3753,6 @@ DOMAIN-SUFFIX,huimee.net,REJECT DOMAIN-SUFFIX,huishenghuiying.com,REJECT DOMAIN-SUFFIX,humanding.com,REJECT DOMAIN-SUFFIX,hunpingou.com,REJECT -DOMAIN-SUFFIX,huoying666.com,REJECT DOMAIN-SUFFIX,hv.code.tanwanyx.com,REJECT DOMAIN-SUFFIX,hw6.com,REJECT DOMAIN-SUFFIX,hwt.player888.cn,REJECT @@ -3796,7 +3782,6 @@ DOMAIN-SUFFIX,i.bigmir.net,REJECT DOMAIN-SUFFIX,i.clkservice.youdao.com,REJECT DOMAIN-SUFFIX,i.dreamfull.cn,REJECT DOMAIN-SUFFIX,i.flow.browser.oppomobile.com,REJECT -DOMAIN-SUFFIX,i.gdt.qq.com,REJECT DOMAIN-SUFFIX,i.go.sohu.com,REJECT DOMAIN-SUFFIX,i.haloapps.com,REJECT DOMAIN-SUFFIX,i.hao61.net,REJECT @@ -4566,7 +4551,6 @@ DOMAIN-SUFFIX,liangao.com,REJECT DOMAIN-SUFFIX,liangziweixg.com,REJECT DOMAIN-SUFFIX,lib.haotv8.com,REJECT DOMAIN-SUFFIX,liba.haotv8.com,REJECT -DOMAIN-SUFFIX,libs.baidu.com,REJECT DOMAIN-SUFFIX,libs.tvmao.cn,REJECT DOMAIN-SUFFIX,license.lumion3d.com,REJECT DOMAIN-SUFFIX,license.lumion3d.net,REJECT @@ -5091,7 +5075,6 @@ DOMAIN-SUFFIX,maw.wnbfw.com,REJECT DOMAIN-SUFFIX,maxwebsearch.com,REJECT DOMAIN-SUFFIX,maysunmedia.com,REJECT DOMAIN-SUFFIX,mb.hockeybuzz.com,REJECT -DOMAIN-SUFFIX,mb.yidianzixun.com,REJECT DOMAIN-SUFFIX,mb.zam.com,REJECT DOMAIN-SUFFIX,mbai.cn,REJECT DOMAIN-SUFFIX,mbd.weathercn.com,REJECT @@ -5831,7 +5814,6 @@ DOMAIN-SUFFIX,promos.fling.com,REJECT DOMAIN-SUFFIX,promote.biz.weibo.cn,REJECT DOMAIN-SUFFIX,promote.caixin.com,REJECT DOMAIN-SUFFIX,promote.pair.com,REJECT -DOMAIN-SUFFIX,promotion.aliyun.com,REJECT DOMAIN-SUFFIX,promotion.gomlab.com,REJECT DOMAIN-SUFFIX,promotions.iasbet.com,REJECT DOMAIN-SUFFIX,propellerads.com,REJECT @@ -6130,7 +6112,6 @@ DOMAIN-SUFFIX,rotate.ymtracking.com,REJECT DOMAIN-SUFFIX,rotator.tradetracker.net,REJECT DOMAIN-SUFFIX,router.bittorrent.com,REJECT DOMAIN-SUFFIX,router.gwdang.com,REJECT -DOMAIN-SUFFIX,rovio-news-app.angrybirdsgame.com,REJECT DOMAIN-SUFFIX,rp.crasheye.cn,REJECT DOMAIN-SUFFIX,rp.gwallet.com,REJECT DOMAIN-SUFFIX,rpaulfrank.com,REJECT @@ -6382,7 +6363,6 @@ DOMAIN-SUFFIX,searchignited.com,REJECT DOMAIN-SUFFIX,searchswapper.com,REJECT DOMAIN-SUFFIX,seavideo-ak.espn.go.com,REJECT DOMAIN-SUFFIX,sebar.thand.info,REJECT -DOMAIN-SUFFIX,sec.resource.xiaomi.net,REJECT DOMAIN-SUFFIX,secpay.wostore.cn,REJECT DOMAIN-SUFFIX,secretmedia.s3.amazonaws.com,REJECT DOMAIN-SUFFIX,secure.dsp.com,REJECT @@ -6443,9 +6423,7 @@ DOMAIN-SUFFIX,shbywsd.cn,REJECT DOMAIN-SUFFIX,shenghuo.xiaomi.com,REJECT DOMAIN-SUFFIX,shenleyuni.com,REJECT DOMAIN-SUFFIX,shenyian.net,REJECT -DOMAIN-SUFFIX,shenyun.com,REJECT DOMAIN-SUFFIX,shenyun.org,REJECT -DOMAIN-SUFFIX,shenyunperformingarts.org,REJECT DOMAIN-SUFFIX,shglegle.com,REJECT DOMAIN-SUFFIX,shibeiou.com,REJECT DOMAIN-SUFFIX,shiftrro.com,REJECT @@ -6973,8 +6951,6 @@ DOMAIN-SUFFIX,tuanxue360.net,REJECT DOMAIN-SUFFIX,tui.gtimg.com,REJECT DOMAIN-SUFFIX,tui1999.com,REJECT DOMAIN-SUFFIX,tui98.cn,REJECT -DOMAIN-SUFFIX,tuidang.epochtimes.org,REJECT -DOMAIN-SUFFIX,tuidang.org,REJECT DOMAIN-SUFFIX,tuigoo.com,REJECT DOMAIN-SUFFIX,tuiguang.178.com,REJECT DOMAIN-SUFFIX,tuiguang.meitu.com,REJECT @@ -7616,7 +7592,6 @@ DOMAIN-SUFFIX,xingjuhe.com,REJECT DOMAIN-SUFFIX,xiniuz.com,REJECT DOMAIN-SUFFIX,xinju.cc,REJECT DOMAIN-SUFFIX,xinray.com,REJECT -DOMAIN-SUFFIX,xinsheng.net,REJECT DOMAIN-SUFFIX,xiongdong.com,REJECT DOMAIN-SUFFIX,xiuxiu.android.dl.meitu.com,REJECT DOMAIN-SUFFIX,xiuxiu.mobile.meitudata.com,REJECT @@ -7894,7 +7869,6 @@ DOMAIN-SUFFIX,zhaoshang8.com,REJECT DOMAIN-SUFFIX,zh-cn.shenyun.com,REJECT DOMAIN-SUFFIX,zh-cn.shenyun.org,REJECT DOMAIN-SUFFIX,zheng.cs12d.com,REJECT -DOMAIN-SUFFIX,zhengjian.org,REJECT DOMAIN-SUFFIX,zhichi08.com,REJECT DOMAIN-SUFFIX,zhidian3g.cn,REJECT DOMAIN-SUFFIX,zhifenjie.com,REJECT @@ -7909,7 +7883,6 @@ DOMAIN-SUFFIX,zhtjdl.com,REJECT DOMAIN-SUFFIX,zhuanfakong.com,REJECT DOMAIN-SUFFIX,zhuba8.com,REJECT DOMAIN-SUFFIX,zhudiaosz.com,REJECT -DOMAIN-SUFFIX,zhuichaguoji.org,REJECT DOMAIN-SUFFIX,zhushou.2345.com,REJECT DOMAIN-SUFFIX,zhuuv.maoyumao.net,REJECT DOMAIN-SUFFIX,zhwnlapi.etouch.cn,REJECT @@ -7978,4 +7951,8 @@ DOMAIN-SUFFIX,zzy1.quyaoya.com,REJECT DOMAIN-SUFFIX,zzz7.52896368.com,REJECT DOMAIN-SUFFIX,zzzzz4.52896368.com,REJECT DOMAIN-SUFFIX,analytics.query.yahoo.com,REJECT -DOMAIN-SUFFIX,is.snssdk.com,REJECT \ No newline at end of file +DOMAIN-SUFFIX,ap.dongqiudi.com,REJECT +DOMAIN-SUFFIX,adx.open-adx.com,REJECT +DOMAIN-SUFFIX,adservice.sigmob.cn,REJECT +DOMAIN-SUFFIX,unidesk.alicdn.com,REJECT +DOMAIN-SUFFIX,mcupdate.gstarcad.com,REJECT \ No newline at end of file diff --git a/QuantumultX/AdRuleTest.list b/QuantumultX/AdRuleTest.list index 861fc9b1f8..48b0903ea1 100644 --- a/QuantumultX/AdRuleTest.list +++ b/QuantumultX/AdRuleTest.list @@ -1,4 +1,4 @@ -#Update 2019.11.21 Self-use for testing only, there may be a lot of manslaughter. +#Update 2021.1.30 Self-use for testing only DOMAIN-SUFFIX,admaster.com,REJECT DOMAIN-SUFFIX,0z5jn.cn,REJECT DOMAIN-SUFFIX,114so.cn,REJECT @@ -93,7 +93,6 @@ DOMAIN-SUFFIX,xiazai.mathtype.cn,REJECT DOMAIN-SUFFIX,xiazai.ntfsformac.cn,REJECT DOMAIN-SUFFIX,xiazai.xmindchina.cn,REJECT DOMAIN-SUFFIX,yunpifu.cn,REJECT -DOMAIN-SUFFIX,uczzd.cn,REJECT DOMAIN-SUFFIX,testin.cn,REJECT DOMAIN-SUFFIX,cccwwwr.com,REJECT DOMAIN-SUFFIX,mmkkiivv.com,REJECT @@ -137,7 +136,6 @@ DOMAIN-SUFFIX,adfilter.imtt.qq.com,REJECT DOMAIN-SUFFIX,adsrich.qq.com,REJECT DOMAIN-SUFFIX,aexception.bugly.qq.com,REJECT DOMAIN-SUFFIX,android.bugly.qq.com,REJECT -DOMAIN-SUFFIX,appsupport.qq.com,REJECT DOMAIN-SUFFIX,astat.bugly.qq.com,REJECT DOMAIN-SUFFIX,beacon.qq.com,REJECT DOMAIN-SUFFIX,bs.l.qq.com,REJECT @@ -146,15 +144,12 @@ DOMAIN-SUFFIX,bugreportv2.qq.com,REJECT DOMAIN-SUFFIX,c.l.qq.com,REJECT DOMAIN-SUFFIX,c2.l.qq.com,REJECT DOMAIN-SUFFIX,cb.l.qq.com,REJECT -DOMAIN-SUFFIX,cdn.ark.qq.com,REJECT DOMAIN-SUFFIX,cfg.imtt.qq.com,REJECT -DOMAIN-SUFFIX,cgi.connect.qq.com,REJECT DOMAIN-SUFFIX,client.show.qq.com,REJECT DOMAIN-SUFFIX,cm.e.qq.com,REJECT DOMAIN-SUFFIX,cm.l.qq.com,REJECT DOMAIN-SUFFIX,dir.minigame.qq.com,REJECT DOMAIN-SUFFIX,etg.qq.com,REJECT -DOMAIN-SUFFIX,ex.qq.com,REJECT DOMAIN-SUFFIX,fm.qzone.qq.com,REJECT DOMAIN-SUFFIX,fodder.qq.com,REJECT DOMAIN-SUFFIX,fodder.tc.qq.com,REJECT @@ -362,7 +357,6 @@ DOMAIN-SUFFIX,cpro.baidustatic.com,REJECT DOMAIN-SUFFIX,cpro.tieba.baidu.com,REJECT DOMAIN-SUFFIX,cpro2.baidustatic.com,REJECT DOMAIN-SUFFIX,dup.baidustatic.com,REJECT -DOMAIN-SUFFIX,f10.baidu.com,REJECT DOMAIN-SUFFIX,hm.baidu.com,REJECT DOMAIN-SUFFIX,hmma.baidu.com,REJECT DOMAIN-SUFFIX,idm.bce.baidu.com,REJECT @@ -443,7 +437,6 @@ DOMAIN-SUFFIX,a.tanx.com,REJECT DOMAIN-SUFFIX,a1.img.static.youmi.net,REJECT DOMAIN-SUFFIX,a2.img.static.youmi.net,REJECT DOMAIN-SUFFIX,a3.img.static.youmi.net,REJECT -DOMAIN-SUFFIX,aboluowang.com,REJECT DOMAIN-SUFFIX,acceptable.a-ads.com,REJECT DOMAIN-SUFFIX,acookie.linezing.com,REJECT DOMAIN-SUFFIX,activity.tuipear.com,REJECT @@ -607,8 +600,6 @@ DOMAIN-SUFFIX,diagnostics.support.microsoft.com,REJECT DOMAIN-SUFFIX,digg.analytics.live.com,REJECT DOMAIN-SUFFIX,distf.stat.kankan.com,REJECT DOMAIN-SUFFIX,dmm.aizhan.com,REJECT -DOMAIN-SUFFIX,dongtaiwang.com,REJECT -DOMAIN-SUFFIX,dongtaiwang.org,REJECT DOMAIN-SUFFIX,dualstack.adsame-1421766300.ap-southeast-1.elb.amazonaws.com,REJECT DOMAIN-SUFFIX,duomai.com,REJECT DOMAIN-SUFFIX,dw-collect.ksosoft.com,REJECT @@ -631,7 +622,6 @@ DOMAIN-SUFFIX,ecpm.tanx.com,REJECT DOMAIN-SUFFIX,ef-dongfeng.tanx.com,REJECT DOMAIN-SUFFIX,ef.opendsp.tanx.com,REJECT DOMAIN-SUFFIX,ef.tanx.com,REJECT -DOMAIN-SUFFIX,epochtimes.com,REJECT DOMAIN-SUFFIX,eso999.com,REJECT DOMAIN-SUFFIX,et.tanx.com,REJECT DOMAIN-SUFFIX,et.w.inmobi.com,REJECT @@ -753,9 +743,7 @@ DOMAIN-SUFFIX,m.nbhaosheng168.com,REJECT DOMAIN-SUFFIX,m.rpaulfrank.com,REJECT DOMAIN-SUFFIX,m.tixing51.net,REJECT DOMAIN-SUFFIX,match.adsrvr.org,REJECT -DOMAIN-SUFFIX,mhradio.org,REJECT DOMAIN-SUFFIX,minghui.com,REJECT -DOMAIN-SUFFIX,minghui.org,REJECT DOMAIN-SUFFIX,mixpanel.com,REJECT DOMAIN-SUFFIX,mobaders.com,REJECT DOMAIN-SUFFIX,mobile.log.hunantv.com,REJECT @@ -767,7 +755,6 @@ DOMAIN-SUFFIX,new.taobc.com,REJECT DOMAIN-SUFFIX,news.766ba.net,REJECT DOMAIN-SUFFIX,news.qhstatic.com,REJECT DOMAIN-SUFFIX,ns8.adk2x.com,REJECT -DOMAIN-SUFFIX,ntdtv.com,REJECT DOMAIN-SUFFIX,ntdtv.org,REJECT DOMAIN-SUFFIX,ntjacb.com,REJECT DOMAIN-SUFFIX,ntpddq.com,REJECT @@ -813,7 +800,6 @@ DOMAIN-SUFFIX,rc.mxmrt.com,REJECT DOMAIN-SUFFIX,rc.nxrxt.com,REJECT DOMAIN-SUFFIX,rdstat.tanx.com,REJECT DOMAIN-SUFFIX,redir.metaservices.microsoft.com,REJECT -DOMAIN-SUFFIX,renminbao.com,REJECT DOMAIN-SUFFIX,report.qcloud.com,REJECT DOMAIN-SUFFIX,rl.go2yd.com,REJECT DOMAIN-SUFFIX,rs.haohaowan8.com,REJECT @@ -844,11 +830,9 @@ DOMAIN-SUFFIX,sec-cdn.static.xiaomi.net,REJECT DOMAIN-SUFFIX,settings-sandbox.data.microsoft.com,REJECT DOMAIN-SUFFIX,sg.keytui.com,REJECT DOMAIN-SUFFIX,shentus.com,REJECT -DOMAIN-SUFFIX,shenzhoufilm.com,REJECT DOMAIN-SUFFIX,shifen.com,REJECT DOMAIN-SUFFIX,shooter.m.jd.com,REJECT DOMAIN-SUFFIX,shouji.sougou.com,REJECT -DOMAIN-SUFFIX,soundofhope.org,REJECT DOMAIN-SUFFIX,spcdnsp.i-mobile.co.jp,REJECT DOMAIN-SUFFIX,sqm.telemetry.microsoft.com.nsatc.net,REJECT DOMAIN-SUFFIX,srv.buysellads.com,REJECT @@ -926,7 +910,6 @@ DOMAIN-SUFFIX,track.eyeviewads.com,REJECT DOMAIN-SUFFIX,tracker.yhd.com,REJECT DOMAIN-SUFFIX,tracklog.58.com,REJECT DOMAIN-SUFFIX,trc.taboola.com,REJECT -DOMAIN-SUFFIX,tuidang.epochtimes.com,REJECT DOMAIN-SUFFIX,tvupgrade.yunos.com,REJECT DOMAIN-SUFFIX,u-x.jd.com,REJECT DOMAIN-SUFFIX,u.123hala.com,REJECT @@ -937,7 +920,6 @@ DOMAIN-SUFFIX,uimg.123hala.com,REJECT DOMAIN-SUFFIX,uma.gtags.net,REJECT DOMAIN-SUFFIX,ums.adtechjp.com,REJECT DOMAIN-SUFFIX,ums.adtechus.com,REJECT -DOMAIN-SUFFIX,umtrack.com,REJECT DOMAIN-SUFFIX,union2.50bang.org,REJECT DOMAIN-SUFFIX,up1.tj.u2.ucweb.com,REJECT DOMAIN-SUFFIX,update.123juzi.net,REJECT @@ -971,7 +953,6 @@ DOMAIN-SUFFIX,whzhi.com,REJECT DOMAIN-SUFFIX,wmedia.adk2x.com,REJECT DOMAIN-SUFFIX,wn.x.jd.com,REJECT DOMAIN-SUFFIX,wrating.com,REJECT -DOMAIN-SUFFIX,wujieliulan.com,REJECT DOMAIN-SUFFIX,wvver.com,REJECT DOMAIN-SUFFIX,ww6.adm-cnzz.net,REJECT DOMAIN-SUFFIX,wwetjy.com,REJECT @@ -1021,23 +1002,15 @@ DOMAIN-SUFFIX,zhugeio.com,REJECT DOMAIN-SUFFIX,zjuwjdc.com,REJECT DOMAIN-SUFFIX,zszrb.com,REJECT DOMAIN-SUFFIX,zz2.hslyqs.com,REJECT -DOMAIN,ad.10010.com,REJECT -DOMAIN,log.b612kaji.com,REJECT -DOMAIN,log.snssdk.com,REJECT -DOMAIN,log.star.ele.me,REJECT -DOMAIN,log.umsns.com,REJECT -DOMAIN,log.voicecloud.cn,REJECT -DOMAIN,log.ys7.com,REJECT -DOMAIN,pagead2.googlesyndication.com,REJECT -DOMAIN,report.jpush.cn,REJECT -DOMAIN,s0.2mdn.net,REJECT -DOMAIN,sp0.baidu.com,REJECT -DOMAIN,static.jpush.cn,REJECT -DOMAIN,static.vuevideo.net,REJECT -DOMAIN,stats.jpush.cn,REJECT -DOMAIN,stats.umsns.com,REJECT -DOMAIN,wgo.mmstat.com,REJECT -DOMAIN,zz.bdstatic.com,REJECT +DOMAIN-SUFFIX,ad.10010.com,REJECT +DOMAIN-SUFFIX,log.b612kaji.com,REJECT +DOMAIN-SUFFIX,log.snssdk.com,REJECT +DOMAIN-SUFFIX,log.star.ele.me,REJECT +DOMAIN-SUFFIX,log.ys7.com,REJECT +DOMAIN-SUFFIX,report.jpush.cn,REJECT +DOMAIN-SUFFIX,static.jpush.cn,REJECT +DOMAIN-SUFFIX,static.vuevideo.net,REJECT +DOMAIN-SUFFIX,stats.jpush.cn,REJECT DOMAIN-SUFFIX,3lift.com,REJECT DOMAIN-SUFFIX,56txs4.com,REJECT DOMAIN-SUFFIX,ad373.com,REJECT @@ -1114,20 +1087,8 @@ DOMAIN-SUFFIX,webspectator.com,REJECT DOMAIN-SUFFIX,xadchina.cn,REJECT DOMAIN-SUFFIX,yldbt.com,REJECT DOMAIN-SUFFIX,ymtracking.com,REJECT -DOMAIN,apoll.m.taobao.com,REJECT -DOMAIN,wn.pos.baidu.com,REJECT -DOMAIN,ps.map.baidu.com,REJECT -DOMAIN,sv.map.baidu.com,REJECT -DOMAIN,offnavi.map.baidu.com,REJECT -DOMAIN,newvector.map.baidu.com,REJECT -DOMAIN,ulog.imap.baidu.com,REJECT -DOMAIN,newloc.map.n.shifen.com,REJECT -DOMAIN,thirdparty.biliapi.com,REJECT -DOMAIN,cm.bilibili.com,REJECT -DOMAIN,mbdlog.iqiyi.com,REJECT -DOMAIN,mi.gdt.qq.com,REJECT -DOMAIN,o2o.api.xiaomi.com,REJECT -DOMAIN,mqtt.zhihu.com,REJECT +DOMAIN-SUFFIX,thirdparty.biliapi.com,REJECT +DOMAIN-SUFFIX,mqtt.zhihu.com,REJECT DOMAIN-SUFFIX,linktech.cn,REJECT DOMAIN-SUFFIX,t7z.cupid.iqiyi.com,REJECT DOMAIN-SUFFIX,n.mark.letv.com,REJECT @@ -1157,69 +1118,17 @@ DOMAIN-SUFFIX,catch.gift,REJECT DOMAIN-SUFFIX,dfp.suning.com,REJECT DOMAIN-SUFFIX,ggs.myzaker.com,REJECT DOMAIN-SUFFIX,huodonghezi.com,REJECT -DOMAIN-SUFFIX,iadmat.nosdn.127.net,REJECT DOMAIN-SUFFIX,iadmusicmat.music.126.net,REJECT DOMAIN-SUFFIX,imgad0.pconline.com.cn,REJECT DOMAIN-SUFFIX,imgadpai.thepaper.cn,REJECT DOMAIN-SUFFIX,impservice.dictapp.youdao.com,REJECT -DOMAIN-SUFFIX,lbs.map.qq.com,REJECT DOMAIN-SUFFIX,miniapp.bilibili.com,REJECT DOMAIN-SUFFIX,mmstat.com,REJECT DOMAIN-SUFFIX,mobilead.kuwo.cn,REJECT -DOMAIN-SUFFIX,mtalk.google.com,REJECT DOMAIN-SUFFIX,pv.sohu.com,REJECT DOMAIN-SUFFIX,rd.autohome.com.cn,REJECT DOMAIN-SUFFIX,rich.kuwo.cn,REJECT -DOMAIN-SUFFIX,thirdparty.biliapi.com,REJECT DOMAIN-SUFFIX,yt-adp.nosdn.127.net,REJECT -DOMAIN-KEYWORD,admaster,REJECT -DOMAIN-KEYWORD,admdfs,REJECT -DOMAIN-KEYWORD,adnewnc,REJECT -DOMAIN-KEYWORD,adsage,REJECT -DOMAIN-KEYWORD,adsame,REJECT -DOMAIN-KEYWORD,adsensor,REJECT -DOMAIN-KEYWORD,adserver,REJECT -DOMAIN-KEYWORD,adsmogo,REJECT -DOMAIN-KEYWORD,adsrvmedia,REJECT -DOMAIN-KEYWORD,adsserving,REJECT -DOMAIN-KEYWORD,adsystem,REJECT -DOMAIN-KEYWORD,advert,REJECT -DOMAIN-KEYWORD,adwords,REJECT -DOMAIN-KEYWORD,allyes,REJECT -DOMAIN-KEYWORD,analysys,REJECT -DOMAIN-KEYWORD,applovin,REJECT -DOMAIN-KEYWORD,appsflyer,REJECT -DOMAIN-KEYWORD,dnserror,REJECT -DOMAIN-KEYWORD,domob,REJECT -DOMAIN-KEYWORD,duomeng,REJECT -DOMAIN-KEYWORD,dwtrack,REJECT -DOMAIN-KEYWORD,fenxi,REJECT -DOMAIN-KEYWORD,googleads,REJECT -DOMAIN-KEYWORD,guanggao,REJECT -DOMAIN-KEYWORD,inmobi,REJECT -DOMAIN-KEYWORD,lianmeng,REJECT -DOMAIN-KEYWORD,mobaders,REJECT -DOMAIN-KEYWORD,omgmta,REJECT -DOMAIN-KEYWORD,omniture,REJECT -DOMAIN-KEYWORD,openx,REJECT -DOMAIN-KEYWORD,partnerad,REJECT -DOMAIN-KEYWORD,securepubads,REJECT -DOMAIN-KEYWORD,socdm,REJECT -DOMAIN-KEYWORD,supersonicads,REJECT -DOMAIN-KEYWORD,taboola,REJECT -DOMAIN-KEYWORD,traffic,REJECT -DOMAIN-KEYWORD,uedas,REJECT -DOMAIN-KEYWORD,umtrack,REJECT -DOMAIN-KEYWORD,uploadMobileData,REJECT -DOMAIN-KEYWORD,wlmonitor,REJECT -DOMAIN-KEYWORD,zjtoolbar,REJECT -DOMAIN-KEYWORD,admarvel,REJECT -DOMAIN-KEYWORD,adservice,REJECT -DOMAIN-KEYWORD,crashlytics,REJECT -DOMAIN-KEYWORD,pingfore,REJECT -DOMAIN-KEYWORD,tracking,REJECT -DOMAIN-KEYWORD,umeng,REJECT -DOMAIN-KEYWORD,usage,REJECT DOMAIN-SUFFIX,e.xroun.com,REJECT DOMAIN-SUFFIX,dflooring.com,REJECT DOMAIN-SUFFIX,www.googleadservices.com,REJECT @@ -1233,13 +1142,9 @@ DOMAIN-SUFFIX,gss0.bdstatic.com,REJECT DOMAIN-SUFFIX,alogs.umengcloud.com,REJECT DOMAIN-SUFFIX,sss.bxmns.com,REJECT DOMAIN-SUFFIX,extlog.snssdk.com,REJECT -DOMAIN-SUFFIX,play.googleapis.com,REJECT DOMAIN-SUFFIX,dcps.nuomi.com,REJECT DOMAIN-SUFFIX,focusbaiduafp.allyes.com,REJECT -DOMAIN,em.baidu.com,REJECT DOMAIN-SUFFIX,m.simaba.taobao.com,REJECT -DOMAIN,sbeacon.sina.com.cn,REJECT -DOMAIN,log.sina.cn,REJECT DOMAIN-SUFFIX,ltsdl.qq.com,REJECT DOMAIN-SUFFIX,yhzbjz.com,REJECT DOMAIN-SUFFIX,ordidc.com,REJECT @@ -1275,38 +1180,72 @@ DOMAIN-SUFFIX,go-mpulse,REJECT DOMAIN-SUFFIX,optimizely.com,REJECT DOMAIN-SUFFIX,umsns.com,REJECT DOMAIN-SUFFIX,x.jd.com,REJECT -DOMAIN,log.tu.baixing.com,REJECT -DOMAIN-SUFFIX,sf3-ttcdn-tos.pstatp.com,REJECT DOMAIN-SUFFIX,ads.api.vungle.com,REJECT DOMAIN-SUFFIX,ads.wakamoment.tk,REJECT -DOMAIN,wa.gtimg.com,REJECT -DOMAIN,dsp.edm.weibo.cn,REJECT -DOMAIN,e.crashlytics.com,REJECT -DOMAIN,unidesk.alicdn.com,REJECT -DOMAIN,cdn-adphone.wenhua.com.cn,REJECT -DOMAIN,api.e.qq.com,REJECT -DOMAIN,net.rayjump.com,REJECT -DOMAIN,report.adview.cn,REJECT +DOMAIN-SUFFIX,dsp.edm.weibo.cn,REJECT +DOMAIN-SUFFIX,cdn-adphone.wenhua.com.cn,REJECT +DOMAIN-SUFFIX,api.e.qq.com,REJECT DOMAIN-SUFFIX,doubleclick.net,REJECT -DOMAIN,gorgon.youdao.com,REJECT -DOMAIN,video.c-ctrip.com,REJECT -DOMAIN,agn.aty.sohu.com,REJECT -DOMAIN,map-mobile-opnimg.cdn.bcebos.com,REJECT -DOMAIN,mf.atm.youku.com,REJECT +DOMAIN-SUFFIX,video.c-ctrip.com,REJECT +DOMAIN-SUFFIX,agn.aty.sohu.com,REJECT +DOMAIN-SUFFIX,map-mobile-opnimg.cdn.bcebos.com,REJECT DOMAIN-SUFFIX,app.adjust.com,REJECT -DOMAIN-SUFFIX,mob.com,REJECT DOMAIN-SUFFIX,adthor.com,REJECT DOMAIN-SUFFIX,pubnative.net,REJECT DOMAIN-SUFFIX,flurry.com,REJECT -DOMAIN-SUFFIX,igexin.com,REJECT DOMAIN-SUFFIX,ios.bugly.qq.com,REJECT DOMAIN-SUFFIX,iadsdk.apple.com,REJECT -DOMAIN-KEYWORD,adashx,REJECT -DOMAIN-KEYWORD,track,REJECT -DOMAIN-KEYWORD,talkingdata,REJECT DOMAIN-SUFFIX,www.jinshanju.com,REJECT -DOMAIN-SUFFIX,iesdouyin.com,REJECT DOMAIN-SUFFIX,test-www.douyin.com,REJECT DOMAIN-SUFFIX,safebrowsing.urlsec.qq.com,REJECT DOMAIN-SUFFIX,adserver-ad.321mh.com,REJECT -DOMAIN-SUFFIX,lelefenxi.com,REJECT \ No newline at end of file +DOMAIN-SUFFIX,lelefenxi.com,REJECT +DOMAIN-KEYWORD,admaster,REJECT +DOMAIN-KEYWORD,admdfs,REJECT +DOMAIN-KEYWORD,adnewnc,REJECT +DOMAIN-KEYWORD,adsage,REJECT +DOMAIN-KEYWORD,adsame,REJECT +DOMAIN-KEYWORD,adsensor,REJECT +DOMAIN-KEYWORD,adserver,REJECT +DOMAIN-KEYWORD,adsmogo,REJECT +DOMAIN-KEYWORD,adsrvmedia,REJECT +DOMAIN-KEYWORD,adsserving,REJECT +DOMAIN-KEYWORD,adsystem,REJECT +DOMAIN-KEYWORD,advert,REJECT +DOMAIN-KEYWORD,adwords,REJECT +DOMAIN-KEYWORD,allyes,REJECT +DOMAIN-KEYWORD,analysys,REJECT +DOMAIN-KEYWORD,applovin,REJECT +DOMAIN-KEYWORD,appsflyer,REJECT +DOMAIN-KEYWORD,dnserror,REJECT +DOMAIN-KEYWORD,domob,REJECT +DOMAIN-KEYWORD,duomeng,REJECT +DOMAIN-KEYWORD,dwtrack,REJECT +DOMAIN-KEYWORD,fenxi,REJECT +DOMAIN-KEYWORD,googleads,REJECT +DOMAIN-KEYWORD,guanggao,REJECT +DOMAIN-KEYWORD,inmobi,REJECT +DOMAIN-KEYWORD,lianmeng,REJECT +DOMAIN-KEYWORD,mobaders,REJECT +DOMAIN-KEYWORD,omgmta,REJECT +DOMAIN-KEYWORD,omniture,REJECT +DOMAIN-KEYWORD,openx,REJECT +DOMAIN-KEYWORD,partnerad,REJECT +DOMAIN-KEYWORD,securepubads,REJECT +DOMAIN-KEYWORD,socdm,REJECT +DOMAIN-KEYWORD,supersonicads,REJECT +DOMAIN-KEYWORD,taboola,REJECT +DOMAIN-KEYWORD,traffic,REJECT +DOMAIN-KEYWORD,uedas,REJECT +DOMAIN-KEYWORD,uploadMobileData,REJECT +DOMAIN-KEYWORD,wlmonitor,REJECT +DOMAIN-KEYWORD,zjtoolbar,REJECT +DOMAIN-KEYWORD,admarvel,REJECT +DOMAIN-KEYWORD,adservice,REJECT +DOMAIN-KEYWORD,crashlytics,REJECT +DOMAIN-KEYWORD,pingfore,REJECT +DOMAIN-KEYWORD,tracking,REJECT +DOMAIN-KEYWORD,umeng,REJECT +DOMAIN-KEYWORD,usage,REJECT +DOMAIN-KEYWORD,adashx,REJECT +DOMAIN-KEYWORD,talkingdata,REJECT \ No newline at end of file diff --git a/QuantumultX/Bilibili.list b/QuantumultX/Bilibili.list new file mode 100644 index 0000000000..fee8848e83 --- /dev/null +++ b/QuantumultX/Bilibili.list @@ -0,0 +1,13 @@ +# 该规则集用于配合bilibili自动地区脚本使用。 +host,api.biliapi.com,Bilibili +host,api.biliapi.net,Bilibili +host,api.bilibili.com,Bilibili +host,app.biliapi.com,Bilibili +host,app.biliapi.net,Bilibili +host,app.bilibili.com,Bilibili +host,grpc.biliapi.net,Bilibili +host,m.bilibili.com,Bilibili +host,upos-hz-mirrorakam.akamaized.net,Bilibili +host,www.bilibili.com,Bilibili +host-keyword,cn-hk-eq-bcache-,Bilibili +ip-cidr,121.11.192.0/24,Bilibili \ No newline at end of file diff --git a/QuantumultX/DisneyRating.snippet b/QuantumultX/DisneyRating.snippet new file mode 100644 index 0000000000..5ae613e3d9 --- /dev/null +++ b/QuantumultX/DisneyRating.snippet @@ -0,0 +1,7 @@ +# Disney+剧集页显示IMDb / 烂番茄 / 豆瓣评分 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/DisneyRating.snippet + + +^https:\/\/disney\.api\.edge\.bamgrid\.com\/explore\/v\d\.\d+\/page\/entity- url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Disney/DisneyRating.js + +hostname = disney.api.edge.bamgrid.com \ No newline at end of file diff --git a/QuantumultX/File/91.js b/QuantumultX/File/91.js index 07b72bdf8d..4fcbe4c743 100644 --- a/QuantumultX/File/91.js +++ b/QuantumultX/File/91.js @@ -1,20 +1,29 @@ /* -91 short video unlock vip -app download link : http://i91.porn +91短视频 解锁部分限制 +http://download.91porn.love/ -QX1.0.0: -^https?:\/\/.+\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5})?\/api.php$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/91.js +*************************** +QuantumultX: -Surge4.0: -http-request ^https?:\/\/.+\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5})?\/api.php$ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/91ShortVideo.js -*/ +[rewrite_local] +^https?:\/\/.+?\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5}|)\/api.php$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/91.js -var body = $response.body; -var obj = JSON.parse(body); -var headers = $request.headers; -let length = headers['Content-Length']; -if(length == 462 || length == 464 || length == 466 || length == 570 || length == 572 || length == 574) { - obj['data'] = "FCA27C420C9BC230C86627D052F62E5E04CC1B51BF986A7C60673DC92F82697E9EB8C7BFB5AA267AC87399CDF8DBD1B1B25FEA57E27F38D0FCFB0CA5CFD8ED7B809FBCF3372C4DBB22083C4BC85A039512735A83834D7450EFD24EA2712FF841050BE99B7A4A31BBFCBE28BD3522227838BABE6E372874533E51A59A81CBFCB9C943C5C9646091E408D3B68BF6122DA929D558290D186EFBA2BE8019B86E35CB174626952650A959CA1A116ADCF1B14773DB033A8055E56F673682219629775138CDF3C653A0179232C8B653FDEB45D704140F8CA0C7716A02E5F7ED7CB41A68A247E9ECC0B744318534B0501865FBDF68AA1E7167663B59EDD8C56114E4A52B52A2020CA89B0F06F9D626BE3446ED5BF64E2FEE7AEA815CC047DBF3AE0F07DF1B4856070430ECF72AA542E22AF59861F2E48099C6E2CF2C1E3DD938196CB40FEE135A61AC76AAE6011C5A126CF9477AA0FDB76BE94279B66063E93E0FC8CFD802D0E2326B462EE26BF073E22B19A60F8BAF74C891DC57B18C8EFA091C9C66B6E94468E9A7165403A0CD2A3D45B23B2A0A43CEEF16FAF704866B6AC10686C8B6C65FB43DFDA9F531576815E7337E640C22870D8E9E4F1AEB6B5386BA48B264FBE302B2D0724C8D8FE9A147397BF8046114C06A99DF953E43ADBBBD3EBC538AEFC02091156B2782C482F17792D4D9FADBA46FB1BA8491146EC2393AB5C26C33CF0B61854D5492D2171A09AA147ACD9FD75798F43154E70624740A08F49507EF296B9B6FC54680C4A8AC265CF7717C8FA646207BF97A0B8241736FAA61EFB1F828545F515940F7873B20E6A1ABE055746F72F03EF49AAACA30A9C2EEF8E5CDE41BE80B1E5B66F485062F70B36A3ACE30116E062B06F95B404291398337E9449C919C096DE09DDF772CBC7373678AE532AB190C02414F2E0777C62679E5B6790D40FB17D832B4A27308D48D53B2A2302F0616BA6ECDD78947205456B0C063EF1EFE54125131F6755971C4DC84087135A89AFBC9BEC74C530BE9A22067A503DC535F0BF9DA16EE2BE41AF891C1A1A55F7B8522A6CA3D7044740316CAA2A25DE5DE1E67DA72E60FE46B5E49029852C859F2ACDDC57233F47AB3C4290E67B851A55B7C834D4A5DFE3E0E16344D0AF027E70ED05E269DBC955AAC496F0A9F794DD8E5059FA73D6A1A249B9E91921A48FE2CC639B29D97073FD936993E9B4634EAE4F805E1F5F65001FA81EE94FF142FE48C6D25CCE206F8731FFE321611ED0C9D95511B3AD30E43F668409A32742C0383A6B3B43663FAEF31F334C83EC641CC451D2FCBA2287E825206A7A2E980E53C2B6D3F39D4581E96719632425518F8CF04FEA775F6F828B75E7EF3C0F36D952DCA728955DADB3D501FFEA09E21D272912DFA4C5DE82B02A459E94100B522A86BA27D841B26754179606DC9C3A25968A915EB070431DA31E76C8C3F8F689957ECE7CB4644EAA545A8EBC151466554120767BC4353B0D252C566A535182AF6B53247A2C024DAA12E9EEDE31F6988804444E40157429F832BA8A959B9A62449ED822D1532BD52870B46BDA1509C1C9619F1EFDF4EA5BC9C1A49B3EF91B0FF3548C78905D248FD5195843A447F4BAFF13965303A0B9B719327698E2D679B43D4D25A8F4CDB316CD21E6C88E21A98187930C82EB616ABE917E1C2B5C045D97CDD41FA65E999F9B7FFEDAAE0F9B735A9BAC94533A2A14B3D4413E4723D947D23CA48E52A67A6506B647810F45B92AB1703C068E67EF1ECA8C3D3BF2149AEC9C0CD623850338445088C3AFA3CC08D30BF12CFA448A10C4E3C4AA5108F9DC1C7D223A0E1A89B01B1C64DB2DFEFBABC32C4F3EAEA6EA39587D44512E9A3F579844974974EEDDC125EA3A56F3821C9FE387CEA62C37160633E14E99A33FC0CB68D19F58EB6A93380476C01A7A0E9631412BEAD87FDCE17DECA4E475A47B0D6DD82D7EDBCC677D487220B172FED1E26AAA00A1771B11A281F6CC3E9582862331765E162033025DBCD8FC9CC3E50A27C72940A5E0C7692E5B474D132FB11D017706D9D653E1731E5EFC1337A964EB9F0C1865FE475421816ADC7ADACE6FAFA6BA0D8B7FECF766B640D5944254BC9DD638BAB91313DF77C91A8FB74012873AFCB3EACF18CA8D1C67EE16F6F83CA22D59F5D577F5B0844D4FFBC1A6D9C37F5848CB672E32AA48445A1B6D6837CCF98E4D4FE49B5F62186940F868473BA71F2C68C62687D9E5BB4B01E5E079A040275D86E66559025E6253D1759559B1FA60F48B7AC130F0070D21C0E38CDCF63DD755CD790FD3990109A3B856422E8118C5075D6EDFB58EFF8AA4401871036ADB9F766F9FC895F317A9D9DF38BD6E0D3E671BBE79F2C4BC8811F5E94A878D0E922FBAC4C86"; -} -body = JSON.stringify(obj); -$done(body); +*************************** +Surge4: + +[Script] +http-response ^https?:\/\/.+?\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5}|)\/api.php$ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/91.js + +[General] +force-http-engine-hosts = *91*:8080, *my10api*:8080 + +**************************/ + +let body = $response.body; +let obj = JSON.parse(body && /^\{/.test(body) ? body : '{}'); +if (obj.data && obj.data.match(/^[A-Z0-9]{1000,40000}$/)) { + obj.data = "FCA27C420C9BC230C86627D052F62E5E04CC1B51BF986A7C60673DC92F82697E9EB8C7BFB5AA267AC87399CDF8DBD1B1B25FEA57E27F38D0FCFB0CA5CFD8ED7B809FBCF3372C4DBB22083C4BC85A039512735A83834D7450EFD24EA2712FF841050BE99B7A4A31BBFCBE28BD3522227838BABE6E372874533E51A59A81CBFCB9C943C5C9646091E408D3B68BF6122DA929D558290D186EFBA2BE8019B86E35CB174626952650A959CA1A116ADCF1B14773DB033A8055E56F673682219629775138CDF3C653A0179232C8B653FDEB45D704140F8CA0C7716A02E5F7ED7CB41A68A247E9ECC0B744318534B0501865FBDF68AA1E7167663B59EDD8C56114E4A52B52A2020CA89B0F06F9D626BE3446ED5BF64E2FEE7AEA815CC047DBF3AE0F07DF1B4856070430ECF72AA542E22AF59861F2E48099C6E2CF2C1E3DD938196CB40FEE135A61AC76AAE6011C5A126CF9477AA0FDB76BE94279B66063E93E0FC8CFD802D0E2326B462EE26BF073E22B19A60F8BAF74C891DC57B18C8EFA091C9C66B6E94468E9A7165403A0CD2A3D45B23B2A0A43CEEF16FAF704866B6AC10686C8B6C65FB43DFDA9F531576815E7337E640C22870D8E9E4F1AEB6B5386BA48B264FBE302B2D0724C8D8FE9A147397BF8046114C06A99DF953E43ADBBBD3EBC538AEFC02091156B2782C482F17792D4D9FADBA46FB1BA8491146EC2393AB5C26C33CF0B61854D5492D2171A09AA147ACD9FD75798F43154E70624740A08F49507EF296B9B6FC54680C4A8AC265CF7717C8FA646207BF97A0B8241736FAA61EFB1F828545F515940F7873B20E6A1ABE055746F72F03EF49AAACA30A9C2EEF8E5CDE41BE80B1E5B66F485062F70B36A3ACE30116E062B06F95B404291398337E9449C919C096DE09DDF772CBC7373678AE532AB190C02414F2E0777C62679E5B6790D40FB17D832B4A27308D48D53B2A2302F0616BA6ECDD78947205456B0C063EF1EFE54125131F6755971C4DC84087135A89AFBC9BEC74C530BE9A22067A503DC535F0BF9DA16EE2BE41AF891C1A1A55F7B8522A6CA3D7044740316CAA2A25DE5DE1E67DA72E60FE46B5E49029852C859F2ACDDC57233F47AB3C4290E67B851A55B7C834D4A5DFE3E0E16344D0AF027E70ED05E269DBC955AAC496F0A9F794DD8E5059FA73D6A1A249B9E91921A48FE2CC639B29D97073FD936993E9B4634EAE4F805E1F5F65001FA81EE94FF142FE48C6D25CCE206F8731FFE321611ED0C9D95511B3AD30E43F668409A32742C0383A6B3B43663FAEF31F334C83EC641CC451D2FCBA2287E825206A7A2E980E53C2B6D3F39D4581E96719632425518F8CF04FEA775F6F828B75E7EF3C0F36D952DCA728955DADB3D501FFEA09E21D272912DFA4C5DE82B02A459E94100B522A86BA27D841B26754179606DC9C3A25968A915EB070431DA31E76C8C3F8F689957ECE7CB4644EAA545A8EBC151466554120767BC4353B0D252C566A535182AF6B53247A2C024DAA12E9EEDE31F6988804444E40157429F832BA8A959B9A62449ED822D1532BD52870B46BDA1509C1C9619F1EFDF4EA5BC9C1A49B3EF91B0FF3548C78905D248FD5195843A447F4BAFF13965303A0B9B719327698E2D679B43D4D25A8F4CDB316CD21E6C88E21A98187930C82EB616ABE917E1C2B5C045D97CDD41FA65E999F9B7FFEDAAE0F9B735A9BAC94533A2A14B3D4413E4723D947D23CA48E52A67A6506B647810F45B92AB1703C068E67EF1ECA8C3D3BF2149AEC9C0CD623850338445088C3AFA3CC08D30BF12CFA448A10C4E3C4AA5108F9DC1C7D223A0E1A89B01B1C64DB2DFEFBABC32C4F3EAEA6EA39587D44512E9A3F579844974974EEDDC125EA3A56F3821C9FE387CEA62C37160633E14E99A33FC0CB68D19F58EB6A93380476C01A7A0E9631412BEAD87FDCE17DECA4E475A47B0D6DD82D7EDBCC677D487220B172FED1E26AAA00A1771B11A281F6CC3E9582862331765E162033025DBCD8FC9CC3E50A27C72940A5E0C7692E5B474D132FB11D017706D9D653E1731E5EFC1337A964EB9F0C1865FE475421816ADC7ADACE6FAFA6BA0D8B7FECF766B640D5944254BC9DD638BAB91313DF77C91A8FB74012873AFCB3EACF18CA8D1C67EE16F6F83CA22D59F5D577F5B0844D4FFBC1A6D9C37F5848CB672E32AA48445A1B6D6837CCF98E4D4FE49B5F62186940F868473BA71F2C68C62687D9E5BB4B01E5E079A040275D86E66559025E6253D1759559B1FA60F48B7AC130F0070D21C0E38CDCF63DD755CD790FD3990109A3B856422E8118C5075D6EDFB58EFF8AA4401871036ADB9F766F9FC895F317A9D9DF38BD6E0D3E671BBE79F2C4BC8811F5E94A878D0E922FBAC4C86"; + $done({body: JSON.stringify(obj)}); + } else { + $done({}) + } \ No newline at end of file diff --git a/QuantumultX/File/ColorWeather.js b/QuantumultX/File/ColorWeather.js deleted file mode 100644 index 156b700d0b..0000000000 --- a/QuantumultX/File/ColorWeather.js +++ /dev/null @@ -1,10 +0,0 @@ -/* -CaiYun Weather (ColorWeather) unlock Vip - -QX 1.0.0: -^https:\/\/biz\.caiyunapp\.com\/v2\/user\?app_name\=weather url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/ColorWeather.js - -MitM = biz.caiyunapp.com -*/ - -var _0xe0e0=["\x62\x6F\x64\x79","\x70\x61\x72\x73\x65","\x78\x79\x5F\x76\x69\x70\x5F\x65\x78\x70\x69\x72\x65","\x72\x65\x73\x75\x6C\x74","\x69\x73\x5F\x76\x69\x70","\x76\x69\x70\x5F\x65\x78\x70\x69\x72\x65\x64\x5F\x61\x74","\x69\x73\x5F\x78\x79\x5F\x76\x69\x70","\x73\x74\x72\x69\x6E\x67\x69\x66\x79"];var body=$response[_0xe0e0[0]];var obj=JSON[_0xe0e0[1]](body);obj[_0xe0e0[3]][_0xe0e0[2]]= 4096483190;obj[_0xe0e0[3]][_0xe0e0[4]]= true;obj[_0xe0e0[3]][_0xe0e0[5]]= 4096483190;obj[_0xe0e0[3]][_0xe0e0[6]]= true;body= JSON[_0xe0e0[7]](obj);$done(body) \ No newline at end of file diff --git a/QuantumultX/File/DiDaQingDan.js b/QuantumultX/File/DiDaQingDan.js deleted file mode 100644 index 62c4c95f52..0000000000 --- a/QuantumultX/File/DiDaQingDan.js +++ /dev/null @@ -1,9 +0,0 @@ -/* -TickTick (Tick list) unlock pro -QX: -^https:\/\/(ticktick|dida365)\.com\/api\/v2\/user\/status url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/DiDaQingDan.js - -hostname = dida365.com, ticktick.com -*/ - -var _0xf36b=["\x62\x6F\x64\x79","\x70\x61\x72\x73\x65","\x70\x72\x6F\x45\x6E\x64\x44\x61\x74\x65","\x32\x30\x39\x39\x2D\x30\x31\x2D\x30\x31\x54\x30\x30\x3A\x30\x30\x3A\x30\x30\x2E\x30\x30\x30\x2B\x30\x30\x30\x30","\x6E\x65\x65\x64\x53\x75\x62\x73\x63\x72\x69\x62\x65","\x70\x72\x6F","\x73\x74\x72\x69\x6E\x67\x69\x66\x79"];var body=$response[_0xf36b[0]];var obj=JSON[_0xf36b[1]](body);obj[_0xf36b[2]]= _0xf36b[3];obj[_0xf36b[4]]= false;obj[_0xf36b[5]]= true;body= JSON[_0xf36b[6]](obj);$done(body) diff --git a/QuantumultX/File/VSCO b/QuantumultX/File/VSCO deleted file mode 100644 index d361d4ff3f..0000000000 --- a/QuantumultX/File/VSCO +++ /dev/null @@ -1 +0,0 @@ -{"user_subscription":{"expires_on_sec":1655536094,"is_intro_period":false,"expired":false,"payment_type":2,"user_id":54624336,"source":1,"is_trial_period":true,"starts_on_sec":1560831070,"intro_offer_consumed":true,"is_active":true,"canceled_at_sec":null,"auto_renew":true,"is_in_grace_period":false,"last_verified_sec":1560831070,"invalid_reason":null,"subscription_code":"VSCOANNUAL"}} \ No newline at end of file diff --git a/QuantumultX/File/Wechat.js b/QuantumultX/File/Wechat.js index f3ab4c7dd5..4300424b44 100644 --- a/QuantumultX/File/Wechat.js +++ b/QuantumultX/File/Wechat.js @@ -1,18 +1,28 @@ /* -Remove the WeChat public account bottom ad +微信 去除公众号文章底部广告 -QX: +*************************** +QuantumultX: + +[rewrite_local] ^https?:\/\/mp\.weixin\.qq\.com\/mp\/getappmsgad url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Wechat.js -Surge4: +[mitm] +hostname = mp.weixin.qq.com + +*************************** +Surge4 or Loon: + +[Script] http-response ^https?:\/\/mp\.weixin\.qq\.com\/mp\/getappmsgad requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Wechat.js -Surge & QX MITM = mp.weixin.qq.com, -*/ +[MITM] +hostname = mp.weixin.qq.com + +**************************/ var obj = JSON.parse($response.body); obj.advertisement_num = 0; obj.advertisement_info = []; +delete obj.appid; $done({body: JSON.stringify(obj)}); - -//by Choler \ No newline at end of file diff --git a/QuantumultX/File/Zymh.js b/QuantumultX/File/Zymh.js index 47c1b4c5d7..ea44395072 100644 --- a/QuantumultX/File/Zymh.js +++ b/QuantumultX/File/Zymh.js @@ -1,45 +1,28 @@ /* -知音漫客 unlock vip +解锁知音漫客付费章节 (需登录) -QX: -^https://getuserinfo-globalapi.zymk.cn/app_api/v5/(getuserinfo|coin_account|getuserinfo_ticket|getcomicinfo)/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js +*************************** +QuantumultX: -Surge4: -http-response ^https://getuserinfo-globalapi.zymk.cn/app_api/v5/(getuserinfo|coin_account|getuserinfo_ticket|getcomicinfo)/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js +[rewrite_local] +^https:\/\/apigate\.kaimanhua\.com\/(zymk-getuserinfo-api\/v1\/getuserinfo|zymk-userpurchased-api\/v1\/userpurchased\/paychapters)\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js -Surge & QX MITM = getuserinfo-globalapi.zymk.cn -*/ +[mitm] +hostname = apigate.kaimanhua.com -let url = $request.url; -let body = JSON.parse($response.body); +*************************** +Surge4 or Loon: -let user = '/app_api/v5/getuserinfo/'; -let coin = '/app_api/v5/coin_account/'; -let ticket = '/app_api/v5/getuserinfo_ticket/'; -let free = '/app_api/v5/getcomicinfo/'; +[Script] +http-response ^https:\/\/apigate\.kaimanhua\.com\/(zymk-getuserinfo-api\/v1\/getuserinfo|zymk-userpurchased-api\/v1\/userpurchased\/paychapters)\/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js -if (url.indexOf(user) != -1) { - body.data.coins = 6666; - body.data.isvip = 1; - body.data.recommend = 6666; - body.data.Cticket = 6666; - body.data.Cgold = 6666; -} -else if (url.indexOf(coin) != -1) { - body.data.coins = 6666; - body.data.golds = 6666; -} -else if (url.indexOf(ticket) != -1) { - body.data.Cticket = 6666; -} +[MITM] +hostname = apigate.kaimanhua.com +**************************/ -else if (url.indexOf(free) != -1) { - body.data.price = 0; - body.data.download_price = 0; -} - - body = JSON.stringify(body); - -$done({body}); - -//by mieqq \ No newline at end of file +var obj = JSON.parse($response.body); +obj.status = 0; +obj.data.isvip = 1; +obj.data.coins = 6666; +obj.data.Cgold = 6666; +$done({body: JSON.stringify(obj)}); diff --git a/QuantumultX/File/aimeiju.js b/QuantumultX/File/aimeiju.js deleted file mode 100644 index eedcf1fda5..0000000000 --- a/QuantumultX/File/aimeiju.js +++ /dev/null @@ -1,35 +0,0 @@ -/* -爱美剧 unlock vip -app download link : app.meiju2018.com - -QX : -^https?:\/\/mjapp\.\w{1,9}\.com\/index\.php\/app\/ios\/(vod\/show|user\/index) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/aimeiju.js - -Surge4: -http-response ^https?:\/\/mjapp\.\w{1,9}\.com\/index\.php\/app\/ios\/(vod\/show|user\/index) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/aimeiju.js -*/ - -var body = $response.body; -var url = $request.url; -const path1 = "/index.php/app/ios/user/index"; -const path2 = "/index.php/app/ios/vod/show"; - -if (url.indexOf(path1) != -1){ - let obj = JSON.parse(body); - obj.data.user["viptime"] = "2066-01-01 08:00:00"; - obj.data.user["cion"] = "66666"; - obj.data.user["vip"] = "1"; - body = JSON.stringify(obj); -} - -if (url.indexOf(path2) != -1){ - let obj = JSON.parse(body); - obj.data["looktime"] = -1; - obj.data["vip"] = "4"; - body = JSON.stringify(obj); -} - -$done({body}); - - -// Made by Meeta \ No newline at end of file diff --git a/QuantumultX/File/bdmh.js b/QuantumultX/File/bdmh.js deleted file mode 100644 index 4cc4f9ea2b..0000000000 --- a/QuantumultX/File/bdmh.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -蜜桃漫画 unlock vip - -QX: -^https?:\/\/(bd|bdapp|mitaoapp)\.(4008109966|yeduapp)\.(net|com)\/\/index\.php\/api\/User\/userLogin url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bdmh.js - -Surge4: -http-response ^https?:\/\/(bd|bdapp|mitaoapp)\.(4008109966|yeduapp)\.(net|com)\/\/index\.php\/api\/User\/userLogin requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bdmh.js -*/ - -var body = $response.body; -var obj = JSON.parse(body); - -obj.data.user_info.isvip = "1"; -obj.data.user_info.is_pay = "1"; -obj.data.user_info.egold = "66666"; -obj.data.user_info.vip_days = "66666"; -obj.data.user_info.vip_start_time = "1502969604"; -obj.data.user_info.vip_overtime = "2066-06-06 06:00:00"; -obj.data.user_info.name = "脚本禁止牟利,TG频道@NobyDa"; -obj.data.user_info.avatar = "https://avatars3.githubusercontent.com/u/53217160?s=400&v=4"; - -body = JSON.stringify(obj); -$done({body}); \ No newline at end of file diff --git a/QuantumultX/File/bilibiliAccount.js b/QuantumultX/File/bilibiliAccount.js deleted file mode 100644 index 3a9158fa01..0000000000 --- a/QuantumultX/File/bilibiliAccount.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -bilibili remove some account modules. by onewayticket255 - -QX: -^https://app.bilibili.com/x/v2/account/mine\?access_key url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliAccount.js - -Surge4: -http-response ^https://app.bilibili.com/x/v2/account/mine\?access_key requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliAccount.js - -Surge & QX MITM = app.bilibili.com -*/ - -let body = $response.body -body=JSON.parse(body) -body['data']['sections'].splice(2,1) -body=JSON.stringify(body) -$done({body}) \ No newline at end of file diff --git a/QuantumultX/File/bilibiliTab.js b/QuantumultX/File/bilibiliTab.js deleted file mode 100644 index 23a4fc91d1..0000000000 --- a/QuantumultX/File/bilibiliTab.js +++ /dev/null @@ -1,29 +0,0 @@ -/* -bilibili home page module customization whitelist. by onewayticket255 - -QX: -^https://app.bilibili.com/x/resource/show/tab\?access_key url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliTab.js - -Surge4: -http-response ^https://app.bilibili.com/x/resource/show/tab\?access_key requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliTab.js - -Surge & QX MITM = app.bilibili.com -*/ - -let whitelist=['追番','推荐','直播','热门','影视'] - -let body = $response.body -body=JSON.parse(body) - -body['data']['tab'].forEach((element, index) => { -if(!(whitelist.includes(element['name']))) body['data']['tab'].splice(index,1) -}); - -body['data']['bottom'].forEach((element, index)=> { - if(element['pos']==4){ - body['data']['bottom'].splice(index,1) - } -}) - -body=JSON.stringify(body) -$done({body}) \ No newline at end of file diff --git a/QuantumultX/File/bilifj.js b/QuantumultX/File/bilifj.js deleted file mode 100644 index 909d2e9332..0000000000 --- a/QuantumultX/File/bilifj.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -bilibili fan drama open 1080P+ - -QX: -^https?:\/\/api\.bilibili\.com\/pgc\/player\/api\/playurl url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilifj.js - -Surge4: -http-response ^https?:\/\/api\.bilibili\.com\/pgc\/player\/api\/playurl requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilifj.js - -Surge & QX MITM = api.bilibili.com -*/ - -var body = $response.body; -var url = $request.url; - -const path1 = '/pgc/player/api/playurl'; - -if (url.indexOf(path1) != -1) { - let obj = JSON.parse(body); - obj["quality"] = obj["accept_quality"][0]; - body = JSON.stringify(obj); - } - -$done({body}); \ No newline at end of file diff --git a/QuantumultX/File/dapian.js b/QuantumultX/File/dapian.js deleted file mode 100644 index 0c8e1c0d1c..0000000000 --- a/QuantumultX/File/dapian.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -大片 unlock vip - -QX: -^https?:\/\/api\.vnision\.com\/v1\/(users\/|banners) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/dapian.js - -Surge4: -http-response ^https?:\/\/api\.vnision\.com\/v1\/(users\/|banners) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/dapian.js - -Surge & QX MITM = api.vnision.com -*/ - -var body = $response.body; -var url = $request.url; - -const vip = '/v1/users/'; -const ad = '/v1/banners'; - -if (url.indexOf(vip) != -1) { - let obj = JSON.parse(body); - obj.user.is_member = 1; - body = JSON.stringify(obj); - } - -if (url.indexOf(ad) != -1) { - let obj = JSON.parse(body); - delete obj.banners - body = JSON.stringify(obj); - } - -$done({body}); \ No newline at end of file diff --git a/QuantumultX/File/kmh.js b/QuantumultX/File/kmh.js deleted file mode 100644 index c86dc5e14b..0000000000 --- a/QuantumultX/File/kmh.js +++ /dev/null @@ -1,23 +0,0 @@ -/* -看漫画极速版 unlock vip, currently off the shelf - -QX: -^https?:\/\/getuserinfo\.321mh\.com\/app_api\/v5\/getuserinfo\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/kmh.js - -Surge4: -http-response ^https?:\/\/getuserinfo\.321mh\.com\/app_api\/v5\/getuserinfo\/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/kmh.js - -Surge & QX MITM = getuserinfo.321mh.com -*/ - -var body = $response.body; -var url = $request.url; -const path = "/app_api/v5/getuserinfo/"; -let obj = JSON.parse(body); -if (url.indexOf(path) != -1) { - obj["isvip"] = "1"; - body = JSON.stringify(obj); - } -$done({body}); - -// From HoGer diff --git a/QuantumultX/File/vsco.js b/QuantumultX/File/vsco.js index b295b9861d..c308e1dd1e 100644 --- a/QuantumultX/File/vsco.js +++ b/QuantumultX/File/vsco.js @@ -1,38 +1,53 @@ -/* -VSCO unlock vip - -QX: -^https?:\/\/vsco\.co\/api\/subscriptions\/2.1\/user-subscriptions\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js - -Surge4: -http-response ^https?:\/\/vsco\.co\/api\/subscriptions\/2.1\/user-subscriptions\/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js - -Surge & QX MITM = vsco.co -*/ - -var body = $response.body; -var url = $request.url; - -const path1 = '/api/subscriptions/2.1/user-subscriptions/'; - -let obj = JSON.parse(body); - -if (url.indexOf(path1) != -1) { - obj.user_subscription["expires_on_sec"] = 1655536094; - obj.user_subscription["expired"] = false; - obj.user_subscription["payment_type"] = 2; - obj.user_subscription["is_trial_period"] = true; - obj.user_subscription["starts_on_sec"] = 1560831070; - obj.user_subscription["is_active"] = true; - obj.user_subscription["auto_renew"] = true; - obj.user_subscription["last_verified_sec"] = 1560831070; - obj.user_subscription["subscription_code"] = "VSCOANNUAL"; - obj.user_subscription["user_id"] = 54624336; - obj.user_subscription["source"] = 1; - body = JSON.stringify(obj); - } - -$done({body}); - -// 自用 转载需注明出处 -// TG频道: https://t.me/NobyDa \ No newline at end of file +/******************************** +Membership unlock for VSCO & 1Blocker & HTTPBot +Please note that you may need to reinstall app for script to work. + +QuantumultX rewrite link: +https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js + +Please note that the above rewrite link requires open KOP-XIAO's resource parser + +********************************* +Surge4, Loon and Shadowrocket configuration: + +[Script] +http-request ^https?:\/\/api\.revenuecat\.com\/v\d\/subscribers\/ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js +http-response ^https?:\/\/api\.revenuecat\.com\/v\d\/subscribers\/ requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js + +[MITM] +hostname = api.revenuecat.com +********************************/ + +const resp = {}; +const obj = JSON.parse(typeof $response != "undefined" && $response.body || null); +const ua = $request.headers['User-Agent'] || $request.headers['user-agent']; +const list = { + 'HTTPBot': { name: 'rc_lifetime', id: 'com.behindtechlines.HTTPBot.prounlock' }, + 'VSCO': { name: 'membership', id: 'com.circles.fin.premium.yearly' }, + '1Blocker': { name: 'premium', id: 'blocker.ios.subscription.yearly' } +}; +const data = { + "expires_date": "2030-02-18T07:52:54Z", + "original_purchase_date": "2020-02-11T07:52:55Z", + "purchase_date": "2020-02-11T07:52:54Z" +}; + +if (typeof $response == "undefined") { + delete $request.headers["x-revenuecat-etag"]; // prevent 304 issues + delete $request.headers["X-RevenueCat-ETag"]; + resp.headers = $request.headers; +} else if (obj && obj.subscriber) { + obj.subscriber.subscriptions = obj.subscriber.subscriptions || {}; + obj.subscriber.entitlement = obj.subscriber.entitlement || {}; + for (const i in list) { + if (new RegExp(`^${i}`, `i`).test(ua)) { + obj.subscriber.subscriptions[list[i].id] = data; + obj.subscriber.entitlements[list[i].name] = JSON.parse(JSON.stringify(data)); + obj.subscriber.entitlements[list[i].name].product_identifier = list[i].id; + break; + } + } + resp.body = JSON.stringify(obj); +} + +$done(resp); diff --git a/QuantumultX/File/wnyd.js b/QuantumultX/File/wnyd.js index 17ed0c62b7..c0f0673276 100644 --- a/QuantumultX/File/wnyd.js +++ b/QuantumultX/File/wnyd.js @@ -1,20 +1,29 @@ /* -Netease snail reading unlock vip +网易蜗牛读书 解锁特权 +原作者: yxiaocai & JO2EY -QX: +*************************** +QuantumultX: + +[rewrite_local] ^https?:\/\/p\.du\.163\.com\/gain\/readtime\/info\.json url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wnyd.js -Surge4: +[mitm] +hostname = p.du.163.com + +*************************** +Surge4 or Loon: + +[Script] http-response ^https?:\/\/p\.du\.163\.com\/gain\/readtime\/info\.json requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wnyd.js -Surge & QX MITM = p.du.163.com -*/ +[MITM] +hostname = p.du.163.com +**************************/ var body = $response.body; var obj = JSON.parse(body); -obj.tradeEndTime = 1679685290000; +obj.tradeEndTime = 1879685290000; body = JSON.stringify(obj); $done({body}); - -//By yxiaocai & JO2EY diff --git a/QuantumultX/File/wykaola.js b/QuantumultX/File/wykaola.js deleted file mode 100644 index b5953d4bbc..0000000000 --- a/QuantumultX/File/wykaola.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -Netease koala removes ads - -QX: -^https://sp\.kaola\.com/api/openad$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wykaola.js - -Surge4: -http-response ^https://sp\.kaola\.com/api/openad$ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wykaola.js - -Surge & QX MITM = sp.kaola.com -*/ - -var obj = JSON.parse($response.body); -obj = null; -$done({body: JSON.stringify(obj)}); - -//by Choler \ No newline at end of file diff --git a/QuantumultX/File/xjsp.js b/QuantumultX/File/xjsp.js index 85843fab6b..b5c8f35a40 100644 --- a/QuantumultX/File/xjsp.js +++ b/QuantumultX/File/xjsp.js @@ -1,50 +1,55 @@ /* -Banana video unlock vip -app download link : http://tinyurl.com/y57j6hjg +香蕉视频 解锁部分观看限制 +官网: https://www.aa2.app -QX: -^https?:\/\/(ios|apple)\.fuliapps\.com\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js +*************************** +QuantumultX: -Surge4: -http-response ^https?:\/\/(ios|apple)\.fuliapps\.com\/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js +[rewrite_local] +^https?:\/\/.+?\.(pipi|fuli|xiang(jiao|xiang))apps\.com\/(ucp\/index|getGlobalData|(\/|)vod\/reqplay\/) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js -Surge & QX MITM = *.fuliapps.com -*/ +[mitm] +hostname = ios.fuliapps.com, apple.fuliapps.com, ios.xiangjiaoapps.com, apple.xiangjiaoapps.com, *.xiangxiangapps.com, *.pipiapps.com + +*************************** +Surge4 or Loon: + +[Script] +http-response https?:\/\/.+?\.(pipi|fuli|xiang(jiao|xiang))apps\.com\/(ucp\/index|getGlobalData|(\/|)vod\/reqplay\/) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js + +[MITM] +hostname = ios.fuliapps.com, apple.fuliapps.com, ios.xiangjiaoapps.com, apple.xiangjiaoapps.com, *.xiangxiangapps.com, *.pipiapps.com + +**************************/ var body = $response.body; var url = $request.url; -const path1 = "/ucp/index"; -const path2 = "/getGlobalData"; -const path3 = "/vod/reqplay/" -if (url.indexOf(path1) != -1){ - let obj = JSON.parse(body); - obj.data.uinfo.down_daily_remainders = "666"; - obj.data.uinfo.play_daily_remainders = "666"; - obj.data.uinfo["next_upgrade_need"] = "0"; - obj.data.user.isvip = "1"; - obj.data.user.nickname = "Meeta_share"; - obj.data.user.gicon = "V5"; - obj.data.user.gid = "5"; - obj.data.user.avatar = "https://s2.ax1x.com/2019/07/11/ZRNrbq.th.jpg"; - body = JSON.stringify(obj); -} - -if (url.indexOf(path2) != -1){ - let obj = JSON.parse(body); - obj.data.app_launch_times_adshow = "0"; - obj.data.adgroups = ""; - obj.data.iOS_adgroups =""; - body = JSON.stringify(obj); -} -if (url.indexOf(path3) != -1){ - let obj = JSON.parse(body); - obj.retcode = "0"; - if(obj.data.hasOwnProperty("httpurl_preview")){ - var playurl = obj.data["httpurl_preview"]; - obj.data["httpurl"] = playurl; - }; - body = JSON.stringify(obj); -} -$done({body}); - -//(Made by Meeta) + +if (body) { + var obj = JSON.parse($response.body); + if (/\/ucp\/index/.test(url) && obj.data) { + obj.data.uinfo.minivod_play_daily_remainders = "666"; + obj.data.uinfo.minivod_down_daily_remainders = "666"; + obj.data.uinfo.down_daily_remainders = "666"; + obj.data.uinfo.play_daily_remainders = "666"; + obj.data.uinfo["next_upgrade_need"] = "0"; + obj.data.user.isvip = "1"; + obj.data.user.gicon = "V5"; + obj.data.user.gid = "5"; + } + if (/\/getGlobalData/.test(url) && obj.data) { + obj.data.app_launch_times_adshow = "0"; + obj.data.adgroups = ""; + obj.data.iOS_adgroups = ""; + } + if (/\/reqplay\//.test(url) && obj.data) { + obj.retcode = "0"; + if (obj.data.hasOwnProperty("httpurl_preview")) { + var playurl = obj.data["httpurl_preview"]; + obj.data["httpurl"] = playurl; + }; + } + $done({ body: JSON.stringify(obj) }); +} else { + $done({}) +} \ No newline at end of file diff --git a/QuantumultX/File/xxys.js b/QuantumultX/File/xxys.js deleted file mode 100644 index de9dea9b12..0000000000 --- a/QuantumultX/File/xxys.js +++ /dev/null @@ -1,41 +0,0 @@ -/* -XiaoXiaoYingShi unlock Vip -QX: -https:\/\/ios\.xiaoxiaoapps\.com\/(vod\/reqplay\/|ucp/index) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xxys.js -Surge: -http-response https:\/\/ios\.xiaoxiaoapps\.com\/(vod\/reqplay\/|ucp/index) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xxys.js - -MITM = ios.xiaoxiaoapps.com -*/ - -const path1 = "/ucp/index"; -const path2 = "/vod/reqplay/"; -var body = $response.body; -var url = $request.url; -if (url.indexOf(path1) != -1){ - let obj = JSON.parse(body); - obj.data.uinfo["down_daily_remainders"] = "666"; - obj.data.uinfo["play_daily_remainders"] = "666"; - obj.data.user["goldcoin"] = "999"; - obj.data.uinfo["next_upgrade_need"] = "0"; - obj.data.uinfo["curr_group"] = "5"; - obj.data.user["isvip"] = "1"; - obj.data.user["goldcoin"] = "666"; - obj.data.user["gicon"] = "V5"; - obj.data.user["gid"] = "5"; - body = JSON.stringify(obj); -} -if (url.indexOf(path2) != -1){ - let obj = JSON.parse(body); - obj.retcode = "0"; - obj.data.lastplayindex = "1"; - if(obj.data.hasOwnProperty("httpurl_preview")){ - var playurl = obj.data["httpurl_preview"]; - obj.data["httpurl"] = playurl; - }; - body = JSON.stringify(obj); -} - -$done({body}); - -//by meeta \ No newline at end of file diff --git a/QuantumultX/IPA-Installer.snippet b/QuantumultX/IPA-Installer.snippet new file mode 100644 index 0000000000..d8a3b125a3 --- /dev/null +++ b/QuantumultX/IPA-Installer.snippet @@ -0,0 +1,6 @@ +# 该文件为 "IPA应用辅助安装脚本" QuantumultX远端重写资源. +# 该资源可在iOS端辅助安装商店版或已签名IPA(需使用快捷指令 + Shu/Jsbox/pythonista), 查看脚本注释以了解具体方法; 安装演示可查看TG频道 @NobyDa + +^https:\/\/nobyda.app/(install|download) url script-analyze-echo-response https://raw.githubusercontent.com/NobyDa/Script/master/IPA-Installer/IPA-Installer.js + +hostname = nobyda.app \ No newline at end of file diff --git a/QuantumultX/Js.conf b/QuantumultX/Js.conf index 3de6be56fc..d998a771f9 100644 --- a/QuantumultX/Js.conf +++ b/QuantumultX/Js.conf @@ -1,136 +1,59 @@ -hostname = api.weibo.cn, mapi.weibo.com, *.uve.weibo.com, mp.weixin.qq.com, api.bilibili.com, app.bilibili.com, *.zhihu.com, aweme*.snssdk.com, *.kuwo.cn, ios.xiaoxiaoapps.com, api*.tiktokv.com, *.musical.ly, *.amemv.com, mjappaz.yefu365.com, p.du.163.com, getuserinfo.321mh.com, getuserinfo-globalapi.zymk.cn, api-163.biliapi.net, ios.fuliapps.com, vsco.co, api.vnision.com, *.my10api.com, bd.4008109966.net, sp.kaola.com, r.inews.qq.com, apple.fuliapps.com, newdrugs.dxy.cn, bdapp.4008109966.net, app101.avictown.cc, api.hlo.xyz, api.ijo.xyz, www.luqijianggushi.com, account.wps.cn, u.kanghuayun.com, api.gyrosco.pe, api1.dobenge.cn, api.mvmtv.com, mitaoapp.yeduapp.com, origin-prod-phoenix.jibjab.com, www.3ivf.com, pay.guoing.com, p.doras.api.vcinema.cn, api.termius.com, mjappaz.yefu365.com, viva.v21xy.com, dida365.com, ticktick.com, biz.caiyunapp.com, api.gotokeep.com, ap*.intsig.net, mp.bybutter.com, api.vuevideo.net, api.picsart.c*, api.meiease.c* - - -# 去微博应用内广告 (By yichahucha) -^https?://m?api\.weibo\.c(n|om)/2/(statuses/(unread|extend|positives/get|(friends|video)(/|_)timeline)|stories/(video_stream|home_list)|(groups|fangle)/timeline|profile/statuses|comments/build_comments|photo/recommend_list|service/picfeed|searchall|cardlist|page|\!/photos/pic_recommend_status) url script-response-body https://raw.githubusercontent.com/yichahucha/surge/master/wb_ad.js -^https?://(sdk|wb)app\.uve\.weibo\.com(/interface/sdk/sdkad.php|/wbapplua/wbpullad.lua) url script-response-body https://raw.githubusercontent.com/yichahucha/surge/master/wb_launch.js +hostname = api.weibo.cn, mapi.weibo.com, *.uve.weibo.com, mp.weixin.qq.com, api.zhihu.com, p.du.163.com, apigate.zymk.cn, www.luqijianggushi.com, origin-prod-phoenix.jibjab.com, xy-viva.kakalili.com, ap*.intsig.net, ios.fuliapps.com, apple.fuliapps.com, *.pipiapps.com, ios.xiangjiaoapps.com, apple.xiangjiaoapps.com, *.xiangxiangapps.com, api.m.jd.com, ios*.prod.ftl.netflix.com, api.revenuecat.com, pan.baidu.com, bmall.camera360.com, api-chn.rthdo.com # 去微信公众号广告 (By Choler) ^https?:\/\/mp\.weixin\.qq\.com\/mp\/getappmsgad url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Wechat.js -# 知乎去广告 (By onewayticket255) -^https://api.zhihu.com/moments\?(action|feed_type) url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20zhihu%20feed.js -^https://api.zhihu.com/topstory/recommend url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20zhihu%20recommend.js -^https://api.zhihu.com/.*/questions url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Zhihu-ad-answer.js -^https://api.zhihu.com/market/header url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20zhihu%20market.js - -# 哔哩哔哩动画去广告 (By onewayticket255) -^https://app.bilibili.com/x/resource/show/tab\?access_key url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliTab.js -^https://app.bilibili.com/x/v2/feed/index\?access_key url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20bilibili%20feed.js -^https://app.bilibili.com/x/v2/account/mine\?access_key url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilibiliAccount.js -^https://app.bilibili.com/x/v2/view\?access_key url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20bilibili%20view%20relate.js -^https://app.bilibili.com/x/v2/rank url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20bilibili%20rank.js -^https://api.bilibili.com/x/v2/reply/main\?access_key url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20bilibili%20reply.js -^https://app.bilibili.com/x/v2/show/popular/index\?access_key url script-response-body https://raw.githubusercontent.com/onewayticket255/Surge-Script/master/surge%20bilibili%20hot.js - -# 抖音去广告去水印 (By Choler) -^https://aweme-eagle(.*)\.snssdk\.com\/aweme/.+/(feed|aweme/post|follow/feed)/ url script-response-body https://Choler.github.io/Surge/Script/Aweme.js - -# 酷我音乐SVIP (By yxiaocai) -^https?:\/\/vip1\.kuwo\.cn\/(vip\/v2\/user\/vip|vip\/spi/mservice) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Kuwo.js - -# 小小影视Vip (By Meeta) -https:\/\/ios\.xiaoxiaoapps\.com\/(vod\/reqplay\/|ucp/index) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xxys.js -# 启动广告 -https:\/\/ios\.xiaoxiaoapps\.com\/getGlobalData url reject - -# tiktok封区解锁 -(.*video_id=\w{32})(.*watermark=)(.*) url 302 $1 -(?<=(carrier|account|sys)_region=)CN url 307 JP - -# 爱美剧Vip (原作 Meeta)(官网下载:app.meiju2018.com) -^https?:\/\/mjapp\.\w{1,9}\.com\/index\.php\/app\/ios\/(vod\/show|user\/index) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/aimeiju.js -# 广告 -^https:\/\/www.3ivf\.com\/index\.php\/app\/android\/ads\/index url reject -^https:\/\/mjappaz\.yefu365\.com\/index\.php\/app\/ios\/ver\/index_ios url reject - # 网易蜗牛读书VIP (By yxiaocai and JO2EY) ^https?://p\.du\.163\.com/readtime/info.json url reject ^https?:\/\/p\.du\.163\.com\/gain\/readtime\/info\.json url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wnyd.js -# 看漫画极速版vip (By HoGer) -^https?:\/\/getuserinfo\.321mh\.com\/app_api\/v5\/getuserinfo\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/kmh.js - -# 知音漫客VIP (By mieqq) -^https://getuserinfo-globalapi.zymk.cn/app_api/v5/(getuserinfo|coin_account|getuserinfo_ticket|getcomicinfo)/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js - -# 网易漫画去开屏广告 -^https://api-163.biliapi.net/cover url reject-img - -# 哔哩哔哩番剧开启1080P+ -^https?:\/\/api\.bilibili\.com\/pgc\/player\/api\/playurl url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bilifj.js - -# VSCO滤镜VIP -^https?:\/\/vsco\.co\/api\/subscriptions\/2.1\/user-subscriptions\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js - -# 大片-视频编辑器 VIP -^https?:\/\/api\.vnision\.com\/v1\/(users\/|banners) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/dapian.js - -# 91短视频 -^https?:\/\/.+\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5})?\/api.php$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/91.js - -# 布丁漫畫(蜜桃漫画)VIP (app已黄) -#^https?:\/\/(bd|bdapp|mitaoapp)\.(4008109966|yeduapp)\.(net|com)\/\/index\.php\/api\/User\/userLogin url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/bdmh.js - -# 网易考拉 去广告 (By Choler) -^https://sp\.kaola\.com/api/openad$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wykaola.js +# 知音漫客VIP +^https:\/\/apigate\.zymk\.cn\/(zymk-getuserinfo-api\/v1\/getuserinfo|zymk-userpurchased-api\/v1\/userpurchased\/paychapters)\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js -# 腾讯新闻 去广告 (By Choler) -^https://r\.inews\.qq.com\/get(QQNewsUnreadList|RecommendList) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/QQNews.js +# VSCO & 1Blocker +^https?:\/\/api\.revenuecat\.com\/v\d\/subscribers\/ url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js +^https?:\/\/api\.revenuecat\.com\/v\d\/subscribers\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js -# 香蕉视频VIP (By Meeta) -^https?:\/\/(apple|ios)\.fuliapps\.com url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js - -# 用药助手解锁专业版 (By Primovist) -^https?:\/\/(i|newdrugs)\.dxy\.cn\/(snsapi\/username\/|app\/user\/(pro\/stat\?|init\?timestamp=)) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/yyzs.js - -# 优乐美, 小米粒, 彩色直播三合一 解锁收费房 -^https?:\/\/(.+)\.(\w{2,3})(:?\d*)\/(api\/public\/\?service=Live\.checkLive$|public\/\/\?service=Live\.roomCharge$|lg\/video\/loadVideoFees\.do$) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/zhibo.js +# 香蕉视频VIP +^https?:\/\/.+?\.(pipi|fuli|xiang(jiao|xiang))apps\.com\/(ucp\/index|getGlobalData|(\/|)vod\/reqplay\/) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js # 陆琪讲故事 ^https:\/\/www\.luqijianggushi\.com\/api\/v2\/user\/get url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/luqi.js -# WPS (By eHpo) -^https://account.wps.cn/api/users/ url script-response-body https://raw.githubusercontent.com/eHpo1/Surge/master/Script/wps.js - -# Gyroscope 解锁 pro (By Maasea) -^https:\/\/api\.gyrosco\.pe\/v1\/account\/$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/gyroscope.js - -# 水印精灵 vip (By Alex0510) -^https:\/\/api1\.dobenge\.cn\/api\/user\/getuserinfo url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/syjl.js - -# 大千视界 -^https:\/\/api\.mvmtv\.com\/index\.php.*(c=user.*a=info|a=addr.*vid=.*) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/dqsj.js - # JibJab解锁pro ^https:\/\/origin-prod-phoenix\.jibjab\.com\/v1\/user url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/jibjab.js -# 南瓜电影4.7.3版 解锁VIP -^https:\/\/(p\.doras\.api\.vcinema\.cn|pay\.guoing\.com)\/(v5\.0\/user\/\d+$|d\/user\/get_user_info) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/ngdy.js +# 小影 解锁Vip +^https:\/\/(xy-viva\.kakalili|api-chn.rthdo)\.com\/api\/rest\/u\/vipVerifyReceipt url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js -# Termius 解锁本地pro (By Maasea) -https:\/\/api\.termius\.com\/api\/v3\/bulk\/account\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Termius.js +# 扫描全能王 pro +^https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/CamScanner.js + +# 百度网盘 解除在线视频倍率/清晰度 +^https:\/\/pan\.baidu\.com\/rest\/\d\.\d\/membership\/user url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js -# 小影 解锁Vip (By @hiepkimcdtk55) -^https:\/\/viva\.v21xy\.com\/api\/rest\/u\/vip url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js +# MIX 解锁高级特权 (需恢复购买) +^https?:\/\/bmall\.camera360\.com\/api\/mix\/recovery url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/MIX.js -# 滴答清单 pro -^https:\/\/(ticktick|dida365)\.com\/api\/v2\/user\/status url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/DiDaQingDan.js +################################# +###########其他仓库引用########### +################################# -# 彩云天气 Vip -^https:\/\/biz\.caiyunapp\.com\/v2\/user\?app_name\=weather url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/ColorWeather.js +# 去微博应用内广告 (yichahucha) +^https?://(sdk|wb)app\.uve\.weibo\.com(/interface/sdk/sdkad.php|/wbapplua/wbpullad.lua) url script-response-body https://raw.githubusercontent.com/yichahucha/surge/master/wb_launch.js +^https?://m?api\.weibo\.c(n|om)/2/(statuses/(unread|extend|positives/get|(friends|video)(/|_)(mix)?timeline)|stories/(video_stream|home_list)|(groups|fangle)/timeline|profile/statuses|comments/build_comments|photo/recommend_list|service/picfeed|searchall|cardlist|page|!/(photos/pic_recommend_status|live/media_homelist)|video/tiny_stream_video_list|photo/info|remind/unread_count) url script-response-body https://raw.githubusercontent.com/yichahucha/surge/master/wb_ad.js -# Keep 解锁私人课程和动作库 (QX存在bug 该脚本可能无法生效) -^https:\/\/api\.gotokeep\.com\/(.+\/subject|.+\/dynamic) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Keep.js +# 知乎去广告 (onewayticket255) +https://api.zhihu.com/(ad|drama|fringe|commercial|market/popover|search/(top|preset|tab)|.*featured-comment-ad) url reject-200 -# 扫描全能王 pro -^https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/CamScanner.js +# 京东比价 +^https?://api\.m\.jd\.com/client\.action\?functionId=(wareBusiness|serverConfig|basicConfig) url script-response-body https://service.2ti.st/QuanX/Script/jd_tb_price/main.js -# VUE pro -^https:\/\/api\.vuevideo\.net\/api\/v1\/(users\/.+\/profile|subtitle\/prepare) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/VUE.js +# Netflix评分 (yichahucha) +^https?://ios[-\w]*\.prod\.ftl\.netflix\.com/iosui/user/.+path=%5B%22videos%22%2C%\d+%22%2C%22summary%22%5D url script-request-header https://raw.githubusercontent.com/yichahucha/surge/master/nf_rating.js +^https?://ios[-\w]*\.prod\.ftl\.netflix\.com/iosui/user/.+path=%5B%22videos%22%2C%\d+%22%2C%22summary%22%5D url script-response-body https://raw.githubusercontent.com/yichahucha/surge/master/nf_rating.js -# NiChi 解锁素材 -^https?:\/\/mp\.bybutter\.com\/mood\/(official-templates|privileges) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/NiChi.js +################################# +################################# +################################# -# PicsArt美易 pro -^https:\/\/api\.(picsart|meiease)\.c(n|om)\/users\/show\/me\.json url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js \ No newline at end of file diff --git a/QuantumultX/README.md b/QuantumultX/README.md deleted file mode 100644 index 942d2e3ef6..0000000000 --- a/QuantumultX/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Rule description: -## [中文版说明点击此处](https://github.com/NobyDa/Script/blob/master/QuantumultX/README_CN.md) -* **[AdRule.list](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/AdRule.list) (More than 7000 ad rules, This rule is modified from [lhie1](https://github.com/lhie1/Rules),and delete [ConnersHua](https://github.com/ConnersHua/Profiles) duplicate)** - -* **[AdRuleTest.list](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/AdRuleTest.list)(More than 1300 ad rules,This rule is modified from [Scomper](https://github.com/scomper/Surge). Because the original author stopped maintenance, so take over the optimization and delete some normal rules, only for testing**) - -* **[Rewrite_lhie1.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Rewrite_lhie1.conf)(More than 400 ad rewrite rules, integrate [lhie1](https://github.com/lhie1/Rules)、[onewayticket255](https://github.com/onewayticket255/Surge-Script)、[Choler](https://github.com/Choler/Surge/tree/master/Ruleset), and delete [ConnersHua](https://github.com/ConnersHua/Profiles) duplicate,you need to open MITM and trust the certificate)** - -* **[Js.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js.conf) (Script subscription of QuantumultX)** - -## Remarks: - -* **Most of these are Chinese advertising rules. overseas users may not applicable** -* **compatible to QuantumultX, These rules only include ads. Please choose REJECT for the policy** -* **Script usage please see TG channel [@NobyDa](https://t.me/NobyDa)** -* **Subscribe to all QuantumultX scripts**: [Click here to copy the link](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js.conf) -* **Self-use only, Update depend on mood, if you have any questions, please submit a Issues or pull request.** - - -### Special thanks: - -* [@lhie1](https://github.com/lhie1) -* [@Scomper](https://github.com/scomper) -* [@onewayticket255](https://github.com/onewayticket255) -* [@Choler](https://github.com/Choler) -* [@ConnersHua](https://github.com/ConnersHua) \ No newline at end of file diff --git a/QuantumultX/README_CN.md b/QuantumultX/README_CN.md deleted file mode 100644 index 84f4547b71..0000000000 --- a/QuantumultX/README_CN.md +++ /dev/null @@ -1,26 +0,0 @@ -# 规则说明: -## [English version description click here](https://github.com/NobyDa/Script/blob/master/QuantumultX/README_EN.md) -* **[AdRule.list](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/AdRule.list) (超过7000条广告规则,该规则是从[lhie1](https://github.com/lhie1/Rules)修改而来 并添加了自用的一些去广告规则,并且去除了[ConnersHua](https://github.com/ConnersHua/Profiles) 的重复项。注:此规则内不包括[ConnersHua](https://github.com/ConnersHua/Profiles)(神机规则))** - -* **[AdRuleTest.list](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/AdRuleTest.list)(超过1300条广告规则,该规则是从 [Scomper](https://github.com/scomper/Surge) 修改而来,因原作者停止维护,所以接手优化和删除一些正常规则,仅供测试**) - -* **[Rewrite_lhie1.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Rewrite_lhie1.conf)(超过400条广告重写(Rewrite)规则, 整合了 [lhie1](https://github.com/lhie1/Rules)、[onewayticket255](https://github.com/onewayticket255/Surge-Script)、[Choler](https://github.com/Choler/Surge/tree/master/Ruleset), 并且删除了 [ConnersHua](https://github.com/ConnersHua/Profiles) 的重复项。注:需要打开MITM并信任证书,此规则不包括[ConnersHua](https://github.com/ConnersHua/Profiles)(神机规则))** - -* **[Js.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js.conf) (QuantumultX的脚本订阅)** - -## 备注: - -* **其中大多数是中国的广告规则。海外用户可能不适用** -* **与QuantumultX兼容,这些规则仅包含广告。 请为策略选择REJECT** -* **脚本用法请参见TG频道 [@NobyDa](https://t.me/NobyDa)** -* **订阅所有QuantumultX脚本**: [点击这里查看链接](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js.conf) -* **纯自用,佛系维护,规则如果有任何问题,请提交Issues或pull request** - - -### 鸣谢: - -* [@lhie1](https://github.com/lhie1) -* [@Scomper](https://github.com/scomper) -* [@onewayticket255](https://github.com/onewayticket255) -* [@Choler](https://github.com/Choler) -* [@ConnersHua](https://github.com/ConnersHua) \ No newline at end of file diff --git a/QuantumultX/Rewrite_lhie1.conf b/QuantumultX/Rewrite_lhie1.conf index a7e274be7e..cdd0a39d5b 100644 --- a/QuantumultX/Rewrite_lhie1.conf +++ b/QuantumultX/Rewrite_lhie1.conf @@ -1,22 +1,24 @@ -# Update-2019.11.11 Self-use rewrite rule, Remove versus shenji duplicates and optimizations -# This rewrite rule does not include shenji -hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,alogs.umeng.co,*.byteoversea.com,*.cnbetacdn.com,*.doubanio.com,101.201.62.22,113.105.222.132,113.96.109.*,118.178.214.118,121.14.89.216,121.9.212.178,14.21.76.30,183.232.237.194,183.232.246.225,183.60.159.227,59.37.96.220,789.kakamobi.cn,aarkissltrial.secure2.footprint.net,activity2.api.ofo.com,adm.10jqka.com.cn,adproxy.autohome.com.cn,afd.baidu.com,api.app.vhall.com,api.fengshows.com,api.k.sohu.com,api.laifeng.com,api.m.mi.com,api.mddcloud.com.cn,api-mifit.huami.com,api-mifit-cn.huami.com,app.10086.cn,app.m.zj.chinamobile.com,app2.autoimg.cn,appsdk.soku.com,atrace.chelaile.net.cn,capi.douyucdn.cn,cdn.kuaidi100.com,classbox2.kechenggezi.com,connect.facebook.net,creatives.ftimg.net,d.1qianbao.com,dapis.mting.info,dl.app.gtja.com,dongfeng.alicdn.com,dsp-impr2.youdao.com,erebor.douban.com,fm.fenqile.com,fuss10.elemecdn.com,g1.163.com,gorgon.youdao.com,hm.xiaomi.com,hui.sohu.com,i1.hoopchina.com.cn,iface2.iqiyi.com,img.zuoyebang.cc,img1.126.net,img1.doubanio.com,img3.doubanio.com,impservice.dictapp.youdao.com,impservice.youdao.com,kano.guahao.cn,lf.snssdk.com,lives.l.qq.com,m.aty.sohu.com,m5.amap.com,ma.ofo.com,mage.if.qidian.com,mapi.appvipshop.com,mbl.56.com,mimg.127.net,mmg.aty.sohu.com,mmgr.gtimg.com,nex.163.com,oimagea4.ydstatic.com,oimagec2.ydstatic.com,p.kuaidi100.com,p1.music.126.net,pic.k.sohu.com,pic1.chelaile.net.cn,pic2.zhimg.com,resource.cmbchina.com,ress.dxpmedia.com,rm.aarki.net,sso.ifanr.com,static.api.m.panda.tv,staticlive.douyucdn.cn,storage.wax.weibo.com,supportda.ofo.com,ups.youku.com,wapwenku.baidu.com,wenku.baidu.com,www.facebook.com,www.ft.com,www.oschina.net,api-mifit.huami.com,api-163.biliapi.net,pan-api.bitqiu.com,api.feng.com,m.tuniu.com,img.meituan.net,sdkapp.uve.weibo.com,ptmpcap.caocaokeji.cn,creditcardapp.bankcomm.com,newapp.szsmk.com,client.qunar.com,mpcs.suning.com,api2.helper.qq.com,cdnfile1.msstatic.com,res.xiaojukeji.com,cube.elemecdn.com,dimg04.c-ctrip.com,prom.mobile.gome.com.cn,y.gtimg.cn,du.hupucdn.com,interfac*.music.163.com,yxyapi2.drcuiyutao.com,api.vistopia.com.cn,capis-clb.didapinche.com,api.waitwaitpay.com,api.jxedt.com,mi.gdt.qq.com,richmanapi.jxedt.com,nfmovies.com,app-api.smzdm.com, +# Update-2021.8.26 +# This rewrite rule does not include ConnersHua +hostname = api.cognitive.microsofttranslator.com,offline.microsofttranslator.com,sf*ttcdn-tos.pstatp.com,oset-api.open-adx.com,qidian.qpic.cn,www.icourse163.org,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,alogs.umeng.co,*.byteoversea.com,*.cnbetacdn.com,101.201.62.22,113.105.222.132,113.96.109.*,118.178.214.118,121.14.89.216,121.9.212.178,14.21.76.30,183.232.237.194,183.232.246.225,183.60.159.227,59.37.96.220,789.kakamobi.cn,aarkissltrial.secure2.footprint.net,activity2.api.ofo.com,adm.10jqka.com.cn,adproxy.autohome.com.cn,afd.baidu.com,api.app.vhall.com,api.fengshows.com,api.k.sohu.com,api.laifeng.com,api.m.mi.com,api.mddcloud.com.cn,api-mifit.huami.com,api-mifit-cn.huami.com,app.10086.cn,app.m.zj.chinamobile.com,app2.autoimg.cn,appsdk.soku.com,atrace.chelaile.net.cn,capi.douyucdn.cn,cdn.kuaidi100.com,classbox2.kechenggezi.com,connect.facebook.net,creatives.ftimg.net,d.1qianbao.com,dapis.mting.info,dl.app.gtja.com,dongfeng.alicdn.com,dsp-impr2.youdao.com,erebor.douban.com,fm.fenqile.com,fuss10.elemecdn.com,g1.163.com,gorgon.youdao.com,hm.xiaomi.com,hui.sohu.com,i1.hoopchina.com.cn,iface2.iqiyi.com,img.zuoyebang.cc,img1.126.net,impservice.dictapp.youdao.com,impservice.youdao.com,kano.guahao.cn,lf.snssdk.com,lives.l.qq.com,m.aty.sohu.com,m5.amap.com,ma.ofo.com,mage.if.qidian.com,mapi.appvipshop.com,mbl.56.com,mimg.127.net,mmg.aty.sohu.com,mmgr.gtimg.com,nex.163.com,oimagea4.ydstatic.com,oimagec2.ydstatic.com,p.kuaidi100.com,p1.music.126.net,pic.k.sohu.com,pic1.chelaile.net.cn,ress.dxpmedia.com,rm.aarki.net,sso.ifanr.com,static.api.m.panda.tv,staticlive.douyucdn.cn,storage.wax.weibo.com,supportda.ofo.com,ups.youku.com,wapwenku.baidu.com,wenku.baidu.com,www.facebook.com,www.ft.com,www.oschina.net,api-mifit.huami.com,api-163.biliapi.net,pan-api.bitqiu.com,api.feng.com,m.tuniu.com,img.meituan.net,sdkapp.uve.weibo.com,ptmpcap.caocaokeji.cn,creditcardapp.bankcomm.com,newapp.szsmk.com,client.qunar.com,mpcs.suning.com,api2.helper.qq.com,cdnfile1.msstatic.com,res.xiaojukeji.com,dimg04.c-ctrip.com,prom.mobile.gome.com.cn,y.gtimg.cn,du.hupucdn.com,interfac*.music.163.com,yxyapi2.drcuiyutao.com,api.vistopia.com.cn,capis-clb.didapinche.com,api.jxedt.com,mi.gdt.qq.com,richmanapi.jxedt.com,nfmovies.com,app-api.smzdm.com,emdcadvertise.eastmoney.com,101.201.175.228,182.92.251.113 -^https?://(www.)?g.cn url 302 https://www.google.com -^https?://(www.)?google.cn url 302 https://www.google.com -^https?://(www.)?google.cn/search url 302 https://www.google.com/search -^https?://coupon.m.jd.com/ url 302 https://coupon.m.jd.com/ -^https?://h5.m.jd.com/ url 302 https://h5.m.jd.com/ -^https?://item.m.jd.com/ url 302 https://item.m.jd.com/ -^https?://m.jd.com url 302 https://m.jd.com -^https?://newcz.m.jd.com/ url 302 https://newcz.m.jd.com/ -^https?://p.m.jd.com/ url 302 https://p.m.jd.com/ -^https?://so.m.jd.com/ url 302 https://so.m.jd.com/ +^https?://(www\.)?g\.cn url 302 https://www.google.com +^https?://(www\.)?google\.cn url 302 https://www.google.com +^https?://(www\.)?google\.cn/search url 302 https://www.google.com/search +^http://coupon.m.jd.com/ url 302 https://coupon.m.jd.com/ +^http://h5.m.jd.com/ url 302 https://h5.m.jd.com/ +^http://item.m.jd.com/ url 302 https://item.m.jd.com/ +^http://m.jd.com url 302 https://m.jd.com +^http://newcz.m.jd.com/ url 302 https://newcz.m.jd.com/ +^http://p.m.jd.com/ url 302 https://p.m.jd.com/ +^http://so.m.jd.com/ url 302 https://so.m.jd.com/ ^https?://union.click.jd.com/jda? url request-header ^(.+?\s).+?(\s[\s\S]+?Host:).+?(\r\n) request-header $1/jda?adblock=$2union.click.jd.com$3 ^https?://union.click.jd.com/sem.php? url request-header ^(.+?\s).+?(\s[\s\S]+?Host:).+?(\r\n) request-header $1/sem.php?adblock=$2union.click.jd.com$3 ^https?://www.jd.com/ url 302 https://www.jd.com/ ^https?://m.taobao.com/ url 302 https://m.taobao.com/ +^https?:\/\/api\.cognitive\.microsofttranslator\.com\/languages\?scope=compact,transliteration&api-version= url request-header (\r\n)If-None-Match:.+(\r\n) request-header $1 +^https?:\/\/offline\.microsofttranslator\.com\/translatorresources\.svc\/GetMetadata\?platform=ios&version= url request-header (\r\n)If-None-Match:.+(\r\n) request-header $1 ^https?://cfg.m.ttkvod.com/mobile/ttk_mobile_1.8.txt url request-header ^(.+?\s).+?(\s[\s\S]+?Host:).+?(\r\n) request-header $1/Static/TXT/ttk_mobile_1.8.txt$2ogtre5vp0.bkt.clouddn.com$3 ^https?://cnzz.com/ url request-header ^(.+?\s).+?(\s[\s\S]+?Host:).+?(\r\n) request-header $1/background.png?$2ogtre5vp0.bkt.clouddn.com$3 ^https?://m.qu.la/stylewap/js/wap.js url 302 http://ogtre5vp0.bkt.clouddn.com/qu_la_wap.js @@ -28,17 +30,16 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?://www.iqshw.com/d/js/m url request-header ^(.+?\s).+?(\s[\s\S]+?Host:).+?(\r\n) request-header $1/Other/Static/JS/Package.js?$2rewrite.websocket.site:10$3 ^https?:\/\/youtubei\.googleapis\.com\/youtubei\/v1\/player\/ad_ url reject ^https?:\/\/vali\.cp31\.ott\.cibntv\.net\/youku url reject -^https?://.+ccode=0902 url reject-img +^https?:\/\/.+?ccode=0902 url reject-img ^https?:\/\/ulogs\.umeng\.com url reject-img ^https?:\/\/ulogs\.umengcloud\.com url reject-img ^https?:\/\/alogs\.umeng\.co url reject-img ^https?:\/\/alogs\.umeng\.com url reject-img ^https?:\/\/(\w\.)?up\.qingdaonews\.com url reject-img -^https?:\/\/(e|m)\..+/((uu|oo)\.php.+|\d+\.x?html\?$) url reject-img -^https?:\/\/.+\.beacon\.qq\.com url reject-img -^https?:\/\/.+\.gdt\.qq\.com url reject-img -^https?:\/\/.+\.kingsoft-office-service\.com url reject-img -^https?:\/\/.+\.l\.qq\.com url reject-img +^https?:\/\/.+?\.beacon\.qq\.com url reject-img +^https?:\/\/.+?\.gdt\.qq\.com url reject-img +^https?:\/\/.+?\.kingsoft-office-service\.com url reject-img +^https?:\/\/.+?\.l\.qq\.com url reject-img ^https?:\/\/[^(apple|10010)]+\.(com|cn)\/(a|A)d(s|v)?(\/|\.js) url reject-img ^https?:\/\/[^bbs]\.tianya\.cn url reject-img ^https?:\/\/\w{6}\.com1\.z0\.glb\.clouddn\.com url reject-img @@ -51,18 +52,16 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/api\d\.tuisong\.baidu\.com url reject-img ^https?:\/\/d\d\.sina\.com\.cn url reject-img ^https?:\/\/d\d\.sinaimg\.cn url reject-img -^https?:\/\/dl\.app\.gtja\.com/.+\d+\.jpg$ url reject-img -^https?:\/\/impservice.+?\.(.+\.)?youdao\.com url reject-img -^https?:\/\/log\..+\.baidu\.com url reject-img +^https?:\/\/dl\.app\.gtja\.com/.+?\.jpg$ url reject-img +^https?:\/\/log\..+?\.baidu\.com url reject-img ^https?:\/\/notice\.send-anywhere\.com\/banner url reject-img -^https?:\/\/pic\d\.zhimg\.com\/v2.+ url reject-img ^https?:\/\/sa\d\.tuisong\.baidu\.com url reject-img ^https?:\/\/sax\d\.sina\.com\.cn url reject-img ^https?:\/\/sax\w?\.sina\.cn url reject-img ^https?:\/\/sax\w?\.sina\.com\.cn url reject-img ^https?:\/\/server-\w+\.imrworldwide\.com url reject-img ^https?:\/\/t\d{2}\.baidu\.com url reject-img -^https?:\/\/www\.bldimg\.com\/(background|splash)\/.+\.png$ url reject-img +^https?:\/\/www\.bldimg\.com\/(background|splash)\/.+?\.png$ url reject-img ^https?:\/\/c\.minisplat\.cn url reject-img ^https?:\/\/c1\.minisplat\.cn url reject-img ^https?:\/\/cache\.changjingyi\.cn url reject-img @@ -74,16 +73,14 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/211\.98\.70\.226:8080\/ url reject-img ^https?:\/\/211\.98\.71\.195:8080\/ url reject-img ^https?:\/\/211\.98\.71\.196:8080\/ url reject-img -^https?:\/\/.+\/variety.tc.qq.com\/ url reject -^https?:\/\/.+\/vlive.qqvideo.tc.qq.com\/ url reject -^https?:\/\/.+\/hls.cache.p4p\/ url reject -^https?:\/\/.+\/omts.tc.qq.com\/ url reject -^https?:\/\/.+\/variety.tc.qq.com\/ url reject-img -^https?:\/\/.+\/vlive.qqvideo.tc.qq.com\/ url reject-img -^https?:\/\/.+\/hls.cache.p4p\/ url reject-img -^https?:\/\/.+\/music\/common\/upload\/t_splash_info url reject-img -^https?:\/\/.+\/tips\/fcgi-bin\/fcg_get_advert url reject-img -^https?:\/\/bla\.gtimg\.com\/qqlive\/\d{6}.+\.png url reject-img +^https?:\/\/.+?\/variety.tc.qq.com\/ url reject +^https?:\/\/.+?\/hls.cache.p4p\/ url reject +^https?:\/\/.+?\/omts.tc.qq.com\/ url reject +^https?:\/\/.+?\/variety.tc.qq.com\/ url reject-img +^https?:\/\/.+?\/hls.cache.p4p\/ url reject-img +^https?:\/\/.+?\/music\/common\/upload\/t_splash_info url reject-img +^https?:\/\/.+?\/tips\/fcgi-bin\/fcg_get_advert url reject-img +^https?:\/\/bla\.gtimg\.com\/qqlive\/\d{6}.+?\.png url reject-img ^https?:\/\/imgcache\.qq\.com\/qqlive\/ url reject-img ^https?:\/\/lives\.l\.qq\.com\/livemsg\?sdtfrom= url reject-img ^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qiantu\/upload\/ url reject-img @@ -98,9 +95,9 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/splashqqlive\.gtimg\.com\/website\/\d{6} url reject-img ^https?:\/\/szextshort\.weixin\.qq\.com\/cgi-bin\/mmoc-bin\/ad\/ url reject-img ^https?:\/\/y\.gtimg\.cn\/music\/common\/upload\/targeted_ads url reject-img -^https?:\/\/simg\.s\.weibo\.com\/.+_ios\d{2}\.gif url reject-img +^https?:\/\/simg\.s\.weibo\.com\/.+?_ios\d{2}\.gif url reject-img ^https?:\/\/storage\.wax\.weibo\.com\/\w+\.(png|jpg|mp4) url reject-img -^https?:\/\/u1\.img\.mobile\.sina\.cn\/public\/files\/image\/\d{3}x\d{2,4}.+(png|jpg|mp4) url reject-img +^https?:\/\/u1\.img\.mobile\.sina\.cn\/public\/files\/image\/\d{3}x\d{2,4}.+?(png|jpg|mp4) url reject-img ^https?:\/\/(iyes|(api|hd)\.mobile)\.youku\.com\/(adv|common\/v3\/hudong\/new) url reject-img ^https?:\/\/ad\.api\.3g\.youku\.com url reject-img ^https?:\/\/api\.appsdk\.soku\.com\/bg\/r url reject-img @@ -110,14 +107,11 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/m\.youku\.com\/video\/libs\/iwt\.js url reject-img ^https?:\/\/r\.l\.youku\.com\/rec_at_click url reject-img ^https?:\/\/r1\.ykimg\.com\/\w{30,35}\.jpg url reject-img -^https?:\/\/r1\.ykimg\.com\/material\/.+\/\d{3,4}-\d{4} url reject-img -^https?:\/\/r1\.ykimg\.com\/material\/.+\/\d{6}\/\d{4}\/ url reject-img +^https?:\/\/r1\.ykimg\.com\/material\/.+?\/\d{3,4}-\d{4} url reject-img +^https?:\/\/r1\.ykimg\.com\/material\/.+?\/\d{6}\/\d{4}\/ url reject-img ^https?:\/\/api\.zhuishushenqi\.com\/advert url reject-img ^https?:\/\/api\.zhuishushenqi\.com\/recommend url reject-img ^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview\.fcg url reject-img -^https?:\/\/.+\/cdn\/qiyiapp\/\d{8}\/.+&dis_dz= url reject-img -^https?:\/\/.+\/cdn\/qiyiapp\/\d{8}\/.+&z=\w url reject-img -^https?:\/\/.+\/videos\/other\/ url reject ^https?:\/\/iface2\.iqiyi\.com\/fusion\/3\.0\/fusion_switch url reject-img ^https?:\/\/agn\.aty\.sohu\.com\/m? url reject-img ^https?:\/\/hui\.sohu\.com\/predownload2\/? url reject-img @@ -133,8 +127,8 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/bj\.bcebos\.com\/fc-feed\/0\/pic\/ url reject-img ^https?:\/\/c\.tieba\.baidu\.com\/c\/p\/img\?src= url reject-img ^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/logtogether\?cmd= url reject-img -^https?:\/\/fcvbjbcebos\.baidu\.com\/.+\.mp4 url reject-img -^https?:\/\/gss0\.bdstatic\.com\/.+\/static\/wiseindex\/img\/bd_red_packet\.png url reject-img +^https?:\/\/fcvbjbcebos\.baidu\.com\/.+?\.mp4 url reject-img +^https?:\/\/gss0\.bdstatic\.com\/.+?\/static\/wiseindex\/img\/bd_red_packet\.png url reject-img ^https?:\/\/sm\.domobcdn\.com\/ugc\/\w\/ url reject-img ^https?:\/\/tb1\.bdstatic\.com\/tb\/cms\/ngmis\/adsense\/*\.jpg url reject-img ^https?:\/\/tb2\.bdstatic\.com\/tb\/mobile\/spb\/widget\/jump url reject-img @@ -153,55 +147,50 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/stat\.moji\.com url reject-img ^https?:\/\/storage\.360buyimg\.com\/kepler-app url reject-img ^https?:\/\/ugc\.moji001\.com\/sns\/json\/profile\/get_unread url reject-img -^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.+\/\d{13}\.jpg url reject-img +^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.+?\/\d{13}\.jpg url reject-img ^https?:\/\/m\.client\.10010\.com\/mobileService\/(activity|customer)\/(accountListData|get_client_adv|get_startadv) url reject-img ^https?:\/\/m\.client\.10010\.com\/uniAdmsInterface\/(getHomePageAd|getWelcomeAd) url reject-img ^https?:\/\/m1\.ad\.10010\.com\/noticeMag\/images\/imageUpload\/2\d{3} url reject-img ^https?:\/\/res\.mall\.10010\.cn\/mall\/common\/js\/fa\.js?referer= url reject-img ^https?:\/\/api\.newad\.ifeng\.com\/ClientAdversApi1508\?adids= url reject-img -^https?:\/\/c1\.ifengimg\.com\/.+_w1080_h1410\.jpg url reject-img +^https?:\/\/c1\.ifengimg\.com\/.+?_w1080_h1410\.jpg url reject-img ^https?:\/\/exp\.3g\.ifeng\.com\/coverAdversApi\?gv=\. url reject-img ^https?:\/\/ifengad\.3g\.ifeng\.com\/ad\/pv\.php\?stat= url reject-img ^https?:\/\/iis1\.deliver\.ifeng\.com\/getmcode\?adid= url reject-img -^https?:\/\/.+\/eapi\/[ad|event]\/ url reject-img -^https?:\/\/.+\.127\.net\/ad url reject-img -^https?:\/\/.+\/eapi\/ad\/ url reject-img +^https?:\/\/.+?\/eapi\/[ad|event]\/ url reject-img +^https?:\/\/.+?\.127\.net\/ad url reject-img +^https?:\/\/.+?\/eapi\/ad\/ url reject-img ^https?:\/\/g1\.163\.com\/madfeedback url reject-img -^https?:\/\/img1\.126\.net\/.+dpi=\w{7,8} url reject-img +^https?:\/\/img1\.126\.net\/.+?dpi=\w{7,8} url reject-img ^https?:\/\/img1\.126\.net\/channel14\/ url reject-img ^https?:\/\/mimg\.127\.net\/external\/smartpop-manger\.min\.js url reject-img ^https?:\/\/nex\.163\.com\/q url reject-img ^https?:\/\/oimage([a-z])([0-9])\.ydstatic\.com\/.+?&product=adpublish url reject-img ^https?:\/\/p[^4](c)?\.music\.126\.net\/\w+==\/10995\d{13}\.jpg$ url reject-img ^https?:\/\/interface\.music\.163\.com\/eapi\/ad\/ url reject-img -^https?:\/\/.+\/client?functionId=lauch\/lauchConfig&appName=paidaojia url reject-img +^https?:\/\/.+?\/client?functionId=lauch\/lauchConfig&appName=paidaojia url reject-img ^https?:\/\/111\.13\.29\.201\/client\.action\?functionId=start url reject-img ^https?:\/\/api\.m\.jd\.com\/client\.action\?functionId=start url reject-img ^https?:\/\/bdsp-x\.jd\.com\/adx\/ url reject-img ^https?:\/\/m\.360buyimg\.com\/mobilecms\/s640x1136_jfs\/ url reject-img -^https?:\/\/gw\.alicdn\.com\/tfs\/.+-1125-1602 url reject-img ^https?:\/\/(\d{1,3}\.){1,3}\d{1,3}\/view\/dale-online\/dale_ad\/ url reject-img ^https?:\/\/api\.douban\.com\/v2\/app_ads\/common_ads url reject-img -^https?:\/\/img\d\.doubanio\.com\/view\/dale-online\/dale_ad\/ url reject-img ^https?:\/\/capi\.douyucdn\.cn\/lapi\/sign\/app(api)?\/getinfo\?client_sys=ios url reject-img ^https?:\/\/capi\.douyucdn\.cn\/api\/ios_app\/check_update url reject-img ^https?:\/\/capi\.douyucdn\.cn\/api\/v1\/getStartSend?client_sys=ios url reject-img -^https?:\/\/douyucdn\.cn\/.+\/appapi\/getinfo url reject-img +^https?:\/\/douyucdn\.cn\/.+?\/appapi\/getinfo url reject-img ^https?:\/\/rtbapi.douyucdn.cn\/japi\/sign\/app\/getinfo url reject-img -^https?:\/\/staticlive\.douyucdn\.cn\/.+\/getStartSend url reject-img +^https?:\/\/staticlive\.douyucdn\.cn\/.+?\/getStartSend url reject-img ^https?:\/\/staticlive\.douyucdn\.cn\/upload\/signs\/ url reject-img -^https?:\/\/elemecdn\.com\/.+\/sitemap url reject-img -^https?:\/\/fuss10\.elemecdn\.com\/.+\/w\/640\/h\/\d{3,4} url reject-img -^https?:\/\/fuss10\.elemecdn\.com\/.+\/w\/750\/h\/\d{3,4} url reject-img -^https?:\/\/fuss10\.elemecdn\.com\/.+\.mp4 url reject-img +^https?:\/\/elemecdn\.com\/.+?\/sitemap url reject-img +^https?:\/\/fuss10\.elemecdn\.com\/.+?\/w\/640\/h\/\d{3,4} url reject-img +^https?:\/\/fuss10\.elemecdn\.com\/.+?\/w\/750\/h\/\d{3,4} url reject-img +^https?:\/\/fuss10\.elemecdn\.com\/.+?\.mp4 url reject-img ^https?:\/\/m\.elecfans\.com\/static\/js\/ad\.js url reject-img ^https?:\/\/www1\.elecfans\.com\/www\/delivery\/ url reject-img ^https?:\/\/p\d\.pstatp\.com\/origin url reject-img ^https?:\/\/pb\d\.pstatp\.com\/origin url reject-img -^https?:\/\/gw\.alicdn\.com\/mt\/ url reject-img -^https?:\/\/gw\.alicdn\.com\/tfs\/.+\d{3,4}-\d{4} url reject-img -^https?:\/\/gw\.alicdn\.com\/tps\/.+\d{3,4}-\d{4} url reject-img -^https?:\/\/adse.+\.com\/[a-z]{4}\/loading\?appid= url reject-img +^https?:\/\/adse.+?\.com\/[a-z]{4}\/loading\?appid= url reject-img ^https?:\/\/adse\.ximalaya\.com\/ting\/feed\?appid= url reject-img ^https?:\/\/adse\.ximalaya\.com\/ting\/loading\?appid= url reject-img ^https?:\/\/adse\.ximalaya\.com\/ting\?appid= url reject-img @@ -222,34 +211,33 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getadlist url reject-img ^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getappads\/ url reject-img ^https?:\/\/cheyouapi\.ycapp\.yiche\.com\/appforum\/getusermessagecount url reject-img -^https?:\/\/.+\.googlevideo\.com\/ptracking\?pltype=adhost url reject-img -^https?:\/\/.+\.youtube\.com\/get_midroll url reject-img -^https?:\/\/.+\.youtube\.com\/ptracking\? url reject-img +^https?:\/\/.+?\.googlevideo\.com\/ptracking\?pltype=adhost url reject-img +^https?:\/\/.+?\.youtube\.com\/get_midroll url reject-img +^https?:\/\/.+?\.youtube\.com\/ptracking\? url reject-img ^https?:\/\/m\.youtube\.com\/_get_ads url reject-img ^https?:\/\/pagead2\.googlesyndication\.com\/pagead\/ url reject-img ^https?:\/\/s\.youtube\.com\/api\/stats\/watchtime?adformat url reject-img ^https?:\/\/s0\.2mdn\.net\/ads\/ url reject-img ^https?:\/\/stats\.tubemogul\.com\/stats\/ url reject-img -^https?:\/\/.+0013.+\/upload\/activity\/app_flash_screen_ url reject-img ^http?:\/\/www\.tsytv\.com\.cn\/api\/app\/ios\/ads url reject-img ^https?:\/\/res\.kfc\.com\.cn\/advertisement\/ url reject-img -^https?:\/\/img\.yun\.01zhuanche\.com\/statics\/app\/advertisement\/.+-750-1334 url reject-img +^https?:\/\/img\.yun\.01zhuanche\.com\/statics\/app\/advertisement\/.+?-750-1334 url reject-img ^https?:\/\/img01\.10101111cdn\.com\/adpos\/share\/ url reject-img ^https?:\/\/bank\.wo\.cn\/v9\/getstartpage url reject-img ^https?:\/\/img\.ihytv\.com\/material\/adv\/img\/ url reject-img ^https?:\/\/p\d\.meituan\.net\/(mmc|wmbanner)\/ url reject-img -^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qqpim\/public\/ios\/splash\/.+\/\d{4}_\d{4} url reject-img +^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qqpim\/public\/ios\/splash\/.+?\/\d{4}_\d{4} url reject-img ^https?:\/\/adproxy\.autohome\.com\.cn\/AdvertiseService\/ url reject-img ^https?:\/\/app2\.autoimg\.cn\/appdfs\/ url reject-img ^https?:\/\/mage\.if\.qidian\.com\/Atom\.axd\/Api\/Client\/GetConfIOS url reject-img ^https?:\/\/qidian\.qpic\.cn\/qidian_common url reject-img -^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+\/670x900 url reject-img -^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+\/750x1064 url reject-img +^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+?\/670x900 url reject-img +^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+?\/750x1064 url reject-img ^https?:\/\/mapi\.dangdang\.com\/index\.php\?action=init&user_client=iphone url reject-img ^https?:\/\/dl\.app\.gtja\.com\/dzswem\/kvController\/ url reject-img ^https?:\/\/dl\.app\.gtja\.com\/operation\/config\/startupConfig\.json url reject-img ^https?:\/\/api\.laifeng\.com\/v1\/start\/ads url reject-img -^https?:\/\/.+\.snssdk\.com\/api\/ad\/ url reject-img +^https?:\/\/.+?\.(snssdk|amemv)\.com\/api\/ad\/ url reject-img ^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/aweme\/stats\/ url reject-img ^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/device\/update\/ url reject-img ^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/screen\/ad\/ url reject-img @@ -262,7 +250,7 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/qzonestyle\.gtimg\.cn\/qzone\/biz\/gdt\/mob\/sdk\/ios\/v2\/ url reject-img ^https?:\/\/cdn\.kuaidi100\.com\/images\/open\/appads url reject-img ^https?:\/\/p\.kuaidi100\.com\/mobile\/mainapi\.do url reject-img -^https?:\/\/api\.m\.mi\.com\/.+\/app\/start url reject-img +^https?:\/\/api\.m\.mi\.com\/.+?\/app\/start url reject-img ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/homepage_ad\? url reject-img ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sleep_ad\? url reject-img ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_ad\? url reject-img @@ -270,71 +258,70 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_training_ad\? url reject-img ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/step_detail_ad\? url reject-img ^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/training_video_ad\? url reject-img -^https?:\/\/.+\/portal\.php\?a=get_ads url reject-img -^https?:\/\/.+\/portal\.php\?c=duiba url reject-img -^https?:\/\/.+\/portal\.php\?a=get_coopen_ads url reject-img +^https?:\/\/.+?\/portal\.php\?a=get_ads url reject-img +^https?:\/\/.+?\/portal\.php\?c=duiba url reject-img +^https?:\/\/.+?\/portal\.php\?a=get_coopen_ads url reject-img ^https?:\/\/weicoapi\.weico\.cc\/img\/ad\/ url reject-img -^https?:\/\/.+\/weico4ad\/ad\/ url reject-img +^https?:\/\/.+?\/weico4ad\/ad\/ url reject-img ^https?:\/\/g\.cdn\.pengpengla\.com\/starfantuan\/boot-screen-info\/ url reject-img ^https?:\/\/discuz\.gtimg\.cn\/cloud\/scripts\/discuz_tips\.js url reject-img ^https?:\/\/sapi\.guopan\.cn\/get_buildin_ad url reject-img -^https?:\/\/789\.kakamobi\.cn\/.+adver url reject-img +^https?:\/\/789\.kakamobi\.cn\/.+?adver url reject-img ^https?:\/\/smart\.789\.image\.mucang\.cn\/advert url reject-img -^https?:\/\/resource\.cmbchina\.com\/fsp\/File\/ClientFacePublic\/.+\.gif url reject-img ^http?:\/\/123\.59\.30\.10\/adv\/advInfos url reject-img -^https?:\/\/bbs\.airav\.cc\/data\/.+\.jpg url reject-img -^https?:\/\/image\.airav\.cc\/AirADPic\/.+\.gif url reject-img +^https?:\/\/bbs\.airav\.cc\/data\/.+?\.jpg url reject-img +^https?:\/\/image\.airav\.cc\/AirADPic\/.+?\.gif url reject-img ^https?:\/\/m\.airav\.cc\/images\/Mobile_popout_cn\.gif url reject-img ^https?:\/\/cmsapi\.wifi8\.com\/v1\/emptyAd\/info url reject-img ^https?:\/\/cmsapi\.wifi8\.com\/v2\/adNew\/config url reject-img ^https?:\/\/cmsfile\.wifi8\.com\/uploads\/png\/ url reject-img ^https?:\/\/sso\.ifanr\.com\/jiong\/IOS\/appso\/splash\/ url reject-img -^https?:\/\/oimage\w\d\.ydstatic\.com\/image\?.+=adpublish url reject-img +^https?:\/\/oimage\w\d\.ydstatic\.com\/image\?.+?=adpublish url reject-img ^https?:\/\/118\.178\.214\.118\/yyting\/advertclient\/ClientAdvertList\.action url reject-img ^https?:\/\/dapis\.mting\.info\/yyting\/advertclient\/ClientAdvertList\.action url reject-img -^https?:\/\/192\.133.+\.mp4$ url reject-img -^https:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore url reject-img +^https?:\/\/192\.133.+?\.mp4$ url reject-img +^https?:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore url reject-img ^https?:\/\/api\.app\.vhall\.com\/v5\/000\/webinar\/launch url reject-img ^https?:\/\/img\.53site\.com\/Werewolf\/AD\/ url reject-img -^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+\/getAdvertise\.php url reject-img -^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+\/getShareVideodb\.php url reject-img -^https?:\/\/a\.applovin\.com\/.+\/ad url reject-img -^https?:\/\/kano\.guahao\.cn\/.+\?resize=\d{3}-\d{4} url reject-img +^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+?\/getAdvertise\.php url reject-img +^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+?\/getShareVideodb\.php url reject-img +^https?:\/\/a\.applovin\.com\/.+?\/ad url reject-img +^https?:\/\/kano\.guahao\.cn\/.+?\?resize=\d{3}-\d{4} url reject-img ^https?:\/\/atrace\.chelaile\.net\.cn\/adpub\/ url reject-img ^https?:\/\/atrace\.chelaile\.net\.cn\/exhibit\?&adv_image url reject-img ^https?:\/\/pic1\.chelaile\.net\.cn\/adv\/ url reject-img ^https?:\/\/images\.91160\.com\/primary\/ url reject-img ^https?:\/\/d\.1qianbao\.com\/youqian\/ads\/ url reject-img ^https?:\/\/api\.kkmh\.com\/v\d\/(ad|advertisement)\/ url reject-img -^https?:\/\/i1\.hoopchina\.com\.cn\/blogfile\/.+_\d{3}x\d{4} url reject-img +^https?:\/\/i1\.hoopchina\.com\.cn\/blogfile\/.+?_\d{3}x\d{4} url reject-img ^https?:\/\/pcvideoyd\.titan\.mgtv\.com\/pb\/ url reject-img ^https?:\/\/classbox2\.kechenggezi\.com\/api\/v1\/sponge\/pull\?request_time= url reject-img -^https?:\/\/e\.dangdang\.com\/media\/api.+\?action=getDeviceStartPage url reject-img +^https?:\/\/e\.dangdang\.com\/media\/api.+?\?action=getDeviceStartPage url reject-img ^https?:\/\/api\.smzdm\.com\/v2\/util\/banner url reject-img ^https?:\/\/app\.veryzhun\.com\/ad\/admob url reject-img ^https?:\/\/api\.fengshows\.com\/api\/launchAD url reject-img -^https?:\/\/img\.rr\.tv\/banner\/.+\.jpg url reject-img +^https?:\/\/img\.rr\.tv\/banner\/.+?\.jpg url reject-img ^https?:\/\/ctrl\.zmzapi\.net\/app\/ads url reject-img ^https?:\/\/ctrl\.zmzapi\.net\/app\/init url reject-img ^https?:\/\/api\.laosiji\.com\/user\/startpage\/ url reject-img ^https?:\/\/adm\.10jqka\.com\.cn\/interface\/getads\.php url reject-img -^https?:\/\/smkmp\.96225\.com\/smkcenter\/ad\/.+\/adBanner url reject-img +^https?:\/\/smkmp\.96225\.com\/smkcenter\/ad\/.+?\/adBanner url reject-img ^https?:\/\/api\.mddcloud\.com\.cn\/api\/ad\/getClassAd\.action url reject-img ^https?:\/\/api\.mddcloud\.com\.cn\/api\/advert\/getHomepage\.action url reject-img -^https?:\/\/static1\.keepcdn\.com\/.+\d{3}x\d{4} url reject-img +^https?:\/\/static1\.keepcdn\.com\/.+?\d{3}x\d{4} url reject-img ^https?:\/\/aarkissltrial\.secure2\.footprint\.net\/v1\/ads url reject-img ^https?:\/\/rm\.aarki\.net\/v1\/ads url reject-img ^https?:\/\/182\.92\.244\.70\/d\/json\/ url reject-img -^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.trip\.activity\.querytmsresources\/1\.0\?type=originaljson url reject-img -^https?:\/\/.+\/videos\/KnifeHit_4\/gear3\/ url reject-img -^https?:\/\/images\.kartor\.cn\/.+\.html url reject-img +^https?:\/\/.+?\/videos\/KnifeHit_4\/gear3\/ url reject-img +^https?:\/\/images\.kartor\.cn\/.+?\.html url reject-img ^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/appspace-client\/cr\/sys\/popAdv url reject-img ^https?:\/\/fm\.fenqile\.com\/routev2\/other\/getfloatAd\.json url reject-img ^https?:\/\/fm\.fenqile\.com\/routev2\/other\/startImg\.json url reject-img -^https?:\/\/.+\/vips-mobile\/router\.do\?api_key= url reject-img +^https?:\/\/.+?\/vips-mobile\/router\.do\?api_key= url reject-img ^https?:\/\/consumer\.fcbox\.com\/v1\/ad\/OpeningAdInfo\/ url reject-img -^https?:\/\/fengplus\.feng\.com\/index\.php\?r=api\/slide\/.+Ads url reject-img -^https?:\/\/.+\/img\/ad\.union\.api\/ url reject-img +^https?:\/\/fengplus\.feng\.com\/index\.php\?r=api\/slide\/.+?Ads url reject-img +^https?:\/\/.+?\/img\/ad\.union\.api\/ url reject-img +^https?:\/\/.+?\/img\/web\.business\.image\/ url reject-img ^https?:\/\/ggv\.cmvideo\.cn\/v1\/iflyad\/ url reject-img ^https?:\/\/ivy\.pchouse\.com\.cn\/adpuba\/ url reject-img ^https?:\/\/www\.oschina\.net\/action\/apiv2\/get_launcher url reject-img @@ -349,24 +336,22 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/b-api\.ins\.miaopai\.com\/1\/ad/ url reject-img ^https?:\/\/cdn\.tiku\.zhan\.com\/banner url reject-img ^https?:\/\/capi\.mwee\.cn/app-api/V12/app/getstartad url reject-img -^https?:\/\/.+\/api\/app\/member\/ver2\/user\/login\/ url reject-img +^https?:\/\/.+?\/api\/app\/member\/ver2\/user\/login\/ url reject-img ^https?:\/\/api\.gaoqingdianshi\.com\/api\/v2\/ad url reject-img -^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\//d+\//d+\/BbsImg\.(?<=(big.(png|jpg)))$ url reject-img -^https?:\/\/games\.mobileapi\.hupu\.com\/.+\/(search|interfaceAdMonitor|status|hupuBbsPm)/(hotkey|init|hupuBbsPm)\. url reject-img +^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\/\d+\/\d+\/BbsImg\.(?<=(big.(png|jpg)))$ url reject-img +^https?:\/\/games\.mobileapi\.hupu\.com\/.+?\/(search|interfaceAdMonitor|status|hupuBbsPm)/(hotkey|init|hupuBbsPm)\. url reject-img ^https?:\/\/games\.mobileapi\.hupu\.com\/interfaceAdMonitor url reject-img ^https?:\/\/img\.zuoyebang\.cc\/zyb-image[\s\S]*?\.jpg url reject-img -^https?:\/\/.+allOne\.php\?ad_name=main_splash_ios url reject-img -^https?:\/\/.+nga\.cn.+\bhome.+\b=ad url reject-img -^https?:\/\/.+resource=article\/recommend\&accessToken= url reject-img -^https?:\/\/113\.200\.76\.*:16420\/sxtd\.bike2\.01\/getkey\.do url reject-img +^https?:\/\/.+?allOne\.php\?ad_name=main_splash_ios url reject-img +^https?:\/\/.+?resource=article\/recommend\&accessToken= url reject-img +^https?:\/\/113\.200\.76\.*?:16420\/sxtd\.bike2\.01\/getkey\.do url reject-img ^https?:\/\/creatives\.ftimg\.net\/ads url reject-img ^https?:\/\/dd\.iask\.cn\/ddd\/adAudit url reject-img ^https?:\/\/g\.tbcdn\.cn\/mtb\/ url reject-img ^https?:\/\/iphone265g\.com\/templates\/iphone\/bottomAd\.js url reject-img -^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/ad url reject-img -^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/mobile\.advert\.js url reject-img -^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/mobileshare\.js url reject-img -^https?:\/\/nga\.cn.+\bhome.+\b=ad url reject-img +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/ad url reject-img +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/mobile\.advert\.js url reject-img +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/mobileshare\.js url reject-img ^https?:\/\/overseas\.weico\.cc\/portal\.php\?a=get_coopen_ads url reject-img ^https?:\/\/player\.hoge\.cn\/advertisement\.swf url reject-img ^https?:\/\/ress\.dxpmedia\.com\/appicast\/ url reject-img @@ -383,37 +368,35 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/api-163\.biliapi\.net\/cover url reject-img ^https?:\/\/pan-api\.bitqiu\.com\/activity\/(getPromoteGuide|getUrlList) url reject-img ^https?:\/\/dssp\.stnts\.com url reject-img -^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.*\/client\w+\.jpg url reject-img +^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.*?\/client\w+\.jpg url reject-img ^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d+\.(jpg|png) url reject-img -^https?:\/\/m\.creditcard\.ecitic\.com\/.*\/appStartAdv url reject-img +^https?:\/\/m\.creditcard\.ecitic\.com\/.*?\/appStartAdv url reject-img ^https?:\/\/mlife\.jf365\.boc\.cn\/AppPrj\/FirstPic\.do url reject-img -^https?:\/\/mlife\.cmbchina\.com\/ClientFaceService\/preCacheAdvertise\.json url reject-img ^https?:\/\/creditcardapp\.bankcomm\.com\/mapp\/common\/queryGuidePageAds\.do url reject-img -^https?:\/\/[\s\S]*\/.+\.tc\.qq\.com/.*p201.1\.mp4 url reject-img -^https?:\/\/[\s\S]*\/website\/.*\.jpg url reject-img +^https?:\/\/[\s\S]*\/.+?\.tc\.qq\.com/.*?p201.1\.mp4 url reject-img +^https?:\/\/[\s\S]*\/website\/.*?\.jpg url reject-img ^https?:\/\/[\s\S]*\/music\/photo_new\/T017R url reject-img -^https?:\/\/y\.gtimg\.cn\/music\/.*_Ad/\d+\.png url reject-img -^https?:\/\/shp\.qpic\.cn\/pggamehead\/.*h=\d{4} url reject-img +^https?:\/\/y\.gtimg\.cn\/music\/.*?_Ad/\d+\.png url reject-img +^https?:\/\/shp\.qpic\.cn\/pggamehead\/.*?h=\d{4} url reject-img ^https?:\/\/api2\.helper\.qq\.com\/game\/buttons url reject-img -^https?:\/\/[\s\S]*\.baidu\.com/.*ad[xs]\.php url reject-img +^https?:\/\/[\s\S]*\.baidu\.com/.*?ad[xs]\.php url reject-img ^https?:\/\/pan\.baidu\.com\/rest\/2.0\/pcs\/adx url reject-img ^https?:\/\/pan\.baidu\.com\/act\/api\/activityentry url reject-img -^https?:\/\/[\s\S]*\/youku\/.*\.mp4 url reject-img +^https?:\/\/[\s\S]*\/youku\/.*?\.mp4 url reject-img ^https?:\/\/optimus-ads\.amap\.com\/uploadimg\/ url reject-img -^https?:\/\/cube\.elemecdn\.com\/.*\.mp4\? url reject-img -^https?:\/\/p\d.meituan.net\/movie\/.*\?may_covertWebp url reject-img +^https?:\/\/p\d.meituan.net\/movie\/.*?\?may_covertWebp url reject-img ^https?:\/\/p\d\.meituan\.net\/wmbanner\/ url reject-img ^https?:\/\/s3plus\.meituan\.net\/v1\/mss_a002 url reject-img -^https?:\/\/img\.meituan\.net\/midas\/.*@\d{4}h url reject-img +^https?:\/\/img\.meituan\.net\/midas\/.*?@\d{4}h url reject-img ^https?:\/\/img\.meituan\.net\/display\/\w+\.jpg\.webp url reject-img ^https?:\/\/[\s\S]*\/eapi\/ad\/ url reject-img -^https?:\/\/iad.*mat\.[a-z]*\.12[67]\.net/\w+\.(jpg|mp4) url reject-img -^https?:\/\/zt-app\.go189\.cn\/zt-app\/welcome\/.*Animation url reject-img +^https?:\/\/iad.*?mat\.music\.12[67]\.net/\w+\.(jpg|mp4) url reject-img +^https?:\/\/zt-app\.go189\.cn\/zt-app\/welcome\/.*?Animation url reject-img ^https?:\/\/[\s\S]*\/ting\/[a-z]*\/ts-\d+ url reject-img ^https?:\/\/res\.xiaojukeji\.com\/resapi\/activity\/get(Ruled|Preload) url reject-img ^https?:\/\/rich\.kuwo\.cn\/AdService\/kaiping\/adinfo url reject-img ^https?:\/\/[\s\S]*\.snssdk\.com\/api\/ad\/ url reject-img -^https?:\/\/api\.feng\.com\/v1\/advertisement\/.*Claunch url reject-img +^https?:\/\/api\.feng\.com\/v1\/advertisement\/.*?Claunch url reject-img ^https?:\/\/business\.msstatic\.com\/advertiser\/ url reject-img ^https?:\/\/cdnfile1\.msstatic\.com\/cdnfile\/appad\/ url reject-img ^https?:\/\/ms\.jr\.jd\.com\/gw\/generic\/aladdin\/na\/m\/getLoadingPicture url reject-img @@ -422,32 +405,35 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/app\.yinxiang\.com\/ads\/getAdsInfo url reject-img ^https?:\/\/api\.douban\.com\/v2\/app_ads\/splash url reject-img ^https?:\/\/ptmpcap\.caocaokeji\.cn\/advert-bss\/ url reject-img -^https?:\/\/newapp\.szsmk\.com\/app\/config\/.*Ad url reject-img -^https?:\/\/api\.rr\.tv\/.*(getAll|Version) url reject-img +^https?:\/\/newapp\.szsmk\.com\/app\/config\/.*?Ad url reject-img ^https?:\/\/client\.qunar\.com\/pitcher-proxy\?qrt=p_splashAd url reject-img ^https?:\/\/m\.tuniu\.com\/api\/operation\/splash\/ url reject-img -^https?:\/\/y\.gtimg\.cn\/music\/common\/\/upload\/kg_ad/.*\d{4}\.jpg url reject-img +^https?:\/\/y\.gtimg\.cn\/music\/common\/\/upload\/kg_ad/.*?\d{4}\.jpg url reject-img ^https?:\/\/dimg04\.c-ctrip\.com\/images\/\w+(_\d{4}){2} url reject-img -^https?:\/\/adm\.10jqka\.com\.cn\/img\/ad\/.*(1\d{2}|\d{4})\.jpg url reject-img +^https?:\/\/adm\.10jqka\.com\.cn\/img\/ad\/.*?(1\d{2}|\d{4})\.jpg url reject-img ^https?:\/\/api\.gotokeep\.com\/ads\/ url reject-img ^https?:\/\/ggx\.cmvideo\.cn\/request\/ url reject-img ^https?:\/\/oral\.youdao\.com\/oral\/adInfo url reject-img ^https?:\/\/impservice\.dictapp\.youdao\.com\/imp\/request url reject-img -^https?://du\.hupucdn\.com\/\w+h\d{4} url reject-img +^https?:\/\/du\.hupucdn\.com\/\w+h\d{4} url reject-img ^https?:\/\/api\.yangkeduo\.com\/api\/cappuccino\/splash url reject-img -^https?:\/\/mp\.weixin\.qq\.com\/(s|mp)\/(ad_|advertisement|getappmsgad|author|report|appmsgreport|appmsgpicreport) url reject-img -^https?:\/\/ap(i|p)\.bilibili\.com\/((x\/v2|pgc)\/(search\/defaultword|season\/rank\/cn|splash\/)|(pgc/season/rank/cn|x/v2/(rank.*rid=(168|5)|search/(defaultword|hot|recommend|resource)))) url reject-img -^https?:\/\/(api|www)\.zhihu\.com\/((terms\/privacy\/confirm|app_config|banner|commercial_api\/(launch|real_time))|(fringe|zst|drama|adx|commercial|real_time|ad-style-service|banners|market/popover|mqtt|.*(launch|featured-comment-ad|guide|recommendations|community-ad)|search/(top|tab|preset)|ab)) url reject-img -^https?:\/\/interface3?.music.163.com/eapi/(ad|abtest|sp|hot|store|mlog|search/(specialkeyword|defaultkeyword|hot)) url reject-img -^https?:\/\/weibointl.api.weibo.cn/portal.php\?a=get_coopen_ads url reject-img +^https?:\/\/mp\.weixin\.qq\.com\/(s|mp)\/(ad_|advertisement|getappmsgad|report|appmsgreport|appmsgpicreport) url reject-img +^https?:\/\/ap(i|p)\.bilibili\.com\/((x\/v2|pgc)\/(season\/rank\/cn|splash\/)|(pgc/season/rank/cn|x/v2/(rank.*?rid=(168|5)|search/(hot|recommend|resource)))) url reject-img +^https?:\/\/www\.zhihu\.com\/terms\/privacy\/confirm url reject-img +^https?:\/\/api\.zhihu\.com\/market\/popover url reject-img +^https?:\/\/api\.zhihu\.com\/search\/(top|tab|preset) url reject-img +^https?:\/\/api\.zhihu\.com\/(launch|ad-style-service|app_config|real_time|ab\/api) url reject-img +^https?:\/\/api\.zhihu\.com\/commercial_api\/(launch|real_time) url reject-img +^https?:\/\/(api|www)\.zhihu\.com\/.*?(featured-comment-ad|recommendations|community-ad) url reject-img +^https?:\/\/(api|www)\.zhihu\.com\/(fringe|adx|commercial|ad-style-service|banners|mqtt) url reject-img +^https?:\/\/interface3?\.music\.163\.com/eapi/(ad|abtest|sp|hot|store|search/(specialkeyword|defaultkeyword|hot)) url reject-img +^https?:\/\/weibointl\.api\.weibo\.cn\/portal\.php\?a=get_coopen_ads url reject-img ^https?:\/\/yxyapi2\.drcuiyutao\.com\/yxy-api-gateway\/api\/json\/advert\/getsAd url reject-dict ^https?:\/\/capis-clb\.didapinche\.com\/ad\/ url reject-dict ^https?:\/\/api\.vistopia\.com\.cn\/api\/v1\/home\/advertisement url reject ^https?:\/\/www\.didapinche\.com\/app\/adstat\/ url reject-img ^https?:\/\/capis\.didapinche\.com\/ad\/ url reject-img ^https?:\/\/api-163\.biliapi\.net/cover url reject-img -^https:\/\/api\.waitwaitpay\.com\/\/api\/splash$ url reject-img -^https:\/\/api\.waitwaitpay\.com\/\/api\/ad_banners$ url reject-img ^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview.\fcg url reject-img ^https?:\/\/api\.jxedt\.com\/jump\/EMiCcDNp url reject-img ^https?:\/\/richmanapi\.jxedt\.com\/api\/banadplus url reject-img @@ -463,4 +449,9 @@ hostname = qidian.qpic.cn,ulogs.umeng.com,ulogs.umengcloud.com,alogs.umeng.com,a ^https?:\/\/ddrk\.me\/wp-content\/plugins\/advanced-floating-content-lite\/public\/images\/close\.png url reject-img ^https?:\/\/img\.ddrk\.me\/cover\.png url reject-img ^https?:\/\/app-api\.smzdm\.com\/util\/loading url reject-img -^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.common\.fetTimestamp url reject-img \ No newline at end of file +^https?:\/\/emdcadvertise\.eastmoney\.com\/infoService url reject-img +^https?:\/\/www.icourse163.org\/.*?(Advertisement) url reject-img +^https?:\/\/sf.*?-ttcdn-tos\.pstatp\.com\/obj\/ad url reject-img +^https?:\/\/oset-api\.open-adx\.com\/ad\/ url reject-img +# XueQiu +^https?:\/\/(101\.201\.175\.228|182\.92\.251\.113)\/brand\/search\/v1\.json url reject-dict \ No newline at end of file diff --git a/QuantumultX/Snippet/BiliComicCookie.snippet b/QuantumultX/Snippet/BiliComicCookie.snippet new file mode 100644 index 0000000000..d3d5bdb494 --- /dev/null +++ b/QuantumultX/Snippet/BiliComicCookie.snippet @@ -0,0 +1,8 @@ +# 该 QuantumultX 远程重写配置片段用于获取"哔哩哔哩漫画签到"账号Cookie +# 配置脚本后打开哔哩哔哩漫画(AppStore中国区),点击"我的"可完成获取 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/BiliComicCookie.snippet + + +^https:\/\/app\.bilibili\.com\/x\/v2\/account\/myinfo url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js + +hostname = app.bilibili.com \ No newline at end of file diff --git a/QuantumultX/Snippet/CtripAuth.snippet b/QuantumultX/Snippet/CtripAuth.snippet new file mode 100644 index 0000000000..78327113a7 --- /dev/null +++ b/QuantumultX/Snippet/CtripAuth.snippet @@ -0,0 +1,8 @@ +# 该 QuantumultX 远程重写配置片段用于获取"携程签到"账号授权 +# 配置脚本后登陆"携程旅行"微信小程序或"携程网页版"(https://m.ctrip.com/)即可完成获取 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/CtripAuth.snippet + + +^https:\/\/m\.ctrip\.com\/restapi\/soa2\/\d+\/[a-zA-Z]+Login(?:$|\?) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js + +hostname = m.ctrip.com \ No newline at end of file diff --git a/QuantumultX/Snippet/GoogleCAPTCHA.snippet b/QuantumultX/Snippet/GoogleCAPTCHA.snippet new file mode 100644 index 0000000000..0f7e985912 --- /dev/null +++ b/QuantumultX/Snippet/GoogleCAPTCHA.snippet @@ -0,0 +1,12 @@ +# QuantumultX 远程重写配置片段 + +# Google搜索人机验证解决方案 +# Google搜索内容时并发使用多个代理策略、策略组尝试搜索内容,并返回最优结果。具体细节可查看脚本注释。 + +# 脚本:https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Google_CAPTCHA.js +# 片段:https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/GoogleCAPTCHA.snippet + + +^https:\/\/www\.google\.com(?:\.[a-z]+|)\/(?:search\?(?:|.+?&)q=|$) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Google_CAPTCHA.js + +hostname = www.google.com* \ No newline at end of file diff --git a/QuantumultX/Snippet/KuaiKanCookie.snippet b/QuantumultX/Snippet/KuaiKanCookie.snippet new file mode 100644 index 0000000000..2cd8e0eaa4 --- /dev/null +++ b/QuantumultX/Snippet/KuaiKanCookie.snippet @@ -0,0 +1,8 @@ +# 该 QuantumultX 远程重写配置片段用于获取"快看漫画签到"账号Cookie +# 配置脚本后打开快看漫画(AppStore中国区),点击"我的"可完成获取 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/KuaiKanCookie.snippet + + +^https:\/\/api\.kkmh\.com\/v\d\/passport\/user url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +hostname = api.kkmh.com \ No newline at end of file diff --git a/QuantumultX/Snippet/TieBaCookie.snippet b/QuantumultX/Snippet/TieBaCookie.snippet new file mode 100644 index 0000000000..1a5e923ce0 --- /dev/null +++ b/QuantumultX/Snippet/TieBaCookie.snippet @@ -0,0 +1,8 @@ +# 该 QuantumultX 远程重写配置片段用于获取"百度贴吧签到"账号Cookie +# 配置脚本后打开百度贴吧App(AppStore中国区, 非内部版),点击"我的"可完成获取 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/TieBaCookie.snippet + + +https?:\/\/(c\.tieba\.baidu\.com|180\.97\.\d+\.\d+)\/c\/s\/login url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js + +hostname = c.tieba.baidu.com \ No newline at end of file diff --git a/QuantumultX/Snippet/iQiYiCookie.snippet b/QuantumultX/Snippet/iQiYiCookie.snippet new file mode 100644 index 0000000000..0c77dbc4b3 --- /dev/null +++ b/QuantumultX/Snippet/iQiYiCookie.snippet @@ -0,0 +1,8 @@ +# 该 QuantumultX 远程重写配置片段用于获取"爱奇艺签到"账号Cookie +# 配置脚本后 Safari 浏览器打开 https://m.iqiyi.com/user.html 使用密码登录可完成获取 +# https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/iQiYiCookie.snippet + + +^https:\/\/passport\.iqiyi\.com\/apis\/user\/ url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +hostname = passport.iqiyi.com \ No newline at end of file diff --git a/QuantumultX/TestFlightDownload.conf b/QuantumultX/TestFlightDownload.conf new file mode 100644 index 0000000000..bdae936a48 --- /dev/null +++ b/QuantumultX/TestFlightDownload.conf @@ -0,0 +1,5 @@ +# 该订阅仅适用于QuantumultX, 用于更新TestFlight App时, 提示"APP不可用"问题. 解除区域限制. + +hostname = testflight.apple.com + +^https?:\/\/testflight\.apple\.com\/v\d\/accounts\/.+?\/install$ url script-request-body https://gist.githubusercontent.com/NobyDa/9be418b93afc5e9c8a8f4d28ae403cf2/raw/TF_Download.js \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 9c82ab04c4..dee52ced84 --- a/README.md +++ b/README.md @@ -1,34 +1,203 @@ -## Quantumult X related Description: +## TOC +- [TOC](#toc) +- [Script Overview](#script-overview) + - [Daily-Bonus Script](#daily-bonus-script) + - [Functionality-enhancing Script](#functionality-enhancing-script) + - [Other Script](#other-script) +- [Surge File Overview](#surge-file-overview) +- [QuantumultX File Overview](#quantumultx-file-overview) +- [Loon File Overview](#loon-file-overview) +- [Stash File Overview](#stash-file-overview) +- [Disclaimer](#disclaimer) + - [Decrypt](#decrypt) + - [Privacy](#privacy) + - [Commercial](#commercial) + - [Infringement](#infringement) + - [Liability](#liability) + - [Change](#change) +- [Acknowledgment](#acknowledgment) +- [License](#license) + + +> **The scripts or rewrite rules described below may require enabling MITM. Additionally, the generated root certificate must be installed and trusted manually in the system.** + +## Script Overview + +### Daily-Bonus Script + +| Application | Script name | Available | Maintenance | +| :-----------------------------------------------------: | :----------------------------------------------------------: | :------------: | :---------: | +| [京东商城](https://apps.apple.com/app/id414245413) | [JD_DailyBonus.js](https://github.com/NobyDa/Script/blob/master/JD-DailyBonus/JD_DailyBonus.js) | ❌ | ⚠️ | +| [百度贴吧](https://apps.apple.com/app/id477927812) | [TieBa.js](https://github.com/NobyDa/Script/blob/master/BDTieBa-DailyBonus/TieBa.js) | ✅ (2023/08/17) | ❌ | +| [吾爱破解](https://www.52pojie.cn/) | [52pojie.js](https://github.com/NobyDa/Script/blob/master/52pojie-DailyBonus/52pojie.js) | ❌ | ❌ | +| [爱奇艺](https://apps.apple.com/cn/app/id393765873) | [iQIYI.js](https://github.com/NobyDa/Script/blob/master/iQIYI-DailyBonus/iQIYI.js) | ✅ (2023/08/17) | ✅ | +| [快看漫画](https://apps.apple.com/app/id906936224) | [KKMH.js](https://github.com/NobyDa/Script/blob/master/KuaiKan-DailyBonus/KKMH.js) | ✅ (2023/08/17) | ✅ | +| [哔哩哔哩漫画](https://apps.apple.com/app/id1426252715) | [Manga.js](https://github.com/NobyDa/Script/blob/master/Bilibili-DailyBonus/Manga.js) | ✅ (2023/08/17) | ✅ | +| [巴哈姆特](https://www.gamer.com.tw/) | [BahamutDailyBonus.js](https://github.com/NobyDa/Script/blob/master/Bahamut/BahamutDailyBonus.js) | ✅ (2023/08/17) | ✅ | + +------ + +### Functionality-enhancing Script + +| Script name | Description | +|:-------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| [PolicySwitch.js](https://github.com/NobyDa/Script/blob/master/Shortcuts/PolicySwitch.js) | Switch [QX](https://apps.apple.com/app/id1443988620),[Surge](https://apps.apple.com/app/id1442620678),[Loon](https://apps.apple.com/app/id1373567447) policy groups using ios [shortcut](https://apps.apple.com/app/id1462947752). | +| [DataQuery.js](https://github.com/NobyDa/Script/blob/master/Sub-store-parser/DataQuery.js) | Server(VPN) traffic query based on [Sub-Store](https://github.com/Peng-YM/Sub-Store). | +| [Bili_Auto_Regions.js](https://github.com/NobyDa/Script/blob/master/Surge/JS/Bili_Auto_Regions.js) | [Bilibili anime](https://apps.apple.com/cn/app/id736536022) auto switch region & show [douban](https://www.douban.com/) rating. | +| [ExchangePoints.js](https://github.com/NobyDa/Script/blob/master/Bilibili-DailyBonus/ExchangePoints.js) | [Bilibili Comics](https://apps.apple.com/app/id1426252715) points mall auto snap up. | +| [TestFlightAccount.js](https://github.com/NobyDa/Script/blob/master/TestFlight/TestFlightAccount.js) | Merge and share [TestFlight](https://apps.apple.com/app/id899247664) accounts | +| [Google_CAPTCHA.js](https://github.com/NobyDa/Script/blob/master/Surge/JS/Google_CAPTCHA.js) | Google CAPTCHA solution(Surge only) | -* **Script remote resources and subscriptions only apply to QX v1.0.0(120). If the version is higher than v1.0.2 (136), you need to point to the local script path yourself.** +--- + +### Other Script + +| Application | Script name | Description | Available | +| :----------------------------------------------------------: | :----------------------------------------------------------: | :---------------------: | :------------: | +| [HTTPBot](https://apps.apple.com/cn/app/id1232603544) | [vsco.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js) | Unlock membership | ✅ (2023/08/17) | +| [VSCO](https://apps.apple.com/app/id588013838) | [vsco.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js) | Unlock membership | ✅ (2023/08/17) | +| [1Blocker](https://apps.apple.com/app/id1365531024) | [vsco.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/vsco.js) | Unlock membership | ✅ (2023/08/17) | +| [JibJab](https://apps.apple.com/app/id875561136) | [jibjab.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/jibjab.js) | Unlock membership | ✅ (2023/08/17) | +| [美易Picsart](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js) | [PicsArt.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js) | Unlock membership | ✅ (2023/08/17) | +| [MIX滤镜大师](https://apps.apple.com/app/id913947918) | [MIX.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/MIX.js) | Unlock in-app purchases | ✅ (2023/08/17) | +| [Polarr 泼辣](https://apps.apple.com/app/id988173374) | [Polarr.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Polarr.js) | Unlock in-app purchases | ✅ (2023/08/17) | +| [小影VivaVideo](https://apps.apple.com/app/id738897668) | [vivavideo.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js) | Unlock membership | ✅ (2023/08/17) | +| [CamScanner](https://apps.apple.com/app/id388627783) | [CamScanner.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/CamScanner.js) | Unlock some benefits | ✅ (2023/08/17) | +| [知音漫客](https://apps.apple.com/app/id1012491820) | [Zymh.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Zymh.js) | Unlock vip chapters | ✅ (2023/08/17) | +| [香蕉视频](https://www.aa2.app) | [xjsp.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/xjsp.js) | Unlock membership | ✅ (2023/08/17) | +| [网易蜗牛读书](https://apps.apple.com/app/id1127249355) | [wnyd.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/wnyd.js) | Unlock membership | ✅ (2023/08/17) | +| [陆琪讲故事](https://apps.apple.com/app/id1435575842) | [luqi.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/luqi.js) | Unlock radio | ✅ (2023/08/17) | +| [百度网盘](https://apps.apple.com/app/id547166701) | [BaiduCloud.js](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js) | Unlock video speed | ✅ (2023/08/17) | +| [WeChat](https://apps.apple.com/app/id414478124) | [Wechat.js](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/Wechat.js) | Remove Ads | ✅ (2023/08/17) | +| [動畫瘋](https://apps.apple.com/tw/app/id1102650114) | [BahamutAnimeAds.js](https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutAnimeAds.js) | Remove Ads | ✅ (2023/08/17) | + +--- + +## Surge File Overview + +| File name | Description | Type | +| :----------------------------------------------------------: | :----------------------------------------------------------: | ------ | +| [HuiJuDongManAds.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/HuiJuDongManAds.sgmodule) | Remove [APP](https://apps.apple.com/app/id1451949669) Ads | Module | +| [IPA_install.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/IPA_install.sgmodule) | Use Surge to assist in install IPA (signed version) | Module | +| [TestFlightDownload.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/TestFlightDownload.sgmodule) | Remove [TestFlight](https://apps.apple.com/app/id899247664) region restrictions | Module | +| [TestFlightAccount.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/TestFlightAccount.sgmodule) | Merge and share [TestFlight](https://apps.apple.com/app/id899247664) accounts | Module | +| [GetCookie.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/GetCookie.sgmodule) | Daily bonus script related | Module | +| [BahamutAnimeAds.sgmodule](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/BahamutAnimeAds.sgmodule) | Remove [Bahamut anime](https://apps.apple.com/tw/app/id1102650114) Ads | Module | + +--- + +## QuantumultX File Overview + +| File name | Description | Type | +|:---------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------:|:-----------------:| +| [Js.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js.conf) | Remote script subscription. | Rewrite Resources | +| [Js_Remote_Cookie.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Js_Remote_Cookie.conf) | Daily bonus script related | Rewrite Resources | +| [TestFlightDownload.conf](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/TestFlightDownload.conf) | Remove [TestFlight](https://apps.apple.com/app/id899247664) region restrictions | Rewrite Resources | +| [IPA-Installer.snippet](https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/IPA-Installer.snippe) | Use QX to assist in install IPA (signed version) | Rewrite Resources | + +Rules of type "Rule" include only ad hosts. Please select the REJECT policy. + +
Difference between QuantumultX versions (Click to view) + +* AppStore version QX1.0.0 (120): This is the initial version, and JS functionality is unrestricted. + +* AppStore version QX1.0.1 (130): This version adds support for V2Ray protocols but restricts certain keywords for VIP-type scripts. + +* AppStore version QX1.0.2 (136): This version adds support for HTTP protocols and relaxes certain script keyword restrictions but restricts remote script subscriptions. + +* AppStore version QX1.0.3 (155): This version removes keyword restrictions and restores the script remote subscription functionality. However, the device ID must be commented out in the remote script before execution. + +* AppStore version QX1.0.4 (164): This version completely restricts remote script subscriptions, requiring all scripts to use local paths. + +* AppStore version QX1.0.5 (192): This version introduces a scheduled script task feature. + +* AppStore version QX1.0.6 (212): This version supports modifying HTTP request body and replaying HTTP requests. + +* AppStore version QX1.0.7 (240): This version supports TLS 1.3 (TLS-based proxy protocol) and Trojan protocols. -* Because the latest version 1.0.2 has limited the "remote resource" of the script, there will be an error in adding the subscription. +* ... -### The difference between the versions : +* AppStore version QX1.0.10 (313): This version restores remote script subscriptions. -* Store version QX1.0.0 (120) JS function is unlimited, but does not support v2, does not support AlwaysOn +In QX1.0.3, the device ID feature was added. Here’s a simple example: -* Store version QX1.0.1 (130) restricts keywords for script VIP types, but supports v2 and supports AlwaysOn +```javascript +/** + * @supported 23AD6B11CD4B + */ -* Store version QX1.0.2 (136) Relaxed certain keyword restrictions, but limited script remote references (script subscriptions), support for v2 and support for http and support AlwaysOn +let obj = JSON.parse($response.body) +obj["example"] = 0; +$done({body:JSON.stringify(obj)}) +``` -* **It is currently not possible to get QX1.0.0 (120) via sniffing packet capture because the dev has withdrawn** +The randomly generated device ID above is located at the bottom of the Quantumult X additional menu and may change after a system restore. + +
+ +--- + +## Loon File Overview + +| File name | Description | Type | +| :----------------------------------------------------------: | :----------------------------------------------------------: | :----: | +| [Loon_GetCookie.plugin](https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_GetCookie.plugin) | Daily bonus script related | Plugin | +| [Loon_TF_Download.plugin](https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_TF_Download.plugin) | Remove [TestFlight](https://apps.apple.com/app/id899247664) region restrictions | Plugin | +| [Loon_TF_Account.plugin](https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_TF_Account.plugin) | Merge and share [TestFlight](https://apps.apple.com/app/id899247664) accounts | Plugin | +| [Loon_Bahamut_ADS.plugin](https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_Bahamut_ADS.plugin) | Remove [Bahamut anime](https://apps.apple.com/tw/app/id1102650114) Ads | Plugin | +| [Loon_IPA_Installer.plugin](https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_IPA_Installer.plugin) | Use Loon to assist in install IPA (signed version) | Plugin | --- -### Disclaimer: +## Stash File Overview + +| File name | Description | Type | +|:-----------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------:|:--------:| +| [IPA-Installer.stoverride](https://raw.githubusercontent.com/NobyDa/Script/master/Stash/IPA-Installer.stoverride) | Use Stash to assist in install IPA (signed version) | Override | + +--- + +## Disclaimer + +Please note that in the following disclaimer, the term "Script-project" specifically refers to the open source scripts and rules available at "https://github.com/NobyDa/Script", while the term "NobyDa" specifically refers to the author and owner of these scripts and rules. + +### Decrypt + +- Any scripts within the Script-project that involve unlocking and decrypting are intended for resource sharing and study purposes only. The legality, accuracy, completeness, and validity of these scripts cannot be guaranteed. **Therefore, please use your own judgment based on the actual situation.** + +- You are required to delete the decryption scripts from your computer or phone completely within **24 hours** of downloading them. + +### Privacy + +- NobyDa is not responsible for any privacy breaches or other consequences arising from the direct or indirect use of any of the scripts in the Script-project, including but not limited to violating relevant laws and regulations or establishing a VPS for distribution purposes. + +### Commercial + +- Do not use any scripts from the Script-project for commercial or illegal purposes, **or you will bear full responsibility for the consequences that may arise**. + +### Infringement + +- If any company or individual believes that any script in the Script-project may infringe on their rights, they should promptly notify us and provide proof of **ownership** and **identity**. We will delete the relevant scripts upon receipt of the necessary documents. + +### Liability -* **Any unlocking and decryption analysis scripts involved in the Script project released by NobyDa are only used for resource sharing and learning research. Legality, accuracy, completeness, and validity cannot be guaranteed. Please judge according to the situation itself.** +- NobyDa is not responsible for any problems with the Script-project, **including but not limited to any loss or damage caused by any scripting errors.** -* Any user who uses the script indirectly, Including but not limited to building a VPS or spreading if a certain behavior violates the country and laws or relevant regulations, **NobyDa is not responsible for any privacy leak or other consequences caused by it.** +### Change -* **Do not use any content of the Script project for commercial or illegal purposes,otherwise, all consequences are at your own risk.** +- Anyone who views or uses the scripts in the Script-project, whether directly or indirectly, should carefully read this disclaimer. NobyDa reserves the right to change or supplement this disclaimer at any time. -* If any unit or individual believes that a script of the project may be suspected of infringing its rights, it shall promptly notify and **provide proof of identity, proof of ownership,** we will delete the relevant script after receiving the certification file. +- **By viewing, using, or copying any of the related scripts in the Script-project, you will be deemed to have accepted this disclaimer.** -* **NobyDa is not responsible for any scripting issues, including but not limited to any loss or damage caused by any script error.** +## Acknowledgment -* You must completely remove the above from your computer or mobile phone within **24 hours** of downloading. +* [@sazs34](https://github.com/sazs34) +* [@lhie1](https://github.com/lhie1) +* [@Scomper](https://github.com/scomper) +* [@onewayticket255](https://github.com/onewayticket255) +* [@Choler](https://github.com/Choler) +* [@ConnersHua](https://github.com/ConnersHua) -* Anyone who views this project in any way or any script that uses the Script project directly or indirectly should read this statement carefully. And NobyDa reserves the right to change or supplement this disclaimer at any time. **Once you use and reproduce any related scripts or rules of the Script project, you are deemed to have accepted this disclaimer.** +## License +[GPLv3](LICENSE) diff --git a/Rule-Storage/Include-Domain.txt b/Rule-Storage/Include-Domain.txt new file mode 100644 index 0000000000..e458138659 --- /dev/null +++ b/Rule-Storage/Include-Domain.txt @@ -0,0 +1,26 @@ +DOMAIN-KEYWORD,.a +DOMAIN-KEYWORD,.b +DOMAIN-KEYWORD,.c +DOMAIN-KEYWORD,.d +DOMAIN-KEYWORD,.e +DOMAIN-KEYWORD,.f +DOMAIN-KEYWORD,.g +DOMAIN-KEYWORD,.h +DOMAIN-KEYWORD,.i +DOMAIN-KEYWORD,.j +DOMAIN-KEYWORD,.k +DOMAIN-KEYWORD,.l +DOMAIN-KEYWORD,.m +DOMAIN-KEYWORD,.n +DOMAIN-KEYWORD,.o +DOMAIN-KEYWORD,.p +DOMAIN-KEYWORD,.q +DOMAIN-KEYWORD,.r +DOMAIN-KEYWORD,.s +DOMAIN-KEYWORD,.t +DOMAIN-KEYWORD,.u +DOMAIN-KEYWORD,.v +DOMAIN-KEYWORD,.w +DOMAIN-KEYWORD,.x +DOMAIN-KEYWORD,.y +DOMAIN-KEYWORD,.z \ No newline at end of file diff --git a/Rule-Storage/Rule-Storage.js b/Rule-Storage/Rule-Storage.js new file mode 100644 index 0000000000..56f56a3293 --- /dev/null +++ b/Rule-Storage/Rule-Storage.js @@ -0,0 +1,159 @@ +/* +Surge规则自动生成脚本 +更新时间:2024/08/11 + +需按照博客内教程配合使用: +https://nobyda.github.io/2024/02/24/Surge_Rule_Storage + +*/ + +const args = argsList(typeof $argument == "string" && $argument || 'region=debug'); +/* +When matching whitelist rules, skip generating suffix domain. Three ways to write: +Domain: example.com +Domain suffix: .example.com +Domain keyword: .example. +*/ +args.whitelist = args.whitelist || `[".mwcname.com", ".akadns.", ".akamai.", ".cloud.", ".cdn.", ".yun."]`; +args.key = args.key || 'Rule-Storage'; + +(async () => { + const host = $request.hostname.toLowerCase(); + const inHost = $request.listenPort == 6152 && !$request.sourcePort && !$request.processPath && /^[a-z0-9]{10}\.[a-z]+$/.test(host); //Prevent benchmark + if (['127.0.0.1', '0.0.0.0'].filter((v) => [...($request.dnsResult || {}).v4Addresses || []].includes(v)).length) { + // DNS poisoning + args.matched = false; + args.region = 'global'; + } + if (!/\d$|:/.test(host) && host.includes('.') && !inHost) { + const data = JSON.parse($persistentStore.read(args.key) || '{}'); + const saved_rules = $persistentStore.read(`${args.key}-${args.region}`); + if (!evalRules(host, saved_rules)) { + data[args.region] = saveDecision(host, data[args.region]); + if (data[args.region][host].quantity >= (args.quantity || 10)) { + const eTLDs = await eTLD(data.eTLD || JSON.parse($persistentStore.read(`${args.key}-eTLD`) || '{}')); + if (data.eTLD) { // legacy + $persistentStore.write(JSON.stringify(data.eTLD), `${args.key}-eTLD`); + delete data.eTLD; + } + const suffix = shortenDomain(host, eTLDs.public_suffix); + const domain = evalRules(host, JSON.parse(args.whitelist)) ? host : suffix; + const text = [...formatRules(saved_rules), ...formatRules(domain)].join('\n'); + delete data[args.region][host]; + $persistentStore.write(text, `${args.key}-${args.region}`) + } + } + return $persistentStore.write(JSON.stringify(data), args.key) + } +})().catch((e) => $notification.post(args.key, ``, e.message || e)) + .finally(() => $done({ matched: Boolean(args.matched) })); + +function saveDecision(host_name, content = {}) { + const count = []; + for (const i in content) { + if (Date.now() - content[i].update_time > 86400000 * (args.cacheDays || 30)) { + delete content[i]; + continue + } + count.push(content[i].update_time); + } + if (count.length > (args.cacheNumber || 1000)) { // limit amount to prevent NE memory issues. + const spill = count.sort((x, y) => x - y).slice(0, count.length - (args.cacheNumber || 1000)); + for (const is of spill) { + for (const ic in content) { + if (content[ic].update_time === is) { + delete content[ic]; + break + } + } + } + } + if (content[host_name]) { + if (Date.now() - content[host_name].update_time > ((args.interval || 30) * 1000)) { + content[host_name].update_time = Date.now(); + content[host_name].quantity++; + } + } else { + content[host_name] = { update_time: Date.now(), quantity: 1 } + } + return content +} + +function evalRules(host_name, rule_list) { + const host_suffix = host_name.split('.').reverse(); + rule_list = typeof rule_list == 'object' ? rule_list : formatRules(rule_list, 1); + for (const i in rule_list) { + if (rule_list[i].startsWith('.') && !rule_list[i].endsWith('.')) { + const rule_host_suffix = rule_list[i].split('.').reverse().filter((v) => v); + if (rule_host_suffix.filter((v, i) => host_suffix[i] === v).length === rule_host_suffix.length) { + return true + } + } else if (rule_list[i].startsWith('.') && rule_list[i].endsWith('.')) { + if (host_name.includes(rule_list[i].slice(1, -1))) { + return true + } + } else if (rule_list[i] === host_name) { + return true + } + } + return false +} + +function formatRules(list, type) { + return (list || '').replace(/\r|\ |(\/\/|#|;).*/g, '').split('\n').map((v) => { + if (v.startsWith('DOMAIN,')) { return type ? v.split(",")[1] : v } + if (v.startsWith('DOMAIN-SUFFIX,')) { return type ? `.${v.split(",")[1]}` : v } + if (v.startsWith('.')) { return type ? v : `DOMAIN-SUFFIX,${v.slice(1)}` } + if (v.includes('.')) { return type ? v : `DOMAIN,${v}` } + }).filter((v) => v); +} + +async function eTLD(content = {}) { + if (!content.update_time || (Date.now() - content.update_time > 86400000 * 30)) { + await new Promise(resolve => { + $httpClient.get({ + url: 'https://publicsuffix.org/list/public_suffix_list.dat' + }, (error, resp, body) => { + if (resp.status == 200 && !error && body) { + content.update_time = Date.now(); + content.public_suffix = body.replace(/\r|.*(\/\/|#|;).*|\n(\!|\*\.)/g, '\n').split('\n').filter((t) => t); + $persistentStore.write(JSON.stringify(content), `${args.key}-eTLD`); + resolve() + } else if (content.update_time) { + console.log(`Update eTLD list failed: ${error}`); + resolve() + } else { + throw new Error(`Download eTLD list failed: ${error}`) + } + }) + }) + } + return content +} + +/* +Shorten multi level domain: non-eTLD, full eTLD, second level domain will return original +Basic logic: www.abc.com -> .abc.com +*/ +function shortenDomain(host_name, eTLD_list) { + return host_name.split('.').reverse().reduce((t, v, i, c) => { + if (t === host_name || c.length == 2) { return host_name } + if (t.startsWith('.')) { return t } + const host_suffix = v + (t && `.${t}` || ''); + for (const ix in eTLD_list) { + if (eTLD_list[ix] === host_suffix) { + return host_suffix + } + } + return !i && host_name || `.${host_suffix}` + }, '') +} + +function argsList(data) { + return Array.from( + data.split("&") + .map((i) => i.split("=")) + .map(([k, v]) => [k, decodeURIComponent(v)]) + ) + .reduce((a, [k, v]) => Object.assign(a, { [k]: v }), {}) +} \ No newline at end of file diff --git a/Shortcuts/PolicySwitch.js b/Shortcuts/PolicySwitch.js new file mode 100644 index 0000000000..432e867398 --- /dev/null +++ b/Shortcuts/PolicySwitch.js @@ -0,0 +1,129 @@ +/* +捷径策略切换脚本, 该脚本需与捷径配合使用. + +脚本兼容: Surge4.7, QuanX1.0.22(545+), Loon2.1.10(290+) +捷径地址: https://www.icloud.com/shortcuts/0f5b9a825cad47488a78ff2876b822dd + +脚本配置: +-----------Surge------------ +[Script] +捷径策略切换 = type=http-request,pattern=^http:\/\/nobyda\.policy,requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js + +--------QuantumuitX--------- +[rewrite_local] +^http:\/\/nobyda\.policy url script-analyze-echo-response https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js + +------------Loon------------ +[Script] +http-request ^http:\/\/nobyda\.policy script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js, requires-body=true, tag=捷径策略切换 + +---------------------------- +*/ + +const $ = new nobyda(); +const url = $request.url; +const body = JSON.parse($request.body || '{}'); + +(async function SwitchPoliy() { + let res = {}; + if (/\/getGroup$/.test(url)) + res.group = await $.getGroup(); + if (/\/getPolicy$/.test(url)) + res.policy = await $.getPolicy(body.group); + if (/\/setPolicy$/.test(url)) + res.success = await $.setPolicy(body.group, body.policy); + $.done(res); +})() + +function nobyda() { + const isLoon = typeof($loon) !== "undefined"; + const isQuanX = typeof($configuration) !== 'undefined'; + const isSurge = typeof($httpAPI) !== 'undefined'; + const m = `不支持您的APP版本, 请等待APP更新 ⚠️`; + this.getGroup = () => { + if (isSurge) { + return new Promise((resolve) => { + $httpAPI("GET", "v1/policies", {}, (b) => resolve(b['policy-groups'])) + }) + } + if (isLoon) { + const getName = JSON.parse($config.getConfig()); + return getName['all_policy_groups']; + } + if (isQuanX) { + return new Promise((resolve) => { + $configuration.sendMessage({ + action: "get_customized_policy" + }).then(b => { + if (b.ret) { + resolve(Object.keys(b.ret).filter(s => b.ret[s].type == "static")); + } else resolve(); + }, () => resolve()); + }) + } + return m; + } + this.getPolicy = (groupName) => { + if (isSurge) { + return new Promise((resolve) => { + $httpAPI("GET", "v1/policy_groups", {}, (b) => { + resolve(b[groupName].map(g => g.name)) + }) + }) + } + if (isLoon) { + return new Promise((resolve) => { + $config.getSubPolicys(groupName, (b) => { + const get = JSON.parse(b || '[]').map(n => n.name); + resolve(get) + }) + }) + } + if (isQuanX) { + return new Promise((resolve) => { + $configuration.sendMessage({ + action: "get_customized_policy", + content: groupName + }).then(b => { + if (b.ret && b.ret[groupName]) { + resolve(b.ret[groupName].candidates); + } else resolve(); + }, () => resolve()); + }) + } + return m; + } + this.setPolicy = (group, policy) => { + if (isSurge) { + return new Promise((resolve) => { + $httpAPI("POST", "v1/policy_groups/select", { + group_name: group, + policy: policy + }, (b) => resolve(!b.error)) + }) + } + if (isLoon) { + const set = $config.setSelectPolicy(group, policy); + return set; + } + if (isQuanX) { + return new Promise((resolve) => { + $configuration.sendMessage({ + action: "set_policy_state", + content: { + [group]: policy + } + }).then((b) => resolve(!b.error), () => resolve()); + }) + } + return m; + } + this.done = (body) => { + const e = { + response: { + body: JSON.stringify(body) + } + }; + $done(typeof($task) != "undefined" ? e.response : e); + } +} \ No newline at end of file diff --git a/Stash/IPA-Installer.stoverride b/Stash/IPA-Installer.stoverride new file mode 100644 index 0000000000..29dd32268c --- /dev/null +++ b/Stash/IPA-Installer.stoverride @@ -0,0 +1,16 @@ +name: IPA应用辅助安装器 +desc: 该模块可在iOS端辅助安装商店版或已签名IPA(需使用快捷指令 + Shu/Jsbox/pythonista), 查看脚本注释以了解具体方法; 安装演示可查看TG频道 @NobyDa + +http: + mitm: + - nobyda.app + script: + - match: ^https:\/\/nobyda.app/(install|download) + name: IPA-Installer + type: request + require-body: true + timeout: 10 +script-providers: + IPA-Installer: + url: https://raw.githubusercontent.com/NobyDa/Script/master/IPA-Installer/IPA-Installer.js + interval: 86400 \ No newline at end of file diff --git a/Sub-store-parser/DataQuery.js b/Sub-store-parser/DataQuery.js new file mode 100644 index 0000000000..22e96bc1fc --- /dev/null +++ b/Sub-store-parser/DataQuery.js @@ -0,0 +1,66 @@ +/****************************** + +Sub-Store外置流量查询脚本 + +该脚本基于Sub-Store, 可解决APP使用Sub-Store链接后, 没有流量通知的问题. 使用前需确认您的机场订阅是否支持流量信息. (注:节点名流量信息暂不支持) +Sub-Store订阅管理器: https://github.com/Peng-YM/Sub-Store + +最后更新: 2022.6.12 +测试兼容: QuantumultX, Surge, Loon. +使用方法: 打开Sub-Store => 订阅 => 编辑 => 节点操作+ => 脚本操作 => 填入脚本链接或粘贴脚本 => 保存 + +您的APP更新Sub-Store订阅链接时, 将自动发送流量通知. + +脚本链接: https://raw.githubusercontent.com/NobyDa/Script/master/Sub-store-parser/DataQuery.js + +******************************/ + +async function operator(proxies, client) { + if (['JSON', 'URI'].includes(client)) return proxies; + const $ = $substore; //OpenAPI in Sub-Store + const single = $.read('subs'); + const collection = $.read('collections'); + const subtag = decodeURIComponent($request.url.split(/download\/(collection\/|)(.*)/)[2]); + const group = []; + if ($request.url.includes('/collection/')) { //collection subscription. + const deployed = collection[subtag].process.filter((c) => c.type == 'Script Operator' && c.args.content.includes('/DataQuery.js')).length; + for (let i = 0; i < collection[subtag].subscriptions.length; i++) { + if (deployed) group.push({ + name: collection[subtag].subscriptions[i], url: single[collection[subtag].subscriptions[i]].url + }); + } + } else { //single subscription. + group.push({ name: single[subtag].name, url: single[subtag].url }) + } + await Promise.all( + group.map((c) => $.http.get(c.url) + .then((r) => { + const t = parseInfo(r); + $.notify( + `🔹 订阅昵称:「 ${c.name} 」`, + t.expire ? `🔹 过期时间:「 ${t.expire} 」` : ``, + `🔸 已用流量:「 ${t.used} GB 」\n🔸 剩余流量:「 ${t.free} GB 」` + ); + }) + .catch((e) => $.notify(`🔹 订阅昵称:「 ${c.name} 」`, ``, `🔺 查询失败:「 ${e.message || e} 」`)) + ) + ) + return proxies; +} + +function parseInfo(resp) { //reference to https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js + var sinfo = JSON.stringify(resp.headers || '').replace(/ /g, "").toLowerCase(); + if (sinfo.indexOf("total=") == -1 && sinfo.indexOf("download=") == -1) + throw new Error('该订阅不包含流量信息'); + // var total = (parseFloat(sinfo.split("total=")[1].split(",")[0]) / (1024 ** 3)).toFixed(0); + var usd = ((parseFloat(sinfo.indexOf("upload") != -1 ? sinfo.split("upload=")[1].split(",")[0] : "0") + parseFloat(sinfo.split("download=")[1].split(",")[0])) / (1024 ** 3)).toFixed(2); + var left = ((parseFloat(sinfo.split("total=")[1].split(",")[0]) / (1024 ** 3)) - ((parseFloat(sinfo.indexOf("upload") != -1 ? sinfo.split("upload=")[1].split(",")[0] : "0") + parseFloat(sinfo.split("download=")[1].split(",")[0])) / (1024 ** 3))).toFixed(2); + if (sinfo.indexOf("expire=") != -1) { + var epr = new Date(parseFloat(sinfo.split("expire=")[1].split(",")[0]) * 1000); + var year = epr.getFullYear(); + var mth = epr.getMonth() + 1 < 10 ? '0' + (epr.getMonth() + 1) : (epr.getMonth() + 1); + var day = epr.getDate() < 10 ? "0" + (epr.getDate()) : epr.getDate(); + return { expire: `${year}-${mth}-${day}`, used: usd, free: left } + } + return { used: usd, free: left } +} \ No newline at end of file diff --git a/Surge/AdRule.list b/Surge/AdRule.list index 89cf41e2ce..4f404985a6 100644 --- a/Surge/AdRule.list +++ b/Surge/AdRule.list @@ -1,4 +1,17 @@ -# Update > 2019.11.25 Go advertising rule Integration lhie1 and shenji +# Update > 2023/12/23 +DOMAIN-SUFFIX,api-access.pangolin-sdk-toutiao-b.com +DOMAIN-SUFFIX,mcupdate.gstarcad.com +DOMAIN-SUFFIX,adx.open-adx.com +DOMAIN-SUFFIX,adservice.sigmob.cn +DOMAIN-SUFFIX,t7z.cupid.iqiyi.com +DOMAIN-SUFFIX,static-s.iqiyi.com +DOMAIN-SUFFIX,mobile2.da.mgtv.com +DOMAIN-SUFFIX,mobile.da.mgtv.com +DOMAIN-SUFFIX,gwp.xiaojukeji.com +DOMAIN-SUFFIX,ct.xiaojukeji.com +DOMAIN-SUFFIX,news.ssp.qq.com +DOMAIN-SUFFIX,news.l.qq.com +DOMAIN-SUFFIX,unidesk.alicdn.com DOMAIN-SUFFIX,idealads.net DOMAIN-SUFFIX,ironsrc.com DOMAIN-SUFFIX,apoll.m.taobao.com @@ -18,7 +31,6 @@ DOMAIN-SUFFIX,cupid.iqiyi.com DOMAIN-SUFFIX,emoticon.sns.iqiyi.com DOMAIN-SUFFIX,game.pps.tv DOMAIN-SUFFIX,gamecenter.iqiyi.com -DOMAIN-SUFFIX,hotchat-im.iqiyi.com DOMAIN-SUFFIX,mbdlog.iqiyi.com DOMAIN-SUFFIX,msg.iqiyi.com DOMAIN-SUFFIX,msg.video.qiyi.com @@ -90,8 +102,6 @@ DOMAIN-SUFFIX,imgaliyun.res.mgtv.com DOMAIN-SUFFIX,m2.da.mgtv.com DOMAIN-SUFFIX,me.videojj.com DOMAIN-SUFFIX,mobaliyun.res.mgtv.com -DOMAIN-SUFFIX,mobile.da.mgtv.com -DOMAIN-SUFFIX,mobile2.da.mgtv.com DOMAIN-SUFFIX,mp4.res.hunantv.com DOMAIN-SUFFIX,pc.da.mgtv.com DOMAIN-SUFFIX,pc1.da.mgtv.com @@ -137,7 +147,6 @@ DOMAIN-SUFFIX,m-78.jp DOMAIN-SUFFIX,nichibenren.or.jp DOMAIN-SUFFIX,nicorette.co.kr DOMAIN-SUFFIX,adnet.sohu.com -DOMAIN-SUFFIX,data.vod.itc.cn DOMAIN-SUFFIX,epro.sogou.com DOMAIN-SUFFIX,go.sohu.com DOMAIN-SUFFIX,golden1.sogou.com @@ -169,7 +178,6 @@ DOMAIN-SUFFIX,ad.video.51togic.com DOMAIN-SUFFIX,biz5.kankan.com DOMAIN-SUFFIX,c.algovid.com DOMAIN-SUFFIX,cms.laifeng.com -DOMAIN-SUFFIX,da.mmarket.com DOMAIN-SUFFIX,dotcounter.douyutv.com DOMAIN-SUFFIX,g.uusee.com DOMAIN-SUFFIX,gcdn.2mdn.net @@ -1296,7 +1304,6 @@ DOMAIN-SUFFIX,alertserver.ushaqi.com DOMAIN-SUFFIX,alipay.dajiadou6.com DOMAIN-SUFFIX,aliqqjd.cn DOMAIN-SUFFIX,alisinak.com -DOMAIN-SUFFIX,alissl.ucdl.pp.uc.cn DOMAIN-SUFFIX,alistatic.cn DOMAIN-SUFFIX,alitianxia168.com DOMAIN-SUFFIX,alitui.weibo.com @@ -1413,7 +1420,6 @@ DOMAIN-SUFFIX,api-flow.flyme.cn DOMAIN-SUFFIX,api-game.meizu.com DOMAIN-SUFFIX,apihk.growingio.com DOMAIN-SUFFIX,api-push.meizu.com -DOMAIN-SUFFIX,api-shoulei-ssl.xunlei.com DOMAIN-SUFFIX,apisoft.df0535.com DOMAIN-SUFFIX,apk.idate520.com DOMAIN-SUFFIX,apk.supfast.net @@ -2015,7 +2021,6 @@ DOMAIN-SUFFIX,cc.yac8.com DOMAIN-SUFFIX,cca.mob.com DOMAIN-SUFFIX,ccb.uncle-ad.com DOMAIN-SUFFIX,ccbaihehq.com -DOMAIN-SUFFIX,ccclub.cmbchina.com DOMAIN-SUFFIX,cccrir.com DOMAIN-SUFFIX,ccr.yxdown.com DOMAIN-SUFFIX,cctyly.com @@ -2055,7 +2060,6 @@ DOMAIN-SUFFIX,cdn.mdotm.com DOMAIN-SUFFIX,cdn.media.innity.net DOMAIN-SUFFIX,cdn.millennialmedia.com DOMAIN-SUFFIX,cdn.mingmingtehui.com -DOMAIN-SUFFIX,cdn.moji.com DOMAIN-SUFFIX,cdn.moji002.com DOMAIN-SUFFIX,cdn.moogos.com DOMAIN-SUFFIX,cdn.ndapp.com @@ -2187,7 +2191,6 @@ DOMAIN-SUFFIX,clkservice.union.youdao.com DOMAIN-SUFFIX,clkservice.youdao.com DOMAIN-SUFFIX,clkservice2.dict.youdao.com DOMAIN-SUFFIX,cloud.codenow.cn -DOMAIN-SUFFIX,cloud.rovio.com DOMAIN-SUFFIX,cloud.zyiis.net DOMAIN-SUFFIX,cloudad.asia DOMAIN-SUFFIX,cloudcdn.yousee.com @@ -2240,7 +2243,6 @@ DOMAIN-SUFFIX,co.dtech.baofeng.com DOMAIN-SUFFIX,cocounion.com DOMAIN-SUFFIX,cod.southmoney.com DOMAIN-SUFFIX,code.3shangyou.com -DOMAIN-SUFFIX,code.createjs.com DOMAIN-SUFFIX,code.fastclick.net DOMAIN-SUFFIX,code.hajuwang.cn DOMAIN-SUFFIX,code.hot-mob.com @@ -2528,7 +2530,6 @@ DOMAIN-SUFFIX,daima.youbian.com DOMAIN-SUFFIX,daima123.cc DOMAIN-SUFFIX,dairuqi.com DOMAIN-SUFFIX,dajean.com -DOMAIN-SUFFIX,dajiyuan.com DOMAIN-SUFFIX,dajiyuan.org DOMAIN-SUFFIX,dalianhengtai.com DOMAIN-SUFFIX,dandan11.top @@ -3159,8 +3160,6 @@ DOMAIN-SUFFIX,ent1.12584.cn DOMAIN-SUFFIX,entry.baidu.com DOMAIN-SUFFIX,e-p4p.163.com DOMAIN-SUFFIX,epernn.cn -DOMAIN-SUFFIX,epochtimes.org -DOMAIN-SUFFIX,epochweekly.com DOMAIN-SUFFIX,epowernetworktrackerimages.s3.amazonaws.com DOMAIN-SUFFIX,er.dlhygj.com DOMAIN-SUFFIX,erebor.douban.com @@ -3302,7 +3301,6 @@ DOMAIN-SUFFIX,fge9vbrzwt.bid DOMAIN-SUFFIX,fghm.ga25.com DOMAIN-SUFFIX,fghmc.ga25.com DOMAIN-SUFFIX,fghmimg.ga25.com -DOMAIN-SUFFIX,fgmtv.org DOMAIN-SUFFIX,file.bmob.cn DOMAIN-SUFFIX,files2.sogou.com DOMAIN-SUFFIX,fimserve.ign.com @@ -3766,7 +3764,6 @@ DOMAIN-SUFFIX,huimee.net DOMAIN-SUFFIX,huishenghuiying.com DOMAIN-SUFFIX,humanding.com DOMAIN-SUFFIX,hunpingou.com -DOMAIN-SUFFIX,huoying666.com DOMAIN-SUFFIX,hv.code.tanwanyx.com DOMAIN-SUFFIX,hw6.com DOMAIN-SUFFIX,hwt.player888.cn @@ -3796,7 +3793,6 @@ DOMAIN-SUFFIX,i.bigmir.net DOMAIN-SUFFIX,i.clkservice.youdao.com DOMAIN-SUFFIX,i.dreamfull.cn DOMAIN-SUFFIX,i.flow.browser.oppomobile.com -DOMAIN-SUFFIX,i.gdt.qq.com DOMAIN-SUFFIX,i.go.sohu.com DOMAIN-SUFFIX,i.haloapps.com DOMAIN-SUFFIX,i.hao61.net @@ -4511,7 +4507,6 @@ DOMAIN-SUFFIX,l.minisplat.cn DOMAIN-SUFFIX,l.mnjkw.cn DOMAIN-SUFFIX,lives.l.qq.com DOMAIN-SUFFIX,livep.l.qq.com -DOMAIN-SUFFIX,news.l.qq.com DOMAIN-SUFFIX,mi.gdt.qq.com DOMAIN-SUFFIX,l.supfast.net DOMAIN-SUFFIX,l.ujian.cc @@ -4566,7 +4561,6 @@ DOMAIN-SUFFIX,liangao.com DOMAIN-SUFFIX,liangziweixg.com DOMAIN-SUFFIX,lib.haotv8.com DOMAIN-SUFFIX,liba.haotv8.com -DOMAIN-SUFFIX,libs.baidu.com DOMAIN-SUFFIX,libs.tvmao.cn DOMAIN-SUFFIX,license.lumion3d.com DOMAIN-SUFFIX,license.lumion3d.net @@ -5091,7 +5085,6 @@ DOMAIN-SUFFIX,maw.wnbfw.com DOMAIN-SUFFIX,maxwebsearch.com DOMAIN-SUFFIX,maysunmedia.com DOMAIN-SUFFIX,mb.hockeybuzz.com -DOMAIN-SUFFIX,mb.yidianzixun.com DOMAIN-SUFFIX,mb.zam.com DOMAIN-SUFFIX,mbai.cn DOMAIN-SUFFIX,mbd.weathercn.com @@ -5831,7 +5824,6 @@ DOMAIN-SUFFIX,promos.fling.com DOMAIN-SUFFIX,promote.biz.weibo.cn DOMAIN-SUFFIX,promote.caixin.com DOMAIN-SUFFIX,promote.pair.com -DOMAIN-SUFFIX,promotion.aliyun.com DOMAIN-SUFFIX,promotion.gomlab.com DOMAIN-SUFFIX,promotions.iasbet.com DOMAIN-SUFFIX,propellerads.com @@ -6130,7 +6122,6 @@ DOMAIN-SUFFIX,rotate.ymtracking.com DOMAIN-SUFFIX,rotator.tradetracker.net DOMAIN-SUFFIX,router.bittorrent.com DOMAIN-SUFFIX,router.gwdang.com -DOMAIN-SUFFIX,rovio-news-app.angrybirdsgame.com DOMAIN-SUFFIX,rp.crasheye.cn DOMAIN-SUFFIX,rp.gwallet.com DOMAIN-SUFFIX,rpaulfrank.com @@ -6382,7 +6373,6 @@ DOMAIN-SUFFIX,searchignited.com DOMAIN-SUFFIX,searchswapper.com DOMAIN-SUFFIX,seavideo-ak.espn.go.com DOMAIN-SUFFIX,sebar.thand.info -DOMAIN-SUFFIX,sec.resource.xiaomi.net DOMAIN-SUFFIX,secpay.wostore.cn DOMAIN-SUFFIX,secretmedia.s3.amazonaws.com DOMAIN-SUFFIX,secure.dsp.com @@ -6443,9 +6433,7 @@ DOMAIN-SUFFIX,shbywsd.cn DOMAIN-SUFFIX,shenghuo.xiaomi.com DOMAIN-SUFFIX,shenleyuni.com DOMAIN-SUFFIX,shenyian.net -DOMAIN-SUFFIX,shenyun.com DOMAIN-SUFFIX,shenyun.org -DOMAIN-SUFFIX,shenyunperformingarts.org DOMAIN-SUFFIX,shglegle.com DOMAIN-SUFFIX,shibeiou.com DOMAIN-SUFFIX,shiftrro.com @@ -6973,8 +6961,6 @@ DOMAIN-SUFFIX,tuanxue360.net DOMAIN-SUFFIX,tui.gtimg.com DOMAIN-SUFFIX,tui1999.com DOMAIN-SUFFIX,tui98.cn -DOMAIN-SUFFIX,tuidang.epochtimes.org -DOMAIN-SUFFIX,tuidang.org DOMAIN-SUFFIX,tuigoo.com DOMAIN-SUFFIX,tuiguang.178.com DOMAIN-SUFFIX,tuiguang.meitu.com @@ -7615,7 +7601,6 @@ DOMAIN-SUFFIX,xingjuhe.com DOMAIN-SUFFIX,xiniuz.com DOMAIN-SUFFIX,xinju.cc DOMAIN-SUFFIX,xinray.com -DOMAIN-SUFFIX,xinsheng.net DOMAIN-SUFFIX,xiongdong.com DOMAIN-SUFFIX,xiuxiu.android.dl.meitu.com DOMAIN-SUFFIX,xiuxiu.mobile.meitudata.com @@ -7893,7 +7878,6 @@ DOMAIN-SUFFIX,zhaoshang8.com DOMAIN-SUFFIX,zh-cn.shenyun.com DOMAIN-SUFFIX,zh-cn.shenyun.org DOMAIN-SUFFIX,zheng.cs12d.com -DOMAIN-SUFFIX,zhengjian.org DOMAIN-SUFFIX,zhichi08.com DOMAIN-SUFFIX,zhidian3g.cn DOMAIN-SUFFIX,zhifenjie.com @@ -7908,7 +7892,6 @@ DOMAIN-SUFFIX,zhtjdl.com DOMAIN-SUFFIX,zhuanfakong.com DOMAIN-SUFFIX,zhuba8.com DOMAIN-SUFFIX,zhudiaosz.com -DOMAIN-SUFFIX,zhuichaguoji.org DOMAIN-SUFFIX,zhushou.2345.com DOMAIN-SUFFIX,zhuuv.maoyumao.net DOMAIN-SUFFIX,zhwnlapi.etouch.cn @@ -7977,10 +7960,6 @@ DOMAIN-SUFFIX,zzy1.quyaoya.com DOMAIN-SUFFIX,zzz7.52896368.com DOMAIN-SUFFIX,zzzzz4.52896368.com DOMAIN-SUFFIX,analytics.query.yahoo.com -DOMAIN-SUFFIX,is.snssdk.com -DOMAIN-KEYWORD,adservice -DOMAIN-KEYWORD,analytics -DOMAIN-KEYWORD,analysis DOMAIN-SUFFIX,42trck.com DOMAIN-SUFFIX,51.la DOMAIN-SUFFIX,adcolony.com @@ -8050,96 +8029,94 @@ DOMAIN-SUFFIX,voicefive.com DOMAIN-SUFFIX,vungle.com DOMAIN-SUFFIX,wedolook.com DOMAIN-SUFFIX,xdrig.com -DOMAIN,abema-adx.ameba.jp -DOMAIN,ad.12306.cn -DOMAIN,ad.51wnl-cq.com -DOMAIN,ad.caiyunapp.com -DOMAIN,ad.huajiao.com -DOMAIN,ad.hzyoka.com -DOMAIN,ad.jiemian.com -DOMAIN,ad.qingting.fm -DOMAIN,ad.wappalyzer.com -DOMAIN,ad-cn.jovcloud.com -DOMAIN,adextra.51wnl-cq.com -DOMAIN,ads.adadapted.com -DOMAIN,ads.daydaycook.com.cn -DOMAIN,ads.weilitoutiao.net -DOMAIN,adsapi.manhuaren.com -DOMAIN,adsdk.dmzj.com -DOMAIN,adserver.pandora.com -DOMAIN,adui.tg.meitu.com -DOMAIN,adv.bandi.so -DOMAIN,goblin.hupu.com -DOMAIN,adx.hupu.com -DOMAIN,adx-api.hupu.com -DOMAIN,adxserver.ad.cmvideo.cn -DOMAIN,app-ad.variflight.com -DOMAIN,applog.mobike.com -DOMAIN,appnext.hs.llnwd.net -DOMAIN,appnext-a.akamaihd.net -DOMAIN,ggs.myzaker.com -DOMAIN,itad.linetv.tw -DOMAIN,ja.chushou.tv -DOMAIN,mads.suning.com -DOMAIN,mobileads.msn.com -DOMAIN,mopnativeadv.037201.com -DOMAIN,nativeadv.dftoutiao.com -DOMAIN,optimus-ads.amap.com -DOMAIN,sugar.zhihu.com -DOMAIN,track.tiara.daum.net -DOMAIN,track.tiara.kakao.com -DOMAIN,trackapp.guahao.cn -DOMAIN,traffic.mogujie.com -DOMAIN,wmlog.meituan.com -DOMAIN,adshow.58.com -DOMAIN,track.58.com -DOMAIN,tracklog.58.com +DOMAIN-SUFFIX,abema-adx.ameba.jp +DOMAIN-SUFFIX,ad.12306.cn +DOMAIN-SUFFIX,ad.51wnl-cq.com +DOMAIN-SUFFIX,ad.caiyunapp.com +DOMAIN-SUFFIX,ad.huajiao.com +DOMAIN-SUFFIX,ad.hzyoka.com +DOMAIN-SUFFIX,ad.jiemian.com +DOMAIN-SUFFIX,ad.qingting.fm +DOMAIN-SUFFIX,ad.wappalyzer.com +DOMAIN-SUFFIX,ad-cn.jovcloud.com +DOMAIN-SUFFIX,adextra.51wnl-cq.com +DOMAIN-SUFFIX,ads.adadapted.com +DOMAIN-SUFFIX,ads.daydaycook.com.cn +DOMAIN-SUFFIX,ads.weilitoutiao.net +DOMAIN-SUFFIX,adsapi.manhuaren.com +DOMAIN-SUFFIX,adsdk.dmzj.com +DOMAIN-SUFFIX,adserver.pandora.com +DOMAIN-SUFFIX,adui.tg.meitu.com +DOMAIN-SUFFIX,adv.bandi.so +DOMAIN-SUFFIX,goblin.hupu.com +DOMAIN-SUFFIX,adx.hupu.com +DOMAIN-SUFFIX,adx-api.hupu.com +DOMAIN-SUFFIX,adxserver.ad.cmvideo.cn +DOMAIN-SUFFIX,app-ad.variflight.com +DOMAIN-SUFFIX,applog.mobike.com +DOMAIN-SUFFIX,appnext.hs.llnwd.net +DOMAIN-SUFFIX,appnext-a.akamaihd.net +DOMAIN-SUFFIX,ggs.myzaker.com +DOMAIN-SUFFIX,itad.linetv.tw +DOMAIN-SUFFIX,ja.chushou.tv +DOMAIN-SUFFIX,mads.suning.com +DOMAIN-SUFFIX,mopnativeadv.037201.com +DOMAIN-SUFFIX,nativeadv.dftoutiao.com +DOMAIN-SUFFIX,optimus-ads.amap.com +DOMAIN-SUFFIX,sugar.zhihu.com +DOMAIN-SUFFIX,track.tiara.daum.net +DOMAIN-SUFFIX,track.tiara.kakao.com +DOMAIN-SUFFIX,trackapp.guahao.cn +DOMAIN-SUFFIX,traffic.mogujie.com +DOMAIN-SUFFIX,wmlog.meituan.com +DOMAIN-SUFFIX,adshow.58.com +DOMAIN-SUFFIX,track.58.com +DOMAIN-SUFFIX,tracklog.58.com DOMAIN-SUFFIX,iadsdk.apple.com DOMAIN-SUFFIX,ads.internal.unity3d.com DOMAIN-SUFFIX,ads.prd.ie.internal.unity3d.com DOMAIN-SUFFIX,unityads.unity3d.com -DOMAIN,acs4baichuan.m.taobao.com -DOMAIN,adash.man.aliyuncs.com -DOMAIN,adashbc.ut.taobao.com -DOMAIN,adash-c.ut.taobao.com -DOMAIN,adashxgc.ut.taobao.com -DOMAIN,adashx4yt.m.taobao.com -DOMAIN,h-adashx.ut.taobao.com -DOMAIN,nbsdk-baichuan.alicdn.com -DOMAIN,tunion-api.m.taobao.com -DOMAIN,adproxy.autohome.com.cn -DOMAIN,rd.autohome.com.cn -DOMAIN,ad.k.21cn.com -DOMAIN,al.autohome.com.cn -DOMAIN,applogapi.autohome.com.cn +DOMAIN-SUFFIX,acs4baichuan.m.taobao.com +DOMAIN-SUFFIX,adash.man.aliyuncs.com +DOMAIN-SUFFIX,adashbc.ut.taobao.com +DOMAIN-SUFFIX,adash-c.ut.taobao.com +DOMAIN-SUFFIX,adashxgc.ut.taobao.com +DOMAIN-SUFFIX,adashx4yt.m.taobao.com +DOMAIN-SUFFIX,h-adashx.ut.taobao.com +DOMAIN-SUFFIX,nbsdk-baichuan.alicdn.com +DOMAIN-SUFFIX,tunion-api.m.taobao.com +DOMAIN-SUFFIX,adproxy.autohome.com.cn +DOMAIN-SUFFIX,rd.autohome.com.cn +DOMAIN-SUFFIX,ad.k.21cn.com +DOMAIN-SUFFIX,al.autohome.com.cn +DOMAIN-SUFFIX,applogapi.autohome.com.cn DOMAIN-SUFFIX,baidustatic.com DOMAIN-SUFFIX,cpro.baidu.com DOMAIN-SUFFIX,pos.baidu.com -DOMAIN,afd.baidu.com -DOMAIN,als.baidu.com -DOMAIN,duclick.baidu.com -DOMAIN,hm.baidu.com -DOMAIN,hmma.baidu.com -DOMAIN,mobads.baidu.com -DOMAIN,mobads-logs.baidu.com -DOMAIN,nsclick.baidu.com -DOMAIN,ad.toutiao.com -DOMAIN,applog.musical.ly -DOMAIN,track.toutiao.com -DOMAIN,xlog.snssdk.com -DOMAIN,xlog-va.byteoversea.com -DOMAIN,adx.yiche.com -DOMAIN,log.ycapp.yiche.com -DOMAIN,advertise.baicizhan.org -DOMAIN,advertise.baicizhan.com -DOMAIN,galaxy.bjcathay.com -DOMAIN,mdrecv.app.cntvwb.cn -DOMAIN,sdapprecv.app.cntvwb.cn -DOMAIN,vdapprecv.app.cntvwb.cn -DOMAIN,admarket.21cn.com -DOMAIN,adshows.21cn.com -DOMAIN,atrace.chelaile.net.cn -DOMAIN,logs.chelaile.net.cn +DOMAIN-SUFFIX,afd.baidu.com +DOMAIN-SUFFIX,als.baidu.com +DOMAIN-SUFFIX,duclick.baidu.com +DOMAIN-SUFFIX,hm.baidu.com +DOMAIN-SUFFIX,hmma.baidu.com +DOMAIN-SUFFIX,mobads.baidu.com +DOMAIN-SUFFIX,mobads-logs.baidu.com +DOMAIN-SUFFIX,nsclick.baidu.com +DOMAIN-SUFFIX,applog.musical.ly +DOMAIN-SUFFIX,track.toutiao.com +DOMAIN-SUFFIX,xlog.snssdk.com +DOMAIN-SUFFIX,xlog-va.byteoversea.com +DOMAIN-SUFFIX,adx.yiche.com +DOMAIN-SUFFIX,log.ycapp.yiche.com +DOMAIN-SUFFIX,advertise.baicizhan.org +DOMAIN-SUFFIX,advertise.baicizhan.com +DOMAIN-SUFFIX,galaxy.bjcathay.com +DOMAIN-SUFFIX,mdrecv.app.cntvwb.cn +DOMAIN-SUFFIX,sdapprecv.app.cntvwb.cn +DOMAIN-SUFFIX,vdapprecv.app.cntvwb.cn +DOMAIN-SUFFIX,admarket.21cn.com +DOMAIN-SUFFIX,adshows.21cn.com +DOMAIN-SUFFIX,atrace.chelaile.net.cn +DOMAIN-SUFFIX,logs.chelaile.net.cn DOMAIN-SUFFIX,doubleclick.net DOMAIN-SUFFIX,googleadservices.com DOMAIN-SUFFIX,googleadsserving.cn @@ -8149,133 +8126,125 @@ DOMAIN-SUFFIX,googletagservices.com DOMAIN-SUFFIX,da.mgtv.com DOMAIN-SUFFIX,da.hunantv.com DOMAIN-SUFFIX,log.hunantv.com -DOMAIN,log.v2.hunantv.com -DOMAIN,v2.log.hunantv.com -DOMAIN,ifacelog.iqiyi.com -DOMAIN,msg.71.am -DOMAIN,t7z.cupid.iqiyi.com +DOMAIN-SUFFIX,log.v2.hunantv.com +DOMAIN-SUFFIX,v2.log.hunantv.com +DOMAIN-SUFFIX,ifacelog.iqiyi.com +DOMAIN-SUFFIX,msg.71.am DOMAIN-SUFFIX,deliver.ifeng.com -DOMAIN,api.newad.ifeng.com -DOMAIN,ifengad.3g.ifeng.com -DOMAIN,adserviceretry.kugou.com -DOMAIN,ads.service.kugou.com -DOMAIN,adsfile.bssdlbig.kugou.com -DOMAIN,log.stat.kugou.com -DOMAIN,log.web.kugou.com -DOMAIN,kgmobilestat.kugou.com -DOMAIN,kgmobilestatbak.kugou.com -DOMAIN,mobilelog.kugou.com -DOMAIN,mobilead.kuwo.cn -DOMAIN,rich.kuwo.cn -DOMAIN,ad-stat.ksosoft.com -DOMAIN,img.auction-ads.wpscdn.cn -DOMAIN,counter.kingsoft.com -DOMAIN,counter.ksosoft.com -DOMAIN,minfo.wps.cn -DOMAIN,mobad.ijinshan.com -DOMAIN,ups.ksmobile.net -DOMAIN,ws.ksmobile.net +DOMAIN-SUFFIX,api.newad.ifeng.com +DOMAIN-SUFFIX,ifengad.3g.ifeng.com +DOMAIN-SUFFIX,adserviceretry.kugou.com +DOMAIN-SUFFIX,ads.service.kugou.com +DOMAIN-SUFFIX,adsfile.bssdlbig.kugou.com +DOMAIN-SUFFIX,log.stat.kugou.com +DOMAIN-SUFFIX,log.web.kugou.com +DOMAIN-SUFFIX,kgmobilestat.kugou.com +DOMAIN-SUFFIX,kgmobilestatbak.kugou.com +DOMAIN-SUFFIX,mobilelog.kugou.com +DOMAIN-SUFFIX,mobilead.kuwo.cn +DOMAIN-SUFFIX,rich.kuwo.cn +DOMAIN-SUFFIX,ad-stat.ksosoft.com +DOMAIN-SUFFIX,img.auction-ads.wpscdn.cn +DOMAIN-SUFFIX,counter.ksosoft.com +DOMAIN-SUFFIX,minfo.wps.cn DOMAIN-SUFFIX,webp2p.letv.com -DOMAIN,ark.letv.com -DOMAIN,emma-414870e223.huodonghezi.com -DOMAIN,g3.letv.com -DOMAIN,n.mark.letv.com +DOMAIN-SUFFIX,ark.letv.com +DOMAIN-SUFFIX,emma-414870e223.huodonghezi.com +DOMAIN-SUFFIX,g3.letv.com +DOMAIN-SUFFIX,n.mark.letv.com DOMAIN-SUFFIX,ad.intl.xiaomi.com DOMAIN-SUFFIX,ad.xiaomi.com DOMAIN-SUFFIX,admob.xiaomi.com DOMAIN-SUFFIX,tracking.miui.com -DOMAIN,adv.sec.intl.miui.com -DOMAIN,adv.sec.miui.com -DOMAIN,data.mistat.xiaomi.com -DOMAIN,tracking.intl.miui.com -DOMAIN,ad.api.moji.com -DOMAIN,adlaunch.moji.com -DOMAIN,ads.mojicdn.com -DOMAIN,v1.log.moji.com -DOMAIN,ad.bn.netease.com -DOMAIN,ad.yixin.im -DOMAIN,admusicpic.music.126.net -DOMAIN,iadmat.nosdn.127.net -DOMAIN,iadmusicmat.music.126.net -DOMAIN,iadmusicmatvideo.music.126.net -DOMAIN,impservice.dictapp.youdao.com -DOMAIN,impservice.youdao.com -DOMAIN,log.yex.youdao.com -DOMAIN,log-yex.youdao.com -DOMAIN,n.3g.163.com -DOMAIN,nex.163.com -DOMAIN,yt-adp.nosdn.127.net -DOMAIN,ads.aplus.pptv.com -DOMAIN,ads.aplusapi.pptv.com -DOMAIN,asimgs.pplive.cn -DOMAIN,de.as.pptv.com -DOMAIN,regist.fotoable.com -DOMAIN,cdn.adapi.fotoable.com -DOMAIN,adnew.wifi8.com -DOMAIN,adfile.wifi8.com -DOMAIN,adimg.vue.weibo.com -DOMAIN,u1.img.mobile.sina.cn -DOMAIN,sax.sina.com.cn -DOMAIN,saxs.sina.com.cn -DOMAIN,saxn.sina.com.cn +DOMAIN-SUFFIX,adv.sec.intl.miui.com +DOMAIN-SUFFIX,adv.sec.miui.com +DOMAIN-SUFFIX,tracking.intl.miui.com +DOMAIN-SUFFIX,ad.api.moji.com +DOMAIN-SUFFIX,adlaunch.moji.com +DOMAIN-SUFFIX,ads.mojicdn.com +DOMAIN-SUFFIX,v1.log.moji.com +DOMAIN-SUFFIX,ad.bn.netease.com +DOMAIN-SUFFIX,ad.yixin.im +DOMAIN-SUFFIX,admusicpic.music.126.net +DOMAIN-SUFFIX,iadmusicmat.music.126.net +DOMAIN-SUFFIX,iadmusicmatvideo.music.126.net +DOMAIN-SUFFIX,impservice.dictapp.youdao.com +DOMAIN-SUFFIX,impservice.youdao.com +DOMAIN-SUFFIX,log.yex.youdao.com +DOMAIN-SUFFIX,log-yex.youdao.com +DOMAIN-SUFFIX,n.3g.163.com +DOMAIN-SUFFIX,nex.163.com +DOMAIN-SUFFIX,yt-adp.nosdn.127.net +DOMAIN-SUFFIX,ads.aplus.pptv.com +DOMAIN-SUFFIX,ads.aplusapi.pptv.com +DOMAIN-SUFFIX,asimgs.pplive.cn +DOMAIN-SUFFIX,de.as.pptv.com +DOMAIN-SUFFIX,regist.fotoable.com +DOMAIN-SUFFIX,cdn.adapi.fotoable.com +DOMAIN-SUFFIX,adnew.wifi8.com +DOMAIN-SUFFIX,adfile.wifi8.com +DOMAIN-SUFFIX,adimg.vue.weibo.com +DOMAIN-SUFFIX,u1.img.mobile.sina.cn +DOMAIN-SUFFIX,sax.sina.com.cn +DOMAIN-SUFFIX,saxs.sina.com.cn +DOMAIN-SUFFIX,saxn.sina.com.cn DOMAIN-SUFFIX,ad.sohu.com DOMAIN-SUFFIX,ads.sohu.com DOMAIN-SUFFIX,aty.sohu.com -DOMAIN,imp.optaim.com -DOMAIN,v2.reachmax.cn -DOMAIN,track.sohu.com -DOMAIN,hui.sohu.com +DOMAIN-SUFFIX,imp.optaim.com +DOMAIN-SUFFIX,v2.reachmax.cn +DOMAIN-SUFFIX,track.sohu.com +DOMAIN-SUFFIX,hui.sohu.com DOMAIN-SUFFIX,bugly.qq.com DOMAIN-SUFFIX,e.qq.com DOMAIN-SUFFIX,gdt.qq.com DOMAIN-SUFFIX,rqd.qq.com -DOMAIN,adsmind.tc.qq.com -DOMAIN,btrace.qq.com -DOMAIN,mtrace.qq.com -DOMAIN,oth.eve.mdt.qq.com -DOMAIN,pgdt.gtimg.cn -DOMAIN,pingma.qq.com -DOMAIN,pingtcss.qq.com -DOMAIN,splashqqlive.gtimg.com -DOMAIN,tajs.qq.com -DOMAIN,wxsnsdy.wxs.qq.com -DOMAIN,wxsnsdythumb.wxs.qq.com -DOMAIN,imgadpai.thepaper.cn -DOMAIN,admonitor.thepaper.cn -DOMAIN,adsp.xunlei.com -DOMAIN,etl.xlmc.sandai.net -DOMAIN,adm.10jqka.com.cn -DOMAIN,stat.10jqka.com.cn -DOMAIN,ad-analysis.pconline.com.cn -DOMAIN,iad0ssl.pcauto.com.cn -DOMAIN,iad0ssl.pconline.com.cn -DOMAIN,imgad0.pcauto.com.cn -DOMAIN,imgad0.pconline.com.cn -DOMAIN,ivy.pchouse.com.cn -DOMAIN,adtrack.ucweb.com -DOMAIN,track.uc.cn -DOMAIN,alog.umeng.com -DOMAIN,alogs.umeng.com -DOMAIN,alog.umengcloud.com -DOMAIN,alogs.umengcloud.com -DOMAIN,ar.umeng.com -DOMAIN,plbslog.umeng.com -DOMAIN,ulogs.umeng.com -DOMAIN,ulogs.umengcloud.com -DOMAIN,a.wkanx.com -DOMAIN,cwx.lianwangtech.com -DOMAIN,c1wx.lianwangtech.com -DOMAIN,ad.ximalaya.com -DOMAIN,adse.ximalaya.com -DOMAIN,adse.wsa.ximalaya.com -DOMAIN,adbehavior.wsa.ximalaya.com -DOMAIN,apm-track.xiaohongshu.com -DOMAIN,t-ads.xiaohongshu.com +DOMAIN-SUFFIX,adsmind.tc.qq.com +DOMAIN-SUFFIX,btrace.qq.com +DOMAIN-SUFFIX,mtrace.qq.com +DOMAIN-SUFFIX,oth.eve.mdt.qq.com +DOMAIN-SUFFIX,pgdt.gtimg.cn +DOMAIN-SUFFIX,pingma.qq.com +DOMAIN-SUFFIX,pingtcss.qq.com +DOMAIN-SUFFIX,splashqqlive.gtimg.com +DOMAIN-SUFFIX,tajs.qq.com +DOMAIN-SUFFIX,wxsnsdy.wxs.qq.com +DOMAIN-SUFFIX,wxsnsdythumb.wxs.qq.com +DOMAIN-SUFFIX,imgadpai.thepaper.cn +DOMAIN-SUFFIX,admonitor.thepaper.cn +DOMAIN-SUFFIX,adsp.xunlei.com +DOMAIN-SUFFIX,etl.xlmc.sandai.net +DOMAIN-SUFFIX,adm.10jqka.com.cn +DOMAIN-SUFFIX,stat.10jqka.com.cn +DOMAIN-SUFFIX,ad-analysis.pconline.com.cn +DOMAIN-SUFFIX,iad0ssl.pcauto.com.cn +DOMAIN-SUFFIX,iad0ssl.pconline.com.cn +DOMAIN-SUFFIX,imgad0.pcauto.com.cn +DOMAIN-SUFFIX,imgad0.pconline.com.cn +DOMAIN-SUFFIX,ivy.pchouse.com.cn +DOMAIN-SUFFIX,adtrack.ucweb.com +DOMAIN-SUFFIX,track.uc.cn +DOMAIN-SUFFIX,alog.umeng.com +DOMAIN-SUFFIX,alogs.umeng.com +DOMAIN-SUFFIX,alog.umengcloud.com +DOMAIN-SUFFIX,alogs.umengcloud.com +DOMAIN-SUFFIX,ar.umeng.com +DOMAIN-SUFFIX,plbslog.umeng.com +DOMAIN-SUFFIX,ulogs.umengcloud.com +DOMAIN-SUFFIX,a.wkanx.com +DOMAIN-SUFFIX,cwx.lianwangtech.com +DOMAIN-SUFFIX,c1wx.lianwangtech.com +DOMAIN-SUFFIX,ad.ximalaya.com +DOMAIN-SUFFIX,adse.ximalaya.com +DOMAIN-SUFFIX,adse.wsa.ximalaya.com +DOMAIN-SUFFIX,adbehavior.wsa.ximalaya.com +DOMAIN-SUFFIX,apm-track.xiaohongshu.com +DOMAIN-SUFFIX,t-ads.xiaohongshu.com DOMAIN-SUFFIX,atm.youku.com -DOMAIN,ad.mobile.youku.com -DOMAIN,iyes.youku.com -DOMAIN,apppv.zol.com.cn -DOMAIN,pvnapp.zol.com.cn +DOMAIN-SUFFIX,ad.mobile.youku.com +DOMAIN-SUFFIX,iyes.youku.com +DOMAIN-SUFFIX,apppv.zol.com.cn +DOMAIN-SUFFIX,pvnapp.zol.com.cn DOMAIN-SUFFIX,17gouwuba.com DOMAIN-SUFFIX,186078.com DOMAIN-SUFFIX,189zj.cn @@ -8382,48 +8351,25 @@ DOMAIN-SUFFIX,zlne800.com DOMAIN-SUFFIX,zunmi.cn DOMAIN-SUFFIX,zzd6.com DOMAIN-SUFFIX,mackeeper.com -DOMAIN,geo2.adobe.com -DOMAIN-KEYWORD,inmobi -DOMAIN-KEYWORD,adsystem -DOMAIN-KEYWORD,appsflyer DOMAIN-SUFFIX,app-measurement.com -DOMAIN-KEYWORD,fenxi -DOMAIN-KEYWORD,uploadMobileData -DOMAIN-KEYWORD,omniture -DOMAIN-SUFFIX,mob.com -DOMAIN,applog.uc.cn -DOMAIN,api.joybj.com -DOMAIN,api.whizzone.com -DOMAIN-KEYWORD,traffic +DOMAIN-SUFFIX,api.joybj.com +DOMAIN-SUFFIX,api.whizzone.com DOMAIN-SUFFIX,mmstat.com -DOMAIN-KEYWORD,umeng -DOMAIN-KEYWORD,track DOMAIN-SUFFIX,4paradigm.com -DOMAIN-KEYWORD,talkingdata DOMAIN-SUFFIX,catch.gift DOMAIN-SUFFIX,pubnative.net -DOMAIN,suggestqueries.google.com -DOMAIN,www.googleadservices.com -DOMAIN,www.google-analytics.com -DOMAIN,fusion.qq.com -DOMAIN,ios.bugly.qq.com -DOMAIN,wup.imtt.qq.com -DOMAIN,iadsdk.apple.com -DOMAIN,simba.m.taobao.com -DOMAIN,tns.simba.taobao.com -DOMAIN,redirect.simba.taobao.com -DOMAIN,click.mz.simba.taobao.com -DOMAIN,click.simba.taobao.com -DOMAIN,click.tz.simba.taobao.com -DOMAIN,dsp.simba.taobao.com -DOMAIN,fav.simba.taobao.com -DOMAIN,m.simba.taobao.com -DOMAIN,mclick.simba.taobao.com -DOMAIN,srd.simba.taobao.com -DOMAIN,stat.simba.taobao.com -DOMAIN,textlink.simba.taobao.com -DOMAIN,m-adash.m.taobao.com -DOMAIN,adashbc.m.taobao.com +DOMAIN-SUFFIX,www.googleadservices.com +DOMAIN-SUFFIX,www.google-analytics.com +DOMAIN-SUFFIX,fusion.qq.com +DOMAIN-SUFFIX,ios.bugly.qq.com +DOMAIN-SUFFIX,wup.imtt.qq.com +DOMAIN-SUFFIX,tns.simba.taobao.com +DOMAIN-SUFFIX,click.mz.simba.taobao.com +DOMAIN-SUFFIX,click.simba.taobao.com +DOMAIN-SUFFIX,click.tz.simba.taobao.com +DOMAIN-SUFFIX,stat.simba.taobao.com +DOMAIN-SUFFIX,m-adash.m.taobao.com +DOMAIN-SUFFIX,adashbc.m.taobao.com DOMAIN-SUFFIX,applovin.com DOMAIN-SUFFIX,applvn.com DOMAIN-SUFFIX,inner-active.mobi @@ -8431,11 +8377,10 @@ DOMAIN-SUFFIX,mdfull.com DOMAIN-SUFFIX,openx.net DOMAIN-SUFFIX,vidoomy.com DOMAIN-SUFFIX,flash.cn -DOMAIN,gs.getui.com -DOMAIN,log.b612kaji.com +DOMAIN-SUFFIX,gs.getui.com +DOMAIN-SUFFIX,log.b612kaji.com DOMAIN-SUFFIX,beacon.qq.com -DOMAIN,pgdt.gtimg.com -DOMAIN,adpai.thepaper.cn +DOMAIN-SUFFIX,pgdt.gtimg.com DOMAIN-SUFFIX,4009997658.com DOMAIN-SUFFIX,abbyychina.com DOMAIN-SUFFIX,bartender.cc @@ -8497,22 +8442,19 @@ DOMAIN-SUFFIX,supersonicads.com DOMAIN-SUFFIX,zu08e.cn DOMAIN-SUFFIX,ad.daum.net DOMAIN-SUFFIX,track.xiachufang.com -DOMAIN,toots-a.akamaihd.net -DOMAIN,optimus-ads.amap.com.w.alikunlun.com -DOMAIN,gorgon.youdao.com -DOMAIN,yt-adp.ws.126.net -DOMAIN,pgdt.ugdtimg.com -DOMAIN,alog.umeng.co -DOMAIN,adsebs.ximalaya.com -DOMAIN,ad.360in.com -DOMAIN,ad.hpplay.cn -DOMAIN,adeng.hpplay.cn -DOMAIN,rp.hpplay.cn -DOMAIN,adbs.ximalaya.com +DOMAIN-SUFFIX,toots-a.akamaihd.net +DOMAIN-SUFFIX,optimus-ads.amap.com.w.alikunlun.com +DOMAIN-SUFFIX,yt-adp.ws.126.net +DOMAIN-SUFFIX,alog.umeng.co +DOMAIN-SUFFIX,adsebs.ximalaya.com +DOMAIN-SUFFIX,ad.360in.com +DOMAIN-SUFFIX,ad.hpplay.cn +DOMAIN-SUFFIX,adeng.hpplay.cn +DOMAIN-SUFFIX,rp.hpplay.cn +DOMAIN-SUFFIX,adbs.ximalaya.com DOMAIN-SUFFIX,appcpi.net DOMAIN-SUFFIX,bulldogcpi.com DOMAIN-SUFFIX,insurads.com -DOMAIN-SUFFIX,juicyads.com IP-CIDR,101.227.97.240/32,no-resolve IP-CIDR,101.227.200.11/32,no-resolve IP-CIDR,101.227.200.28/32,no-resolve diff --git a/Surge/AdRuleRegex.list b/Surge/AdRuleRegex.list deleted file mode 100644 index f01af5f566..0000000000 --- a/Surge/AdRuleRegex.list +++ /dev/null @@ -1,802 +0,0 @@ -# Update 2019.11.11 Go advertising rule Integration lhie1 and shenji -# MitM: ulogs.umeng.com, ulogs.umengcloud.com, alogs.umeng.com, alogs.umeng.co, *.byteoversea.com, *.cnbetacdn.com, *.doubanio.com, 101.201.62.22, 113.105.222.132, 113.96.109.*, 118.178.214.118, 121.14.89.216, 121.9.212.178, 14.21.76.30, 183.232.237.194, 183.232.246.225, 183.60.159.227, 59.37.96.220, 789.kakamobi.cn, aarkissltrial.secure2.footprint.net, activity2.api.ofo.com, adm.10jqka.com.cn, adproxy.autohome.com.cn, afd.baidu.com, api.app.vhall.com, api.fengshows.com, api.k.sohu.com, api.laifeng.com, api.m.mi.com, api.mddcloud.com.cn, api-mifit.huami.com, api-mifit-cn.huami.com, app.10086.cn, app.m.zj.chinamobile.com, app2.autoimg.cn, appsdk.soku.com, atrace.chelaile.net.cn, capi.douyucdn.cn, cdn.kuaidi100.com, classbox2.kechenggezi.com, connect.facebook.net, creatives.ftimg.net, d.1qianbao.com, dapis.mting.info, dl.app.gtja.com, dongfeng.alicdn.com, dsp-impr2.youdao.com, erebor.douban.com, fm.fenqile.com, fuss10.elemecdn.com, g1.163.com, gorgon.youdao.com, hm.xiaomi.com, hui.sohu.com, i1.hoopchina.com.cn, img.zuoyebang.cc, img1.126.net, img1.doubanio.com, img3.doubanio.com, impservice.dictapp.youdao.com, impservice.youdao.com, kano.guahao.cn, lf.snssdk.com, lives.l.qq.com, m.aty.sohu.com, m5.amap.com, ma.ofo.com, mage.if.qidian.com, mapi.appvipshop.com, mbl.56.com, mimg.127.net, mmg.aty.sohu.com, mmgr.gtimg.com, nex.163.com, oimagea4.ydstatic.com, oimagec2.ydstatic.com, p.kuaidi100.com, p1.music.126.net, pic.k.sohu.com, pic1.chelaile.net.cn, pic2.zhimg.com, resource.cmbchina.com, ress.dxpmedia.com, rm.aarki.net, sso.ifanr.com, static.api.m.panda.tv, staticlive.douyucdn.cn, storage.wax.weibo.com, supportda.ofo.com, ups.youku.com, wapwenku.baidu.com, wenku.baidu.com, www.facebook.com, www.ft.com, www.oschina.net, *.applovin.com, *.iydsj.com, *.k.sohu.com, *.kakamobi.cn, *.kingsoft-office-service.com, *.meituan.net, *.musical.ly, *.ofo.com, *.pstatp.com, *.snssdk.com, *.uve.weibo.com, *.ydstatic.com, *.youtube.com, a.apicloud.com, a.qiumibao.com, a.wkanx.com, acs.m.taobao.com, act.vip.iqiyi.com, api.21jingji.com, api.caijingmobile.com, api.chelaile.net.cn, api.daydaycook.com.cn, api.gotokeep.com, api.haohaozhu.cn, api.huomao.com, api.intsig.net, api.izuiyou.com, api.jr.mi.com, api.jxedt.com, api.kkmh.com, api.m.jd.com, api.mgzf.com, api.psy-1.com, api.rr.tv, api.smzdm.com, api.tv.sohu.com, api.wallstreetcn.com, api.xiachufang.com, api.zhihu.com, api.zhuishushenqi.com, api*.tiktokv.com, api5.futunn.com, api-mifit*.huami.com, api-release.wuta-cam.com, app.58.com, app.api.ke.com, app.bilibili.com, api.douban.com, app.mixcapp.com, app.variflight.com, app.wy.guahao.com, app.yinxiang.com, b.zhuishushenqi.com, c.m.163.com, cap.caocaokeji.cn, capi.mwee.cn, cdn.moji.com, channel.beitaichufang.com, clientaccess.10086.cn, client.mail.163.com, cms.daydaycook.com.cn, consumer.fcbox.com, creditcard.ecitic.com, daoyu.sdo.com, dxy.com, e.dangdang.com, easyreadfs.nosdn.127.net, gateway.shouqiev.com, guide-acs.m.taobao.com, gw.alicdn.com, gw-passenger.01zhuanche.com, huichuan.sm.cn, i.ys7.com, iapi.bishijie.com, iface.iqiyi.com, ih2.ireader.com, img01.10101111cdn.com, img*.doubanio.com, img.jiemian.com, interfac*.music.163.com, ios.lantouzi.com, ios.wps.cn, m*.amap.com, m.client.10010.com, m.creditcard.ecitic.com, m.ibuscloud.com, m.yap.yahoo.com, mapi.mafengwo.cn, media.qyer.com, mlife.cmbchina.com, mlife.jf365.boc.cn, mob.mddcloud.com.cn, mobile-api2011.elong.com, mp.weixin.qq.com, mrobot.pcauto.com.cn, mrobot.pconline.com.cn, ms.jr.jd.com, msspjh.emarbox.com, newclient.map.baidu.com, newsso.map.qq.com, nnapp.cloudbae.cn, open.qyer.com, pic1cdn.cmbchina.com, pic*.chelaile.net, portal-xunyou.qingcdn.com, pss.txffp.com, r.inews.qq.com, render.alipay.com, resrelease.wuta-cam.com, richmanapi.jxedt.com, rtbapi.douyucdn.cn, service.4gtv.tv, smkmp.96225.com, slapi.oray.net, snailsleep.net, sp.kaola.com, ssl.kohsocialapp.qq.com, static.vuevideo.net, static1.keepcdn.com, status.boohee.com, support.you.163.com, thor.weidian.com, tiku.zhan.com, weibointl.api.weibo.cn, www.dandanzan.com, www.flyertea.com, www.zhihu.com, www.zybang.com, youtubei.googleapis.com, zhidao.baidu.com, app.stoneread.com, api.mh.163.com, api.bilibili.com, i.weiread.qq.com, googlevideo.com, *.googlevideo.com, github.com, gist.github.com, shimo.im, p.doras.api.vcinema.cn, ios.prod.ftl.netflix.com, p.du.163.com, vsco.co, api.vnision.com, pan.baidu.com, *.applovin.com, i.weread.qq.com, m.poizon.com, ss0.bdstatic.com, s.youtube.com, www.youtube.com, 123.59.31.1, 119.18.193.135, qidian.qpic.cn, a.applovin.com, api.weibo.cn, youtubei.googleapis.com, api-mifit.huami.com, api-163.biliapi.net, mg.meituan.net, s3plus.meituan.net, pan-api.bitqiu.com, *pi.feng.com, 4gimg.map.qq.com, restapi.iyunmai.com, www.bodivis.com.cn, api.feng.com, m.tuniu.com, img.meituan.net, sdkapp.uve.weibo.com, ptmpcap.caocaokeji.cn, creditcardapp.bankcomm.com, newapp.szsmk.com, client.qunar.com, mpcs.suning.com, api2.helper.qq.com, cdnfile1.msstatic.com, res.xiaojukeji.com, cube.elemecdn.com, dimg04.c-ctrip.com, prom.mobile.gome.com.cn, y.gtimg.cn, du.hupucdn.com, dl.app.gtja.com, yxyapi*.drcuiyutao.com, yxyapi2.drcuiyutao.com, api.vistopia.com.cn, capis-clb.didapinche.com, g.cdn.pengpengla.com, api.qbb6.com, mcupdate.gstarcad.com, api.waitwaitpay.com, api.jxedt.com, mi.gdt.qq.com, richmanapi.jxedt.com, nfmovies.com, app-api.smzdm.com -URL-REGEX,^https?:\/\/interface\.music\.163\.com\/eapi\/ad -URL-REGEX,^https?:\/\/iadmusicmat\.music.126.net\/.*jpg$ -URL-REGEX,^https?:\/\/p\.c\.music\.126.net\/.*jpg$ -URL-REGEX,^https?:\/\/www.baidu.com\/?action=static&ms=1&version=css_page_2@0.* -URL-REGEX,^https?:\/\/.+\.googlevideo\.com\/.+&oad -URL-REGEX,^https?:\/\/.+\.googlevideo\.com\/.+ctier -URL-REGEX,^https?:\/\/shimo\.im\/api\/ads\?(.+) -URL-REGEX,^https?:\/\/c\.minisplat\.cn -URL-REGEX,^https?:\/\/c1\.minisplat\.cn -URL-REGEX,^https?:\/\/cache\.changjingyi\.cn -URL-REGEX,^https?:\/\/cache\.gclick\.cn -URL-REGEX,^https?:\/\/m\.coolaiy\.com\/b\.php -URL-REGEX,^https?:\/\/www\.babyye\.com\/b\.php -URL-REGEX,^https?:\/\/www\.gwv7\.com\/b\.php -URL-REGEX,^https?:\/\/www\.likeji\.net\/b\.php -URL-REGEX,^https?:\/\/211\.98\.70\.226:8080\/ -URL-REGEX,^https?:\/\/211\.98\.71\.195:8080\/ -URL-REGEX,^https?:\/\/211\.98\.71\.196:8080\/ -URL-REGEX,^https?:\/\/.+\/hls.cache.p4p\/ -URL-REGEX,^https?:\/\/.+\/music\/common\/upload\/t_splash_info -URL-REGEX,^https?:\/\/.+\/omts.tc.qq.com\/ -URL-REGEX,^https?:\/\/.+\/tips\/fcgi-bin\/fcg_get_advert -URL-REGEX,^https?:\/\/.+\/variety.tc.qq.com\/ -URL-REGEX,^https?:\/\/bla\.gtimg\.com\/qqlive\/\d{6}.+\.png -URL-REGEX,^https?:\/\/imgcache\.qq\.com\/qqlive\/ -URL-REGEX,^https?:\/\/lives\.l\.qq\.com\/livemsg\?sdtfrom= -URL-REGEX,^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qiantu\/upload\/ -URL-REGEX,^https?:\/\/mtteve\.beacon\.qq\.com\/analytics -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/adsBlacklist -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/getBannerAds -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/getFullScreenPic -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/getNewsRemoteConfig -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/getSplash\?apptype=ios&startarticleid=&__qnr= -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/searchHotCatList -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/upLoadLoc -URL-REGEX,^https?:\/\/splashqqlive\.gtimg\.com\/website\/\d{6} -URL-REGEX,^https?:\/\/szextshort\.weixin\.qq\.com\/cgi-bin\/mmoc-bin\/ad\/ -URL-REGEX,^https?:\/\/y\.gtimg\.cn\/music\/common\/upload\/targeted_ads -URL-REGEX,^https?:\/\/api\.weibo\.cn\/2\/statuses\/extend\?gsid= -URL-REGEX,^https?:\/\/edit\.sinaapp\.com\/ua\?t=adv -URL-REGEX,^https?:\/\/free\.sinaimg\.cn\/u1\.img\.mobile\.sina\.cn -URL-REGEX,^https?:\/\/simg\.s\.weibo\.com\/.+_ios\d{2}\.gif -URL-REGEX,^https?:\/\/storage\.wax\.weibo\.com\/\w+\.(png|jpg|mp4) -URL-REGEX,^https?:\/\/u1\.img\.mobile\.sina\.cn\/public\/files\/image\/\d{3}x\d{2,4}.+(png|jpg|mp4) -URL-REGEX,^https?:\/\/(iyes|(api|hd)\.mobile)\.youku\.com\/(adv|common\/v3\/hudong\/new) -URL-REGEX,^https?:\/\/.+\.mp4\?ccode=0902 -URL-REGEX,^https?:\/\/.+\.mp4\?sid= -URL-REGEX,^https?:\/\/ad\.api\.3g\.youku\.com -URL-REGEX,^https?:\/\/api\.appsdk\.soku\.com\/bg\/r -URL-REGEX,^https?:\/\/api\.appsdk\.soku\.com\/tag\/r -URL-REGEX,^https?:\/\/api\.k\.sohu\.com\/api\/channel\/ad\/ -URL-REGEX,^https?:\/\/api\.mobile\.youku\.com\/layout\/search\/hot\/word -URL-REGEX,^https?:\/\/m\.youku\.com\/video\/libs\/iwt\.js -URL-REGEX,^https?:\/\/pic\.k\.sohu\.com\/img8\/wb\/tj\/ -URL-REGEX,^https?:\/\/r\.l\.youku\.com\/rec_at_click -URL-REGEX,^https?:\/\/r1\.ykimg\.com\/\w{30,35}\.jpg -URL-REGEX,^https?:\/\/r1\.ykimg\.com\/material\/.+\/\d{3,4}-\d{4} -URL-REGEX,^https?:\/\/r1\.ykimg\.com\/material\/.+\/\d{6}\/\d{4}\/ -URL-REGEX,^https?:\/\/vali\.cp31\.ott\.cibntv\.net\/youku -URL-REGEX,^https?:\/\/api\.zhuishushenqi\.com\/advert -URL-REGEX,^https?:\/\/api\.zhuishushenqi\.com\/notification\/shelfMessage -URL-REGEX,^https?:\/\/api\.zhuishushenqi\.com\/recommend -URL-REGEX,^https?:\/\/api\.zhuishushenqi\.com\/splashes\/ios -URL-REGEX,^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview\.fcg -URL-REGEX,^https?:\/\/api\.zhuishushenqi\.com\/user\/bookshelf-updated -URL-REGEX,^https?:\/\/itunes\.apple\.com\/lookup\?id=575826903 -URL-REGEX,^https?:\/\/.+\/cdn\/qiyiapp\/\d{8}\/.+&dis_dz= -URL-REGEX,^https?:\/\/.+\/cdn\/qiyiapp\/\d{8}\/.+&z=\w -URL-REGEX,^https?:\/\/.+\/videos\/other\/ -URL-REGEX,^https?:\/\/iface2\.iqiyi\.com\/fusion\/3\.0\/fusion_switch -URL-REGEX,^https?:\/\/agn\.aty\.sohu\.com\/m? -URL-REGEX,^https?:\/\/api\.k\.sohu\.com\/api\/news\/adsense -URL-REGEX,^https?:\/\/hui\.sohu\.com\/predownload2\/? -URL-REGEX,^https?:\/\/m\.aty\.sohu\.com\/openload? -URL-REGEX,^https?:\/\/mbl\.56\.com\/config\/v1\/common\/config\.union\.ios\.do? -URL-REGEX,^https?:\/\/mmg\.aty\.sohu\.com\/mqs? -URL-REGEX,^https?:\/\/mmg\.aty\.sohu\.com\/pvlog? -URL-REGEX,^https?:\/\/photocdn\.sohu\.com\/tvmobilemvms -URL-REGEX,^https?:\/\/s\.go\.sohu\.com\/adgtr\/\?gbcode=(ps|sv|offnavi|newvector|ulog\.imap|newloc)(\.map)?\.(baidu|n\.shifen)\.com -URL-REGEX,^https?:\/\/afd\.baidu\.com\/afd\/entry -URL-REGEX,^https?:\/\/als\.baidu\.com\/clog\/clog -URL-REGEX,^https?:\/\/baichuan\.baidu\.com\/rs\/adpmobile\/launch -URL-REGEX,^https?:\/\/bj\.bcebos\.com\/fc-feed\/0\/pic\/ -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/\w+\/\w+\/(sync|newRnSync|newlog|mlog) -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/c\/p\/img\?src= -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/logtogether\?cmd= -URL-REGEX,^https?:\/\/fcvbjbcebos\.baidu\.com\/.+\.mp4 -URL-REGEX,^https?:\/\/gss0\.bdstatic\.com\/.+\/static\/wiseindex\/img\/bd_red_packet\.png -URL-REGEX,^https?:\/\/issuecdn\.baidupcs\.com\/issue\/netdisk\/guanggao\/ -URL-REGEX,^https?:\/\/sm\.domobcdn\.com\/ugc\/\w\/ -URL-REGEX,^https?:\/\/tb1\.bdstatic\.com\/tb\/cms\/ngmis\/adsense\/*\.jpg -URL-REGEX,^https?:\/\/tb2\.bdstatic\.com\/tb\/mobile\/spb\/widget\/jump -URL-REGEX,^https?:\/\/update\.pan\.baidu\.com\/statistics -URL-REGEX,^https?:\/\/wapwenku\.baidu\.com\/view\/fengchao\/ -URL-REGEX,^https?:\/\/wapwenku\.baidu\.com\/view\/fengchaoTwojump\/ -URL-REGEX,^https?:\/\/wenku\.baidu\.com\/shifen\/ -URL-REGEX,^https?:\/\/ad\.api\.moji\.com\/ad\/log\/stat -URL-REGEX,^https?:\/\/ast\.api\.moji\.com\/assist\/ad\/moji\/stat -URL-REGEX,^https?:\/\/cdn\.moji\.com\/adlink\/avatarcard -URL-REGEX,^https?:\/\/cdn\.moji\.com\/adlink\/common -URL-REGEX,^https?:\/\/cdn\.moji\.com\/adlink\/splash\/ -URL-REGEX,^https?:\/\/cdn\.moji\.com\/advert\/ -URL-REGEX,^https?:\/\/cdn2\.moji002\.com\/webpush\/ad2\/ -URL-REGEX,^https?:\/\/fds\.api\.moji\.com\/card\/recommend -URL-REGEX,^https?:\/\/show\.api\.moji\.com\/json\/showcase\/getAll -URL-REGEX,^https?:\/\/stat\.moji\.com -URL-REGEX,^https?:\/\/storage\.360buyimg\.com\/kepler-app -URL-REGEX,^https?:\/\/ugc\.moji001\.com\/sns\/json\/profile\/get_unread -URL-REGEX,^https?:\/\/api\.m\.mi\.com\/v1\/app\/start -URL-REGEX,^https?:\/\/api\.jr\.mi\.com\/v1\/adv\/ -URL-REGEX,^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.+\/\d{13}\.jpg -URL-REGEX,^https?:\/\/m\.client\.10010\.com\/mobileService\/(activity|customer)\/(accountListData|get_client_adv|get_startadv) -URL-REGEX,^https?:\/\/m\.client\.10010\.com\/uniAdmsInterface\/(getHomePageAd|getWelcomeAd) -URL-REGEX,^https?:\/\/m1\.ad\.10010\.com\/noticeMag\/images\/imageUpload\/2\d{3} -URL-REGEX,^https?:\/\/res\.mall\.10010\.cn\/mall\/common\/js\/fa\.js?referer= -URL-REGEX,^https?:\/\/api\.newad\.ifeng\.com\/ClientAdversApi1508\?adids= -URL-REGEX,^https?:\/\/c1\.ifengimg\.com\/.+_w1080_h1410\.jpg -URL-REGEX,^https?:\/\/exp\.3g\.ifeng\.com\/coverAdversApi\?gv=\. -URL-REGEX,^https?:\/\/ifengad\.3g\.ifeng\.com\/ad\/pv\.php\?stat= -URL-REGEX,^https?:\/\/iis1\.deliver\.ifeng\.com\/getmcode\?adid= -URL-REGEX,^https?:\/\/.+\/eapi\/[ad|event]\/ -URL-REGEX,^https?:\/\/.+\.127\.net\/ad -URL-REGEX,^https?:\/\/.+\/eapi\/(ad|log)\/ -URL-REGEX,^https?:\/\/.+\/eapi\/ad\/ -URL-REGEX,^https?:\/\/c\.m\.163\.com\/nc\/gl\/ -URL-REGEX,^https?:\/\/client\.mail\.163\.com\/apptrack\/confinfo\/searchMultiAds -URL-REGEX,^https?:\/\/g1\.163\.com\/madfeedback -URL-REGEX,^https?:\/\/img1\.126\.net\/.+dpi=\w{7,8} -URL-REGEX,^https?:\/\/img1\.126\.net\/channel14\/ -URL-REGEX,^https?:\/\/mimg\.127\.net\/external\/smartpop-manger\.min\.js -URL-REGEX,^https?:\/\/nex\.163\.com\/q -URL-REGEX,^https?:\/\/oimage([a-z])([0-9])\.ydstatic\.com\/.+?&product=adpublish -URL-REGEX,^https?:\/\/p[^4](c)?\.music\.126\.net\/\w+==\/10995\d{13}\.jpg$ -URL-REGEX,^https?:\/\/dsp-impr2\.youdao\.com\/adload.s\? -URL-REGEX,^https?:\/\/interface\.music\.163\.com\/eapi\/ad\/ -URL-REGEX,^https?:\/\/.+\/client?functionId=lauch\/lauchConfig&appName=paidaojia -URL-REGEX,^https?:\/\/111\.13\.29\.201\/client\.action\?functionId=start -URL-REGEX,^https?:\/\/api\.m\.jd\.com\/client\.action\?functionId=start -URL-REGEX,^https?:\/\/bdsp-x\.jd\.com\/adx\/ -URL-REGEX,^https?:\/\/m\.360buyimg\.com\/mobilecms\/s640x1136_jfs\/ -URL-REGEX,^https?:\/\/ms\.jr\.jd\.com\/gw\/generic\/base\/na\/m\/adInfo -URL-REGEX,^https?:\/\/gw\.alicdn\.com\/tfs\/.+-1125-1602 -URL-REGEX,^https?:\/\/(\d{1,3}\.){1,3}\d{1,3}\/view\/dale-online\/dale_ad\/ -URL-REGEX,^https?:\/\/api\.douban\.com\/v2\/app_ads\/common_ads -URL-REGEX,^https?:\/\/img\d\.doubanio\.com\/view\/dale-online\/dale_ad\/ -URL-REGEX,^https?:\/\/capi\.douyucdn\.cn\/lapi\/sign\/app(api)?\/getinfo\?client_sys=ios -URL-REGEX,^https?:\/\/capi\.douyucdn\.cn\/api\/ios_app\/check_update -URL-REGEX,^https?:\/\/capi\.douyucdn\.cn\/api\/v1\/getStartSend?client_sys=ios -URL-REGEX,^https?:\/\/douyucdn\.cn\/.+\/appapi\/getinfo -URL-REGEX,^https?:\/\/rtbapi.douyucdn.cn\/japi\/sign\/app\/getinfo -URL-REGEX,^https?:\/\/staticlive\.douyucdn\.cn\/.+\/getStartSend -URL-REGEX,^https?:\/\/staticlive\.douyucdn\.cn\/upload\/signs\/ -URL-REGEX,^https?:\/\/elemecdn\.com\/.+\/sitemap -URL-REGEX,^https?:\/\/fuss10\.elemecdn\.com\/.+\/w\/640\/h\/\d{3,4} -URL-REGEX,^https?:\/\/fuss10\.elemecdn\.com\/.+\/w\/750\/h\/\d{3,4} -URL-REGEX,^https?:\/\/fuss10\.elemecdn\.com\/.+\.mp4 -URL-REGEX,^https?:\/\/m\.elecfans\.com\/static\/js\/ad\.js -URL-REGEX,^https?:\/\/www1\.elecfans\.com\/www\/delivery\/ -URL-REGEX,^https?:\/\/p\d\.pstatp\.com\/origin -URL-REGEX,^https?:\/\/pb\d\.pstatp\.com\/origin -URL-REGEX,^https?:\/\/gw\.alicdn\.com\/mt\/ -URL-REGEX,^https?:\/\/gw\.alicdn\.com\/tfs\/.+\d{3,4}-\d{4} -URL-REGEX,^https?:\/\/gw\.alicdn\.com\/tps\/.+\d{3,4}-\d{4} -URL-REGEX,^https?:\/\/adse.+\.com\/[a-z]{4}\/loading\?appid= -URL-REGEX,^https?:\/\/adse\.ximalaya\.com\/ting\/feed\?appid= -URL-REGEX,^https?:\/\/adse\.ximalaya\.com\/ting\/loading\?appid= -URL-REGEX,^https?:\/\/adse\.ximalaya\.com\/ting\?appid= -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group21\/M03\/E7\/3F\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group21\/M0A\/95\/3B\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group22\/M00\/92\/FF\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group22\/M05\/66\/67\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group22\/M07\/76\/54\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group23\/M01\/63\/F1\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group23\/M04\/E5\/F6\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group23\/M07\/81\/F6\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group23\/M0A\/75\/AA\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group24\/M03\/E6\/09\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group24\/M07\/C4\/3D\/ -URL-REGEX,^https?:\/\/fdfs\.xmcdn\.com\/group25\/M05\/92\/D1\/ -URL-REGEX,^https?:\/\/book\.img\.ireader\.com\/group6\/M00 -URL-REGEX,^https?:\/\/api\.ycapp\.yiche\.com\/appnews\/getadlist -URL-REGEX,^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getadlist -URL-REGEX,^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getappads\/ -URL-REGEX,^https?:\/\/cheyouapi\.ycapp\.yiche\.com\/appforum\/getusermessagecount -URL-REGEX,^https?:\/\/.+\.googlevideo\.com\/ptracking\?pltype=adhost -URL-REGEX,^https?:\/\/.+\.youtube\.com\/api\/stats\/.+adformat -URL-REGEX,^https?:\/\/.+\.youtube\.com\/api\/stats\/ads -URL-REGEX,^https?:\/\/.+\.youtube\.com\/get_midroll -URL-REGEX,^https?:\/\/.+\.youtube\.com\/pagead\/ -URL-REGEX,^https?:\/\/.+\.youtube\.com\/ptracking\? -URL-REGEX,^https?:\/\/m\.youtube\.com\/_get_ads -URL-REGEX,^https?:\/\/pagead2\.googlesyndication\.com\/pagead\/ -URL-REGEX,^https?:\/\/premiumyva\.appspot\.com\/vmclickstoadvertisersite -URL-REGEX,^https?:\/\/s\.youtube\.com\/api\/stats\/watchtime?adformat -URL-REGEX,^https?:\/\/s0\.2mdn\.net\/ads\/ -URL-REGEX,^https?:\/\/stats\.tubemogul\.com\/stats\/ -URL-REGEX,^https?:\/\/youtubei\.googleapis\.com/.+ad_break -URL-REGEX,^https?:\/\/.+0013.+\/upload\/activity\/app_flash_screen_ -URL-REGEX,^https?:\/\/www\.tsytv\.com\.cn\/api\/app\/ios\/ads -URL-REGEX,^https?:\/\/res\.kfc\.com\.cn\/advertisement\/ -URL-REGEX,^https?:\/\/img\.yun\.01zhuanche\.com\/statics\/app\/advertisement\/.+-750-1334 -URL-REGEX,^https?:\/\/img01\.10101111cdn\.com\/adpos\/share\/ -URL-REGEX,^https?:\/\/bank\.wo\.cn\/v9\/getstartpage -URL-REGEX,^https?:\/\/img\.ihytv\.com\/material\/adv\/img\/ -URL-REGEX,^https?:\/\/img\.meituan\.net\/midas\/ -URL-REGEX,^https?:\/\/p\d\.meituan\.net\/(mmc|wmbanner)\/ -URL-REGEX,^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qqpim\/public\/ios\/splash\/.+\/\d{4}_\d{4} -URL-REGEX,^https?:\/\/img\.jiemian\.com\/ads\/ -URL-REGEX,^https?:\/\/adproxy\.autohome\.com\.cn\/AdvertiseService\/ -URL-REGEX,^https?:\/\/app2\.autoimg\.cn\/appdfs\/ -URL-REGEX,^https?:\/\/mage\.if\.qidian\.com\/Atom\.axd\/Api\/Client\/GetConfIOS -URL-REGEX,^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+\/670x900 -URL-REGEX,^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+\/750x1064 -URL-REGEX,^https?:\/\/mapi\.dangdang\.com\/index\.php\?action=init&user_client=iphone -URL-REGEX,^https?:\/\/dl\.app\.gtja\.com\/dzswem\/kvController\/ -URL-REGEX,^https?:\/\/dl\.app\.gtja\.com\/operation\/config\/startupConfig\.json -URL-REGEX,^https?:\/\/api\.laifeng\.com\/v1\/start\/ads -URL-REGEX,^https?:\/\/.+\.pstatp\.com\/img\/ad -URL-REGEX,^https?:\/\/.+\.snssdk\.com\/api\/ad\/ -URL-REGEX,^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/aweme\/stats\/ -URL-REGEX,^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/device\/update\/ -URL-REGEX,^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/screen\/ad\/ -URL-REGEX,^https?:\/\/aweme\.snssdk\.com\/service\/1\/app_logout\/ -URL-REGEX,^https?:\/\/aweme\.snssdk\.com\/service\/2\/app_log -URL-REGEX,^https?:\/\/frontier\.snssdk\.com\/ -URL-REGEX,^https?:\/\/sf\w-ttcdn-tos\.pstatp\.com\/obj\/web\.business\.image -URL-REGEX,^https?:\/\/api\.xiachufang\.com\/v2\/ad\/ -URL-REGEX,^https?:\/\/connect\.facebook\.net\/en_US\/fbadnw\.js -URL-REGEX,^https?:\/\/qzonestyle\.gtimg\.cn\/qzone\/biz\/gdt\/mob\/sdk\/ios\/v2\/ -URL-REGEX,^https?:\/\/cdn\.kuaidi100\.com\/images\/open\/appads -URL-REGEX,^https?:\/\/p\.kuaidi100\.com\/mobile\/mainapi\.do -URL-REGEX,^https?:\/\/api\.m\.mi\.com\/.+\/app\/start -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/homepage_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sleep_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_summary_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_training_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/step_detail_ad\? -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/training_video_ad\? -URL-REGEX,^https?:\/\/.+\/portal\.php\?a=get_ads -URL-REGEX,^https?:\/\/.+\/portal\.php\?c=duiba -URL-REGEX,^https?:\/\/.+\/portal\.php\?a=get_coopen_ads -URL-REGEX,^https?:\/\/weicoapi\.weico\.cc\/img\/ad\/ -URL-REGEX,^https?:\/\/.+\/weico4ad\/ad\/ -URL-REGEX,^https?:\/\/g\.cdn\.pengpengla\.com\/starfantuan\/boot-screen-info\/ -URL-REGEX,^https?:\/\/discuz\.gtimg\.cn\/cloud\/scripts\/discuz_tips\.js -URL-REGEX,^https?:\/\/sapi\.guopan\.cn\/get_buildin_ad -URL-REGEX,^https?:\/\/789\.kakamobi\.cn\/.+adver -URL-REGEX,^https?:\/\/smart\.789\.image\.mucang\.cn\/advert -URL-REGEX,^https?:\/\/pic1cdn\.cmbchina\.com\/appinitads\/ -URL-REGEX,^https?:\/\/mlife\.cmbchina\.com\/ClientFace(Service)?\/getAdvertisement\.json -URL-REGEX,^https?:\/\/mlife\.cmbchina\.com\/ClientFace(Service)?\/preCacheAdvertise\.json -URL-REGEX,^https?:\/\/resource\.cmbchina\.com\/fsp\/File\/ClientFacePublic\/.+\.gif -URL-REGEX,^https?:\/\/bbs\.airav\.cc\/data\/.+\.jpg -URL-REGEX,^https?:\/\/image\.airav\.cc\/AirADPic\/.+\.gif -URL-REGEX,^https?:\/\/m\.airav\.cc\/images\/Mobile_popout_cn\.gif -URL-REGEX,^https?:\/\/cmsapi\.wifi8\.com\/v1\/emptyAd\/info -URL-REGEX,^https?:\/\/cmsapi\.wifi8\.com\/v2\/adNew\/config -URL-REGEX,^https?:\/\/cmsfile\.wifi8\.com\/uploads\/png\/ -URL-REGEX,^https?:\/\/sso\.ifanr\.com\/jiong\/IOS\/appso\/splash\/ -URL-REGEX,^https?:\/\/oimage\w\d\.ydstatic\.com\/image\?.+=adpublish -URL-REGEX,^https?:\/\/118\.178\.214\.118\/yyting\/advertclient\/ClientAdvertList\.action -URL-REGEX,^https?:\/\/dapis\.mting\.info\/yyting\/advertclient\/ClientAdvertList\.action -URL-REGEX,^https?:\/\/192\.133.+\.mp4$ -URL-REGEX,^https?:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore -URL-REGEX,^https?:\/\/api\.app\.vhall\.com\/v5\/000\/webinar\/launch -URL-REGEX,^https?:\/\/img\.53site\.com\/Werewolf\/AD\/ -URL-REGEX,^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+\/getAdvertise\.php -URL-REGEX,^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+\/getShareVideodb\.php -URL-REGEX,^https?:\/\/a\.applovin\.com\/.+\/ad -URL-REGEX,^https?:\/\/app\.wy\.guahao\.com\/json\/white\/dayquestion\/getpopad -URL-REGEX,^https?:\/\/kano\.guahao\.cn\/.+\?resize=\d{3}-\d{4} -URL-REGEX,^https?:\/\/api\.chelaile\.net\.cn\/adpub\/ -URL-REGEX,^https?:\/\/api\.chelaile\.net\.cn\/goocity\/advert\/ -URL-REGEX,^https?:\/\/atrace\.chelaile\.net\.cn\/adpub\/ -URL-REGEX,^https?:\/\/atrace\.chelaile\.net\.cn\/exhibit\?&adv_image -URL-REGEX,^https?:\/\/pic1\.chelaile\.net\.cn\/adv\/ -URL-REGEX,^https?:\/\/images\.91160\.com\/primary\/ -URL-REGEX,^https?:\/\/d\.1qianbao\.com\/youqian\/ads\/ -URL-REGEX,^https?:\/\/api\.huomao\.com\/channels\/loginAd -URL-REGEX,^https?:\/\/api\.kkmh\.com\/v\d\/(ad|advertisement)\/ -URL-REGEX,^https?:\/\/i1\.hoopchina\.com\.cn\/blogfile\/.+_\d{3}x\d{4} -URL-REGEX,^https?:\/\/.+\/letv-gug\/ -URL-REGEX,^https?:\/\/pcvideoyd\.titan\.mgtv\.com\/pb\/ -URL-REGEX,^https?:\/\/classbox2\.kechenggezi\.com\/api\/v1\/sponge\/pull\?request_time= -URL-REGEX,^https?:\/\/e\.dangdang\.com\/media\/api.+\?action=getDeviceStartPage -URL-REGEX,^https?:\/\/api\.smzdm\.com\/v1\/util\/loading -URL-REGEX,^https?:\/\/api\.smzdm\.com\/v2\/util\/banner -URL-REGEX,^https?:\/\/app\.veryzhun\.com\/ad\/admob -URL-REGEX,^https?:\/\/api\.fengshows\.com\/api\/launchAD -URL-REGEX,^https?:\/\/img\.rr\.tv\/banner\/.+\.jpg -URL-REGEX,^https?:\/\/ctrl\.zmzapi\.net\/app\/ads -URL-REGEX,^https?:\/\/ctrl\.zmzapi\.net\/app\/init -URL-REGEX,^https?:\/\/api\.laosiji\.com\/user\/startpage\/ -URL-REGEX,^https?:\/\/adm\.10jqka\.com\.cn\/interface\/getads\.php -URL-REGEX,^https?:\/\/smkmp\.96225\.com\/smkcenter\/ad\/.+\/adBanner -URL-REGEX,^https?:\/\/m\.ibuscloud.com\/v2\/app\/getStartPage -URL-REGEX,^https?:\/\/api\.mddcloud\.com\.cn\/api\/ad\/getClassAd\.action -URL-REGEX,^https?:\/\/api\.mddcloud\.com\.cn\/api\/advert\/getHomepage\.action -URL-REGEX,^https?:\/\/daoyu\.sdo\.com\/api\/userCommon\/getAppStartAd -URL-REGEX,^https?:\/\/api\.gotokeep\.com\/ads -URL-REGEX,^https?:\/\/static1\.keepcdn\.com\/.+\d{3}x\d{4} -URL-REGEX,^https?:\/\/aarkissltrial\.secure2\.footprint\.net\/v1\/ads -URL-REGEX,^https?:\/\/rm\.aarki\.net\/v1\/ads -URL-REGEX,^https?:\/\/182\.92\.244\.70\/d\/json\/ -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.trip\.activity\.querytmsresources\/1\.0\?type=originaljson -URL-REGEX,^https?:\/\/.+\/videos\/KnifeHit_4\/gear3\/ -URL-REGEX,^https?:\/\/images\.kartor\.cn\/.+\.html -URL-REGEX,^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/appspace-client\/cr\/sys\/popAdv -URL-REGEX,^https?:\/\/app3\.qdaily\.com\/app3\/boot_advertisements\.json -URL-REGEX,^https?:\/\/fm\.fenqile\.com\/routev2\/other\/getfloatAd\.json -URL-REGEX,^https?:\/\/fm\.fenqile\.com\/routev2\/other\/startImg\.json -URL-REGEX,^https?:\/\/.+\/vips-mobile\/router\.do\?api_key= -URL-REGEX,^https?:\/\/consumer\.fcbox\.com\/v1\/ad\/OpeningAdInfo\/ -URL-REGEX,^https?:\/\/api\.feng\.com[\s\S]*?Claunch_screen -URL-REGEX,^https?:\/\/fengplus\.feng\.com\/index\.php\?r=api\/slide\/.+Ads -URL-REGEX,^https?:\/\/.+\/img\/ad\.union\.api\/ -URL-REGEX,^https?:\/\/.+\/v1\/iflyad\/ -URL-REGEX,^https?:\/\/ggic\.cmvideo\.cn\/ad\/ -URL-REGEX,^https?:\/\/ggic2\.cmvideo\.cn\/ad\/ -URL-REGEX,^https?:\/\/ggv\.cmvideo\.cn\/v1\/iflyad\/ -URL-REGEX,^https?:\/\/agent-count\.pconline\.com\.cn\/counter\/adAnalyse\/ -URL-REGEX,^https?:\/\/ivy\.pchouse\.com\.cn\/adpuba\/ -URL-REGEX,^https?:\/\/www\.oschina\.net\/action\/apiv2\/get_launcher -URL-REGEX,^https?:\/\/activity2\.api\.ofo\.com\/ofo\/Api\/v2\/ads -URL-REGEX,^https?:\/\/ma\.ofo\.com\/ads -URL-REGEX,^https?:\/\/supportda\.ofo\.com\/adaction\? -URL-REGEX,^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/ADLog -URL-REGEX,^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/GetAD -URL-REGEX,^https?:\/\/gw\.aihuishou\.com\/app-portal\/home\/getadvertisement -URL-REGEX,^https?:\/\/app\.58\.com\/api\/log\/ -URL-REGEX,^https?:\/\/www\.duokan\.com/pictures? -URL-REGEX,^https?:\/\/www\.duokan\.com/promotion_day -URL-REGEX,^https?:\/\/api\d?\.tiktokv\.com\/api\/ad\/ -URL-REGEX,^https?:\/\/api\d?\.musical\.ly\/api\/ad\/ -URL-REGEX,^https?:\/\/mangaapi\.manhuaren\.com\/v1\/public\/getStartPageAds -URL-REGEX,^https?:\/\/b-api\.ins\.miaopai\.com\/1\/ad/ -URL-REGEX,^https?:\/\/api5\.futunn\.com\/ad\/ -URL-REGEX,^https?:\/\/images\.client\.vip\.xunlei\.com\/.+\/advert\/ -URL-REGEX,^https?:\/\/tqt\.weibo\.cn\/.+advert\.index -URL-REGEX,^https?:\/\/tqt\.weibo\.cn\/overall\/redirect\.php\?r=tqt_sdkad -URL-REGEX,^https?:\/\/tqt\.weibo\.cn\/overall\/redirect\.php\?r=tqtad -URL-REGEX,^https?:\/\/.+\.iydsj\.com\/api\/.+\/ad -URL-REGEX,^https?:\/\/cdn\.tiku\.zhan\.com\/banner -URL-REGEX,^https?:\/\/capi\.mwee\.cn/app-api/V12/app/getstartad -URL-REGEX,^https?:\/\/aes\.acfun\.cn\/s\?adzones -URL-REGEX,^https?:\/\/api\.catch\.gift\/api\/v3\/pagead\/ -URL-REGEX,^https?:\/\/imeclient\.openspeech\.cn\/adservice\/ -URL-REGEX,^https?:\/\/m\.yap\.yahoo\.com\/v18\/getAds\.do -URL-REGEX,^https?:\/\/www\.myhug\.cn\/ad\/ -URL-REGEX,^https?:\/\/.+\/api\/app\/member\/ver2\/user\/login\/ -URL-REGEX,^https?:\/\/a\.qiumibao\.com\/activities\/config\.php -URL-REGEX,^https?:\/\/.+\/allOne\.php\?ad_name -URL-REGEX,^https?:\/\/open\.qyer\.com\/qyer\/startpage\/ -URL-REGEX,^https?:\/\/open\.qyer.com\/qyer\/config\/get -URL-REGEX,^https?:\/\/media\.qyer\.com\/ad\/ -URL-REGEX,^https?:\/\/api\.qiuduoduo\.cn\/guideimage -URL-REGEX,^https?:\/\/i\.ys7\.com\/api\/ads -URL-REGEX,^https?:\/\/api\.gaoqingdianshi\.com\/api\/v2\/ad -URL-REGEX,^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\\/\/d+\\/\/d+\/BbsImg\.(?<=(big.(png|jpg)))$ -URL-REGEX,^https?:\/\/games\.mobileapi\.hupu\.com\/.+\/(search|interfaceAdMonitor|status|hupuBbsPm)/(hotkey|init|hupuBbsPm)\. -URL-REGEX,^https?:\/\/games\.mobileapi\.hupu\.com\/interfaceAdMonitor -URL-REGEX,^https?:\/\/m5\.amap\.com\/ws\/valueadded\/ -URL-REGEX,^https?:\/\/pic\.xiami\.net\/images\/common\/uploadpic[\s\S]*?\.jpg$ -URL-REGEX,^https?:\/\/img\.zuoyebang\.cc\/zyb-image[\s\S]*?\.jpg -URL-REGEX,^https?:\/\/.+allOne\.php\?ad_name=main_splash_ios -URL-REGEX,^https?:\/\/.+nga\.cn.+\bhome.+\b=ad -URL-REGEX,^https?:\/\/.+resource=article\/recommend\&accessToken= -URL-REGEX,^https?:\/\/113\.200\.76\.*:16420\/sxtd\.bike2\.01\/getkey\.do -URL-REGEX,^https?:\/\/cdn\.api\.fotoable\.com\/Advertise\/ -URL-REGEX,^https?:\/\/counter\.ksosoft\.com\/ad\.php -URL-REGEX,^https?:\/\/creatives\.ftimg\.net\/ads -URL-REGEX,^https?:\/\/dd\.iask\.cn\/ddd\/adAudit -URL-REGEX,^https?:\/\/g\.tbcdn\.cn\/mtb\/ -URL-REGEX,^https?:\/\/huichuan\.sm\.cn\/jsad -URL-REGEX,^https?:\/\/iflow\.uczzd\.cn\/log\/ -URL-REGEX,^https?:\/\/iphone265g\.com\/templates\/iphone\/bottomAd\.js -URL-REGEX,^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/ad -URL-REGEX,^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/mobile\.advert\.js -URL-REGEX,^https?:\/\/m.+\.china\.com\.cn\/statics\/sdmobile\/js\/mobileshare\.js -URL-REGEX,^https?:\/\/mobile-pic\.cache\.iciba\.com\/feeds_ad\/ -URL-REGEX,^https?:\/\/nga\.cn.+\bhome.+\b=ad -URL-REGEX,^https?:\/\/overseas\.weico\.cc\/portal\.php\?a=get_coopen_ads -URL-REGEX,^https?:\/\/player\.hoge\.cn\/advertisement\.swf -URL-REGEX,^https?:\/\/ress\.dxpmedia\.com\/appicast\/ -URL-REGEX,^https?:\/\/s3\.pstatp\.com\/inapp\/TTAdblock\.css -URL-REGEX,^https?:\/\/sdk\.99shiji\.com\/ad\/ -URL-REGEX,^https?:\/\/statc\.mytuner\.mobi\/media\/banners\/ -URL-REGEX,^https?:\/\/static\.cnbetacdn\.com\/assets\/adv -URL-REGEX,^https?:\/\/static\.iask\.cn\/m-v20161228\/js\/common\/adAudit\.min\.js -URL-REGEX,^https?:\/\/v\.17173\.com\/api\/Allyes\/ -URL-REGEX,^https?:\/\/wmedia-track\.uc\.cn -URL-REGEX,^https?:\/\/www\.ft\.com\/__origami\/service\/image\/v2\/images\/raw\/https%3A%2F%2Fcreatives\.ftimg\.net%2Fads* -URL-REGEX,^https?:\/\/www\.lianbijr\.com\/adPage\/ -URL-REGEX,^https?:\/\/a\.applovin\.com\/3\.0\/ad -URL-REGEX,^https?:\/\/app\.58\.com\/api\/home\/advertising\/ -URL-REGEX,^https?:\/\/app\.58\.com\/api\/home\/appadv\/ -URL-REGEX,^https?:\/\/app\.58\.com\/api\/home\/invite\/popupAdv -URL-REGEX,^https?:\/\/.+\.58cdn\.com\.cn\/brandads\/ -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.taobao\.idle\.home\.welcome\/ -URL-REGEX,^https?:\/\/render\.alipay\.com\/p\/s\/h5data\/prod\/spring-festival-2019-h5data\/popup-h5data\.json -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.trip\.activity\.querytmsresources\/ -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.film\.mtopadvertiseapi\.queryadvertise\/ -URL-REGEX,^https?:\/\/m\d{1}\.amap\.com\/ws\/valueadded\/alimama\/splash_screen\/ -URL-REGEX,^https?:\/\/a\.apicloud\.com\/start_page\/ -URL-REGEX,^https?:\/\/cover.baidu.com\/cover\/page\/dspSwitchAds\/ -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/splashSchedule -URL-REGEX,^https?:\/\/.+\/client\/phpui2\/ -URL-REGEX,^https?:\/\/.+\.(musical|snssdk)\.(com|ly)\/(api|motor)\/ad\/ -URL-REGEX,^https?:\/\/dsp\.toutiao\.com\/api\/xunfei\/ads\/ -URL-REGEX,^https?:\/\/.+\.snssdk\.com\/motor\/operation\/activity\/display\/config\/V2\/ -URL-REGEX,^https?:\/\/7n\.bczcdn\.com\/launchad\/ -URL-REGEX,^https?:\/\/channel\.beitaichufang\.com\/channel\/api\/v1\/promote\/ios\/start\/page -URL-REGEX,^https?:\/\/iapi\.bishijie\.com\/actopen\/advertising\/ -URL-REGEX,^https?:\/\/app\.api\.ke\.com\/config\/config\/bootpage -URL-REGEX,^https?:\/\/creditcard\.ecitic\.com\/citiccard\/wtk\/piwik\/piwik\.php -URL-REGEX,^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/appspace-getway\/getWay\/appspace-system-web\/cr\/v5\/appStartAdv -URL-REGEX,^https?:\/\/mlife\.cmbchina\.com/ClientFaceService\/preCacheAdvertise\.json -URL-REGEX,^https?:\/\/mlife\.cmbchina\.com\/ClientFaceService\/getAdvertisement\.json -URL-REGEX,^https?:\/\/www\.cmbc\.com\.cn\/m\/image\/loadingpage\/ -URL-REGEX,^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d{25}\.(png|jpg) -URL-REGEX,^https?:\/\/app\.10086\.cn\/biz-orange\/DN\/(findSale|homeSale)\/getsaleAdver -URL-REGEX,^https?:\/\/m\.client\.10010\.com\/mobileService\/customer\/accountListData\.htm -URL-REGEX,^https?:\/\/m\.client\.10010\.com\/uniAdmsInterface\/getWelcomeAd -URL-REGEX,^https?:\/\/cntv\.hls\.cdn\.myqcloud\.com\/.+\?maxbr=850 -URL-REGEX,^https?:\/\/asp\.cntv\.myalicdn\.com\/.+\?maxbr=850 -URL-REGEX,^https?:\/\/www\.cntv\.cn\/nettv\/adp\/ -URL-REGEX,^https?:\/\/v\.cctv\.com\/.+850 -URL-REGEX,^https?:\/\/(api|atrace)\.chelaile\.net\.cn\/adpub\/ -URL-REGEX,^https?:\/\/cap\.caocaokeji\.cn\/advert-bss\/ -URL-REGEX,^https?:\/\/erebor\.douban\.com\/count\/\?ad= -URL-REGEX,^https?:\/\/img\d{1}\.doubanio\.com\/view\/dale-online\/dale_ad/ -URL-REGEX,^https?:\/\/rtbapi\.douyucdn\.cn\/japi\/sign\/app\/getinfo -URL-REGEX,^https?:\/\/mapi\.dangdang\.com\/index\.php\?action=init -URL-REGEX,^https?:\/\/api\.daydaycook\.com\.cn\/daydaycook\/server\/ad\/ -URL-REGEX,^https?:\/\/cms\.daydaycook\.com\.cn\/api\/cms\/advertisement\/ -URL-REGEX,^https?:\/\/www\.dandanzan\.com\/res\/gdsefse\.js -URL-REGEX,^https?:\/\/mobile-api2011\.elong\.com\/(adgateway|adv)\/ -URL-REGEX,^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/(adgateway|adv)\/ -URL-REGEX,^https?:\/\/foodie-api\.yiruikecorp\.com\/v1\/(banner|notice)\/overview -URL-REGEX,^https?:\/\/youtubei\.googleapis\.com\/youtubei\/.+ad_ -URL-REGEX,^https?:\/\/youtubei\.googleapis\.com\/youtubei\/.+log_ -URL-REGEX,^https?:\/\/.+\.youtube\.com\/get_midroll_ -URL-REGEX,^https?:\/\/.+\.youtube\.com\/ptracking -URL-REGEX,^https?:\/\/gateway\.shouqiev\.com\/fsda\/app\/bootImage\.json -URL-REGEX,^https?:\/\/smkmp\.96225.com\/smkcenter\/ad/ -URL-REGEX,^https?:\/\/games\.mobileapi\.hupu\.com\/.+\/status\/init -URL-REGEX,^https?:\/\/games\.mobileapi\.hupu\.com\/.+\/interfaceAdMonitor\/ -URL-REGEX,^https?:\/\/47\.97\.20\.12\/ad\/ -URL-REGEX,^https?:\/\/iface\.iqiyi\.com\/api\/getNewAdInfo -URL-REGEX,^https?:\/\/.+\/(mixer|track2)\? -URL-REGEX,^https?:\/\/act\.vip\.iqiyi\.com\/interact\/api\/show.do -URL-REGEX,^https?:\/\/act\.vip\.iqiyi\.com\/interact\/api\/v2\/show -URL-REGEX,^https?:\/\/api\.m\.jd.com\/client\.action\?functionId=start -URL-REGEX,^https?:\/\/(bdsp-x|dsp-x)\.jd\.com\/adx\/ -URL-REGEX,^https?:\/\/api\.jxedt\.com\/ad\/ -URL-REGEX,^https?:\/\/richmanapi\.jxedt\.com\/api\/ad\/ -URL-REGEX,^https?:\/\/counter\.ksosoft.com\/ad\.php -URL-REGEX,^https?:\/\/ios\.wps\.cn\/ad-statistics-service -URL-REGEX,^https?:\/\/.+\.kingsoft-office-service\.com\/ad -URL-REGEX,^https?:\/\/dict-mobile\.iciba\.com\/interface\/index\.php\?.+(c=ad|collectFeedsAdShowCount|KSFeedsAdCardViewController) -URL-REGEX,^https?:\/\/service\.iciba\.com\/popo\/open\/screens\/v3\?adjson -URL-REGEX,^https?:\/\/api\.kkmh\.com\/.+(ad|advertisement)\/ -URL-REGEX,^https?:\/\/.+\/resource\/m\/sys\/app\/adpos -URL-REGEX,^https?:\/\/.+\/resource\/m\/promo\/adsense -URL-REGEX,^https?:\/\/api\.jr\.mi\.com\/jr\/api\/playScreen -URL-REGEX,^https?:\/\/api\.mgzf\.com\/renter-operation\/home\/startHomePage -URL-REGEX,^https?:\/\/cdn\.moji\.com\/(adoss|adlink)\/ -URL-REGEX,^https?:\/\/mob\.mddcloud\.com\.cn\/api\/(ad|advert)\/ -URL-REGEX,^https?:\/\/p\d{1}\.meituan\.net\/(adunion|display|linglong|mmc|wmbanner)\/ -URL-REGEX,^https?:\/\/s3plus\.meituan\.net\/.+\/linglong\/ -URL-REGEX,^https?:\/\/capi.mwee.cn/app-api/V12/app/getstartad -URL-REGEX,^https?:\/\/.+\/cdn-adn\/ -URL-REGEX,^https?:\/\/.+/img\/ad\.union\.api\/ -URL-REGEX,^https?:\/\/mapi\.mafengwo\.cn\/ad\/ -URL-REGEX,^https?:\/\/mapi\.mafengwo\.cn\/travelguide\/ad\/ -URL-REGEX,^https?:\/\/oimage([a-z])([0-9])\.ydstatic\.com\/.+adpublish -URL-REGEX,^https?:\/\/sp\.kaola\.com\/api\/openad -URL-REGEX,^https?:\/\/support\.you\.163\.com\/xhr\/boot\/getBootMedia\.json -URL-REGEX,^https?:\/\/nnapp\.cloudbae\.cn\/mc\/api\/advert/ -URL-REGEX,^https?:\/\/dili\.bdatu\.com\/jiekou\/ad\/ -URL-REGEX,^https?:\/\/wap\.ngchina\.cn\/news\/adverts\/ -URL-REGEX,^https?:\/\/ma\.ofo\.com\/ads\/ -URL-REGEX,^https?:\/\/ma\.ofo\.com\/adImage\/ -URL-REGEX,^https?:\/\/cmsapi\.wifi8\.com\/v\d{1}\/(emptyAd|adNew)\/ -URL-REGEX,^https?:\/\/pss\.txffp\.com\/piaogen\/images\/launchScreen/ -URL-REGEX,^https?:\/\/notch\.qdaily\.com\/api\/v2\/boot_ad -URL-REGEX,^https?:\/\/msspjh\.emarbox\.com\/getAdConfig -URL-REGEX,^https?:\/\/api\.videozhishi\.com\/api\/getAdvertising -URL-REGEX,^https?:\/\/sdkapp\.uve\.weibo\.com\/interface\/sdk\/sdkad\.php -URL-REGEX,^https?:\/\/wbapp\.uve\.weibo\.com\/wbapplua\/wbpullad\.lua -URL-REGEX,^https?:\/\/sdkapp\.uve\.weibo\.com/\interface\/sdk\/actionad\.php -URL-REGEX,^https?:\/\/tqt\.weibo\.cn\/api\/advert\/ -URL-REGEX,^https?:\/\/s1\.api\.tv\.itc\.cn\/v4\/mobile\/control\/switch\.json -URL-REGEX,^https?:\/\/www\.shihuo\.cn\/app3\/saveAppInfo -URL-REGEX,^https?:\/\/gw-passenger\.01zhuanche\.com\/gw-passenger\/car-rest\/webservice\/passenger\/recommendADs -URL-REGEX,^https?:\/\/gw-passenger\.01zhuanche\.com\/gw-passenger\/zhuanche-passenger-token\/leachtoken\/webservice\/homepage\/queryADs -URL-REGEX,^https?:\/\/ssl\.kohsocialapp\.qq\.com:10001\/game\/buttons -URL-REGEX,^https?:\/\/qt\.qq\.com\/lua\/mengyou\/get_splash_screen_info -URL-REGEX,^https?:\/\/3gimg\.qq\.com\/tencentMapTouch\/app\/activity\/ -URL-REGEX,^https?:\/\/btrace.qq.com -URL-REGEX,^https?:\/\/vv\.video\.qq\.com\/getvmind\? -URL-REGEX,^https?:\/\/.+\.mp4\?cdncode=.+&sdtfrom=v3004 -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/getQQNewsRemoteConfig -URL-REGEX,^https?:\/\/mp\.weixin\.qq.com\/mp\/ad_complaint -URL-REGEX,^https?:\/\/mp\.weixin\.qq.com\/mp\/advertisement_report -URL-REGEX,^https?:\/\/mp\.weixin\.qq.com\/mp\/ad_video -URL-REGEX,^https?:\/\/api\.gaoqingdianshi\.com\/api\/v2\/ad\/ -URL-REGEX,^https?:\/\/adpai\.thepaper\.cn\/.+&ad= -URL-REGEX,^https?:\/\/mrobot\.pconline\.com\.cn\/v3\/ad2p -URL-REGEX,^https?:\/\/mrobot\.pconline\.com\.cn\/s\/onlineinfo\/ad\/ -URL-REGEX,^https?:\/\/mrobot\.pcauto\.com\.cn\/v3\/ad2p -URL-REGEX,^https?:\/\/mrobot\.pcauto\.com\.cn\/xsp\/s\/auto\/info\/preload\.xsp -URL-REGEX,^https?:\/\/static\.vuevideo\.net\/styleAssets\/.+\/splash_ad -URL-REGEX,^https?:\/\/static\.vuevideo\.net\/styleAssets\/advertisement\/ -URL-REGEX,^https?:\/\/overseas\.weico\.cc/portal\.php\?a=get_coopen_ads -URL-REGEX,^https?:\/\/api-release\.wuta-cam\.com\/ad_tree -URL-REGEX,^https?:\/\/res-release\.wuta-cam\.com\/json\/ads_component_cache\.json -URL-REGEX,^https?:\/\/snailsleep\.net\/snail\/v1\/screen\/qn\/get\? -URL-REGEX,^https?:\/\/snailsleep\.net\/snail\/v1\/adTask\/ -URL-REGEX,^https?:\/\/nochange\.ggsafe\.com\/ad\/ -URL-REGEX,^https?:\/\/thor\.weidian\.com\/ares\/home\.splash\/ -URL-REGEX,^https?:\/\/api\.xiachufang\.com\/v2\/ad/ -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.alimusic\.common\.mobileservice\.startinit\/ -URL-REGEX,^https?:\/\/api\.psy-1\.com\/cosleep\/startup -URL-REGEX,^https?:\/\/ctrl\.(playcvn|zmzapi)\.(com|net)\/app\/(ads|init) -URL-REGEX,^https?:\/\/app\.mixcapp\.com\/mixc\/api\/v2\/ad -URL-REGEX,^https?:\/\/(api|b)\.zhuishushenqi\.com\/advert -URL-REGEX,^https?:\/\/api\.21jingji\.com\/ad\/ -URL-REGEX,^https?:\/\/gw\.alicdn\.com\/tfs\/.+-\d{4}\.jpg -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.o2o\.ad\.gateway\.get\/ -URL-REGEX,^https?:\/\/guide-acs\.m\.taobao\.com\/gw\/mtop\.taobao\.wireless\.home\.splash\.awesome\.get\/ -URL-REGEX,^https?:\/\/m\d\.amap\.com\/ws\/valueadded\/alimama\/splash_screen\/ -URL-REGEX,^https?:\/\/.+\.applovin\.com\/.+\/ad -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/c\/f\/forum\/getAdInfo -URL-REGEX,^https?:\/\/.+\.(musical|snssdk|tiktokv)\.(com|ly)\/(api|motor)\/ad\/ -URL-REGEX,^https?:\/\/channel\.beitaichufang\.com\/channel\/api\/v\d\/promote\/ios\/start\/page -URL-REGEX,^https?:\/\/mlife\.jf365\.boc\.cn\/AppPrj\/FirstPic\.do\? -URL-REGEX,^https?:\/\/status\.boohee\.com\/api\/v\d\/app_square\/start_up_with_ad -URL-REGEX,^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/.+\/appStartAdv -URL-REGEX,^https?:\/\/v\.icbc\.com\.cn\/userfiles\/Resources\/WAP\/advertisement\/ -URL-REGEX,^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d\.(png|jpg) -URL-REGEX,^https?:\/\/clientaccess\.10086\.cn\/biz-orange\/DN\/init\/startInit -URL-REGEX,^https?:\/\/pic\d\.chelaile\.net\.cn\/adv\/ -URL-REGEX,^https?:\/\/api\.intsig\.net\/user\/cs\/operating\/app\/get_startpic\/ -URL-REGEX,^https?:\/\/api\.caijingmobile\.com\/(ad|advert)\/ -URL-REGEX,^https?:\/\/.+\/v2\/app_ads\/ -URL-REGEX,^https?:\/\/img\d\.doubanio\.com\/view\/dale-online\/dale_ad/ -URL-REGEX,^https?:\/\/e\.dangdang\.com\/.+getDeviceStartPage -URL-REGEX,^https?:\/\/dxy\.com\/app\/i\/ask\/biz\/feed\/launch -URL-REGEX,^https?:\/\/foodie-api\.yiruikecorp\.com\/v\d\/(banner|notice)\/overview -URL-REGEX,^https?:\/\/www\.flyertea\.com\/source\/plugin\/mobile\/mobile\.php\?module=advis -URL-REGEX,^https?:\/\/app\.variflight\.com\/ad\/ -URL-REGEX,^https?:\/\/app\.variflight\.com\/v\d\/advert\/ -URL-REGEX,^https?:\/\/games\.mobileapi\.hupu\.com\/.+\/(interfaceAdMonitor|interfaceAd)\/ -URL-REGEX,^https?:\/\/consumer\.fcbox\.com\/v\d\/ad\/ -URL-REGEX,^https?:\/\/api\.haohaozhu\.cn\/index\.php\/home\/AppInit\/getStartPhoto -URL-REGEX,^https?:\/\/ih2\.ireader\.com\/zyapi\/bookstore\/ad\/ -URL-REGEX,^https?:\/\/ih2\.ireader\.com\/zyapi\/self\/screen\/ad -URL-REGEX,^https?:\/\/ih2\.ireader\.com\/zycl\/api\/ad\/ -URL-REGEX,^https?:\/\/api\.m\.jd.com\/client\.action\?functionId=(start|queryMaterialAdverts) -URL-REGEX,^https?:\/\/.+\.kakamobi\.cn\/api\/open\/v\d\/advert-sdk\/ -URL-REGEX,^https?:\/\/service\.iciba\.com\/popo\/open\/screens\/v\d\?adjson -URL-REGEX,^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/MobileAdServer\/ -URL-REGEX,^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/EcomResourceServer/AdPlayPage/adinfo -URL-REGEX,^https?:\/\/api\.laifeng\.com\/v\d\/start\/ads -URL-REGEX,^https?:\/\/ios\.lantouzi\.com\/api\/startpage -URL-REGEX,^https?:\/\/api\.m\.mi\.com\/v\d\/app\/start -URL-REGEX,^https?:\/\/api\.jr\.mi\.com\/v\d\/adv\/ -URL-REGEX,^https?:\/\/api-mifit.+\.huami\.com\/discovery\/mi\/discovery\/.+_ad\? -URL-REGEX,^https?:\/\/mangaapi\.manhuaren\.com\/v\d\/public\/getStartPageAds -URL-REGEX,^https?:\/\/img\.meituan\.net\/(display|midas)\/.+\.(gif|jpg) -URL-REGEX,^https?:\/\/p\d\.meituan\.net\/wmbanner\/[A-Za-z0-9]+\.jpg -URL-REGEX,^https?:\/\/p\d\.meituan\.net\/movie\/[A-Za-z0-9]+\.jpg\?may_covertWebp -URL-REGEX,^https?:\/\/s3plus\.meituan\.net\/.+\/linglong\/.+\.jpg -URL-REGEX,^https?:\/\/capi.mwee.cn/app-api/V\d{2}/app/getstartad -URL-REGEX,^https?:\/\/.+\/v\d\/iflyad\/ -URL-REGEX,^https?:\/\/ggic\d?\.cmvideo\.cn\/ad\/ -URL-REGEX,^https?:\/\/b-api\.ins\.miaopai\.com\/\d\/ad/ -URL-REGEX,^https?:\/\/easyreadfs\.nosdn\.127\.net\/ad-material\/ -URL-REGEX,^https?:\/\/slapi.oray.net/client/ad -URL-REGEX,^https?:\/\/cmsapi\.wifi8\.com\/v\d\/(emptyAd|adNew)\/ -URL-REGEX,^https?:\/\/api\.rr\.tv\/ad\/ -URL-REGEX,^https?:\/\/weibointl\.api\.weibo\.cn\/portal\.php\?a=get_coopen_ads -URL-REGEX,^https?:\/\/api\.tv\.sohu\.com\/agg\/api\/app\/config\/bootstrap -URL-REGEX,^https?:\/\/api\.smzdm\.com\/v\d\/util\/loading -URL-REGEX,^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/(GetAD|ADLog) -URL-REGEX,^https?:\/\/image\.suning\.cn\/uimg\/ma\/ad\/ -URL-REGEX,^https?:\/\/img01\.10101111cdn\.com\/adpos\/ -URL-REGEX,^https?:\/\/3gimg\.qq\.com\/tencentMapTouch\/splash\/ -URL-REGEX,^https?:\/\/.+\.mp4.+&sdtfrom=v3004 -URL-REGEX,^https?:\/\/r\.inews\.qq\.com\/(adsBlacklist|getFullScreenPic|getQQNewsRemoteConfig) -URL-REGEX,^https?:\/\/api\.gaoqingdianshi\.com\/api\/v\d\/ad\/ -URL-REGEX,^https?:\/\/mrobot\.pconline\.com\.cn\/v\d\/ad2p -URL-REGEX,^https?:\/\/mrobot\.pcauto\.com\.cn\/v\d\/ad2p -URL-REGEX,^https?:\/\/snailsleep\.net\/snail\/v\d\/screen\/qn\/get\? -URL-REGEX,^https?:\/\/snailsleep\.net\/snail\/v\d\/adTask\/ -URL-REGEX,^https?:\/\/api\.wallstreetcn\.com\/apiv\d\/advertising\/ -URL-REGEX,^https?:\/\/portal-xunyou\.qingcdn\.com\/api\/v\d\/ios\/configs\/(splash_ad|ad_urls) -URL-REGEX,^https?:\/\/portal-xunyou\.qingcdn\.com\/api\/v\d\/ios\/ads\/ -URL-REGEX,^https?:\/\/.+\/api\/v\d\/adRealTime -URL-REGEX,^https?:\/\/tiku\.zhan\.com\/Common\/newAd\/ -URL-REGEX,^https?:\/\/app\.mixcapp\.com\/mixc\/api\/v\d\/ad -URL-REGEX,^https?:\/\/app\.yinxiang\.com\/ads\/ -URL-REGEX,^https?:\/\/www\.zybang\.com\/adx\/ -URL-REGEX,^https?:\/\/api\.izuiyou\.com\/ad\/ -URL-REGEX,^https?:\/\/ss0\.bdstatic\.com/.+_\d{3}_\d{4}\.jpg -URL-REGEX,^https?:\/\/123\.59\.31\.1\/(adgateway|adv)\/ -URL-REGEX,^https?:\/\/119\.18\.193\.135\/(adgateway|adv)\/ -URL-REGEX,^https?:\/\/.+.atm.youku.com -URL-REGEX,^https?:\/\/img\w.g.pptv.com -URL-REGEX,^https?:\/\/h\w{2}.hxsame.hexun.com -URL-REGEX,^https?:\/\/(e|m).+/((uu|oo).php.+|\d+.x?html\?$) -URL-REGEX,^https?:\/\/[^(apple|10010)]+.(com|cn)\/(a|A)d(s|v)?(/|.js) -URL-REGEX,^https?:\/\/[^bbs].tianya\.cn -URL-REGEX,^https?:\/\/\w.?up.qingdaonews.com -URL-REGEX,^https?:\/\/w{6}.com1.z0.glb.clouddn.com -URL-REGEX,^https?:\/\/w{8}.logic.cpm.cm.kankan.com -URL-REGEX,^https?:\/\/w+.beacon.qq.com -URL-REGEX,^https?:\/\/w+.cloudfront.net/banner -URL-REGEX,^https?:\/\/w+.gdt.qq.com -URL-REGEX,^https?:\/\/w+.kingsoft-office-service.com -URL-REGEX,^https?:\/\/w+.l.qq.com -URL-REGEX,^https?:\/\/9377\w{2}.com -URL-REGEX,^https?:\/\/a0b\w{2}.com -URL-REGEX,^https?:\/\/(a?d|sax)\d.sina.com -URL-REGEX,^https?:\/\/api\d.tuisong.baidu.com -URL-REGEX,^https?:\/\/d\d.sinaimg.cn -URL-REGEX,^https?:\/\/dl.app.gtja.com/.+\d+.jpg$ -URL-REGEX,^https?:\/\/impservice.+?youdao.com -URL-REGEX,^https?:\/\/log.+?baidu.com -URL-REGEX,^https?:\/\/notice.send-anywhere.com/banner -URL-REGEX,^https?:\/\/sa\d.tuisong.baidu.com -URL-REGEX,^https?:\/\/sax\w?.sina.cn -URL-REGEX,^https?:\/\/sax\w?.sina.com.cn -URL-REGEX,^https?:\/\/server-\w+.imrworldwide.com -URL-REGEX,^https?:\/\/t\d{2}.baidu.com -URL-REGEX,^https?:\/\/.+/videos/other/.+ -URL-REGEX,^https?:\/\/paopao\w?.qiyipic.com -URL-REGEX,^https?:\/\/www.bldimg.com/(background|splash)/.+.png$ -URL-REGEX,^https?:\/\/youtubei\.googleapis\.com\/youtubei\/v1\/player\/ad_ -URL-REGEX,^https?://.+ccode=0902 -URL-REGEX,^https?:\/\/ulogs\.umeng\.com -URL-REGEX,^https?:\/\/ulogs\.umengcloud\.com -URL-REGEX,^https?:\/\/alogs\.umeng\.co -URL-REGEX,^https?:\/\/alogs\.umeng\.com -URL-REGEX,^https?:\/\/(\w\.)?up\.qingdaonews\.(com|cn|net) -URL-REGEX,^https?:\/\/(e|m)\..+/((uu|oo)\.php.+|\d+\.x?html\?$) -URL-REGEX,^https?:\/\/.+\.beacon\.qq\.com -URL-REGEX,^https?:\/\/.+\.gdt\.qq\.com -URL-REGEX,^https?:\/\/.+\.kingsoft-office-service\.com -URL-REGEX,^https?:\/\/.+\.l\.qq\.com -URL-REGEX,^https?:\/\/[^(apple|10010)]+\.(com|cn)\/(a|A)d(s|v)?(\/|\.js) -URL-REGEX,^https?:\/\/[^bbs]\.tianya\.cn -URL-REGEX,^https?:\/\/\w{6}\.com1\.z0\.glb\.clouddn\.com -URL-REGEX,^https?:\/\/\w{8}\.logic\.cpm\.cm\.kankan\.com -URL-REGEX,^https?:\/\/\w+\.cloudfront\.net\/banner -URL-REGEX,^https?:\/\/9377\w{2}\.com -URL-REGEX,^https?:\/\/a0b\w{2}\.com -URL-REGEX,^https?:\/\/ad\d\.sina\.com -URL-REGEX,^https?:\/\/ad\d\.sina\.com.cn -URL-REGEX,^https?:\/\/api\d\.tuisong\.baidu\.com -URL-REGEX,^https?:\/\/d\d\.sina\.com\.cn -URL-REGEX,^https?:\/\/d\d\.sinaimg\.cn -URL-REGEX,^https?:\/\/dl\.app\.gtja\.com/.+\d+\.jpg$ -URL-REGEX,^https?:\/\/impservice.+?\.(.+\.)?youdao\.com -URL-REGEX,^https?:\/\/log\..+\.baidu\.com -URL-REGEX,^https?:\/\/notice\.send-anywhere\.com\/banner -URL-REGEX,^https?:\/\/pic\d\.zhimg\.com\/v2.+ -URL-REGEX,^https?:\/\/sa\d\.tuisong\.baidu\.com -URL-REGEX,^https?:\/\/sax\d\.sina\.com\.cn -URL-REGEX,^https?:\/\/sax\w?\.sina\.cn -URL-REGEX,^https?:\/\/sax\w?\.sina\.com\.cn -URL-REGEX,^https?:\/\/server-\w+\.imrworldwide\.com -URL-REGEX,^https?:\/\/t\d{2}\.baidu\.com -URL-REGEX,^https?:\/\/www\.bldimg\.com\/(background|splash)\/.+\.png$ -URL-REGEX,^https?:\/\/.+\/vlive.qqvideo.tc.qq.com\/ -URL-REGEX,^https?:\/\/ups\.youku\.com\/(\.*)needad=1& -URL-REGEX,^http?:\/\/www\.tsytv\.com\.cn\/api\/app\/ios\/ads -URL-REGEX,^https?:\/\/qidian\.qpic\.cn\/qidian_common -URL-REGEX,^https?:\/\/123\.59\.30\.10\/adv\/advInfos -URL-REGEX,^https:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore -URL-REGEX,^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\//d+\//d+\/BbsImg\.(?<=(big.(png|jpg)))$ -URL-REGEX,^https?:\/\/api-163\.biliapi\.net\/cover -URL-REGEX,^https?:\/\/api-mifit\.huami\.com\/(discovery\/mi\/discovery\/(homepage|sleep|sport(_(summary|training))?|step_detail|training_video)_ad|v1\/app\/startpages\.json)\? -URL-REGEX,^https?:\/\/c\.tieba\.baidu\.com\/\w+\/\w+\/(sync|newRnSync|mlog) -URL-REGEX,^https?:\/\/122\.14\.246\.33\/MobileAdServer\/ -URL-REGEX,^https?:\/\/img\.meituan\.net\/(adunion|display|midas)\/.+\.(gif|jpg|jpg\.webp)$ -URL-REGEX,^https?:\/\/s3plus\.meituan\.net\/.+\/linglong\/.+\.(gif|jpg|mp4) -URL-REGEX,^https?:\/\/pan-api\.bitqiu\.com\/activity\/(getPromoteGuide|getUrlList) -URL-REGEX,^http:\/\/dssp\.stnts\.com -URL-REGEX,^https?:\/\/[a-z]*\.alicdn\.com\/.*\.jpg_(9\d{2}|\d{4}) -URL-REGEX,^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/.{25}\.jpg -URL-REGEX,^https?:\/\/api\.feng\.com\/v\d\/advertisement\/.*Claunch -URL-REGEX,^https?:\/\/www\.bodivis\.com\.cn\/app\/splashAdvertise -URL-REGEX,^https?:\/\/.+/V\d\/splash\/getSplashV\d\.action -URL-REGEX,^https?:\/\/4gimg\.map\.qq\.com\/mwaSplash\/ -URL-REGEX,^https?:\/\/restapi\.iyunmai\.com\/api\/ios\/ad\/ -URL-REGEX,^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d+\.(jpg|png) -URL-REGEX,^https?:\/\/m\.creditcard\.ecitic\.com\/.*\/appStartAdv -URL-REGEX,^https?:\/\/mlife\.jf365\.boc\.cn\/AppPrj\/FirstPic\.do -URL-REGEX,^https?:\/\/mlife\.cmbchina\.com\/ClientFaceService\/preCacheAdvertise\.json -URL-REGEX,^https?:\/\/creditcardapp\.bankcomm\.com\/mapp\/common\/queryGuidePageAds\.do -URL-REGEX,^https?:\/\/[\s\S]*\/.+\.tc\.qq\.com/.*p201.1\.mp4 -URL-REGEX,^https?:\/\/[\s\S]*\/website\/.*\.jpg -URL-REGEX,^https?:\/\/[\s\S]*\/music\/photo_new\/T017R -URL-REGEX,^https?:\/\/y\.gtimg\.cn\/music\/.*_Ad/\d+\.png -URL-REGEX,^https?:\/\/shp\.qpic\.cn\/pggamehead\/.*h=\d{4} -URL-REGEX,^https?:\/\/api2\.helper\.qq\.com\/game\/buttons -URL-REGEX,^https?:\/\/[\s\S]*\.baidu\.com/.*ad[xs]\.php -URL-REGEX,^https?:\/\/pan\.baidu\.com\/rest\/2.0\/pcs\/adx -URL-REGEX,^https?:\/\/pan\.baidu\.com\/act\/api\/activityentry -URL-REGEX,^https?:\/\/[\s\S]*\/youku\/.*\.mp4 -URL-REGEX,^https?:\/\/optimus-ads\.amap\.com\/uploadimg\/ -URL-REGEX,^https?:\/\/cube\.elemecdn\.com\/.*\.mp4\? -URL-REGEX,^https?:\/\/p\d.meituan.net\/movie\/.*\?may_covertWebp -URL-REGEX,^https?:\/\/p\d\.meituan\.net\/wmbanner\/ -URL-REGEX,^https?:\/\/s3plus\.meituan\.net\/v1\/mss_a002 -URL-REGEX,^https?:\/\/img\.meituan\.net\/midas\/.*@\d{4}h -URL-REGEX,^https?:\/\/img\.meituan\.net\/display\/\w+\.jpg\.webp -URL-REGEX,^https?:\/\/[\s\S]*\/eapi\/ad\/ -URL-REGEX,^https?:\/\/iad.*mat\.[a-z]*\.12[67]\.net/\w+\.(jpg|mp4) -URL-REGEX,^https?:\/\/zt-app\.go189\.cn\/zt-app\/welcome\/.*Animation -URL-REGEX,^https?:\/\/[\s\S]*\/ting\/[a-z]*\/ts-\d+ -URL-REGEX,^https?:\/\/res\.xiaojukeji\.com\/resapi\/activity\/get(Ruled|Preload) -URL-REGEX,^https?:\/\/rich\.kuwo\.cn\/AdService\/kaiping\/adinfo -URL-REGEX,^https?:\/\/[\s\S]*\.snssdk\.com\/api\/ad\/ -URL-REGEX,^https?:\/\/api\.feng\.com\/v1\/advertisement\/.*Claunch -URL-REGEX,^https?:\/\/business\.msstatic\.com\/advertiser\/ -URL-REGEX,^https?:\/\/cdnfile1\.msstatic\.com\/cdnfile\/appad\/ -URL-REGEX,^https?:\/\/ms\.jr\.jd\.com\/gw\/generic\/(aladdin\/na\/m\/getLoadingPicture|aladdin\/na\/m\/getLoadingPicture) -URL-REGEX,^https?:\/\/pic\.edaijia\.cn\/adsplash\/ -URL-REGEX,^https?:\/\/mpcs\.suning\.com\/mpcs\/dm\/getDmInfo -URL-REGEX,^https?:\/\/prom\.mobile\.gome\.com\.cn\/mobile\/promotion\/promscms\/sale\w+\.jsp -URL-REGEX,^https?:\/\/app\.yinxiang\.com\/ads\/getAdsInfo -URL-REGEX,^https?:\/\/api\.douban\.com\/v2\/app_ads\/splash -URL-REGEX,^https?:\/\/ptmpcap\.caocaokeji\.cn\/advert-bss\/ -URL-REGEX,^https?:\/\/newapp\.szsmk\.com\/app\/config\/.*Ad -URL-REGEX,^https?:\/\/api\.rr\.tv\/.*(getAll|Version) -URL-REGEX,^https?:\/\/client\.qunar\.com\/pitcher-proxy\?qrt=p_splashAd -URL-REGEX,^https?:\/\/m\.tuniu\.com\/api\/operation\/splash\/ -URL-REGEX,^https?:\/\/y\.gtimg\.cn\/music\/common\/\/upload\/kg_ad/.*\d{4}\.jpg -URL-REGEX,^https?:\/\/dimg04\.c-ctrip\.com\/images\/\w+(_\d{4}){2} -URL-REGEX,^https?:\/\/adm\.10jqka\.com\.cn\/img\/ad\/.*(1\d{2}|\d{4})\.jpg -URL-REGEX,^https?:\/\/api\.gotokeep\.com\/ads\/ -URL-REGEX,^https?:\/\/ggx\.cmvideo\.cn\/request\/ -URL-REGEX,^https?:\/\/oral\.youdao\.com\/oral\/adInfo -URL-REGEX,^https?:\/\/impservice\.dictapp\.youdao\.com\/imp\/request -URL-REGEX,^https?://du\.hupucdn\.com\/\w+h\d{4} -URL-REGEX,^https?:\/\/api\.yangkeduo\.com\/api\/cappuccino\/splash -URL-REGEX,^https?:\/\/mp\.weixin\.qq\.com\/(s|mp)\/(ad_|advertisement|getappmsgad|author|report|appmsgreport|appmsgpicreport) -URL-REGEX,^https?:\/\/dl\.app\.gtja\.com\/dzswem\/kvController\/.+\.jpg$ -URL-REGEX,^https?:\/\/yxyapi\d\.drcuiyutao\.com\/yxy-api-gateway\/api\/json\/advert\/ -URL-REGEX,^https?:\/\/(api|www)\.zhihu\.com\/((terms\/privacy\/confirm|app_config|banner|commercial_api\/(launch|real_time))|(fringe|zst|drama|adx|commercial|real_time|ad-style-service|banners|market/popover|mqtt|.*(launch|featured-comment-ad|guide|recommendations|community-ad)|search/(top|tab|preset)|ab)) -URL-REGEX,^https?:\/\/ap(i|p)\.bilibili\.com\/((x\/v2|pgc)\/(search\/defaultword|season\/rank\/cn|splash\/)|(pgc/season/rank/cn|x/v2/(rank.*rid=(168|5)|search/(defaultword|hot|recommend|resource)))) -AND,((USER-AGENT,bili*), (NOT,((DOMAIN-SUFFIX,bilibili.com))),(NOT,((DOMAIN-SUFFIX,hdslb.com)))) -USER-AGENT,Weibo%20intl* -USER-AGENT,TencentConnect* -USER-AGENT,AliXAdSDK* -USER-AGENT,neteasemusic* -OR,((DOMAIN,news.l.qq.com), (DOMAIN,news.ssp.qq.com)) -OR,((DOMAIN,ct.xiaojukeji.com), (DOMAIN,gwp.xiaojukeji.com)) -OR,((DOMAIN,mobile.da.mgtv.com), (DOMAIN,mobile2.da.mgtv.com)) -OR,((DOMAIN,static-s.iqiyi.com), (DOMAIN,t7z.cupid.iqiyi.com)) -AND,((DOMAIN-KEYWORD,advertise), (USER-AGENT,Cocoa*)) -AND,((DOMAIN,photovms.tv.sohu.com), (NOT,((URL-REGEX,http)))) -AND,((USER-AGENT,osee2*), (NOT,((DOMAIN,static.zhihu.com))), (NOT,((DOMAIN,api.zhihu.com))), (NOT,((DOMAIN,link.zhihu.com))), (NOT,((DOMAIN,lens.zhihu.com))), (NOT,((DOMAIN,www.zhihu.com))), (NOT,((DOMAIN-SUFFIX,zhimg.com)))) -AND,((USER-AGENT,ZhihuHybrid*), (NOT,((DOMAIN-SUFFIX,zhihu.com))), (NOT,((DOMAIN-SUFFIX,zhimg.com)))) -URL-REGEX,https?://interface3?.music.163.com/eapi/(ad|abtest|sp|hot|store|mlog|search/(specialkeyword|defaultkeyword|hot)) -AND,((USER-AGENT, %E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*),(OR,((NOT,((DOMAIN-SUFFIX,music.126.net))), (DOMAIN-KEYWORD,admusic)))) -AND,((USER-AGENT,NeteaseMusic*), (NOT,((URL-REGEX,https?://interface3?.music.163.com)))) -AND,((USER-AGENT,pixiv*), (NOT,((DOMAIN-KEYWORD,pixiv)))) -URL-REGEX,^https?:\/\/capis-slb\.didapinche\.com\/ad\/ -URL-REGEX,^https://weibointl.api.weibo.cn/portal.php\?a=get_coopen_ads -URL-REGEX,^https?:\/\/yxyapi2\.drcuiyutao\.com\/yxy-api-gateway\/api\/json\/advert\/getsAd -URL-REGEX,^https?:\/\/capis-clb\.didapinche\.com\/ad\/ -URL-REGEX,^https?:\/\/api\.vistopia\.com\.cn\/api\/(v1|v\/d)\/home\/advertisement -URL-REGEX,^https?:\/\/g\.cdn\.pengpengla\.com\/starfantuan\/boot-screen-info\/ -URL-REGEX,^https?:\/\/api\.qbb6\.com\/ad\/ -URL-REGEX,^https?:\/\/www\.didapinche\.com\/app\/adstat\/ -URL-REGEX,^https?:\/\/capis\.didapinche\.com\/ad\/ -URL-REGEX,^https?:\/\/mcupdate\.gstarcad\.com\/api\/v2\/ -URL-REGEX,^https:\/\/api\.waitwaitpay\.com\/\/api\/splash$ -URL-REGEX,^https:\/\/api\.waitwaitpay\.com\/\/api\/ad_banners$ -URL-REGEX,^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview.\fcg -URL-REGEX,^https?:\/\/api\.jxedt\.com\/jump\/EMiCcDNp -URL-REGEX,^https?:\/\/richmanapi\.jxedt\.com\/api\/banadplus -URL-REGEX,^https?:\/\/richmanapi\.jxedt\.com\/api\/ad\/guideplus -URL-REGEX,^https?:\/\/richmanmain\.jxedt\.com\/advertisement\/fallback -URL-REGEX,^https?:\/\/richmanapi\.jxedt\.com\/api\/adplus -URL-REGEX,^https?:\/\/www\.nfmovies\.com\/pic\/tu\/ -URL-REGEX,^https?:\/\/www\.nfmovies\.com\/uploads\/images\/play\.jpg -URL-REGEX,^https?:\/\/www\.nfmovies\.com\/templets\/default\/images\/logos -URL-REGEX,^https?:\/\/ddrk\.me\/image\/logo_footer\.png$ -URL-REGEX,^https?:\/\/img\.ddrk\.me\/ad190824 -URL-REGEX,^https?:\/\/ddrk\.me\/image\/logo_footer\.png -URL-REGEX,^https?:\/\/ddrk\.me\/wp-content\/plugins\/advanced-floating-content-lite\/public\/images\/close\.png -URL-REGEX,^https?:\/\/img\.ddrk\.me\/cover\.png -URL-REGEX,^https?:\/\/app-api\.smzdm\.com\/util\/loading -URL-REGEX,^https?:\/\/acs\.m\.taobao\.com\/gw\/mtop\.common\.fetTimestamp \ No newline at end of file diff --git a/Surge/AdRuleTest.list b/Surge/AdRuleTest.list index 8650464695..46c74a731f 100644 --- a/Surge/AdRuleTest.list +++ b/Surge/AdRuleTest.list @@ -1,4 +1,4 @@ -#Update 2019.11.21 Self-use for testing only, there may be a lot of manslaughter. +#Update 2021.1.30 Self-use for testing only. DOMAIN-SUFFIX,admaster.com DOMAIN-SUFFIX,0z5jn.cn DOMAIN-SUFFIX,114so.cn @@ -9,7 +9,6 @@ DOMAIN-SUFFIX,801.tianya.cn DOMAIN-SUFFIX,803.tianya.cn DOMAIN-SUFFIX,9377.cn DOMAIN-SUFFIX,a6ntv.cn -DOMAIN-SUFFIX,ad.12306.cn DOMAIN-SUFFIX,ad.bmac.com.cn DOMAIN-SUFFIX,adfill.adview.cn DOMAIN-SUFFIX,ads.voiceads.cn @@ -49,14 +48,11 @@ DOMAIN-SUFFIX,log.voicecloud.cn DOMAIN-SUFFIX,m.adpro.cn DOMAIN-SUFFIX,m.qpic.cn DOMAIN-SUFFIX,m.reachmax.cn -DOMAIN-SUFFIX,mdrecv.app.cntvwb.cn DOMAIN-SUFFIX,mgr.aduu.cn -DOMAIN-SUFFIX,minfo.wps.cn DOMAIN-SUFFIX,mm.dopa.com.cn DOMAIN-SUFFIX,myhug.cn DOMAIN-SUFFIX,nal5h.cn DOMAIN-SUFFIX,pd.dopa.com.cn -DOMAIN-SUFFIX,pgdt.gtimg.cn DOMAIN-SUFFIX,pic.517m.cn DOMAIN-SUFFIX,push.jiguang.cn DOMAIN-SUFFIX,report.adview.cn @@ -64,7 +60,6 @@ DOMAIN-SUFFIX,res.aduu.cn DOMAIN-SUFFIX,rtb.adview.cn DOMAIN-SUFFIX,s.xhsxgmt.cn DOMAIN-SUFFIX,sas816.ujikdd041o.cn -DOMAIN-SUFFIX,sdapprecv.app.cntvwb.cn DOMAIN-SUFFIX,sdkm.w.inmobi.cn DOMAIN-SUFFIX,stat.browser.nearme.com.cn DOMAIN-SUFFIX,stat.zol.com.cn @@ -74,11 +69,8 @@ DOMAIN-SUFFIX,stats.magicwindow.cn DOMAIN-SUFFIX,t.linkpage.cn DOMAIN-SUFFIX,test2014.adview.cn DOMAIN-SUFFIX,track.ra.icast.cn -DOMAIN-SUFFIX,track.uc.cn DOMAIN-SUFFIX,ttqr58.cn DOMAIN-SUFFIX,uerzyr.cn -DOMAIN-SUFFIX,v2.reachmax.cn -DOMAIN-SUFFIX,vdapprecv.app.cntvwb.cn DOMAIN-SUFFIX,vf5yb4.cn DOMAIN-SUFFIX,vq6nsu.cn DOMAIN-SUFFIX,x.adpro.cn @@ -93,7 +85,6 @@ DOMAIN-SUFFIX,xiazai.mathtype.cn DOMAIN-SUFFIX,xiazai.ntfsformac.cn DOMAIN-SUFFIX,xiazai.xmindchina.cn DOMAIN-SUFFIX,yunpifu.cn -DOMAIN-SUFFIX,uczzd.cn DOMAIN-SUFFIX,testin.cn DOMAIN-SUFFIX,cccwwwr.com DOMAIN-SUFFIX,mmkkiivv.com @@ -137,28 +128,21 @@ DOMAIN-SUFFIX,adfilter.imtt.qq.com DOMAIN-SUFFIX,adsrich.qq.com DOMAIN-SUFFIX,aexception.bugly.qq.com DOMAIN-SUFFIX,android.bugly.qq.com -DOMAIN-SUFFIX,appsupport.qq.com DOMAIN-SUFFIX,astat.bugly.qq.com -DOMAIN-SUFFIX,beacon.qq.com DOMAIN-SUFFIX,bs.l.qq.com -DOMAIN-SUFFIX,btrace.qq.com DOMAIN-SUFFIX,bugreportv2.qq.com DOMAIN-SUFFIX,c.l.qq.com DOMAIN-SUFFIX,c2.l.qq.com DOMAIN-SUFFIX,cb.l.qq.com -DOMAIN-SUFFIX,cdn.ark.qq.com DOMAIN-SUFFIX,cfg.imtt.qq.com -DOMAIN-SUFFIX,cgi.connect.qq.com DOMAIN-SUFFIX,client.show.qq.com DOMAIN-SUFFIX,cm.e.qq.com DOMAIN-SUFFIX,cm.l.qq.com DOMAIN-SUFFIX,dir.minigame.qq.com DOMAIN-SUFFIX,etg.qq.com -DOMAIN-SUFFIX,ex.qq.com DOMAIN-SUFFIX,fm.qzone.qq.com DOMAIN-SUFFIX,fodder.qq.com DOMAIN-SUFFIX,fodder.tc.qq.com -DOMAIN-SUFFIX,fusion.qq.com DOMAIN-SUFFIX,fw.qq.com DOMAIN-SUFFIX,hm.l.qq.com DOMAIN-SUFFIX,httpring.qq.com @@ -177,9 +161,7 @@ DOMAIN-SUFFIX,ls.l.qq.com DOMAIN-SUFFIX,mapp.qzone.qq.com DOMAIN-SUFFIX,mazu.3g.qq.com DOMAIN-SUFFIX,mta.qq.com -DOMAIN-SUFFIX,mtrace.qq.com DOMAIN-SUFFIX,openapi.guanjia.qq.com -DOMAIN-SUFFIX,oth.eve.mdt.qq.com DOMAIN-SUFFIX,p.l.qq.com DOMAIN-SUFFIX,p.store.qq.com DOMAIN-SUFFIX,p2.l.qq.com @@ -187,8 +169,6 @@ DOMAIN-SUFFIX,p3.l.qq.com DOMAIN-SUFFIX,pagespeed.report.qq.com DOMAIN-SUFFIX,pinghot.qq.com DOMAIN-SUFFIX,pingjs.qq.com -DOMAIN-SUFFIX,pingma.qq.com -DOMAIN-SUFFIX,pingtcss.qq.com DOMAIN-SUFFIX,pms.mb.qq.com DOMAIN-SUFFIX,qss-client.qq.com DOMAIN-SUFFIX,recmd.html5.qq.com @@ -207,7 +187,6 @@ DOMAIN-SUFFIX,showwxml.qq.com DOMAIN-SUFFIX,soft.tbs.imtt.qq.com DOMAIN-SUFFIX,stdl.qq.com DOMAIN-SUFFIX,t.l.qq.com -DOMAIN-SUFFIX,tajs.qq.com DOMAIN-SUFFIX,tj.b.qq.com DOMAIN-SUFFIX,tj.video.qq.com DOMAIN-SUFFIX,tools.3g.qq.com @@ -217,7 +196,6 @@ DOMAIN-SUFFIX,up-hl.3g.qq.com DOMAIN-SUFFIX,user1.game.qq.com DOMAIN-SUFFIX,vpic.video.qq.com DOMAIN-SUFFIX,w.l.qq.com -DOMAIN-SUFFIX,wup.imtt.qq.com DOMAIN-SUFFIX,yun-hl.3g.qq.com DOMAIN-SUFFIX,ad1.sina.com.cn DOMAIN-SUFFIX,ad2.sina.com.cn @@ -235,7 +213,6 @@ DOMAIN-SUFFIX,log.mix.sina.com.cn DOMAIN-SUFFIX,log.sina.cn DOMAIN-SUFFIX,r.dmp.sina.cn DOMAIN-SUFFIX,sax.sina.cn -DOMAIN-SUFFIX,sax.sina.com.cn DOMAIN-SUFFIX,sax1.sina.com.cn DOMAIN-SUFFIX,sax2.sina.com.cn DOMAIN-SUFFIX,sax3.sina.com.cn @@ -245,9 +222,6 @@ DOMAIN-SUFFIX,sax6.sina.com.cn DOMAIN-SUFFIX,sax7.sina.com.cn DOMAIN-SUFFIX,sax8.sina.com.cn DOMAIN-SUFFIX,sax9.sina.com.cn -DOMAIN-SUFFIX,saxn.sina.com.cn -DOMAIN-SUFFIX,saxs.sina.com.cn -DOMAIN-SUFFIX,u1.img.mobile.sina.cn DOMAIN-SUFFIX,dp.im.weibo.cn DOMAIN-SUFFIX,m.game.weibo.cn DOMAIN-SUFFIX,c.biz.weibo.com @@ -257,14 +231,7 @@ DOMAIN-SUFFIX,wax.weibo.com DOMAIN-SUFFIX,wbapp.uve.weibo.com DOMAIN-SUFFIX,widget.weibo.com DOMAIN-SUFFIX,zc.biz.weibo.com -DOMAIN-SUFFIX,adash-c.ut.taobao.com -DOMAIN-SUFFIX,adashbc.m.taobao.com -DOMAIN-SUFFIX,adashbc.ut.taobao.com DOMAIN-SUFFIX,adashx.m.taobao.com -DOMAIN-SUFFIX,adashxgc.ut.taobao.com -DOMAIN-SUFFIX,click.mz.simba.taobao.com -DOMAIN-SUFFIX,click.simba.taobao.com -DOMAIN-SUFFIX,click.tz.simba.taobao.com DOMAIN-SUFFIX,ip.taobao.com DOMAIN-SUFFIX,nbsdk-baichuan.taobao.com DOMAIN-SUFFIX,pics.taobaocdn.com @@ -273,9 +240,6 @@ DOMAIN-SUFFIX,rj.m.taobao.com DOMAIN-SUFFIX,sdkinit.taobao.com DOMAIN-SUFFIX,show.re.taobao.com DOMAIN-SUFFIX,simaba.taobao.com -DOMAIN-SUFFIX,stat.simba.taobao.com -DOMAIN-SUFFIX,tns.simba.taobao.com -DOMAIN-SUFFIX,tunion-api.m.taobao.com DOMAIN-SUFFIX,a.alimama.cn DOMAIN-SUFFIX,bm.alimama.cn DOMAIN-SUFFIX,bmvip.alimama.cn @@ -284,7 +248,6 @@ DOMAIN-SUFFIX,img.alimama.cn DOMAIN-SUFFIX,tw.alimama.cn DOMAIN-SUFFIX,acjs.aliyun.com DOMAIN-SUFFIX,acookie.alimama.com -DOMAIN-SUFFIX,adash.man.aliyuncs.com DOMAIN-SUFFIX,arms-retcode.aliyuncs.com DOMAIN-SUFFIX,afpeng.alimama.com DOMAIN-SUFFIX,afpssp.alimama.com @@ -302,15 +265,12 @@ DOMAIN-SUFFIX,hydra.alibaba.com DOMAIN-SUFFIX,jsadsdisplay.cn-beijing.log.aliyuncs.com DOMAIN-SUFFIX,mdap.alipaylog.com DOMAIN-SUFFIX,mobaders.oss-cn-beijing.aliyuncs.com -DOMAIN-SUFFIX,nbsdk-baichuan.alicdn.com DOMAIN-SUFFIX,p.alimama.com DOMAIN-SUFFIX,static.alimama.com DOMAIN-SUFFIX,t.alimama.com DOMAIN-SUFFIX,ttjx-online.cn-hangzhou.log.aliyuncs.com DOMAIN-SUFFIX,analytics.hz.netease.com DOMAIN-SUFFIX,statis.push.netease.com -DOMAIN-SUFFIX,n.3g.163.com -DOMAIN-SUFFIX,nex.163.com DOMAIN-SUFFIX,analytics.ws.126.net DOMAIN-SUFFIX,m.analytics.126.net DOMAIN-SUFFIX,stat.ws.126.net @@ -328,14 +288,11 @@ DOMAIN-SUFFIX,test.ad.xiaomi.com DOMAIN-SUFFIX,test.e.ad.xiaomi.com DOMAIN-SUFFIX,test.zeus.ad.xiaomi.com DOMAIN-SUFFIX,zeus.ad.xiaomi.com -DOMAIN-SUFFIX,adv.sec.miui.com DOMAIN-SUFFIX,info.analysis.kp.sec.miui.com -DOMAIN-SUFFIX,ad.mobile.youku.com DOMAIN-SUFFIX,adp.atm.youku.com DOMAIN-SUFFIX,bsv.atm.youku.com DOMAIN-SUFFIX,count.atm.youku.com DOMAIN-SUFFIX,html.atm.youku.com -DOMAIN-SUFFIX,iyes.youku.com DOMAIN-SUFFIX,m.atm.youku.com DOMAIN-SUFFIX,mf.atm.youku.com DOMAIN-SUFFIX,statis.mobile.youku.com @@ -346,8 +303,6 @@ DOMAIN-SUFFIX,valc.atm.youku.com DOMAIN-SUFFIX,valf.atm.youku.com DOMAIN-SUFFIX,valp.atm.youku.com DOMAIN-SUFFIX,valt.atm.youku.com -DOMAIN-SUFFIX,afd.baidu.com -DOMAIN-SUFFIX,als.baidu.com DOMAIN-SUFFIX,api.cpu.baidu.com DOMAIN-SUFFIX,api.share.baidu.com DOMAIN-SUFFIX,api.youqian.baidu.com @@ -362,18 +317,12 @@ DOMAIN-SUFFIX,cpro.baidustatic.com DOMAIN-SUFFIX,cpro.tieba.baidu.com DOMAIN-SUFFIX,cpro2.baidustatic.com DOMAIN-SUFFIX,dup.baidustatic.com -DOMAIN-SUFFIX,f10.baidu.com -DOMAIN-SUFFIX,hm.baidu.com -DOMAIN-SUFFIX,hmma.baidu.com DOMAIN-SUFFIX,idm.bce.baidu.com DOMAIN-SUFFIX,imageplus.baidu.com DOMAIN-SUFFIX,itsdata.map.baidu.com DOMAIN-SUFFIX,log.music.baidu.com DOMAIN-SUFFIX,log.waimai.baidu.com -DOMAIN-SUFFIX,mobads-logs.baidu.com -DOMAIN-SUFFIX,mobads.baidu.com DOMAIN-SUFFIX,newvector.map.baidu.com -DOMAIN-SUFFIX,nsclick.baidu.com DOMAIN-SUFFIX,offnavi.map.baidu.com DOMAIN-SUFFIX,ps.map.baidu.com DOMAIN-SUFFIX,res.mi.baidu.com @@ -446,12 +395,8 @@ DOMAIN-SUFFIX,a3.img.static.youmi.net DOMAIN-SUFFIX,acceptable.a-ads.com DOMAIN-SUFFIX,acookie.linezing.com DOMAIN-SUFFIX,activity.tuipear.com -DOMAIN-SUFFIX,ad.api.moji.com -DOMAIN-SUFFIX,ad.caiyunapp.com DOMAIN-SUFFIX,ad.cdn.sex -DOMAIN-SUFFIX,ad.yixin.im DOMAIN-SUFFIX,adbma.adk2.co -DOMAIN-SUFFIX,adlaunch.moji.com DOMAIN-SUFFIX,admin5.com DOMAIN-SUFFIX,adplexmedia.adk2.co DOMAIN-SUFFIX,adplexmedia.adk2x.com @@ -473,22 +418,17 @@ DOMAIN-SUFFIX,ads.nexage.com DOMAIN-SUFFIX,ads.ninemsn.com.au DOMAIN-SUFFIX,ads.pubmatic.com DOMAIN-SUFFIX,ads.servebom.com -DOMAIN-SUFFIX,ads.service.kugou.com DOMAIN-SUFFIX,ads.stickyadstv.com DOMAIN-SUFFIX,ads.vamaker.com DOMAIN-SUFFIX,ads.yahoo.com DOMAIN-SUFFIX,ads.yam.com DOMAIN-SUFFIX,ads.yimg.com DOMAIN-SUFFIX,ads.youtube.com -DOMAIN-SUFFIX,adse.ximalaya.com DOMAIN-SUFFIX,adserver.adtech.de DOMAIN-SUFFIX,adserver.adtechus.com DOMAIN-SUFFIX,adserver.snapads.com DOMAIN-SUFFIX,adserver.xpanama.net DOMAIN-SUFFIX,adserver.yahoo.com -DOMAIN-SUFFIX,adsp.xunlei.com -DOMAIN-SUFFIX,adtrack.ucweb.com -DOMAIN-SUFFIX,adui.tg.meitu.com DOMAIN-SUFFIX,advertising.com DOMAIN-SUFFIX,adx-static.ksosoft.com DOMAIN-SUFFIX,adx.ads.oppomobile.com @@ -515,21 +455,17 @@ DOMAIN-SUFFIX,api.appjiagu.com DOMAIN-SUFFIX,api.appsflyer.com DOMAIN-SUFFIX,api.branch.io DOMAIN-SUFFIX,api.cdnbye.com -DOMAIN-SUFFIX,api.newad.ifeng.com DOMAIN-SUFFIX,api.talkingdata.com DOMAIN-SUFFIX,api.tongji.today DOMAIN-SUFFIX,api.w.inmobi.com DOMAIN-SUFFIX,apistaging.airpush.com DOMAIN-SUFFIX,apistat.adbana.com DOMAIN-SUFFIX,apk.static.youmi.net -DOMAIN-SUFFIX,app-measurement.com DOMAIN-SUFFIX,app.50bang.org DOMAIN-SUFFIX,appliedsemantics.com -DOMAIN-SUFFIX,applovin.com DOMAIN-SUFFIX,apps5.oingo.com DOMAIN-SUFFIX,apptv.w.inmobi.com DOMAIN-SUFFIX,appwall.api.airpush.com -DOMAIN-SUFFIX,ark.letv.com DOMAIN-SUFFIX,as.mgtv.com DOMAIN-SUFFIX,ashifen.com DOMAIN-SUFFIX,assets.servedby-buysellads.com @@ -592,7 +528,6 @@ DOMAIN-SUFFIX,cnzz.mmstat.com DOMAIN-SUFFIX,cnzzlink.com DOMAIN-SUFFIX,config-ltvp.inmobi.com DOMAIN-SUFFIX,config.inmobi.com -DOMAIN-SUFFIX,counter.ksosoft.com DOMAIN-SUFFIX,cp.jiajv.net DOMAIN-SUFFIX,cpc.haohaowan8.com DOMAIN-SUFFIX,cxaerp.com @@ -628,11 +563,9 @@ DOMAIN-SUFFIX,ecpm.tanx.com DOMAIN-SUFFIX,ef-dongfeng.tanx.com DOMAIN-SUFFIX,ef.opendsp.tanx.com DOMAIN-SUFFIX,ef.tanx.com -DOMAIN-SUFFIX,epochtimes.com DOMAIN-SUFFIX,eso999.com DOMAIN-SUFFIX,et.tanx.com DOMAIN-SUFFIX,et.w.inmobi.com -DOMAIN-SUFFIX,etl.xlmc.sandai.net DOMAIN-SUFFIX,events.appsflyer.com DOMAIN-SUFFIX,ex.tanx.com DOMAIN-SUFFIX,farm.plista.com @@ -645,8 +578,6 @@ DOMAIN-SUFFIX,fms.ipinyou.com DOMAIN-SUFFIX,folder.adsunflower.com DOMAIN-SUFFIX,fpbb.aizhan.com DOMAIN-SUFFIX,fzxrjx.com -DOMAIN-SUFFIX,g3.letv.com -DOMAIN-SUFFIX,galaxy.bjcathay.com DOMAIN-SUFFIX,gdsc168.com DOMAIN-SUFFIX,gg1028.com DOMAIN-SUFFIX,gia.jd.com @@ -664,8 +595,6 @@ DOMAIN-SUFFIX,i.w.inmobi.com DOMAIN-SUFFIX,i1.go2yd.com DOMAIN-SUFFIX,i1.services.social.microsoft.com DOMAIN-SUFFIX,i1.services.social.microsoft.com.nsatc.net -DOMAIN-SUFFIX,ifacelog.iqiyi.com -DOMAIN-SUFFIX,ifengad.3g.ifeng.com DOMAIN-SUFFIX,iflow.minfo.baofeng.net DOMAIN-SUFFIX,iflow.uczzd.com DOMAIN-SUFFIX,iflow.uczzd.net @@ -677,7 +606,6 @@ DOMAIN-SUFFIX,img.9ads.net DOMAIN-SUFFIX,img1.gtimg.com DOMAIN-SUFFIX,img752.de92.com DOMAIN-SUFFIX,imgcdn.de92.com -DOMAIN-SUFFIX,imp.optaim.com DOMAIN-SUFFIX,impservice.chnl.youdao.com DOMAIN-SUFFIX,impservice.dict.youdao.com DOMAIN-SUFFIX,impservice.dictvista.youdao.com @@ -685,7 +613,6 @@ DOMAIN-SUFFIX,impservice.dictweb.youdao.com DOMAIN-SUFFIX,impservice.dictword.youdao.com DOMAIN-SUFFIX,impservice.mail.youdao.com DOMAIN-SUFFIX,impservice.union.youdao.com -DOMAIN-SUFFIX,impservice.youdao.com DOMAIN-SUFFIX,in.aikan6.com DOMAIN-SUFFIX,in.hkfuy.com DOMAIN-SUFFIX,in.hystq.com @@ -694,7 +621,6 @@ DOMAIN-SUFFIX,in.mxmrt.com DOMAIN-SUFFIX,in.ndtzx.com DOMAIN-SUFFIX,in.pomhz.com DOMAIN-SUFFIX,in.qqhpg.com -DOMAIN-SUFFIX,inmobicdn.net DOMAIN-SUFFIX,j.12365chia.com DOMAIN-SUFFIX,j.appjiagu.com DOMAIN-SUFFIX,jdcbuy.com @@ -711,7 +637,6 @@ DOMAIN-SUFFIX,jstdjq.com DOMAIN-SUFFIX,jyjhkz.com DOMAIN-SUFFIX,jzntxs.com DOMAIN-SUFFIX,kaquansc.com -DOMAIN-SUFFIX,kgmobilestat.kugou.com DOMAIN-SUFFIX,kwcdn.000dn.com DOMAIN-SUFFIX,kwcscdn.000dn.com DOMAIN-SUFFIX,kwflvcdn.000dn.com @@ -726,13 +651,10 @@ DOMAIN-SUFFIX,log.outbrain.com DOMAIN-SUFFIX,log.p2p.hunantv.com DOMAIN-SUFFIX,log.rc.hunantv.com DOMAIN-SUFFIX,log.spotify.com -DOMAIN-SUFFIX,log.stat.kugou.com DOMAIN-SUFFIX,log.tu.baixing.com DOMAIN-SUFFIX,log.umsns.com -DOMAIN-SUFFIX,log.v2.hunantv.com DOMAIN-SUFFIX,log.vcdn.io DOMAIN-SUFFIX,log.videojj.com -DOMAIN-SUFFIX,log.web.kugou.com DOMAIN-SUFFIX,log.weico.cc DOMAIN-SUFFIX,logs.dashlane.com DOMAIN-SUFFIX,logs.newapi.com @@ -754,10 +676,8 @@ DOMAIN-SUFFIX,minghui.com DOMAIN-SUFFIX,mixpanel.com DOMAIN-SUFFIX,mobaders.com DOMAIN-SUFFIX,mobile.log.hunantv.com -DOMAIN-SUFFIX,mobilelog.kugou.com DOMAIN-SUFFIX,mobtop1.com DOMAIN-SUFFIX,ms.analytics.live.com -DOMAIN-SUFFIX,msg.71.am DOMAIN-SUFFIX,new.taobc.com DOMAIN-SUFFIX,news.766ba.net DOMAIN-SUFFIX,news.qhstatic.com @@ -882,7 +802,6 @@ DOMAIN-SUFFIX,statsfe1.ws.microsoft.com DOMAIN-SUFFIX,statsfe2.ws.microsoft.com DOMAIN-SUFFIX,stuff.202m.com DOMAIN-SUFFIX,subo.logger.baofeng.com -DOMAIN-SUFFIX,sugar.zhihu.com DOMAIN-SUFFIX,survey.watson.microsoft.com DOMAIN-SUFFIX,szddst.com DOMAIN-SUFFIX,t.appsflyer.com @@ -915,9 +834,7 @@ DOMAIN-SUFFIX,track.dmp.youmi.net DOMAIN-SUFFIX,track.dragonparking.com DOMAIN-SUFFIX,track.eyeviewads.com DOMAIN-SUFFIX,tracker.yhd.com -DOMAIN-SUFFIX,tracklog.58.com DOMAIN-SUFFIX,trc.taboola.com -DOMAIN-SUFFIX,tuidang.epochtimes.com DOMAIN-SUFFIX,tvupgrade.yunos.com DOMAIN-SUFFIX,u-x.jd.com DOMAIN-SUFFIX,u.123hala.com @@ -928,7 +845,6 @@ DOMAIN-SUFFIX,uimg.123hala.com DOMAIN-SUFFIX,uma.gtags.net DOMAIN-SUFFIX,ums.adtechjp.com DOMAIN-SUFFIX,ums.adtechus.com -DOMAIN-SUFFIX,umtrack.com DOMAIN-SUFFIX,union2.50bang.org DOMAIN-SUFFIX,up1.tj.u2.ucweb.com DOMAIN-SUFFIX,update.123juzi.net @@ -937,12 +853,10 @@ DOMAIN-SUFFIX,ut.gtags.net DOMAIN-SUFFIX,uuidapi.yunos.com DOMAIN-SUFFIX,v.smtcdns.net DOMAIN-SUFFIX,v1-play.log.mgtv.com -DOMAIN-SUFFIX,v1.log.moji.com DOMAIN-SUFFIX,v1.play.log.hunantv.com DOMAIN-SUFFIX,v1.res.log.hunantv.com DOMAIN-SUFFIX,v2.hd.log.hunantv.com DOMAIN-SUFFIX,v2.hdd.log.hunantv.com -DOMAIN-SUFFIX,v2.log.hunantv.com DOMAIN-SUFFIX,v2.log.mgtv.com DOMAIN-SUFFIX,v2.res.log.hunantv.com DOMAIN-SUFFIX,video.plista.com @@ -1011,23 +925,14 @@ DOMAIN-SUFFIX,zhugeio.com DOMAIN-SUFFIX,zjuwjdc.com DOMAIN-SUFFIX,zszrb.com DOMAIN-SUFFIX,zz2.hslyqs.com -DOMAIN,ad.10010.com -DOMAIN,log.b612kaji.com -DOMAIN,log.snssdk.com -DOMAIN,log.star.ele.me -DOMAIN,log.umsns.com -DOMAIN,log.voicecloud.cn -DOMAIN,log.ys7.com -DOMAIN,pagead2.googlesyndication.com -DOMAIN,report.jpush.cn -DOMAIN,s0.2mdn.net -DOMAIN,sp0.baidu.com -DOMAIN,static.jpush.cn -DOMAIN,static.vuevideo.net -DOMAIN,stats.jpush.cn -DOMAIN,stats.umsns.com -DOMAIN,wgo.mmstat.com -DOMAIN,zz.bdstatic.com +DOMAIN-SUFFIX,ad.10010.com +DOMAIN-SUFFIX,log.snssdk.com +DOMAIN-SUFFIX,log.star.ele.me +DOMAIN-SUFFIX,log.ys7.com +DOMAIN-SUFFIX,report.jpush.cn +DOMAIN-SUFFIX,static.jpush.cn +DOMAIN-SUFFIX,static.vuevideo.net +DOMAIN-SUFFIX,stats.jpush.cn DOMAIN-SUFFIX,3lift.com DOMAIN-SUFFIX,56txs4.com DOMAIN-SUFFIX,ad373.com @@ -1075,7 +980,6 @@ DOMAIN-SUFFIX,outbrain.com DOMAIN-SUFFIX,parsely.com DOMAIN-SUFFIX,peak-adx.com DOMAIN-SUFFIX,personaly.click -DOMAIN-SUFFIX,pubnative.net DOMAIN-SUFFIX,quixdtrk.com DOMAIN-SUFFIX,simplepath.com DOMAIN-SUFFIX,skimresources.com @@ -1086,7 +990,6 @@ DOMAIN-SUFFIX,ssl2.duapps.com DOMAIN-SUFFIX,starmobs.com DOMAIN-SUFFIX,storygize.net DOMAIN-SUFFIX,summerhamster.com -DOMAIN-SUFFIX,supersonicads.com DOMAIN-SUFFIX,tango-deg.com DOMAIN-SUFFIX,taplytics.com DOMAIN-SUFFIX,taptica.com @@ -1105,113 +1008,17 @@ DOMAIN-SUFFIX,webspectator.com DOMAIN-SUFFIX,xadchina.cn DOMAIN-SUFFIX,yldbt.com DOMAIN-SUFFIX,ymtracking.com -DOMAIN,apoll.m.taobao.com -DOMAIN,wn.pos.baidu.com -DOMAIN,ps.map.baidu.com -DOMAIN,sv.map.baidu.com -DOMAIN,offnavi.map.baidu.com -DOMAIN,newvector.map.baidu.com -DOMAIN,ulog.imap.baidu.com -DOMAIN,newloc.map.n.shifen.com -DOMAIN,thirdparty.biliapi.com -DOMAIN,cm.bilibili.com -DOMAIN,mbdlog.iqiyi.com -DOMAIN,o2o.api.xiaomi.com -DOMAIN,mqtt.zhihu.com +DOMAIN-SUFFIX,thirdparty.biliapi.com +DOMAIN-SUFFIX,mqtt.zhihu.com DOMAIN-SUFFIX,linktech.cn -DOMAIN-SUFFIX,t7z.cupid.iqiyi.com -DOMAIN-SUFFIX,n.mark.letv.com -DOMAIN-SUFFIX,asimgs.pplive.cn -DOMAIN-SUFFIX,de.as.pptv.com -DOMAIN-SUFFIX,4paradigm.com -DOMAIN-SUFFIX,ad.huajiao.com -DOMAIN-SUFFIX,ad.jiemian.com -DOMAIN-SUFFIX,ad.qingting.fm -DOMAIN-SUFFIX,ad.ximalaya.com DOMAIN-SUFFIX,ad7.on.cc -DOMAIN-SUFFIX,ad-cn.jovcloud.com -DOMAIN-SUFFIX,adm.10jqka.com.cn -DOMAIN-SUFFIX,admarket.21cn.com -DOMAIN-SUFFIX,adnew.wifi8.com -DOMAIN-SUFFIX,adsapi.manhuaren.com -DOMAIN-SUFFIX,adsdk.dmzj.com -DOMAIN-SUFFIX,adsfile.bssdlbig.kugou.com -DOMAIN-SUFFIX,adshow.58.com -DOMAIN-SUFFIX,adshows.21cn.com -DOMAIN-SUFFIX,adxserver.ad.cmvideo.cn -DOMAIN-SUFFIX,al.autohome.com.cn -DOMAIN-SUFFIX,api.joybj.com -DOMAIN-SUFFIX,api.whizzone.com DOMAIN-SUFFIX,app.adjust.com -DOMAIN-SUFFIX,applogapi.autohome.com.cn -DOMAIN-SUFFIX,catch.gift DOMAIN-SUFFIX,dfp.suning.com -DOMAIN-SUFFIX,ggs.myzaker.com DOMAIN-SUFFIX,huodonghezi.com -DOMAIN-SUFFIX,iadmat.nosdn.127.net -DOMAIN-SUFFIX,iadmusicmat.music.126.net -DOMAIN-SUFFIX,imgad0.pconline.com.cn -DOMAIN-SUFFIX,imgadpai.thepaper.cn -DOMAIN-SUFFIX,impservice.dictapp.youdao.com -DOMAIN-SUFFIX,lbs.map.qq.com DOMAIN-SUFFIX,miniapp.bilibili.com -DOMAIN-SUFFIX,mmstat.com -DOMAIN-SUFFIX,mobilead.kuwo.cn -DOMAIN-SUFFIX,mtalk.google.com DOMAIN-SUFFIX,pv.sohu.com -DOMAIN-SUFFIX,rd.autohome.com.cn -DOMAIN-SUFFIX,rich.kuwo.cn -DOMAIN-SUFFIX,thirdparty.biliapi.com -DOMAIN-SUFFIX,yt-adp.nosdn.127.net -DOMAIN-KEYWORD,admaster -DOMAIN-KEYWORD,admdfs -DOMAIN-KEYWORD,adnewnc -DOMAIN-KEYWORD,adsage -DOMAIN-KEYWORD,adsame -DOMAIN-KEYWORD,adsensor -DOMAIN-KEYWORD,adserver -DOMAIN-KEYWORD,adsmogo -DOMAIN-KEYWORD,adsrvmedia -DOMAIN-KEYWORD,adsserving -DOMAIN-KEYWORD,advert -DOMAIN-KEYWORD,adwords -DOMAIN-KEYWORD,allyes -DOMAIN-KEYWORD,analysys -DOMAIN-KEYWORD,applovin -DOMAIN-KEYWORD,appsflyer -DOMAIN-KEYWORD,dnserror -DOMAIN-KEYWORD,domob -DOMAIN-KEYWORD,duomeng -DOMAIN-KEYWORD,dwtrack -DOMAIN-KEYWORD,fenxi -DOMAIN-KEYWORD,googleads -DOMAIN-KEYWORD,guanggao -DOMAIN-KEYWORD,inmobi -DOMAIN-KEYWORD,lianmeng -DOMAIN-KEYWORD,mobaders -DOMAIN-KEYWORD,omgmta -DOMAIN-KEYWORD,omniture -DOMAIN-KEYWORD,openx -DOMAIN-KEYWORD,partnerad -DOMAIN-KEYWORD,securepubads -DOMAIN-KEYWORD,socdm -DOMAIN-KEYWORD,supersonicads -DOMAIN-KEYWORD,taboola -DOMAIN-KEYWORD,traffic -DOMAIN-KEYWORD,uedas -DOMAIN-KEYWORD,umtrack -DOMAIN-KEYWORD,wlmonitor -DOMAIN-KEYWORD,zjtoolbar -DOMAIN-KEYWORD,admarvel -DOMAIN-KEYWORD,adservice -DOMAIN-KEYWORD,crashlytics -DOMAIN-KEYWORD,pingfore -DOMAIN-KEYWORD,tracking -DOMAIN-KEYWORD,umeng -DOMAIN-KEYWORD,usage DOMAIN-SUFFIX,e.xroun.com DOMAIN-SUFFIX,dflooring.com -DOMAIN-SUFFIX,www.googleadservices.com DOMAIN-SUFFIX,googleads.g.doubleclick.net DOMAIN-SUFFIX,appapisdk.tanv.com DOMAIN-SUFFIX,xc.gdt.qq.com @@ -1219,16 +1026,11 @@ DOMAIN-SUFFIX,www.flickr.com DOMAIN-SUFFIX,uop.umeng.com DOMAIN-SUFFIX,api.24kidea.com DOMAIN-SUFFIX,gss0.bdstatic.com -DOMAIN-SUFFIX,alogs.umengcloud.com DOMAIN-SUFFIX,sss.bxmns.com DOMAIN-SUFFIX,extlog.snssdk.com -DOMAIN-SUFFIX,play.googleapis.com DOMAIN-SUFFIX,dcps.nuomi.com DOMAIN-SUFFIX,focusbaiduafp.allyes.com -DOMAIN,em.baidu.com DOMAIN-SUFFIX,m.simaba.taobao.com -DOMAIN,sbeacon.sina.com.cn -DOMAIN,log.sina.cn DOMAIN-SUFFIX,ltsdl.qq.com DOMAIN-SUFFIX,yhzbjz.com DOMAIN-SUFFIX,ordidc.com @@ -1264,39 +1066,67 @@ DOMAIN-SUFFIX,go-mpulse DOMAIN-SUFFIX,optimizely.com DOMAIN-SUFFIX,umsns.com DOMAIN-SUFFIX,x.jd.com -DOMAIN,log.tu.baixing.com -DOMAIN-SUFFIX,sf3-ttcdn-tos.pstatp.com DOMAIN-SUFFIX,ads.api.vungle.com DOMAIN-SUFFIX,ads.wakamoment.tk -DOMAIN,wa.gtimg.com -DOMAIN,dsp.edm.weibo.cn -DOMAIN,e.crashlytics.com -DOMAIN,unidesk.alicdn.com -DOMAIN,cdn-adphone.wenhua.com.cn -DOMAIN,api.e.qq.com -DOMAIN,mi.gdt.qq.com -DOMAIN,net.rayjump.com -DOMAIN,report.adview.cn -DOMAIN-SUFFIX,doubleclick.net -DOMAIN,gorgon.youdao.com -DOMAIN,video.c-ctrip.com -DOMAIN,agn.aty.sohu.com -DOMAIN,map-mobile-opnimg.cdn.bcebos.com -DOMAIN,mf.atm.youku.com -DOMAIN-SUFFIX,mob.com -DOMAIN-SUFFIX,adthor.com -DOMAIN-SUFFIX,flurry.com -DOMAIN-SUFFIX,igexin.com -DOMAIN-SUFFIX,ios.bugly.qq.com -DOMAIN-SUFFIX,iadsdk.apple.com -DOMAIN-KEYWORD,adashx -DOMAIN-KEYWORD,adsystem -DOMAIN-KEYWORD,track -DOMAIN-KEYWORD,talkingdata -DOMAIN-KEYWORD,uploadMobileData +DOMAIN-SUFFIX,dsp.edm.weibo.cn +DOMAIN-SUFFIX,cdn-adphone.wenhua.com.cn +DOMAIN-SUFFIX,api.e.qq.com +DOMAIN-SUFFIX,video.c-ctrip.com +DOMAIN-SUFFIX,agn.aty.sohu.com +DOMAIN-SUFFIX,map-mobile-opnimg.cdn.bcebos.com DOMAIN-SUFFIX,www.jinshanju.com -DOMAIN-SUFFIX,iesdouyin.com DOMAIN-SUFFIX,test-www.douyin.com DOMAIN-SUFFIX,safebrowsing.urlsec.qq.com DOMAIN-SUFFIX,adserver-ad.321mh.com -DOMAIN-SUFFIX,lelefenxi.com \ No newline at end of file +DOMAIN-SUFFIX,lelefenxi.com +DOMAIN-KEYWORD,adservice +DOMAIN-KEYWORD,analytics +DOMAIN-KEYWORD,analysis +DOMAIN-KEYWORD,inmobi +DOMAIN-KEYWORD,adsystem +DOMAIN-KEYWORD,appsflyer +DOMAIN-KEYWORD,fenxi +DOMAIN-KEYWORD,uploadMobileData +DOMAIN-KEYWORD,omniture +DOMAIN-KEYWORD,traffic +DOMAIN-KEYWORD,umeng +DOMAIN-KEYWORD,talkingdata +DOMAIN-KEYWORD,adashx +DOMAIN-KEYWORD,admaster +DOMAIN-KEYWORD,admdfs +DOMAIN-KEYWORD,adnewnc +DOMAIN-KEYWORD,adsage +DOMAIN-KEYWORD,adsame +DOMAIN-KEYWORD,adsensor +DOMAIN-KEYWORD,adserver +DOMAIN-KEYWORD,adsmogo +DOMAIN-KEYWORD,adsrvmedia +DOMAIN-KEYWORD,adsserving +DOMAIN-KEYWORD,advert +DOMAIN-KEYWORD,adwords +DOMAIN-KEYWORD,allyes +DOMAIN-KEYWORD,analysys +DOMAIN-KEYWORD,applovin +DOMAIN-KEYWORD,dnserror +DOMAIN-KEYWORD,domob +DOMAIN-KEYWORD,duomeng +DOMAIN-KEYWORD,dwtrack +DOMAIN-KEYWORD,googleads +DOMAIN-KEYWORD,guanggao +DOMAIN-KEYWORD,lianmeng +DOMAIN-KEYWORD,mobaders +DOMAIN-KEYWORD,omgmta +DOMAIN-KEYWORD,openx +DOMAIN-KEYWORD,partnerad +DOMAIN-KEYWORD,securepubads +DOMAIN-KEYWORD,socdm +DOMAIN-KEYWORD,supersonicads +DOMAIN-KEYWORD,taboola +DOMAIN-KEYWORD,uedas +DOMAIN-KEYWORD,wlmonitor +DOMAIN-KEYWORD,zjtoolbar +DOMAIN-KEYWORD,admarvel +DOMAIN-KEYWORD,crashlytics +DOMAIN-KEYWORD,pingfore +DOMAIN-KEYWORD,tracking +DOMAIN-KEYWORD,usage \ No newline at end of file diff --git a/Surge/Apple.list b/Surge/Apple.list new file mode 100644 index 0000000000..5ca581cf91 --- /dev/null +++ b/Surge/Apple.list @@ -0,0 +1,74 @@ +# This ruleset includes 99% of apple inc network connections(global). If there are any missing, please PR. + +DOMAIN-SUFFIX,apple.co +DOMAIN-SUFFIX,apple.cn +DOMAIN-SUFFIX,apple.com +DOMAIN-SUFFIX,apple.com.cn +DOMAIN-SUFFIX,apple.com.cdn20.com +DOMAIN-SUFFIX,apple.com.mwcloudcdn.com +DOMAIN-SUFFIX,apple.com.mwcname.com +DOMAIN-SUFFIX,apple.news +DOMAIN-SUFFIX,appsto.re +DOMAIN-SUFFIX,appstore.com +DOMAIN-SUFFIX,cdn-apple.com +DOMAIN-SUFFIX,apple-cloudkit.com +DOMAIN-SUFFIX,apple-dns.net +DOMAIN-SUFFIX,apple-livephotoskit.com +DOMAIN-SUFFIX,apple-mapkit.com +DOMAIN-SUFFIX,itunes.com.edgekey.net +DOMAIN-SUFFIX,apple.com.edgekey.net +DOMAIN-SUFFIX,apple-support.akadns.net +DOMAIN-SUFFIX,apple.com.edgekey.net.globalredir.akadns.net +DOMAIN-SUFFIX,aaplimg.com +DOMAIN-SUFFIX,crashlytics.com +DOMAIN-SUFFIX,digicert.com +DOMAIN-SUFFIX,itunes.com +DOMAIN-SUFFIX,me.com +DOMAIN-SUFFIX,mzstatic.com +DOMAIN-SUFFIX,apple + +DOMAIN,apple.comscoreresearch.com + +DOMAIN-KEYWORD,icloud +DOMAIN-KEYWORD,testflight +DOMAIN-KEYWORD,apple.com.akadns.net + +IP-CIDR,139.178.128.0/18,no-resolve +IP-CIDR,144.178.0.0/19,no-resolve +IP-CIDR,144.178.36.0/22,no-resolve +IP-CIDR,144.178.48.0/20,no-resolve +IP-CIDR,192.35.50.0/24,no-resolve +IP-CIDR,198.183.17.0/24,no-resolve +IP-CIDR,205.180.175.0/24,no-resolve +IP-CIDR,63.92.224.0/19,no-resolve +IP-CIDR,65.199.22.0/23,no-resolve +IP-CIDR,17.0.0.0/8,no-resolve +IP-CIDR6,2403:300::/32,no-resolve +IP-CIDR6,2620:149::/32,no-resolve +IP-CIDR6,2a01:b740::/32,no-resolve +IP-CIDR6,2a01:b747::/32,no-resolve + + +USER-AGENT,%E5%9C%B0%E5%9B%BE* +USER-AGENT,%E6%9F%A5%E6%89%BE* +USER-AGENT,%E8%AE%BE%E7%BD%AE* +USER-AGENT,*WeatherFoundation* +USER-AGENT,*com.apple.mobileme.fmip1* +USER-AGENT,AppStore* +USER-AGENT,AppleNews* +USER-AGENT,AppleTV* +USER-AGENT,FMDClient* +USER-AGENT,FMFD* +USER-AGENT,FindMy* +USER-AGENT,Maps* +USER-AGENT,Music* +USER-AGENT,TestFlight* +USER-AGENT,com.apple.Maps* +USER-AGENT,com.apple.appstored* +USER-AGENT,com.apple.geod* +USER-AGENT,com.apple.news* +USER-AGENT,com.apple.trustd* +USER-AGENT,com.apple.tv* +USER-AGENT,fmflocatord* +USER-AGENT,geod* +USER-AGENT,locationd* \ No newline at end of file diff --git a/Surge/Bilibili.list b/Surge/Bilibili.list new file mode 100644 index 0000000000..662803c9f0 --- /dev/null +++ b/Surge/Bilibili.list @@ -0,0 +1,13 @@ +# 该规则集用于配合bilibili自动地区脚本使用。 +DOMAIN,api.biliapi.com +DOMAIN,api.biliapi.net +DOMAIN,api.bilibili.com +DOMAIN,app.biliapi.com +DOMAIN,app.biliapi.net +DOMAIN,app.bilibili.com +DOMAIN,grpc.biliapi.net +DOMAIN,m.bilibili.com +DOMAIN,upos-hz-mirrorakam.akamaized.net +DOMAIN,www.bilibili.com +DOMAIN-KEYWORD,cn-hk-eq-bcache- +IP-CIDR,121.11.192.0/24,no-resolve \ No newline at end of file diff --git a/Surge/Download.list b/Surge/Download.list index ec38afe3dc..c6be58c274 100644 --- a/Surge/Download.list +++ b/Surge/Download.list @@ -8,17 +8,13 @@ PROCESS-NAME,Transmission PROCESS-NAME,uTorrent PROCESS-NAME,WebTorrent PROCESS-NAME,WebTorrent Helper -# bt -DOMAIN-SUFFIX,smtp -DOMAIN-KEYWORD,aria2 -URL-REGEX,(Subject|HELO|SMTP) -URL-REGEX,(api|ps|sv|offnavi|newvector|ulog.imap|newloc)(.map|).(baidu|n.shifen).com -URL-REGEX,(.+.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan).(cn|com) -URL-REGEX,(.+.)?(torrent|announce.php?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=|xunlei)(..+)? -# XunLei -URL-REGEX,(.?)(xunlei|sandai|Thunder|XLLiveUD)(.) PROCESS-NAME,DownloadService -# 360 -URL-REGEX,(.+\.|^)(360|so)\.(cn|com) -# Tencent Weiyun PROCESS-NAME,Weiyun + +# bt +DOMAIN-KEYWORD,aria2 +DOMAIN-KEYWORD,xunlei +DOMAIN-KEYWORD,yunpan +DOMAIN-KEYWORD,Thunder +DOMAIN-KEYWORD,XLLiveUD +URL-REGEX,(torrent|announce.php\?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=) diff --git a/Surge/JS/91ShortVideo.js b/Surge/JS/91ShortVideo.js deleted file mode 100644 index 6bc19ea808..0000000000 --- a/Surge/JS/91ShortVideo.js +++ /dev/null @@ -1,26 +0,0 @@ -/* -91 short video unlock vip -app download link : http://i91.porn - -QX1.0.0: -^https?:\/\/.+\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5})?\/api.php$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/File/91.js - -Surge4.0: -http-request ^https?:\/\/.+\.(my10api|(.*91.*))\.(com|tips|app|xyz)(:\d{2,5})?\/api.php$ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/91ShortVideo.js -*/ - -let length = $request.headers['Content-Length']; -if(length == 462 || length == 464 || length == 466 || length == 570 || length == 572 || length == 574) { -const obj = {"errcode":0,"timestamp":1571637384,"data":"FCA27C420C9BC230C86627D052F62E5E04CC1B51BF986A7C60673DC92F82697E9EB8C7BFB5AA267AC87399CDF8DBD1B1B25FEA57E27F38D0FCFB0CA5CFD8ED7B809FBCF3372C4DBB22083C4BC85A039512735A83834D7450EFD24EA2712FF841050BE99B7A4A31BBFCBE28BD3522227838BABE6E372874533E51A59A81CBFCB9C943C5C9646091E408D3B68BF6122DA929D558290D186EFBA2BE8019B86E35CB174626952650A959CA1A116ADCF1B14773DB033A8055E56F673682219629775138CDF3C653A0179232C8B653FDEB45D704140F8CA0C7716A02E5F7ED7CB41A68A247E9ECC0B744318534B0501865FBDF68AA1E7167663B59EDD8C56114E4A52B52A2020CA89B0F06F9D626BE3446ED5BF64E2FEE7AEA815CC047DBF3AE0F07DF1B4856070430ECF72AA542E22AF59861F2E48099C6E2CF2C1E3DD938196CB40FEE135A61AC76AAE6011C5A126CF9477AA0FDB76BE94279B66063E93E0FC8CFD802D0E2326B462EE26BF073E22B19A60F8BAF74C891DC57B18C8EFA091C9C66B6E94468E9A7165403A0CD2A3D45B23B2A0A43CEEF16FAF704866B6AC10686C8B6C65FB43DFDA9F531576815E7337E640C22870D8E9E4F1AEB6B5386BA48B264FBE302B2D0724C8D8FE9A147397BF8046114C06A99DF953E43ADBBBD3EBC538AEFC02091156B2782C482F17792D4D9FADBA46FB1BA8491146EC2393AB5C26C33CF0B61854D5492D2171A09AA147ACD9FD75798F43154E70624740A08F49507EF296B9B6FC54680C4A8AC265CF7717C8FA646207BF97A0B8241736FAA61EFB1F828545F515940F7873B20E6A1ABE055746F72F03EF49AAACA30A9C2EEF8E5CDE41BE80B1E5B66F485062F70B36A3ACE30116E062B06F95B404291398337E9449C919C096DE09DDF772CBC7373678AE532AB190C02414F2E0777C62679E5B6790D40FB17D832B4A27308D48D53B2A2302F0616BA6ECDD78947205456B0C063EF1EFE54125131F6755971C4DC84087135A89AFBC9BEC74C530BE9A22067A503DC535F0BF9DA16EE2BE41AF891C1A1A55F7B8522A6CA3D7044740316CAA2A25DE5DE1E67DA72E60FE46B5E49029852C859F2ACDDC57233F47AB3C4290E67B851A55B7C834D4A5DFE3E0E16344D0AF027E70ED05E269DBC955AAC496F0A9F794DD8E5059FA73D6A1A249B9E91921A48FE2CC639B29D97073FD936993E9B4634EAE4F805E1F5F65001FA81EE94FF142FE48C6D25CCE206F8731FFE321611ED0C9D95511B3AD30E43F668409A32742C0383A6B3B43663FAEF31F334C83EC641CC451D2FCBA2287E825206A7A2E980E53C2B6D3F39D4581E96719632425518F8CF04FEA775F6F828B75E7EF3C0F36D952DCA728955DADB3D501FFEA09E21D272912DFA4C5DE82B02A459E94100B522A86BA27D841B26754179606DC9C3A25968A915EB070431DA31E76C8C3F8F689957ECE7CB4644EAA545A8EBC151466554120767BC4353B0D252C566A535182AF6B53247A2C024DAA12E9EEDE31F6988804444E40157429F832BA8A959B9A62449ED822D1532BD52870B46BDA1509C1C9619F1EFDF4EA5BC9C1A49B3EF91B0FF3548C78905D248FD5195843A447F4BAFF13965303A0B9B719327698E2D679B43D4D25A8F4CDB316CD21E6C88E21A98187930C82EB616ABE917E1C2B5C045D97CDD41FA65E999F9B7FFEDAAE0F9B735A9BAC94533A2A14B3D4413E4723D947D23CA48E52A67A6506B647810F45B92AB1703C068E67EF1ECA8C3D3BF2149AEC9C0CD623850338445088C3AFA3CC08D30BF12CFA448A10C4E3C4AA5108F9DC1C7D223A0E1A89B01B1C64DB2DFEFBABC32C4F3EAEA6EA39587D44512E9A3F579844974974EEDDC125EA3A56F3821C9FE387CEA62C37160633E14E99A33FC0CB68D19F58EB6A93380476C01A7A0E9631412BEAD87FDCE17DECA4E475A47B0D6DD82D7EDBCC677D487220B172FED1E26AAA00A1771B11A281F6CC3E9582862331765E162033025DBCD8FC9CC3E50A27C72940A5E0C7692E5B474D132FB11D017706D9D653E1731E5EFC1337A964EB9F0C1865FE475421816ADC7ADACE6FAFA6BA0D8B7FECF766B640D5944254BC9DD638BAB91313DF77C91A8FB74012873AFCB3EACF18CA8D1C67EE16F6F83CA22D59F5D577F5B0844D4FFBC1A6D9C37F5848CB672E32AA48445A1B6D6837CCF98E4D4FE49B5F62186940F868473BA71F2C68C62687D9E5BB4B01E5E079A040275D86E66559025E6253D1759559B1FA60F48B7AC130F0070D21C0E38CDCF63DD755CD790FD3990109A3B856422E8118C5075D6EDFB58EFF8AA4401871036ADB9F766F9FC895F317A9D9DF38BD6E0D3E671BBE79F2C4BC8811F5E94A878D0E922FBAC4C86","sign":"ef2e632c4db0576da759f1d5abd2dd1a"}; -var data = { - body: JSON.stringify(obj), - headers: { - "Content-Type": "text/html" - } -}; -$done({response: data}); -} else { -$done({}) -} - -// From NobyDa, Welcome to focus on my TG channel @NobyDa \ No newline at end of file diff --git a/Surge/JS/Aweme.js b/Surge/JS/Aweme.js deleted file mode 100644 index 955e03ec1d..0000000000 --- a/Surge/JS/Aweme.js +++ /dev/null @@ -1,60 +0,0 @@ -/* -[URL Rewrite] -^https://aweme-eagle(.*)\.snssdk\.com/aweme/v2/ https://aweme-eagle$1.snssdk.com/aweme/v1/ 302 - -[Script] -http-response ^https://[\s\S]*\/aweme/v1/(feed|aweme/post|follow/feed)/ requires-body=1,max-size=-1,script-path=https://Choler.github.io/Surge/Script/Aweme.js - -[MITM] -hostname = *.amemv.com, *.snssdk.com -*/ - -let arr = { - "allow_download": true, - "share_type": 0, - "show_progress_bar": 0, - "draft_progress_bar": 0, - "allow_duet": true, - "allow_react": true, - "prevent_download_type": 2, - "allow_dynamic_wallpaper": false -}; -let body = $response.body.replace(/watermark=1/g, "watermark=0"); -var obj = JSON.parse(body); -if (obj.aweme_list) { - for (var i = obj.aweme_list.length - 1; i >= 0; i--) { - if (obj.aweme_list[i].raw_ad_data) { - obj.aweme_list.splice(i, 1); - } - if (obj.aweme_list[i].poi_info) { - delete obj.aweme_list[i].poi_info; - } - if (obj.aweme_list[i].sticker_detail) { - delete obj.aweme_list[i].sticker_detail; - } - if (obj.aweme_list[i].simple_promotions) { - delete obj.aweme_list[i].simple_promotions; - } - obj.aweme_list[i].status.reviewed = 1; - obj.aweme_list[i].video_control = arr; - } - $done({body: JSON.stringify(obj)}); -} else if (obj.data) { - for (var i = obj.data.length - 1; i >= 0; i--) { - if (obj.data[i].aweme) { - if (obj.data[i].aweme.poi_info) { - delete obj.data[i].aweme.poi_info; - } - if (obj.data[i].aweme.simple_promotions) { - delete obj.data[i].aweme.simple_promotions; - } - obj.data[i].aweme.status.reviewed = 1; - obj.data[i].aweme.video_control = arr; - } else { - obj.data.splice(i, 1); - } - } - $done({body: JSON.stringify(obj)}); -} else { - $done({body}); -} \ No newline at end of file diff --git a/Surge/JS/BaiduCloud.js b/Surge/JS/BaiduCloud.js index ee26809faa..68cdcaa774 100644 --- a/Surge/JS/BaiduCloud.js +++ b/Surge/JS/BaiduCloud.js @@ -1,46 +1,59 @@ /* -Baidu netdisc unlocks online video play speed. - -Surge4.0: -http-response https:\/\/pan\.baidu\.com\/rest\/2\.0\/membership\/user requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js - -QX1.0.0: -https:\/\/pan\.baidu\.com\/rest\/2\.0\/membership\/user url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js - -MITM = pan.baidu.com -*/ - -let obj = JSON.parse($response.body); -obj = { -  "product_infos": [{ -    "product_id": "5310897792128633390", -    "start_time": 1417260485, -    "end_time": 2147483648, -    "buy_time": "1417260485", -    "cluster": "offlinedl", -    "detail_cluster": "offlinedl", -    "product_name": "gz_telecom_exp" - }, { -    "product_name": "svip2_nd", -    "product_description": "超级会员", -    "function_num": 0, -    "start_time": 1553702399, -    "buy_description": "", -    "buy_time": 0, -    "product_id": "1", -    "auto_upgrade_to_svip": 0, -    "end_time": 1672502399, -    "cluster": "vip", -    "detail_cluster": "svip", -    "status": 0 - }], -  "currenttime": 1573473597, -  "reminder": { -    "reminderWithContent": [], -    "advertiseContent": [] - }, -  "request_id": 7501873289383874371 -}; -$done({body: JSON.stringify(obj)}); - -//Key data from thor filter \ No newline at end of file +百度网盘 解锁在线视频倍率/清晰度 + +*************************** +QuantumultX: + +[rewrite_local] +https:\/\/pan\.baidu\.com\/rest\/\d\.\d\/membership\/user url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js + +[mitm] +hostname = pan.baidu.com + +*************************** +Surge4 or Loon: + +[Script] +http-response https:\/\/pan\.baidu\.com\/rest\/\d\.\d\/membership\/user requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/BaiduCloud.js + +[MITM] +hostname = pan.baidu.com + +**************************/ + +if ($response.body) { + $done({ + body: JSON.stringify({ + "product_infos": [{ + "product_id": "5310897792128633390", + "start_time": 1417260485, + "end_time": 2147483648, + "buy_time": "1417260485", + "cluster": "offlinedl", + "detail_cluster": "offlinedl", + "product_name": "gz_telecom_exp" + }, { + "product_name": "svip2_nd", + "product_description": "超级会员", + "function_num": 0, + "start_time": 1553702399, + "buy_description": "", + "buy_time": 0, + "product_id": "1", + "auto_upgrade_to_svip": 0, + "end_time": 1872502399, + "cluster": "vip", + "detail_cluster": "svip", + "status": 0 + }], + "currenttime": 1573473597, + "reminder": { + "reminderWithContent": [], + "advertiseContent": [] + }, + "request_id": 7501873289383874371 + }) + }); +} else { + $done({}); +} \ No newline at end of file diff --git a/Surge/JS/Bili_Auto_Regions.js b/Surge/JS/Bili_Auto_Regions.js new file mode 100644 index 0000000000..8f16333e47 --- /dev/null +++ b/Surge/JS/Bili_Auto_Regions.js @@ -0,0 +1,368 @@ +/************************** + +哔哩哔哩(白图标外区版), 港澳台番剧自动切换地区 & 显示豆瓣评分 + +如需禁用豆瓣评分或策略通知, 可前往BoxJs设置. +BoxJs订阅地址: https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +Update: 2023.02.11 +Author: @NobyDa +Use: Surge, QuanX, Loon + +**************************** +港澳台自动切换地区说明 : +**************************** + +地区自动切换功能仅适用于Surge4.7+(iOS),Loon2.1.10(286)+,QuanX1.0.22(543)+ +低于以上版本仅显示豆瓣评分. + +您需要配置相关规则集: +Surge、Loon: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Bilibili.list + +QuanX: +https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Bilibili.list + +绑定相关select或static策略组,并且需要具有相关的区域代理服务器纳入您的子策略中,子策略可以是服务器也可以是其他区域策略组. +最后,您可以通过BoxJs设置策略名和子策略名,或者手动填入脚本. + +如需搜索指定地区番剧, 可在搜索框添加后缀" 港", " 台", " 中". 例如: 进击的巨人 港 + +QX用户注: 使用切换地区功能请确保您的QX=>其他设置=>温和策略机制处于关闭状态, 以及填写策略名和子策略名时注意大小写. + +**************************** +Surge 4.7+ 远程脚本配置 : +**************************** +[Script] +Bili Region = type=http-response,pattern=^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/(pgc\/view\/v\d\/app\/season|x\/offline\/version)\?,requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js + +#可选, 适用于搜索指定地区的番剧 +Bili Search = type=http-request,pattern=^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/x\/v\d\/search(\/type)?\?.+?%20(%E6%B8%AF|%E5%8F%B0|%E4%B8%AD)&,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js + +[MITM] +hostname = ap?.bili*i.com, ap?.bili*i.net + +**************************** +Quantumult X 远程脚本配置 : +**************************** +[rewrite_local] +^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/(pgc\/view\/v\d\/app\/season|x\/offline\/version)\? url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js + +#可选, 适用于搜索指定地区的番剧 +^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/x\/v\d\/search(\/type)?\?.+?%20(%E6%B8%AF|%E5%8F%B0|%E4%B8%AD)& url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js + +[mitm] +hostname = ap?.bili*i.com, ap?.bili*i.net + +[filter_local] +#可选, 由于qx纯tun特性, 不添加规则可能会导致脚本失效. https://github.com/NobyDa/Script/issues/382 +ip-cidr, 203.107.1.1/24, reject + +**************************** +Loon 远程脚本配置 : +**************************** +[Script] +http-response ^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/(pgc\/view\/v\d\/app\/season|x\/offline\/version)\? script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js, requires-body=true, tag=bili自动地区 + +#可选, 适用于搜索指定地区的番剧 +http-request ^https:\/\/ap(p|i)\.bili(bili|api)\.(com|net)\/x\/v\d\/search(\/type)?\?.+?%20(%E6%B8%AF|%E5%8F%B0|%E4%B8%AD)& script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Bili_Auto_Regions.js, tag=bili自动地区(搜索) + +[Mitm] +hostname = ap?.bili*i.com, ap?.bili*i.net + +***************************/ + +let $ = nobyda(); +let run = EnvInfo(); + +async function SwitchRegion(title, url, body) { + const Group = $.read('BiliArea_Policy') || '📺 DomesticMedia'; //Your blibli policy group name. + const CN = $.read('BiliArea_CN') || 'DIRECT'; //Your China sub-policy name. + const TW = $.read('BiliArea_TW') || '🇹🇼 sub-policy'; //Your Taiwan sub-policy name. + const HK = $.read('BiliArea_HK') || '🇭🇰 sub-policy'; //Your HongKong sub-policy name. + const DF = $.read('BiliArea_DF') || '🏁 sub-policy'; //Sub-policy name used after region is blocked(e.g. url 404) + const off = $.read('BiliArea_disabled') || ''; //WiFi blacklist(disable region change), separated by commas. + const current = await $.getPolicy(Group); + const area = (() => { + let select = {}; + let chtMatch = title && title.split('').some(v => zhHans().includes(v)); + if (/\u6e2f[\u4e00-\u9fa5]+\u5340|%20%E6%B8%AF&/.test(title || url)) { + const test = /\u53f0[\u4e00-\u9fa5]+\u5340/.test(title); + if (current != HK && (current == TW && test ? 0 : 1)) + select = { policy: HK, mode: '香港' }; + } else if (/\u53f0[\u4e00-\u9fa5]+\u5340|%20%E5%8F%B0&/.test(title || url)) { + if (current != TW) select = { policy: TW, mode: '台湾' }; + } else if (body.code === -404 || chtMatch) { + if (current != DF) select = { policy: DF, mode: '后备' }; + } else if (current != CN) { + select = { policy: CN, mode: '直连' }; + } + if ($.isQuanX && current === 'direct' && select.policy === 'DIRECT') { + select = {}; //prevent loopback in some cases + } + return select; + })() + + if (area.policy && !off.includes($.ssid || undefined)) { + const change = await $.setPolicy(Group, area.policy); + const msg = (() => { + if (change && typeof current !== 'number') { + return `${current} ➤ ${area.policy}`; + } else if (current === 2) { + return `策略组名未填写或填写有误 ⚠️` + } else if (current === 3) { + return `不支持您的VPN应用版本 ⚠️` + } else if (change === 0) { + return `子策略名未填写或填写有误 ⚠️` + } else { + return `未知错误 ⚠️` + } + })() + if ($.read('BiliAreaNotify') === 'true') { + console.log(`${title || ''}\n模式: 策略组使用"${area.mode}"子策略\n走向: ${msg}`); + } else { + $.notify(title || '', ``, `模式: 策略组使用"${area.mode}"子策略\n走向: ${msg}`); + } + if (change) { + return true; + } + } + return false; +} + +function EnvInfo() { + const url = $request.url; + if (typeof ($response) !== 'undefined') { + const raw = JSON.parse($response.body || "{}"); + const data = raw.data || raw.result || {}; + const title = [data.title, data.series && data.series.series_title, data.season_title] + .filter(c => /\u5340\uff09/.test(c))[0] || data.title; + SwitchRegion(title, null, raw) + .then(s => s ? $done({ + status: $.isQuanX ? "HTTP/1.1 307" : 307, + headers: { + Location: url + }, + body: "{}" + }) : QueryRating(raw, data)); + } else { + const res = { + url: url.replace(/%20(%E6%B8%AF|%E5%8F%B0|%E4%B8%AD)&/g, '&') + }; + SwitchRegion(null, url, {}).then(() => $done(res)); + } +} + +async function QueryRating(body, play) { + try { + const ratingEnabled = $.read('BiliDoubanRating') === 'false'; + if (!ratingEnabled && play.title && body.data && body.data.badge_info) { + const [t1, t2] = await Promise.all([ + GetRawInfo(play.title.replace(/\uff08[\u4e00-\u9fa5]+\u5340\uff09/, '')), + GetRawInfo(play.origin_name) + ]); + const exYear = body.data.publish.release_date_show.split(/^(\d{4})/)[1]; + const info1 = (play.staff && play.staff.info) || ''; + const info2 = (play.actor && play.actor.info) || ''; + const info3 = (play.celebrity && play.celebrity.map(n => n.name).join('/')) || ''; + const filterInfo = [play.title, play.origin_name, info1 + info2 + info3, exYear]; + const [rating, folk, name, id, other] = ExtractMovieInfo([...t1, ...t2], filterInfo); + const limit = JSON.stringify(body.data.modules) + .replace(/"\u53d7\u9650"/g, `""`).replace(/("area_limit":)1/g, '$10'); + body.data.modules = JSON.parse(limit); + body.data.detail = body.data.new_ep.desc.replace(/连载中,/, ''); + body.data.badge_info.text = `⭐️ 豆瓣:${!$.is403 ? `${rating || '无评'}分 (${folk || '无评价'})` : `查询频繁!`}`; + body.data.evaluate = `${body.data.evaluate || ''}\n\n豆瓣评分搜索结果: ${JSON.stringify(other, 0, 1)}`; + body.data.new_ep.desc = name; + body.data.styles.unshift({ + name: "⭐️ 点击此处打开豆瓣剧集详情页", + url: `https://m.douban.com/${id ? `movie/subject/${id}/` : `search/?query=${encodeURI(play.title)}`}` + }); + } + } catch (err) { + console.log(`Douban rating: \n${err}\n`); + } finally { + $done({ + body: JSON.stringify(body) + }); + } +} + +function ExtractMovieInfo(ret, fv) { + const sole = new Set(ret.map(s => JSON.stringify(s))); //delete duplicate + const f1 = [...sole].map(p => JSON.parse(p)) + .filter(t => { + t.accuracy = 0; + if (t.name && fv[0]) { //title + if (t.name.includes(fv[0].slice(0, 4))) t.accuracy++; + if (t.name.includes(fv[0].slice(-3))) t.accuracy++; + } + if (t.origin && fv[1]) { //origin title + if (t.origin.includes(fv[1].slice(0, 4))) t.accuracy++; + if (t.origin.includes(fv[1].slice(-3))) t.accuracy++; + } + if (t.pd && fv[2]) { //producer or actor + const len = t.pd.split('/').filter(c => fv[2].includes(c)); + t.accuracy += len.length; + } + if (t.year && fv[3] && t.year == fv[3]) t.accuracy++; //year + return Boolean(t.accuracy); + }); + let x = {}; //assign most similar + const f2 = f1.reduce((p, c) => c.accuracy > p ? (x = c, c.accuracy) : p, 0); + return [x.rating, x.folk, x.name, x.id, f1]; +} + +function GetRawInfo(t) { + let res = []; + let st = Date.now(); + return new Promise((resolve) => { + if (!t) return resolve(res); + $.get({ + url: `https://www.douban.com/search?cat=1002&q=${encodeURIComponent(t)}`, + headers: { + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', + 'Cookie': JSON.stringify(st) + } + }, (error, resp, data) => { + if (error) { + console.log(`Douban rating: \n${t}\nRequest error: ${error}\n`); + } else { + if (/\u767b\u5f55<\/a>\u540e\u91cd\u8bd5\u3002/.test(data)) $.is403 = true; + let s = data.replace(/\n| |&#\d{2}/g, '') + .match(/\[(\u7535\u5f71|\u7535\u89c6\u5267)\].+?subject-cast\">.+?<\/span>/g) || []; + for (let i = 0; i < s.length; i++) { + res.push({ + name: s[i].split(/\}\)">(.+?)<\/a>/)[1], + origin: s[i].split(/\u540d:(.+?)(\/|<)/)[1], + pd: s[i].split(/\u539f\u540d.+?\/(.+?)\/\d+<\/span>$/)[1], + rating: s[i].split(/">(\d\.\d)$/)[1] + }) + } + let et = ((Date.now() - st) / 1000).toFixed(2); + console.log(`Douban rating: \n${t}\n${res.length} movie info searched. (${et} s)\n`); + } + resolve(res); + }) + }) +} + +function nobyda() { + const isHTTP = typeof $httpClient != "undefined"; + const isLoon = typeof $loon != "undefined"; + const isQuanX = typeof $task != "undefined"; + const isSurge = typeof $network != "undefined" && typeof $script != "undefined"; + const ssid = (() => { + if (isQuanX && typeof ($environment) !== 'undefined') { + return $environment.ssid; + } + if (isSurge && $network.wifi) { + return $network.wifi.ssid; + } + if (isLoon) { + return JSON.parse($config.getConfig()).ssid; + } + })(); + const notify = (title, subtitle, message) => { + console.log(`${title}\n${subtitle}\n${message}`); + if (isQuanX) $notify(title, subtitle, message); + if (isHTTP) $notification.post(title, subtitle, message); + } + const read = (key) => { + if (isQuanX) return $prefs.valueForKey(key); + if (isHTTP) return $persistentStore.read(key); + } + const adapterStatus = (response) => { + if (!response) return null; + if (response.status) { + response["statusCode"] = response.status; + } else if (response.statusCode) { + response["status"] = response.statusCode; + } + return response; + } + const getPolicy = (groupName) => { + if (isSurge) { + if (typeof ($httpAPI) === 'undefined') return 3; + return new Promise((resolve) => { + $httpAPI("GET", "v1/policy_groups/select", { + group_name: encodeURIComponent(groupName) + }, (b) => resolve(b.policy || 2)) + }) + } + if (isLoon) { + if (typeof ($config.getPolicy) === 'undefined') return 3; + const getName = $config.getPolicy(groupName); + return getName || 2; + } + if (isQuanX) { + if (typeof ($configuration) === 'undefined') return 3; + return new Promise((resolve) => { + $configuration.sendMessage({ + action: "get_policy_state" + }).then(b => { + if (b.ret && b.ret[groupName]) { + resolve(b.ret[groupName][1]); + } else resolve(2); + }, () => resolve()); + }) + } + } + const setPolicy = (group, policy) => { + if (isSurge && typeof ($httpAPI) !== 'undefined') { + return new Promise((resolve) => { + $httpAPI("POST", "v1/policy_groups/select", { + group_name: group, + policy: policy + }, (b) => resolve(!b.error || 0)) + }) + } + if (isLoon && typeof ($config.getPolicy) !== 'undefined') { + const set = $config.setSelectPolicy(group, policy); + return set || 0; + } + if (isQuanX && typeof ($configuration) !== 'undefined') { + return new Promise((resolve) => { + $configuration.sendMessage({ + action: "set_policy_state", + content: { + [group]: policy + } + }).then((b) => resolve(!b.error || 0), () => resolve()); + }) + } + } + const get = (options, callback) => { + if (isQuanX) { + options["method"] = "GET"; + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isHTTP) { + if (isSurge) options.headers['X-Surge-Skip-Scripting'] = false; + $httpClient.get(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + } + return { + getPolicy, + setPolicy, + isSurge, + isQuanX, + isLoon, + notify, + read, + ssid, + get + } +} + +// https://zh.wikipedia.org/wiki/Wikipedia:Unihan%E7%B9%81%E7%AE%80%E4%BD%93%E5%AF%B9%E7%85%A7%E8%A1%A8/%E7%B9%81%E7%AE%80%E4%B8%80%E4%B8%80%E5%AF%B9%E5%BA%94%E8%A1%A8 +function zhHans() { + return `䊷䋙䝼䰾䲁丟並乾亂亞佇馀併來侖侶俁係俔俠倀倆倈倉個們倫偉側偵偽傑傖傘備傭傯傳傴債傷傾僂僅僉僑僕僞僥僨價儀儂億儈儉儐儔儕儘償優儲儷儺儻儼兌兒兗內兩冊冪凈凍凜凱別刪剄則剋剎剗剛剝剮剴創劃劇劉劊劌劍劑勁動務勛勝勞勢勩勱勵勸勻匭匯匱區協卻厙厠厭厲厴參叄叢吒吳吶呂咼員唄唚問啓啞啟啢喎喚喪喬單喲嗆嗇嗊嗎嗚嗩嗶嘆嘍嘔嘖嘗嘜嘩嘮嘯嘰嘵嘸嘽噓噝噠噥噦噯噲噴噸噹嚀嚇嚌嚕嚙嚦嚨嚲嚳嚴嚶囀囁囂囅囈囑囪圇國圍園圓圖團垵埡埰執堅堊堖堝堯報場塊塋塏塒塗塢塤塵塹墊墜墮墳墻墾壇壈壋壓壘壙壚壞壟壠壢壩壯壺壼壽夠夢夾奐奧奩奪奬奮奼妝姍姦娛婁婦婭媧媯媼媽嫗嫵嫻嫿嬀嬈嬋嬌嬙嬡嬤嬪嬰嬸孌孫學孿宮寢實寧審寫寬寵寶將專尋對導尷屆屍屓屜屢層屨屬岡峴島峽崍崗崢崬嵐嶁嶄嶇嶔嶗嶠嶢嶧嶮嶴嶸嶺嶼巋巒巔巰帥師帳帶幀幃幗幘幟幣幫幬幹幺幾庫廁廂廄廈廚廝廟廠廡廢廣廩廬廳弒弳張強彈彌彎彙彞彥後徑從徠復徵徹恆恥悅悞悵悶惡惱惲惻愛愜愨愴愷愾慄態慍慘慚慟慣慤慪慫慮慳慶憂憊憐憑憒憚憤憫憮憲憶懇應懌懍懟懣懨懲懶懷懸懺懼懾戀戇戔戧戩戰戱戲戶拋拾挩挾捨捫掃掄掗掙掛採揀揚換揮損搖搗搵搶摑摜摟摯摳摶摻撈撏撐撓撝撟撣撥撫撲撳撻撾撿擁擄擇擊擋擓擔據擠擬擯擰擱擲擴擷擺擻擼擾攄攆攏攔攖攙攛攜攝攢攣攤攪攬敗敘敵數斂斃斕斬斷時晉晝暈暉暘暢暫曄曆曇曉曏曖曠曨曬書會朧東杴极柵桿梔梘條梟梲棄棖棗棟棧棲棶椏楊楓楨業極榪榮榲榿構槍槤槧槨槳樁樂樅樓標樞樣樸樹樺橈橋機橢橫檁檉檔檜檟檢檣檮檯檳檸檻櫃櫓櫚櫛櫝櫞櫟櫥櫧櫨櫪櫫櫬櫱櫳櫸櫻欄權欏欒欖欞欽歐歟歡歲歷歸歿殘殞殤殨殫殮殯殲殺殻殼毀毆毿氂氈氌氣氫氬氳決沒沖況洶浹涇涼淚淥淪淵淶淺渙減渦測渾湊湞湯溈準溝溫滄滅滌滎滬滯滲滷滸滻滾滿漁漚漢漣漬漲漵漸漿潁潑潔潙潛潤潯潰潷潿澀澆澇澗澠澤澦澩澮澱濁濃濕濘濟濤濫濰濱濺濼濾瀅瀆瀉瀏瀕瀘瀝瀟瀠瀦瀧瀨瀲瀾灃灄灑灕灘灝灠灣灤灧災為烏烴無煉煒煙煢煥煩煬熅熒熗熱熲熾燁燈燉燒燙燜營燦燭燴燼燾爍爐爛爭爲爺爾牆牘牽犖犢犧狀狹狽猙猶猻獁獄獅獎獨獪獫獮獰獲獵獷獸獺獻獼玀現琺琿瑋瑒瑣瑤瑩瑪瑲璉璣璦璫環璽瓊瓏瓔瓚甌產産畝畢異畵當疇疊痙痾瘂瘋瘍瘓瘞瘡瘧瘮瘲瘺瘻療癆癇癉癘癟癢癤癥癧癩癬癭癮癰癱癲發皚皰皸皺盜盞盡監盤盧眥眾睏睜睞瞘瞜瞞瞶瞼矓矚矯硜硤硨硯碩碭碸確碼磑磚磣磧磯磽礆礎礙礦礪礫礬礱祿禍禎禕禡禦禪禮禰禱禿秈稅稈稟種稱穀穌積穎穠穡穢穩穫穭窩窪窮窯窵窶窺竄竅竇竈竊竪競筆筍筧筴箋箏節範築篋篔篤篩篳簀簍簞簡簣簫簹簽簾籃籌籙籜籟籠籩籪籬籮粵糝糞糧糲糴糶糹糾紀紂約紅紆紇紈紉紋納紐紓純紕紖紗紘紙級紛紜紝紡紬細紱紲紳紵紹紺紼紿絀終組絅絆絎結絕絛絝絞絡絢給絨絰統絲絳絶絹綁綃綆綈綉綌綏經綜綞綠綢綣綫綬維綯綰綱網綳綴綸綹綺綻綽綾綿緄緇緊緋緑緒緓緔緗緘緙線緝緞締緡緣緦編緩緬緯緱緲練緶緹緻縈縉縊縋縐縑縕縗縛縝縞縟縣縧縫縭縮縱縲縳縵縶縷縹總績繃繅繆繒織繕繚繞繡繢繩繪繫繭繮繯繰繳繸繹繼繽繾纈纊續纍纏纓纖纘纜缽罈罌罰罵罷羅羆羈羋羥義習翹耬耮聖聞聯聰聲聳聵聶職聹聽聾肅脅脈脛脫脹腎腖腡腦腫腳腸膃膚膠膩膽膾膿臉臍臏臘臚臟臠臢臨臺與興舉舊艙艤艦艫艱艷芻苎苧茲荊莊莖莢莧華萇萊萬萵葉葒著葤葦葯葷蒓蒔蒞蒼蓀蓋蓮蓯蓴蓽蔔蔞蔣蔥蔦蔭蕁蕆蕎蕒蕓蕕蕘蕢蕩蕪蕭蕷薀薈薊薌薔薘薟薦薩薴薺藍藎藝藥藪藴藶藹藺蘄蘆蘇蘊蘋蘚蘞蘢蘭蘺蘿虆處虛虜號虧虯蛺蛻蜆蜡蝕蝟蝦蝸螄螞螢螻螿蟄蟈蟎蟣蟬蟯蟲蟶蟻蠅蠆蠐蠑蠟蠣蠨蠱蠶蠻衆術衕衚衛衝衹袞裊裏補裝裡製複褌褘褲褳褸褻襇襏襖襝襠襤襪襯襲見覎規覓視覘覡覥覦親覬覯覲覷覺覽覿觀觴觶觸訁訂訃計訊訌討訐訒訓訕訖託記訛訝訟訢訣訥訩訪設許訴訶診註詁詆詎詐詒詔評詖詗詘詛詞詠詡詢詣試詩詫詬詭詮詰話該詳詵詼詿誄誅誆誇誌認誑誒誕誘誚語誠誡誣誤誥誦誨說説誰課誶誹誼誾調諂諄談諉請諍諏諑諒論諗諛諜諝諞諢諤諦諧諫諭諮諱諳諶諷諸諺諼諾謀謁謂謄謅謊謎謐謔謖謗謙謚講謝謠謡謨謫謬謭謳謹謾證譎譏譖識譙譚譜譫譯議譴護譸譽譾讀變讎讒讓讕讖讜讞豈豎豐豬豶貓貝貞貟負財貢貧貨販貪貫責貯貰貲貳貴貶買貸貺費貼貽貿賀賁賂賃賄賅資賈賊賑賒賓賕賙賚賜賞賠賡賢賣賤賦賧質賫賬賭賴賵賺賻購賽賾贄贅贇贈贊贋贍贏贐贓贔贖贗贛贜赬趕趙趨趲跡踐踴蹌蹕蹣蹤蹺躂躉躊躋躍躑躒躓躕躚躡躥躦躪軀車軋軌軍軑軒軔軛軟軤軫軲軸軹軺軻軼軾較輅輇輈載輊輒輓輔輕輛輜輝輞輟輥輦輩輪輬輯輳輸輻輾輿轀轂轄轅轆轉轍轎轔轟轡轢轤辦辭辮辯農逕這連進運過達違遙遜遞遠適遲遷選遺遼邁還邇邊邏邐郟郵鄆鄉鄒鄔鄖鄧鄭鄰鄲鄴鄶鄺酇酈醖醜醞醫醬醱釀釁釃釅釋釐釒釓釔釕釗釘釙針釣釤釧釩釵釷釹釺鈀鈁鈃鈄鈈鈉鈍鈎鈐鈑鈒鈔鈕鈞鈣鈥鈦鈧鈮鈰鈳鈴鈷鈸鈹鈺鈽鈾鈿鉀鉅鉈鉉鉋鉍鉑鉕鉗鉚鉛鉞鉢鉤鉦鉬鉭鉶鉸鉺鉻鉿銀銃銅銍銑銓銖銘銚銛銜銠銣銥銦銨銩銪銫銬銱銳銷銹銻銼鋁鋃鋅鋇鋌鋏鋒鋙鋝鋟鋣鋤鋥鋦鋨鋩鋪鋭鋮鋯鋰鋱鋶鋸鋼錁錄錆錇錈錏錐錒錕錘錙錚錛錟錠錡錢錦錨錩錫錮錯録錳錶錸鍀鍁鍃鍆鍇鍈鍋鍍鍔鍘鍚鍛鍠鍤鍥鍩鍬鍰鍵鍶鍺鎂鎄鎇鎊鎔鎖鎘鎛鎡鎢鎣鎦鎧鎩鎪鎬鎮鎰鎲鎳鎵鎸鎿鏃鏇鏈鏌鏍鏐鏑鏗鏘鏜鏝鏞鏟鏡鏢鏤鏨鏰鏵鏷鏹鏽鐃鐋鐐鐒鐓鐔鐘鐙鐝鐠鐦鐧鐨鐫鐮鐲鐳鐵鐶鐸鐺鐿鑄鑊鑌鑒鑔鑕鑞鑠鑣鑥鑭鑰鑱鑲鑷鑹鑼鑽鑾鑿钁長門閂閃閆閈閉開閌閎閏閑間閔閘閡閣閥閨閩閫閬閭閱閲閶閹閻閼閽閾閿闃闆闈闊闋闌闍闐闒闓闔闕闖關闞闠闡闤闥阪陘陝陣陰陳陸陽隉隊階隕際隨險隱隴隸隻雋雖雙雛雜雞離難雲電霢霧霽靂靄靈靚靜靦靨鞀鞏鞝鞽韁韃韉韋韌韍韓韙韜韞韻響頁頂頃項順頇須頊頌頎頏預頑頒頓頗領頜頡頤頦頭頮頰頲頴頷頸頹頻頽顆題額顎顏顒顓顔願顙顛類顢顥顧顫顬顯顰顱顳顴風颭颮颯颱颳颶颸颺颻颼飀飄飆飈飛飠飢飣飥飩飪飫飭飯飲飴飼飽飾飿餃餄餅餉養餌餎餏餑餒餓餕餖餚餛餜餞餡館餱餳餶餷餺餼餾餿饁饃饅饈饉饊饋饌饑饒饗饜饞饢馬馭馮馱馳馴馹駁駐駑駒駔駕駘駙駛駝駟駡駢駭駰駱駸駿騁騂騅騌騍騎騏騖騙騤騫騭騮騰騶騷騸騾驀驁驂驃驄驅驊驌驍驏驕驗驚驛驟驢驤驥驦驪驫骯髏髒體髕髖髮鬆鬍鬚鬢鬥鬧鬩鬮鬱魎魘魚魛魢魨魯魴魷魺鮁鮃鮊鮋鮍鮎鮐鮑鮒鮓鮚鮜鮝鮞鮦鮪鮫鮭鮮鮳鮶鮺鯀鯁鯇鯉鯊鯒鯔鯕鯖鯗鯛鯝鯡鯢鯤鯧鯨鯪鯫鯴鯷鯽鯿鰁鰂鰃鰈鰉鰍鰏鰐鰒鰓鰜鰟鰠鰣鰥鰨鰩鰭鰮鰱鰲鰳鰵鰷鰹鰺鰻鰼鰾鱂鱅鱈鱉鱒鱔鱖鱗鱘鱝鱟鱠鱣鱤鱧鱨鱭鱯鱷鱸鱺鳥鳧鳩鳬鳲鳳鳴鳶鳾鴆鴇鴉鴒鴕鴛鴝鴞鴟鴣鴦鴨鴯鴰鴴鴷鴻鴿鵁鵂鵃鵐鵑鵒鵓鵜鵝鵠鵡鵪鵬鵮鵯鵲鵷鵾鶄鶇鶉鶊鶓鶖鶘鶚鶡鶥鶩鶪鶬鶯鶲鶴鶹鶺鶻鶼鶿鷀鷁鷂鷄鷈鷊鷓鷖鷗鷙鷚鷥鷦鷫鷯鷲鷳鷸鷹鷺鷽鷿鸇鸌鸏鸕鸘鸚鸛鸝鸞鹵鹹鹺鹽麗麥麩麵麽黃黌點黨黲黶黷黽黿鼉鼴齊齋齎齏齒齔齕齗齙齜齟齠齡齦齪齬齲齶齷龍龎龐龔龕龜` +} \ No newline at end of file diff --git a/Surge/JS/CamScanner.js b/Surge/JS/CamScanner.js index da1b096bcf..ac5deddef1 100644 --- a/Surge/JS/CamScanner.js +++ b/Surge/JS/CamScanner.js @@ -1,18 +1,34 @@ /* -CamScanner unlocks pro, Cloud scanning is not available. +CamScanner 解锁部分高级特权 -QuanX 1.0.0: [rewrite_local] +*************************** +Quantumult X: + +[rewrite_local] ^https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/CamScanner.js -Quan: [REWRITE] -https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? url simple-response SFRUUC8xLjEgMjAwIE9LCgp7CiAiZGF0YSI6IHsKICAicHNubF92aXBfcHJvcGVydHkiOiB7CiAgICJleHBpcnkiOiAiMTY0MzczMTIwMCIKICB9CiB9Cn0= +[mitm] +hostname = ap*.intsig.net -Surge4.0: [Script] +*************************** +Surge4 or Loon: + +[Script] http-response https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/CamScanner.js -QX & Q & Surge Mitm = ap*.intsig.net, -*/ +[MITM] +hostname = ap*.intsig.net + +*************************** +Quantumult: + +[REWRITE] +https:\/\/(api|api-cs)\.intsig\.net\/purchase\/cs\/query_property\? url simple-response SFRUUC8xLjEgMjAwIE9LCgp7CiAiZGF0YSI6IHsKICAicHNubF92aXBfcHJvcGVydHkiOiB7CiAgICJleHBpcnkiOiAiMTY0MzczMTIwMCIKICB9CiB9Cn0= + +[MITM] +hostname = ap*.intsig.net +**************************/ let obj = JSON.parse($response.body); -obj = {"data":{"psnl_vip_property":{"expiry":"1643731200"}}}; +obj = {"data":{"psnl_vip_property":{"expiry":"2013017600"}}}; $done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/FaceApp.js b/Surge/JS/FaceApp.js deleted file mode 100644 index 351e3d9d25..0000000000 --- a/Surge/JS/FaceApp.js +++ /dev/null @@ -1,24 +0,0 @@ -/* -[Script] -http-response ^https?:\/\/api\.faceapp\.io(.*)\/api\/v.*\/auth\/user\/credentials requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/FaceApp.js - -[MITM] -hostname = api.faceapp.io -*/ - - let headers = $response.headers; - let status = $response.status; - let obj = JSON.parse($response.body); - - { - obj = {"subscription_apple":{"subscription_exp":3042979200,"product_id":"y"},"subscription_google":null}; - $done({body: JSON.stringify(obj)}); -} - { - status = 200; - $done({status}); -} - { - delete headers['X-FaceApp-ErrorCode']; - $done({headers}); -} diff --git a/Surge/JS/Google_CAPTCHA.js b/Surge/JS/Google_CAPTCHA.js new file mode 100644 index 0000000000..4b96ec11f1 --- /dev/null +++ b/Surge/JS/Google_CAPTCHA.js @@ -0,0 +1,140 @@ +/******************************** +Google搜索人机验证解决方案 +搜索内容时遇到人机验证立即并发使用多个代理策略、策略组尝试搜索内容,并返回最优结果。 + +脚本作者:@NobyDa +更新时间:2024/05/19 +平台兼容:Surge(iOS4.9.3+/macOS4.2.3+) / QuantumultX(1.0.26+) / Loon(3.1.9[694]+) + +可在 BoxJs(低优先级)、Surge模块参数、Loon插件参数中填写筛选的代理策略、策略组的正则表达式。 +所有代理策略、策略组至多筛选、使用20个,可在BoxJs中测试匹配的策略,不筛选则表示随机使用。 + +注意:Surge由于策略架构问题,正则表达式筛选的"代理策略"不包含"外部代理策略"; +QuantumultX、Loon则无此限制,正则表达式可筛选所有"策略组"内的"代理策略"。 + +********************************* +Surge(iOS 5.9.0+/macOS 5.5.0+) 模块: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/GoogleCAPTCHA.sgmodule + +********************************* +QuantumultX(1.0.26+) 重写资源引用: +https://raw.githubusercontent.com/NobyDa/Script/master/QuantumultX/Snippet/GoogleCAPTCHA.snippet + +********************************* +Loon(3.1.9[694]+) 插件: +https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_Google_CAPTCHA.plugin + +********************************* +BoxJs 订阅地址: +https://raw.githubusercontent.com/NobyDa/Script/master/NobyDa_BoxJs.json + +*********************************/ + +const $ = new NobyDa_Tools(); +$.ret = {}; + +!(async () => { + if (($response.status || $response.statusCode) == 200) return; + const req = JSON.parse(JSON.stringify($request)); + const policy = await $.policy(); + const regexText = (typeof $argument == 'string' && $argument) || + $.data.read('GOOGLE_CAPTCHA_REGEX') || // loon plugin args. + JSON.parse($.data.read('GOOGLE_CAPTCHA') || '{}').Regex || ''; // empty = all + const selected = [...policy.group, ...policy.proxy] + .filter((n) => n && new RegExp(regexText).test(n)) + .sort(() => Math.random() - 0.5).slice(0, 20); // prevent too many TCP, filtered to random select up to 20 + console.log(`[INFO]: Use policy ${JSON.stringify(selected, null, 2)}`); + await Promise.any([ + ...selected.map( + (i) => new Promise((r, e) => { + if (req.headers['User-Agent']) req.headers.Cookie = `${Math.random()}`; // prevent set-cookie + if (req.headers['user-agent']) req.headers.cookie = `${Math.random()}`; // h2 + $.http[req.method.toLowerCase()]({ + policy: i, node: i, opts: { policy: i }, // policy:surge, node:loon, opts:qx + ...req + }).then((v) => { + if (v.status == 200) { + r({ policy: i, body: { ...v, status: $.isQuanX ? 'HTTP/1.1 200' : 200 } }) + } else if (v.status == 429) { + e(console.log(`[INFO]: Policy "${i}" need to CAPTCHA`)) + } else { + e(console.log(`[INFO]: Policy "${i}" unknown resp status "${v.status}"`)) + } + }).catch((err) => e(console.log(`[ERROR]: ${err}`))) + }) + ) + ]).then((data) => { + $.ret = data.body; + console.log(`[INFO]: Use data from "${data.policy}"`); + }) +})() + .catch((err) => console.log(`[ERROR]: ${(err && err.message) || err}`)) + .finally(() => $done($.ret)); + + +function NobyDa_Tools() { + this.isLoon = typeof $loon !== "undefined"; + this.isQuanX = typeof $configuration !== 'undefined'; + this.isSurge = typeof $environment !== 'undefined' && $environment['surge-version']; + this.isNode = typeof module !== 'undefined' && !!module.exports; + this.http = Object.fromEntries( + ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"].map( + (m) => [m.toLowerCase(), (opts) => { + if (this.isQuanX) return new Promise((resolve, reject) => { + $task.fetch({ method: m, ...opts }) + .then((r) => resolve({ + status: r.statusCode, headers: r.headers, body: r.body, + }), e => reject(e.error)) + }); + if (this.isSurge || this.isLoon || this.isNode) return new Promise((resolve, reject) => { + const request = this.isNode ? require("request") : $httpClient; + request[m.toLowerCase()](opts, (e, r, b) => { + if (e) reject(e); + else resolve({ status: r.status || r.statusCode, headers: r.headers, body: b }) + }) + }); + }] + ) + ); + this.policy = () => { + if (this.isSurge) return new Promise((r) => { + $httpAPI("GET", "v1/policies", null, (v) => r({ + proxy: v.proxies, + group: v['policy-groups'] + })) + }); + if (this.isQuanX) return new Promise((r) => { + $configuration.sendMessage({ + action: "get_customized_policy" + }).then(b => r({ + proxy: Object.keys(b.ret) + .reduce((t, i) => [...new Set([...t, ...b.ret[i].candidates || []])], []) + .filter((v) => !b.ret[v] && !['direct', 'proxy', 'reject'].includes(v)), + group: Object.keys(b.ret) + }), () => r({})); + }); + if (this.isLoon) return new Promise(async (r1) => { + const config = JSON.parse($config.getConfig()); + const groupData = await Promise.all(config['all_policy_groups'].map((i) => new Promise((r2) => { + $config.getSubPolicies(i, (b) => { r2(JSON.parse(b || '[]')) }) + }))); + r1({ + proxy: groupData.reduce((t, i) => [...new Set([...t, ...i.filter((v) => { + return v.type == 'node' && !config['all_buildin_nodes'].includes(v.name) + }).map((n) => n.name)])], []), + group: config['all_policy_groups'] + }) + }); + }; + this.data = Object.fromEntries(['read', 'write'].map( + (i) => [i, (v1, v2) => { + if (i === 'write') { + if (this.isSurge || this.isLoon) return $persistentStore.write(v1, v2); + if (this.isQuanX) return $prefs.setValueForKey(v1, v2); + } else if (i === 'read') { + if (this.isSurge || this.isLoon) return $persistentStore.read(v1); + if (this.isQuanX) return $prefs.valueForKey(v1); + } + }] + )); +} \ No newline at end of file diff --git a/Surge/JS/Kaola.js b/Surge/JS/Kaola.js deleted file mode 100644 index 92078153ef..0000000000 --- a/Surge/JS/Kaola.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -[Script] -http-request ^https://sp\.kaola\.com/api/openad$ script-path=https://Choler.github.io/Surge/Script/Kaola.js - -[MITM] -hostname = sp.kaola.com -*/ - -var data = { - body: "{}", - headers: { - "Content-Type": "application/json" - } -}; -$done({response: data}); \ No newline at end of file diff --git a/Surge/JS/Keep.js b/Surge/JS/Keep.js deleted file mode 100644 index e8e6c5adda..0000000000 --- a/Surge/JS/Keep.js +++ /dev/null @@ -1,32 +0,0 @@ -/* -Keep app unlock private lessons and action libraries. -There is a bug in the QX app. This script may not work, but the surge does not have this problem. - -QX1.0.0: -^https:\/\/api\.gotokeep\.com\/(.+\/subject|.+\/dynamic) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Keep.js - -Surge4.0: -http-response https:\/\/api\.gotokeep\.com\/(.+\/subject|.+\/dynamic) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Keep.js - -MITM = api.gotokeep.com -*/ - -let url = $request.url; -let body = $response.body; -let obj = JSON.parse(body); - -const path1 = 'dynamic'; -const path2 = 'subject'; - -if (url.indexOf(path1) != -1) { - obj.data.permission.isMembership = true; - obj.data.permission.membership = true; - obj.data.permission.inSuit = true; -} -if (url.indexOf(path2) != -1) { - for (var i = 0; i < obj.data.subjectInfos.length; i++) { - obj.data.subjectInfos[i].needPay = false; - } -} -body = JSON.stringify(obj); -$done({body}); \ No newline at end of file diff --git a/Surge/JS/KuWoMusicDownload.js b/Surge/JS/KuWoMusicDownload.js deleted file mode 100644 index a236e7aa59..0000000000 --- a/Surge/JS/KuWoMusicDownload.js +++ /dev/null @@ -1,18 +0,0 @@ -/* -KuWo music unlock lossless download, need to use with KuWo music VIP script. - -Surge4.0: -http-request https?:\/\/musicpay\.kuwo.cn\/music\.pay\?uid=\d+ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/KuWoMusicDownload.js -#Vip script: -http-response ^https?:\/\/vip1\.kuwo\.cn\/(vip\/v2\/user\/vip|vip\/spi/mservice) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Kuwo.js - -QX1.0.0: -^https?:\/\/musicpay\.kuwo\.cn\/music\.pay\?uid\=\d+ url 302 http://musicpay.kuwo.cn/music.pay?uid=1 -#Vip script: -^https?:\/\/vip1\.kuwo\.cn\/(vip\/v2\/user\/vip|vip\/spi/mservice) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Kuwo.js - -Surge & QX MITM = vip1.kuwo.cn -*/ - -let url = $request.url.replace(/uid=\d+/g, "uid=1"); -$done({url}); \ No newline at end of file diff --git a/Surge/JS/Kuwo.js b/Surge/JS/Kuwo.js index 5345d47ad6..175dd485e8 100644 --- a/Surge/JS/Kuwo.js +++ b/Surge/JS/Kuwo.js @@ -1,15 +1,25 @@ /* -KuWo music unlock vip +酷我音乐 解锁会员试听及部分功能 -QX1.0.0: +*************************** +QuantumultX: + +[rewrite_local] ^https?:\/\/vip1\.kuwo\.cn\/(vip\/v2\/user\/vip|vip\/spi/mservice) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Kuwo.js -Surge4.0: +[mitm] +hostname = vip1.kuwo.cn + +*************************** +Surge4 or Loon: + +[Script] http-response ^https?:\/\/vip1\.kuwo\.cn\/(vip\/v2\/user\/vip|vip\/spi/mservice) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Kuwo.js -http-request ^https?:\/\/musicpay\.kuwo.cn\/music\.pay\?uid=\d+ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/KuWoMusicDownload.js -MITM = vip1.kuwo.cn -*/ +[MITM] +hostname = vip1.kuwo.cn + +**************************/ var body = $response.body; var url = $request.url; diff --git a/Surge/JS/MIX.js b/Surge/JS/MIX.js new file mode 100644 index 0000000000..5af376d043 --- /dev/null +++ b/Surge/JS/MIX.js @@ -0,0 +1,92 @@ +/* +MIX 解锁特权 (需恢复购买) + +*************************** +QuantumultX: + +[rewrite_local] +https?:\/\/cdn-bm\.camera360\.com\/api\/mix\/recovery url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/MIX.js + +[mitm] +hostname = cdn-bm.camera360.com + +*************************** +Surge4 or Loon: + +[Script] +http-response https?:\/\/cdn-bm\.camera360\.com\/api\/mix\/recovery requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/MIX.js + +[MITM] +hostname = cdn-bm.camera360.com + +**************************/ + +if ($response.body) { + $done({ + body: JSON.stringify({ + "status": 200, + "data": { + "errorCode": 0, + "orderList": [{ + "quantity": "1", + "purchase_date_ms": "1537703444000", + "expires_date": "2028-06-06 06:06:06 Etc\/GMT", + "expires_date_pst": "2028-06-06 06:06:06 America\/Los_Angeles", + "is_in_intro_offer_period": "false", + "transaction_id": "200000535242800", + "is_trial_period": "true", + "original_transaction_id": "200000535242800", + "purchase_date": "2018-09-23 11:50:44 Etc\/GMT", + "product_id": "com.vstudio.MIX.subscription.auto.year", + "original_purchase_date_pst": "2018-09-23 04:50:44 America\/Los_Angeles", + "original_purchase_date_ms": "1537703444000", + "web_order_line_item_id": "200000140095730", + "expires_date_ms": "1843855566000", + "purchase_date_pst": "2018-09-23 04:50:44 America\/Los_Angeles", + "original_purchase_date": "2018-09-23 11:50:44 Etc\/GMT" + }, { + "quantity": "1", + "purchase_date_ms": "1538401707000", + "expires_date": "2028-06-06 06:06:06 Etc\/GMT", + "expires_date_pst": "2028-06-06 06:06:06 America\/Los_Angeles", + "is_in_intro_offer_period": "false", + "transaction_id": "200000539102583", + "is_trial_period": "false", + "original_transaction_id": "200000535242800", + "purchase_date": "2018-10-01 13:48:27 Etc\/GMT", + "product_id": "com.vstudio.MIX.subscription.auto.year", + "original_purchase_date_pst": "2018-09-23 04:50:44 America\/Los_Angeles", + "original_purchase_date_ms": "1537703444000", + "web_order_line_item_id": "200000140095731", + "expires_date_ms": "1843855566000", + "purchase_date_pst": "2018-10-01 06:48:27 America\/Los_Angeles", + "original_purchase_date": "2018-09-23 11:50:44 Etc\/GMT" + }, { + "product_id": "com.vstudio.MIX.Font.ruizigongfangcanlandaheijianonedotzero", + "quantity": "1", + "transaction_id": "200000577197848", + "purchase_date_ms": "1546314438000", + "original_purchase_date_pst": "2018-12-31 19:47:18 America\/Los_Angeles", + "purchase_date_pst": "2018-12-31 19:47:18 America\/Los_Angeles", + "original_purchase_date_ms": "1546314438000", + "is_trial_period": "false", + "original_purchase_date": "2019-01-01 03:47:18 Etc\/GMT", + "original_transaction_id": "200000577197848", + "purchase_date": "2019-01-01 03:47:18 Etc\/GMT" + }], + "autoBindingUserId": "043c8b571a3cd6c06e06db5f", + "pendingRenewalInfo": [{ + "product_id": "com.vstudio.MIX.subscription.auto.year", + "original_transaction_id": "200000535242800", + "auto_renew_product_id": "com.vstudio.MIX.subscription.auto.year", + "auto_renew_status": "0" + }] + }, + "message": "ok", + "exetime": "1555653929373-1555653933781", + "serverTime": 1555653933.7815001 + }) + }); +} else { + $done({}) +} diff --git a/Surge/JS/NiChi.js b/Surge/JS/NiChi.js index 3623bef44c..b203149d01 100644 --- a/Surge/JS/NiChi.js +++ b/Surge/JS/NiChi.js @@ -1,16 +1,28 @@ /* -NiChi app unlocks material -Because QX limits the maximum rewrite size of the response body, So this script may not work under a certain version of QX. -If your QX version is greater than 1.0.1 (130) then it is recommended to point to the local script path and enable AlwaysOn. +NiChi 解锁素材包 -Surge4.0: -http-response https?:\/\/mp\.bybutter\.com\/mood\/(official-templates|privileges) requires-body=1,max-size=524288,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/NiChi.js +*************************** +QuantumultX: -QX 1.0.0: -^https?:\/\/mp\.bybutter\.com\/mood\/(official-templates|privileges) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/NiChi.js +[rewrite_local] +^https?:\/\/m(p|ini-hk)\.bybutter\.com\/mood\/(official-templates|privileges) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/NiChi.js -Surge & QX Mitm = mp.bybutter.com -*/ +[mitm] +hostname = m*.bybutter.com -body = $response.body.replace(/preview/g, "free").replace(/view/g, "unlimited").replace(/true/g, "false"); -$done({body}); \ No newline at end of file +*************************** +Surge4 or Loon: + +[Script] +http-response https?:\/\/m(p|ini-hk)\.bybutter\.com\/mood\/(official-templates|privileges) requires-body=1,max-size=524288,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/NiChi.js + +[MITM] +hostname = m*.bybutter.com + +**************************/ + +var body = $response.body + .replace(/preview/g, "free") + .replace(/view/g, "unlimited") + .replace(/true/g, "false"); +$done({ body }); \ No newline at end of file diff --git a/Surge/JS/PicsArt.js b/Surge/JS/PicsArt.js index 8c320e89ab..9591e496ea 100644 --- a/Surge/JS/PicsArt.js +++ b/Surge/JS/PicsArt.js @@ -1,15 +1,62 @@ /* -PicsArt app unlocks pro +PicsArt 解锁高级功能 +数据来自 @chxm1023 -Surge4.0: -http-response https:\/\/api\.(picsart|meiease)\.c(n|om)\/users\/show\/me\.json requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js +*************************** +QuantumultX: -QX1.0.0 -^https:\/\/api\.(picsart|meiease)\.c(n|om)\/users\/show\/me\.json url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js +[rewrite_local] +^https:\/\/api\.(picsart|meiease)\.c(n|om)\/shop\/subscription\/(validate|apple\/purchases) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js -Surge & QX Mitm = api.picsart.c*, api.meiease.c* -*/ +[mitm] +hostname = api.picsart.c*, api.meiease.c* -let obj = JSON.parse($response.body); -obj.subscription.granted = "true"; -$done({body: JSON.stringify(obj)}); \ No newline at end of file +*************************** +Surge4 or Loon: + +[Script] +http-response ^https:\/\/api\.(picsart|meiease)\.c(n|om)\/shop\/subscription\/(validate|apple\/purchases) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/PicsArt.js + +[MITM] +hostname = api.picsart.c*, api.meiease.c* + +**************************/ + +$done({ + body: JSON.stringify({ + "status": "success", + "response": [ + { + "status": "SUBSCRIPTION_PURCHASED", + "order_id": "490001314520000", + "original_order_id": "490001314520000", + "is_trial": true, + "plan_meta": { + "storage_limit_in_mb": 20480, + "frequency": "yearly", + "scope_id": "full", + "id": "com.picsart.editor.subscription_yearly", + "product_id": "subscription_yearly", + "level": 2000, + "auto_renew_product_id": "com.picsart.editor.subscription_yearly", + "type": "renewable", + "tier_id": "gold_old", + "permissions": [ + "premium_tools_standard", + "premium_tools_ai" + ], + "description": "china" + }, + "limitation": { + "max_count": 5, + "limits_exceeded": false + }, + "reason": "ok", + "subscription_id": "com.picsart.editor.subscription_yearly", + "is_eligible_for_introductory": false, + "purchase_date": 1687020148000, + "expire_date": 4092599349000 + } + ] + }) +}); \ No newline at end of file diff --git a/Surge/JS/Polarr.js b/Surge/JS/Polarr.js new file mode 100644 index 0000000000..db6bdac0bd --- /dev/null +++ b/Surge/JS/Polarr.js @@ -0,0 +1,55 @@ +/* +Polarr泼辣修图 解锁特权 (需登陆) + +*************************** +QuantumultX: + +[rewrite_local] +^https:\/\/api\.polaxiong\.com\/v1\/payments\/(appleiap\/receipts\/confirmation|profiles\/@me\/subscription) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Polarr.js + +[mitm] +hostname = api.polaxiong.com + +*************************** +Surge4 or Loon: + +[Script] +http-response ^https:\/\/api\.polaxiong\.com\/v1\/payments\/(appleiap\/receipts\/confirmation|profiles\/@me\/subscription) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Polarr.js + +[MITM] +hostname = api.polaxiong.com + +**************************/ + +const statusCode = typeof $task !== "undefined" ? "HTTP/1.1 200 OK" : 200; +const response = { status: statusCode, headers: $response.headers }; + +if ($response.body && $request.url.includes("v1/payments/profiles/@me/subscription")) { + response.body = JSON.stringify({ + "isSubscribed": true, + "planId": "co.polarr.ppe.premium.studio.yearly", + "subscriptionProduct": "yearly", + "isTrial": false, + "app": "PPE", + "isUnlimited": true, + "expiryDate": "2053-08-17T19:38:37.000Z", + "planType": "yearly", + "planTier": "studio", + "startDate": "2023-08-17T19:38:37.000Z", + "subscriptionTier": "studio", + "paymentChannel": "AppleIapSubscription", + "membershipExpiryDate": "2053-08-17T19:38:37.000Z" + }); +} + +if ($response.body && $request.url.includes("v1/payments/appleiap/receipts/confirmation")) { + response.body = JSON.stringify({ + "app": "PPE", + "planType": "yearly", + "planTier": "studio", + "isUnlimited": true, + "membershipExpiryDate": "2053-08-17T19:38:37.000Z" + }); +} + +$done(response) \ No newline at end of file diff --git a/Surge/JS/QQNews.js b/Surge/JS/QQNews.js deleted file mode 100644 index 077ada26a6..0000000000 --- a/Surge/JS/QQNews.js +++ /dev/null @@ -1,11 +0,0 @@ -/* -[Script] -http-response https://r\.inews\.qq.com\/get(QQNewsUnreadList|RecommendList) requires-body=1,max-size=-1,script-path=https://Choler.github.io/Surge/Script/QQNews.js - -[MITM] -hostname = r.inews.qq.com -*/ - -var obj = JSON.parse($response.body); -delete obj.adList; -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/Super.js b/Surge/JS/Super.js index a727e9fdce..1cb1cf672b 100644 --- a/Surge/JS/Super.js +++ b/Surge/JS/Super.js @@ -1,17 +1,98 @@ -/* +/*皮皮虾去广告和水印 by Liquor030 +如果只需要去广告功能请在[URL Rewrite]中添加 + +# Remove Super's Ad (By Liquor030) +app_name=super&([\S]*)aid=\d+ app_name=super_pro&$1aid=1412 header + +可大幅改善使用体验,强烈建议添加并禁用该脚本,在需要的时候开启脚本去水印!! +===================================== +Feed: /feed/stream +回复: /comment/cell_reply +评论: /cell/cell_comment +Detail: /cell/detail +用户插眼: /ward/list +用户收藏: /user/favorite +用户评论: /user/cell_coment +用户feed: /user/cell_userfeed +用户发帖: /user/publish_list + +************************** +QuantumultX: + +[rewrite_local] +^https?://.*\.snssdk\.com/bds/(feed/stream|comment/cell_reply|cell/cell_comment|cell/detail|ward/list|user/favorite|user/cell_coment|user/cell_userfeed|user/publish_list) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Super.js + +[mitm] +hostname = *.snssdk.com + +************************** +Surge4 or Loon: + [Script] -http-response ^https?://[a-z]*\.snssdk\.com/bds/feed/stream/ requires-body=1,max-size=-1,script-path=https://Choler.github.io/Surge/Script/Super.js +http-response ^https?://.*\.snssdk\.com/bds/(feed/stream|comment/cell_reply|cell/cell_comment|cell/detail|ward/list|user/favorite|user/cell_coment|user/cell_userfeed|user/publish_list) requires-body=1,max-size=-1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Super.js [MITM] hostname = *.snssdk.com -*/ -var obj = JSON.parse($response.body); -if (obj.data.data) { - for (var i = obj.data.data.length - 1; i >= 0; i--) { - if (obj.data.data[i].ad_info != null) { - obj.data.data.splice(i, 1); +**************************/ + +var body = $response.body.replace(/id\":([0-9]{15,})/g, 'id":"$1str"'); +body = JSON.parse(body); +if (body.data.data) { + obj = body.data.data; +} else if (body.data.replies) { + obj = body.data.replies; +} else if (body.data.cell_comments) { + obj = body.data.cell_comments; +} else { + obj = null; +} + +if (obj instanceof Array) { + if (obj != null) { + for (var i in obj) { + if (obj[i].ad_info != null) { + obj.splice(i, 1); + } + if (obj[i].item != null) { + if (obj[i].item.video != null) { + obj[i].item.video.video_download.url_list = obj[i].item.origin_video_download.url_list; + } + for (var j in obj[i].item.comments) { + if (obj[i].item.comments[j].video != null) { + obj[i].item.comments[j].video_download.url_list = obj[i].item.comments[j].video.url_list; + } + } + } + if (obj[i].comment_info != null) { + if (obj[i].comment_info.video != null) { + obj[i].comment_info.video_download.url_list = obj[i].comment_info.video.url_list; + } + } + } + } +} else { + if (obj.item != null) { + if (obj.item.video != null) { + obj.item.video.video_download.url_list = obj.item.origin_video_download.url_list; + } + for (var j in obj.item.comments) { + if (obj.item.comments[j].video != null) { + obj.item.comments[j].video_download.url_list = obj.item.comments[j].video.url_list; + } + } + } + if (obj.comment_info != null) { + if (obj.comment_info.video != null) { + obj.comment_info.video_download.url_list = obj.comment_info.video.url_list; + } } - } } -$done({body: JSON.stringify(obj)}); \ No newline at end of file +body = JSON.stringify(body); +body = body.replace(/id\":\"([0-9]{15,})str\"/g, 'id":$1'); +body = body.replace(/\"can_download\":false/g, '"can_download":true'); +body = body.replace(/tplv-ppx-logo.image/g, '0x0.gif'); +body = body.replace(/tplv-ppx-logo/g, '0x0'); +$done({ + body +}); diff --git a/Surge/JS/Termius.js b/Surge/JS/Termius.js deleted file mode 100644 index fa0c05ee7c..0000000000 --- a/Surge/JS/Termius.js +++ /dev/null @@ -1,19 +0,0 @@ -/* -Termius unlocks local pro v -(From the author @Maasea) - -Surge4: -http-response https:\/\/api\.termius\.com\/api\/v3\/bulk\/account\/ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Termius.js - -QX: -https:\/\/api\.termius\.com\/api\/v3\/bulk\/account\/ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Termius.js - -Surge & QX MITM = api.termius.com -*/ - -let obj=JSON.parse($response.body) -obj.account["pro_mode"] = true; -obj.account["plan_type"] = "Premium"; -obj.account["user_type"] = "Premium"; -obj.account["current_period"]["until"] = "2099-10-10T03:27:34"; -$done({body:JSON.stringify(obj)}) \ No newline at end of file diff --git a/Surge/JS/Toutiao.js b/Surge/JS/Toutiao.js deleted file mode 100644 index cf29e9a600..0000000000 --- a/Surge/JS/Toutiao.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -[Script] -http-response ^https://[a-zA-Z]*\.snssdk\.com/api/news/feed/v88/ requires-body=1,max-size=-1,script-path=https://Choler.github.io/Surge/Script/Toutiao.js - -[MITM] -hostname = *.snssdk.com -*/ - -var obj = JSON.parse($response.body); -if (obj.data) { - for (var i = obj.data.length - 1; i >= 0; i--) { - if (obj.data[i].content.indexOf("raw_ad_data") > 0) { - obj.data.splice(i, 1); - } - } -} -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/VUE.js b/Surge/JS/VUE.js index fc6b378087..07d6b46199 100644 --- a/Surge/JS/VUE.js +++ b/Surge/JS/VUE.js @@ -1,14 +1,26 @@ /* -VUE Vlog app unlocks pro +VUE Vlog 解锁高级功能 (需登录) -Surge4.0: -http-response https:\/\/api\.vuevideo\.net\/api\/v1\/(users\/.+\/profile|subtitle\/prepare) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/VUE.js +*************************** +QuantumultX: -QX 1.0.0: +[rewrite_local] ^https:\/\/api\.vuevideo\.net\/api\/v1\/(users\/.+\/profile|subtitle\/prepare) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/VUE.js -Surge & QX Mitm = api.vuevideo.net -*/ +[mitm] +hostname = api.vuevideo.net + +*************************** +Surge4 or Loon: + +[Script] +http-response https:\/\/api\.vuevideo\.net\/api\/v1\/(users\/.+\/profile|subtitle\/prepare) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/VUE.js + +[MITM] +hostname = api.vuevideo.net -body = $response.body.replace(/\"isPremium\":false/, "\"isPremium\":true").replace(/\"valid\":false/, "\"valid\":true") -$done({body}); \ No newline at end of file +**************************/ +var body = $response.body + .replace(/\"isPremium\":false/, "\"isPremium\":true") + .replace(/\"valid\":false/, "\"valid\":true"); +$done({ body }); \ No newline at end of file diff --git a/Surge/JS/WeChat.js b/Surge/JS/WeChat.js deleted file mode 100644 index 3efc1044de..0000000000 --- a/Surge/JS/WeChat.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -[Script] -http-request ^https://mp\.weixin\.qq\.com/mp/getappmsgad script-path=https://Choler.github.io/Surge/Script/WeChat.js - -[MITM] -hostname = mp.weixin.qq.com -*/ - -var data = { - body: "{}", - headers: { - "Content-Type": "application/json" - } -}; -$done({response: data}); \ No newline at end of file diff --git a/Surge/JS/Wps.js b/Surge/JS/Wps.js new file mode 100644 index 0000000000..0f6e5812a5 --- /dev/null +++ b/Surge/JS/Wps.js @@ -0,0 +1,55 @@ +/* +WPS Office 解锁部分功能 + +*************************** +QuantumultX: + +[rewrite_local] +^https?:\/\/[a-z-]*account\.wps\.c(n|om)(:\d+|)\/api\/users url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Wps.js + +[mitm] +hostname = *account.wps.cn, *account.wps.com + +*************************** +Surge4 or Loon: + +[Script] +http-response ^https?:\/\/[a-z-]*account\.wps\.c(n|om)(:\d+|)\/api\/users requires-body=1,max-size=-1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Wps.js + +[MITM] +hostname = *account.wps.cn, *account.wps.com + +**************************/ + +var body = JSON.parse($response.body); +var obj = { + exp: 0, + level: 3, + privilege: [ + { spid: "data_recover", times: 0, expire_time: 1846256142 }, + { spid: "ocr", times: 0, expire_time: 1846256142 }, + { spid: "pdf2doc", times: 0, expire_time: 1846256142 }, + { spid: "pdf_merge", times: 0, expire_time: 1846256142 }, + { spid: "pdf_sign", times: 0, expire_time: 1846256142 }, + { spid: "pdf_split", times: 0, expire_time: 1846256142 } + ], + result: "ok", + total_buy: 0, + total_cost: -30, + userid: body.userid, + vip: { + name: "超级会员", + has_ad: 0, + memberid: 40, + expire_time: 1846256142, + enabled: [ + { memberid: 40, name: "超级会员", expire_time: 1846256142 }, + { memberid: 20, name: "WPS会员", expire_time: 1846256142 }, + { memberid: 12, name: "稻壳会员", expire_time: 1846256142 } + ] + }, + wealth: 0, + expire_time: 1846256142 +}; + +$done({ body: JSON.stringify(obj) }); \ No newline at end of file diff --git a/Surge/JS/YouTube.js b/Surge/JS/YouTube.js deleted file mode 100644 index 4e2580e637..0000000000 --- a/Surge/JS/YouTube.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -[Script] -http-request ^https://[\s\S]*\.googlevideo\.com/.*&(oad|ctier) script-path=https://Choler.github.io/Surge/Script/YouTube.js - -[MITM] -hostname = *.googlevideo.com -*/ - -var data = { - body: "{}", - headers: { - "Content-Type": "multipart/byteranges" - } -}; -$done({response: data}); \ No newline at end of file diff --git a/Surge/JS/Zhihu-ad-answer.js b/Surge/JS/Zhihu-ad-answer.js deleted file mode 100644 index 76946d314e..0000000000 --- a/Surge/JS/Zhihu-ad-answer.js +++ /dev/null @@ -1,17 +0,0 @@ -//regex: ^https://api.zhihu.com/.*/questions -//Original author: onewayticket255 - -let body = $response.body -body=JSON.parse(body) -if (body['ad_info']) { -delete body['ad_info'] -}; -if (body.data) { -body['data'].forEach((element, index)=> { - if(element['author']['name']=="盐选推荐"){ - body['data'].splice(index,1) - } - }) - }; -body=JSON.stringify(body) -$done({body}) \ No newline at end of file diff --git a/Surge/JS/dqsj.js b/Surge/JS/dqsj.js deleted file mode 100644 index a122402a5e..0000000000 --- a/Surge/JS/dqsj.js +++ /dev/null @@ -1,25 +0,0 @@ -/* -DaQianShiJie unlock - -Surge4: -http-response ^https:\/\/api\.mvmtv\.com\/index\.php.*(c=user.*a=info|a=addr.*vid=.*) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/dqsj.js - -QX: -^https:\/\/api\.mvmtv\.com\/index\.php.*(c=user.*a=info|a=addr.*vid=.*) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/dqsj.js - -Surge & QX MITM = api.mvmtv.com -*/ - -let obj = JSON.parse($response.body); -let url = $request.url; -const play = 'vid='; -const vip = 'c=user'; - -if (url.indexOf(vip) != -1) { - obj.data["is_expire"] = 3; - } else if (url.indexOf(play) != -1) { - let playurl = obj.data.play[0].mp4 - obj.data.play[0].sd = playurl; - obj.data.play[0].hd = playurl; -} -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/gyroscope.js b/Surge/JS/gyroscope.js deleted file mode 100644 index 3ba6293dc2..0000000000 --- a/Surge/JS/gyroscope.js +++ /dev/null @@ -1,14 +0,0 @@ -/* -Gyroscope unlock pro (Script author: @Maasea ) -Surge: -http-response ^https:\/\/api\.gyrosco\.pe\/v1\/account\/$ requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/gyroscope.js - -QuantumultX: -^https:\/\/api\.gyrosco\.pe\/v1\/account\/$ url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/gyroscope.js - -QX & Surge MITM = api.gyrosco.pe -*/ - -let obj = JSON.parse($response.body); -obj.user["active_until_time"] = "2099-01-01T00:00:00Z"; -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/jibjab.js b/Surge/JS/jibjab.js index bf22e64088..e9cb102c26 100644 --- a/Surge/JS/jibjab.js +++ b/Surge/JS/jibjab.js @@ -1,14 +1,25 @@ /* -JibJab unlock +JibJab 解锁高级功能 -Surge4: -http-response https:\/\/origin-prod-phoenix\.jibjab\.com\/v1\/user requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/jibjab.js +*************************** +QuantumultX: -QX: +[rewrite_local] https:\/\/origin-prod-phoenix\.jibjab\.com\/v1\/user url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/jibjab.js -Surge & QX MITM = origin-prod-phoenix.jibjab.com -*/ +[mitm] +hostname = origin-prod-phoenix.jibjab.com + +*************************** +Surge4 or Loon: + +[Script] +http-response https:\/\/origin-prod-phoenix\.jibjab\.com\/v1\/user requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/jibjab.js + +[MITM] +hostname = origin-prod-phoenix.jibjab.com + +**************************/ let obj = JSON.parse($response.body); obj.data.attributes["is-paid"] = true; diff --git a/Surge/JS/luqi.js b/Surge/JS/luqi.js index 7255743988..fc4c5ddfec 100644 --- a/Surge/JS/luqi.js +++ b/Surge/JS/luqi.js @@ -1,3 +1,26 @@ +/* +陆琪讲故事 解锁电台 + +*************************** +QuantumultX: + +[rewrite_local] +^https:\/\/www\.luqijianggushi\.com\/api\/v2\/user\/get url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/luqi.js + +[mitm] +hostname = www.luqijianggushi.com + +*************************** +Surge4 or Loon: + +[Script] +http-response ^https:\/\/www\.luqijianggushi\.com\/api\/v2\/user\/get requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/luqi.js + +[MITM] +hostname = www.luqijianggushi.com + +**************************/ + let obj = JSON.parse($response.body); obj.data.is_vip = 1; obj.data.vip_endtime = 1630296877; diff --git a/Surge/JS/ngdy.js b/Surge/JS/ngdy.js deleted file mode 100644 index 80ca92fa63..0000000000 --- a/Surge/JS/ngdy.js +++ /dev/null @@ -1,12 +0,0 @@ -/* -Pumpkin movie unlock vip -Surge: -http-response ^https:\/\/(p\.doras\.api\.vcinema\.cn|pay\.guoing\.com)\/(v5\.0\/user\/\d+$|d\/user\/get_user_info) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/ngdy.js - -QX: -^https:\/\/(p\.doras\.api\.vcinema\.cn|pay\.guoing\.com)\/(v5\.0\/user\/\d+$|d\/user\/get_user_info) url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/ngdy.js - -Surge & QX MITM = pay.guoing.com, p.doras.api.vcinema.cn, -*/ - -var _0xf504=["\x62\x6F\x64\x79","\x70\x61\x72\x73\x65","\x75\x72\x6C","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x61\x76\x61\x74\x61\x72\x73\x32\x2E\x67\x69\x74\x68\x75\x62\x75\x73\x65\x72\x63\x6F\x6E\x74\x65\x6E\x74\x2E\x63\x6F\x6D\x2F\x75\x2F\x35\x33\x32\x31\x37\x31\x36\x30","\u7981\u6B62\u725F\u5229\x2C\x20\u6570\u636E\u6765\u81EA\x40\u4F59\u6E29","\x76\x35\x2E\x30\x2F\x75\x73\x65\x72","\x75\x73\x65\x72\x2F\x67\x65\x74\x5F\x75\x73\x65\x72\x5F\x69\x6E\x66\x6F","\x69\x6E\x64\x65\x78\x4F\x66","\x75\x73\x65\x72\x5F\x73\x65\x65\x64\x5F\x69\x6E\x74","\x63\x6F\x6E\x74\x65\x6E\x74","\x36\x36\x36\x36\x36\x36\x36","\x75\x73\x65\x72\x5F\x70\x68\x6F\x74\x6F","\x75\x73\x65\x72\x5F\x69\x64","\x31\x37\x34\x35\x35\x32\x39\x36","\x75\x73\x65\x72\x5F\x70\x68\x6F\x6E\x65","\x31\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36","\x75\x73\x65\x72\x5F\x6C\x65\x76\x65\x6C\x5F\x73\x74\x72","\x4C\x76\x35\u7537\u7235","\x75\x73\x65\x72\x5F\x76\x69\x70\x5F\x73\x74\x61\x74\x65","\x32","\x75\x73\x65\x72\x5F\x6E\x69\x63\x6B\x6E\x61\x6D\x65","\x75\x73\x65\x72\x5F\x76\x69\x70\x5F\x73\x74\x61\x72\x74\x5F\x64\x61\x74\x65","\x32\x30\x31\x36\x2E\x30\x36\x2E\x30\x36","\x75\x73\x65\x72\x5F\x76\x69\x70\x5F\x65\x6E\x64\x5F\x64\x61\x74\x65","\x32\x30\x36\x36\x2E\x30\x36\x2E\x30\x36","\x32\x30\x36\x36\x2D\x30\x36\x2D\x30\x36","\x73\x74\x72\x69\x6E\x67\x69\x66\x79"];let obj=JSON[_0xf504[1]]($response[_0xf504[0]]);let url=$request[_0xf504[2]];let photo=_0xf504[3];let name=_0xf504[4];const vip=_0xf504[5];const pay=_0xf504[6]; if(url[_0xf504[7]](vip)!= -1);{  obj[_0xf504[9]][_0xf504[8]]= _0xf504[10];  obj[_0xf504[9]][_0xf504[11]]= photo;  obj[_0xf504[9]][_0xf504[12]]= _0xf504[13];  obj[_0xf504[9]][_0xf504[14]]= _0xf504[15];  obj[_0xf504[9]][_0xf504[16]]= _0xf504[17];  obj[_0xf504[9]][_0xf504[18]]= _0xf504[19];  obj[_0xf504[9]][_0xf504[20]]= name;  obj[_0xf504[9]][_0xf504[21]]= _0xf504[22];  obj[_0xf504[9]][_0xf504[23]]= _0xf504[24]} if(url[_0xf504[7]](pay)!= -1);{  obj[_0xf504[9]][_0xf504[23]]= _0xf504[25];  obj[_0xf504[9]][_0xf504[14]]= _0xf504[15];  obj[_0xf504[9]][_0xf504[20]]= name;  obj[_0xf504[9]][_0xf504[11]]= photo}$done({body:JSON[_0xf504[26]](obj)}) \ No newline at end of file diff --git a/Surge/JS/syjl.js b/Surge/JS/syjl.js deleted file mode 100644 index 627eb0abd6..0000000000 --- a/Surge/JS/syjl.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Watermark sprite vip (Author: Alex0510) -Surge4: -http-response https:\/\/api1\.dobenge\.cn\/api\/user\/getuserinfo requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/syjl.js - -QX: -https:\/\/api1\.dobenge\.cn\/api\/user\/getuserinfo url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/syjl.js - -Surge & QX MITM = api1.dobenge.cn -*/ - -let obj = JSON.parse($response.body); -obj.data["is_vip"] = 1; -obj.data["vip_end_time"] = "2066-06-06"; -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/vivavideo.js b/Surge/JS/vivavideo.js index a4fac3dfb2..cf26b3adb4 100644 --- a/Surge/JS/vivavideo.js +++ b/Surge/JS/vivavideo.js @@ -1,14 +1,25 @@ /* -Vivavideo unlock vip -Script data comes from @hiepkimcdtk55 +小影 解锁高级功能 -Surge4: -http-response ^https:\/\/viva\.v21xy\.com\/api\/rest\/u\/vip requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js -QX: -^https:\/\/viva\.v21xy\.com\/api\/rest\/u\/vip url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js +*************************** +QuantumultX: -Surge & QX MITM = viva.v21xy.com -*/ +[rewrite_local] +^https:\/\/api-use\.intsvs\.com\/api\/rest\/u\/vipVerifyReceipt url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js + +[mitm] +hostname = api-use.intsvs.com + +*************************** +Surge4 or Loon: + +[Script] +http-response ^https:\/\/api-use\.intsvs\.com\/api\/rest\/u\/vipVerifyReceipt requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/vivavideo.js + +[MITM] +hostname = api-use.intsvs.com + +**************************/ var obj = JSON.parse($response.body); obj = { @@ -32,6 +43,4 @@ obj = { "systemDate": 1556965441014 }; -$done({body: JSON.stringify(obj)}); - -// Descriptions \ No newline at end of file +$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/wxzb.js b/Surge/JS/wxzb.js deleted file mode 100644 index aed7240238..0000000000 --- a/Surge/JS/wxzb.js +++ /dev/null @@ -1,17 +0,0 @@ -/* -Vientiane live download link:https://m.51168.tv/ -Surge4: -http-response https:\/\/u\.kanghuayun\.com\/api\/v2\/info requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/wxzb.js - -QX: -https:\/\/u\.kanghuayun\.com\/api\/v2\/info url script-response-body https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/wxzb.js - -Surge & QX MITM = u.kanghuayun.com -*/ -  let obj = JSON.parse($response.body); -  obj.data.nickname = "脚本禁止牟利,TG频道@NobyDa"; -  obj.data.tstime = 59169305884; -  obj.data.vip_expire_time = 59169305884; -  obj.data.tsvip = 1; -  obj.data.vip_level = 3; -  $done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/JS/yyzs.js b/Surge/JS/yyzs.js deleted file mode 100644 index 7141f47a8f..0000000000 --- a/Surge/JS/yyzs.js +++ /dev/null @@ -1,46 +0,0 @@ -/* -Surge: - -[Script] -http-response ^https?:\/\/(i|newdrugs)\.dxy\.cn\/(snsapi\/username\/|app\/user\/(pro\/stat\?|init\?timestamp=)) requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/yyzs.js - -[MITM] -hostname = newdrugs.dxy.cn -*/ - -const path1 = "/snsapi/username/"; -const path2 = "/app/user/pro/stat?"; -const path3 = "/app/user/init?timestamp="; - -const url = $request.url; -let body = $response.body; - -if (url.indexOf(path1) != -1){ -body = JSON.parse(body); -body.items.expertUser = true; -body.items.expert = true; -body.items.expertStatus = 1; -body.items.professional = true; -body = JSON.stringify(body); -} - -if (url.indexOf(path2) != -1){ -body = JSON.parse(body); -body.data.isActive = true; -body = JSON.stringify(body); -} - -if (url.indexOf(path3) != -1){ -body = JSON.parse(body); -body.data.isProActive = true; -body.data.expireDate = 2048; -body.data.memberDiscount = true; -body.data.iapPurchaseVO.purchase = true; -body.data.iapPurchaseVO.message = null; -body.data.iapPurchaseVO.error = null; -body = JSON.stringify(body); -} - -$done({body}) - -// by Primovist \ No newline at end of file diff --git a/Surge/JS/zhibo.js b/Surge/JS/zhibo.js deleted file mode 100644 index adf7a35031..0000000000 --- a/Surge/JS/zhibo.js +++ /dev/null @@ -1,17 +0,0 @@ -let obj = JSON.parse($response.body); -let url = $request.url; - -const ylm = '/api/public/?service=Live.checkLive'; -const xml = '/api/public//?service=Live.roomCharge'; -const cs = '/lg/video/loadVideoFees.do'; - -if (url.indexOf(ylm) != -1) { -obj.data.info[0].type = "0"; -} -if (url.indexOf(xml) != -1) { -obj.data.code = 0; -} -if (url.indexOf(cs) != -1) { -obj.body.videoModel.fees = 1; -} -$done({body: JSON.stringify(obj)}); \ No newline at end of file diff --git a/Surge/Module/BahamutAnimeAds.sgmodule b/Surge/Module/BahamutAnimeAds.sgmodule new file mode 100644 index 0000000000..bb2ff23df8 --- /dev/null +++ b/Surge/Module/BahamutAnimeAds.sgmodule @@ -0,0 +1,9 @@ +#!name=动画疯 +#!desc=屏蔽播放广告 (黑屏25秒自动播放) +#!system=ios + +[Script] +动画疯(屏蔽广告) = type=http-response,pattern=^https:\/\/api\.gamer\.com\.tw\/mobile_app\/anime\/v\d/(token|m3u8).php\?,requires-body=1,max-size=0,timeout=40,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutAnimeAds.js + +[MITM] +hostname = %APPEND% api.gamer.com.tw \ No newline at end of file diff --git a/Surge/Module/BahamutDailyBonus.sgmodule b/Surge/Module/BahamutDailyBonus.sgmodule new file mode 100644 index 0000000000..4fecbd3759 --- /dev/null +++ b/Surge/Module/BahamutDailyBonus.sgmodule @@ -0,0 +1,8 @@ +#!name=🐻 巴哈姆特 [签到] +#!desc=每日定时签到,包含主站签到、公会签到、动画疯答题等;模块参数可调整签到时间。\n使用前需要进入BoxJs填写账号密码,BoxJs订阅链接可查看脚本注释。 +#!arguments=定时签到:20 8 * * * +#!arguments-desc=定时签到:Cron表达式,默认每天早上 08:20 执行。(如需动画疯答题,不建议在凌晨0:00-0:30执行) +#!category=🐻 NobyDa + +[Script] +巴哈姆特[签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=300,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bahamut/BahamutDailyBonus.js \ No newline at end of file diff --git a/Surge/Module/BiliComicsDailyBonus.sgmodule b/Surge/Module/BiliComicsDailyBonus.sgmodule new file mode 100644 index 0000000000..ad94ba1a36 --- /dev/null +++ b/Surge/Module/BiliComicsDailyBonus.sgmodule @@ -0,0 +1,13 @@ +#!name=🐻 哔哩哔哩漫画 [签到] +#!desc=每日定时签到,模块参数可调整签到时间。\n打开哔哩哔哩漫画APP点击"我的"即可获取cookie. +#!arguments=定时签到:0 9 * * *,禁用脚本:哔哩漫画[Cookie],禁用MITM:hostname +#!arguments-desc=定时签到:Cron表达式,默认每天早上 09:00 执行。\n\n禁用脚本:禁用获取Cookie脚本,输入 # 表示禁用。\n\n禁用MITM:禁用MITM主机名,输入 # 表示禁用。 +#!category=🐻 NobyDa + +[Script] +哔哩漫画[签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=60,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js + +{{{禁用脚本}}} = type=http-request,pattern=^https:\/\/app\.bilibili\.com\/x\/v\d\/account\/myinfo,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js + +[MITM] +{{{禁用MITM}}} = %APPEND% app.bilibili.com \ No newline at end of file diff --git a/Surge/Module/BiliComicsExchangePoints.sgmodule b/Surge/Module/BiliComicsExchangePoints.sgmodule new file mode 100644 index 0000000000..6d8474bcab --- /dev/null +++ b/Surge/Module/BiliComicsExchangePoints.sgmodule @@ -0,0 +1,8 @@ +#!name=🐻 哔哩哔哩漫画 [积分抢购] +#!desc=定时抢购积分商城物品,模块参数可调整抢购设置,该模块需使用"哔哩哔哩漫画签到模块"获取Cookie。 +#!arguments=定时抢购:0-59 0 0 * * 0-1,商品名称:【超特惠】限量-0点秒杀,抢购数量:0,抢购次数:100 +#!arguments-desc=定时抢购:Cron表达式,默认每周日、每周一的凌晨 0:00:00 - 0:01:59 之间每秒执行一次。\n\n商品名称:默认抢购商品名"【超特惠】限量-0点秒杀"\n\n抢购数量:默认为用户积分可抢购的最大值(以0表示)\n\n抢购次数:抢购失败时重试次数,默认100次 +#!category=🐻 NobyDa + +[Script] +哔哩漫画[积分抢购] = type=cron,cronexp="{{{定时抢购}}}",script-update-interval=0,timeout=60,wake-system=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/ExchangePoints.js,argument="ProductName={{{商品名称}}}&ProductNum={{{抢购数量}}}&ExchangeNum={{{抢购次数}}} \ No newline at end of file diff --git a/Surge/Module/CtripDailyBonus.sgmodule b/Surge/Module/CtripDailyBonus.sgmodule new file mode 100644 index 0000000000..0ae64b88fa --- /dev/null +++ b/Surge/Module/CtripDailyBonus.sgmodule @@ -0,0 +1,13 @@ +#!name=🐻 携程旅行 [签到] +#!desc=每日定时签到,支持多账号。\n登陆"携程旅行"微信小程序或"携程网页版"(https://m.ctrip.com/)可获取账号授权,填写模块参数可禁用脚本。 +#!arguments=定时签到:30 8 * * *,禁用脚本:携程旅行[授权],禁用MITM:hostname +#!arguments-desc=定时签到:Cron表达式,默认每日 8:30 执行。\n\n禁用脚本:禁用获取授权脚本,输入 # 表示禁用。\n\n禁用MITM:禁用MITM主机名,输入 # 表示禁用。 +#!category=🐻 NobyDa + +[Script] +携程旅行[签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=300,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js + +{{{禁用脚本}}} = type=http-response,pattern=^https:\/\/m\.ctrip\.com\/restapi\/soa2\/\d+\/[a-zA-Z]+Login(?:$|\?),requires-body=1,max-size=0,debug=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js + +[MITM] +{{{禁用MITM}}} = %APPEND% m.ctrip.com \ No newline at end of file diff --git a/Surge/Module/DisneyRating.sgmodule b/Surge/Module/DisneyRating.sgmodule new file mode 100644 index 0000000000..0f8a3c8897 --- /dev/null +++ b/Surge/Module/DisneyRating.sgmodule @@ -0,0 +1,11 @@ +#!name=Disney+评分 +#!desc=Disney+剧集页显示IMDb / 烂番茄 / 豆瓣评分 +#!arguments=脚本引擎:jsc,调试模式:0 +#!arguments-desc=脚本引擎:jsc/webview/auto,默认jsc。\n\n调试模式:1/0,开启/关闭。 +#!category=🐻 NobyDa + +[Script] +DisneyRating = type=http-response,pattern=^https:\/\/disney\.api\.edge\.bamgrid\.com\/explore\/v\d\.\d+\/page\/entity-,requires-body=1,max-size=0,binary-body-mode=0,debug={{{调试模式}}},script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Disney/DisneyRating.js,engine={{{脚本引擎}}} + +[MITM] +hostname = %APPEND% disney.api.edge.bamgrid.com \ No newline at end of file diff --git a/Surge/Module/GetCookie.sgmodule b/Surge/Module/GetCookie.sgmodule new file mode 100644 index 0000000000..b26d78ce0c --- /dev/null +++ b/Surge/Module/GetCookie.sgmodule @@ -0,0 +1,17 @@ +#!name=🐻 签到脚本Cookie获取 +#!desc=该模块适用于NobyDa定时签到脚本的Cookie获取. 集成: 爱奇艺, 哔哩哔哩漫画, 百度贴吧, 快看漫画, 携程旅行。 +#!system=ios + +[Script] +爱奇艺Cookie = type=http-request,pattern=^https:\/\/passport\.iqiyi\.com\/apis\/user\/,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +哔哩漫画Cookie = type=http-request,pattern=^https:\/\/app\.bilibili\.com\/x\/v\d\/account\/myinfo,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Bilibili-DailyBonus/Manga.js + +百度贴吧Cookie = type=http-request,pattern=^https?:\/\/(c\.tieba|tiebac)\.baidu\.com\/c\/s\/login,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js + +快看漫画Cookie = type=http-request,pattern=^https:\/\/api\.kkmh\.com\/v\d\/passport\/user,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +携程旅行Cookie = type=http-response,pattern=^https:\/\/m\.ctrip\.com\/restapi\/soa2\/\d+\/[a-zA-Z]+Login(?:$|\?),requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Ctrip-DailyBonus/Ctrip.js + +[MITM] +hostname = %APPEND% passport.iqiyi.com, app.bilibili.com, c.tieba.baidu.com, tiebac.baidu.com, api.kkmh.com, m.ctrip.com \ No newline at end of file diff --git a/Surge/Module/GoogleCAPTCHA.sgmodule b/Surge/Module/GoogleCAPTCHA.sgmodule new file mode 100644 index 0000000000..88baccec9d --- /dev/null +++ b/Surge/Module/GoogleCAPTCHA.sgmodule @@ -0,0 +1,11 @@ +#!name=Google人机验证 +#!desc=Google搜索内容时并发使用多个策略/策略组,以避免可能出现的人机验证。注意:需要在模块参数填写策略/策略组名的正则表达式。 +#!arguments=策略正则,脚本引擎:auto +#!arguments-desc=策略正则:策略/策略组名的正则表达式,例如:\n^(🇸🇬|🇭🇰)\s.*\d+$ 如需同时使用所有策略/策略组可使用 .+ 表示。\n\n脚本引擎:jsc/webview/auto,默认auto。 +#!category=🐻 NobyDa + +[Script] +Google CAPTCHA = type=http-response,pattern=^https:\/\/www\.google\.com(?:\.[a-z]+|)\/(?:search\?(?:|.+?&)q=|$),requires-body=1,debug=0,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Surge/JS/Google_CAPTCHA.js,max-size=0,timeout=10,ability=http-client-policy,engine={{{脚本引擎}}},argument={{{策略正则}}} + +[MITM] +hostname = %APPEND% www.google.com* \ No newline at end of file diff --git a/Surge/Module/HuiJuDongManAds.sgmodule b/Surge/Module/HuiJuDongManAds.sgmodule new file mode 100644 index 0000000000..d339ec365c --- /dev/null +++ b/Surge/Module/HuiJuDongManAds.sgmodule @@ -0,0 +1,25 @@ +#!name=荟聚动漫 +#!desc=去除大多数弹屏以及底栏广告, 由于有广告缓存, 因此可能需要卸载App重装. @NobyDa + +# Update at 2022/07/11 + +[Rule] +#底栏 +DOMAIN,googleads.g.doubleclick.net,REJECT-TINYGIF +DOMAIN,www.19831110.com,REJECT-TINYGIF +#HTTP +AND,((USER-AGENT,%E8%8D%9F%E8%81%9A%E5%8A%A8%E6%BC%AB*), (URL-REGEX,\/ad)),REJECT-TINYGIF +#开屏 +DOMAIN-SUFFIX,admobile.top,REJECT-TINYGIF + +[URL Rewrite] +#弹屏, 搜索, 以及底栏白屏广告 +^https?:\/\/os8\.pw\/(adConfigs|appConfiguration\/getAd) - reject +^http:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/goad\/ad\/ - reject +^https?:\/\/api-access\.pangolin-sdk-toutiao\.com\/api\/ad\/ - reject +^https?:\/\/sf\d-ttcdn-tos\.pstatp\.com\/obj\/ad - reject +^https?:\/\/www\.51devapp\.com\/adconfigs - reject +^https?:\/\/.+?\.snssdk\.com\/ad\/ - reject + +[MITM] +hostname = %APPEND% sf?-ttcdn-tos.pstatp.com, www.51devapp.com, *.snssdk.com, www.19831110.com, api-access.pangolin-sdk-toutiao.com, os8.pw, www.umeng.com, www.adview.cn, adview.cn \ No newline at end of file diff --git a/Surge/Module/IPA_install.sgmodule b/Surge/Module/IPA_install.sgmodule new file mode 100644 index 0000000000..a9a707e58f --- /dev/null +++ b/Surge/Module/IPA_install.sgmodule @@ -0,0 +1,9 @@ +#!name=IPA应用辅助安装器 +#!desc=该模块可在iOS端辅助安装商店版或已签名IPA(需使用快捷指令 + Shu/Jsbox/pythonista), 查看脚本注释以了解具体方法; 安装演示可查看TG频道 @NobyDa + + +[Script] +IPA Installer = type=http-request,pattern=^https:\/\/nobyda.app/(install|download),requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/IPA-Installer/IPA-Installer.js + +[MITM] +hostname = %APPEND% nobyda.app \ No newline at end of file diff --git a/Surge/Module/KuaiKanComicsDailyBonus.sgmodule b/Surge/Module/KuaiKanComicsDailyBonus.sgmodule new file mode 100644 index 0000000000..c69570ca5c --- /dev/null +++ b/Surge/Module/KuaiKanComicsDailyBonus.sgmodule @@ -0,0 +1,13 @@ +#!name=🐻 快看漫画 [签到] +#!desc=每日定时签到,模块参数可调整签到时间。\n打开快看漫画APP点击"我的"即可获取cookie. +#!arguments=定时签到:10 9 * * *,禁用脚本:快看漫画[Cookie],禁用MITM:hostname +#!arguments-desc=定时签到:Cron表达式,默认每天早上 09:10 执行。\n\n禁用脚本:禁用获取Cookie脚本,输入 # 表示禁用。\n\n禁用MITM:禁用MITM主机名,输入 # 表示禁用。 +#!category=🐻 NobyDa + +[Script] +快看漫画[签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=60,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +{{{禁用脚本}}} = type=http-request,pattern=^https?:\/\/api\.kkmh\.com\/v\d\/passport\/user,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/KuaiKan-DailyBonus/KKMH.js + +[MITM] +{{{禁用MITM}}} = %APPEND% api.kkmh.com \ No newline at end of file diff --git a/Surge/Module/NewBing.sgmodule b/Surge/Module/NewBing.sgmodule new file mode 100644 index 0000000000..b35ccdd1b4 --- /dev/null +++ b/Surge/Module/NewBing.sgmodule @@ -0,0 +1,8 @@ +#!name=New Bing for other browsers +#!desc=Unlock browser restrictions for new bing AI search. + +[Header Rewrite] +^https:\/\/www\.bing\.com\/(search|new) header-replace-regex User-Agent ^\w+\/[0-9\.\s]+\((\w+);.+ "Mozilla/5.0 ($1; Intel Mac OS X 10_12_6) AppleWebKit/537.36 Chrome/110.0 Safari/537.36 Edg/110.0" + +[MITM] +hostname = %APPEND% www.bing.com \ No newline at end of file diff --git a/Surge/Module/RewriteRules.sgmodule b/Surge/Module/RewriteRules.sgmodule new file mode 100644 index 0000000000..cf583b0dd7 --- /dev/null +++ b/Surge/Module/RewriteRules.sgmodule @@ -0,0 +1,755 @@ +#!name=Ad rewrite rules, By NobyDa +#!desc=This module integrate lhie1 and ConnersHua, and some self use rewrite rules + +[URL Rewrite] + +# Update time: 2021.8.26 + +^https?:\/\/interface\.music\.163\.com\/eapi\/ad - reject +^https?:\/\/iadmusicmat\.music.126.net\/.*?jpg$ - reject +^https?:\/\/p\.c\.music\.126.net\/.*?jpg$ - reject +^https?:\/\/www.baidu.com\/?action=static&ms=1&version=css_page_2@0.*? - reject +^https?:\/\/shimo\.im\/api\/ads\?(.+?) - reject +^https?:\/\/c\.minisplat\.cn - reject +^https?:\/\/c1\.minisplat\.cn - reject +^https?:\/\/cache\.changjingyi\.cn - reject +^https?:\/\/cache\.gclick\.cn - reject +^https?:\/\/m\.coolaiy\.com\/b\.php - reject +^https?:\/\/www\.babyye\.com\/b\.php - reject +^https?:\/\/www\.gwv7\.com\/b\.php - reject +^https?:\/\/www\.likeji\.net\/b\.php - reject +^https?:\/\/211\.98\.70\.226:8080\/ - reject +^https?:\/\/211\.98\.71\.195:8080\/ - reject +^https?:\/\/211\.98\.71\.196:8080\/ - reject +^https?:\/\/.+?\/hls.cache.p4p\/ - reject +^https?:\/\/.+?\/music\/common\/upload\/t_splash_info - reject +^https?:\/\/.+?\/omts.tc.qq.com\/ - reject +^https?:\/\/.+?\/tips\/fcgi-bin\/fcg_get_advert - reject +^https?:\/\/.+?\/variety.tc.qq.com\/ - reject +^https?:\/\/bla\.gtimg\.com\/qqlive\/\d{6}.+?\.png - reject +^https?:\/\/imgcache\.qq\.com\/qqlive\/ - reject +^https?:\/\/lives\.l\.qq\.com\/livemsg\?sdtfrom= - reject +^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qiantu\/upload\/ - reject +^https?:\/\/mtteve\.beacon\.qq\.com\/analytics - reject +^https?:\/\/r\.inews\.qq\.com\/adsBlacklist - reject +^https?:\/\/r\.inews\.qq\.com\/getBannerAds - reject +^https?:\/\/r\.inews\.qq\.com\/getFullScreenPic - reject +^https?:\/\/r\.inews\.qq\.com\/getNewsRemoteConfig - reject +^https?:\/\/r\.inews\.qq\.com\/getSplash\?apptype=ios&startarticleid=&__qnr= - reject +^https?:\/\/r\.inews\.qq\.com\/searchHotCatList - reject +^https?:\/\/r\.inews\.qq\.com\/upLoadLoc - reject +^https?:\/\/splashqqlive\.gtimg\.com\/website\/\d{6} - reject +^https?:\/\/szextshort\.weixin\.qq\.com\/cgi-bin\/mmoc-bin\/ad\/ - reject +^https?:\/\/y\.gtimg\.cn\/music\/common\/upload\/targeted_ads - reject +^https?:\/\/api\.weibo\.cn\/2\/statuses\/extend\?gsid= - reject +^https?:\/\/edit\.sinaapp\.com\/ua\?t=adv - reject +^https?:\/\/free\.sinaimg\.cn\/u1\.img\.mobile\.sina\.cn - reject +^https?:\/\/simg\.s\.weibo\.com\/.+?_ios\d{2}\.gif - reject +^https?:\/\/storage\.wax\.weibo\.com\/\w+\.(png|jpg|mp4) - reject +^https?:\/\/u1\.img\.mobile\.sina\.cn\/public\/files\/image\/\d{3}x\d{2,4}.+?(png|jpg|mp4) - reject +^https?:\/\/(iyes|(api|hd)\.mobile)\.youku\.com\/(adv|common\/v3\/hudong\/new) - reject +^https?:\/\/.+?\.mp4\?ccode=0902 - reject +^https?:\/\/.+?\.mp4\?sid= - reject +^https?:\/\/ad\.api\.3g\.youku\.com - reject +^https?:\/\/api\.appsdk\.soku\.com\/bg\/r - reject +^https?:\/\/api\.appsdk\.soku\.com\/tag\/r - reject +^https?:\/\/api\.k\.sohu\.com\/api\/channel\/ad\/ - reject +^https?:\/\/api\.mobile\.youku\.com\/layout\/search\/hot\/word - reject +^https?:\/\/m\.youku\.com\/video\/libs\/iwt\.js - reject +^https?:\/\/pic\.k\.sohu\.com\/img8\/wb\/tj\/ - reject +^https?:\/\/r\.l\.youku\.com\/rec_at_click - reject +^https?:\/\/r1\.ykimg\.com\/\w{30,35}\.jpg - reject +^https?:\/\/r1\.ykimg\.com\/material\/.+?\/\d{3,4}-\d{4} - reject +^https?:\/\/r1\.ykimg\.com\/material\/.+?\/\d{6}\/\d{4}\/ - reject +^https?:\/\/vali\.cp31\.ott\.cibntv\.net\/youku - reject +^https?:\/\/api\.zhuishushenqi\.com\/advert - reject +^https?:\/\/api\.zhuishushenqi\.com\/notification\/shelfMessage - reject +^https?:\/\/api\.zhuishushenqi\.com\/recommend - reject +^https?:\/\/api\.zhuishushenqi\.com\/splashes\/ios - reject +^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview\.fcg - reject +^https?:\/\/api\.zhuishushenqi\.com\/user\/bookshelf-updated - reject +^https?:\/\/itunes\.apple\.com\/lookup\?id=575826903 - reject +^https?:\/\/iface2\.iqiyi\.com\/fusion\/3\.0\/fusion_switch - reject +^https?:\/\/agn\.aty\.sohu\.com\/m? - reject +^https?:\/\/api\.k\.sohu\.com\/api\/news\/adsense - reject +^https?:\/\/hui\.sohu\.com\/predownload2\/? - reject +^https?:\/\/m\.aty\.sohu\.com\/openload? - reject +^https?:\/\/mbl\.56\.com\/config\/v1\/common\/config\.union\.ios\.do? - reject +^https?:\/\/mmg\.aty\.sohu\.com\/mqs? - reject +^https?:\/\/mmg\.aty\.sohu\.com\/pvlog? - reject +^https?:\/\/photocdn\.sohu\.com\/tvmobilemvms - reject +^https?:\/\/s\.go\.sohu\.com\/adgtr\/\?gbcode=(ps|sv|offnavi|newvector|ulog\.imap|newloc)(\.map)?\.(baidu|n\.shifen)\.com - reject +^https?:\/\/afd\.baidu\.com\/afd\/entry - reject +^https?:\/\/als\.baidu\.com\/clog\/clog - reject +^https?:\/\/baichuan\.baidu\.com\/rs\/adpmobile\/launch - reject +^https?:\/\/bj\.bcebos\.com\/fc-feed\/0\/pic\/ - reject +^https?:\/\/c\.tieba\.baidu\.com\/\w+\/\w+\/(sync|newRnSync|newlog|mlog) - reject +^https?:\/\/c\.tieba\.baidu\.com\/c\/p\/img\?src= - reject +^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/logtogether\?cmd= - reject +^https?:\/\/fcvbjbcebos\.baidu\.com\/.+?\.mp4 - reject +^https?:\/\/gss0\.bdstatic\.com\/.+?\/static\/wiseindex\/img\/bd_red_packet\.png - reject +^https?:\/\/issuecdn\.baidupcs\.com\/issue\/netdisk\/guanggao\/ - reject +^https?:\/\/sm\.domobcdn\.com\/ugc\/\w\/ - reject +^https?:\/\/tb1\.bdstatic\.com\/tb\/cms\/ngmis\/adsense\/*\.jpg - reject +^https?:\/\/tb2\.bdstatic\.com\/tb\/mobile\/spb\/widget\/jump - reject +^https?:\/\/update\.pan\.baidu\.com\/statistics - reject +^https?:\/\/wapwenku\.baidu\.com\/view\/fengchao\/ - reject +^https?:\/\/wapwenku\.baidu\.com\/view\/fengchaoTwojump\/ - reject +^https?:\/\/wenku\.baidu\.com\/shifen\/ - reject +^https?:\/\/ad\.api\.moji\.com\/ad\/log\/stat - reject +^https?:\/\/ast\.api\.moji\.com\/assist\/ad\/moji\/stat - reject +^https?:\/\/cdn\.moji\.com\/adlink\/avatarcard - reject +^https?:\/\/cdn\.moji\.com\/adlink\/common - reject +^https?:\/\/cdn\.moji\.com\/adlink\/splash\/ - reject +^https?:\/\/cdn\.moji\.com\/advert\/ - reject +^https?:\/\/cdn2\.moji002\.com\/webpush\/ad2\/ - reject +^https?:\/\/fds\.api\.moji\.com\/card\/recommend - reject +^https?:\/\/show\.api\.moji\.com\/json\/showcase\/getAll - reject +^https?:\/\/stat\.moji\.com - reject +^https?:\/\/storage\.360buyimg\.com\/kepler-app - reject +^https?:\/\/ugc\.moji001\.com\/sns\/json\/profile\/get_unread - reject +^https?:\/\/api\.m\.mi\.com\/v1\/app\/start - reject +^https?:\/\/api\.jr\.mi\.com\/v1\/adv\/ - reject +^https?:\/\/image1\.chinatelecom-ec\.com\/images\/.+?\/\d{13}\.jpg - reject +^https?:\/\/m\.client\.10010\.com\/mobileService\/(activity|customer)\/(accountListData|get_client_adv|get_startadv) - reject +^https?:\/\/m\.client\.10010\.com\/uniAdmsInterface\/(getHomePageAd|getWelcomeAd) - reject +^https?:\/\/m1\.ad\.10010\.com\/noticeMag\/images\/imageUpload\/2\d{3} - reject +^https?:\/\/res\.mall\.10010\.cn\/mall\/common\/js\/fa\.js?referer= - reject +^https?:\/\/api\.newad\.ifeng\.com\/ClientAdversApi1508\?adids= - reject +^https?:\/\/c1\.ifengimg\.com\/.+?_w1080_h1410\.jpg - reject +^https?:\/\/exp\.3g\.ifeng\.com\/coverAdversApi\?gv=\. - reject +^https?:\/\/ifengad\.3g\.ifeng\.com\/ad\/pv\.php\?stat= - reject +^https?:\/\/iis1\.deliver\.ifeng\.com\/getmcode\?adid= - reject +^https?:\/\/.+?\/eapi\/[ad|event]\/ - reject +^https?:\/\/.+?\.127\.net\/ad - reject +^https?:\/\/.+?\/eapi\/(ad|log)\/ - reject +^https?:\/\/.+?\/eapi\/ad\/ - reject +^https?:\/\/c\.m\.163\.com\/nc\/gl\/ - reject +^https?:\/\/client\.mail\.163\.com\/apptrack\/confinfo\/searchMultiAds - reject +^https?:\/\/g1\.163\.com\/madfeedback - reject +^https?:\/\/img1\.126\.net\/.+?dpi=\w{7,8} - reject +^https?:\/\/img1\.126\.net\/channel14\/ - reject +^https?:\/\/mimg\.127\.net\/external\/smartpop-manger\.min\.js - reject +^https?:\/\/nex\.163\.com\/q - reject +^https?:\/\/oimage([a-z])([0-9])\.ydstatic\.com\/.+?&product=adpublish - reject +^https?:\/\/p[^4](c)?\.music\.126\.net\/\w+==\/10995\d{13}\.jpg$ - reject +^https?:\/\/dsp-impr2\.youdao\.com\/adload.s\? - reject +^https?:\/\/interface\.music\.163\.com\/eapi\/ad\/ - reject +^https?:\/\/.+?\/client?functionId=lauch\/lauchConfig&appName=paidaojia - reject +^https?:\/\/bdsp-x\.jd\.com\/adx\/ - reject +^https?:\/\/m\.360buyimg\.com\/mobilecms\/s640x1136_jfs\/ - reject +^https?:\/\/ms\.jr\.jd\.com\/gw\/generic\/base\/na\/m\/adInfo - reject +^https?:\/\/(\d{1,3}\.){1,3}\d{1,3}\/view\/dale-online\/dale_ad\/ - reject +^https?:\/\/api\.douban\.com\/v2\/app_ads\/common_ads - reject +^https?:\/\/img\d\.doubanio\.com\/view\/dale-online\/dale_ad\/ - reject +^https?:\/\/capi\.douyucdn\.cn\/lapi\/sign\/app(api)?\/getinfo\?client_sys=ios - reject +^https?:\/\/capi\.douyucdn\.cn\/api\/ios_app\/check_update - reject +^https?:\/\/capi\.douyucdn\.cn\/api\/v1\/getStartSend?client_sys=ios - reject +^https?:\/\/douyucdn\.cn\/.+?\/appapi\/getinfo - reject +^https?:\/\/rtbapi.douyucdn.cn\/japi\/sign\/app\/getinfo - reject +^https?:\/\/staticlive\.douyucdn\.cn\/.+?\/getStartSend - reject +^https?:\/\/staticlive\.douyucdn\.cn\/upload\/signs\/ - reject +^https?:\/\/elemecdn\.com\/.+?\/sitemap - reject +^https?:\/\/fuss10\.elemecdn\.com\/.+?\/w\/640\/h\/\d{3,4} - reject +^https?:\/\/fuss10\.elemecdn\.com\/.+?\/w\/750\/h\/\d{3,4} - reject +^https?:\/\/fuss10\.elemecdn\.com\/.+?\.mp4 - reject +^https?:\/\/m\.elecfans\.com\/static\/js\/ad\.js - reject +^https?:\/\/www1\.elecfans\.com\/www\/delivery\/ - reject +^https?:\/\/p\d\.pstatp\.com\/origin - reject +^https?:\/\/pb\d\.pstatp\.com\/origin - reject +^https?:\/\/adse.+?\.com\/[a-z]{4}\/loading\?appid= - reject +^https?:\/\/adse\.ximalaya\.com\/ting\/feed\?appid= - reject +^https?:\/\/adse\.ximalaya\.com\/ting\/loading\?appid= - reject +^https?:\/\/adse\.ximalaya\.com\/ting\?appid= - reject +^https?:\/\/fdfs\.xmcdn\.com\/group21\/M03\/E7\/3F\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group21\/M0A\/95\/3B\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group22\/M00\/92\/FF\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group22\/M05\/66\/67\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group22\/M07\/76\/54\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group23\/M01\/63\/F1\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group23\/M04\/E5\/F6\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group23\/M07\/81\/F6\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group23\/M0A\/75\/AA\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group24\/M03\/E6\/09\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group24\/M07\/C4\/3D\/ - reject +^https?:\/\/fdfs\.xmcdn\.com\/group25\/M05\/92\/D1\/ - reject +^https?:\/\/book\.img\.ireader\.com\/group6\/M00 - reject +^https?:\/\/api\.ycapp\.yiche\.com\/appnews\/getadlist - reject +^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getadlist - reject +^https?:\/\/api\.ycapp\.yiche\.com\/yicheapp\/getappads\/ - reject +^https?:\/\/cheyouapi\.ycapp\.yiche\.com\/appforum\/getusermessagecount - reject +^https?:\/\/.+?\.googlevideo\.com\/ptracking\?pltype=adhost - reject +^https?:\/\/.+?\.youtube\.com\/api\/stats\/ads - reject +^https?:\/\/.+?\.youtube\.com\/get_midroll - reject +^https?:\/\/.+?\.youtube\.com\/pagead\/ - reject +^https?:\/\/.+?\.youtube\.com\/ptracking\? - reject +^https?:\/\/m\.youtube\.com\/_get_ads - reject +^https?:\/\/pagead2\.googlesyndication\.com\/pagead\/ - reject +^https?:\/\/premiumyva\.appspot\.com\/vmclickstoadvertisersite - reject +^https?:\/\/s\.youtube\.com\/api\/stats\/watchtime?adformat - reject +^https?:\/\/s0\.2mdn\.net\/ads\/ - reject +^https?:\/\/stats\.tubemogul\.com\/stats\/ - reject +^https?:\/\/youtubei\.googleapis\.com/.+?ad_break - reject +^https?:\/\/www\.tsytv\.com\.cn\/api\/app\/ios\/ads - reject +^https?:\/\/res\.kfc\.com\.cn\/advertisement\/ - reject +^https?:\/\/img\.yun\.01zhuanche\.com\/statics\/app\/advertisement\/.+?-750-1334 - reject +^https?:\/\/img01\.10101111cdn\.com\/adpos\/share\/ - reject +^https?:\/\/bank\.wo\.cn\/v9\/getstartpage - reject +^https?:\/\/img\.ihytv\.com\/material\/adv\/img\/ - reject +^https?:\/\/img\.meituan\.net\/midas\/ - reject +^https?:\/\/p\d\.meituan\.net\/(mmc|wmbanner)\/ - reject +^https?:\/\/mmgr\.gtimg\.com\/gjsmall\/qqpim\/public\/ios\/splash\/.+?\/\d{4}_\d{4} - reject +^https?:\/\/img\.jiemian\.com\/ads\/ - reject +^https?:\/\/adproxy\.autohome\.com\.cn\/AdvertiseService\/ - reject +^https?:\/\/app2\.autoimg\.cn\/appdfs\/ - reject +^https?:\/\/mage\.if\.qidian\.com\/Atom\.axd\/Api\/Client\/GetConfIOS - reject +^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+?\/670x900 - reject +^https?:\/\/img\d{2}\.ddimg\.cn\/upload_img\/.+?\/750x1064 - reject +^https?:\/\/mapi\.dangdang\.com\/index\.php\?action=init&user_client=iphone - reject +^https?:\/\/dl\.app\.gtja\.com\/dzswem\/kvController\/ - reject +^https?:\/\/dl\.app\.gtja\.com\/operation\/config\/startupConfig\.json - reject +^https?:\/\/api\.laifeng\.com\/v1\/start\/ads - reject +^https?:\/\/.+?\.pstatp\.com\/img\/ad - reject +^https?:\/\/.+?\.(snssdk|amemv)\.com\/api\/ad\/ - reject +^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/aweme\/stats\/ - reject +^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/device\/update\/ - reject +^https?:\/\/aweme\.snssdk\.com\/aweme\/v1\/screen\/ad\/ - reject +^https?:\/\/aweme\.snssdk\.com\/service\/1\/app_logout\/ - reject +^https?:\/\/aweme\.snssdk\.com\/service\/2\/app_log - reject +^https?:\/\/frontier\.snssdk\.com\/ - reject +^https?:\/\/sf\w-ttcdn-tos\.pstatp\.com\/obj\/web\.business\.image - reject +^https?:\/\/api\.xiachufang\.com\/v2\/ad\/ - reject +^https?:\/\/connect\.facebook\.net\/en_US\/fbadnw\.js - reject +^https?:\/\/qzonestyle\.gtimg\.cn\/qzone\/biz\/gdt\/mob\/sdk\/ios\/v2\/ - reject +^https?:\/\/cdn\.kuaidi100\.com\/images\/open\/appads - reject +^https?:\/\/p\.kuaidi100\.com\/mobile\/mainapi\.do - reject +^https?:\/\/api\.m\.mi\.com\/.+?\/app\/start - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/homepage_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sleep_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_summary_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/sport_training_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/step_detail_ad\? - reject +^https?:\/\/api-mifit\.huami\.com\/discovery\/mi\/discovery\/training_video_ad\? - reject +^https?:\/\/.+?\/portal\.php\?a=get_ads - reject +^https?:\/\/.+?\/portal\.php\?c=duiba - reject +^https?:\/\/.+?\/portal\.php\?a=get_coopen_ads - reject +^https?:\/\/weicoapi\.weico\.cc\/img\/ad\/ - reject +^https?:\/\/.+?\/weico4ad\/ad\/ - reject +^https?:\/\/g\.cdn\.pengpengla\.com\/starfantuan\/boot-screen-info\/ - reject +^https?:\/\/discuz\.gtimg\.cn\/cloud\/scripts\/discuz_tips\.js - reject +^https?:\/\/sapi\.guopan\.cn\/get_buildin_ad - reject +^https?:\/\/789\.kakamobi\.cn\/.+?adver - reject +^https?:\/\/smart\.789\.image\.mucang\.cn\/advert - reject +^https?:\/\/bbs\.airav\.cc\/data\/.+?\.jpg - reject +^https?:\/\/image\.airav\.cc\/AirADPic\/.+?\.gif - reject +^https?:\/\/m\.airav\.cc\/images\/Mobile_popout_cn\.gif - reject +^https?:\/\/cmsapi\.wifi8\.com\/v1\/emptyAd\/info - reject +^https?:\/\/cmsapi\.wifi8\.com\/v2\/adNew\/config - reject +^https?:\/\/cmsfile\.wifi8\.com\/uploads\/png\/ - reject +^https?:\/\/sso\.ifanr\.com\/jiong\/IOS\/appso\/splash\/ - reject +^https?:\/\/oimage\w\d\.ydstatic\.com\/image\?.+?=adpublish - reject +^https?:\/\/118\.178\.214\.118\/yyting\/advertclient\/ClientAdvertList\.action - reject +^https?:\/\/dapis\.mting\.info\/yyting\/advertclient\/ClientAdvertList\.action - reject +^https?:\/\/192\.133.+?\.mp4$ - reject +^https?:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore - reject +^https?:\/\/api\.app\.vhall\.com\/v5\/000\/webinar\/launch - reject +^https?:\/\/img\.53site\.com\/Werewolf\/AD\/ - reject +^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+?\/getAdvertise\.php - reject +^https?:\/\/werewolf\.53site\.com\/Werewolf\/.+?\/getShareVideodb\.php - reject +^https?:\/\/a\.applovin\.com\/.+?\/ad - reject +^https?:\/\/app\.wy\.guahao\.com\/json\/white\/dayquestion\/getpopad - reject +^https?:\/\/kano\.guahao\.cn\/.+?\?resize=\d{3}-\d{4} - reject +^https?:\/\/api\.chelaile\.net\.cn\/adpub\/ - reject +^https?:\/\/api\.chelaile\.net\.cn\/goocity\/advert\/ - reject +^https?:\/\/atrace\.chelaile\.net\.cn\/adpub\/ - reject +^https?:\/\/atrace\.chelaile\.net\.cn\/exhibit\?&adv_image - reject +^https?:\/\/pic1\.chelaile\.net\.cn\/adv\/ - reject +^https?:\/\/images\.91160\.com\/primary\/ - reject +^https?:\/\/d\.1qianbao\.com\/youqian\/ads\/ - reject +^https?:\/\/api\.huomao\.com\/channels\/loginAd - reject +^https?:\/\/api\.kkmh\.com\/v\d\/(ad|advertisement)\/ - reject +^https?:\/\/i1\.hoopchina\.com\.cn\/blogfile\/.+?_\d{3}x\d{4} - reject +^https?:\/\/.+?\/letv-gug\/ - reject +^https?:\/\/pcvideoyd\.titan\.mgtv\.com\/pb\/ - reject +^https?:\/\/classbox2\.kechenggezi\.com\/api\/v1\/sponge\/pull\?request_time= - reject +^https?:\/\/e\.dangdang\.com\/media\/api.+?\?action=getDeviceStartPage - reject +^https?:\/\/api\.smzdm\.com\/v1\/util\/loading - reject +^https?:\/\/api\.smzdm\.com\/v2\/util\/banner - reject +^https?:\/\/app\.veryzhun\.com\/ad\/admob - reject +^https?:\/\/api\.fengshows\.com\/api\/launchAD - reject +^https?:\/\/img\.rr\.tv\/banner\/.+?\.jpg - reject +^https?:\/\/ctrl\.zmzapi\.net\/app\/ads - reject +^https?:\/\/ctrl\.zmzapi\.net\/app\/init - reject +^https?:\/\/api\.laosiji\.com\/user\/startpage\/ - reject +^https?:\/\/adm\.10jqka\.com\.cn\/interface\/getads\.php - reject +^https?:\/\/smkmp\.96225\.com\/smkcenter\/ad\/.+?\/adBanner - reject +^https?:\/\/m\.ibuscloud.com\/v2\/app\/getStartPage - reject +^https?:\/\/api\.mddcloud\.com\.cn\/api\/ad\/getClassAd\.action - reject +^https?:\/\/api\.mddcloud\.com\.cn\/api\/advert\/getHomepage\.action - reject +^https?:\/\/daoyu\.sdo\.com\/api\/userCommon\/getAppStartAd - reject +^https?:\/\/api\.gotokeep\.com\/ads - reject +^https?:\/\/static1\.keepcdn\.com\/.+?\d{3}x\d{4} - reject +^https?:\/\/aarkissltrial\.secure2\.footprint\.net\/v1\/ads - reject +^https?:\/\/rm\.aarki\.net\/v1\/ads - reject +^https?:\/\/182\.92\.244\.70\/d\/json\/ - reject +^https?:\/\/.+?\/videos\/KnifeHit_4\/gear3\/ - reject +^https?:\/\/images\.kartor\.cn\/.+?\.html - reject +^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/appspace-client\/cr\/sys\/popAdv - reject +^https?:\/\/app3\.qdaily\.com\/app3\/boot_advertisements\.json - reject +^https?:\/\/fm\.fenqile\.com\/routev2\/other\/getfloatAd\.json - reject +^https?:\/\/fm\.fenqile\.com\/routev2\/other\/startImg\.json - reject +^https?:\/\/.+?\/vips-mobile\/router\.do\?api_key= - reject +^https?:\/\/consumer\.fcbox\.com\/v1\/ad\/OpeningAdInfo\/ - reject +^https?:\/\/api\.feng\.com[\s\S]*?Claunch_screen - reject +^https?:\/\/fengplus\.feng\.com\/index\.php\?r=api\/slide\/.+?Ads - reject +^https?:\/\/.+?\/img\/ad\.union\.api\/ - reject +^https?:\/\/.+?\/v1\/iflyad\/ - reject +^https?:\/\/ggic\.cmvideo\.cn\/ad\/ - reject +^https?:\/\/ggic2\.cmvideo\.cn\/ad\/ - reject +^https?:\/\/ggv\.cmvideo\.cn\/v1\/iflyad\/ - reject +^https?:\/\/agent-count\.pconline\.com\.cn\/counter\/adAnalyse\/ - reject +^https?:\/\/ivy\.pchouse\.com\.cn\/adpuba\/ - reject +^https?:\/\/www\.oschina\.net\/action\/apiv2\/get_launcher - reject +^https?:\/\/activity2\.api\.ofo\.com\/ofo\/Api\/v2\/ads - reject +^https?:\/\/ma\.ofo\.com\/ads - reject +^https?:\/\/supportda\.ofo\.com\/adaction\? - reject +^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/ADLog - reject +^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/GetAD - reject +^https?:\/\/gw\.aihuishou\.com\/app-portal\/home\/getadvertisement - reject +^https?:\/\/app\.58\.com\/api\/log\/ - reject +^https?:\/\/www\.duokan\.com/pictures? - reject +^https?:\/\/www\.duokan\.com/promotion_day - reject +^https?:\/\/api\d?\.tiktokv\.com\/api\/ad\/ - reject +^https?:\/\/api\d?\.musical\.ly\/api\/ad\/ - reject +^https?:\/\/mangaapi\.manhuaren\.com\/v1\/public\/getStartPageAds - reject +^https?:\/\/b-api\.ins\.miaopai\.com\/1\/ad/ - reject +^https?:\/\/api5\.futunn\.com\/ad\/ - reject +^https?:\/\/images\.client\.vip\.xunlei\.com\/.+?\/advert\/ - reject +^https?:\/\/tqt\.weibo\.cn\/.+?advert\.index - reject +^https?:\/\/tqt\.weibo\.cn\/overall\/redirect\.php\?r=tqt_sdkad - reject +^https?:\/\/tqt\.weibo\.cn\/overall\/redirect\.php\?r=tqtad - reject +^https?:\/\/cdn\.tiku\.zhan\.com\/banner - reject +^https?:\/\/capi\.mwee\.cn/app-api/V12/app/getstartad - reject +^https?:\/\/aes\.acfun\.cn\/s\?adzones - reject +^https?:\/\/api\.catch\.gift\/api\/v3\/pagead\/ - reject +^https?:\/\/imeclient\.openspeech\.cn\/adservice\/ - reject +^https?:\/\/m\.yap\.yahoo\.com\/v\d{2}\/getAds\.do - reject +^https?:\/\/www\.myhug\.cn\/ad\/ - reject +^https?:\/\/.+?\/api\/app\/member\/ver2\/user\/login\/ - reject +^https?:\/\/a\.qiumibao\.com\/activities\/config\.php - reject +^https?:\/\/.+?\/allOne\.php\?ad_name - reject +^https?:\/\/open\.qyer\.com\/qyer\/startpage\/ - reject +^https?:\/\/open\.qyer.com\/qyer\/config\/get - reject +^https?:\/\/media\.qyer\.com\/ad\/ - reject +^https?:\/\/api\.qiuduoduo\.cn\/guideimage - reject +^https?:\/\/i\.ys7\.com\/api\/ads - reject +^https?:\/\/api\.gaoqingdianshi\.com\/api\/v2\/ad - reject +^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\\/\/d+\\/\/d+\/BbsImg\.(?<=(big.(png|jpg)))$ - reject +^https?:\/\/games\.mobileapi\.hupu\.com\/.+?\/(search|interfaceAdMonitor|status|hupuBbsPm)/(hotkey|init|hupuBbsPm)\. - reject +^https?:\/\/games\.mobileapi\.hupu\.com\/interfaceAdMonitor - reject +^https?:\/\/m5\.amap\.com\/ws\/valueadded\/ - reject +^https?:\/\/pic\.xiami\.net\/images\/common\/uploadpic[\s\S]*?\.jpg$ - reject +^https?:\/\/img\.zuoyebang\.cc\/zyb-image[\s\S]*?\.jpg - reject +^https?:\/\/.+?allOne\.php\?ad_name=main_splash_ios - reject +^https?:\/\/.+?resource=article\/recommend\&accessToken= - reject +^https?:\/\/cdn\.api\.fotoable\.com\/Advertise\/ - reject +^https?:\/\/counter\.ksosoft\.com\/ad\.php - reject +^https?:\/\/creatives\.ftimg\.net\/ads - reject +^https?:\/\/dd\.iask\.cn\/ddd\/adAudit - reject +^https?:\/\/g\.tbcdn\.cn\/mtb\/ - reject +^https?:\/\/huichuan\.sm\.cn\/jsad - reject +^https?:\/\/iflow\.uczzd\.cn\/log\/ - reject +^https?:\/\/iphone265g\.com\/templates\/iphone\/bottomAd\.js - reject +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/ad - reject +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/mobile\.advert\.js - reject +^https?:\/\/m.+?\.china\.com\.cn\/statics\/sdmobile\/js\/mobileshare\.js - reject +^https?:\/\/mobile-pic\.cache\.iciba\.com\/feeds_ad\/ - reject +^https?:\/\/overseas\.weico\.cc\/portal\.php\?a=get_coopen_ads - reject +^https?:\/\/player\.hoge\.cn\/advertisement\.swf - reject +^https?:\/\/ress\.dxpmedia\.com\/appicast\/ - reject +^https?:\/\/s3\.pstatp\.com\/inapp\/TTAdblock\.css - reject +^https?:\/\/sdk\.99shiji\.com\/ad\/ - reject +^https?:\/\/statc\.mytuner\.mobi\/media\/banners\/ - reject +^https?:\/\/static\.cnbetacdn\.com\/assets\/adv - reject +^https?:\/\/static\.iask\.cn\/m-v20161228\/js\/common\/adAudit\.min\.js - reject +^https?:\/\/v\.17173\.com\/api\/Allyes\/ - reject +^https?:\/\/wmedia-track\.uc\.cn - reject +^https?:\/\/www\.ft\.com\/__origami\/service\/image\/v2\/images\/raw\/https%3A%2F%2Fcreatives\.ftimg\.net%2Fads* - reject +^https?:\/\/www\.lianbijr\.com\/adPage\/ - reject +^https?:\/\/a\.applovin\.com\/3\.0\/ad - reject +^https?:\/\/app\.58\.com\/api\/home\/advertising\/ - reject +^https?:\/\/app\.58\.com\/api\/home\/appadv\/ - reject +^https?:\/\/app\.58\.com\/api\/home\/invite\/popupAdv - reject +^https?:\/\/.+?\.58cdn\.com\.cn\/brandads\/ - reject +^https?:\/\/render\.alipay\.com\/p\/s\/h5data\/prod\/spring-festival-2019-h5data\/popup-h5data\.json - reject +^https?:\/\/m\d{1}\.amap\.com\/ws\/valueadded\/alimama\/splash_screen\/ - reject +^https?:\/\/a\.apicloud\.com\/start_page\/ - reject +^https?:\/\/cover.baidu.com\/cover\/page\/dspSwitchAds\/ - reject +^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/splashSchedule - reject +^https?:\/\/.+?\/client\/phpui2\/ - reject +^https?:\/\/.+?\.(musical|snssdk)\.(com|ly)\/(api|motor)\/ad\/ - reject +^https?:\/\/dsp\.toutiao\.com\/api\/xunfei\/ads\/ - reject +^https?:\/\/.+?\.snssdk\.com\/motor\/operation\/activity\/display\/config\/V2\/ - reject +^https?:\/\/7n\.bczcdn\.com\/launchad\/ - reject +^https?:\/\/channel\.beitaichufang\.com\/channel\/api\/v1\/promote\/ios\/start\/page - reject +^https?:\/\/iapi\.bishijie\.com\/actopen\/advertising\/ - reject +^https?:\/\/app\.api\.ke\.com\/config\/config\/bootpage - reject +^https?:\/\/creditcard\.ecitic\.com\/citiccard\/wtk\/piwik\/piwik\.php - reject +^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/appspace-getway\/getWay\/appspace-system-web\/cr\/v5\/appStartAdv - reject +^https?:\/\/www\.cmbc\.com\.cn\/m\/image\/loadingpage\/ - reject +^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d{25}\.(png|jpg) - reject +^https?:\/\/app\.10086\.cn\/biz-orange\/DN\/(findSale|homeSale)\/getsaleAdver - reject +^https?:\/\/m\.client\.10010\.com\/mobileService\/customer\/accountListData\.htm - reject +^https?:\/\/m\.client\.10010\.com\/uniAdmsInterface\/getWelcomeAd - reject +^https?:\/\/cntv\.hls\.cdn\.myqcloud\.com\/.+?\?maxbr=850 - reject +^https?:\/\/asp\.cntv\.myalicdn\.com\/.+?\?maxbr=850 - reject +^https?:\/\/www\.cntv\.cn\/nettv\/adp\/ - reject +^https?:\/\/v\.cctv\.com\/.+?850 - reject +^https?:\/\/(api|atrace)\.chelaile\.net\.cn\/adpub\/ - reject +^https?:\/\/cap\.caocaokeji\.cn\/advert-bss\/ - reject +^https?:\/\/erebor\.douban\.com\/count\/\?ad= - reject +^https?:\/\/img\d{1}\.doubanio\.com\/view\/dale-online\/dale_ad/ - reject +^https?:\/\/rtbapi\.douyucdn\.cn\/japi\/sign\/app\/getinfo - reject +^https?:\/\/mapi\.dangdang\.com\/index\.php\?action=init - reject +^https?:\/\/api\.daydaycook\.com\.cn\/daydaycook\/server\/ad\/ - reject +^https?:\/\/cms\.daydaycook\.com\.cn\/api\/cms\/advertisement\/ - reject +^https?:\/\/www\.dandanzan\.com\/res\/gdsefse\.js - reject +^https?:\/\/mobile-api2011\.elong\.com\/(adgateway|adv)\/ - reject +^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/(adgateway|adv)\/ - reject +^https?:\/\/foodie-api\.yiruikecorp\.com\/v1\/(banner|notice)\/overview - reject +^https?:\/\/youtubei\.googleapis\.com\/youtubei\/.+?ad_ - reject +^https?:\/\/youtubei\.googleapis\.com\/youtubei\/.+?log_ - reject +^https?:\/\/.+?\.youtube\.com\/get_midroll_ - reject +^https?:\/\/.+?\.youtube\.com\/ptracking - reject +^https?:\/\/gateway\.shouqiev\.com\/fsda\/app\/bootImage\.json - reject +^https?:\/\/smkmp\.96225.com\/smkcenter\/ad/ - reject +^https?:\/\/games\.mobileapi\.hupu\.com\/.+?\/status\/init - reject +^https?:\/\/games\.mobileapi\.hupu\.com\/.+?\/interfaceAdMonitor\/ - reject +^https?:\/\/47\.97\.20\.12\/ad\/ - reject +^https?:\/\/iface\.iqiyi\.com\/api\/getNewAdInfo - reject +^https?:\/\/.+?\/(mixer|track2)\? - reject +^https?:\/\/act\.vip\.iqiyi\.com\/interact\/api\/show.do - reject +^https?:\/\/act\.vip\.iqiyi\.com\/interact\/api\/v2\/show - reject +^https?:\/\/(bdsp-x|dsp-x)\.jd\.com\/adx\/ - reject +^https?:\/\/api\.jxedt\.com\/ad\/ - reject +^https?:\/\/richmanapi\.jxedt\.com\/api\/ad\/ - reject +^https?:\/\/counter\.ksosoft.com\/ad\.php - reject +^https?:\/\/ios\.wps\.cn\/ad-statistics-service - reject +^https?:\/\/.+?\.kingsoft-office-service\.com\/ad - reject +^https?:\/\/dict-mobile\.iciba\.com\/interface\/index\.php\?.+?(c=ad|collectFeedsAdShowCount|KSFeedsAdCardViewController) - reject +^https?:\/\/service\.iciba\.com\/popo\/open\/screens\/v3\?adjson - reject +^https?:\/\/api\.kkmh\.com\/.+?(ad|advertisement)\/ - reject +^https?:\/\/.+?\/resource\/m\/sys\/app\/adpos - reject +^https?:\/\/.+?\/resource\/m\/promo\/adsense - reject +^https?:\/\/api\.jr\.mi\.com\/jr\/api\/playScreen - reject +^https?:\/\/api\.mgzf\.com\/renter-operation\/home\/startHomePage - reject +^https?:\/\/cdn\.moji\.com\/(adoss|adlink)\/ - reject +^https?:\/\/mob\.mddcloud\.com\.cn\/api\/(ad|advert)\/ - reject +^https?:\/\/p\d{1}\.meituan\.net\/(adunion|display|linglong|mmc|wmbanner)\/ - reject +^https?:\/\/s3plus\.meituan\.net\/.+?\/linglong\/ - reject +^https?:\/\/capi.mwee.cn/app-api/V12/app/getstartad - reject +^https?:\/\/.+?\/cdn-adn\/ - reject +^https?:\/\/mapi\.mafengwo\.cn\/ad\/ - reject +^https?:\/\/mapi\.mafengwo\.cn\/travelguide\/ad\/ - reject +^https?:\/\/oimage([a-z])([0-9])\.ydstatic\.com\/.+?adpublish - reject +^https?:\/\/sp\.kaola\.com\/api\/openad - reject +^https?:\/\/support\.you\.163\.com\/xhr\/boot\/getBootMedia\.json - reject +^https?:\/\/nnapp\.cloudbae\.cn\/mc\/api\/advert/ - reject +^https?:\/\/dili\.bdatu\.com\/jiekou\/ad\/ - reject +^https?:\/\/wap\.ngchina\.cn\/news\/adverts\/ - reject +^https?:\/\/ma\.ofo\.com\/ads\/ - reject +^https?:\/\/ma\.ofo\.com\/adImage\/ - reject +^https?:\/\/cmsapi\.wifi8\.com\/v\d{1}\/(emptyAd|adNew)\/ - reject +^https?:\/\/pss\.txffp\.com\/piaogen\/images\/launchScreen/ - reject +^https?:\/\/notch\.qdaily\.com\/api\/v2\/boot_ad - reject +^https?:\/\/msspjh\.emarbox\.com\/getAdConfig - reject +^https?:\/\/api\.videozhishi\.com\/api\/getAdvertising - reject +^https?:\/\/sdkapp\.uve\.weibo\.com\/interface\/sdk\/sdkad\.php - reject +^https?:\/\/wbapp\.uve\.weibo\.com\/wbapplua\/wbpullad\.lua - reject +^https?:\/\/sdkapp\.uve\.weibo\.com/\interface\/sdk\/actionad\.php - reject +^https?:\/\/tqt\.weibo\.cn\/api\/advert\/ - reject +^https?:\/\/s1\.api\.tv\.itc\.cn\/v4\/mobile\/control\/switch\.json - reject +^https?:\/\/www\.shihuo\.cn\/app3\/saveAppInfo - reject +^https?:\/\/gw-passenger\.01zhuanche\.com\/gw-passenger\/car-rest\/webservice\/passenger\/recommendADs - reject +^https?:\/\/gw-passenger\.01zhuanche\.com\/gw-passenger\/zhuanche-passenger-token\/leachtoken\/webservice\/homepage\/queryADs - reject +^https?:\/\/ssl\.kohsocialapp\.qq\.com:10001\/game\/buttons - reject +^https?:\/\/qt\.qq\.com\/lua\/mengyou\/get_splash_screen_info - reject +^https?:\/\/3gimg\.qq\.com\/tencentMapTouch\/app\/activity\/ - reject +^https?:\/\/btrace\.qq\.com - reject +^https?:\/\/vv\.video\.qq\.com\/getvmind\? - reject +^https?:\/\/r\.inews\.qq\.com\/getQQNewsRemoteConfig - reject +^https?:\/\/mp\.weixin\.qq.com\/mp\/ad_complaint - reject +^https?:\/\/mp\.weixin\.qq.com\/mp\/advertisement_report - reject +^https?:\/\/mp\.weixin\.qq.com\/mp\/ad_video - reject +^https?:\/\/api\.gaoqingdianshi\.com\/api\/v2\/ad\/ - reject +^https?:\/\/adpai\.thepaper\.cn\/.+?&ad= - reject +^https?:\/\/mrobot\.pconline\.com\.cn\/v3\/ad2p - reject +^https?:\/\/mrobot\.pconline\.com\.cn\/s\/onlineinfo\/ad\/ - reject +^https?:\/\/mrobot\.pcauto\.com\.cn\/v3\/ad2p - reject +^https?:\/\/mrobot\.pcauto\.com\.cn\/xsp\/s\/auto\/info\/preload\.xsp - reject +^https?:\/\/static\.vuevideo\.net\/styleAssets\/.+?\/splash_ad - reject +^https?:\/\/static\.vuevideo\.net\/styleAssets\/advertisement\/ - reject +^https?:\/\/overseas\.weico\.cc/portal\.php\?a=get_coopen_ads - reject +^https?:\/\/api-release\.wuta-cam\.com\/ad_tree - reject +^https?:\/\/res-release\.wuta-cam\.com\/json\/ads_component_cache\.json - reject +^https?:\/\/snailsleep\.net\/snail\/v1\/screen\/qn\/get\? - reject +^https?:\/\/snailsleep\.net\/snail\/v1\/adTask\/ - reject +^https?:\/\/nochange\.ggsafe\.com\/ad\/ - reject +^https?:\/\/thor\.weidian\.com\/ares\/home\.splash\/ - reject +^https?:\/\/api\.xiachufang\.com\/v2\/ad/ - reject +^https?:\/\/api\.psy-1\.com\/cosleep\/startup - reject +^https?:\/\/ctrl\.(playcvn|zmzapi)\.(com|net)\/app\/(ads|init) - reject +^https?:\/\/app\.mixcapp\.com\/mixc\/api\/v2\/ad - reject +^https?:\/\/(api|b)\.zhuishushenqi\.com\/advert - reject +^https?:\/\/api\.21jingji\.com\/ad\/ - reject +^https?:\/\/m\d\.amap\.com\/ws\/valueadded\/alimama\/splash_screen\/ - reject +^https?:\/\/c\.tieba\.baidu\.com\/c\/f\/forum\/getAdInfo - reject +^https?:\/\/.+?\.(musical|snssdk|tiktokv)\.(com|ly)\/(api|motor)\/ad\/ - reject +^https?:\/\/channel\.beitaichufang\.com\/channel\/api\/v\d\/promote\/ios\/start\/page - reject +^https?:\/\/mlife\.jf365\.boc\.cn\/AppPrj\/FirstPic\.do\? - reject +^https?:\/\/status\.boohee\.com\/api\/v\d\/app_square\/start_up_with_ad - reject +^https?:\/\/m\.creditcard\.ecitic\.com\/citiccard\/mbk\/.+?\/appStartAdv - reject +^https?:\/\/v\.icbc\.com\.cn\/userfiles\/Resources\/WAP\/advertisement\/ - reject +^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d\.(png|jpg) - reject +^https?:\/\/clientaccess\.10086\.cn\/biz-orange\/DN\/init\/startInit - reject +^https?:\/\/pic\d\.chelaile\.net\.cn\/adv\/ - reject +^https?:\/\/api\.intsig\.net\/user\/cs\/operating\/app\/get_startpic\/ - reject +^https?:\/\/api\.caijingmobile\.com\/(ad|advert)\/ - reject +^https?:\/\/.+?\/v2\/app_ads\/ - reject +^https?:\/\/img\d\.doubanio\.com\/view\/dale-online\/dale_ad/ - reject +^https?:\/\/e\.dangdang\.com\/.+?getDeviceStartPage - reject +^https?:\/\/dxy\.com\/app\/i\/ask\/biz\/feed\/launch - reject +^https?:\/\/foodie-api\.yiruikecorp\.com\/v\d\/(banner|notice)\/overview - reject +^https?:\/\/www\.flyertea\.com\/source\/plugin\/mobile\/mobile\.php\?module=advis - reject +^https?:\/\/app\.variflight\.com\/ad\/ - reject +^https?:\/\/app\.variflight\.com\/v\d\/advert\/ - reject +^https?:\/\/games\.mobileapi\.hupu\.com\/.+?\/(interfaceAdMonitor|interfaceAd)\/ - reject +^https?:\/\/consumer\.fcbox\.com\/v\d\/ad\/ - reject +^https?:\/\/api\.haohaozhu\.cn\/index\.php\/home\/AppInit\/getStartPhoto - reject +^https?:\/\/ih2\.ireader\.com\/zyapi\/bookstore\/ad\/ - reject +^https?:\/\/ih2\.ireader\.com\/zyapi\/self\/screen\/ad - reject +^https?:\/\/ih2\.ireader\.com\/zycl\/api\/ad\/ - reject +^https?:\/\/.+?\.kakamobi\.cn\/api\/open\/v\d\/advert-sdk\/ - reject +^https?:\/\/service\.iciba\.com\/popo\/open\/screens\/v\d\?adjson - reject +^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/MobileAdServer\/ - reject +^https?:\/\/(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})(\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})){3}\/EcomResourceServer/AdPlayPage/adinfo - reject +^https?:\/\/api\.laifeng\.com\/v\d\/start\/ads - reject +^https?:\/\/ios\.lantouzi\.com\/api\/startpage - reject +^https?:\/\/api\.m\.mi\.com\/v\d\/app\/start - reject +^https?:\/\/api\.jr\.mi\.com\/v\d\/adv\/ - reject +^https?:\/\/mangaapi\.manhuaren\.com\/v\d\/public\/getStartPageAds - reject +^https?:\/\/img\.meituan\.net\/(display|midas)\/.+?\.(gif|jpg) - reject +^https?:\/\/p\d\.meituan\.net\/wmbanner\/[A-Za-z0-9]+\.jpg - reject +^https?:\/\/p\d\.meituan\.net\/movie\/[A-Za-z0-9]+\.jpg\?may_covertWebp - reject +^https?:\/\/capi.mwee.cn/app-api/V\d{2}/app/getstartad - reject +^https?:\/\/.+?\/v\d\/iflyad\/ - reject +^https?:\/\/ggic\d?\.cmvideo\.cn\/ad\/ - reject +^https?:\/\/b-api\.ins\.miaopai\.com\/\d\/ad/ - reject +^https?:\/\/easyreadfs\.nosdn\.127\.net\/ad-material\/ - reject +^https?:\/\/slapi.oray.net/client/ad - reject +^https?:\/\/cmsapi\.wifi8\.com\/v\d\/(emptyAd|adNew)\/ - reject +^https?:\/\/api\.rr\.tv\/ad\/ - reject +^https?:\/\/weibointl\.api\.weibo\.cn\/portal\.php\?a=get_coopen_ads - reject +^https?:\/\/api\.tv\.sohu\.com\/agg\/api\/app\/config\/bootstrap - reject +^https?:\/\/api\.smzdm\.com\/v\d\/util\/loading - reject +^https?:\/\/service\.4gtv\.tv\/4gtv\/Data\/(GetAD|ADLog) - reject +^https?:\/\/image\.suning\.cn\/uimg\/ma\/ad\/ - reject +^https?:\/\/img01\.10101111cdn\.com\/adpos\/ - reject +^https?:\/\/3gimg\.qq\.com\/tencentMapTouch\/splash\/ - reject +^https?:\/\/r\.inews\.qq\.com\/(adsBlacklist|getFullScreenPic|getQQNewsRemoteConfig) - reject +^https?:\/\/api\.gaoqingdianshi\.com\/api\/v\d\/ad\/ - reject +^https?:\/\/mrobot\.pconline\.com\.cn\/v\d\/ad2p - reject +^https?:\/\/mrobot\.pcauto\.com\.cn\/v\d\/ad2p - reject +^https?:\/\/snailsleep\.net\/snail\/v\d\/screen\/qn\/get\? - reject +^https?:\/\/snailsleep\.net\/snail\/v\d\/adTask\/ - reject +^https?:\/\/api\.wallstreetcn\.com\/apiv\d\/advertising\/ - reject +^https?:\/\/portal-xunyou\.qingcdn\.com\/api\/v\d\/ios\/configs\/(splash_ad|ad_urls) - reject +^https?:\/\/portal-xunyou\.qingcdn\.com\/api\/v\d\/ios\/ads\/ - reject +^https?:\/\/.+?\/api\/v\d\/adRealTime - reject +^https?:\/\/tiku\.zhan\.com\/Common\/newAd\/ - reject +^https?:\/\/app\.mixcapp\.com\/mixc\/api\/v\d\/ad - reject +^https?:\/\/app\.yinxiang\.com\/ads\/ - reject +^https?:\/\/www\.zybang\.com\/adx\/ - reject +^https?:\/\/api\.izuiyou\.com\/ad\/ - reject +^https?:\/\/ss0\.bdstatic\.com/.+?_\d{3}_\d{4}\.jpg - reject +^https?:\/\/123\.59\.31\.1\/(adgateway|adv)\/ - reject +^https?:\/\/119\.18\.193\.135\/(adgateway|adv)\/ - reject +^https?:\/\/.+?\.atm\.youku\.com - reject +^https?:\/\/img\w\.g\.pptv\.com - reject +^https?:\/\/h\w{2}\.hxsame\.hexun\.com - reject +^https?:\/\/[^(apple|10010)]+\.(com|cn)\/(a|A)d(s|v)?(/|\.js) - reject +^https?:\/\/[^bbs].tianya\.cn - reject +^https?:\/\/\w.?up\.qingdaonews\.com - reject +^https?:\/\/\w{6}\.com1\.z0\.glb\.clouddn\.com - reject +^https?:\/\/\w{8}\.logic\.cpm\.cm\.kankan\.com - reject +^https?:\/\/\w+\.beacon\.qq\.com - reject +^https?:\/\/\w+\.cloudfront\.net\/banner - reject +^https?:\/\/\w+\.gdt\.qq\.com - reject +^https?:\/\/\w+\.kingsoft-office-service\.com - reject +^https?:\/\/\w+\.l\.qq\.com - reject +^https?:\/\/9377\w{2}\.com - reject +^https?:\/\/a0b\w{2}\.com - reject +^https?:\/\/(a?d|sax)\d.sina.com - reject +^https?:\/\/api\d\.tuisong\.baidu\.com - reject +^https?:\/\/d\d.sinaimg.cn - reject +^https?:\/\/dl\.app.gtja\.com\/.+?\d+\.jpg$ - reject +^https?:\/\/impservice.+?youdao.com - reject +^https?:\/\/log.+?baidu\.com - reject +^https?:\/\/notice\.send-anywhere\.com\/banner - reject +^https?:\/\/sa\d.tuisong.baidu.com - reject +^https?:\/\/sax\w?\.sina\.cn - reject +^https?:\/\/sax\w?\.sina\.com\.cn - reject +^https?:\/\/server-\w+.imrworldwide.com - reject +^https?:\/\/t\d{2}\.baidu\.com - reject +^https?:\/\/paopao\w?.qiyipic.com - reject +^https?:\/\/www\.bldimg\.com/(background|splash)/.+?\.png$ - reject +^https?:\/\/youtubei\.googleapis\.com\/youtubei\/v1\/player\/ad_ - reject +^https?:\/\/.+?ccode=0902 - reject +^https?:\/\/ulogs\.umeng\.com - reject +^https?:\/\/ulogs\.umengcloud\.com - reject +^https?:\/\/alogs\.umeng\.co - reject +^https?:\/\/alogs\.umeng\.com - reject +^https?:\/\/(\w\.)?up\.qingdaonews\.(com|cn|net) - reject +^https?:\/\/.+?\.beacon\.qq\.com - reject +^https?:\/\/.+?\.gdt\.qq\.com - reject +^https?:\/\/.+?\.kingsoft-office-service\.com - reject +^https?:\/\/.+?\.l\.qq\.com - reject +^https?:\/\/[^(apple|10010)]+\.(com|cn)\/(a|A)d(s|v)?(\/|\.js) - reject +^https?:\/\/[^bbs]\.tianya\.cn - reject +^https?:\/\/\w{6}\.com1\.z0\.glb\.clouddn\.com - reject +^https?:\/\/\w{8}\.logic\.cpm\.cm\.kankan\.com - reject +^https?:\/\/\w+\.cloudfront\.net\/banner - reject +^https?:\/\/9377\w{2}\.com - reject +^https?:\/\/a0b\w{2}\.com - reject +^https?:\/\/ad\d\.sina\.com - reject +^https?:\/\/ad\d\.sina\.com.cn - reject +^https?:\/\/api\d\.tuisong\.baidu\.com - reject +^https?:\/\/d\d\.sina\.com\.cn - reject +^https?:\/\/d\d\.sinaimg\.cn - reject +^https?:\/\/dl\.app\.gtja\.com/.+?\d+\.jpg$ - reject +^https?:\/\/log\..+?\.baidu\.com - reject +^https?:\/\/notice\.send-anywhere\.com\/banner - reject +^https?:\/\/sa\d\.tuisong\.baidu\.com - reject +^https?:\/\/sax\d\.sina\.com\.cn - reject +^https?:\/\/sax\w?\.sina\.cn - reject +^https?:\/\/sax\w?\.sina\.com\.cn - reject +^https?:\/\/server-\w+\.imrworldwide\.com - reject +^https?:\/\/t\d{2}\.baidu\.com - reject +^https?:\/\/www\.bldimg\.com\/(background|splash)\/.+?\.png$ - reject +^https?:\/\/ups\.youku\.com\/.*?needad=1& - reject +^http?:\/\/www\.tsytv\.com\.cn\/api\/app\/ios\/ads - reject +^https?:\/\/qidian\.qpic\.cn\/qidian_common - reject +^https?:\/\/123\.59\.30\.10\/adv\/advInfos - reject +^https:\/\/static\.api\.m\.panda\.tv\/index\.php\?method=clientconf\.firstscreen&__version=(play_cnmb|(\d+\.){0,3}\d+)&__plat=ios&__channel=appstore - reject +^https?:\/\/i\d\.hoopchina\.com\.cn/blogfile\/\d+\/\d+\/BbsImg\.(?<=(big.(png|jpg)))$ - reject +^https?:\/\/api-163\.biliapi\.net\/cover - reject +^https?:\/\/api-mifit\.huami\.com\/(discovery\/mi\/discovery\/(homepage|sleep|sport(_(summary|training))?|step_detail|training_video)_ad|v1\/app\/startpages\.json)\? - reject +^https?:\/\/c\.tieba\.baidu\.com\/\w+\/\w+\/(sync|newRnSync|mlog) - reject +^https?:\/\/122\.14\.246\.33\/MobileAdServer\/ - reject +^https?:\/\/img\.meituan\.net\/(adunion|display|midas)\/.+?\.(gif|jpg|jpg\.webp)$ - reject +^https?:\/\/pan-api\.bitqiu\.com\/activity\/(getPromoteGuide|getUrlList) - reject +^http:\/\/dssp\.stnts\.com - reject +^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/.{25}\.jpg - reject +^https?:\/\/api\.feng\.com\/v\d\/advertisement\/.*?Claunch - reject +^https?:\/\/www\.bodivis\.com\.cn\/app\/splashAdvertise - reject +^https?:\/\/.+?/V\d\/splash\/getSplashV\d\.action - reject +^https?:\/\/4gimg\.map\.qq\.com\/mwaSplash\/ - reject +^https?:\/\/restapi\.iyunmai\.com\/api\/ios\/ad\/ - reject +^https?:\/\/mps\.95508\.com\/mps\/club\/cardPortals\/adv\/\d+\.(jpg|png) - reject +^https?:\/\/m\.creditcard\.ecitic\.com\/.*?\/appStartAdv - reject +^https?:\/\/mlife\.jf365\.boc\.cn\/AppPrj\/FirstPic\.do - reject +^https?:\/\/creditcardapp\.bankcomm\.com\/mapp\/common\/queryGuidePageAds\.do - reject +^https?:\/\/[\s\S]*\/.+?\.tc\.qq\.com/.*?p201.1\.mp4 - reject +^https?:\/\/[\s\S]*\/website\/.*?\.jpg - reject +^https?:\/\/[\s\S]*\/music\/photo_new\/T017R - reject +^https?:\/\/y\.gtimg\.cn\/music\/.*?_Ad/\d+\.png - reject +^https?:\/\/shp\.qpic\.cn\/pggamehead\/.*?h=\d{4} - reject +^https?:\/\/api2\.helper\.qq\.com\/game\/buttons - reject +^https?:\/\/[\s\S]*\.baidu\.com/.*?ad[xs]\.php - reject +^https?:\/\/pan\.baidu\.com\/rest\/2.0\/pcs\/adx - reject +^https?:\/\/pan\.baidu\.com\/act\/api\/activityentry - reject +^https?:\/\/[\s\S]*\/youku\/.*?\.mp4 - reject +^https?:\/\/optimus-ads\.amap\.com\/uploadimg\/ - reject +^https?:\/\/p\d.meituan.net\/movie\/.*?\?may_covertWebp - reject +^https?:\/\/p\d\.meituan\.net\/wmbanner\/ - reject +^https?:\/\/s3plus\.meituan\.net\/v1\/mss_a002 - reject +^https?:\/\/img\.meituan\.net\/midas\/.*?@\d{4}h - reject +^https?:\/\/img\.meituan\.net\/display\/\w+\.jpg\.webp - reject +^https?:\/\/[\s\S]*\/eapi\/ad\/ - reject +^https?:\/\/iad.*?mat\.music\.12[67]\.net/\w+\.(jpg|mp4) - reject +^https?:\/\/zt-app\.go189\.cn\/zt-app\/welcome\/.*?Animation - reject +^https?:\/\/[\s\S]*\/ting\/[a-z]*\/ts-\d+ - reject +^https?:\/\/res\.xiaojukeji\.com\/resapi\/activity\/get(Ruled|Preload) - reject +^https?:\/\/rich\.kuwo\.cn\/AdService\/kaiping\/adinfo - reject +^https?:\/\/[\s\S]*\.snssdk\.com\/api\/ad\/ - reject +^https?:\/\/api\.feng\.com\/v1\/advertisement\/.*?Claunch - reject +^https?:\/\/business\.msstatic\.com\/advertiser\/ - reject +^https?:\/\/cdnfile1\.msstatic\.com\/cdnfile\/appad\/ - reject +^https?:\/\/ms\.jr\.jd\.com\/gw\/generic\/(aladdin\/na\/m\/getLoadingPicture|aladdin\/na\/m\/getLoadingPicture) - reject +^https?:\/\/pic\.edaijia\.cn\/adsplash\/ - reject +^https?:\/\/mpcs\.suning\.com\/mpcs\/dm\/getDmInfo - reject +^https?:\/\/prom\.mobile\.gome\.com\.cn\/mobile\/promotion\/promscms\/sale\w+\.jsp - reject +^https?:\/\/app\.yinxiang\.com\/ads\/getAdsInfo - reject +^https?:\/\/api\.douban\.com\/v2\/app_ads\/splash - reject +^https?:\/\/ptmpcap\.caocaokeji\.cn\/advert-bss\/ - reject +^https?:\/\/newapp\.szsmk\.com\/app\/config\/.*?Ad - reject +^https?:\/\/api\.rr\.tv\/.*?(getAll|Version) - reject +^https?:\/\/client\.qunar\.com\/pitcher-proxy\?qrt=p_splashAd - reject +^https?:\/\/m\.tuniu\.com\/api\/operation\/splash\/ - reject +^https?:\/\/y\.gtimg\.cn\/music\/common\/\/upload\/kg_ad/.*?\d{4}\.jpg - reject +^https?:\/\/dimg04\.c-ctrip\.com\/images\/\w+(_\d{4}){2} - reject +^https?:\/\/adm\.10jqka\.com\.cn\/img\/ad\/.*?(1\d{2}|\d{4})\.jpg - reject +^https?:\/\/api\.gotokeep\.com\/ads\/ - reject +^https?:\/\/ggx\.cmvideo\.cn\/request\/ - reject +^https?:\/\/oral\.youdao\.com\/oral\/adInfo - reject +^https?:\/\/impservice\.dictapp\.youdao\.com\/imp\/request - reject +^https?:\/\/du\.hupucdn\.com\/\w+h\d{4} - reject +^https?:\/\/api\.yangkeduo\.com\/api\/cappuccino\/splash - reject +^https?:\/\/mp\.weixin\.qq\.com\/(s|mp)\/(ad_|advertisement|getappmsgad|report|appmsgreport|appmsgpicreport) - reject +^https?:\/\/dl\.app\.gtja\.com\/dzswem\/kvController\/.+?\.jpg$ - reject +^https?:\/\/yxyapi\d\.drcuiyutao\.com\/yxy-api-gateway\/api\/json\/advert\/ - reject +^https?:\/\/www\.zhihu\.com\/terms\/privacy\/confirm - reject +^https?:\/\/api\.zhihu\.com\/market\/popover - reject +^https?:\/\/api\.zhihu\.com\/search\/(top|tab|preset) - reject +^https?:\/\/api\.zhihu\.com\/(launch|ad-style-service|app_config|real_time|ab\/api) - reject +^https?:\/\/api\.zhihu\.com\/commercial_api\/(launch|real_time) - reject +^https?:\/\/(api|www)\.zhihu\.com\/.*?(featured-comment-ad|recommendations|community-ad) - reject +^https?:\/\/(api|www)\.zhihu\.com\/(fringe|adx|commercial|ad-style-service|banners|mqtt) - reject +^https?:\/\/ap(i|p)\.bilibili\.com\/((x\/v2|pgc)\/(season\/rank\/cn|splash\/)|(pgc\/season\/rank\/cn|x\/v2\/(search\/(hot|recommend|resource)))) +^https?:\/\/interface3?\.music\.163\.com/eapi/(ad|abtest|sp|hot|store|search/(specialkeyword|defaultkeyword|hot)) - reject +^https?:\/\/capis-slb\.didapinche\.com\/ad\/ - reject +^https?:\/\/weibointl\.api\.weibo\.cn\/portal.php\?a=get_coopen_ads - reject +^https?:\/\/yxyapi2\.drcuiyutao\.com\/yxy-api-gateway\/api\/json\/advert\/getsAd - reject +^https?:\/\/capis-clb\.didapinche\.com\/ad\/ - reject +^https?:\/\/api\.vistopia\.com\.cn\/api\/(v1|v\/d)\/home\/advertisement - reject +^https?:\/\/g\.cdn\.pengpengla\.com\/starfantuan\/boot-screen-info\/ - reject +^https?:\/\/api\.qbb6\.com\/ad\/ - reject +^https?:\/\/www\.didapinche\.com\/app\/adstat\/ - reject +^https?:\/\/capis\.didapinche\.com\/ad\/ - reject +^https?:\/\/mcupdate\.gstarcad\.com\/api\/v2\/ - reject +^https?:\/\/mi\.gdt\.qq\.com\/gdt_mview.\fcg - reject +^https?:\/\/api\.jxedt\.com\/jump\/EMiCcDNp - reject +^https?:\/\/richmanapi\.jxedt\.com\/api\/banadplus - reject +^https?:\/\/richmanapi\.jxedt\.com\/api\/ad\/guideplus - reject +^https?:\/\/richmanmain\.jxedt\.com\/advertisement\/fallback - reject +^https?:\/\/richmanapi\.jxedt\.com\/api\/adplus - reject +^https?:\/\/www\.nfmovies\.com\/pic\/tu\/ - reject +^https?:\/\/www\.nfmovies\.com\/uploads\/images\/play\.jpg - reject +^https?:\/\/www\.nfmovies\.com\/templets\/default\/images\/logos - reject +^https?:\/\/ddrk\.me\/image\/logo_footer\.png$ - reject +^https?:\/\/img\.ddrk\.me\/ad190824 - reject +^https?:\/\/ddrk\.me\/image\/logo_footer\.png - reject +^https?:\/\/ddrk\.me\/wp-content\/plugins\/advanced-floating-content-lite\/public\/images\/close\.png - reject +^https?:\/\/img\.ddrk\.me\/cover\.png - reject +^https?:\/\/app-api\.smzdm\.com\/util\/loading - reject +^https?:\/\/.+?\/img\/web\.business\.image\/ - reject +^https?:\/\/emdcadvertise\.eastmoney\.com\/infoService - reject +^https?:\/\/www.icourse163.org\/.*?(Advertisement) - reject +^https?:\/\/sf.*?-ttcdn-tos\.pstatp\.com\/obj\/ad - reject +^https?:\/\/oset-api\.open-adx\.com\/ad\/ - reject +# XueQiu +^https?:\/\/(101\.201\.175\.228|182\.92\.251\.113)\/brand\/search\/v1\.json - reject + +[MITM] +hostname = %APPEND% sf*ttcdn-tos.pstatp.com, oset-api.open-adx.com, www.icourse163.org, ulogs.umeng.com, ulogs.umengcloud.com, alogs.umeng.com, alogs.umeng.co, *.byteoversea.com, *.cnbetacdn.com, *.doubanio.com, 101.201.62.22, 113.105.222.132, 113.96.109.*, 118.178.214.118, 121.14.89.216, 121.9.212.178, 14.21.76.30, 183.232.237.194, 183.232.246.225, 183.60.159.227, 59.37.96.220, 789.kakamobi.cn, aarkissltrial.secure2.footprint.net, activity2.api.ofo.com, adm.10jqka.com.cn, adproxy.autohome.com.cn, afd.baidu.com, api.app.vhall.com, api.fengshows.com, api.k.sohu.com, api.laifeng.com, api.m.mi.com, api.mddcloud.com.cn, api-mifit.huami.com, api-mifit-cn.huami.com, app.10086.cn, app.m.zj.chinamobile.com, app2.autoimg.cn, appsdk.soku.com, atrace.chelaile.net.cn, capi.douyucdn.cn, cdn.kuaidi100.com, classbox2.kechenggezi.com, connect.facebook.net, creatives.ftimg.net, d.1qianbao.com, dapis.mting.info, dl.app.gtja.com, dongfeng.alicdn.com, dsp-impr2.youdao.com, erebor.douban.com, fm.fenqile.com, fuss10.elemecdn.com, g1.163.com, gorgon.youdao.com, hm.xiaomi.com, hui.sohu.com, i1.hoopchina.com.cn, img.zuoyebang.cc, img1.126.net, img1.doubanio.com, img3.doubanio.com, impservice.dictapp.youdao.com, impservice.youdao.com, kano.guahao.cn, lf.snssdk.com, lives.l.qq.com, m.aty.sohu.com, m5.amap.com, ma.ofo.com, mage.if.qidian.com, mapi.appvipshop.com, mbl.56.com, mimg.127.net, mmg.aty.sohu.com, mmgr.gtimg.com, nex.163.com, oimagea4.ydstatic.com, oimagec2.ydstatic.com, p.kuaidi100.com, p1.music.126.net, pic.k.sohu.com, pic1.chelaile.net.cn, ress.dxpmedia.com, rm.aarki.net, sso.ifanr.com, static.api.m.panda.tv, staticlive.douyucdn.cn, storage.wax.weibo.com, supportda.ofo.com, ups.youku.com, wapwenku.baidu.com, wenku.baidu.com, www.facebook.com, www.ft.com, www.oschina.net, *.applovin.com, *.iydsj.com, *.k.sohu.com, *.kakamobi.cn, *.kingsoft-office-service.com, *.meituan.net, *.musical.ly, *.ofo.com, *.pstatp.com, *.snssdk.com, *.uve.weibo.com, *.ydstatic.com, *.youtube.com, a.apicloud.com, a.qiumibao.com, a.wkanx.com, act.vip.iqiyi.com, api.21jingji.com, api.caijingmobile.com, api.chelaile.net.cn, api.daydaycook.com.cn, api.gotokeep.com, api.haohaozhu.cn, api.huomao.com, api.intsig.net, api.izuiyou.com, api.jr.mi.com, api.jxedt.com, api.kkmh.com, api.m.jd.com, api.mgzf.com, api.psy-1.com, api.rr.tv, api.smzdm.com, api.tv.sohu.com, api.wallstreetcn.com, api.xiachufang.com, api.zhihu.com, api.zhuishushenqi.com, api*.tiktokv.com, api5.futunn.com, api-mifit*.huami.com, api-release.wuta-cam.com, app.58.com, app.api.ke.com, app.bilibili.com, api.douban.com, app.mixcapp.com, app.variflight.com, app.wy.guahao.com, app.yinxiang.com, b.zhuishushenqi.com, c.m.163.com, cap.caocaokeji.cn, capi.mwee.cn, cdn.moji.com, channel.beitaichufang.com, clientaccess.10086.cn, client.mail.163.com, cms.daydaycook.com.cn, consumer.fcbox.com, creditcard.ecitic.com, daoyu.sdo.com, dxy.com, e.dangdang.com, easyreadfs.nosdn.127.net, gateway.shouqiev.com, gw-passenger.01zhuanche.com, huichuan.sm.cn, i.ys7.com, iapi.bishijie.com, iface.iqiyi.com, ih2.ireader.com, img01.10101111cdn.com, img*.doubanio.com, img.jiemian.com, interfac*.music.163.com, ios.lantouzi.com, ios.wps.cn, m*.amap.com, m.client.10010.com, m.creditcard.ecitic.com, m.ibuscloud.com, m.yap.yahoo.com, mapi.mafengwo.cn, media.qyer.com, mlife.jf365.boc.cn, mob.mddcloud.com.cn, mobile-api2011.elong.com, mp.weixin.qq.com, mrobot.pcauto.com.cn, mrobot.pconline.com.cn, ms.jr.jd.com, msspjh.emarbox.com, newsso.map.qq.com, nnapp.cloudbae.cn, open.qyer.com, pic*.chelaile.net, portal-xunyou.qingcdn.com, pss.txffp.com, r.inews.qq.com, render.alipay.com, resrelease.wuta-cam.com, richmanapi.jxedt.com, rtbapi.douyucdn.cn, service.4gtv.tv, smkmp.96225.com, slapi.oray.net, snailsleep.net, sp.kaola.com, ssl.kohsocialapp.qq.com, static.vuevideo.net, static1.keepcdn.com, status.boohee.com, support.you.163.com, thor.weidian.com, tiku.zhan.com, weibointl.api.weibo.cn, www.dandanzan.com, www.flyertea.com, www.zhihu.com, www.zybang.com, youtubei.googleapis.com, zhidao.baidu.com, app.stoneread.com, api.mh.163.com, api.bilibili.com, i.weiread.qq.com, github.com, gist.github.com, shimo.im, p.doras.api.vcinema.cn, ios.prod.ftl.netflix.com, p.du.163.com, vsco.co, api.vnision.com, pan.baidu.com, *.applovin.com, i.weread.qq.com, m.poizon.com, ss0.bdstatic.com, s.youtube.com, www.youtube.com, 123.59.31.1, 119.18.193.135, qidian.qpic.cn, a.applovin.com, api.weibo.cn, youtubei.googleapis.com, api-mifit.huami.com, api-163.biliapi.net, mg.meituan.net, s3plus.meituan.net, pan-api.bitqiu.com, *pi.feng.com, 4gimg.map.qq.com, restapi.iyunmai.com, www.bodivis.com.cn, api.feng.com, m.tuniu.com, img.meituan.net, sdkapp.uve.weibo.com, ptmpcap.caocaokeji.cn, creditcardapp.bankcomm.com, newapp.szsmk.com, client.qunar.com, mpcs.suning.com, api2.helper.qq.com, cdnfile1.msstatic.com, res.xiaojukeji.com, dimg04.c-ctrip.com, prom.mobile.gome.com.cn, y.gtimg.cn, du.hupucdn.com, dl.app.gtja.com, yxyapi*.drcuiyutao.com, yxyapi2.drcuiyutao.com, api.vistopia.com.cn, capis-clb.didapinche.com, g.cdn.pengpengla.com, api.qbb6.com, mcupdate.gstarcad.com, api.jxedt.com, mi.gdt.qq.com, richmanapi.jxedt.com, nfmovies.com, app-api.smzdm.com, emdcadvertise.eastmoney.com, 101.201.175.228, 182.92.251.113 \ No newline at end of file diff --git a/Surge/Module/TestFlightAccount.sgmodule b/Surge/Module/TestFlightAccount.sgmodule new file mode 100644 index 0000000000..8ad486b781 --- /dev/null +++ b/Surge/Module/TestFlightAccount.sgmodule @@ -0,0 +1,14 @@ +#!name=TestFlight账户管理 +#!desc=自动存储/合并多个TestFlight账户列表, 并可导出/分享TestFlight APP. +#!arguments=请求超时:30,启用缓存:1,使用iOS列表:0,脚本引擎:jsc,调试模式:0 +#!arguments-desc=请求超时:单位:秒。默认30秒。\n\n启用缓存:1/0,开启/关闭,默认开启。用于缓存APP列表,改善列表页面加载过慢。一般与"请求超时"配合使用,开启缓存并刷新列表后,可适当调小超时。\n\n使用iOS列表:1/0,开启/关闭。强制使用iOS应用列表,用于改善 macOS TestFlight 加载过慢。iOS用户无需开启。\n\n脚本引擎:jsc/webview/auto,默认为jsc,如遇内存超限问题可调整为 auto 或 webview\n\n调试模式:1/0,开启/关闭。用于调试脚本。 +#!category=🐻 NobyDa + +[General] +skip-proxy = %APPEND% iosapps.itunes.apple.com + +[Script] +TestFlight账户管理 = type=http-request,pattern=^https:\/\/testflight\.apple\.com\/v\d\/(app|account|invite)s\/,requires-body=1,timeout=180,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/TestFlight/TestFlightAccount.js,debug={{{调试模式}}},argument="timeout={{{请求超时}}}&enableCache={{{启用缓存}}}&forceIOSlist={{{使用iOS列表}}}&debug={{{调试模式}}}",engine={{{脚本引擎}}} + +[MITM] +hostname = %APPEND% testflight.apple.com \ No newline at end of file diff --git a/Surge/Module/TestFlightDownload.sgmodule b/Surge/Module/TestFlightDownload.sgmodule new file mode 100644 index 0000000000..87b436d751 --- /dev/null +++ b/Surge/Module/TestFlightDownload.sgmodule @@ -0,0 +1,11 @@ +#!name=TestFlight区域限制解除 +#!desc=该模块适用于更新TestFlight App时, 提示"APP不可用"问题. + +[General] +skip-proxy = %APPEND% iosapps.itunes.apple.com + +[Script] +TF下载修正 = type=http-request,pattern=^https?:\/\/testflight\.apple\.com\/v\d\/accounts\/.+?\/install$,requires-body=1,script-update-interval=-1,max-size=0,script-path=https://gist.githubusercontent.com/NobyDa/9be418b93afc5e9c8a8f4d28ae403cf2/raw/TF_Download.js + +[MITM] +hostname = %APPEND% testflight.apple.com \ No newline at end of file diff --git a/Surge/Module/TieBaDailyBonus.sgmodule b/Surge/Module/TieBaDailyBonus.sgmodule new file mode 100644 index 0000000000..294084e1b3 --- /dev/null +++ b/Surge/Module/TieBaDailyBonus.sgmodule @@ -0,0 +1,13 @@ +#!name=🐻 百度贴吧 [签到] +#!desc=每日定时签到,模块参数可调整签到时间。\n打开百度贴吧APP点击"我的"即可获取cookie. +#!arguments=定时签到:40 8 * * *,禁用脚本:百度贴吧[Cookie],禁用MITM:hostname +#!arguments-desc=定时签到:Cron表达式,默认每天早上 08:40 执行。\n\n禁用脚本:禁用获取Cookie脚本,输入 # 表示禁用。\n\n禁用MITM:禁用MITM主机名,输入 # 表示禁用。 +#!category=🐻 NobyDa + +[Script] +百度贴吧[签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=600,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js + +{{{禁用脚本}}} = type=http-request,pattern=^https?:\/\/(c\.tieba|tiebac)\.baidu\.com\/c\/s\/login,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/BDTieBa-DailyBonus/TieBa.js + +[MITM] +{{{禁用MITM}}} = %APPEND% c.tieba.baidu.com, tiebac.baidu.com \ No newline at end of file diff --git a/Surge/Module/iQIYIDailyBonus.sgmodule b/Surge/Module/iQIYIDailyBonus.sgmodule new file mode 100644 index 0000000000..d705c77753 --- /dev/null +++ b/Surge/Module/iQIYIDailyBonus.sgmodule @@ -0,0 +1,13 @@ +#!name=🐻 爱奇艺 [会员签到] +#!desc=每日定时签到,模块参数可调整签到时间。\n登陆爱奇艺网页版 https://m.ctrip.com/ 使用密码登录可获取签到Cookie. +#!arguments=定时签到:10 9 * * *,禁用脚本:爱奇艺[Cookie],禁用MITM:hostname +#!arguments-desc=定时签到:Cron表达式,默认每天早上 09:10 执行。\n\n禁用脚本:禁用获取Cookie脚本,输入 # 表示禁用。\n\n禁用MITM:禁用MITM主机名,输入 # 表示禁用。 +#!category=🐻 NobyDa + +[Script] +爱奇艺[会员签到] = type=cron,cronexp="{{{定时签到}}}",wake-system=1,script-update-interval=0,timeout=60,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +{{{禁用脚本}}} = type=http-request,pattern=^https:\/\/passport\.iqiyi\.com\/apis\/user\/,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +[MITM] +{{{禁用MITM}}} = %APPEND% passport.iqiyi.com \ No newline at end of file diff --git a/Surge/README.md b/Surge/README.md deleted file mode 100644 index bd4be5c2b9..0000000000 --- a/Surge/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Rule description: -## [中文版说明点击此处](https://github.com/NobyDa/Script/blob/master/Surge/README_CN.md) -* **[AdRule.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRule.list) (More than 8000 ad rules, integrate [lhie1](https://github.com/lhie1/Rules) and [ConnersHua](https://github.com/ConnersHua/Profiles) and added some advertising rules)** - -* **[AdRuleTest.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRuleTest.list) (More than 1300 ad rules,This rule is modified from [Scomper](https://github.com/scomper/Surge). Because the original author stopped maintenance, so take over the optimization and delete some normal rules, only for testing**) - -* **[AdRuleRegex.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRuleRegex.list) (More than 700 ad rewrite rules, integrate [lhie1](https://github.com/lhie1/Rules)、[ConnersHua](https://github.com/ConnersHua/Profiles)、[onewayticket255](https://github.com/onewayticket255/Surge-Script) and [Choler](https://github.com/Choler/Surge/tree/master/Ruleset). You need to manually add the hostname of the second line in the file to Surge config file. and open MITM and trust the certificate)** - -* **[Download.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Download.list) (Integrate some BT, Thunder, download shunt rules)** - -## Remarks: - -* **Most of these are Chinese advertising rules. overseas users may not applicable** -* **Because [ConnersHua](https://github.com/ConnersHua/Profiles) is already included in the rule, there is no need to add it repeatedly.** -* **Adapt to Surge 3 or above, These rules only include ads. Please choose REJECT-TINYGIF or REJECT for the policy. except for Download.list** -* **Script usage please see TG channel [@NobyDa](https://t.me/NobyDa)** -* **Self-use only, Update depend on mood, if you have any questions, please submit a Issues or pull request.** - - -### Special thanks: - -* [@lhie1](https://github.com/lhie1) -* [@Scomper](https://github.com/scomper) -* [@ConnersHua](https://github.com/ConnersHua) -* [@onewayticket255](https://github.com/onewayticket255) -* [@Choler](https://github.com/Choler) \ No newline at end of file diff --git a/Surge/README_CN.md b/Surge/README_CN.md deleted file mode 100644 index 280e572d6d..0000000000 --- a/Surge/README_CN.md +++ /dev/null @@ -1,26 +0,0 @@ -# 规则说明: -## [English version description click here](https://github.com/NobyDa/Script/blob/master/Surge/README_EN.md) -* **[AdRule.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRule.list) (超过8000条广告规则,整合了[lhie1](https://github.com/lhie1/Rules)和[ConnersHua](https://github.com/ConnersHua/Profiles)并添加了自用的一些去广告规则)** - -* **[AdRuleTest.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRuleTest.list) (超过1300条广告规则,该规则是从[Scomper](https://github.com/scomper/Surge)修改而来,因原作者停止维护,所以接手优化和删除一些正常规则,仅供测试**) - -* **[AdRuleRegex.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/AdRuleRegex.list) (超过700条广告重写规则, 整合了 [lhie1](https://github.com/lhie1/Rules)、[ConnersHua](https://github.com/ConnersHua/Profiles)、[onewayticket255](https://github.com/onewayticket255/Surge-Script)、 [Choler](https://github.com/Choler/Surge/tree/master/Ruleset). 需要手动将文件第二行的主机名添加到Surge配置文件中。打开MITM并信任证书)** - -* **[Download.list](https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Download.list) (集成了一些BT,Thunder,下载的分流规则)** - -## 备注: - -* **其中大多数是中国的广告规则。海外用户可能不适用** -* **因规则内已经集成[ConnersHua](https://github.com/ConnersHua/Profiles)(神机规则)所以无需重复添加神机的广告规则** -* **适配Surge 3或更高版本,这些规则仅包含广告。请选择REJECT-TINYGIF或REJECT作为策略。除了Download.list** -* **脚本用法请参见TG频道 [@NobyDa](https://t.me/NobyDa)** -* **纯自用,佛系维护,规则如果有任何问题,请提交Issues或pull request** - - -### 鸣谢: - -* [@lhie1](https://github.com/lhie1) -* [@Scomper](https://github.com/scomper) -* [@ConnersHua](https://github.com/ConnersHua) -* [@onewayticket255](https://github.com/onewayticket255) -* [@Choler](https://github.com/Choler) \ No newline at end of file diff --git a/Surge/WeChat.list b/Surge/WeChat.list new file mode 100644 index 0000000000..f6569c7e64 --- /dev/null +++ b/Surge/WeChat.list @@ -0,0 +1,358 @@ +# 该规则集包含绝大部分微信/WeChat网络请求 (IPv4/IPv6) +# 请注意,该规则集除 Surge 之外不应该使用 (由于双栈问题且考虑到规则数量,部分子规则写法仅与Surge兼容) + +DOMAIN-KEYWORD,101.226.211. +DOMAIN-KEYWORD,101.226.222. +DOMAIN-KEYWORD,101.226.226. +DOMAIN-KEYWORD,101.32.104. +DOMAIN-KEYWORD,101.32.118. +DOMAIN-KEYWORD,101.32.133. +DOMAIN-KEYWORD,101.33.110. +DOMAIN-KEYWORD,101.89.15. +DOMAIN-KEYWORD,101.89.38. +DOMAIN-KEYWORD,101.91.37. +DOMAIN-KEYWORD,101.91.69. +DOMAIN-KEYWORD,101.91.71. +DOMAIN-KEYWORD,106.225.231. +DOMAIN-KEYWORD,109.244.169. +DOMAIN-KEYWORD,110.52.193. +DOMAIN-KEYWORD,110.53.246. +DOMAIN-KEYWORD,111.30.164. +DOMAIN-KEYWORD,111.45.68. +DOMAIN-KEYWORD,111.45.69. +DOMAIN-KEYWORD,111.45.70. +DOMAIN-KEYWORD,112.53.25. +DOMAIN-KEYWORD,112.53.36. +DOMAIN-KEYWORD,112.60.0. +DOMAIN-KEYWORD,112.60.13. +DOMAIN-KEYWORD,112.60.14. +DOMAIN-KEYWORD,112.60.8. +DOMAIN-KEYWORD,112.65.193. +DOMAIN-KEYWORD,112.90.43. +DOMAIN-KEYWORD,113.105.154. +DOMAIN-KEYWORD,113.105.165. +DOMAIN-KEYWORD,113.105.166. +DOMAIN-KEYWORD,113.96.154. +DOMAIN-KEYWORD,113.96.156. +DOMAIN-KEYWORD,113.96.16. +DOMAIN-KEYWORD,113.96.18. +DOMAIN-KEYWORD,113.96.202. +DOMAIN-KEYWORD,113.96.208. +DOMAIN-KEYWORD,113.96.209. +DOMAIN-KEYWORD,113.96.210. +DOMAIN-KEYWORD,113.96.232. +DOMAIN-KEYWORD,113.96.233. +DOMAIN-KEYWORD,113.96.237. +DOMAIN-KEYWORD,113.96.83. +DOMAIN-KEYWORD,113.96.98. +DOMAIN-KEYWORD,115.231.229. +DOMAIN-KEYWORD,115.238.197. +DOMAIN-KEYWORD,116.128.133. +DOMAIN-KEYWORD,116.128.163. +DOMAIN-KEYWORD,116.253.60. +DOMAIN-KEYWORD,116.253.61. +DOMAIN-KEYWORD,117.135.133. +DOMAIN-KEYWORD,117.184.242. +DOMAIN-KEYWORD,117.187.243. +DOMAIN-KEYWORD,117.41.224. +DOMAIN-KEYWORD,119.147.190. +DOMAIN-KEYWORD,119.147.227. +DOMAIN-KEYWORD,119.147.83. +DOMAIN-KEYWORD,119.188.155. +DOMAIN-KEYWORD,119.39.81. +DOMAIN-KEYWORD,120.221.179. +DOMAIN-KEYWORD,120.232.27. +DOMAIN-KEYWORD,120.232.33. +DOMAIN-KEYWORD,120.232.65. +DOMAIN-KEYWORD,120.232.68. +DOMAIN-KEYWORD,120.233.36. +DOMAIN-KEYWORD,120.237.199. +DOMAIN-KEYWORD,120.241.149. +DOMAIN-KEYWORD,120.241.150. +DOMAIN-KEYWORD,120.241.17. +DOMAIN-KEYWORD,120.241.186. +DOMAIN-KEYWORD,120.241.189. +DOMAIN-KEYWORD,120.241.190. +DOMAIN-KEYWORD,120.241.21. +DOMAIN-KEYWORD,120.241.25. +DOMAIN-KEYWORD,120.241.92. +DOMAIN-KEYWORD,121.12.115. +DOMAIN-KEYWORD,121.14.142. +DOMAIN-KEYWORD,121.14.98. +DOMAIN-KEYWORD,121.51.130. +DOMAIN-KEYWORD,122.225.36. +DOMAIN-KEYWORD,122.246.25. +DOMAIN-KEYWORD,123.150.208. +DOMAIN-KEYWORD,123.150.76. +DOMAIN-KEYWORD,123.151.190. +DOMAIN-KEYWORD,123.161.61. +DOMAIN-KEYWORD,123.184.36. +DOMAIN-KEYWORD,124.232.162. +DOMAIN-KEYWORD,129.226.107. +DOMAIN-KEYWORD,129.226.3. +DOMAIN-KEYWORD,14.17.41. +DOMAIN-KEYWORD,14.17.73. +DOMAIN-KEYWORD,14.18.175. +DOMAIN-KEYWORD,14.18.178. +DOMAIN-KEYWORD,14.18.180. +DOMAIN-KEYWORD,14.18.200. +DOMAIN-KEYWORD,14.18.245. +DOMAIN-KEYWORD,14.215.138. +DOMAIN-KEYWORD,14.215.158. +DOMAIN-KEYWORD,14.215.166. +DOMAIN-KEYWORD,14.215.167. +DOMAIN-KEYWORD,14.215.85. +DOMAIN-KEYWORD,14.22.0. +DOMAIN-KEYWORD,14.22.33. +DOMAIN-KEYWORD,14.22.4. +DOMAIN-KEYWORD,14.22.5. +DOMAIN-KEYWORD,14.29.100. +DOMAIN-KEYWORD,14.29.101. +DOMAIN-KEYWORD,150.109.90. +DOMAIN-KEYWORD,157.148.33. +DOMAIN-KEYWORD,157.148.42. +DOMAIN-KEYWORD,157.148.45. +DOMAIN-KEYWORD,157.148.51. +DOMAIN-KEYWORD,157.148.55. +DOMAIN-KEYWORD,157.255.135. +DOMAIN-KEYWORD,157.255.173. +DOMAIN-KEYWORD,157.255.174. +DOMAIN-KEYWORD,157.255.192. +DOMAIN-KEYWORD,157.255.243. +DOMAIN-KEYWORD,157.255.244. +DOMAIN-KEYWORD,157.255.245. +DOMAIN-KEYWORD,163.177.81. +DOMAIN-KEYWORD,163.177.89. +DOMAIN-KEYWORD,163.177.90. +DOMAIN-KEYWORD,175.6.13. +DOMAIN-KEYWORD,180.111.199. +DOMAIN-KEYWORD,180.163.25. +DOMAIN-KEYWORD,180.96.0. +DOMAIN-KEYWORD,180.96.2. +DOMAIN-KEYWORD,180.97.8. +DOMAIN-KEYWORD,183.131.56. +DOMAIN-KEYWORD,183.131.57. +DOMAIN-KEYWORD,183.192.169. +DOMAIN-KEYWORD,183.194.238. +DOMAIN-KEYWORD,183.232.175. +DOMAIN-KEYWORD,183.232.246. +DOMAIN-KEYWORD,183.232.94. +DOMAIN-KEYWORD,183.232.95. +DOMAIN-KEYWORD,183.232.96. +DOMAIN-KEYWORD,183.240.115. +DOMAIN-KEYWORD,183.240.118. +DOMAIN-KEYWORD,183.240.48. +DOMAIN-KEYWORD,183.240.56. +DOMAIN-KEYWORD,183.240.80. +DOMAIN-KEYWORD,183.240.81. +DOMAIN-KEYWORD,183.3.226. +DOMAIN-KEYWORD,183.3.233. +DOMAIN-KEYWORD,183.3.234. +DOMAIN-KEYWORD,183.3.235. +DOMAIN-KEYWORD,183.47.101. +DOMAIN-KEYWORD,183.47.115. +DOMAIN-KEYWORD,183.47.117. +DOMAIN-KEYWORD,183.47.97. +DOMAIN-KEYWORD,183.60.131. +DOMAIN-KEYWORD,183.60.155. +DOMAIN-KEYWORD,183.61.13. +DOMAIN-KEYWORD,203.205.232. +DOMAIN-KEYWORD,203.205.235. +DOMAIN-KEYWORD,203.205.253. +DOMAIN-KEYWORD,203.205.254. +DOMAIN-KEYWORD,211.95.137. +DOMAIN-KEYWORD,211.95.138. +DOMAIN-KEYWORD,218.68.88. +DOMAIN-KEYWORD,218.68.90. +DOMAIN-KEYWORD,219.135.59. +DOMAIN-KEYWORD,220.194.91. +DOMAIN-KEYWORD,220.194.93. +DOMAIN-KEYWORD,220.249.243. +DOMAIN-KEYWORD,221.181.99. +DOMAIN-KEYWORD,223.166.152. +DOMAIN-KEYWORD,27.19.222. +DOMAIN-KEYWORD,36.136.108. +DOMAIN-KEYWORD,36.152.4. +DOMAIN-KEYWORD,36.155.202. +DOMAIN-KEYWORD,36.158.189. +DOMAIN-KEYWORD,36.158.242. +DOMAIN-KEYWORD,36.250.230. +DOMAIN-KEYWORD,42.187.131. +DOMAIN-KEYWORD,42.187.182. +DOMAIN-KEYWORD,42.187.184. +DOMAIN-KEYWORD,42.202.141. +DOMAIN-KEYWORD,58.144.193. +DOMAIN-KEYWORD,58.144.248. +DOMAIN-KEYWORD,58.250.136. +DOMAIN-KEYWORD,58.251.100. +DOMAIN-KEYWORD,58.251.111. +DOMAIN-KEYWORD,58.251.117. +DOMAIN-KEYWORD,58.251.80. +DOMAIN-KEYWORD,58.251.81. +DOMAIN-KEYWORD,58.251.82. +DOMAIN-KEYWORD,58.49.138. +DOMAIN-KEYWORD,59.36.89. +DOMAIN-KEYWORD,59.36.97. +DOMAIN-KEYWORD,59.37.96. +DOMAIN-KEYWORD,59.37.97. +DOMAIN-KEYWORD,60.13.97. +DOMAIN-KEYWORD,61.151.165. +DOMAIN-KEYWORD,61.151.167. +DOMAIN-KEYWORD,61.151.168. +DOMAIN-KEYWORD,61.151.183. +DOMAIN-KEYWORD,61.151.206. +DOMAIN-KEYWORD,61.151.207. +DOMAIN-KEYWORD,61.190.114. +DOMAIN-KEYWORD,61.191.60. +DOMAIN-KEYWORD,61.241.31. +DOMAIN-KEYWORD,61.241.44. +DOMAIN-KEYWORD,61.241.47. +DOMAIN-KEYWORD,61.241.49. +DOMAIN-KEYWORD,43.156.86. +DOMAIN-KEYWORD,43.156.222. + +# WeChat Pay SDK +DOMAIN-KEYWORD,101.226.129. +DOMAIN-KEYWORD,101.227.162. +DOMAIN-KEYWORD,101.89.50. +DOMAIN-KEYWORD,101.91.22. +DOMAIN-KEYWORD,101.91.34. +DOMAIN-KEYWORD,101.91.5. +DOMAIN-KEYWORD,111.0.26. +DOMAIN-KEYWORD,116.128.171. +DOMAIN-KEYWORD,120.204.0. +DOMAIN-KEYWORD,120.204.10. +DOMAIN-KEYWORD,121.51.124. +DOMAIN-KEYWORD,140.207.119. +DOMAIN-KEYWORD,175.27.0. +DOMAIN-KEYWORD,180.163.15. +DOMAIN-KEYWORD,180.163.26. +DOMAIN-KEYWORD,182.254.78. +DOMAIN-KEYWORD,182.254.92. +DOMAIN-KEYWORD,183.195.236. +DOMAIN-KEYWORD,183.3.224. +DOMAIN-KEYWORD,203.205.234. +DOMAIN-KEYWORD,220.196.144. +DOMAIN-KEYWORD,221.181.97. +DOMAIN-KEYWORD,58.247.204. +DOMAIN-KEYWORD,58.247.205. +IP-CIDR6,2402:4E00:1900:1700:0:9554:1AD0:140A/128,no-resolve +IP-CIDR6,2402:4e00:1020:10fb:0:9466::/112,no-resolve +IP-CIDR6,2402:4e00:1430:2264:0:9467::/96,no-resolve +IP-CIDR6,2402:4e00:8010::/112,no-resolve +IP-CIDR6,2402:4e00:8020:101::2:0/112,no-resolve +IP-CIDR6,2408:80f1:31:50::/112,no-resolve +IP-CIDR6,2409:8c1e:8fd0:50::/112,no-resolve +IP-CIDR6,240e:e1:a900:50::/112,no-resolve + +# Unknown UDP +IP-CIDR,111.30.160.0/20,no-resolve +IP-CIDR,112.53.11.0/24,no-resolve +IP-CIDR,112.53.20.0/24,no-resolve + +# China Unicom IPv6 (WeChat) +IP-CIDR6,2408:80F1:21::/48,no-resolve +IP-CIDR6,2408:80F1:31::/48,no-resolve +IP-CIDR6,2408:8711:10:10::/112,no-resolve +IP-CIDR6,2408:8752:0:10::/60,no-resolve +IP-CIDR6,2408:8752:0:2:30::/112,no-resolve +IP-CIDR6,2408:8752:0:30::/64,no-resolve +IP-CIDR6,2408:8752:0:F::/64,no-resolve +IP-CIDR6,2408:8756:F50::/48,no-resolve +IP-CIDR6,2408:8756:2CF2:19::/112,no-resolve +IP-CIDR6,2408:8756:2CFF:10::/60,no-resolve +IP-CIDR6,2408:8756:3AF0:10::/112,no-resolve +IP-CIDR6,2408:8756:3AF0:2013::/112,no-resolve +IP-CIDR6,2408:8763:0:200::/60,no-resolve + +# China Mobile IPv6 (WeChat) +IP-CIDR6,2409:8702:4860:10::/112,no-resolve +IP-CIDR6,2409:8754:F111::/60,no-resolve +IP-CIDR6,2409:8C02:24C:45::/72,no-resolve +IP-CIDR6,2409:8C1E:75B0:1010::/112,no-resolve +IP-CIDR6,2409:8C1E:75B0:13::/112,no-resolve +IP-CIDR6,2409:8C1E:8F60::/60,no-resolve +IP-CIDR6,2409:8C1E:8F60:BB::/72,no-resolve +IP-CIDR6,2409:8C1E:8FD0::/56,no-resolve +IP-CIDR6,2409:8C20:818:110::/60,no-resolve +IP-CIDR6,2409:8C34:2220:20::/60,no-resolve +IP-CIDR6,2409:8C34:22A0:10::/60,no-resolve +IP-CIDR6,2409:8C34:D00:200::/60,no-resolve +IP-CIDR6,2409:8C38:80:150::/72,no-resolve +IP-CIDR6,2409:8C50:2400::/60,no-resolve +IP-CIDR6,2409:8C50:A00:2122::/72,no-resolve +IP-CIDR6,2409:8C54:1003:1019::/112,no-resolve +IP-CIDR6,2409:8C54:1003:10::/112,no-resolve +IP-CIDR6,2409:8C54:1050:10::/112,no-resolve +IP-CIDR6,2409:8C54:1801:10::/60,no-resolve +IP-CIDR6,2409:8C54:1821:70::/60,no-resolve +IP-CIDR6,2409:8C54:2000:400::/60,no-resolve +IP-CIDR6,2409:8C54:2800:9110::/60,no-resolve +IP-CIDR6,2409:8C54:5100::/56,no-resolve +IP-CIDR6,2409:8C54:810:208:2D::/112,no-resolve +IP-CIDR6,2409:8C54:871::/60,no-resolve +IP-CIDR6,2409:8C5C:110:63::/72,no-resolve + +# China Telecom IPv6 (WeChat) +IP-CIDR6,240E:928:1400:10::/112,no-resolve +IP-CIDR6,240E:965:802:620::/60,no-resolve +IP-CIDR6,240E:93C:8:10::/60,no-resolve +IP-CIDR6,240E:95C:2003:20::/60,no-resolve +IP-CIDR6,240E:95C:3003:14::/60,no-resolve +IP-CIDR6,240E:96C:6400:700::/60,no-resolve +IP-CIDR6,240E:97C:18:601::/64,no-resolve +IP-CIDR6,240E:97C:18:910::/60,no-resolve +IP-CIDR6,240E:97C:2F::/60,no-resolve +IP-CIDR6,240E:97D:4:1E00::/60,no-resolve +IP-CIDR6,240E:97D:2010:100::/60,no-resolve +IP-CIDR6,240E:97F:3000:1102::/64,no-resolve +IP-CIDR6,240E:CF:8800::/56,no-resolve +IP-CIDR6,240E:E1:A800::/46,no-resolve +IP-CIDR6,240E:E1:A900::/48,no-resolve +IP-CIDR6,240E:E1:AA00::/48,no-resolve +IP-CIDR6,240E:E9:6003::/48,no-resolve +IP-CIDR6,240E:F7:4F00:1F10::/60,no-resolve +IP-CIDR6,240E:F7:A070:100::/60,no-resolve +IP-CIDR6,240E:F7:A070:403::/60,no-resolve +IP-CIDR6,240E:FF:9018:100::/60,no-resolve +IP-CIDR6,240E:FF:F100::/44,no-resolve + +DOMAIN,apd-pcdnwxlogin.teg.tencent-cloud.net +DOMAIN,btrace.qq.com +DOMAIN,dldir1.qq.com +DOMAIN,slife.xy-asia.com +DOMAIN,soup.v.qq.com +DOMAIN,vweixinf.tc.qq.com +DOMAIN,weixin110.qq.com +DOMAIN,wup.imtt.qq.com +DOMAIN,wx.tenpay.com +DOMAIN,wxapp.tc.qq.com +DOMAIN-SUFFIX,iot-tencent.com +DOMAIN-SUFFIX,map.qq.com +DOMAIN-SUFFIX,qlogo.cn +DOMAIN-SUFFIX,qpic.cn +DOMAIN-SUFFIX,servicewechat.com +DOMAIN-SUFFIX,vweixinthumb.tc.qq.com +DOMAIN-SUFFIX,wechat.com +DOMAIN-SUFFIX,wechatos.net +DOMAIN-SUFFIX,weixin.com +DOMAIN-SUFFIX,weixin.qq.com +DOMAIN-SUFFIX,wx.gtimg.com +DOMAIN-SUFFIX,wx.qq.com +DOMAIN-SUFFIX,wxs.qq.com + +# Device positioning +DOMAIN-SUFFIX,analytics.map.qq.com +DOMAIN-SUFFIX,apis.map.qq.com +DOMAIN-SUFFIX,cc.map.qq.com +DOMAIN-SUFFIX,indoorroad.map.qq.com +DOMAIN-SUFFIX,lbs.gtimg.com +DOMAIN-SUFFIX,lbs.map.qq.com +DOMAIN-SUFFIX,nlp.map.qq.com +DOMAIN-SUFFIX,rttgps.map.qq.com +DOMAIN-SUFFIX,ue.indoorloc.map.qq.com +DOMAIN-SUFFIX,up-hl.3g.qq.com +DOMAIN-SUFFIX,yun-hl.3g.qq.com + +USER-AGENT,WeChat* +USER-AGENT,MicroMessenger* diff --git a/TestFlight/TestFlightAccount.js b/TestFlight/TestFlightAccount.js new file mode 100644 index 0000000000..8b4f63cf46 --- /dev/null +++ b/TestFlight/TestFlightAccount.js @@ -0,0 +1,311 @@ +/******************************** +TestFlight账户管理脚本 + +脚本作者: @NobyDa +脚本兼容: Surge4、QuantumultX、Loon(2.1.20 413+) +更新时间: 2024/04/26 +主要功能: +1. 自动存储多个TestFlight账户,并自动合并APP列表,避免切换账户。 + +2. 账户内单个测试版APP允许多方共享: + - 导出:点击测试版APP -> App详情 -> 描述 -> 复制底部密钥并分享给对方 + - 导入:TestFlight 右上角"兑换" -> 粘贴密钥 -> 弹出保存成功通知后刷新APP列表 + - 多方共享为实验性功能,双方都需要使用该脚本; 该功能主要解决某些APP的TF名额稀缺的问题 + +请注意,该脚本已经与"TF区域限制解除脚本"合并,如需使用该脚本请务必禁用它,否则可能出现APP安装异常 + +********************************* +Surge4 添加脚本: +********************************* + +Surge模块地址: +https://raw.githubusercontent.com/NobyDa/Script/master/Surge/Module/TestFlightAccount.sgmodule + +********************************* +QuantumultX 添加脚本: +********************************* + +QuantumultX重写引用地址: +https://raw.githubusercontent.com/NobyDa/Script/master/TestFlight/TestFlightAccount.js + +注:以上引用地址需要打开并使用KOP-XIAO资源解析器,如没有解析器请使用脚本配置: + +[rewrite_local] +^https:\/\/testflight\.apple\.com\/v\d\/(app|account|invite)s\/ url script-analyze-echo-response https://raw.githubusercontent.com/NobyDa/Script/master/TestFlight/TestFlightAccount.js + +[mitm] +hostname = testflight.apple.com + +********************************* +Loon 添加脚本: +********************************* + +Loon插件地址: +https://raw.githubusercontent.com/NobyDa/Script/master/Loon/Loon_TF_Account.plugin + +*********************************/ + +const $ = API("TESTFLIGHT-ACCOUNT"); +const args = formatArgument(typeof $argument == "string" && $argument || ''); +$.env.isNode ? $request = $.read('Request') : null; +const [obj, req, rsp] = [new Map(), $request, {}]; +const [k1, k2, k3] = ['x-session-id', 'x-request-id', 'x-session-digest']; +const [list, appList, cacheInfo] = [$.read('AccountList') || {}, $.read('AppList') || {}, $.read('CachedInfo') || {}]; +$.debug = Number(args.debug) || ($.read('Debug') === 'true'); +$.EnableCache = !(Number(args.enableCache) === 0) || !($.read('EnableCache') === 'false'); +$.ForceIOSlist = Number(args.forceIOSlist) || ($.read('ForceIOSlist') === 'true'); +$.RequestTimeout = Number(args.timeout || $.read('Timeout')) || 30; + +runs() + .then((resp) => { + resp = ChangeBody(resp); + rsp.body = resp.body || '{}'; + rsp.headers = formatHeaders(resp.headers || { 'Content-Type': 'application/json' }); + rsp.status = $.env.isQX ? `HTTP/1.1 ${resp.status || 200}` : resp.status || 200; + delete rsp.headers['content-length']; + delete rsp.headers['transfer-encoding']; //prevent issues in qx + $.log(`Return to client: ${$.stringify(rsp)}`); + }) + .catch(e => $.error(e.error || e.message || e)) + .finally(() => $.done($.env.isQX ? rsp : { response: rsp })); + +async function runs() { + // Object.keys(list).map(a => delete list[a].only) + req.headers = formatHeaders(req.headers); //compatible with HTTP/2 + const appID = req.url.split(/\/apps\/(\d+)/)[1]; + const other = /\/(accept|withdraw|devices|session|notifications|status)/.test(req.url); + if (/accounts\/[a-z0-9-]{36}\/apps$/.test(req.url)) { + const acc = SaveAccount(req.url.split(/\/([a-z0-9-]{36})\//)[1]); + return await Promise.all(Object.keys(acc).map(QueryRequest)); + } else if (/\/install$/.test(req.url) && req.body) { + req.body = JSON.parse(req.body); + req.body.storefrontId = '143441-19,29'; //prevent regional restrictions + req.body = JSON.stringify(req.body); + } else if (/\/[A-Z]{200,}\/redeem$/.test(req.url)) { + return { body: ExternalAccount(req.url.split(/\/([A-Z]+)\/redeem$/)[1]) }; + } + return await QueryRequest(!other && appList[appID] || null); +} + +function SaveAccount(id, part, o) { + if (!list[id]) { + list[id] = {}; + const text = `Account ID "${id}" saved. (total ${Object.keys(list).length}) 🎉`; + $.notify('TestFlight Account', '', text); + $.info(text); + }; + list[id][k1] = (part || req.headers)[k1]; + list[id][k2] = (part || req.headers)[k2]; + list[id][k3] = (part || req.headers)[k3]; + if (o) { + if (list[id].only) { + list[id].only.push(o); + $.notify('TestFlight Account', '', `App ID "${o}" saved 🎉`); + } else { + list[id].only = [o]; + } + } + return $.write(list, 'AccountList'), list; +} + +function formatHeaders(h) { + return Object.keys(h).reduce((t, i) => (t[i.toLowerCase()] = h[i], t), {}) +} + +function formatArgument(s) { + return Object.fromEntries(s.split('&').map(item => item.split('='))) +} + +function ChangeHeaders(id) { + const re = JSON.parse(JSON.stringify(req)); //easy deep copy + re.url = re.url.replace(/:\/\/.+?\//, '://testflight.apple.com/'); //prevent cdn issues + re.timeout = $.RequestTimeout * 1000; + re.insecure = true; //skip ssl + re['X-Surge-Skip-Scripting'] = true; //prevent shadowrocket loopback issues + if ($.ForceIOSlist && req.url.endsWith('/apps') && re.headers['user-agent'].includes('Mac')) { + re.headers['user-agent'] = 'Oasis/3.5.1 OasisBuild/425.2 iOS/17.4 model/iPhone16,2 hwp/t8130 build/21E219 (6; dt:311) AMS/1 TSE/0'; + } + if (id) { + $.log(`Request header replaced, using "${id}"`); + re.headers[k1] = list[id][k1]; + re.headers[k2] = list[id][k2]; + re.headers[k3] = list[id][k3]; + re.url = re.url.replace(/\/[a-z0-9-]{36}\//, `/${id}/`); + } + delete re.headers['if-none-match']; //prevent 304 + delete re.headers['content-length']; + $.log(`Send request: ${$.stringify(re)}`); + return re; +} + +function ChangeBody(resp) { + if (req.url.endsWith('/apps')) { + resp = resp.reduce((t, d) => { + d.body = JSON.parse(d.status == 200 && d.body || '{}'); + $.log(`Account "${d.account}" app list: ${$.stringify((d.body.data || []).map(i => i.name))}`); + d.body.data = (d.body.data || []).map(i => { + if ($.ForceIOSlist) { + i.platforms = i.platforms.map(j => { + if (j.name == 'osx') { + $.log(`Account "${d.account}" app [${i.name}] force mac compatible`); + j.build.compatible = true; + j.build.platformCompatible = true; + j.build.osCompatible = true; + j.build.hardwareCompatible = true; + } + return j + }) + } + i.aid = d.account; + const only = !list[d.account].only || list[d.account].only.includes(String(i.appAdamId)); + return only && t.body.data[req.url.includes(d.account) ? 'unshift' : 'push'](i), i; + }); + if (req.url.includes(d.account)) { + [t.status, t.headers] = [d.status, d.headers]; + } + return t + }, { body: { data: [], error: null } }); + resp.body.data = resp.body.data.filter(r => !r.previouslyTested && !obj.has(r.appAdamId) && obj.set(r.appAdamId, 1)); + $.write(resp.body.data.reduce((l, v) => (l[v.appAdamId] = v.aid, l), {}), 'AppList'); + $.log(`Final app: ${$.stringify(resp.body.data.map(i => i.name))}`); + resp.body = JSON.stringify(resp.body); + } + if (/\/apps\/\d+\/builds\/\d+$/.test(req.url) && resp.status == 200 && resp.body) { //beta app page + const share = ShareAccount(req.url.split(/\/apps\/(\d+)/)[1]); + resp.body = JSON.parse(resp.body); + resp.body.data.builds.map(e => e.description = `${e.description || '-'}${share}`); + resp.body = JSON.stringify(resp.body); + } + return resp; +} + +function QueryRequest(o) { + const option = ChangeHeaders(o); + const needCache = $.EnableCache && (option.url.endsWith('/apps') || /\/apps\/\d+\/builds\/\d+$/.test(req.url)); + return $.http[req.method.toLowerCase()](option) + .then(r => { + $.log(`URL "${option.url}" response: status=${r.status}, body=${Boolean(r.body)}`); + if (r.status == 401 && o) { + if (list[o].InvalidKey >= 2) { //prevent misjudgment + delete list[o]; + } else { + list[o].InvalidKey = (list[o].InvalidKey || 0) + 1; + } + $.write(list, 'AccountList'); + $.notify('TestFlight Account', '', `Account ID "${o}" key expired ⚠️`); + throw 'key expired ⚠️'; + } + if (needCache && r.status == 200 && r.body && r.body.startsWith('{')) { + const cacheKey = (cacheInfo[option.url] && cacheInfo[option.url].key) || `TESTFLIGHT-ACCOUNT-${letterEncode(option.url.split(/\/\/.+?\/(.+)/)[1])}`; + $.log(`Write to cache, URL "${option.url}", READ KEY "${cacheKey}"`); + cacheInfo[option.url] = { key: cacheKey, lastUsed: Date.now() }; + Object.keys(cacheInfo).forEach((i) => (Date.now() - (cacheInfo[i].lastUsed || 0) > 864e5 * 3) && $.delete(`#${cacheInfo[i].key}`) && delete cacheInfo[i]); //clear unused cache for 3 days + $.write(cacheInfo, 'CachedInfo'); + $.write(JSON.stringify(r), `#${cacheKey}`); + } + return { ...r, account: o } + }) + .catch(e => { + if (needCache && cacheInfo[option.url] && !(e).includes('key expired')) { + $.log(`URL "${option.url}" Try using cached data`); + const cachedData = $.read(`#${cacheInfo[option.url].key}`); + cacheInfo[option.url].lastUsed = Date.now(); + !cachedData ? delete cacheInfo[option.url] : null; + $.write(cacheInfo, 'CachedInfo'); + return { ...JSON.parse(cachedData || '{}'), account: o } + } + $.error(`URL "${option.url}" response failed: ${e}`); + return { account: o } + }) +} + +function ExternalAccount(key) { + try { + const k = JSON.parse(letterDecode(key)); + $.log(`Raw data: ${key}\nDecode data: ${$.stringify(k)}`); + if (!k.appID || !k.accID || !k.key[k1] || !k.key[k2] || !k.key[k3]) { + throw new Error('Missing data'); + } else if (appList[k.appID]) { + $.notify('TestFlight Account', '', `Failed, app already exists ⚠️`); + } else { + const save = SaveAccount(k.accID, k.key, k.appID); + } + } catch (e) { + const text = `External account parse failed`; + $.notify('TestFlight Account', '', `${text} ⚠️`); + $.error(`${text}: ${e.message || e}`); + } + return '{}' +} + +function ShareAccount(appID) { + const raw = $.stringify({ + appID: appID, + accID: appList[appID], + key: list[appList[appID]] + }); + const key = letterEncode(raw); + const disclaimer = `\n\n\n +================================ +TestFlight 账户管理脚本: + +请注意,使用"共享"功能时,请务必仔细阅读以下声明 ‼️ +请注意,使用"共享"功能时,请务必仔细阅读以下声明 ‼️ +请注意,使用"共享"功能时,请务必仔细阅读以下声明 ‼️ +================================ + +权限: +您即将共享的密钥理论上具有以下权限,包括但不限于: + + - 查看/下载您 TestFlight 账号内的任何测试版 APP + - 使用您的密钥接受测试 TestFlight 中的任何测试版 APP + - 停止测试您 TestFlight 账号内的任何测试版 APP + - 查看您接受 TestFlight 测试版 APP 邀请时所使用的邮箱 + - 查看/加入/移除您 TestFlight 账号中的设备列表 + - 更改您 TestFlight 测试版 APP 中的推送/电子邮件更新通知 + +免责: +任何用户使用"共享"功能时都应该仔细阅读权限声明,一旦您开始使用该功能,即视为您已知晓并理解密钥所具有的权限,密钥泄漏可能会导致不可预知的损失或损害,脚本作者(NobyDa)不对由此产生的任何后果负责。 + +================================ + +该脚本在"默认"情况下,对方仅可查看/下载您共享的单个APP,但仍建议仅与您信任的人共享: + +`; + $.log(`Raw data: ${raw}\nEncode data: ${key}`); + return disclaimer + key; +} + +// private encode method, based on variant in RFC4648 +function letterEncode(e) { + e = e.split("").map(e => e.charCodeAt()); + const t = new Uint8Array(4 * Math.ceil(8 * e.length / 4)); + let n = 0; + for (const o of e) { + let e = 128; + for (let r = 0; r < 8; r++) t[n++] = o & e ? 1 : 0, e >>= 1 + } + let o = "", + r = 0; + return t.forEach((e, t) => { + r = r << 1 | e, (t + 1) % 4 == 0 && (o += "XKNWSPRMCTGZVDHF"[r], r = 0) + }), o +} + +function letterDecode(e) { + const t = new Uint8Array(4 * e.length); + let n = 0; + for (const o of e) { + const e = "XKNWSPRMCTGZVDHF".indexOf(o); + let r = 8; + for (let o = 0; o < 4; o++) t[n++] = e & r ? 1 : 0, r >>= 1 + } + const o = new Uint8Array(Math.floor(t.length / 8)); + return t.forEach((e, t) => { + const n = Math.floor(t / 8); + n < o.length && (o[n] = o[n] << 1 | e) + }), String.fromCharCode(...o) +} + +// https://github.com/Peng-YM/QuanX/tree/master/Tools/OpenAPI +function ENV() { const a = "function" == typeof require && "undefined" != typeof $jsbox; return { isQX: "undefined" != typeof $task, isLoon: "undefined" != typeof $loon, isSurge: "undefined" != typeof $httpClient && "undefined" == typeof $loon, isShadowrocket: "undefined" != typeof $Shadowrocket, isBrowser: "undefined" != typeof document, isNode: "function" == typeof require && !a, isJSBox: a, isRequest: "undefined" != typeof $request, isScriptable: "undefined" != typeof importModule } } function HTTP(a = { baseURL: "" }) { function b(b, j) { j = "string" == typeof j ? { url: j } : j; const k = a.baseURL; k && !i.test(j.url || "") && (j.url = k ? k + j.url : j.url), j = { ...a, ...j }; const l = j.timeout, m = { ...{ onRequest: () => { }, onResponse: a => a, onTimeout: () => { } }, ...j.events }; m.onRequest(b, j); let n; if (c) n = new Promise((a, c) => { $task.fetch({ method: b, ...j }).then(b => a({ status: b.statusCode, headers: b.headers, body: b.body }), a => c(a.error)) }); else if (d || e || g) n = new Promise((a, c) => { var e = Math.ceil; const f = g ? require("request") : $httpClient; !j.timeout || g || d || (j.timeout = e(j.timeout / 1e3)), f[b.toLowerCase()](j, (b, d, e) => { b ? c(b) : a({ status: d.status || d.statusCode, headers: d.headers, body: e }) }) }); else if (f) { const a = new Request(j.url); a.method = b, a.headers = j.headers, a.body = j.body, n = new Promise((b, c) => { a.loadString().then(c => { b({ status: a.response.statusCode, headers: a.response.headers, body: c }) }).catch(a => c(a)) }) } else h && (n = new Promise((a, c) => { fetch(j.url, { method: b, headers: j.headers, body: j.body }).then(a => a.json()).then(b => a({ status: b.status, headers: b.headers, body: b.data })).catch(c) })); let o; const p = l ? new Promise((a, b) => { o = setTimeout(() => (m.onTimeout(), b(`timeout`)), l) }) : null; return (p ? Promise.race([p, n]).then(a => ("undefined" != typeof clearTimeout && clearTimeout(o), a)) : n).then(a => m.onResponse(a)) } const { isQX: c, isLoon: d, isSurge: e, isScriptable: f, isNode: g, isBrowser: h } = ENV(), i = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/, j = {}; return ["GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "PATCH"].forEach(a => j[a.toLowerCase()] = c => b(a, c)), j } function API(a = "untitled", b = !1) { const { isQX: c, isLoon: d, isSurge: e, isNode: f, isJSBox: g, isScriptable: h } = ENV(); return new class { constructor(a, b) { this.name = a, this.debug = b, this.http = HTTP(), this.env = ENV(), this.node = (() => { if (f) { const a = require("fs"); return { fs: a } } return null })(), this.initCache(); const c = (a, b) => new Promise(function (c) { setTimeout(c.bind(null, b), a) }); Promise.prototype.delay = function (a) { return this.then(function (b) { return c(a, b) }) } } initCache() { if (c && (this.cache = JSON.parse($prefs.valueForKey(this.name) || "{}")), (d || e) && (this.cache = JSON.parse($persistentStore.read(this.name) || "{}")), f) { let a = "root.json"; this.node.fs.existsSync(a) || this.node.fs.writeFileSync(a, JSON.stringify({}), { flag: "wx" }, a => console.log(a)), this.root = {}, a = `${this.name}.json`, this.node.fs.existsSync(a) ? this.cache = JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)) : (this.node.fs.writeFileSync(a, JSON.stringify({}), { flag: "wx" }, a => console.log(a)), this.cache = {}) } } persistCache() { const a = JSON.stringify(this.cache, null, 2); c && $prefs.setValueForKey(a, this.name), (d || e) && $persistentStore.write(a, this.name), f && (this.node.fs.writeFileSync(`${this.name}.json`, a, { flag: "w" }, a => console.log(a)), this.node.fs.writeFileSync("root.json", JSON.stringify(this.root, null, 2), { flag: "w" }, a => console.log(a))) } write(a, b) { if (this.log(`SET ${b}`), -1 !== b.indexOf("#")) { if (b = b.substr(1), e || d) return $persistentStore.write(a, b); if (c) return $prefs.setValueForKey(a, b); f && (this.root[b] = a) } else this.cache[b] = a; this.persistCache() } read(a) { if (this.log(`READ ${a}`), -1 !== a.indexOf("#")) { if (a = a.substr(1), e || d) return $persistentStore.read(a); if (c) return $prefs.valueForKey(a); if (f) return this.root[a] } else return this.cache[a] } delete(a) { if (this.log(`DELETE ${a}`), -1 !== a.indexOf("#")) { if (a = a.substr(1), e || d) return $persistentStore.write(null, a); if (c) return $prefs.removeValueForKey(a); f && delete this.root[a] } else delete this.cache[a]; this.persistCache() } notify(a, b = "", i = "", j = {}) { const k = j["open-url"], l = j["media-url"]; if (c && $notify(a, b, i, j), e && $notification.post(a, b, i + `${l ? "\n\u591A\u5A92\u4F53:" + l : ""}`, { url: k }), d) { let c = {}; k && (c.openUrl = k), l && (c.mediaUrl = l), "{}" === JSON.stringify(c) ? $notification.post(a, b, i) : $notification.post(a, b, i, c) } if (f || h) { const c = i + (k ? `\n点击跳转: ${k}` : "") + (l ? `\n多媒体: ${l}` : ""); if (g) { const d = require("push"); d.schedule({ title: a, body: (b ? b + "\n" : "") + c }) } else console.log(`${a}\n${b}\n${c}\n\n`) } } log(a) { this.debug && console.log(`[${this.name}] LOG: ${this.stringify(a)}`) } info(a) { console.log(`[${this.name}] INFO: ${this.stringify(a)}`) } error(a) { console.log(`[${this.name}] ERROR: ${this.stringify(a)}`) } wait(a) { return new Promise(b => setTimeout(b, a)) } done(a = {}) { c || d || e ? $done(a) : f && !g && "undefined" != typeof $context && ($context.headers = a.headers, $context.statusCode = a.statusCode, $context.body = a.body) } stringify(a) { if ("string" == typeof a || a instanceof String) return a; try { return JSON.stringify(a, null, 2) } catch (a) { return "[object Object]" } } }(a, b) } \ No newline at end of file diff --git a/Time-based-One-Time-Password/README.md b/Time-based-One-Time-Password/README.md new file mode 100644 index 0000000000..ef97d09f26 --- /dev/null +++ b/Time-based-One-Time-Password/README.md @@ -0,0 +1,23 @@ +## Desc + +A time-based one-time password algorithm(TOTP), implemented entirely 100% in Javascript. + +This script complies with [RFC6238](https://datatracker.ietf.org/doc/html/rfc6238) specification and can be run in Surge, QuantumultX, Loon, Shadowrocket. + + + +## Usage + +```javascript +const key = 'YOURCLIENTTOKEN'; //TOTP key +const totp = TOTP(key); //Return a six-digit one-time password. + +console.log(totp); //Print log +``` + + + +## Acknowledgements + +This script is adapted from https://jsfiddle.net/russau/rbyjk774 and uses Brian Turek's [jsSHA](https://github.com/caligatio/jsSHA/). + diff --git a/Time-based-One-Time-Password/TOTP.min.js b/Time-based-One-Time-Password/TOTP.min.js new file mode 100644 index 0000000000..35d1ab357f --- /dev/null +++ b/Time-based-One-Time-Password/TOTP.min.js @@ -0,0 +1 @@ +function TOTP(token){function t(e,a,d){var g=0,c=[],b=0,f,k,l,h,m,w,n,y,p=!1,q=[],t=[],v,u=!1;d=d||{};f=d.encoding||"UTF8";v=d.numRounds||1;l=z(a,f);if(v!==parseInt(v,10)||1>v)throw Error("numRounds must a integer >= 1");if("SHA-1"===e)m=512,w=A,n=H,h=160,y=function(a){return a.slice()};else throw Error("Chosen SHA variant is not supported");k=x(e);this.setHMACKey=function(a,b,c){var d;if(!0===p)throw Error("HMAC key already set");if(!0===u)throw Error("Cannot set HMAC key after calling update");f=(c||{}).encoding||"UTF8";b=z(b,f)(a);a=b.binLen;b=b.value;d=m>>>3;c=d/4-1;if(da/8){for(;b.length<=c;)b.push(0);b[c]&=4294967040}for(a=0;a<=c;a+=1)q[a]=b[a]^909522486,t[a]=b[a]^1549556828;k=w(q,k);g=m;p=!0};this.update=function(a){var d,e,f,h=0,n=m>>>5;d=l(a,c,b);a=d.binLen;e=d.value;d=a>>>5;for(f=0;f>>5);b=a%m;u=!0};this.getHash=function(a,d){var f,l,m,r;if(!0===p)throw Error("Cannot call getHash after setting HMAC key");m=B(d);switch(a){case"HEX":f=function(a){return C(a,h,m)};break;case"B64":f=function(a){return D(a,h,m)};break;case"BYTES":f=function(a){return E(a,h)};break;case"ARRAYBUFFER":try{l=new ArrayBuffer(0)}catch(I){throw Error("ARRAYBUFFER not supported by this environment");}f=function(a){return F(a,h)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}r=n(c.slice(),b,g,y(k),h);for(l=1;l>>3;if(0!==g%2)throw Error("String of HEX type must be in byte increments");for(c=0;c>>1)+l;for(f=k>>>2;a.length<=f;)a.push(0);a[f]|=b<<8*(3-k%4)}return{value:a,binLen:4*g+d}}function K(e,a,d){var g=[],c,b,f,k,g=a||[0];d=d||0;b=d>>>3;for(c=0;c>>2,g.length<=f&&g.push(0),g[f]|=a<<8*(3-k%4);return{value:g,binLen:8*e.length+d}}function L(e,a,d){var g=[],c=0,b,f,k,l,h,m,g=a||[0];d=d||0;a=d>>>3;if(-1===e.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");f=e.indexOf("=");e=e.replace(/\=/g,"");if(-1!==f&&f=s.length){s=Array(l+1-s.length).join(p)+s}return s}return(function(s){var k=V(s);var e=Math.round(new Date().getTime()/1000.0);var r=T(X(Math.floor(e/30)),16,'0');var j=new t("SHA-1","HEX");j.setHMACKey(k,"HEX");j.update(r);var h=j.getHMAC("HEX");var o=parseInt(h.substring(h.length-1),16);var p=(parseInt(h.substr(o*2,8),16)&parseInt('7fffffff',16))+'';var z=p.substr(p.length-6,6);return z})(token)}; \ No newline at end of file diff --git a/iQIYI-DailyBonus/iQIYI.js b/iQIYI-DailyBonus/iQIYI.js new file mode 100644 index 0000000000..8efdd2517a --- /dev/null +++ b/iQIYI-DailyBonus/iQIYI.js @@ -0,0 +1,555 @@ +/* +爱奇艺会员签到脚本 + +更新时间: 2024/05/15 +脚本兼容: QuantumultX, Surge4, Loon, JsBox, Node.js +电报频道: @NobyDa +问题反馈: @NobyDa_bot + +获取Cookie说明: +Safari浏览器打开 https://m.iqiyi.com/user.html 使用密码登录, 如通知成功获取cookie则可使用该脚本. +获取Cookie后, 请将Cookie脚本禁用并移除主机名,以免产生不必要的MITM. +脚本将在每天上午9:00执行, 您可以修改执行时间。 + +如果使用Node.js, 需自行安装'request'模块. 例: npm install request -g + +Node.js环境变量相关: +Cookie:IQIYI_COOKIE +Debug调试:IQIYI_DEBUG +Bark通知推送Key:BARK_PUSH +Bark服务端(默认官方):BARK_SERVER + +JsBox, Node.js用户获取Cookie说明: +方法一手机:开启抓包, 网页登录 https://m.iqiyi.com/user.html 返回抓包APP搜索URL关键字 apis/user/info.action 复制请求头中的Cookie字段填入以下脚本变量或环境变量中即可 + +方法二PC:网页登录 https://www.iqiyi.com 按F12控制台执行 console.log(document.cookie) 复制打印的Cookie填入以下脚本变量或环境变量中即可 +*/ + +var cookie = ''; //单引号内填入手动获取的Cookie + +var barkKey = ''; //Bark APP 通知推送Key + +var barkServer = ''; //Bark APP 通知服务端地址(默认官方) + +/********************* +QuantumultX 远程脚本配置: +********************** +[task_local] +# 爱奇艺会员签到 +0 9 * * * https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +[rewrite_local] +# 获取Cookie +^https:\/\/passport\.iqiyi\.com\/apis\/user\/ url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +[mitm] +hostname= passport.iqiyi.com + +********************** +Surge 4.2.0+ 脚本配置: +********************** +[Script] +爱奇艺签到 = type=cron,cronexp=0 9 * * *,timeout=120,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +爱奇艺获取Cookie = type=http-request,pattern=^https:\/\/passport\.iqiyi\.com\/apis\/user\/,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +[MITM] +hostname= passport.iqiyi.com + +************************ +Loon 2.1.0+ 脚本配置: +************************ + +[Script] +# 爱奇艺签到 +cron "0 9 * * *" script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +# 获取Cookie +http-request ^https:\/\/passport\.iqiyi\.com\/apis\/user\/ script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js + +[Mitm] +hostname= passport.iqiyi.com + +*/ + +var LogDetails = false; // 响应日志 + +var pushMsg = []; + +let P00001, P00003, DFP + +var $nobyda = nobyda(); + +(async () => { + cookie = cookie || $nobyda.read("CookieQY") + LogDetails = $nobyda.read("iQIYI_LogDetails") === "true" ? true : LogDetails + if (typeof process !== 'undefined' && typeof process.env !== 'undefined') { + cookie = cookie || process.env.IQIYI_COOKIE; + LogDetails = LogDetails || process.env.IQIYI_DEBUG; + barkKey = barkKey || process.env.BARK_PUSH; + barkServer = barkServer || process.env.BARK_SERVER; + } + if ($nobyda.isRequest) { + GetCookie() + } else if (cookie) { + if (cookie.includes("P00001") && cookie.includes("P00003") && cookie.includes("__dfp=")) { + P00001 = cookie.match(/P00001=(.*?);/)[1]; + P00003 = cookie.match(/P00003=(.*?);/)[1]; + DFP = cookie.match(/__dfp=(\w+)/)[1]; + await login(); + await Checkin(); + for (let i = 0; i < 3; i++) { + const run = await Lottery(i); + if (run) { + await new Promise(r => setTimeout(r, 1000)); + } else { + break + } + } + const tasks = await getTaskList(); + for (let i = 0; i < tasks.length; i++) { + if (![1, 4].includes(tasks[i].status)) { //0:待领取 1:已完成 2:未开始 4:进行中 + await joinTask(tasks[i]); + await notifyTask(tasks[i]); + await new Promise(r => setTimeout(r, 1000)); + await getTaskRewards(tasks[i]); + console.log(`--------------------`) + } + } + const expires = $nobyda.expire ? $nobyda.expire.replace(/\u5230\u671f/, "") : "获取失败 ⚠️" + if (!$nobyda.isNode) $nobyda.notify("爱奇艺", "到期时间: " + expires, pushMsg.join('\n')); + if (barkKey) await BarkNotify($nobyda, barkKey, '爱奇艺', `到期时间: ${expires}\n${pushMsg.join('\n')}`, barkServer); + await $nobyda.time(); + } else { + console.log(`Cookie缺少关键值,需重新获取`) + } + } else { + $nobyda.notify("爱奇艺会员", "", "签到终止, 未获取Cookie"); + } +})().finally(() => { + $nobyda.done(); +}) + +function login() { + return new Promise(resolve => { + var URL = { + url: 'https://cards.iqiyi.com/views_category/3.0/vip_home?secure_p=iPhone&scrn_scale=0&dev_os=0&ouid=0&layout_v=6&psp_cki=' + P00001 + '&page_st=suggest&app_k=8e48946f144759d86a50075555fd5862&dev_ua=iPhone8%2C2&net_sts=1&cupid_uid=0&xas=1&init_type=6&app_v=11.4.5&idfa=0&app_t=0&platform_id=0&layout_name=0&req_sn=0&api_v=0&psp_status=0&psp_uid=451953037415627&qyid=0&secure_v=0&req_times=0', + headers: { + sign: '7fd8aadd90f4cfc99a858a4b087bcc3a', + t: '479112291' + } + } + $nobyda.get(URL, function (error, response, data) { + const Details = LogDetails ? data ? `response:\n${data}` : '' : '' + if (!error && data.match(/\"text\":\"\d.+?\u5230\u671f\"/)) { + $nobyda.expire = data.match(/\"text\":\"(\d.+?\u5230\u671f)\"/)[1] + console.log(`爱奇艺-查询成功: ${$nobyda.expire} ${Details}`) + } else { + console.log(`爱奇艺-查询失败${error || ': 无到期数据 ⚠️'} ${Details}`) + } + resolve() + }) + }) +} + +function Checkin() { + const timestamp = new Date().getTime(); + const stringRandom = (length) => { + var rdm62, ret = ''; + while (length--) { + rdm62 = 0 | Math.random() * 62; + ret += String.fromCharCode(rdm62 + (rdm62 < 10 ? 48 : rdm62 < 36 ? 55 : 61)) + } + return ret; + }; + return new Promise(resolve => { + const sign_date = { + task_code: 'natural_month_sign', + timestamp: timestamp, + appKey: 'lequ_rn', + userId: P00003, + authCookie: P00001, + agenttype: 20, + agentversion: '15.4.6', + srcplatform: 20, + appver: '15.4.6', + qyid: md5(stringRandom(16)) + }; + + const post_date = { + "natural_month_sign": { + "verticalCode": "iQIYI", + "agentVersion": "15.4.6", + "authCookie": P00001, + "taskCode": "iQIYI_mofhr", + "dfp": DFP, + "qyid": md5(stringRandom(16)), + "agentType": 20, + "signFrom": 1 + } + }; + const sign = k("cRcFakm9KSPSjFEufg3W", sign_date, { + split: "|", + sort: !0, + splitSecretKey: !0 + }); + var URL = { + url: 'https://community.iqiyi.com/openApi/task/execute?' + w(sign_date) + "&sign=" + sign, + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(post_date) + } + $nobyda.post(URL, function (error, response, data) { + let CheckinMsg, rewards = []; + const Details = LogDetails ? `msg:\n${data || error}` : ''; + try { + if (error) throw new Error(`接口请求出错 ‼️`); + const obj = JSON.parse(data) + if (obj.code === "A00000") { + if (obj.data.code === "A0000") { + for (let i = 0; i < obj.data.data.rewards.length; i++) { + if (obj.data.data.rewards[i].rewardType == 1) { + rewards.push(`成长值+${obj.data.data.rewards[i].rewardCount}`) + } else if (obj.data.data.rewards[i].rewardType == 2) { + rewards.push(`VIP天+${obj.data.data.rewards[i].rewardCount}`) + } else if (obj.data.data.rewards[i].rewardType == 3) { + rewards.push(`积分+${obj.data.data.rewards[i].rewardCount}`) + } + } + var continued = obj.data.data.signDays; + CheckinMsg = `应用签到: ${rewards.length ? `${rewards.join(", ")}${rewards.length < 3 ? `, 累计签到${continued}天` : ``}` : '无奖励'} 🎉`; + } else { + CheckinMsg = `应用签到: ${obj.data.msg} ⚠️`; + } + } else { + CheckinMsg = `应用签到: Cookie无效 ⚠️`; + } + } catch (e) { + CheckinMsg = `应用签到: ${e.message || e}`; + } + pushMsg.push(CheckinMsg); + console.log(`爱奇艺-${CheckinMsg} ${Details}`); + resolve() + }) + }) +} + +function Lottery(s) { + return new Promise(resolve => { + const URL = { + url: 'https://iface2.iqiyi.com/aggregate/3.0/lottery_activity?app_k=0&app_v=0&platform_id=0&dev_os=0&dev_ua=0&net_sts=0&qyid=0&psp_uid=0&psp_cki=' + P00001 + '&psp_status=0&secure_p=0&secure_v=0&req_sn=0' + } + $nobyda.get(URL, async function (error, response, data) { + const Details = LogDetails ? `msg:\n${data || error}` : '' + let LotteryMsg; + try { + if (error) throw new Error("接口请求出错 ‼️"); + const obj = JSON.parse(data); + if (obj.title) { + LotteryMsg = `应用抽奖: ${obj.title != '影片推荐' && obj.awardName || '未中奖'} 🎉`; + LotteryMsg = obj.kv.code == 'Q00702' && `应用抽奖: 您的抽奖次数已经用完 ⚠️` || LotteryMsg; + $nobyda.stop = obj.kv.code == 'Q00702'; + } else if (obj.kv.code == 'Q00304') { + LotteryMsg = `应用抽奖: Cookie无效 ⚠️`; + $nobyda.stop = 1; + } else { + LotteryMsg = `应用抽奖: 未知错误 ⚠️` + } + } catch (e) { + LotteryMsg = `应用抽奖: ${e.message || e}`; + } + console.log(`爱奇艺-${LotteryMsg} (${s + 1}) ${Details}`) + pushMsg.push(LotteryMsg) + resolve(!$nobyda.stop) + }) + }) +} + +function getTaskList(task) { + return new Promise(resolve => { + $nobyda.get(`https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask?P00001=${P00001}`, function (error, response, data) { + let taskListMsg, taskList = []; + const Details = LogDetails ? `msg:\n${data || error}` : ''; + try { + if (error) throw new Error(`请求失败`); + const obj = JSON.parse(data); + if (obj.code == 'A00000' && obj.data && obj.data.tasks) { + Object.keys(obj.data.tasks).map((group) => { + (obj.data.tasks[group] || []).map((item) => { + taskList.push({ + name: item.taskTitle, + taskCode: item.taskCode, + status: item.status + }) + }) + }) + taskListMsg = `获取成功!`; + } else { + taskListMsg = `获取失败!`; + } + } catch (e) { + taskListMsg = `${e.message || e} ‼️`; + } + console.log(`爱奇艺-任务列表: ${taskListMsg} ${Details}`) + resolve(taskList) + }) + }) +} + +function joinTask(task) { + return new Promise(resolve => { + $nobyda.get('https://tc.vip.iqiyi.com/taskCenter/task/joinTask?taskCode=' + task.taskCode + '&lang=zh_CN&platform=0000000000000000&P00001=' + P00001, function (error, response, data) { + let joinTaskMsg, Details = LogDetails ? `msg:\n${data || error}` : ''; + try { + if (error) throw new Error(`请求失败`); + const obj = JSON.parse(data); + joinTaskMsg = obj.code || '领取失败'; + } catch (e) { + joinTaskMsg = `错误 ${e.message || e}`; + } + console.log(`爱奇艺-领取任务: ${task.name} => ${joinTaskMsg} ${Details}`) + resolve() + }) + }) +} + +function notifyTask(task) { + return new Promise(resolve => { + $nobyda.get('https://tc.vip.iqiyi.com/taskCenter/task/notify?taskCode=' + task.taskCode + '&lang=zh_CN&platform=0000000000000000&P00001=' + P00001, function (error, response, data) { + let notifyTaskMsg, Details = LogDetails ? `msg:\n${data || error}` : ''; + try { + if (error) throw new Error(`请求失败`); + const obj = JSON.parse(data); + notifyTaskMsg = obj.code || '失败'; + } catch (e) { + notifyTaskMsg = e.message || e; + } + console.log(`爱奇艺-开始任务: ${task.name} => ${notifyTaskMsg} ${Details}`) + resolve() + }) + }) +} + +function getTaskRewards(task) { + return new Promise(resolve => { + $nobyda.get('https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards?taskCode=' + task.taskCode + '&lang=zh_CN&platform=0000000000000000&P00001=' + P00001, function (error, response, data) { + let RewardsMsg; + const Details = LogDetails ? `msg:\n${data || error}` : '' + try { + if (error) throw new Error(`接口请求出错 ‼️`); + const obj = JSON.parse(data) + if (obj.msg === "成功" && obj.code === "A00000" && obj.dataNew[0] !== undefined) { + RewardsMsg = `任务奖励: ${task.name} => ${obj.dataNew[0].name + obj.dataNew[0].value} 🎉` + } else { + RewardsMsg = `任务奖励: ${task.name} => ${obj.msg !== `成功` && obj.msg || `未完成`} ⚠️` + } + } catch (e) { + RewardsMsg = `任务奖励: ${e.message || e}`; + } + pushMsg.push(RewardsMsg) + console.log(`爱奇艺-${RewardsMsg} ${Details}`) + resolve() + }) + }) +} + +function GetCookie() { + if (!$request.url.includes("iqiyi.com")) { + $nobyda.notify(`写入爱奇艺Cookie失败`, "", "请更新脚本配置(URL正则/MITM)"); + return + } + var CKA = $request.headers['Cookie'] || $request.headers['cookie'];; + var iQIYI = CKA && CKA.includes("P00001=") && CKA.includes("P00003=") && CKA.includes("__dfp=") && CKA; + var RA = $nobyda.read("CookieQY") + if (CKA && iQIYI) { + if (RA != iQIYI) { + var OldTime = $nobyda.read("CookieQYTime") + if (!$nobyda.write(iQIYI, "CookieQY")) { + $nobyda.notify(`${RA ? `更新` : `首次写入`}爱奇艺签到Cookie失败‼️`, "", "") + } else { + if (!OldTime || OldTime && (Date.now() - OldTime) / 1000 >= 21600) { + $nobyda.write(JSON.stringify(Date.now()), "CookieQYTime") + $nobyda.notify(`${RA ? `更新` : `首次写入`}爱奇艺签到Cookie成功 🎉`, "", "") + } else { + console.log(`\n更新爱奇艺Cookie成功! 🎉\n检测到频繁通知, 已转为输出日志`) + } + } + } else { + console.log("\n爱奇艺-与本机储存Cookie相同, 跳过写入 ⚠️") + } + } else { + $nobyda.notify(`爱奇艺`, "", "写入Cookie失败,关键值缺失 ⚠️") + } +} + +async function BarkNotify(c, k, t, b, p) { for (let i = 0; i < 3; i++) { console.log(`🔷Bark notify >> Start push (${i + 1})`); const s = await new Promise((n) => { c.post({ url: p || '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}`) } } } + +function nobyda() { + const times = 0 + const start = Date.now() + const isRequest = typeof $request != "undefined" + const isSurge = typeof $httpClient != "undefined" + const isQuanX = typeof $task != "undefined" + const isLoon = typeof $loon != "undefined" + const isJSBox = typeof $app != "undefined" && typeof $http != "undefined" + const isNode = typeof require == "function" && !isJSBox; + const node = (() => { + if (isNode) { + const request = require('request'); + return ({ + request + }) + } else { + return (null) + } + })() + const notify = (title, subtitle, message) => { + if (isQuanX) $notify(title, subtitle, message) + if (isSurge) $notification.post(title, subtitle, message) + if (isNode) log('\n' + title + '\n' + subtitle + '\n' + message) + if (isJSBox) $push.schedule({ + title: title, + body: subtitle ? subtitle + "\n" + message : message + }) + } + const write = (value, key) => { + if (isQuanX) return $prefs.setValueForKey(value, key) + if (isSurge) return $persistentStore.write(value, key) + } + const read = (key) => { + if (isQuanX) return $prefs.valueForKey(key) + if (isSurge) return $persistentStore.read(key) + } + const adapterStatus = (response) => { + if (response) { + if (response.status) { + response["statusCode"] = response.status + } else if (response.statusCode) { + response["status"] = response.statusCode + } + } + return response + } + const get = (options, callback) => { + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "GET" + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) $httpClient.get(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + if (isNode) { + node.request(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isJSBox) { + if (typeof options == "string") options = { + url: options + } + options["header"] = options["headers"] + options["handler"] = function (resp) { + let error = resp.error; + if (error) error = JSON.stringify(resp.error) + let body = resp.data; + if (typeof body == "object") body = JSON.stringify(resp.data); + callback(error, adapterStatus(resp.response), body) + }; + $http.get(options); + } + } + const post = (options, callback) => { + if (isQuanX) { + if (typeof options == "string") options = { + url: options + } + options["method"] = "POST" + $task.fetch(options).then(response => { + callback(null, adapterStatus(response), response.body) + }, reason => callback(reason.error, null, null)) + } + if (isSurge) { + options.headers['X-Surge-Skip-Scripting'] = false + $httpClient.post(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isNode) { + node.request.post(options, (error, response, body) => { + callback(error, adapterStatus(response), body) + }) + } + if (isJSBox) { + if (typeof options == "string") options = { + url: options + } + options["header"] = options["headers"] + options["handler"] = function (resp) { + let error = resp.error; + if (error) error = JSON.stringify(resp.error) + let body = resp.data; + if (typeof body == "object") body = JSON.stringify(resp.data) + callback(error, adapterStatus(resp.response), body) + } + $http.post(options); + } + } + + const log = (message) => console.log(message) + const time = () => { + const end = ((Date.now() - start) / 1000).toFixed(2) + return console.log('\n签到用时: ' + end + ' 秒') + } + const done = (value = {}) => { + if (isQuanX) return $done(value) + if (isSurge) isRequest ? $done(value) : $done() + } + return { + isRequest, + isNode, + notify, + write, + read, + get, + post, + log, + time, + times, + done + } +}; + +function k(e, t) { + var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} + , n = a.split + , c = void 0 === n ? "|" : n + , r = a.sort + , s = void 0 === r || r + , o = a.splitSecretKey + , i = void 0 !== o && o + , l = s ? Object.keys(t).sort() : Object.keys(t) + , u = l.map((function (e) { + return "".concat(e, "=").concat(t[e]) + } + )).join(c) + (i ? c : "") + e; + return md5(u) +} + +// Modified from https://github.com/blueimp/JavaScript-MD5 +function md5(string) { function RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) } function AddUnsigned(lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); if (lX4 & lY4) { return (lResult ^ 0x80000000 ^ lX8 ^ lY8) } if (lX4 | lY4) { if (lResult & 0x40000000) { return (lResult ^ 0xC0000000 ^ lX8 ^ lY8) } else { return (lResult ^ 0x40000000 ^ lX8 ^ lY8) } } else { return (lResult ^ lX8 ^ lY8) } } function F(x, y, z) { return (x & y) | ((~x) & z) } function G(x, y, z) { return (x & z) | (y & (~z)) } function H(x, y, z) { return (x ^ y ^ z) } function I(x, y, z) { return (y ^ (x | (~z))) } function FF(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b) }; function GG(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b) }; function HH(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b) }; function II(a, b, c, d, x, s, ac) { a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); return AddUnsigned(RotateLeft(a, s), b) }; function ConvertToWordArray(string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWords_temp1 = lMessageLength + 8; var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; var lWordArray = Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); lByteCount++ } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray }; function WordToHex(lValue) { var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; WordToHexValue_temp = "0" + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2) } return WordToHexValue }; function Utf8Encode(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c) } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128) } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128) } } return utftext }; var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; var S11 = 7, S12 = 12, S13 = 17, S14 = 22; var S21 = 5, S22 = 9, S23 = 14, S24 = 20; var S31 = 4, S32 = 11, S33 = 16, S34 = 23; var S41 = 6, S42 = 10, S43 = 15, S44 = 21; string = Utf8Encode(string); x = ConvertToWordArray(string); a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; for (k = 0; k < x.length; k += 16) { AA = a; BB = b; CC = c; DD = d; a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB); b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613); b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501); a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8); d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122); d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193); c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E); b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821); a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340); c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); d = GG(d, a, b, c, x[k + 10], S22, 0x2441453); c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681); c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05); a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); a = II(a, b, c, d, x[k + 0], S41, 0xF4292244); d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97); c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039); a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3); d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1); a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); c = II(c, d, a, b, x[k + 6], S43, 0xA3014314); b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82); d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391); a = AddUnsigned(a, AA); b = AddUnsigned(b, BB); c = AddUnsigned(c, CC); d = AddUnsigned(d, DD) } var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d); return temp.toLowerCase() } + +function w() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} + , t = []; + return Object.keys(e).forEach((function (a) { + t.push("".concat(a, "=").concat(e[a])) + } + )), + t.join("&") +}