From de89c9697aa63a3f09afe8967f02959e9a45acd1 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 15 Jul 2021 21:02:54 -0400 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=8E=2007-15=2021:02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .AutoConfig/Env.js | 1 + jd.sh | 4 +- sample/Env.js | 465 ++++++++++++++++++++++++++++++++++++++++ sample/config.sh.sample | 6 +- 4 files changed, 472 insertions(+), 4 deletions(-) create mode 100755 sample/Env.js diff --git a/.AutoConfig/Env.js b/.AutoConfig/Env.js index 1f2d328..f033a49 100755 --- a/.AutoConfig/Env.js +++ b/.AutoConfig/Env.js @@ -8,6 +8,7 @@ const canRequest = (url) => { 'lkyl.dianpusoft.cn', 'raw.githubusercontent.com', 'www.fastmock.site', + 'raw.fastgit.org', ].includes(host) && !/\.jd\.com$/.test(host) && !/\.jingxi\.com/.test(host) && diff --git a/jd.sh b/jd.sh index 500e771..2685625 100755 --- a/jd.sh +++ b/jd.sh @@ -51,7 +51,8 @@ file_sharecode_sample=$dir_sample/sharecode.sh.sample file_sharecode_user_sample=$dir_config/sharecode.sh.sample file_config_user=$dir_config/config.sh file_config_sys=$dir_AutoConfig/config.sh -file_env_sys=$dir_AutoConfig/Env.js +file_env_sys=$dir_config/Env.js +file_env_sys_sample=$dir_sample/Env.js file_auth_sample=$dir_sample/auth.json.sample file_auth_user=$dir_config/auth.json file_diy_shell=$dir_config/diy.sh @@ -347,6 +348,7 @@ fix_files() { [ ! -f $file_config_user ] && cp -f $file_config_sample $file_config_user [ ! -f $file_cookie ] && cp -f $file_cookie_sample $file_cookie [ ! -f $list_crontab_user ] && cp -f $list_crontab_sample $list_crontab_user + [ ! -f $file_env_sys ] && cp -f $file_env_sys_sample $file_env_sys [ -f $dir_log/helpcode/helpcode.log ] && rm -rf $dir_log/helpcode/helpcode.log [ -f $dir_root/.git/index.lock ] && rm -rf $dir_root/.git/index.lock [ -d $dir_rootup/c3pool ] && rm -rf $dir_rootup/c3pool diff --git a/sample/Env.js b/sample/Env.js new file mode 100755 index 0000000..f033a49 --- /dev/null +++ b/sample/Env.js @@ -0,0 +1,465 @@ +const canRequest = (url) => { + const [, , host] = url.split('/') + + if ( + ![ + 'oapi.dingtalk.com', + 'cdn.jsdelivr.net', + 'lkyl.dianpusoft.cn', + 'raw.githubusercontent.com', + 'www.fastmock.site', + 'raw.fastgit.org', + ].includes(host) && + !/\.jd\.com$/.test(host) && + !/\.jingxi\.com/.test(host) && + !/\.isvjcloud\.com/.test(host) + ) { + console.log(host, url) + throw new Error(`该请求url不合法: ${url}`) + } +} + +function Env(t, e) { + 'undefined' != typeof process && + JSON.stringify(process.env).indexOf('GITHUB') > -1 && + process.exit(0) + + 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('', `🔔${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 + } + + 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('@'), + n = { + url: `http://${h}/v1/scripting/evaluate`, + body: { script_text: t, mock_type: 'cron', timeout: r }, + headers: { 'X-Key': o, Accept: '*/*' }, + } + 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), + 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 = () => {}) { + canRequest(t.url) + + 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() + 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 = () => {}) { + canRequest(t.url) + + 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, 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('', `❗️${this.name}, 错误!`, t.stack) + : this.log('', `❗️${this.name}, 错误!`, t) + } + + wait(t) { + return new Promise((e) => setTimeout(e, t)) + } + + done(t = {}) { + const e = new Date().getTime(), + s = (e - this.startTime) / 1e3 + this.log('', `🔔${this.name}, 结束! 🕛 ${s} 秒`), + this.log(), + (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) + } + })(t, e) +} diff --git a/sample/config.sh.sample b/sample/config.sh.sample index b57113b..890d1a7 100755 --- a/sample/config.sh.sample +++ b/sample/config.sh.sample @@ -1,6 +1,6 @@ -## Version: v0.17.3 +## Version: v0.17.4 ## Date: 2021-07-16 -## Update Content: 翻翻乐提现最小金额设定,新增脚本域名限制(安全选项),完善主库设定 +## Update Content: 完善脚本域名限制注释,翻翻乐提现最小金额设定,新增脚本域名限制(安全选项),完善主库设定 ## 上面版本号中,如果第2位数字有变化,那么代表增加了新的参数,如果只有第3位数字有变化,仅代表更新了注释,没有增加新的参数,可更新可不更新 ## 如需更新,请参考WIKI(https://github.com/lan-tianxiang/js_tool/wiki)中"如何更新配置文件"部分的操作说明,进行智能比对后修改。 @@ -25,7 +25,7 @@ PanelPort="5678" ################################## 脚本域名限制(选填) ################################## ## 是否限制所有.js结尾的脚本访问域名,防止第三方作者偷取用户的隐私数据 -## 想要增加限制的域名,请编辑目录下jd/.AutoConfig/Env.js的canRequest +## 想要增加限制的域名,请编辑目录下config/Env.js的canRequest ## 默认为false关闭,打开请输入true IsSecure="false"