├── .github └── workflows │ └── repo-sync.yml ├── README.md ├── cheerz.gallery.json ├── jd ├── README.md ├── jdCookie.js ├── jd_priceProtect.js ├── jd_priceProtectRewrite.js └── sendNotify.js ├── jsz.js ├── jsz.png ├── qx_rewrite.txt └── zcy01.boxjs.json /.github/workflows/repo-sync.yml: -------------------------------------------------------------------------------- 1 | # File: .github/workflows/repo-sync.yml 2 | name: sync-zcy01-scripts 3 | on: 4 | schedule: 5 | - cron: '5 0,7,15 * * *' 6 | workflow_dispatch: 7 | watch: 8 | types: started 9 | repository_dispatch: 10 | types: sync-zcy01-scripts 11 | jobs: 12 | repo-sync: 13 | env: 14 | PAT: ${{ secrets.PAT || github.event.client_payload.PAT }} #此处PAT需要申请,教程详见:https://www.jianshu.com/p/bb82b3ad1d11 15 | runs-on: ubuntu-latest 16 | if: github.event.repository.owner.id == github.event.sender.id 17 | steps: 18 | - uses: actions/checkout@v2 19 | with: 20 | persist-credentials: false 21 | 22 | - name: sync zcy01-scripts 23 | uses: repo-sync/github-sync@v2 24 | if: env.PAT 25 | with: 26 | source_repo: "https://github.com/ZCY01/daily_scripts.git" 27 | source_branch: "main" 28 | destination_branch: "main" 29 | github_token: ${{ secrets.PAT || github.event.client_payload.PAT }} 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 特别声明: 2 | 3 | * 本仓库发布的 daily_scripts 项目中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断. 4 | 5 | * 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。 6 | 7 | * ZCY01 对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害. 8 | 9 | * 间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, ZCY01 对于由此引起的任何隐私泄漏或其他后果概不负责. 10 | 11 | * 请勿将 daily_scripts 项目的任何内容用于商业或非法目的,否则后果自负. 12 | 13 | * 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关脚本. 14 | 15 | * 任何以任何方式查看此项目的人或直接或间接使用该 daily_scripts 项目的任何脚本的使用者都应仔细阅读此声明。ZCY01 保留随时更改或补充此免责声明的权利。一旦使用并复制了任何相关脚本或 daily_scripts 项目的规则,则视为您已接受此免责声明. 16 | 17 | **您必须在下载后的24小时内从计算机或手机中完全删除以上内容.**
18 | > ***您使用或者复制了本仓库且本人制作的任何脚本,则视为`已接受`此声明,请仔细阅读*** 19 | 20 | 21 | ## 食用方法 22 | 23 | 控制脚本功能环境变量 24 | 25 | 26 | | Name | 归属 | 属性 | 说明 | 默认值 | 27 | | :--------------------------: | :--------------------------: | :--------: | :------------------------------------------------------------: | :----| 28 | | `JD_TOKENS` | X东价格保护 | 非必须 | token 列表,以`@`分隔 | | 29 | | `JD_TRY_PAGE_SIZE` | X东试用 | 非必须 | 控制每次获取商品数量 | 12 | 30 | | `JD_TRY_CIDS_KEYS` | X东试用 | 非必须 | 商品分类,以 `@` 隔开,具体类型请查看X东 | 家用电器@手机数码@电脑办公@家居家装 | 31 | | `JD_TRY_TYPE_KEYS` | X东试用 | 非必须 | 试用类型,以 `@` 隔开,具体类型请查看X东 | 免费试用@闪电试 | 32 | | `JD_TRY_GOOD_FILTERS` | X东试用 | 非必须 | 过滤试用商品关键字,以 `@` 隔开 | 教程@软件@英语@辅导@培训| 33 | | `JD_TRY_MIN_PRICE` | X东试用 | 非必须 | 试用商品最低价格 | 0 | 34 | | `JD_TRY_MAX_SUPPLY_COUNT` | X东试用 | 非必须 | 试用商品最多提供数量(过滤垃圾商品) | 10 | 35 | | `JD_TRY_APPLY_INTERVAL` | X东试用 | 非必须 | 试用商品间隔,单位:毫秒 | 5000 | -------------------------------------------------------------------------------- /cheerz.gallery.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily_scripts tasks", 3 | "task": [ 4 | { 5 | "config": "5 0 * * * https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtect.js, tag=京东价格保护, img-url=https://raw.githubusercontent.com/ZCY01/img/master/pricev1.png, enabled=true", 6 | "addons": "https://raw.githubusercontent.com/ZCY01/daily_scripts/main/qx_rewrite.txt, tag=京东价格保护" 7 | }, 8 | { 9 | "config": "1,16,31,46 7-20 * * * https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.js, tag=金手指", 10 | "addons": "https://raw.githubusercontent.com/ZCY01/daily_scripts/main/qx_rewrite.txt, tag=金手指" 11 | } 12 | ], 13 | "description": "https://github.com/ZCY01/daily_scripts" 14 | } -------------------------------------------------------------------------------- /jd/README.md: -------------------------------------------------------------------------------- 1 | # 价格保护 2 | 3 | ## Node 用户 4 | ``` 5 | # 在 scripts 目录下安装 jsdom 即可,如在安装过程中缺少其他依赖,请自行安装 6 | npm install jsdom 7 | ``` 8 | 9 | ## Quantumulx 用户 10 | 请配置 token 11 | 12 | token的获取方式: 13 | 14 | qx 配置抓token,可以抓网页:[价格保护](https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu)或者APP,刷新一次获取一个Token 15 | 16 | ``` 17 | [rewrite_local] 18 | https:\/\/api\.m\.jd\.com\/api\?appid=siteppM&functionId=siteppM_priceskusPull url script-request-body https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtectRewrite.js 19 | ``` -------------------------------------------------------------------------------- /jd/jdCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | 此文件为Node.js专用。其他用户请忽略 3 | */ 4 | //此处填写京东账号cookie。 5 | let CookieJDs = [ 6 | ] 7 | // 判断环境变量里面是否有京东ck 8 | if (process.env.JD_COOKIE) { 9 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 10 | console.log(`您的cookie选择的是用&隔开\n`) 11 | CookieJDs = process.env.JD_COOKIE.split('&'); 12 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 13 | console.log(`您的cookie选择的是用换行隔开\n`) 14 | CookieJDs = process.env.JD_COOKIE.split('\n'); 15 | } else { 16 | CookieJDs = [process.env.JD_COOKIE]; 17 | } 18 | } 19 | if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { 20 | console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); 21 | !(async () => { 22 | // await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) 23 | // await process.exit(0); 24 | })() 25 | } 26 | CookieJDs = [...new Set(CookieJDs.filter(item => item !== "" && item !== null && item !== undefined))] 27 | console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`); 28 | console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`) 29 | for (let i = 0; i < CookieJDs.length; i++) { 30 | const index = (i + 1 === 1) ? '' : (i + 1); 31 | exports['CookieJD' + index] = CookieJDs[i].trim(); 32 | } 33 | -------------------------------------------------------------------------------- /jd/jd_priceProtect.js: -------------------------------------------------------------------------------- 1 | /* 2 | update 2021/9/19 3 | 京东价格保护:脚本更新地址 https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtect.js 4 | 脚本兼容: QuantumultX, Node.js 5 | 6 | ==========================Quantumultx========================= 7 | 打开手机客户端,或者浏览器访问 https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu 8 | 9 | [rewrite_local] 10 | https:\/\/api\.m.jd.com\/api\?appid=siteppM&functionId=siteppM_priceskusPull url script-request-body https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtectRewrite.js 11 | 12 | [task_local] 13 | # 京东价格保护 14 | 5 0 * * * https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtect.js, tag=京东价格保护, img-url=https://raw.githubusercontent.com/ZCY01/img/master/pricev1.png, enabled=true 15 | 16 | ==========================Node========================= 17 | Node 用户安装 jsdom 即可,如缺少其他依赖自行安装 18 | 在 scripts 目录下:npm install jsdom 19 | */ 20 | 21 | const $ = new Env('京东价格保护'); 22 | 23 | const unifiedGatewayName = 'https://api.m.jd.com' 24 | 25 | // 请先配置 token!!!最好抓APP的! 26 | let tokens = '' // @ 分隔 27 | $.tokenList = [] 28 | $.HyperParam = { 29 | sid_hid: '', 30 | type_hid: '3', 31 | forcebot: '' 32 | } 33 | !(async () => { 34 | await requireConfig() 35 | if (!$.tokenList[0]) { 36 | $.msg($.name, '请先获取JD_TOKEN', 'https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu', { 37 | "open-url": "https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu" 38 | }) 39 | return 40 | } 41 | for (let i = 0; i < $.cookiesArr.length; i++) { 42 | if ($.cookiesArr[i]) { 43 | $.cookie = $.cookiesArr[i] 44 | $.UserName = decodeURIComponent($.cookie.match(/pt_pin=(.+?);/) && $.cookie.match(/pt_pin=(.+?);/)[1]) 45 | $.index = i + 1 46 | $.isLogin = true 47 | $.nickName = '' 48 | await totalBean(); 49 | if (!$.isLogin) { 50 | $.msg($.name, `【提示】cookie已失效`, `X东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, { 51 | "open-url": "https://bean.m.jd.com/" 52 | }) 53 | await $.notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `X东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); 54 | continue 55 | } 56 | console.log(`\n***********开始【X东账号${$.index}】${$.nickName || $.UserName}********\n`); 57 | 58 | $.refundtotalamount = 0 59 | $.token = $.tokenList.length > i ? $.tokenList[i] : ($.token || '') 60 | $.feSt = $.token ? 's' : 'f' 61 | 62 | $.applied = false 63 | await onceApply() 64 | if ($.applied) { 65 | await checkOnceAppliedResult() 66 | } 67 | await showMsg() 68 | await $.wait(1000) 69 | } 70 | } 71 | })() 72 | .catch((e) => { 73 | console.log(`❗️ ${$.name} 运行错误!\n${e}`) 74 | }).finally(() => $.done()) 75 | 76 | function requireConfig() { 77 | function jsonParse(str) { 78 | if (typeof str == "string") { 79 | try { 80 | return JSON.parse(str); 81 | } catch (e) { 82 | console.log(e); 83 | $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') 84 | return []; 85 | } 86 | } 87 | } 88 | return new Promise(async (resolve, reject) => { 89 | console.log('开始获取配置文件\n') 90 | $.notify = $.isNode() ? require('./sendNotify') : { sendNotify: async () => { } } 91 | //获取 Cookies 92 | $.cookiesArr = [] 93 | if ($.isNode()) { 94 | //Node.js用户请在jdCookie.js处填写X东ck; 95 | const jdCookieNode = require('./jdCookie.js'); 96 | Object.keys(jdCookieNode).forEach((item) => { 97 | if (jdCookieNode[item]) { 98 | $.cookiesArr.push(jdCookieNode[item]) 99 | } 100 | }) 101 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { }; 102 | } else { 103 | //IOS等用户直接用NobyDa的jd $.cookie 104 | $.cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); 105 | } 106 | console.log(`共${$.cookiesArr.length}个X东账号\n`) 107 | 108 | if ($.isNode()) { 109 | for(let i=0;i<$.cookiesArr.length;i++){ 110 | let token = await jstoken() 111 | if(token) { 112 | $.tokenList.push(token) 113 | } 114 | else { 115 | reject('gen token fail') 116 | } 117 | } 118 | console.log(`token length:${$.tokenList.length}`) 119 | } 120 | else { 121 | tokens = $.getdata('jd_tokens') || tokens 122 | $.tokenList = tokens.split('@') 123 | } 124 | resolve() 125 | }) 126 | } 127 | 128 | function onceApply() { 129 | return new Promise((resolve, reject) => { 130 | let paramObj = {}; 131 | paramObj.sid = $.HyperParam.sid_hid 132 | paramObj.type = $.HyperParam.type_hid 133 | paramObj.forcebot = $.HyperParam.forcebot 134 | paramObj.token = $.token 135 | paramObj.feSt = $.feSt 136 | 137 | let options = taskurl('siteppM_skuOnceApply', paramObj) 138 | $.post(options, (err, resp, data) => { 139 | try { 140 | if (err) { 141 | console.log(`🚫 ${arguments.callee.name.toString()} API请求失败,请检查网路\n${JSON.stringify(err)}`) 142 | } else { 143 | data = JSON.parse(data) 144 | if (data.flag) { 145 | $.applied = true 146 | } 147 | else { 148 | console.log(`一键价格保护失败,原因:${data.responseMessage}`) 149 | } 150 | } 151 | } catch (e) { 152 | reject(`⚠️ ${arguments.callee.name.toString()} API返回结果解析出错\n${e}\n${JSON.stringify(data)}`) 153 | } finally { 154 | resolve() 155 | } 156 | }) 157 | }) 158 | } 159 | 160 | function checkOnceAppliedResult() { 161 | return new Promise((resolve, reject) => { 162 | let paramObj = {} 163 | paramObj.sid = $.HyperParam.sid_hid 164 | paramObj.type = $.HyperParam.type_hid 165 | paramObj.forcebot = $.forcebot 166 | paramObj.num = 10 167 | 168 | let options = taskurl('siteppM_appliedSuccAmount', paramObj) 169 | $.post(options, (err, resp, data) => { 170 | try { 171 | if (err) { 172 | console.log(`🚫 ${arguments.callee.name.toString()} API请求失败,请检查网路\n${JSON.stringify(err)}`) 173 | } else { 174 | data = JSON.parse(data) 175 | if (data.flag) { 176 | $.refundtotalamount = data.succAmount 177 | } 178 | else { 179 | console.log(`一键价格保护结果:${JSON.stringify(data)}`) 180 | } 181 | } 182 | } catch (e) { 183 | reject(`⚠️ ${arguments.callee.name.toString()} API返回结果解析出错\n${e}\n${JSON.stringify(data)}`) 184 | } finally { 185 | resolve() 186 | } 187 | }) 188 | }) 189 | } 190 | 191 | async function jstoken() { 192 | let jsdom = require("jsdom"); 193 | const { JSDOM } = jsdom; 194 | let resourceLoader = new jsdom.ResourceLoader({ 195 | userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0', 196 | referrer: "https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu?sid=0b5a9d5564059f36ed16a8967c37e24w", 197 | }); 198 | let virtualConsole = new jsdom.VirtualConsole(); 199 | var options = { 200 | referrer: "https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu?sid=0b5a9d5564059f36ed16a8967c37e24w", 201 | userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Firefox/91.0', 202 | runScripts: "dangerously", 203 | resources: resourceLoader, 204 | // cookieJar, 205 | includeNodeLocations: true, 206 | storageQuota: 10000000, 207 | pretendToBeVisual: true, 208 | virtualConsole 209 | }; 210 | dom = new JSDOM(``, options); 211 | await $.wait(1000) 212 | try { 213 | feSt = 's' 214 | jab = new dom.window.JAB({ 215 | bizId: 'jdjiabao', 216 | initCaptcha: false 217 | }) 218 | return jab.getToken() 219 | } catch (e) { 220 | return undefined 221 | } 222 | } 223 | 224 | function totalBean() { 225 | return new Promise(async resolve => { 226 | const options = { 227 | "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`, 228 | "headers": { 229 | "Accept": "application/json,text/plain, */*", 230 | "Content-Type": "application/x-www-form-urlencoded", 231 | "Accept-Encoding": "gzip, deflate, br", 232 | "Accept-Language": "zh-cn", 233 | "Connection": "keep-alive", 234 | "Cookie": $.cookie, 235 | "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2", 236 | "User-Agent": "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1" 237 | }, 238 | "timeout": 10000, 239 | } 240 | $.post(options, (err, resp, data) => { 241 | try { 242 | if (err) { 243 | console.log(`${JSON.stringify(err)}`) 244 | console.log(`${$.name} API请求失败,请检查网路重试`) 245 | } else { 246 | if (data) { 247 | data = JSON.parse(data); 248 | if (data['retcode'] === 13) { 249 | $.isLogin = false; //cookie过期 250 | return 251 | } 252 | if (data['retcode'] === 0) { 253 | $.nickName = (data['base'] && data['base'].nickname) || $.UserName; 254 | } else { 255 | $.nickName = $.UserName 256 | } 257 | } else { 258 | console.log(`X东服务器返回空数据`) 259 | } 260 | } 261 | } catch (e) { 262 | $.logErr(e, resp) 263 | } finally { 264 | resolve(); 265 | } 266 | }) 267 | }) 268 | } 269 | 270 | function taskurl(functionid, body) { 271 | const urlStr = `${unifiedGatewayName}/api?appid=siteppM&functionId=${functionid}&forcebot=${$.HyperParam.forcebot}&t=${new Date().getTime()}` 272 | return { 273 | "url": urlStr, 274 | "headers": { 275 | 'Host': 'api.m.jd.com', 276 | 'Accept': '*/*', 277 | 'Accept-Language': 'zh-cn', 278 | 'Accept-Encoding': 'gzip, deflate, br', 279 | 'Content-Type': 'application/x-www-form-urlencoded', 280 | 'Origin': 'https://msitepp-fm.jd.com', 281 | 'Connection': 'keep-alive', 282 | 'Referer': 'https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu', 283 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", 284 | "Cookie": $.cookie 285 | }, 286 | "body": body ? `body=${encodeURIComponent(JSON.stringify(body))}` : undefined 287 | } 288 | } 289 | 290 | async function showMsg() { 291 | const message = `X东账号${$.index} ${$.nickName || $.UserName}\n🎉 本次价格保护金额:${$.refundtotalamount}💰` 292 | console.log(message) 293 | if ($.refundtotalamount) { 294 | $.msg($.name, ``, message, { 295 | "open-url": "https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu" 296 | }); 297 | await $.notify.sendNotify($.name, message) 298 | } 299 | } 300 | 301 | // 来自 @chavyleung 大佬 302 | // https://raw.githubusercontent.com/chavyleung/scripts/master/Env.js 303 | function Env(name, opts) { 304 | class Http { 305 | constructor(env) { 306 | this.env = env 307 | } 308 | 309 | send(opts, method = 'GET') { 310 | opts = typeof opts === 'string' ? { 311 | url: opts 312 | } : opts 313 | let sender = this.get 314 | if (method === 'POST') { 315 | sender = this.post 316 | } 317 | return new Promise((resolve, reject) => { 318 | sender.call(this, opts, (err, resp, body) => { 319 | if (err) reject(err) 320 | else resolve(resp) 321 | }) 322 | }) 323 | } 324 | 325 | get(opts) { 326 | return this.send.call(this.env, opts) 327 | } 328 | 329 | post(opts) { 330 | return this.send.call(this.env, opts, 'POST') 331 | } 332 | } 333 | 334 | return new (class { 335 | constructor(name, opts) { 336 | this.name = name 337 | this.http = new Http(this) 338 | this.data = null 339 | this.dataFile = 'box.dat' 340 | this.logs = [] 341 | this.isMute = false 342 | this.isNeedRewrite = false 343 | this.logSeparator = '\n' 344 | this.startTime = new Date().getTime() 345 | Object.assign(this, opts) 346 | this.log('', `🔔${this.name}, 开始!`) 347 | } 348 | 349 | isNode() { 350 | return 'undefined' !== typeof module && !!module.exports 351 | } 352 | 353 | isQuanX() { 354 | return 'undefined' !== typeof $task 355 | } 356 | 357 | isSurge() { 358 | return 'undefined' !== typeof $httpClient && 'undefined' === typeof $loon 359 | } 360 | 361 | isLoon() { 362 | return 'undefined' !== typeof $loon 363 | } 364 | 365 | toObj(str, defaultValue = null) { 366 | try { 367 | return JSON.parse(str) 368 | } catch { 369 | return defaultValue 370 | } 371 | } 372 | 373 | toStr(obj, defaultValue = null) { 374 | try { 375 | return JSON.stringify(obj) 376 | } catch { 377 | return defaultValue 378 | } 379 | } 380 | 381 | getjson(key, defaultValue) { 382 | let json = defaultValue 383 | const val = this.getdata(key) 384 | if (val) { 385 | try { 386 | json = JSON.parse(this.getdata(key)) 387 | } catch { } 388 | } 389 | return json 390 | } 391 | 392 | setjson(val, key) { 393 | try { 394 | return this.setdata(JSON.stringify(val), key) 395 | } catch { 396 | return false 397 | } 398 | } 399 | 400 | getScript(url) { 401 | return new Promise((resolve) => { 402 | this.get({ 403 | url 404 | }, (err, resp, body) => resolve(body)) 405 | }) 406 | } 407 | 408 | runScript(script, runOpts) { 409 | return new Promise((resolve) => { 410 | let httpapi = this.getdata('@chavy_boxjs_userCfgs.httpapi') 411 | httpapi = httpapi ? httpapi.replace(/\n/g, '').trim() : httpapi 412 | let httpapi_timeout = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout') 413 | httpapi_timeout = httpapi_timeout ? httpapi_timeout * 1 : 20 414 | httpapi_timeout = runOpts && runOpts.timeout ? runOpts.timeout : httpapi_timeout 415 | const [key, addr] = httpapi.split('@') 416 | const opts = { 417 | url: `http://${addr}/v1/scripting/evaluate`, 418 | body: { 419 | script_text: script, 420 | mock_type: 'cron', 421 | timeout: httpapi_timeout 422 | }, 423 | headers: { 424 | 'X-Key': key, 425 | 'Accept': '*/*' 426 | } 427 | } 428 | this.post(opts, (err, resp, body) => resolve(body)) 429 | }).catch((e) => this.logErr(e)) 430 | } 431 | 432 | loaddata() { 433 | if (this.isNode()) { 434 | this.fs = this.fs ? this.fs : require('fs') 435 | this.path = this.path ? this.path : require('path') 436 | const curDirDataFilePath = this.path.resolve(this.dataFile) 437 | const rootDirDataFilePath = this.path.resolve(process.cwd(), this.dataFile) 438 | const isCurDirDataFile = this.fs.existsSync(curDirDataFilePath) 439 | const isRootDirDataFile = !isCurDirDataFile && this.fs.existsSync(rootDirDataFilePath) 440 | if (isCurDirDataFile || isRootDirDataFile) { 441 | const datPath = isCurDirDataFile ? curDirDataFilePath : rootDirDataFilePath 442 | try { 443 | return JSON.parse(this.fs.readFileSync(datPath)) 444 | } catch (e) { 445 | return {} 446 | } 447 | } else return {} 448 | } else return {} 449 | } 450 | 451 | writedata() { 452 | if (this.isNode()) { 453 | this.fs = this.fs ? this.fs : require('fs') 454 | this.path = this.path ? this.path : require('path') 455 | const curDirDataFilePath = this.path.resolve(this.dataFile) 456 | const rootDirDataFilePath = this.path.resolve(process.cwd(), this.dataFile) 457 | const isCurDirDataFile = this.fs.existsSync(curDirDataFilePath) 458 | const isRootDirDataFile = !isCurDirDataFile && this.fs.existsSync(rootDirDataFilePath) 459 | const jsondata = JSON.stringify(this.data) 460 | if (isCurDirDataFile) { 461 | this.fs.writeFileSync(curDirDataFilePath, jsondata) 462 | } else if (isRootDirDataFile) { 463 | this.fs.writeFileSync(rootDirDataFilePath, jsondata) 464 | } else { 465 | this.fs.writeFileSync(curDirDataFilePath, jsondata) 466 | } 467 | } 468 | } 469 | 470 | lodash_get(source, path, defaultValue = undefined) { 471 | const paths = path.replace(/\[(\d+)\]/g, '.$1').split('.') 472 | let result = source 473 | for (const p of paths) { 474 | result = Object(result)[p] 475 | if (result === undefined) { 476 | return defaultValue 477 | } 478 | } 479 | return result 480 | } 481 | 482 | lodash_set(obj, path, value) { 483 | if (Object(obj) !== obj) return obj 484 | if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || [] 485 | path 486 | .slice(0, -1) 487 | .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ 488 | path[path.length - 1] 489 | ] = value 490 | return obj 491 | } 492 | 493 | getdata(key) { 494 | let val = this.getval(key) 495 | // 如果以 @ 496 | if (/^@/.test(key)) { 497 | const [, objkey, paths] = /^@(.*?)\.(.*?)$/.exec(key) 498 | const objval = objkey ? this.getval(objkey) : '' 499 | if (objval) { 500 | try { 501 | const objedval = JSON.parse(objval) 502 | val = objedval ? this.lodash_get(objedval, paths, '') : val 503 | } catch (e) { 504 | val = '' 505 | } 506 | } 507 | } 508 | return val 509 | } 510 | 511 | setdata(val, key) { 512 | let issuc = false 513 | if (/^@/.test(key)) { 514 | const [, objkey, paths] = /^@(.*?)\.(.*?)$/.exec(key) 515 | const objdat = this.getval(objkey) 516 | const objval = objkey ? (objdat === 'null' ? null : objdat || '{}') : '{}' 517 | try { 518 | const objedval = JSON.parse(objval) 519 | this.lodash_set(objedval, paths, val) 520 | issuc = this.setval(JSON.stringify(objedval), objkey) 521 | } catch (e) { 522 | const objedval = {} 523 | this.lodash_set(objedval, paths, val) 524 | issuc = this.setval(JSON.stringify(objedval), objkey) 525 | } 526 | } else { 527 | issuc = this.setval(val, key) 528 | } 529 | return issuc 530 | } 531 | 532 | getval(key) { 533 | if (this.isSurge() || this.isLoon()) { 534 | return $persistentStore.read(key) 535 | } else if (this.isQuanX()) { 536 | return $prefs.valueForKey(key) 537 | } else if (this.isNode()) { 538 | this.data = this.loaddata() 539 | return this.data[key] 540 | } else { 541 | return (this.data && this.data[key]) || null 542 | } 543 | } 544 | 545 | setval(val, key) { 546 | if (this.isSurge() || this.isLoon()) { 547 | return $persistentStore.write(val, key) 548 | } else if (this.isQuanX()) { 549 | return $prefs.setValueForKey(val, key) 550 | } else if (this.isNode()) { 551 | this.data = this.loaddata() 552 | this.data[key] = val 553 | this.writedata() 554 | return true 555 | } else { 556 | return (this.data && this.data[key]) || null 557 | } 558 | } 559 | 560 | initGotEnv(opts) { 561 | this.got = this.got ? this.got : require('got') 562 | this.cktough = this.cktough ? this.cktough : require('tough-cookie') 563 | this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar() 564 | if (opts) { 565 | opts.headers = opts.headers ? opts.headers : {} 566 | if (undefined === opts.headers.Cookie && undefined === opts.cookieJar) { 567 | opts.cookieJar = this.ckjar 568 | } 569 | } 570 | } 571 | 572 | get(opts, callback = () => { }) { 573 | if (opts.headers) { 574 | delete opts.headers['Content-Type'] 575 | delete opts.headers['Content-Length'] 576 | } 577 | if (this.isSurge() || this.isLoon()) { 578 | if (this.isSurge() && this.isNeedRewrite) { 579 | opts.headers = opts.headers || {} 580 | Object.assign(opts.headers, { 581 | 'X-Surge-Skip-Scripting': false 582 | }) 583 | } 584 | $httpClient.get(opts, (err, resp, body) => { 585 | if (!err && resp) { 586 | resp.body = body 587 | resp.statusCode = resp.status 588 | } 589 | callback(err, resp, body) 590 | }) 591 | } else if (this.isQuanX()) { 592 | if (this.isNeedRewrite) { 593 | opts.opts = opts.opts || {} 594 | Object.assign(opts.opts, { 595 | hints: false 596 | }) 597 | } 598 | $task.fetch(opts).then( 599 | (resp) => { 600 | const { 601 | statusCode: status, 602 | statusCode, 603 | headers, 604 | body 605 | } = resp 606 | callback(null, { 607 | status, 608 | statusCode, 609 | headers, 610 | body 611 | }, body) 612 | }, 613 | (err) => callback(err) 614 | ) 615 | } else if (this.isNode()) { 616 | this.initGotEnv(opts) 617 | this.got(opts) 618 | .on('redirect', (resp, nextOpts) => { 619 | try { 620 | if (resp.headers['set-cookie']) { 621 | const ck = resp.headers['set-cookie'].map(this.cktough.Cookie.parse).toString() 622 | if (ck) { 623 | this.ckjar.setCookieSync(ck, null) 624 | } 625 | nextOpts.cookieJar = this.ckjar 626 | } 627 | } catch (e) { 628 | this.logErr(e) 629 | } 630 | // this.ckjar.setCookieSync(resp.headers['set-cookie'].map(Cookie.parse).toString()) 631 | }) 632 | .then( 633 | (resp) => { 634 | const { 635 | statusCode: status, 636 | statusCode, 637 | headers, 638 | body 639 | } = resp 640 | callback(null, { 641 | status, 642 | statusCode, 643 | headers, 644 | body 645 | }, body) 646 | }, 647 | (err) => { 648 | const { 649 | message: error, 650 | response: resp 651 | } = err 652 | callback(error, resp, resp && resp.body) 653 | } 654 | ) 655 | } 656 | } 657 | 658 | post(opts, callback = () => { }) { 659 | // 如果指定了请求体, 但没指定`Content-Type`, 则自动生成 660 | if (opts.body && opts.headers && !opts.headers['Content-Type']) { 661 | opts.headers['Content-Type'] = 'application/x-www-form-urlencoded' 662 | } 663 | if (opts.headers) delete opts.headers['Content-Length'] 664 | if (this.isSurge() || this.isLoon()) { 665 | if (this.isSurge() && this.isNeedRewrite) { 666 | opts.headers = opts.headers || {} 667 | Object.assign(opts.headers, { 668 | 'X-Surge-Skip-Scripting': false 669 | }) 670 | } 671 | $httpClient.post(opts, (err, resp, body) => { 672 | if (!err && resp) { 673 | resp.body = body 674 | resp.statusCode = resp.status 675 | } 676 | callback(err, resp, body) 677 | }) 678 | } else if (this.isQuanX()) { 679 | opts.method = 'POST' 680 | if (this.isNeedRewrite) { 681 | opts.opts = opts.opts || {} 682 | Object.assign(opts.opts, { 683 | hints: false 684 | }) 685 | } 686 | $task.fetch(opts).then( 687 | (resp) => { 688 | const { 689 | statusCode: status, 690 | statusCode, 691 | headers, 692 | body 693 | } = resp 694 | callback(null, { 695 | status, 696 | statusCode, 697 | headers, 698 | body 699 | }, body) 700 | }, 701 | (err) => callback(err) 702 | ) 703 | } else if (this.isNode()) { 704 | this.initGotEnv(opts) 705 | const { 706 | url, 707 | ..._opts 708 | } = opts 709 | this.got.post(url, _opts).then( 710 | (resp) => { 711 | const { 712 | statusCode: status, 713 | statusCode, 714 | headers, 715 | body 716 | } = resp 717 | callback(null, { 718 | status, 719 | statusCode, 720 | headers, 721 | body 722 | }, body) 723 | }, 724 | (err) => { 725 | const { 726 | message: error, 727 | response: resp 728 | } = err 729 | callback(error, resp, resp && resp.body) 730 | } 731 | ) 732 | } 733 | } 734 | /** 735 | * 736 | * 示例:$.time('yyyy-MM-dd qq HH:mm:ss.S') 737 | * :$.time('yyyyMMddHHmmssS') 738 | * y:年 M:月 d:日 q:季 H:时 m:分 s:秒 S:毫秒 739 | * 其中y可选0-4位占位符、S可选0-1位占位符,其余可选0-2位占位符 740 | * @param {*} fmt 格式化参数 741 | * 742 | */ 743 | time(fmt) { 744 | let o = { 745 | 'M+': new Date().getMonth() + 1, 746 | 'd+': new Date().getDate(), 747 | 'H+': new Date().getHours(), 748 | 'm+': new Date().getMinutes(), 749 | 's+': new Date().getSeconds(), 750 | 'q+': Math.floor((new Date().getMonth() + 3) / 3), 751 | 'S': new Date().getMilliseconds() 752 | } 753 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (new Date().getFullYear() + '').substr(4 - RegExp.$1.length)) 754 | for (let k in o) 755 | if (new RegExp('(' + k + ')').test(fmt)) 756 | fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)) 757 | return fmt 758 | } 759 | 760 | /** 761 | * 系统通知 762 | * 763 | * > 通知参数: 同时支持 QuanX 和 Loon 两种格式, EnvJs根据运行环境自动转换, Surge 环境不支持多媒体通知 764 | * 765 | * 示例: 766 | * $.msg(title, subt, desc, 'twitter://') 767 | * $.msg(title, subt, desc, { 'open-url': 'twitter://', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' }) 768 | * $.msg(title, subt, desc, { 'open-url': 'https://bing.com', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' }) 769 | * 770 | * @param {*} title 标题 771 | * @param {*} subt 副标题 772 | * @param {*} desc 通知详情 773 | * @param {*} opts 通知参数 774 | * 775 | */ 776 | msg(title = name, subt = '', desc = '', opts) { 777 | const toEnvOpts = (rawopts) => { 778 | if (!rawopts) return rawopts 779 | if (typeof rawopts === 'string') { 780 | if (this.isLoon()) return rawopts 781 | else if (this.isQuanX()) return { 782 | 'open-url': rawopts 783 | } 784 | else if (this.isSurge()) return { 785 | url: rawopts 786 | } 787 | else return undefined 788 | } else if (typeof rawopts === 'object') { 789 | if (this.isLoon()) { 790 | let openUrl = rawopts.openUrl || rawopts.url || rawopts['open-url'] 791 | let mediaUrl = rawopts.mediaUrl || rawopts['media-url'] 792 | return { 793 | openUrl, 794 | mediaUrl 795 | } 796 | } else if (this.isQuanX()) { 797 | let openUrl = rawopts['open-url'] || rawopts.url || rawopts.openUrl 798 | let mediaUrl = rawopts['media-url'] || rawopts.mediaUrl 799 | return { 800 | 'open-url': openUrl, 801 | 'media-url': mediaUrl 802 | } 803 | } else if (this.isSurge()) { 804 | let openUrl = rawopts.url || rawopts.openUrl || rawopts['open-url'] 805 | return { 806 | url: openUrl 807 | } 808 | } 809 | } else { 810 | return undefined 811 | } 812 | } 813 | if (!this.isMute) { 814 | if (this.isSurge() || this.isLoon()) { 815 | $notification.post(title, subt, desc, toEnvOpts(opts)) 816 | } else if (this.isQuanX()) { 817 | $notify(title, subt, desc, toEnvOpts(opts)) 818 | } 819 | } 820 | if (!this.isMuteLog) { 821 | let logs = ['', '==============📣系统通知📣=============='] 822 | logs.push(title) 823 | subt ? logs.push(subt) : '' 824 | desc ? logs.push(desc) : '' 825 | console.log(logs.join('\n')) 826 | this.logs = this.logs.concat(logs) 827 | } 828 | } 829 | 830 | log(...logs) { 831 | if (logs.length > 0) { 832 | this.logs = [...this.logs, ...logs] 833 | } 834 | console.log(logs.join(this.logSeparator)) 835 | } 836 | 837 | logErr(err, msg) { 838 | const isPrintSack = !this.isSurge() && !this.isQuanX() && !this.isLoon() 839 | if (!isPrintSack) { 840 | this.log('', `❗️${this.name}, 错误!`, err) 841 | } else { 842 | this.log('', `❗️${this.name}, 错误!`, err.stack) 843 | } 844 | } 845 | 846 | wait(time) { 847 | return new Promise((resolve) => setTimeout(resolve, time)) 848 | } 849 | 850 | done(val = {}) { 851 | const endTime = new Date().getTime() 852 | const costTime = (endTime - this.startTime) / 1000 853 | this.log('', `🔔${this.name}, 结束! 🕛 ${costTime} 秒`) 854 | this.log() 855 | if (this.isSurge() || this.isQuanX() || this.isLoon()) { 856 | $done(val) 857 | } 858 | } 859 | })(name, opts) 860 | } 861 | -------------------------------------------------------------------------------- /jd/jd_priceProtectRewrite.js: -------------------------------------------------------------------------------- 1 | /* 2 | update 2021/9/19 3 | 4 | 京东价格保护:脚本更新地址 https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtect.js 5 | 脚本兼容: QuantumultX, Node.js 6 | 7 | ==========================Quantumultx========================= 8 | 打开手机客户端,或者浏览器访问 https://msitepp-fm.jd.com/rest/priceprophone/priceProPhoneMenu 9 | 10 | [rewrite_local] 11 | https:\/\/api\.m.jd.com\/api\?appid=siteppM&functionId=siteppM_priceskusPull url script-request-body https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtectRewrite.js 12 | 13 | */ 14 | const $ = new Env('京东价格保护'); 15 | 16 | !(async () => { 17 | if ($request && $request.method == 'POST' && $request.url.match(/siteppM_priceskusPull/)) { 18 | const body = $request.body 19 | let data = JSON.parse(decodeURIComponent(body).slice(5)) 20 | let token = data.token 21 | let old = $.getdata('jd_tokens') 22 | if (token && old) { 23 | if (old.indexOf(token) == -1) { 24 | $.setdata(`${token}@${old}`, 'jd_tokens') 25 | $.msg(`${$.name}`, `写入token成功,当前${$.getdata('jd_tokens').split('@').length}个token`, ``) 26 | } 27 | } 28 | else if (token) { 29 | $.setdata(token, 'jd_tokens') 30 | $.msg(`${$.name}`, `写入首个token成功`, ``) 31 | } 32 | } 33 | })() 34 | .catch((e) => { 35 | }).finally(() => $.done()) 36 | 37 | // 来自 @chavyleung 大佬 38 | // https://raw.githubusercontent.com/chavyleung/scripts/master/Env.js 39 | function Env(name, opts) { 40 | class Http { 41 | constructor(env) { 42 | this.env = env 43 | } 44 | 45 | send(opts, method = 'GET') { 46 | opts = typeof opts === 'string' ? { 47 | url: opts 48 | } : opts 49 | let sender = this.get 50 | if (method === 'POST') { 51 | sender = this.post 52 | } 53 | return new Promise((resolve, reject) => { 54 | sender.call(this, opts, (err, resp, body) => { 55 | if (err) reject(err) 56 | else resolve(resp) 57 | }) 58 | }) 59 | } 60 | 61 | get(opts) { 62 | return this.send.call(this.env, opts) 63 | } 64 | 65 | post(opts) { 66 | return this.send.call(this.env, opts, 'POST') 67 | } 68 | } 69 | 70 | return new (class { 71 | constructor(name, opts) { 72 | this.name = name 73 | this.http = new Http(this) 74 | this.data = null 75 | this.dataFile = 'box.dat' 76 | this.logs = [] 77 | this.isMute = false 78 | this.isNeedRewrite = false 79 | this.logSeparator = '\n' 80 | this.startTime = new Date().getTime() 81 | Object.assign(this, opts) 82 | this.log('', `🔔${this.name}, 开始!`) 83 | } 84 | 85 | isNode() { 86 | return 'undefined' !== typeof module && !!module.exports 87 | } 88 | 89 | isQuanX() { 90 | return 'undefined' !== typeof $task 91 | } 92 | 93 | isSurge() { 94 | return 'undefined' !== typeof $httpClient && 'undefined' === typeof $loon 95 | } 96 | 97 | isLoon() { 98 | return 'undefined' !== typeof $loon 99 | } 100 | 101 | toObj(str, defaultValue = null) { 102 | try { 103 | return JSON.parse(str) 104 | } catch { 105 | return defaultValue 106 | } 107 | } 108 | 109 | toStr(obj, defaultValue = null) { 110 | try { 111 | return JSON.stringify(obj) 112 | } catch { 113 | return defaultValue 114 | } 115 | } 116 | 117 | getjson(key, defaultValue) { 118 | let json = defaultValue 119 | const val = this.getdata(key) 120 | if (val) { 121 | try { 122 | json = JSON.parse(this.getdata(key)) 123 | } catch { } 124 | } 125 | return json 126 | } 127 | 128 | setjson(val, key) { 129 | try { 130 | return this.setdata(JSON.stringify(val), key) 131 | } catch { 132 | return false 133 | } 134 | } 135 | 136 | getScript(url) { 137 | return new Promise((resolve) => { 138 | this.get({ 139 | url 140 | }, (err, resp, body) => resolve(body)) 141 | }) 142 | } 143 | 144 | runScript(script, runOpts) { 145 | return new Promise((resolve) => { 146 | let httpapi = this.getdata('@chavy_boxjs_userCfgs.httpapi') 147 | httpapi = httpapi ? httpapi.replace(/\n/g, '').trim() : httpapi 148 | let httpapi_timeout = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout') 149 | httpapi_timeout = httpapi_timeout ? httpapi_timeout * 1 : 20 150 | httpapi_timeout = runOpts && runOpts.timeout ? runOpts.timeout : httpapi_timeout 151 | const [key, addr] = httpapi.split('@') 152 | const opts = { 153 | url: `http://${addr}/v1/scripting/evaluate`, 154 | body: { 155 | script_text: script, 156 | mock_type: 'cron', 157 | timeout: httpapi_timeout 158 | }, 159 | headers: { 160 | 'X-Key': key, 161 | 'Accept': '*/*' 162 | } 163 | } 164 | this.post(opts, (err, resp, body) => resolve(body)) 165 | }).catch((e) => this.logErr(e)) 166 | } 167 | 168 | loaddata() { 169 | if (this.isNode()) { 170 | this.fs = this.fs ? this.fs : require('fs') 171 | this.path = this.path ? this.path : require('path') 172 | const curDirDataFilePath = this.path.resolve(this.dataFile) 173 | const rootDirDataFilePath = this.path.resolve(process.cwd(), this.dataFile) 174 | const isCurDirDataFile = this.fs.existsSync(curDirDataFilePath) 175 | const isRootDirDataFile = !isCurDirDataFile && this.fs.existsSync(rootDirDataFilePath) 176 | if (isCurDirDataFile || isRootDirDataFile) { 177 | const datPath = isCurDirDataFile ? curDirDataFilePath : rootDirDataFilePath 178 | try { 179 | return JSON.parse(this.fs.readFileSync(datPath)) 180 | } catch (e) { 181 | return {} 182 | } 183 | } else return {} 184 | } else return {} 185 | } 186 | 187 | writedata() { 188 | if (this.isNode()) { 189 | this.fs = this.fs ? this.fs : require('fs') 190 | this.path = this.path ? this.path : require('path') 191 | const curDirDataFilePath = this.path.resolve(this.dataFile) 192 | const rootDirDataFilePath = this.path.resolve(process.cwd(), this.dataFile) 193 | const isCurDirDataFile = this.fs.existsSync(curDirDataFilePath) 194 | const isRootDirDataFile = !isCurDirDataFile && this.fs.existsSync(rootDirDataFilePath) 195 | const jsondata = JSON.stringify(this.data) 196 | if (isCurDirDataFile) { 197 | this.fs.writeFileSync(curDirDataFilePath, jsondata) 198 | } else if (isRootDirDataFile) { 199 | this.fs.writeFileSync(rootDirDataFilePath, jsondata) 200 | } else { 201 | this.fs.writeFileSync(curDirDataFilePath, jsondata) 202 | } 203 | } 204 | } 205 | 206 | lodash_get(source, path, defaultValue = undefined) { 207 | const paths = path.replace(/\[(\d+)\]/g, '.$1').split('.') 208 | let result = source 209 | for (const p of paths) { 210 | result = Object(result)[p] 211 | if (result === undefined) { 212 | return defaultValue 213 | } 214 | } 215 | return result 216 | } 217 | 218 | lodash_set(obj, path, value) { 219 | if (Object(obj) !== obj) return obj 220 | if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || [] 221 | path 222 | .slice(0, -1) 223 | .reduce((a, c, i) => (Object(a[c]) === a[c] ? a[c] : (a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {})), obj)[ 224 | path[path.length - 1] 225 | ] = value 226 | return obj 227 | } 228 | 229 | getdata(key) { 230 | let val = this.getval(key) 231 | // 如果以 @ 232 | if (/^@/.test(key)) { 233 | const [, objkey, paths] = /^@(.*?)\.(.*?)$/.exec(key) 234 | const objval = objkey ? this.getval(objkey) : '' 235 | if (objval) { 236 | try { 237 | const objedval = JSON.parse(objval) 238 | val = objedval ? this.lodash_get(objedval, paths, '') : val 239 | } catch (e) { 240 | val = '' 241 | } 242 | } 243 | } 244 | return val 245 | } 246 | 247 | setdata(val, key) { 248 | let issuc = false 249 | if (/^@/.test(key)) { 250 | const [, objkey, paths] = /^@(.*?)\.(.*?)$/.exec(key) 251 | const objdat = this.getval(objkey) 252 | const objval = objkey ? (objdat === 'null' ? null : objdat || '{}') : '{}' 253 | try { 254 | const objedval = JSON.parse(objval) 255 | this.lodash_set(objedval, paths, val) 256 | issuc = this.setval(JSON.stringify(objedval), objkey) 257 | } catch (e) { 258 | const objedval = {} 259 | this.lodash_set(objedval, paths, val) 260 | issuc = this.setval(JSON.stringify(objedval), objkey) 261 | } 262 | } else { 263 | issuc = this.setval(val, key) 264 | } 265 | return issuc 266 | } 267 | 268 | getval(key) { 269 | if (this.isSurge() || this.isLoon()) { 270 | return $persistentStore.read(key) 271 | } else if (this.isQuanX()) { 272 | return $prefs.valueForKey(key) 273 | } else if (this.isNode()) { 274 | this.data = this.loaddata() 275 | return this.data[key] 276 | } else { 277 | return (this.data && this.data[key]) || null 278 | } 279 | } 280 | 281 | setval(val, key) { 282 | if (this.isSurge() || this.isLoon()) { 283 | return $persistentStore.write(val, key) 284 | } else if (this.isQuanX()) { 285 | return $prefs.setValueForKey(val, key) 286 | } else if (this.isNode()) { 287 | this.data = this.loaddata() 288 | this.data[key] = val 289 | this.writedata() 290 | return true 291 | } else { 292 | return (this.data && this.data[key]) || null 293 | } 294 | } 295 | 296 | initGotEnv(opts) { 297 | this.got = this.got ? this.got : require('got') 298 | this.cktough = this.cktough ? this.cktough : require('tough-cookie') 299 | this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar() 300 | if (opts) { 301 | opts.headers = opts.headers ? opts.headers : {} 302 | if (undefined === opts.headers.Cookie && undefined === opts.cookieJar) { 303 | opts.cookieJar = this.ckjar 304 | } 305 | } 306 | } 307 | 308 | get(opts, callback = () => { }) { 309 | if (opts.headers) { 310 | delete opts.headers['Content-Type'] 311 | delete opts.headers['Content-Length'] 312 | } 313 | if (this.isSurge() || this.isLoon()) { 314 | if (this.isSurge() && this.isNeedRewrite) { 315 | opts.headers = opts.headers || {} 316 | Object.assign(opts.headers, { 317 | 'X-Surge-Skip-Scripting': false 318 | }) 319 | } 320 | $httpClient.get(opts, (err, resp, body) => { 321 | if (!err && resp) { 322 | resp.body = body 323 | resp.statusCode = resp.status 324 | } 325 | callback(err, resp, body) 326 | }) 327 | } else if (this.isQuanX()) { 328 | if (this.isNeedRewrite) { 329 | opts.opts = opts.opts || {} 330 | Object.assign(opts.opts, { 331 | hints: false 332 | }) 333 | } 334 | $task.fetch(opts).then( 335 | (resp) => { 336 | const { 337 | statusCode: status, 338 | statusCode, 339 | headers, 340 | body 341 | } = resp 342 | callback(null, { 343 | status, 344 | statusCode, 345 | headers, 346 | body 347 | }, body) 348 | }, 349 | (err) => callback(err) 350 | ) 351 | } else if (this.isNode()) { 352 | this.initGotEnv(opts) 353 | this.got(opts) 354 | .on('redirect', (resp, nextOpts) => { 355 | try { 356 | if (resp.headers['set-cookie']) { 357 | const ck = resp.headers['set-cookie'].map(this.cktough.Cookie.parse).toString() 358 | if (ck) { 359 | this.ckjar.setCookieSync(ck, null) 360 | } 361 | nextOpts.cookieJar = this.ckjar 362 | } 363 | } catch (e) { 364 | this.logErr(e) 365 | } 366 | // this.ckjar.setCookieSync(resp.headers['set-cookie'].map(Cookie.parse).toString()) 367 | }) 368 | .then( 369 | (resp) => { 370 | const { 371 | statusCode: status, 372 | statusCode, 373 | headers, 374 | body 375 | } = resp 376 | callback(null, { 377 | status, 378 | statusCode, 379 | headers, 380 | body 381 | }, body) 382 | }, 383 | (err) => { 384 | const { 385 | message: error, 386 | response: resp 387 | } = err 388 | callback(error, resp, resp && resp.body) 389 | } 390 | ) 391 | } 392 | } 393 | 394 | post(opts, callback = () => { }) { 395 | // 如果指定了请求体, 但没指定`Content-Type`, 则自动生成 396 | if (opts.body && opts.headers && !opts.headers['Content-Type']) { 397 | opts.headers['Content-Type'] = 'application/x-www-form-urlencoded' 398 | } 399 | if (opts.headers) delete opts.headers['Content-Length'] 400 | if (this.isSurge() || this.isLoon()) { 401 | if (this.isSurge() && this.isNeedRewrite) { 402 | opts.headers = opts.headers || {} 403 | Object.assign(opts.headers, { 404 | 'X-Surge-Skip-Scripting': false 405 | }) 406 | } 407 | $httpClient.post(opts, (err, resp, body) => { 408 | if (!err && resp) { 409 | resp.body = body 410 | resp.statusCode = resp.status 411 | } 412 | callback(err, resp, body) 413 | }) 414 | } else if (this.isQuanX()) { 415 | opts.method = 'POST' 416 | if (this.isNeedRewrite) { 417 | opts.opts = opts.opts || {} 418 | Object.assign(opts.opts, { 419 | hints: false 420 | }) 421 | } 422 | $task.fetch(opts).then( 423 | (resp) => { 424 | const { 425 | statusCode: status, 426 | statusCode, 427 | headers, 428 | body 429 | } = resp 430 | callback(null, { 431 | status, 432 | statusCode, 433 | headers, 434 | body 435 | }, body) 436 | }, 437 | (err) => callback(err) 438 | ) 439 | } else if (this.isNode()) { 440 | this.initGotEnv(opts) 441 | const { 442 | url, 443 | ..._opts 444 | } = opts 445 | this.got.post(url, _opts).then( 446 | (resp) => { 447 | const { 448 | statusCode: status, 449 | statusCode, 450 | headers, 451 | body 452 | } = resp 453 | callback(null, { 454 | status, 455 | statusCode, 456 | headers, 457 | body 458 | }, body) 459 | }, 460 | (err) => { 461 | const { 462 | message: error, 463 | response: resp 464 | } = err 465 | callback(error, resp, resp && resp.body) 466 | } 467 | ) 468 | } 469 | } 470 | /** 471 | * 472 | * 示例:$.time('yyyy-MM-dd qq HH:mm:ss.S') 473 | * :$.time('yyyyMMddHHmmssS') 474 | * y:年 M:月 d:日 q:季 H:时 m:分 s:秒 S:毫秒 475 | * 其中y可选0-4位占位符、S可选0-1位占位符,其余可选0-2位占位符 476 | * @param {*} fmt 格式化参数 477 | * 478 | */ 479 | time(fmt) { 480 | let o = { 481 | 'M+': new Date().getMonth() + 1, 482 | 'd+': new Date().getDate(), 483 | 'H+': new Date().getHours(), 484 | 'm+': new Date().getMinutes(), 485 | 's+': new Date().getSeconds(), 486 | 'q+': Math.floor((new Date().getMonth() + 3) / 3), 487 | 'S': new Date().getMilliseconds() 488 | } 489 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (new Date().getFullYear() + '').substr(4 - RegExp.$1.length)) 490 | for (let k in o) 491 | if (new RegExp('(' + k + ')').test(fmt)) 492 | fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)) 493 | return fmt 494 | } 495 | 496 | /** 497 | * 系统通知 498 | * 499 | * > 通知参数: 同时支持 QuanX 和 Loon 两种格式, EnvJs根据运行环境自动转换, Surge 环境不支持多媒体通知 500 | * 501 | * 示例: 502 | * $.msg(title, subt, desc, 'twitter://') 503 | * $.msg(title, subt, desc, { 'open-url': 'twitter://', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' }) 504 | * $.msg(title, subt, desc, { 'open-url': 'https://bing.com', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' }) 505 | * 506 | * @param {*} title 标题 507 | * @param {*} subt 副标题 508 | * @param {*} desc 通知详情 509 | * @param {*} opts 通知参数 510 | * 511 | */ 512 | msg(title = name, subt = '', desc = '', opts) { 513 | const toEnvOpts = (rawopts) => { 514 | if (!rawopts) return rawopts 515 | if (typeof rawopts === 'string') { 516 | if (this.isLoon()) return rawopts 517 | else if (this.isQuanX()) return { 518 | 'open-url': rawopts 519 | } 520 | else if (this.isSurge()) return { 521 | url: rawopts 522 | } 523 | else return undefined 524 | } else if (typeof rawopts === 'object') { 525 | if (this.isLoon()) { 526 | let openUrl = rawopts.openUrl || rawopts.url || rawopts['open-url'] 527 | let mediaUrl = rawopts.mediaUrl || rawopts['media-url'] 528 | return { 529 | openUrl, 530 | mediaUrl 531 | } 532 | } else if (this.isQuanX()) { 533 | let openUrl = rawopts['open-url'] || rawopts.url || rawopts.openUrl 534 | let mediaUrl = rawopts['media-url'] || rawopts.mediaUrl 535 | return { 536 | 'open-url': openUrl, 537 | 'media-url': mediaUrl 538 | } 539 | } else if (this.isSurge()) { 540 | let openUrl = rawopts.url || rawopts.openUrl || rawopts['open-url'] 541 | return { 542 | url: openUrl 543 | } 544 | } 545 | } else { 546 | return undefined 547 | } 548 | } 549 | if (!this.isMute) { 550 | if (this.isSurge() || this.isLoon()) { 551 | $notification.post(title, subt, desc, toEnvOpts(opts)) 552 | } else if (this.isQuanX()) { 553 | $notify(title, subt, desc, toEnvOpts(opts)) 554 | } 555 | } 556 | if (!this.isMuteLog) { 557 | let logs = ['', '==============📣系统通知📣=============='] 558 | logs.push(title) 559 | subt ? logs.push(subt) : '' 560 | desc ? logs.push(desc) : '' 561 | console.log(logs.join('\n')) 562 | this.logs = this.logs.concat(logs) 563 | } 564 | } 565 | 566 | log(...logs) { 567 | if (logs.length > 0) { 568 | this.logs = [...this.logs, ...logs] 569 | } 570 | console.log(logs.join(this.logSeparator)) 571 | } 572 | 573 | logErr(err, msg) { 574 | const isPrintSack = !this.isSurge() && !this.isQuanX() && !this.isLoon() 575 | if (!isPrintSack) { 576 | this.log('', `❗️${this.name}, 错误!`, err) 577 | } else { 578 | this.log('', `❗️${this.name}, 错误!`, err.stack) 579 | } 580 | } 581 | 582 | wait(time) { 583 | return new Promise((resolve) => setTimeout(resolve, time)) 584 | } 585 | 586 | done(val = {}) { 587 | const endTime = new Date().getTime() 588 | const costTime = (endTime - this.startTime) / 1000 589 | this.log('', `🔔${this.name}, 结束! 🕛 ${costTime} 秒`) 590 | this.log() 591 | if (this.isSurge() || this.isQuanX() || this.isLoon()) { 592 | $done(val) 593 | } 594 | } 595 | })(name, opts) 596 | } 597 | -------------------------------------------------------------------------------- /jd/sendNotify.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: lxk0301 https://gitee.com/lxk0301 3 | * @Date: 2020-08-19 16:12:40 4 | * @Last Modified by: lxk0301 5 | * @Last Modified time: 2021-3-29 11:52:54 6 | */ 7 | const querystring = require("querystring"); 8 | const $ = new Env(); 9 | // =======================================微信server酱通知设置区域=========================================== 10 | //此处填你申请的SCKEY. 11 | //(环境变量名 PUSH_KEY) 12 | let SCKEY = ''; 13 | 14 | // =======================================Bark App通知设置区域=========================================== 15 | //此处填你BarkAPP的信息(IP/设备码,例如:https://api.day.app/XXXXXXXX) 16 | let BARK_PUSH = ''; 17 | //BARK app推送铃声,铃声列表去APP查看复制填写 18 | let BARK_SOUND = ''; 19 | 20 | 21 | // =======================================telegram机器人通知设置区域=========================================== 22 | //此处填你telegram bot 的Token,telegram机器人通知推送必填项.例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw 23 | //(环境变量名 TG_BOT_TOKEN) 24 | let TG_BOT_TOKEN = ''; 25 | //此处填你接收通知消息的telegram用户的id,telegram机器人通知推送必填项.例如:129xxx206 26 | //(环境变量名 TG_USER_ID) 27 | let TG_USER_ID = ''; 28 | //tg推送HTTP代理设置(不懂可忽略,telegram机器人通知推送功能中非必填) 29 | let TG_PROXY_HOST = '';//例如:127.0.0.1(环境变量名:TG_PROXY_HOST) 30 | let TG_PROXY_PORT = '';//例如:1080(环境变量名:TG_PROXY_PORT) 31 | let TG_PROXY_AUTH = '';//tg代理配置认证参数 32 | //Telegram api自建的反向代理地址(不懂可忽略,telegram机器人通知推送功能中非必填),默认tg官方api(环境变量名:TG_API_HOST) 33 | let TG_API_HOST = 'api.telegram.org' 34 | // =======================================钉钉机器人通知设置区域=========================================== 35 | //此处填你钉钉 bot 的webhook,例如:5a544165465465645d0f31dca676e7bd07415asdasd 36 | //(环境变量名 DD_BOT_TOKEN) 37 | let DD_BOT_TOKEN = ''; 38 | //密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 39 | let DD_BOT_SECRET = ''; 40 | 41 | // =======================================企业微信机器人通知设置区域=========================================== 42 | //此处填你企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa 43 | //(环境变量名 QYWX_KEY) 44 | let QYWX_KEY = ''; 45 | 46 | // =======================================企业微信应用消息通知设置区域=========================================== 47 | /* 48 | 此处填你企业微信应用消息的值(详见文档 https://work.weixin.qq.com/api/doc/90000/90135/90236) 49 | 环境变量名 QYWX_AM依次填入 corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 50 | 注意用,号隔开(英文输入法的逗号),例如:wwcff56746d9adwers,B-791548lnzXBE6_BWfxdf3kSTMJr9vFEPKAbh6WERQ,mingcheng,1000001,2COXgjH2UIfERF2zxrtUOKgQ9XklUqMdGSWLBoW_lSDAdafat 51 | 可选推送消息类型(推荐使用图文消息(mpnews)): 52 | - 文本卡片消息: 0 (数字零) 53 | - 文本消息: 1 (数字一) 54 | - 图文消息(mpnews): 素材库图片id, 可查看此教程(http://note.youdao.com/s/HMiudGkb)或者(https://note.youdao.com/ynoteshare1/index.html?id=1a0c8aff284ad28cbd011b29b3ad0191&type=note) 55 | */ 56 | let QYWX_AM = ''; 57 | 58 | // =======================================iGot聚合推送通知设置区域=========================================== 59 | //此处填您iGot的信息(推送key,例如:https://push.hellyw.com/XXXXXXXX) 60 | let IGOT_PUSH_KEY = ''; 61 | 62 | // =======================================push+设置区域======================================= 63 | //官方文档:http://www.pushplus.plus/ 64 | //PUSH_PLUS_TOKEN:微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送 65 | //PUSH_PLUS_USER: 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送) 66 | let PUSH_PLUS_TOKEN = ''; 67 | let PUSH_PLUS_USER = ''; 68 | 69 | //==========================云端环境变量的判断与接收========================= 70 | if (process.env.PUSH_KEY) { 71 | SCKEY = process.env.PUSH_KEY; 72 | } 73 | 74 | if (process.env.QQ_SKEY) { 75 | QQ_SKEY = process.env.QQ_SKEY; 76 | } 77 | 78 | if (process.env.QQ_MODE) { 79 | QQ_MODE = process.env.QQ_MODE; 80 | } 81 | 82 | 83 | if (process.env.BARK_PUSH) { 84 | if(process.env.BARK_PUSH.indexOf('https') > -1 || process.env.BARK_PUSH.indexOf('http') > -1) { 85 | //兼容BARK自建用户 86 | BARK_PUSH = process.env.BARK_PUSH 87 | } else { 88 | BARK_PUSH = `https://api.day.app/${process.env.BARK_PUSH}` 89 | } 90 | if (process.env.BARK_SOUND) { 91 | BARK_SOUND = process.env.BARK_SOUND 92 | } 93 | } else { 94 | if(BARK_PUSH && BARK_PUSH.indexOf('https') === -1 && BARK_PUSH.indexOf('http') === -1) { 95 | //兼容BARK本地用户只填写设备码的情况 96 | BARK_PUSH = `https://api.day.app/${BARK_PUSH}` 97 | } 98 | } 99 | if (process.env.TG_BOT_TOKEN) { 100 | TG_BOT_TOKEN = process.env.TG_BOT_TOKEN; 101 | } 102 | if (process.env.TG_USER_ID) { 103 | TG_USER_ID = process.env.TG_USER_ID; 104 | } 105 | if (process.env.TG_PROXY_AUTH) TG_PROXY_AUTH = process.env.TG_PROXY_AUTH; 106 | if (process.env.TG_PROXY_HOST) TG_PROXY_HOST = process.env.TG_PROXY_HOST; 107 | if (process.env.TG_PROXY_PORT) TG_PROXY_PORT = process.env.TG_PROXY_PORT; 108 | if (process.env.TG_API_HOST) TG_API_HOST = process.env.TG_API_HOST; 109 | 110 | if (process.env.DD_BOT_TOKEN) { 111 | DD_BOT_TOKEN = process.env.DD_BOT_TOKEN; 112 | if (process.env.DD_BOT_SECRET) { 113 | DD_BOT_SECRET = process.env.DD_BOT_SECRET; 114 | } 115 | } 116 | 117 | if (process.env.QYWX_KEY) { 118 | QYWX_KEY = process.env.QYWX_KEY; 119 | } 120 | 121 | if (process.env.QYWX_AM) { 122 | QYWX_AM = process.env.QYWX_AM; 123 | } 124 | 125 | if (process.env.IGOT_PUSH_KEY) { 126 | IGOT_PUSH_KEY = process.env.IGOT_PUSH_KEY 127 | } 128 | 129 | if (process.env.PUSH_PLUS_TOKEN) { 130 | PUSH_PLUS_TOKEN = process.env.PUSH_PLUS_TOKEN; 131 | } 132 | if (process.env.PUSH_PLUS_USER) { 133 | PUSH_PLUS_USER = process.env.PUSH_PLUS_USER; 134 | } 135 | //==========================云端环境变量的判断与接收========================= 136 | 137 | /** 138 | * 推送通知功能 139 | * @param text 通知头 140 | * @param desp 通知体 141 | * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' } 142 | * @param author 作者仓库等信息 例:`本脚本免费使用 By:https://gitee.com/lxk0301/jd_docker` 143 | * @returns {Promise} 144 | */ 145 | async function sendNotify(text, desp, params = {}, author = '\n\n本脚本免费使用 By:https://gitee.com/lxk0301/jd_docker') { 146 | //提供6种通知 147 | desp += author;//增加作者信息,防止被贩卖等 148 | await Promise.all([ 149 | serverNotify(text, desp),//微信server酱 150 | pushPlusNotify(text, desp)//pushplus(推送加) 151 | ]) 152 | //由于上述两种微信通知需点击进去才能查看到详情,故text(标题内容)携带了账号序号以及昵称信息,方便不点击也可知道是哪个京东哪个活动 153 | text = text.match(/.*?(?=\s?-)/g) ? text.match(/.*?(?=\s?-)/g)[0] : text; 154 | await Promise.all([ 155 | BarkNotify(text, desp, params),//iOS Bark APP 156 | tgBotNotify(text, desp),//telegram 机器人 157 | ddBotNotify(text, desp),//钉钉机器人 158 | qywxBotNotify(text, desp), //企业微信机器人 159 | qywxamNotify(text, desp), //企业微信应用消息推送 160 | iGotNotify(text, desp, params),//iGot 161 | //CoolPush(text, desp)//QQ酷推 162 | ]) 163 | } 164 | 165 | function serverNotify(text, desp, timeout = 2100) { 166 | return new Promise(resolve => { 167 | if (SCKEY) { 168 | //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换 169 | desp = desp.replace(/[\n\r]/g, '\n\n'); 170 | const options = { 171 | url: SCKEY.includes('SCT') ? `https://sctapi.ftqq.com/${SCKEY}.send` : `https://sc.ftqq.com/${SCKEY}.send`, 172 | body: `text=${text}&desp=${desp}`, 173 | headers: { 174 | 'Content-Type': 'application/x-www-form-urlencoded' 175 | }, 176 | timeout: 10000 177 | } 178 | setTimeout(() => { 179 | $.post(options, (err, resp, data) => { 180 | try { 181 | if (err) { 182 | console.log('发送通知调用API失败!!\n') 183 | console.log(err); 184 | } else { 185 | data = JSON.parse(data); 186 | //server酱和Server酱·Turbo版的返回json格式不太一样 187 | if (data.errno === 0 || data.data.errno === 0 ) { 188 | console.log('server酱发送通知消息成功🎉\n') 189 | } else if (data.errno === 1024) { 190 | // 一分钟内发送相同的内容会触发 191 | console.log(`server酱发送通知消息异常: ${data.errmsg}\n`) 192 | } else { 193 | console.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`) 194 | } 195 | } 196 | } catch (e) { 197 | $.logErr(e, resp); 198 | } finally { 199 | resolve(data); 200 | } 201 | }) 202 | }, timeout) 203 | } else { 204 | console.log('\n\n您未提供server酱的SCKEY,取消微信推送消息通知🚫\n'); 205 | resolve() 206 | } 207 | }) 208 | } 209 | 210 | function CoolPush(text, desp) { 211 | return new Promise(resolve => { 212 | if (QQ_SKEY) { 213 | let options = { 214 | url: `https://push.xuthus.cc/${QQ_MODE}/${QQ_SKEY}`, 215 | headers: { 216 | 'Content-Type': 'application/json' 217 | } 218 | } 219 | 220 | // 已知敏感词 221 | text = text.replace(/京豆/g, "豆豆"); 222 | desp = desp.replace(/京豆/g, ""); 223 | desp = desp.replace(/🐶/g, ""); 224 | desp = desp.replace(/红包/g, "H包"); 225 | 226 | switch (QQ_MODE) { 227 | case "email": 228 | options.json = { 229 | "t": text, 230 | "c": desp, 231 | }; 232 | break; 233 | default: 234 | options.body = `${text}\n\n${desp}`; 235 | } 236 | 237 | let pushMode = function(t) { 238 | switch (t){ 239 | case "send": 240 | return "个人"; 241 | case "group": 242 | return "QQ群"; 243 | case "wx": 244 | return "微信"; 245 | case "ww": 246 | return "企业微信"; 247 | case "email": 248 | return "邮件"; 249 | default: 250 | return "未知方式" 251 | } 252 | } 253 | 254 | $.post(options, (err, resp, data) => { 255 | try { 256 | if (err) { 257 | console.log(`发送${pushMode(QQ_MODE)}通知调用API失败!!\n`) 258 | console.log(err); 259 | } else { 260 | data = JSON.parse(data); 261 | if (data.code === 200) { 262 | console.log(`酷推发送${pushMode(QQ_MODE)}通知消息成功🎉\n`) 263 | } else if (data.code === 400) { 264 | console.log(`QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${data.msg}\n`) 265 | } else if (data.code === 503) { 266 | console.log(`QQ酷推出错,${data.message}:${data.data}\n`) 267 | }else{ 268 | console.log(`酷推推送异常: ${JSON.stringify(data)}`); 269 | } 270 | } 271 | } catch (e) { 272 | $.logErr(e, resp); 273 | } finally { 274 | resolve(data); 275 | } 276 | }) 277 | } else { 278 | console.log('您未提供酷推的SKEY,取消QQ推送消息通知🚫\n'); 279 | resolve() 280 | } 281 | }) 282 | } 283 | 284 | function BarkNotify(text, desp, params={}) { 285 | return new Promise(resolve => { 286 | if (BARK_PUSH) { 287 | const options = { 288 | url: `${BARK_PUSH}/${encodeURIComponent(text)}/${encodeURIComponent(desp)}?sound=${BARK_SOUND}&${querystring.stringify(params)}`, 289 | headers: { 290 | 'Content-Type': 'application/x-www-form-urlencoded' 291 | }, 292 | timeout: 10000 293 | } 294 | $.get(options, (err, resp, data) => { 295 | try { 296 | if (err) { 297 | console.log('Bark APP发送通知调用API失败!!\n') 298 | console.log(err); 299 | } else { 300 | data = JSON.parse(data); 301 | if (data.code === 200) { 302 | console.log('Bark APP发送通知消息成功🎉\n') 303 | } else { 304 | console.log(`${data.message}\n`); 305 | } 306 | } 307 | } catch (e) { 308 | $.logErr(e, resp); 309 | } finally { 310 | resolve(); 311 | } 312 | }) 313 | } else { 314 | console.log('您未提供Bark的APP推送BARK_PUSH,取消Bark推送消息通知🚫\n'); 315 | resolve() 316 | } 317 | }) 318 | } 319 | 320 | function tgBotNotify(text, desp) { 321 | return new Promise(resolve => { 322 | if (TG_BOT_TOKEN && TG_USER_ID) { 323 | const options = { 324 | url: `https://${TG_API_HOST}/bot${TG_BOT_TOKEN}/sendMessage`, 325 | body: `chat_id=${TG_USER_ID}&text=${text}\n\n${desp}&disable_web_page_preview=true`, 326 | headers: { 327 | 'Content-Type': 'application/x-www-form-urlencoded' 328 | }, 329 | timeout: 10000 330 | } 331 | if (TG_PROXY_HOST && TG_PROXY_PORT) { 332 | const tunnel = require("tunnel"); 333 | const agent = { 334 | https: tunnel.httpsOverHttp({ 335 | proxy: { 336 | host: TG_PROXY_HOST, 337 | port: TG_PROXY_PORT * 1, 338 | proxyAuth: TG_PROXY_AUTH 339 | } 340 | }) 341 | } 342 | Object.assign(options, { agent }) 343 | } 344 | $.post(options, (err, resp, data) => { 345 | try { 346 | if (err) { 347 | console.log('telegram发送通知消息失败!!\n') 348 | console.log(err); 349 | } else { 350 | data = JSON.parse(data); 351 | if (data.ok) { 352 | console.log('Telegram发送通知消息成功🎉。\n') 353 | } else if (data.error_code === 400) { 354 | console.log('请主动给bot发送一条消息并检查接收用户ID是否正确。\n') 355 | } else if (data.error_code === 401){ 356 | console.log('Telegram bot token 填写错误。\n') 357 | } 358 | } 359 | } catch (e) { 360 | $.logErr(e, resp); 361 | } finally { 362 | resolve(data); 363 | } 364 | }) 365 | } else { 366 | console.log('您未提供telegram机器人推送所需的TG_BOT_TOKEN和TG_USER_ID,取消telegram推送消息通知🚫\n'); 367 | resolve() 368 | } 369 | }) 370 | } 371 | function ddBotNotify(text, desp) { 372 | return new Promise(resolve => { 373 | const options = { 374 | url: `https://oapi.dingtalk.com/robot/send?access_token=${DD_BOT_TOKEN}`, 375 | json: { 376 | "msgtype": "text", 377 | "text": { 378 | "content": ` ${text}\n\n${desp}` 379 | } 380 | }, 381 | headers: { 382 | 'Content-Type': 'application/json' 383 | }, 384 | timeout: 10000 385 | } 386 | if (DD_BOT_TOKEN && DD_BOT_SECRET) { 387 | const crypto = require('crypto'); 388 | const dateNow = Date.now(); 389 | const hmac = crypto.createHmac('sha256', DD_BOT_SECRET); 390 | hmac.update(`${dateNow}\n${DD_BOT_SECRET}`); 391 | const result = encodeURIComponent(hmac.digest('base64')); 392 | options.url = `${options.url}×tamp=${dateNow}&sign=${result}`; 393 | $.post(options, (err, resp, data) => { 394 | try { 395 | if (err) { 396 | console.log('钉钉发送通知消息失败!!\n') 397 | console.log(err); 398 | } else { 399 | data = JSON.parse(data); 400 | if (data.errcode === 0) { 401 | console.log('钉钉发送通知消息成功🎉。\n') 402 | } else { 403 | console.log(`${data.errmsg}\n`) 404 | } 405 | } 406 | } catch (e) { 407 | $.logErr(e, resp); 408 | } finally { 409 | resolve(data); 410 | } 411 | }) 412 | } else if (DD_BOT_TOKEN) { 413 | $.post(options, (err, resp, data) => { 414 | try { 415 | if (err) { 416 | console.log('钉钉发送通知消息失败!!\n') 417 | console.log(err); 418 | } else { 419 | data = JSON.parse(data); 420 | if (data.errcode === 0) { 421 | console.log('钉钉发送通知消息完成。\n') 422 | } else { 423 | console.log(`${data.errmsg}\n`) 424 | } 425 | } 426 | } catch (e) { 427 | $.logErr(e, resp); 428 | } finally { 429 | resolve(data); 430 | } 431 | }) 432 | } else { 433 | console.log('您未提供钉钉机器人推送所需的DD_BOT_TOKEN或者DD_BOT_SECRET,取消钉钉推送消息通知🚫\n'); 434 | resolve() 435 | } 436 | }) 437 | } 438 | 439 | function qywxBotNotify(text, desp) { 440 | return new Promise(resolve => { 441 | const options = { 442 | url: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${QYWX_KEY}`, 443 | json: { 444 | msgtype: 'text', 445 | text: { 446 | content: ` ${text}\n\n${desp}`, 447 | }, 448 | }, 449 | headers: { 450 | 'Content-Type': 'application/json', 451 | }, 452 | timeout: 10000 453 | }; 454 | if (QYWX_KEY) { 455 | $.post(options, (err, resp, data) => { 456 | try { 457 | if (err) { 458 | console.log('企业微信发送通知消息失败!!\n'); 459 | console.log(err); 460 | } else { 461 | data = JSON.parse(data); 462 | if (data.errcode === 0) { 463 | console.log('企业微信发送通知消息成功🎉。\n'); 464 | } else { 465 | console.log(`${data.errmsg}\n`); 466 | } 467 | } 468 | } catch (e) { 469 | $.logErr(e, resp); 470 | } finally { 471 | resolve(data); 472 | } 473 | }); 474 | } else { 475 | console.log('您未提供企业微信机器人推送所需的QYWX_KEY,取消企业微信推送消息通知🚫\n'); 476 | resolve(); 477 | } 478 | }); 479 | } 480 | 481 | function ChangeUserId(desp) { 482 | const QYWX_AM_AY = QYWX_AM.split(','); 483 | if (QYWX_AM_AY[2]) { 484 | const userIdTmp = QYWX_AM_AY[2].split("|"); 485 | let userId = ""; 486 | for (let i = 0; i < userIdTmp.length; i++) { 487 | const count = "账号" + (i + 1); 488 | const count2 = "签到号 " + (i + 1); 489 | if (desp.match(count2)) { 490 | userId = userIdTmp[i]; 491 | } 492 | } 493 | if (!userId) userId = QYWX_AM_AY[2]; 494 | return userId; 495 | } else { 496 | return "@all"; 497 | } 498 | } 499 | 500 | function qywxamNotify(text, desp) { 501 | return new Promise(resolve => { 502 | if (QYWX_AM) { 503 | const QYWX_AM_AY = QYWX_AM.split(','); 504 | const options_accesstoken = { 505 | url: `https://qyapi.weixin.qq.com/cgi-bin/gettoken`, 506 | json: { 507 | corpid: `${QYWX_AM_AY[0]}`, 508 | corpsecret: `${QYWX_AM_AY[1]}`, 509 | }, 510 | headers: { 511 | 'Content-Type': 'application/json', 512 | }, 513 | timeout: 10000 514 | }; 515 | $.post(options_accesstoken, (err, resp, data) => { 516 | html = desp.replace(/\n/g, "
") 517 | var json = JSON.parse(data); 518 | accesstoken = json.access_token; 519 | let options; 520 | 521 | switch (QYWX_AM_AY[4]) { 522 | case '0': 523 | options = { 524 | msgtype: 'textcard', 525 | textcard: { 526 | title: `${text}`, 527 | description: `${desp}`, 528 | url: 'https://github.com/lxk0301/jd_scripts', 529 | btntxt: '更多' 530 | } 531 | } 532 | break; 533 | 534 | case '1': 535 | options = { 536 | msgtype: 'text', 537 | text: { 538 | content: `${text}\n\n${desp}` 539 | } 540 | } 541 | break; 542 | 543 | default: 544 | options = { 545 | msgtype: 'mpnews', 546 | mpnews: { 547 | articles: [ 548 | { 549 | title: `${text}`, 550 | thumb_media_id: `${QYWX_AM_AY[4]}`, 551 | author: `智能助手`, 552 | content_source_url: ``, 553 | content: `${html}`, 554 | digest: `${desp}` 555 | } 556 | ] 557 | } 558 | } 559 | }; 560 | if (!QYWX_AM_AY[4]) { 561 | //如不提供第四个参数,则默认进行文本消息类型推送 562 | options = { 563 | msgtype: 'text', 564 | text: { 565 | content: `${text}\n\n${desp}` 566 | } 567 | } 568 | } 569 | options = { 570 | url: `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}`, 571 | json: { 572 | touser: `${ChangeUserId(desp)}`, 573 | agentid: `${QYWX_AM_AY[3]}`, 574 | safe: '0', 575 | ...options 576 | }, 577 | headers: { 578 | 'Content-Type': 'application/json', 579 | }, 580 | } 581 | 582 | $.post(options, (err, resp, data) => { 583 | try { 584 | if (err) { 585 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息失败!!\n'); 586 | console.log(err); 587 | } else { 588 | data = JSON.parse(data); 589 | if (data.errcode === 0) { 590 | console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息成功🎉。\n'); 591 | } else { 592 | console.log(`${data.errmsg}\n`); 593 | } 594 | } 595 | } catch (e) { 596 | $.logErr(e, resp); 597 | } finally { 598 | resolve(data); 599 | } 600 | }); 601 | }); 602 | } else { 603 | console.log('您未提供企业微信应用消息推送所需的QYWX_AM,取消企业微信应用消息推送消息通知🚫\n'); 604 | resolve(); 605 | } 606 | }); 607 | } 608 | 609 | function iGotNotify(text, desp, params={}){ 610 | return new Promise(resolve => { 611 | if (IGOT_PUSH_KEY) { 612 | // 校验传入的IGOT_PUSH_KEY是否有效 613 | const IGOT_PUSH_KEY_REGX = new RegExp("^[a-zA-Z0-9]{24}$") 614 | if(!IGOT_PUSH_KEY_REGX.test(IGOT_PUSH_KEY)) { 615 | console.log('您所提供的IGOT_PUSH_KEY无效\n') 616 | resolve() 617 | return 618 | } 619 | const options = { 620 | url: `https://push.hellyw.com/${IGOT_PUSH_KEY.toLowerCase()}`, 621 | body: `title=${text}&content=${desp}&${querystring.stringify(params)}`, 622 | headers: { 623 | 'Content-Type': 'application/x-www-form-urlencoded' 624 | }, 625 | timeout: 10000 626 | } 627 | $.post(options, (err, resp, data) => { 628 | try { 629 | if (err) { 630 | console.log('发送通知调用API失败!!\n') 631 | console.log(err); 632 | } else { 633 | if(typeof data === 'string') data = JSON.parse(data); 634 | if (data.ret === 0) { 635 | console.log('iGot发送通知消息成功🎉\n') 636 | } else { 637 | console.log(`iGot发送通知消息失败:${data.errMsg}\n`) 638 | } 639 | } 640 | } catch (e) { 641 | $.logErr(e, resp); 642 | } finally { 643 | resolve(data); 644 | } 645 | }) 646 | } else { 647 | console.log('您未提供iGot的推送IGOT_PUSH_KEY,取消iGot推送消息通知🚫\n'); 648 | resolve() 649 | } 650 | }) 651 | } 652 | 653 | function pushPlusNotify(text, desp) { 654 | return new Promise(resolve => { 655 | if (PUSH_PLUS_TOKEN) { 656 | desp = desp.replace(/[\n\r]/g, '
'); // 默认为html, 不支持plaintext 657 | const body = { 658 | token: `${PUSH_PLUS_TOKEN}`, 659 | title: `${text}`, 660 | content:`${desp}`, 661 | topic: `${PUSH_PLUS_USER}` 662 | }; 663 | const options = { 664 | url: `http://www.pushplus.plus/send`, 665 | body: JSON.stringify(body), 666 | headers: { 667 | 'Content-Type': ' application/json' 668 | }, 669 | timeout: 10000 670 | } 671 | $.post(options, (err, resp, data) => { 672 | try { 673 | if (err) { 674 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`) 675 | console.log(err); 676 | } else { 677 | data = JSON.parse(data); 678 | if (data.code === 200) { 679 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`) 680 | } else { 681 | console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`) 682 | } 683 | } 684 | } catch (e) { 685 | $.logErr(e, resp); 686 | } finally { 687 | resolve(data); 688 | } 689 | }) 690 | } else { 691 | console.log('您未提供push+推送所需的PUSH_PLUS_TOKEN,取消push+推送消息通知🚫\n'); 692 | resolve() 693 | } 694 | }) 695 | } 696 | 697 | module.exports = { 698 | sendNotify, 699 | BARK_PUSH 700 | } 701 | // prettier-ignore 702 | function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),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}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{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=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(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),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;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),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}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,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||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,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"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 e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;$.isMute||(this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o))),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)} 703 | -------------------------------------------------------------------------------- /jsz.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | 金银手指 4 | 原作者:柠檬 5 | 6 | 适配 nodejs 和 qx,不依赖 crypto-js.js,直接运行即可 7 | 8 | *************************************************************************************************************** 9 | [rewrite] 10 | http:\/\/apponlie\.sahaj\.cn\/user\/myInfo url script-request-header https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.js 11 | [task] 12 | 1,15,30,45 8-20 * * * https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.js tag=金手指 13 | *************************************************************************************************************** 14 | 15 | 活动地址:https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.png 16 | 食用方法: 17 | 1.先填写好上方的重写或打开抓包软件 18 | 2.微信扫图片二维码,会自动跳出文章,等待10s左右,点击返回,点击停止阅读即可 19 | 20 | 收益:只看文章的话,跑满每日12000金币(1.2元),被限制阅读另说 21 | 每满4000金币(4毛)微信自动提现 22 | 23 | */ 24 | !function (t, e) { "object" == typeof exports ? module.exports = exports = e() : "function" == typeof define && define.amd ? define([], e) : t.CryptoJS = e() }(this, function () { var h, t, e, r, i, n, f, o, s, c, a, l, d, m, x, b, H, z, A, u, p, _, v, y, g, B, w, k, S, C, D, E, R, M, F, P, W, O, I, U, K, X, L, j, N, T, q, Z, V, G, J, $, Q, Y, tt, et, rt, it, nt, ot, st, ct, at, ht, lt, ft, dt, ut, pt, _t, vt, yt, gt, Bt, wt, kt, St, bt = bt || function (l) { var t; if ("undefined" != typeof window && window.crypto && (t = window.crypto), !t && "undefined" != typeof window && window.msCrypto && (t = window.msCrypto), !t && "undefined" != typeof global && global.crypto && (t = global.crypto), !t && "function" == typeof require) try { t = require("crypto") } catch (t) { } function i() { if (t) { if ("function" == typeof t.getRandomValues) try { return t.getRandomValues(new Uint32Array(1))[0] } catch (t) { } if ("function" == typeof t.randomBytes) try { return t.randomBytes(4).readInt32LE() } catch (t) { } } throw new Error("Native crypto module could not be used to get secure random number.") } var r = Object.create || function (t) { var e; return n.prototype = t, e = new n, n.prototype = null, e }; function n() { } var e = {}, o = e.lib = {}, s = o.Base = { extend: function (t) { var e = r(this); return t && e.mixIn(t), e.hasOwnProperty("init") && this.init !== e.init || (e.init = function () { e.$super.init.apply(this, arguments) }), (e.init.prototype = e).$super = this, e }, create: function () { var t = this.extend(); return t.init.apply(t, arguments), t }, init: function () { }, mixIn: function (t) { for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]); t.hasOwnProperty("toString") && (this.toString = t.toString) }, clone: function () { return this.init.prototype.extend(this) } }, f = o.WordArray = s.extend({ init: function (t, e) { t = this.words = t || [], this.sigBytes = null != e ? e : 4 * t.length }, toString: function (t) { return (t || a).stringify(this) }, concat: function (t) { var e = this.words, r = t.words, i = this.sigBytes, n = t.sigBytes; if (this.clamp(), i % 4) for (var o = 0; o < n; o++) { var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255; e[i + o >>> 2] |= s << 24 - (i + o) % 4 * 8 } else for (o = 0; o < n; o += 4)e[i + o >>> 2] = r[o >>> 2]; return this.sigBytes += n, this }, clamp: function () { var t = this.words, e = this.sigBytes; t[e >>> 2] &= 4294967295 << 32 - e % 4 * 8, t.length = l.ceil(e / 4) }, clone: function () { var t = s.clone.call(this); return t.words = this.words.slice(0), t }, random: function (t) { for (var e = [], r = 0; r < t; r += 4)e.push(i()); return new f.init(e, t) } }), c = e.enc = {}, a = c.Hex = { stringify: function (t) { for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n++) { var o = e[n >>> 2] >>> 24 - n % 4 * 8 & 255; i.push((o >>> 4).toString(16)), i.push((15 & o).toString(16)) } return i.join("") }, parse: function (t) { for (var e = t.length, r = [], i = 0; i < e; i += 2)r[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4; return new f.init(r, e / 2) } }, h = c.Latin1 = { stringify: function (t) { for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n++) { var o = e[n >>> 2] >>> 24 - n % 4 * 8 & 255; i.push(String.fromCharCode(o)) } return i.join("") }, parse: function (t) { for (var e = t.length, r = [], i = 0; i < e; i++)r[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - i % 4 * 8; return new f.init(r, e) } }, d = c.Utf8 = { stringify: function (t) { try { return decodeURIComponent(escape(h.stringify(t))) } catch (t) { throw new Error("Malformed UTF-8 data") } }, parse: function (t) { return h.parse(unescape(encodeURIComponent(t))) } }, u = o.BufferedBlockAlgorithm = s.extend({ reset: function () { this._data = new f.init, this._nDataBytes = 0 }, _append: function (t) { "string" == typeof t && (t = d.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes }, _process: function (t) { var e, r = this._data, i = r.words, n = r.sigBytes, o = this.blockSize, s = n / (4 * o), c = (s = t ? l.ceil(s) : l.max((0 | s) - this._minBufferSize, 0)) * o, a = l.min(4 * c, n); if (c) { for (var h = 0; h < c; h += o)this._doProcessBlock(i, h); e = i.splice(0, c), r.sigBytes -= a } return new f.init(e, a) }, clone: function () { var t = s.clone.call(this); return t._data = this._data.clone(), t }, _minBufferSize: 0 }), p = (o.Hasher = u.extend({ cfg: s.extend(), init: function (t) { this.cfg = this.cfg.extend(t), this.reset() }, reset: function () { u.reset.call(this), this._doReset() }, update: function (t) { return this._append(t), this._process(), this }, finalize: function (t) { return t && this._append(t), this._doFinalize() }, blockSize: 16, _createHelper: function (r) { return function (t, e) { return new r.init(e).finalize(t) } }, _createHmacHelper: function (r) { return function (t, e) { return new p.HMAC.init(r, e).finalize(t) } } }), e.algo = {}); return e }(Math); function mt(t, e, r) { return t ^ e ^ r } function xt(t, e, r) { return t & e | ~t & r } function Ht(t, e, r) { return (t | ~e) ^ r } function zt(t, e, r) { return t & r | e & ~r } function At(t, e, r) { return t ^ (e | ~r) } function Ct(t, e) { return t << e | t >>> 32 - e } function Dt(t, e, r, i) { var n, o = this._iv; o ? (n = o.slice(0), this._iv = void 0) : n = this._prevBlock, i.encryptBlock(n, 0); for (var s = 0; s < r; s++)t[e + s] ^= n[s] } function Et(t) { if (255 == (t >> 24 & 255)) { var e = t >> 16 & 255, r = t >> 8 & 255, i = 255 & t; 255 === e ? (e = 0, 255 === r ? (r = 0, 255 === i ? i = 0 : ++i) : ++r) : ++e, t = 0, t += e << 16, t += r << 8, t += i } else t += 1 << 24; return t } function Rt() { for (var t = this._X, e = this._C, r = 0; r < 8; r++)ft[r] = e[r]; e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[0] >>> 0 < ft[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>> 0 < ft[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < ft[2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < ft[3] >>> 0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < ft[4] >>> 0 ? 1 : 0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < ft[5] >>> 0 ? 1 : 0) | 0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < ft[6] >>> 0 ? 1 : 0) | 0, this._b = e[7] >>> 0 < ft[7] >>> 0 ? 1 : 0; for (r = 0; r < 8; r++) { var i = t[r] + e[r], n = 65535 & i, o = i >>> 16, s = ((n * n >>> 17) + n * o >>> 15) + o * o, c = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0); dt[r] = s ^ c } t[0] = dt[0] + (dt[7] << 16 | dt[7] >>> 16) + (dt[6] << 16 | dt[6] >>> 16) | 0, t[1] = dt[1] + (dt[0] << 8 | dt[0] >>> 24) + dt[7] | 0, t[2] = dt[2] + (dt[1] << 16 | dt[1] >>> 16) + (dt[0] << 16 | dt[0] >>> 16) | 0, t[3] = dt[3] + (dt[2] << 8 | dt[2] >>> 24) + dt[1] | 0, t[4] = dt[4] + (dt[3] << 16 | dt[3] >>> 16) + (dt[2] << 16 | dt[2] >>> 16) | 0, t[5] = dt[5] + (dt[4] << 8 | dt[4] >>> 24) + dt[3] | 0, t[6] = dt[6] + (dt[5] << 16 | dt[5] >>> 16) + (dt[4] << 16 | dt[4] >>> 16) | 0, t[7] = dt[7] + (dt[6] << 8 | dt[6] >>> 24) + dt[5] | 0 } function Mt() { for (var t = this._X, e = this._C, r = 0; r < 8; r++)wt[r] = e[r]; e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[0] >>> 0 < wt[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>> 0 < wt[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < wt[2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < wt[3] >>> 0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < wt[4] >>> 0 ? 1 : 0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < wt[5] >>> 0 ? 1 : 0) | 0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < wt[6] >>> 0 ? 1 : 0) | 0, this._b = e[7] >>> 0 < wt[7] >>> 0 ? 1 : 0; for (r = 0; r < 8; r++) { var i = t[r] + e[r], n = 65535 & i, o = i >>> 16, s = ((n * n >>> 17) + n * o >>> 15) + o * o, c = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0); kt[r] = s ^ c } t[0] = kt[0] + (kt[7] << 16 | kt[7] >>> 16) + (kt[6] << 16 | kt[6] >>> 16) | 0, t[1] = kt[1] + (kt[0] << 8 | kt[0] >>> 24) + kt[7] | 0, t[2] = kt[2] + (kt[1] << 16 | kt[1] >>> 16) + (kt[0] << 16 | kt[0] >>> 16) | 0, t[3] = kt[3] + (kt[2] << 8 | kt[2] >>> 24) + kt[1] | 0, t[4] = kt[4] + (kt[3] << 16 | kt[3] >>> 16) + (kt[2] << 16 | kt[2] >>> 16) | 0, t[5] = kt[5] + (kt[4] << 8 | kt[4] >>> 24) + kt[3] | 0, t[6] = kt[6] + (kt[5] << 16 | kt[5] >>> 16) + (kt[4] << 16 | kt[4] >>> 16) | 0, t[7] = kt[7] + (kt[6] << 8 | kt[6] >>> 24) + kt[5] | 0 } return h = bt.lib.WordArray, bt.enc.Base64 = { stringify: function (t) { var e = t.words, r = t.sigBytes, i = this._map; t.clamp(); for (var n = [], o = 0; o < r; o += 3)for (var s = (e[o >>> 2] >>> 24 - o % 4 * 8 & 255) << 16 | (e[o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255) << 8 | e[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, c = 0; c < 4 && o + .75 * c < r; c++)n.push(i.charAt(s >>> 6 * (3 - c) & 63)); var a = i.charAt(64); if (a) for (; n.length % 4;)n.push(a); return n.join("") }, parse: function (t) { var e = t.length, r = this._map, i = this._reverseMap; if (!i) { i = this._reverseMap = []; for (var n = 0; n < r.length; n++)i[r.charCodeAt(n)] = n } var o = r.charAt(64); if (o) { var s = t.indexOf(o); -1 !== s && (e = s) } return function (t, e, r) { for (var i = [], n = 0, o = 0; o < e; o++)if (o % 4) { var s = r[t.charCodeAt(o - 1)] << o % 4 * 2, c = r[t.charCodeAt(o)] >>> 6 - o % 4 * 2, a = s | c; i[n >>> 2] |= a << 24 - n % 4 * 8, n++ } return h.create(i, n) }(t, e, i) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" }, function (l) { var t = bt, e = t.lib, r = e.WordArray, i = e.Hasher, n = t.algo, H = []; !function () { for (var t = 0; t < 64; t++)H[t] = 4294967296 * l.abs(l.sin(t + 1)) | 0 }(); var o = n.MD5 = i.extend({ _doReset: function () { this._hash = new r.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function (t, e) { for (var r = 0; r < 16; r++) { var i = e + r, n = t[i]; t[i] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8) } var o = this._hash.words, s = t[e + 0], c = t[e + 1], a = t[e + 2], h = t[e + 3], l = t[e + 4], f = t[e + 5], d = t[e + 6], u = t[e + 7], p = t[e + 8], _ = t[e + 9], v = t[e + 10], y = t[e + 11], g = t[e + 12], B = t[e + 13], w = t[e + 14], k = t[e + 15], S = o[0], m = o[1], x = o[2], b = o[3]; S = z(S, m, x, b, s, 7, H[0]), b = z(b, S, m, x, c, 12, H[1]), x = z(x, b, S, m, a, 17, H[2]), m = z(m, x, b, S, h, 22, H[3]), S = z(S, m, x, b, l, 7, H[4]), b = z(b, S, m, x, f, 12, H[5]), x = z(x, b, S, m, d, 17, H[6]), m = z(m, x, b, S, u, 22, H[7]), S = z(S, m, x, b, p, 7, H[8]), b = z(b, S, m, x, _, 12, H[9]), x = z(x, b, S, m, v, 17, H[10]), m = z(m, x, b, S, y, 22, H[11]), S = z(S, m, x, b, g, 7, H[12]), b = z(b, S, m, x, B, 12, H[13]), x = z(x, b, S, m, w, 17, H[14]), S = A(S, m = z(m, x, b, S, k, 22, H[15]), x, b, c, 5, H[16]), b = A(b, S, m, x, d, 9, H[17]), x = A(x, b, S, m, y, 14, H[18]), m = A(m, x, b, S, s, 20, H[19]), S = A(S, m, x, b, f, 5, H[20]), b = A(b, S, m, x, v, 9, H[21]), x = A(x, b, S, m, k, 14, H[22]), m = A(m, x, b, S, l, 20, H[23]), S = A(S, m, x, b, _, 5, H[24]), b = A(b, S, m, x, w, 9, H[25]), x = A(x, b, S, m, h, 14, H[26]), m = A(m, x, b, S, p, 20, H[27]), S = A(S, m, x, b, B, 5, H[28]), b = A(b, S, m, x, a, 9, H[29]), x = A(x, b, S, m, u, 14, H[30]), S = C(S, m = A(m, x, b, S, g, 20, H[31]), x, b, f, 4, H[32]), b = C(b, S, m, x, p, 11, H[33]), x = C(x, b, S, m, y, 16, H[34]), m = C(m, x, b, S, w, 23, H[35]), S = C(S, m, x, b, c, 4, H[36]), b = C(b, S, m, x, l, 11, H[37]), x = C(x, b, S, m, u, 16, H[38]), m = C(m, x, b, S, v, 23, H[39]), S = C(S, m, x, b, B, 4, H[40]), b = C(b, S, m, x, s, 11, H[41]), x = C(x, b, S, m, h, 16, H[42]), m = C(m, x, b, S, d, 23, H[43]), S = C(S, m, x, b, _, 4, H[44]), b = C(b, S, m, x, g, 11, H[45]), x = C(x, b, S, m, k, 16, H[46]), S = D(S, m = C(m, x, b, S, a, 23, H[47]), x, b, s, 6, H[48]), b = D(b, S, m, x, u, 10, H[49]), x = D(x, b, S, m, w, 15, H[50]), m = D(m, x, b, S, f, 21, H[51]), S = D(S, m, x, b, g, 6, H[52]), b = D(b, S, m, x, h, 10, H[53]), x = D(x, b, S, m, v, 15, H[54]), m = D(m, x, b, S, c, 21, H[55]), S = D(S, m, x, b, p, 6, H[56]), b = D(b, S, m, x, k, 10, H[57]), x = D(x, b, S, m, d, 15, H[58]), m = D(m, x, b, S, B, 21, H[59]), S = D(S, m, x, b, l, 6, H[60]), b = D(b, S, m, x, y, 10, H[61]), x = D(x, b, S, m, a, 15, H[62]), m = D(m, x, b, S, _, 21, H[63]), o[0] = o[0] + S | 0, o[1] = o[1] + m | 0, o[2] = o[2] + x | 0, o[3] = o[3] + b | 0 }, _doFinalize: function () { var t = this._data, e = t.words, r = 8 * this._nDataBytes, i = 8 * t.sigBytes; e[i >>> 5] |= 128 << 24 - i % 32; var n = l.floor(r / 4294967296), o = r; e[15 + (64 + i >>> 9 << 4)] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8), e[14 + (64 + i >>> 9 << 4)] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), t.sigBytes = 4 * (e.length + 1), this._process(); for (var s = this._hash, c = s.words, a = 0; a < 4; a++) { var h = c[a]; c[a] = 16711935 & (h << 8 | h >>> 24) | 4278255360 & (h << 24 | h >>> 8) } return s }, clone: function () { var t = i.clone.call(this); return t._hash = this._hash.clone(), t } }); function z(t, e, r, i, n, o, s) { var c = t + (e & r | ~e & i) + n + s; return (c << o | c >>> 32 - o) + e } function A(t, e, r, i, n, o, s) { var c = t + (e & i | r & ~i) + n + s; return (c << o | c >>> 32 - o) + e } function C(t, e, r, i, n, o, s) { var c = t + (e ^ r ^ i) + n + s; return (c << o | c >>> 32 - o) + e } function D(t, e, r, i, n, o, s) { var c = t + (r ^ (e | ~i)) + n + s; return (c << o | c >>> 32 - o) + e } t.MD5 = i._createHelper(o), t.HmacMD5 = i._createHmacHelper(o) }(Math), e = (t = bt).lib, r = e.WordArray, i = e.Hasher, n = t.algo, f = [], o = n.SHA1 = i.extend({ _doReset: function () { this._hash = new r.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (t, e) { for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s = r[3], c = r[4], a = 0; a < 80; a++) { if (a < 16) f[a] = 0 | t[e + a]; else { var h = f[a - 3] ^ f[a - 8] ^ f[a - 14] ^ f[a - 16]; f[a] = h << 1 | h >>> 31 } var l = (i << 5 | i >>> 27) + c + f[a]; l += a < 20 ? 1518500249 + (n & o | ~n & s) : a < 40 ? 1859775393 + (n ^ o ^ s) : a < 60 ? (n & o | n & s | o & s) - 1894007588 : (n ^ o ^ s) - 899497514, c = s, s = o, o = n << 30 | n >>> 2, n = i, i = l } r[0] = r[0] + i | 0, r[1] = r[1] + n | 0, r[2] = r[2] + o | 0, r[3] = r[3] + s | 0, r[4] = r[4] + c | 0 }, _doFinalize: function () { var t = this._data, e = t.words, r = 8 * this._nDataBytes, i = 8 * t.sigBytes; return e[i >>> 5] |= 128 << 24 - i % 32, e[14 + (64 + i >>> 9 << 4)] = Math.floor(r / 4294967296), e[15 + (64 + i >>> 9 << 4)] = r, t.sigBytes = 4 * e.length, this._process(), this._hash }, clone: function () { var t = i.clone.call(this); return t._hash = this._hash.clone(), t } }), t.SHA1 = i._createHelper(o), t.HmacSHA1 = i._createHmacHelper(o), function (n) { var t = bt, e = t.lib, r = e.WordArray, i = e.Hasher, o = t.algo, s = [], B = []; !function () { function t(t) { for (var e = n.sqrt(t), r = 2; r <= e; r++)if (!(t % r)) return; return 1 } function e(t) { return 4294967296 * (t - (0 | t)) | 0 } for (var r = 2, i = 0; i < 64;)t(r) && (i < 8 && (s[i] = e(n.pow(r, .5))), B[i] = e(n.pow(r, 1 / 3)), i++), r++ }(); var w = [], c = o.SHA256 = i.extend({ _doReset: function () { this._hash = new r.init(s.slice(0)) }, _doProcessBlock: function (t, e) { for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s = r[3], c = r[4], a = r[5], h = r[6], l = r[7], f = 0; f < 64; f++) { if (f < 16) w[f] = 0 | t[e + f]; else { var d = w[f - 15], u = (d << 25 | d >>> 7) ^ (d << 14 | d >>> 18) ^ d >>> 3, p = w[f - 2], _ = (p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10; w[f] = u + w[f - 7] + _ + w[f - 16] } var v = i & n ^ i & o ^ n & o, y = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i << 10 | i >>> 22), g = l + ((c << 26 | c >>> 6) ^ (c << 21 | c >>> 11) ^ (c << 7 | c >>> 25)) + (c & a ^ ~c & h) + B[f] + w[f]; l = h, h = a, a = c, c = s + g | 0, s = o, o = n, n = i, i = g + (y + v) | 0 } r[0] = r[0] + i | 0, r[1] = r[1] + n | 0, r[2] = r[2] + o | 0, r[3] = r[3] + s | 0, r[4] = r[4] + c | 0, r[5] = r[5] + a | 0, r[6] = r[6] + h | 0, r[7] = r[7] + l | 0 }, _doFinalize: function () { var t = this._data, e = t.words, r = 8 * this._nDataBytes, i = 8 * t.sigBytes; return e[i >>> 5] |= 128 << 24 - i % 32, e[14 + (64 + i >>> 9 << 4)] = n.floor(r / 4294967296), e[15 + (64 + i >>> 9 << 4)] = r, t.sigBytes = 4 * e.length, this._process(), this._hash }, clone: function () { var t = i.clone.call(this); return t._hash = this._hash.clone(), t } }); t.SHA256 = i._createHelper(c), t.HmacSHA256 = i._createHmacHelper(c) }(Math), function () { var n = bt.lib.WordArray, t = bt.enc; t.Utf16 = t.Utf16BE = { stringify: function (t) { for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n += 2) { var o = e[n >>> 2] >>> 16 - n % 4 * 8 & 65535; i.push(String.fromCharCode(o)) } return i.join("") }, parse: function (t) { for (var e = t.length, r = [], i = 0; i < e; i++)r[i >>> 1] |= t.charCodeAt(i) << 16 - i % 2 * 16; return n.create(r, 2 * e) } }; function s(t) { return t << 8 & 4278255360 | t >>> 8 & 16711935 } t.Utf16LE = { stringify: function (t) { for (var e = t.words, r = t.sigBytes, i = [], n = 0; n < r; n += 2) { var o = s(e[n >>> 2] >>> 16 - n % 4 * 8 & 65535); i.push(String.fromCharCode(o)) } return i.join("") }, parse: function (t) { for (var e = t.length, r = [], i = 0; i < e; i++)r[i >>> 1] |= s(t.charCodeAt(i) << 16 - i % 2 * 16); return n.create(r, 2 * e) } } }(), function () { if ("function" == typeof ArrayBuffer) { var t = bt.lib.WordArray, n = t.init; (t.init = function (t) { if (t instanceof ArrayBuffer && (t = new Uint8Array(t)), (t instanceof Int8Array || "undefined" != typeof Uint8ClampedArray && t instanceof Uint8ClampedArray || t instanceof Int16Array || t instanceof Uint16Array || t instanceof Int32Array || t instanceof Uint32Array || t instanceof Float32Array || t instanceof Float64Array) && (t = new Uint8Array(t.buffer, t.byteOffset, t.byteLength)), t instanceof Uint8Array) { for (var e = t.byteLength, r = [], i = 0; i < e; i++)r[i >>> 2] |= t[i] << 24 - i % 4 * 8; n.call(this, r, e) } else n.apply(this, arguments) }).prototype = t } }(), Math, c = (s = bt).lib, a = c.WordArray, l = c.Hasher, d = s.algo, m = a.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]), x = a.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]), b = a.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]), H = a.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]), z = a.create([0, 1518500249, 1859775393, 2400959708, 2840853838]), A = a.create([1352829926, 1548603684, 1836072691, 2053994217, 0]), u = d.RIPEMD160 = l.extend({ _doReset: function () { this._hash = a.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (t, e) { for (var r = 0; r < 16; r++) { var i = e + r, n = t[i]; t[i] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8) } var o, s, c, a, h, l, f, d, u, p, _, v = this._hash.words, y = z.words, g = A.words, B = m.words, w = x.words, k = b.words, S = H.words; l = o = v[0], f = s = v[1], d = c = v[2], u = a = v[3], p = h = v[4]; for (r = 0; r < 80; r += 1)_ = o + t[e + B[r]] | 0, _ += r < 16 ? mt(s, c, a) + y[0] : r < 32 ? xt(s, c, a) + y[1] : r < 48 ? Ht(s, c, a) + y[2] : r < 64 ? zt(s, c, a) + y[3] : At(s, c, a) + y[4], _ = (_ = Ct(_ |= 0, k[r])) + h | 0, o = h, h = a, a = Ct(c, 10), c = s, s = _, _ = l + t[e + w[r]] | 0, _ += r < 16 ? At(f, d, u) + g[0] : r < 32 ? zt(f, d, u) + g[1] : r < 48 ? Ht(f, d, u) + g[2] : r < 64 ? xt(f, d, u) + g[3] : mt(f, d, u) + g[4], _ = (_ = Ct(_ |= 0, S[r])) + p | 0, l = p, p = u, u = Ct(d, 10), d = f, f = _; _ = v[1] + c + u | 0, v[1] = v[2] + a + p | 0, v[2] = v[3] + h + l | 0, v[3] = v[4] + o + f | 0, v[4] = v[0] + s + d | 0, v[0] = _ }, _doFinalize: function () { var t = this._data, e = t.words, r = 8 * this._nDataBytes, i = 8 * t.sigBytes; e[i >>> 5] |= 128 << 24 - i % 32, e[14 + (64 + i >>> 9 << 4)] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8), t.sigBytes = 4 * (e.length + 1), this._process(); for (var n = this._hash, o = n.words, s = 0; s < 5; s++) { var c = o[s]; o[s] = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8) } return n }, clone: function () { var t = l.clone.call(this); return t._hash = this._hash.clone(), t } }), s.RIPEMD160 = l._createHelper(u), s.HmacRIPEMD160 = l._createHmacHelper(u), p = bt.lib.Base, _ = bt.enc.Utf8, bt.algo.HMAC = p.extend({ init: function (t, e) { t = this._hasher = new t.init, "string" == typeof e && (e = _.parse(e)); var r = t.blockSize, i = 4 * r; e.sigBytes > i && (e = t.finalize(e)), e.clamp(); for (var n = this._oKey = e.clone(), o = this._iKey = e.clone(), s = n.words, c = o.words, a = 0; a < r; a++)s[a] ^= 1549556828, c[a] ^= 909522486; n.sigBytes = o.sigBytes = i, this.reset() }, reset: function () { var t = this._hasher; t.reset(), t.update(this._iKey) }, update: function (t) { return this._hasher.update(t), this }, finalize: function (t) { var e = this._hasher, r = e.finalize(t); return e.reset(), e.finalize(this._oKey.clone().concat(r)) } }), y = (v = bt).lib, g = y.Base, B = y.WordArray, w = v.algo, k = w.SHA1, S = w.HMAC, C = w.PBKDF2 = g.extend({ cfg: g.extend({ keySize: 4, hasher: k, iterations: 1 }), init: function (t) { this.cfg = this.cfg.extend(t) }, compute: function (t, e) { for (var r = this.cfg, i = S.create(r.hasher, t), n = B.create(), o = B.create([1]), s = n.words, c = o.words, a = r.keySize, h = r.iterations; s.length < a;) { var l = i.update(e).finalize(o); i.reset(); for (var f = l.words, d = f.length, u = l, p = 1; p < h; p++) { u = i.finalize(u), i.reset(); for (var _ = u.words, v = 0; v < d; v++)f[v] ^= _[v] } n.concat(l), c[0]++ } return n.sigBytes = 4 * a, n } }), v.PBKDF2 = function (t, e, r) { return C.create(r).compute(t, e) }, E = (D = bt).lib, R = E.Base, M = E.WordArray, F = D.algo, P = F.MD5, W = F.EvpKDF = R.extend({ cfg: R.extend({ keySize: 4, hasher: P, iterations: 1 }), init: function (t) { this.cfg = this.cfg.extend(t) }, compute: function (t, e) { for (var r, i = this.cfg, n = i.hasher.create(), o = M.create(), s = o.words, c = i.keySize, a = i.iterations; s.length < c;) { r && n.update(r), r = n.update(t).finalize(e), n.reset(); for (var h = 1; h < a; h++)r = n.finalize(r), n.reset(); o.concat(r) } return o.sigBytes = 4 * c, o } }), D.EvpKDF = function (t, e, r) { return W.create(r).compute(t, e) }, I = (O = bt).lib.WordArray, U = O.algo, K = U.SHA256, X = U.SHA224 = K.extend({ _doReset: function () { this._hash = new I.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]) }, _doFinalize: function () { var t = K._doFinalize.call(this); return t.sigBytes -= 4, t } }), O.SHA224 = K._createHelper(X), O.HmacSHA224 = K._createHmacHelper(X), L = bt.lib, j = L.Base, N = L.WordArray, (T = bt.x64 = {}).Word = j.extend({ init: function (t, e) { this.high = t, this.low = e } }), T.WordArray = j.extend({ init: function (t, e) { t = this.words = t || [], this.sigBytes = null != e ? e : 8 * t.length }, toX32: function () { for (var t = this.words, e = t.length, r = [], i = 0; i < e; i++) { var n = t[i]; r.push(n.high), r.push(n.low) } return N.create(r, this.sigBytes) }, clone: function () { for (var t = j.clone.call(this), e = t.words = this.words.slice(0), r = e.length, i = 0; i < r; i++)e[i] = e[i].clone(); return t } }), function (d) { var t = bt, e = t.lib, u = e.WordArray, i = e.Hasher, l = t.x64.Word, r = t.algo, C = [], D = [], E = []; !function () { for (var t = 1, e = 0, r = 0; r < 24; r++) { C[t + 5 * e] = (r + 1) * (r + 2) / 2 % 64; var i = (2 * t + 3 * e) % 5; t = e % 5, e = i } for (t = 0; t < 5; t++)for (e = 0; e < 5; e++)D[t + 5 * e] = e + (2 * t + 3 * e) % 5 * 5; for (var n = 1, o = 0; o < 24; o++) { for (var s = 0, c = 0, a = 0; a < 7; a++) { if (1 & n) { var h = (1 << a) - 1; h < 32 ? c ^= 1 << h : s ^= 1 << h - 32 } 128 & n ? n = n << 1 ^ 113 : n <<= 1 } E[o] = l.create(s, c) } }(); var R = []; !function () { for (var t = 0; t < 25; t++)R[t] = l.create() }(); var n = r.SHA3 = i.extend({ cfg: i.cfg.extend({ outputLength: 512 }), _doReset: function () { for (var t = this._state = [], e = 0; e < 25; e++)t[e] = new l.init; this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32 }, _doProcessBlock: function (t, e) { for (var r = this._state, i = this.blockSize / 2, n = 0; n < i; n++) { var o = t[e + 2 * n], s = t[e + 2 * n + 1]; o = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), (x = r[n]).high ^= s, x.low ^= o } for (var c = 0; c < 24; c++) { for (var a = 0; a < 5; a++) { for (var h = 0, l = 0, f = 0; f < 5; f++) { h ^= (x = r[a + 5 * f]).high, l ^= x.low } var d = R[a]; d.high = h, d.low = l } for (a = 0; a < 5; a++) { var u = R[(a + 4) % 5], p = R[(a + 1) % 5], _ = p.high, v = p.low; for (h = u.high ^ (_ << 1 | v >>> 31), l = u.low ^ (v << 1 | _ >>> 31), f = 0; f < 5; f++) { (x = r[a + 5 * f]).high ^= h, x.low ^= l } } for (var y = 1; y < 25; y++) { var g = (x = r[y]).high, B = x.low, w = C[y]; l = w < 32 ? (h = g << w | B >>> 32 - w, B << w | g >>> 32 - w) : (h = B << w - 32 | g >>> 64 - w, g << w - 32 | B >>> 64 - w); var k = R[D[y]]; k.high = h, k.low = l } var S = R[0], m = r[0]; S.high = m.high, S.low = m.low; for (a = 0; a < 5; a++)for (f = 0; f < 5; f++) { var x = r[y = a + 5 * f], b = R[y], H = R[(a + 1) % 5 + 5 * f], z = R[(a + 2) % 5 + 5 * f]; x.high = b.high ^ ~H.high & z.high, x.low = b.low ^ ~H.low & z.low } x = r[0]; var A = E[c]; x.high ^= A.high, x.low ^= A.low } }, _doFinalize: function () { var t = this._data, e = t.words, r = (this._nDataBytes, 8 * t.sigBytes), i = 32 * this.blockSize; e[r >>> 5] |= 1 << 24 - r % 32, e[(d.ceil((1 + r) / i) * i >>> 5) - 1] |= 128, t.sigBytes = 4 * e.length, this._process(); for (var n = this._state, o = this.cfg.outputLength / 8, s = o / 8, c = [], a = 0; a < s; a++) { var h = n[a], l = h.high, f = h.low; l = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8), f = 16711935 & (f << 8 | f >>> 24) | 4278255360 & (f << 24 | f >>> 8), c.push(f), c.push(l) } return new u.init(c, o) }, clone: function () { for (var t = i.clone.call(this), e = t._state = this._state.slice(0), r = 0; r < 25; r++)e[r] = e[r].clone(); return t } }); t.SHA3 = i._createHelper(n), t.HmacSHA3 = i._createHmacHelper(n) }(Math), function () { var t = bt, e = t.lib.Hasher, r = t.x64, i = r.Word, n = r.WordArray, o = t.algo; function s() { return i.create.apply(i, arguments) } var mt = [s(1116352408, 3609767458), s(1899447441, 602891725), s(3049323471, 3964484399), s(3921009573, 2173295548), s(961987163, 4081628472), s(1508970993, 3053834265), s(2453635748, 2937671579), s(2870763221, 3664609560), s(3624381080, 2734883394), s(310598401, 1164996542), s(607225278, 1323610764), s(1426881987, 3590304994), s(1925078388, 4068182383), s(2162078206, 991336113), s(2614888103, 633803317), s(3248222580, 3479774868), s(3835390401, 2666613458), s(4022224774, 944711139), s(264347078, 2341262773), s(604807628, 2007800933), s(770255983, 1495990901), s(1249150122, 1856431235), s(1555081692, 3175218132), s(1996064986, 2198950837), s(2554220882, 3999719339), s(2821834349, 766784016), s(2952996808, 2566594879), s(3210313671, 3203337956), s(3336571891, 1034457026), s(3584528711, 2466948901), s(113926993, 3758326383), s(338241895, 168717936), s(666307205, 1188179964), s(773529912, 1546045734), s(1294757372, 1522805485), s(1396182291, 2643833823), s(1695183700, 2343527390), s(1986661051, 1014477480), s(2177026350, 1206759142), s(2456956037, 344077627), s(2730485921, 1290863460), s(2820302411, 3158454273), s(3259730800, 3505952657), s(3345764771, 106217008), s(3516065817, 3606008344), s(3600352804, 1432725776), s(4094571909, 1467031594), s(275423344, 851169720), s(430227734, 3100823752), s(506948616, 1363258195), s(659060556, 3750685593), s(883997877, 3785050280), s(958139571, 3318307427), s(1322822218, 3812723403), s(1537002063, 2003034995), s(1747873779, 3602036899), s(1955562222, 1575990012), s(2024104815, 1125592928), s(2227730452, 2716904306), s(2361852424, 442776044), s(2428436474, 593698344), s(2756734187, 3733110249), s(3204031479, 2999351573), s(3329325298, 3815920427), s(3391569614, 3928383900), s(3515267271, 566280711), s(3940187606, 3454069534), s(4118630271, 4000239992), s(116418474, 1914138554), s(174292421, 2731055270), s(289380356, 3203993006), s(460393269, 320620315), s(685471733, 587496836), s(852142971, 1086792851), s(1017036298, 365543100), s(1126000580, 2618297676), s(1288033470, 3409855158), s(1501505948, 4234509866), s(1607167915, 987167468), s(1816402316, 1246189591)], xt = []; !function () { for (var t = 0; t < 80; t++)xt[t] = s() }(); var c = o.SHA512 = e.extend({ _doReset: function () { this._hash = new n.init([new i.init(1779033703, 4089235720), new i.init(3144134277, 2227873595), new i.init(1013904242, 4271175723), new i.init(2773480762, 1595750129), new i.init(1359893119, 2917565137), new i.init(2600822924, 725511199), new i.init(528734635, 4215389547), new i.init(1541459225, 327033209)]) }, _doProcessBlock: function (t, e) { for (var r = this._hash.words, i = r[0], n = r[1], o = r[2], s = r[3], c = r[4], a = r[5], h = r[6], l = r[7], f = i.high, d = i.low, u = n.high, p = n.low, _ = o.high, v = o.low, y = s.high, g = s.low, B = c.high, w = c.low, k = a.high, S = a.low, m = h.high, x = h.low, b = l.high, H = l.low, z = f, A = d, C = u, D = p, E = _, R = v, M = y, F = g, P = B, W = w, O = k, I = S, U = m, K = x, X = b, L = H, j = 0; j < 80; j++) { var N, T, q = xt[j]; if (j < 16) T = q.high = 0 | t[e + 2 * j], N = q.low = 0 | t[e + 2 * j + 1]; else { var Z = xt[j - 15], V = Z.high, G = Z.low, J = (V >>> 1 | G << 31) ^ (V >>> 8 | G << 24) ^ V >>> 7, $ = (G >>> 1 | V << 31) ^ (G >>> 8 | V << 24) ^ (G >>> 7 | V << 25), Q = xt[j - 2], Y = Q.high, tt = Q.low, et = (Y >>> 19 | tt << 13) ^ (Y << 3 | tt >>> 29) ^ Y >>> 6, rt = (tt >>> 19 | Y << 13) ^ (tt << 3 | Y >>> 29) ^ (tt >>> 6 | Y << 26), it = xt[j - 7], nt = it.high, ot = it.low, st = xt[j - 16], ct = st.high, at = st.low; T = (T = (T = J + nt + ((N = $ + ot) >>> 0 < $ >>> 0 ? 1 : 0)) + et + ((N += rt) >>> 0 < rt >>> 0 ? 1 : 0)) + ct + ((N += at) >>> 0 < at >>> 0 ? 1 : 0), q.high = T, q.low = N } var ht, lt = P & O ^ ~P & U, ft = W & I ^ ~W & K, dt = z & C ^ z & E ^ C & E, ut = A & D ^ A & R ^ D & R, pt = (z >>> 28 | A << 4) ^ (z << 30 | A >>> 2) ^ (z << 25 | A >>> 7), _t = (A >>> 28 | z << 4) ^ (A << 30 | z >>> 2) ^ (A << 25 | z >>> 7), vt = (P >>> 14 | W << 18) ^ (P >>> 18 | W << 14) ^ (P << 23 | W >>> 9), yt = (W >>> 14 | P << 18) ^ (W >>> 18 | P << 14) ^ (W << 23 | P >>> 9), gt = mt[j], Bt = gt.high, wt = gt.low, kt = X + vt + ((ht = L + yt) >>> 0 < L >>> 0 ? 1 : 0), St = _t + ut; X = U, L = K, U = O, K = I, O = P, I = W, P = M + (kt = (kt = (kt = kt + lt + ((ht = ht + ft) >>> 0 < ft >>> 0 ? 1 : 0)) + Bt + ((ht = ht + wt) >>> 0 < wt >>> 0 ? 1 : 0)) + T + ((ht = ht + N) >>> 0 < N >>> 0 ? 1 : 0)) + ((W = F + ht | 0) >>> 0 < F >>> 0 ? 1 : 0) | 0, M = E, F = R, E = C, R = D, C = z, D = A, z = kt + (pt + dt + (St >>> 0 < _t >>> 0 ? 1 : 0)) + ((A = ht + St | 0) >>> 0 < ht >>> 0 ? 1 : 0) | 0 } d = i.low = d + A, i.high = f + z + (d >>> 0 < A >>> 0 ? 1 : 0), p = n.low = p + D, n.high = u + C + (p >>> 0 < D >>> 0 ? 1 : 0), v = o.low = v + R, o.high = _ + E + (v >>> 0 < R >>> 0 ? 1 : 0), g = s.low = g + F, s.high = y + M + (g >>> 0 < F >>> 0 ? 1 : 0), w = c.low = w + W, c.high = B + P + (w >>> 0 < W >>> 0 ? 1 : 0), S = a.low = S + I, a.high = k + O + (S >>> 0 < I >>> 0 ? 1 : 0), x = h.low = x + K, h.high = m + U + (x >>> 0 < K >>> 0 ? 1 : 0), H = l.low = H + L, l.high = b + X + (H >>> 0 < L >>> 0 ? 1 : 0) }, _doFinalize: function () { var t = this._data, e = t.words, r = 8 * this._nDataBytes, i = 8 * t.sigBytes; return e[i >>> 5] |= 128 << 24 - i % 32, e[30 + (128 + i >>> 10 << 5)] = Math.floor(r / 4294967296), e[31 + (128 + i >>> 10 << 5)] = r, t.sigBytes = 4 * e.length, this._process(), this._hash.toX32() }, clone: function () { var t = e.clone.call(this); return t._hash = this._hash.clone(), t }, blockSize: 32 }); t.SHA512 = e._createHelper(c), t.HmacSHA512 = e._createHmacHelper(c) }(), Z = (q = bt).x64, V = Z.Word, G = Z.WordArray, J = q.algo, $ = J.SHA512, Q = J.SHA384 = $.extend({ _doReset: function () { this._hash = new G.init([new V.init(3418070365, 3238371032), new V.init(1654270250, 914150663), new V.init(2438529370, 812702999), new V.init(355462360, 4144912697), new V.init(1731405415, 4290775857), new V.init(2394180231, 1750603025), new V.init(3675008525, 1694076839), new V.init(1203062813, 3204075428)]) }, _doFinalize: function () { var t = $._doFinalize.call(this); return t.sigBytes -= 16, t } }), q.SHA384 = $._createHelper(Q), q.HmacSHA384 = $._createHmacHelper(Q), bt.lib.Cipher || function () { var t = bt, e = t.lib, r = e.Base, a = e.WordArray, i = e.BufferedBlockAlgorithm, n = t.enc, o = (n.Utf8, n.Base64), s = t.algo.EvpKDF, c = e.Cipher = i.extend({ cfg: r.extend(), createEncryptor: function (t, e) { return this.create(this._ENC_XFORM_MODE, t, e) }, createDecryptor: function (t, e) { return this.create(this._DEC_XFORM_MODE, t, e) }, init: function (t, e, r) { this.cfg = this.cfg.extend(r), this._xformMode = t, this._key = e, this.reset() }, reset: function () { i.reset.call(this), this._doReset() }, process: function (t) { return this._append(t), this._process() }, finalize: function (t) { return t && this._append(t), this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (i) { return { encrypt: function (t, e, r) { return h(e).encrypt(i, t, e, r) }, decrypt: function (t, e, r) { return h(e).decrypt(i, t, e, r) } } } }); function h(t) { return "string" == typeof t ? w : g } e.StreamCipher = c.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var l, f = t.mode = {}, d = e.BlockCipherMode = r.extend({ createEncryptor: function (t, e) { return this.Encryptor.create(t, e) }, createDecryptor: function (t, e) { return this.Decryptor.create(t, e) }, init: function (t, e) { this._cipher = t, this._iv = e } }), u = f.CBC = ((l = d.extend()).Encryptor = l.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize; p.call(this, t, e, i), r.encryptBlock(t, e), this._prevBlock = t.slice(e, e + i) } }), l.Decryptor = l.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize, n = t.slice(e, e + i); r.decryptBlock(t, e), p.call(this, t, e, i), this._prevBlock = n } }), l); function p(t, e, r) { var i, n = this._iv; n ? (i = n, this._iv = void 0) : i = this._prevBlock; for (var o = 0; o < r; o++)t[e + o] ^= i[o] } var _ = (t.pad = {}).Pkcs7 = { pad: function (t, e) { for (var r = 4 * e, i = r - t.sigBytes % r, n = i << 24 | i << 16 | i << 8 | i, o = [], s = 0; s < i; s += 4)o.push(n); var c = a.create(o, i); t.concat(c) }, unpad: function (t) { var e = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= e } }, v = (e.BlockCipher = c.extend({ cfg: c.cfg.extend({ mode: u, padding: _ }), reset: function () { var t; c.reset.call(this); var e = this.cfg, r = e.iv, i = e.mode; this._xformMode == this._ENC_XFORM_MODE ? t = i.createEncryptor : (t = i.createDecryptor, this._minBufferSize = 1), this._mode && this._mode.__creator == t ? this._mode.init(this, r && r.words) : (this._mode = t.call(i, this, r && r.words), this._mode.__creator = t) }, _doProcessBlock: function (t, e) { this._mode.processBlock(t, e) }, _doFinalize: function () { var t, e = this.cfg.padding; return this._xformMode == this._ENC_XFORM_MODE ? (e.pad(this._data, this.blockSize), t = this._process(!0)) : (t = this._process(!0), e.unpad(t)), t }, blockSize: 4 }), e.CipherParams = r.extend({ init: function (t) { this.mixIn(t) }, toString: function (t) { return (t || this.formatter).stringify(this) } })), y = (t.format = {}).OpenSSL = { stringify: function (t) { var e = t.ciphertext, r = t.salt; return (r ? a.create([1398893684, 1701076831]).concat(r).concat(e) : e).toString(o) }, parse: function (t) { var e, r = o.parse(t), i = r.words; return 1398893684 == i[0] && 1701076831 == i[1] && (e = a.create(i.slice(2, 4)), i.splice(0, 4), r.sigBytes -= 16), v.create({ ciphertext: r, salt: e }) } }, g = e.SerializableCipher = r.extend({ cfg: r.extend({ format: y }), encrypt: function (t, e, r, i) { i = this.cfg.extend(i); var n = t.createEncryptor(r, i), o = n.finalize(e), s = n.cfg; return v.create({ ciphertext: o, key: r, iv: s.iv, algorithm: t, mode: s.mode, padding: s.padding, blockSize: t.blockSize, formatter: i.format }) }, decrypt: function (t, e, r, i) { return i = this.cfg.extend(i), e = this._parse(e, i.format), t.createDecryptor(r, i).finalize(e.ciphertext) }, _parse: function (t, e) { return "string" == typeof t ? e.parse(t, this) : t } }), B = (t.kdf = {}).OpenSSL = { execute: function (t, e, r, i) { i = i || a.random(8); var n = s.create({ keySize: e + r }).compute(t, i), o = a.create(n.words.slice(e), 4 * r); return n.sigBytes = 4 * e, v.create({ key: n, iv: o, salt: i }) } }, w = e.PasswordBasedCipher = g.extend({ cfg: g.cfg.extend({ kdf: B }), encrypt: function (t, e, r, i) { var n = (i = this.cfg.extend(i)).kdf.execute(r, t.keySize, t.ivSize); i.iv = n.iv; var o = g.encrypt.call(this, t, e, n.key, i); return o.mixIn(n), o }, decrypt: function (t, e, r, i) { i = this.cfg.extend(i), e = this._parse(e, i.format); var n = i.kdf.execute(r, t.keySize, t.ivSize, e.salt); return i.iv = n.iv, g.decrypt.call(this, t, e, n.key, i) } }) }(), bt.mode.CFB = ((Y = bt.lib.BlockCipherMode.extend()).Encryptor = Y.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize; Dt.call(this, t, e, i, r), this._prevBlock = t.slice(e, e + i) } }), Y.Decryptor = Y.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize, n = t.slice(e, e + i); Dt.call(this, t, e, i, r), this._prevBlock = n } }), Y), bt.mode.ECB = ((tt = bt.lib.BlockCipherMode.extend()).Encryptor = tt.extend({ processBlock: function (t, e) { this._cipher.encryptBlock(t, e) } }), tt.Decryptor = tt.extend({ processBlock: function (t, e) { this._cipher.decryptBlock(t, e) } }), tt), bt.pad.AnsiX923 = { pad: function (t, e) { var r = t.sigBytes, i = 4 * e, n = i - r % i, o = r + n - 1; t.clamp(), t.words[o >>> 2] |= n << 24 - o % 4 * 8, t.sigBytes += n }, unpad: function (t) { var e = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= e } }, bt.pad.Iso10126 = { pad: function (t, e) { var r = 4 * e, i = r - t.sigBytes % r; t.concat(bt.lib.WordArray.random(i - 1)).concat(bt.lib.WordArray.create([i << 24], 1)) }, unpad: function (t) { var e = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= e } }, bt.pad.Iso97971 = { pad: function (t, e) { t.concat(bt.lib.WordArray.create([2147483648], 1)), bt.pad.ZeroPadding.pad(t, e) }, unpad: function (t) { bt.pad.ZeroPadding.unpad(t), t.sigBytes-- } }, bt.mode.OFB = (et = bt.lib.BlockCipherMode.extend(), rt = et.Encryptor = et.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize, n = this._iv, o = this._keystream; n && (o = this._keystream = n.slice(0), this._iv = void 0), r.encryptBlock(o, 0); for (var s = 0; s < i; s++)t[e + s] ^= o[s] } }), et.Decryptor = rt, et), bt.pad.NoPadding = { pad: function () { }, unpad: function () { } }, it = bt.lib.CipherParams, nt = bt.enc.Hex, bt.format.Hex = { stringify: function (t) { return t.ciphertext.toString(nt) }, parse: function (t) { var e = nt.parse(t); return it.create({ ciphertext: e }) } }, function () { var t = bt, e = t.lib.BlockCipher, r = t.algo, h = [], l = [], f = [], d = [], u = [], p = [], _ = [], v = [], y = [], g = []; !function () { for (var t = [], e = 0; e < 256; e++)t[e] = e < 128 ? e << 1 : e << 1 ^ 283; var r = 0, i = 0; for (e = 0; e < 256; e++) { var n = i ^ i << 1 ^ i << 2 ^ i << 3 ^ i << 4; n = n >>> 8 ^ 255 & n ^ 99, h[r] = n; var o = t[l[n] = r], s = t[o], c = t[s], a = 257 * t[n] ^ 16843008 * n; f[r] = a << 24 | a >>> 8, d[r] = a << 16 | a >>> 16, u[r] = a << 8 | a >>> 24, p[r] = a; a = 16843009 * c ^ 65537 * s ^ 257 * o ^ 16843008 * r; _[n] = a << 24 | a >>> 8, v[n] = a << 16 | a >>> 16, y[n] = a << 8 | a >>> 24, g[n] = a, r ? (r = o ^ t[t[t[c ^ o]]], i ^= t[t[i]]) : r = i = 1 } }(); var B = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], i = r.AES = e.extend({ _doReset: function () { if (!this._nRounds || this._keyPriorReset !== this._key) { for (var t = this._keyPriorReset = this._key, e = t.words, r = t.sigBytes / 4, i = 4 * (1 + (this._nRounds = 6 + r)), n = this._keySchedule = [], o = 0; o < i; o++)o < r ? n[o] = e[o] : (a = n[o - 1], o % r ? 6 < r && o % r == 4 && (a = h[a >>> 24] << 24 | h[a >>> 16 & 255] << 16 | h[a >>> 8 & 255] << 8 | h[255 & a]) : (a = h[(a = a << 8 | a >>> 24) >>> 24] << 24 | h[a >>> 16 & 255] << 16 | h[a >>> 8 & 255] << 8 | h[255 & a], a ^= B[o / r | 0] << 24), n[o] = n[o - r] ^ a); for (var s = this._invKeySchedule = [], c = 0; c < i; c++) { o = i - c; if (c % 4) var a = n[o]; else a = n[o - 4]; s[c] = c < 4 || o <= 4 ? a : _[h[a >>> 24]] ^ v[h[a >>> 16 & 255]] ^ y[h[a >>> 8 & 255]] ^ g[h[255 & a]] } } }, encryptBlock: function (t, e) { this._doCryptBlock(t, e, this._keySchedule, f, d, u, p, h) }, decryptBlock: function (t, e) { var r = t[e + 1]; t[e + 1] = t[e + 3], t[e + 3] = r, this._doCryptBlock(t, e, this._invKeySchedule, _, v, y, g, l); r = t[e + 1]; t[e + 1] = t[e + 3], t[e + 3] = r }, _doCryptBlock: function (t, e, r, i, n, o, s, c) { for (var a = this._nRounds, h = t[e] ^ r[0], l = t[e + 1] ^ r[1], f = t[e + 2] ^ r[2], d = t[e + 3] ^ r[3], u = 4, p = 1; p < a; p++) { var _ = i[h >>> 24] ^ n[l >>> 16 & 255] ^ o[f >>> 8 & 255] ^ s[255 & d] ^ r[u++], v = i[l >>> 24] ^ n[f >>> 16 & 255] ^ o[d >>> 8 & 255] ^ s[255 & h] ^ r[u++], y = i[f >>> 24] ^ n[d >>> 16 & 255] ^ o[h >>> 8 & 255] ^ s[255 & l] ^ r[u++], g = i[d >>> 24] ^ n[h >>> 16 & 255] ^ o[l >>> 8 & 255] ^ s[255 & f] ^ r[u++]; h = _, l = v, f = y, d = g } _ = (c[h >>> 24] << 24 | c[l >>> 16 & 255] << 16 | c[f >>> 8 & 255] << 8 | c[255 & d]) ^ r[u++], v = (c[l >>> 24] << 24 | c[f >>> 16 & 255] << 16 | c[d >>> 8 & 255] << 8 | c[255 & h]) ^ r[u++], y = (c[f >>> 24] << 24 | c[d >>> 16 & 255] << 16 | c[h >>> 8 & 255] << 8 | c[255 & l]) ^ r[u++], g = (c[d >>> 24] << 24 | c[h >>> 16 & 255] << 16 | c[l >>> 8 & 255] << 8 | c[255 & f]) ^ r[u++]; t[e] = _, t[e + 1] = v, t[e + 2] = y, t[e + 3] = g }, keySize: 8 }); t.AES = e._createHelper(i) }(), function () { var t = bt, e = t.lib, n = e.WordArray, r = e.BlockCipher, i = t.algo, h = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4], l = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32], f = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28], d = [{ 0: 8421888, 268435456: 32768, 536870912: 8421378, 805306368: 2, 1073741824: 512, 1342177280: 8421890, 1610612736: 8389122, 1879048192: 8388608, 2147483648: 514, 2415919104: 8389120, 2684354560: 33280, 2952790016: 8421376, 3221225472: 32770, 3489660928: 8388610, 3758096384: 0, 4026531840: 33282, 134217728: 0, 402653184: 8421890, 671088640: 33282, 939524096: 32768, 1207959552: 8421888, 1476395008: 512, 1744830464: 8421378, 2013265920: 2, 2281701376: 8389120, 2550136832: 33280, 2818572288: 8421376, 3087007744: 8389122, 3355443200: 8388610, 3623878656: 32770, 3892314112: 514, 4160749568: 8388608, 1: 32768, 268435457: 2, 536870913: 8421888, 805306369: 8388608, 1073741825: 8421378, 1342177281: 33280, 1610612737: 512, 1879048193: 8389122, 2147483649: 8421890, 2415919105: 8421376, 2684354561: 8388610, 2952790017: 33282, 3221225473: 514, 3489660929: 8389120, 3758096385: 32770, 4026531841: 0, 134217729: 8421890, 402653185: 8421376, 671088641: 8388608, 939524097: 512, 1207959553: 32768, 1476395009: 8388610, 1744830465: 2, 2013265921: 33282, 2281701377: 32770, 2550136833: 8389122, 2818572289: 514, 3087007745: 8421888, 3355443201: 8389120, 3623878657: 0, 3892314113: 33280, 4160749569: 8421378 }, { 0: 1074282512, 16777216: 16384, 33554432: 524288, 50331648: 1074266128, 67108864: 1073741840, 83886080: 1074282496, 100663296: 1073758208, 117440512: 16, 134217728: 540672, 150994944: 1073758224, 167772160: 1073741824, 184549376: 540688, 201326592: 524304, 218103808: 0, 234881024: 16400, 251658240: 1074266112, 8388608: 1073758208, 25165824: 540688, 41943040: 16, 58720256: 1073758224, 75497472: 1074282512, 92274688: 1073741824, 109051904: 524288, 125829120: 1074266128, 142606336: 524304, 159383552: 0, 176160768: 16384, 192937984: 1074266112, 209715200: 1073741840, 226492416: 540672, 243269632: 1074282496, 260046848: 16400, 268435456: 0, 285212672: 1074266128, 301989888: 1073758224, 318767104: 1074282496, 335544320: 1074266112, 352321536: 16, 369098752: 540688, 385875968: 16384, 402653184: 16400, 419430400: 524288, 436207616: 524304, 452984832: 1073741840, 469762048: 540672, 486539264: 1073758208, 503316480: 1073741824, 520093696: 1074282512, 276824064: 540688, 293601280: 524288, 310378496: 1074266112, 327155712: 16384, 343932928: 1073758208, 360710144: 1074282512, 377487360: 16, 394264576: 1073741824, 411041792: 1074282496, 427819008: 1073741840, 444596224: 1073758224, 461373440: 524304, 478150656: 0, 494927872: 16400, 511705088: 1074266128, 528482304: 540672 }, { 0: 260, 1048576: 0, 2097152: 67109120, 3145728: 65796, 4194304: 65540, 5242880: 67108868, 6291456: 67174660, 7340032: 67174400, 8388608: 67108864, 9437184: 67174656, 10485760: 65792, 11534336: 67174404, 12582912: 67109124, 13631488: 65536, 14680064: 4, 15728640: 256, 524288: 67174656, 1572864: 67174404, 2621440: 0, 3670016: 67109120, 4718592: 67108868, 5767168: 65536, 6815744: 65540, 7864320: 260, 8912896: 4, 9961472: 256, 11010048: 67174400, 12058624: 65796, 13107200: 65792, 14155776: 67109124, 15204352: 67174660, 16252928: 67108864, 16777216: 67174656, 17825792: 65540, 18874368: 65536, 19922944: 67109120, 20971520: 256, 22020096: 67174660, 23068672: 67108868, 24117248: 0, 25165824: 67109124, 26214400: 67108864, 27262976: 4, 28311552: 65792, 29360128: 67174400, 30408704: 260, 31457280: 65796, 32505856: 67174404, 17301504: 67108864, 18350080: 260, 19398656: 67174656, 20447232: 0, 21495808: 65540, 22544384: 67109120, 23592960: 256, 24641536: 67174404, 25690112: 65536, 26738688: 67174660, 27787264: 65796, 28835840: 67108868, 29884416: 67109124, 30932992: 67174400, 31981568: 4, 33030144: 65792 }, { 0: 2151682048, 65536: 2147487808, 131072: 4198464, 196608: 2151677952, 262144: 0, 327680: 4198400, 393216: 2147483712, 458752: 4194368, 524288: 2147483648, 589824: 4194304, 655360: 64, 720896: 2147487744, 786432: 2151678016, 851968: 4160, 917504: 4096, 983040: 2151682112, 32768: 2147487808, 98304: 64, 163840: 2151678016, 229376: 2147487744, 294912: 4198400, 360448: 2151682112, 425984: 0, 491520: 2151677952, 557056: 4096, 622592: 2151682048, 688128: 4194304, 753664: 4160, 819200: 2147483648, 884736: 4194368, 950272: 4198464, 1015808: 2147483712, 1048576: 4194368, 1114112: 4198400, 1179648: 2147483712, 1245184: 0, 1310720: 4160, 1376256: 2151678016, 1441792: 2151682048, 1507328: 2147487808, 1572864: 2151682112, 1638400: 2147483648, 1703936: 2151677952, 1769472: 4198464, 1835008: 2147487744, 1900544: 4194304, 1966080: 64, 2031616: 4096, 1081344: 2151677952, 1146880: 2151682112, 1212416: 0, 1277952: 4198400, 1343488: 4194368, 1409024: 2147483648, 1474560: 2147487808, 1540096: 64, 1605632: 2147483712, 1671168: 4096, 1736704: 2147487744, 1802240: 2151678016, 1867776: 4160, 1933312: 2151682048, 1998848: 4194304, 2064384: 4198464 }, { 0: 128, 4096: 17039360, 8192: 262144, 12288: 536870912, 16384: 537133184, 20480: 16777344, 24576: 553648256, 28672: 262272, 32768: 16777216, 36864: 537133056, 40960: 536871040, 45056: 553910400, 49152: 553910272, 53248: 0, 57344: 17039488, 61440: 553648128, 2048: 17039488, 6144: 553648256, 10240: 128, 14336: 17039360, 18432: 262144, 22528: 537133184, 26624: 553910272, 30720: 536870912, 34816: 537133056, 38912: 0, 43008: 553910400, 47104: 16777344, 51200: 536871040, 55296: 553648128, 59392: 16777216, 63488: 262272, 65536: 262144, 69632: 128, 73728: 536870912, 77824: 553648256, 81920: 16777344, 86016: 553910272, 90112: 537133184, 94208: 16777216, 98304: 553910400, 102400: 553648128, 106496: 17039360, 110592: 537133056, 114688: 262272, 118784: 536871040, 122880: 0, 126976: 17039488, 67584: 553648256, 71680: 16777216, 75776: 17039360, 79872: 537133184, 83968: 536870912, 88064: 17039488, 92160: 128, 96256: 553910272, 100352: 262272, 104448: 553910400, 108544: 0, 112640: 553648128, 116736: 16777344, 120832: 262144, 124928: 537133056, 129024: 536871040 }, { 0: 268435464, 256: 8192, 512: 270532608, 768: 270540808, 1024: 268443648, 1280: 2097152, 1536: 2097160, 1792: 268435456, 2048: 0, 2304: 268443656, 2560: 2105344, 2816: 8, 3072: 270532616, 3328: 2105352, 3584: 8200, 3840: 270540800, 128: 270532608, 384: 270540808, 640: 8, 896: 2097152, 1152: 2105352, 1408: 268435464, 1664: 268443648, 1920: 8200, 2176: 2097160, 2432: 8192, 2688: 268443656, 2944: 270532616, 3200: 0, 3456: 270540800, 3712: 2105344, 3968: 268435456, 4096: 268443648, 4352: 270532616, 4608: 270540808, 4864: 8200, 5120: 2097152, 5376: 268435456, 5632: 268435464, 5888: 2105344, 6144: 2105352, 6400: 0, 6656: 8, 6912: 270532608, 7168: 8192, 7424: 268443656, 7680: 270540800, 7936: 2097160, 4224: 8, 4480: 2105344, 4736: 2097152, 4992: 268435464, 5248: 268443648, 5504: 8200, 5760: 270540808, 6016: 270532608, 6272: 270540800, 6528: 270532616, 6784: 8192, 7040: 2105352, 7296: 2097160, 7552: 0, 7808: 268435456, 8064: 268443656 }, { 0: 1048576, 16: 33555457, 32: 1024, 48: 1049601, 64: 34604033, 80: 0, 96: 1, 112: 34603009, 128: 33555456, 144: 1048577, 160: 33554433, 176: 34604032, 192: 34603008, 208: 1025, 224: 1049600, 240: 33554432, 8: 34603009, 24: 0, 40: 33555457, 56: 34604032, 72: 1048576, 88: 33554433, 104: 33554432, 120: 1025, 136: 1049601, 152: 33555456, 168: 34603008, 184: 1048577, 200: 1024, 216: 34604033, 232: 1, 248: 1049600, 256: 33554432, 272: 1048576, 288: 33555457, 304: 34603009, 320: 1048577, 336: 33555456, 352: 34604032, 368: 1049601, 384: 1025, 400: 34604033, 416: 1049600, 432: 1, 448: 0, 464: 34603008, 480: 33554433, 496: 1024, 264: 1049600, 280: 33555457, 296: 34603009, 312: 1, 328: 33554432, 344: 1048576, 360: 1025, 376: 34604032, 392: 33554433, 408: 34603008, 424: 0, 440: 34604033, 456: 1049601, 472: 1024, 488: 33555456, 504: 1048577 }, { 0: 134219808, 1: 131072, 2: 134217728, 3: 32, 4: 131104, 5: 134350880, 6: 134350848, 7: 2048, 8: 134348800, 9: 134219776, 10: 133120, 11: 134348832, 12: 2080, 13: 0, 14: 134217760, 15: 133152, 2147483648: 2048, 2147483649: 134350880, 2147483650: 134219808, 2147483651: 134217728, 2147483652: 134348800, 2147483653: 133120, 2147483654: 133152, 2147483655: 32, 2147483656: 134217760, 2147483657: 2080, 2147483658: 131104, 2147483659: 134350848, 2147483660: 0, 2147483661: 134348832, 2147483662: 134219776, 2147483663: 131072, 16: 133152, 17: 134350848, 18: 32, 19: 2048, 20: 134219776, 21: 134217760, 22: 134348832, 23: 131072, 24: 0, 25: 131104, 26: 134348800, 27: 134219808, 28: 134350880, 29: 133120, 30: 2080, 31: 134217728, 2147483664: 131072, 2147483665: 2048, 2147483666: 134348832, 2147483667: 133152, 2147483668: 32, 2147483669: 134348800, 2147483670: 134217728, 2147483671: 134219808, 2147483672: 134350880, 2147483673: 134217760, 2147483674: 134219776, 2147483675: 0, 2147483676: 133120, 2147483677: 2080, 2147483678: 131104, 2147483679: 134350848 }], u = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679], o = i.DES = r.extend({ _doReset: function () { for (var t = this._key.words, e = [], r = 0; r < 56; r++) { var i = h[r] - 1; e[r] = t[i >>> 5] >>> 31 - i % 32 & 1 } for (var n = this._subKeys = [], o = 0; o < 16; o++) { var s = n[o] = [], c = f[o]; for (r = 0; r < 24; r++)s[r / 6 | 0] |= e[(l[r] - 1 + c) % 28] << 31 - r % 6, s[4 + (r / 6 | 0)] |= e[28 + (l[r + 24] - 1 + c) % 28] << 31 - r % 6; s[0] = s[0] << 1 | s[0] >>> 31; for (r = 1; r < 7; r++)s[r] = s[r] >>> 4 * (r - 1) + 3; s[7] = s[7] << 5 | s[7] >>> 27 } var a = this._invSubKeys = []; for (r = 0; r < 16; r++)a[r] = n[15 - r] }, encryptBlock: function (t, e) { this._doCryptBlock(t, e, this._subKeys) }, decryptBlock: function (t, e) { this._doCryptBlock(t, e, this._invSubKeys) }, _doCryptBlock: function (t, e, r) { this._lBlock = t[e], this._rBlock = t[e + 1], p.call(this, 4, 252645135), p.call(this, 16, 65535), _.call(this, 2, 858993459), _.call(this, 8, 16711935), p.call(this, 1, 1431655765); for (var i = 0; i < 16; i++) { for (var n = r[i], o = this._lBlock, s = this._rBlock, c = 0, a = 0; a < 8; a++)c |= d[a][((s ^ n[a]) & u[a]) >>> 0]; this._lBlock = s, this._rBlock = o ^ c } var h = this._lBlock; this._lBlock = this._rBlock, this._rBlock = h, p.call(this, 1, 1431655765), _.call(this, 8, 16711935), _.call(this, 2, 858993459), p.call(this, 16, 65535), p.call(this, 4, 252645135), t[e] = this._lBlock, t[e + 1] = this._rBlock }, keySize: 2, ivSize: 2, blockSize: 2 }); function p(t, e) { var r = (this._lBlock >>> t ^ this._rBlock) & e; this._rBlock ^= r, this._lBlock ^= r << t } function _(t, e) { var r = (this._rBlock >>> t ^ this._lBlock) & e; this._lBlock ^= r, this._rBlock ^= r << t } t.DES = r._createHelper(o); var s = i.TripleDES = r.extend({ _doReset: function () { var t = this._key.words; if (2 !== t.length && 4 !== t.length && t.length < 6) throw new Error("Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192."); var e = t.slice(0, 2), r = t.length < 4 ? t.slice(0, 2) : t.slice(2, 4), i = t.length < 6 ? t.slice(0, 2) : t.slice(4, 6); this._des1 = o.createEncryptor(n.create(e)), this._des2 = o.createEncryptor(n.create(r)), this._des3 = o.createEncryptor(n.create(i)) }, encryptBlock: function (t, e) { this._des1.encryptBlock(t, e), this._des2.decryptBlock(t, e), this._des3.encryptBlock(t, e) }, decryptBlock: function (t, e) { this._des3.decryptBlock(t, e), this._des2.encryptBlock(t, e), this._des1.decryptBlock(t, e) }, keySize: 6, ivSize: 2, blockSize: 2 }); t.TripleDES = r._createHelper(s) }(), function () { var t = bt, e = t.lib.StreamCipher, r = t.algo, i = r.RC4 = e.extend({ _doReset: function () { for (var t = this._key, e = t.words, r = t.sigBytes, i = this._S = [], n = 0; n < 256; n++)i[n] = n; n = 0; for (var o = 0; n < 256; n++) { var s = n % r, c = e[s >>> 2] >>> 24 - s % 4 * 8 & 255; o = (o + i[n] + c) % 256; var a = i[n]; i[n] = i[o], i[o] = a } this._i = this._j = 0 }, _doProcessBlock: function (t, e) { t[e] ^= n.call(this) }, keySize: 8, ivSize: 0 }); function n() { for (var t = this._S, e = this._i, r = this._j, i = 0, n = 0; n < 4; n++) { r = (r + t[e = (e + 1) % 256]) % 256; var o = t[e]; t[e] = t[r], t[r] = o, i |= t[(t[e] + t[r]) % 256] << 24 - 8 * n } return this._i = e, this._j = r, i } t.RC4 = e._createHelper(i); var o = r.RC4Drop = i.extend({ cfg: i.cfg.extend({ drop: 192 }), _doReset: function () { i._doReset.call(this); for (var t = this.cfg.drop; 0 < t; t--)n.call(this) } }); t.RC4Drop = e._createHelper(o) }(), bt.mode.CTRGladman = (ot = bt.lib.BlockCipherMode.extend(), st = ot.Encryptor = ot.extend({ processBlock: function (t, e) { var r, i = this._cipher, n = i.blockSize, o = this._iv, s = this._counter; o && (s = this._counter = o.slice(0), this._iv = void 0), 0 === ((r = s)[0] = Et(r[0])) && (r[1] = Et(r[1])); var c = s.slice(0); i.encryptBlock(c, 0); for (var a = 0; a < n; a++)t[e + a] ^= c[a] } }), ot.Decryptor = st, ot), at = (ct = bt).lib.StreamCipher, ht = ct.algo, lt = [], ft = [], dt = [], ut = ht.Rabbit = at.extend({ _doReset: function () { for (var t = this._key.words, e = this.cfg.iv, r = 0; r < 4; r++)t[r] = 16711935 & (t[r] << 8 | t[r] >>> 24) | 4278255360 & (t[r] << 24 | t[r] >>> 8); var i = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16], n = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]]; for (r = this._b = 0; r < 4; r++)Rt.call(this); for (r = 0; r < 8; r++)n[r] ^= i[r + 4 & 7]; if (e) { var o = e.words, s = o[0], c = o[1], a = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), h = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8), l = a >>> 16 | 4294901760 & h, f = h << 16 | 65535 & a; n[0] ^= a, n[1] ^= l, n[2] ^= h, n[3] ^= f, n[4] ^= a, n[5] ^= l, n[6] ^= h, n[7] ^= f; for (r = 0; r < 4; r++)Rt.call(this) } }, _doProcessBlock: function (t, e) { var r = this._X; Rt.call(this), lt[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, lt[1] = r[2] ^ r[7] >>> 16 ^ r[5] << 16, lt[2] = r[4] ^ r[1] >>> 16 ^ r[7] << 16, lt[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16; for (var i = 0; i < 4; i++)lt[i] = 16711935 & (lt[i] << 8 | lt[i] >>> 24) | 4278255360 & (lt[i] << 24 | lt[i] >>> 8), t[e + i] ^= lt[i] }, blockSize: 4, ivSize: 2 }), ct.Rabbit = at._createHelper(ut), bt.mode.CTR = (pt = bt.lib.BlockCipherMode.extend(), _t = pt.Encryptor = pt.extend({ processBlock: function (t, e) { var r = this._cipher, i = r.blockSize, n = this._iv, o = this._counter; n && (o = this._counter = n.slice(0), this._iv = void 0); var s = o.slice(0); r.encryptBlock(s, 0), o[i - 1] = o[i - 1] + 1 | 0; for (var c = 0; c < i; c++)t[e + c] ^= s[c] } }), pt.Decryptor = _t, pt), yt = (vt = bt).lib.StreamCipher, gt = vt.algo, Bt = [], wt = [], kt = [], St = gt.RabbitLegacy = yt.extend({ _doReset: function () { for (var t = this._key.words, e = this.cfg.iv, r = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16], i = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]], n = this._b = 0; n < 4; n++)Mt.call(this); for (n = 0; n < 8; n++)i[n] ^= r[n + 4 & 7]; if (e) { var o = e.words, s = o[0], c = o[1], a = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), h = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8), l = a >>> 16 | 4294901760 & h, f = h << 16 | 65535 & a; i[0] ^= a, i[1] ^= l, i[2] ^= h, i[3] ^= f, i[4] ^= a, i[5] ^= l, i[6] ^= h, i[7] ^= f; for (n = 0; n < 4; n++)Mt.call(this) } }, _doProcessBlock: function (t, e) { var r = this._X; Mt.call(this), Bt[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, Bt[1] = r[2] ^ r[7] >>> 16 ^ r[5] << 16, Bt[2] = r[4] ^ r[1] >>> 16 ^ r[7] << 16, Bt[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16; for (var i = 0; i < 4; i++)Bt[i] = 16711935 & (Bt[i] << 8 | Bt[i] >>> 24) | 4278255360 & (Bt[i] << 24 | Bt[i] >>> 8), t[e + i] ^= Bt[i] }, blockSize: 4, ivSize: 2 }), vt.RabbitLegacy = yt._createHelper(St), bt.pad.ZeroPadding = { pad: function (t, e) { var r = 4 * e; t.clamp(), t.sigBytes += r - (t.sigBytes % r || r) }, unpad: function (t) { var e = t.words, r = t.sigBytes - 1; for (r = t.sigBytes - 1; 0 <= r; r--)if (e[r >>> 2] >>> 24 - r % 4 * 8 & 255) { t.sigBytes = r + 1; break } } }, bt }); 25 | const $ = new Env('金手指阅读'); 26 | $.CryptoJS = CryptoJS; 27 | let status; 28 | status = $.getdata("jszstatus") || "1" 29 | let jszhdArr = [] 30 | let jszhd = $.isNode() ? (process.env.jszhd ? process.env.jszhd : "") : ($.getdata('jszhd') ? $.getdata('jszhd') : "") 31 | let jszhds = "" 32 | const logs = 0; 33 | var timestamp = (new Date()).valueOf(); 34 | !(async () => { 35 | if (typeof $request !== "undefined") { 36 | await jszck() 37 | } else { 38 | if (!$.isNode()) { 39 | for (let i = 1; i <= 100; i++) { 40 | const hd = $.getdata(`jszhd${i}`); 41 | if (hd) { 42 | jszhdArr.push(hd) 43 | } else { 44 | break; 45 | } 46 | } 47 | console.log(`------------- 共${jszhdArr.length}个账号-------------\n`) 48 | for (let i = 0; i < jszhdArr.length; i++) { 49 | if (jszhdArr[i]) { 50 | jszhd = jszhdArr[i]; 51 | $.index = i + 1; 52 | console.log(`\n开始【金手指阅读${$.index}】`) 53 | $.log("每日上限阅读50次 如已满 请明天再来") 54 | $.log("提现金额如果达标 将会自动提现") 55 | await myInfo() 56 | await task() 57 | await $.wait(1000) 58 | } 59 | } 60 | } else { 61 | if (process.env.jszhd && process.env.jszhd.indexOf('@') > -1) { 62 | jszhdArr = process.env.jszhd.split('@'); 63 | console.log(`您选择的是用"@"隔开\n`) 64 | } else { 65 | jszhds = [process.env.jszhd] 66 | }; 67 | Object.keys(jszhds).forEach((item) => { 68 | if (jszhds[item]) { 69 | jszhdArr.push(jszhds[item]) 70 | } 71 | }) 72 | console.log(`共${jszhdArr.length}个cookie`) 73 | for (let k = 0; k < jszhdArr.length; k++) { 74 | $.message = "" 75 | jszhd = jszhdArr[k] 76 | $.index = k + 1; 77 | console.log(`\n开始【金手指阅读${$.index}】`) 78 | $.log("每日上限阅读50次 如已满 请明天再来") 79 | $.log("提现金额如果达标 将会自动提现") 80 | await myInfo() 81 | await task() 82 | await $.wait(15000) 83 | } 84 | } 85 | } 86 | })() 87 | .catch((e) => $.logErr(e)) 88 | .finally(() => $.done()) 89 | 90 | 91 | function jszck() { 92 | if ($request.url.indexOf("myInfo") > -1) { 93 | const jszhd = JSON.stringify($request.headers) 94 | if (jszhd) $.setdata(jszhd, `jszhd${status}`) 95 | //const jszurl = JSON.stringify($request.url) 96 | //if(jszurl) $.setdata(jszurl,`jszurl${status}`) 97 | $.log(jszhd) 98 | //$.log(jszurl) 99 | $.msg($.name, "", '金手指' + `${status}` + '数据获取成功!') 100 | } 101 | } 102 | 103 | async function myInfo() { 104 | return new Promise((resolve) => { 105 | let plant6_url = { 106 | url: `http://apponlie.sahaj.cn/user/myInfo`, 107 | headers: JSON.parse(jszhd), 108 | //body: `{"channel_id":188}`, 109 | 110 | } 111 | $.get(plant6_url, async (error, response, data) => { 112 | //console.log(`${JSON.stringify(jszhd)}`) 113 | try { 114 | const result = JSON.parse(data) 115 | if (logs) $.log(data) 116 | 117 | if (result.code == 0) { 118 | $.goldNow = result.data.goldNow 119 | console.log(`\n余额:` + result.data.goldNow) 120 | num = $.goldNow / 4000 * 0.35 121 | 122 | $.log("可提金额:" + num.toFixed(1)) 123 | if ($.goldNow >= 4000) { 124 | $.log("\n=====开始提现=====") 125 | txnum = $.goldNow / 4000 * 0.35 126 | txnum = txnum.toFixed(1) 127 | var key = $.CryptoJS.enc.Utf8.parse("5kosc7jy2w0fxx3s") 128 | var plaintText = `{"moneyPick":${txnum}}` 129 | var js = $.CryptoJS.AES.encrypt(plaintText, key, { 130 | mode: $.CryptoJS.mode.ECB, 131 | padding: $.CryptoJS.pad.Pkcs7 132 | }) 133 | await $.wait(15000) 134 | await tx(js) 135 | } 136 | } else { 137 | console.log(`\n数据获取失败`) 138 | } 139 | } catch (e) { 140 | $.logErr(e, response); 141 | } finally { 142 | resolve(); 143 | } 144 | }) 145 | }) 146 | } 147 | async function taskSeq(type) { 148 | return new Promise((resolve) => { 149 | let plant6_url = { 150 | url: `http://apponlie.sahaj.cn/sign/todayAwardGain?taskSeq=${type}`, 151 | headers: JSON.parse(jszhd), 152 | //body: `{"channel_id":188}`, 153 | 154 | } 155 | $.post(plant6_url, async (error, response, data) => { 156 | //console.log(`${JSON.stringify(jszhd)}`) 157 | try { 158 | const result = JSON.parse(data) 159 | if (logs) $.log(data) 160 | if (result.code == 0) { 161 | console.log(`任务领取金币成功`) 162 | } else { 163 | console.log(`\n今日任务奖励已领取明日再来`) 164 | } 165 | } catch (e) { 166 | $.logErr(e, response); 167 | } finally { 168 | resolve(); 169 | } 170 | }) 171 | }) 172 | } 173 | async function task() { 174 | return new Promise((resolve) => { 175 | let plant6_url = { 176 | url: `http://apponlie.sahaj.cn/task/fetchTask?taskType=1`, 177 | headers: JSON.parse(jszhd), 178 | //body: `{"channel_id":188}`, 179 | 180 | } 181 | $.get(plant6_url, async (error, response, data) => { 182 | try { 183 | const result = JSON.parse(data) 184 | if (logs) $.log(data) 185 | 186 | if (result.code == 0) { 187 | taskId = result.data.taskId 188 | completeTodayCount = result.data.completeTodayCount 189 | completeTodayGold = result.data.completeTodayGold 190 | console.log(`今日获得金币:${completeTodayGold}\n阅读次数:${completeTodayCount}\n任务ID: ${taskId}`) 191 | 192 | if (completeTodayCount >= 25) { 193 | await taskSeq(1) 194 | } 195 | if (completeTodayCount >= 50) { 196 | await taskSeq(2) 197 | $.log("今日阅读次数已满 请明天再来") 198 | //$.log("\n=====开始提现=====") 199 | 200 | 201 | } else { 202 | var key = $.CryptoJS.enc.Utf8.parse("5kosc7jy2w0fxx3s") 203 | var plaintText = `{"taskId":${taskId}}` 204 | var js = $.CryptoJS.AES.encrypt(plaintText, key, { 205 | mode: $.CryptoJS.mode.ECB, 206 | padding: $.CryptoJS.pad.Pkcs7 207 | }) 208 | if (taskId !== null) { 209 | await $.wait(21000) 210 | await completeTask(js) 211 | } else { 212 | console.log('此账号已被限制阅读,请24小时后再跑脚本') 213 | } 214 | 215 | } 216 | } else { 217 | console.log(`\n数据获取失败或者 今日阅读次数已满 请明天再来`) 218 | } 219 | 220 | } catch (e) { 221 | $.logErr(e, response); 222 | } finally { 223 | resolve(); 224 | } 225 | }) 226 | }) 227 | } 228 | 229 | 230 | async function completeTask(body) { 231 | return new Promise((resolve) => { 232 | tk = JSON.parse(jszhd) 233 | token = tk.token 234 | let plant6_url = { 235 | url: `http://apponlie.sahaj.cn/task/completeTask`, 236 | headers: { 237 | "Content-Type": "application/json;charset=UTF-8", 238 | "Host": "apponlie.sahaj.cn", 239 | "Origin": "http://dd.e-zine.top", 240 | "Referer": "http://dd.e-zine.top", 241 | "token": token, 242 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.8(0x18000825) NetType/4G Language/zh_CN" 243 | }, 244 | body: `${body}`, 245 | } 246 | $.post(plant6_url, async (error, response, data) => { 247 | try { 248 | const result = JSON.parse(data) 249 | if (logs) $.log(data) 250 | if (result.code == 0) { 251 | console.log(`\n阅读完成 获得金币:${result.data.goldAward}`) 252 | } else { 253 | console.log(`\n数据获取失败`) 254 | } 255 | } catch (e) { 256 | $.logErr(e, response); 257 | } finally { 258 | resolve(); 259 | } 260 | }) 261 | }) 262 | } 263 | async function tx(body) { 264 | return new Promise((resolve) => { 265 | tk = JSON.parse(jszhd) 266 | token = tk.token 267 | 268 | let plant6_url = { 269 | url: `http://apponlie.sahaj.cn/user/pickAuto`, 270 | headers: { 271 | "Content-Type": "application/json;charset=UTF-8", 272 | "Host": "apponlie.sahaj.cn", 273 | "Origin": "http://dd.e-zine.top", 274 | "Referer": "http://dd.e-zine.top", 275 | 276 | "token": token, 277 | "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.8(0x18000825) NetType/4G Language/zh_CN" 278 | }, 279 | body: `${body}`, 280 | 281 | } 282 | $.post(plant6_url, async (error, response, data) => { 283 | try { 284 | const result = JSON.parse(data) 285 | if (logs) $.log(data) 286 | if (result.code == 0) { 287 | console.log(`\n=====提现成功=====`) 288 | } else { 289 | console.log(`\n数据获取失败`) 290 | } 291 | } catch (e) { 292 | $.logErr(e, response); 293 | } finally { 294 | resolve(); 295 | } 296 | }) 297 | }) 298 | } 299 | 300 | 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)} -------------------------------------------------------------------------------- /jsz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZCY01/daily_scripts/2cfe69e49f50a443fdbdc9d1cf43e46119ae59c7/jsz.png -------------------------------------------------------------------------------- /qx_rewrite.txt: -------------------------------------------------------------------------------- 1 | hostname = apponlie.sahaj.cn, api.m.jd.com 2 | 3 | http:\/\/apponlie\.sahaj\.cn\/user\/myInfo url script-request-header https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.js 4 | https:\/\/api\.m\.jd\.com\/api\?appid=siteppM&functionId=siteppM_priceskusPull url script-request-body https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtectRewrite.js -------------------------------------------------------------------------------- /zcy01.boxjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "zcy01.app.sub", 3 | "name": "zcy01脚本订阅", 4 | "author": "@zcy01", 5 | "icon": "https://avatars0.githubusercontent.com/u/15939669?s=460&u=54dc80f324bb7339961513959ddd7d8df1c0d0f8&v=4", 6 | "repo": "https://github.com/ZCY01/daily_scripts", 7 | "apps": [ 8 | { 9 | "id": "JD_PRICE_PROTECT", 10 | "name": "X东价格保护", 11 | "keys": ["jd_tokens"], 12 | "settings": [ 13 | { 14 | "id": "jdPriceProtectNotify", 15 | "name": "静默运行", 16 | "val": false, 17 | "type": "boolean", 18 | "desc": "运行X东价格保护脚本时不发出系统弹窗通知" 19 | }, 20 | { 21 | "id": "jd_tokens", 22 | "name": "京东token列表", 23 | "val": "", 24 | "type": "text", 25 | "desc": "token 列表,以@间隔分开" 26 | } 27 | ], 28 | "icons": [ 29 | "https://raw.githubusercontent.com/ZCY01/img/master/pricev1.png", 30 | "https://raw.githubusercontent.com/ZCY01/img/master/pricev1.png" 31 | ], 32 | "author": "@zcy01", 33 | "repo": "https://github.com/ZCY01/daily_scripts", 34 | "script": "https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jd/jd_priceProtect.js" 35 | }, 36 | { 37 | "id": "jsz", 38 | "name": "金银手指阅读", 39 | "keys": [ 40 | "jszhd1", 41 | "jszhd2", 42 | "jszhd3", 43 | "jszhd4", 44 | "jszhd5" 45 | ], 46 | "settings": [ 47 | { 48 | "id": "jszstatus", 49 | "name": "当前账号", 50 | "val": "1", 51 | "type": "number", 52 | "desc": "当前抓取ck记录的账号序号,如:1、2、3、4等" 53 | } 54 | ], 55 | "repo": "https://github.com/ZCY01/daily_scripts", 56 | "script": "https://raw.githubusercontent.com/ZCY01/daily_scripts/main/jsz.js" 57 | } 58 | ] 59 | } --------------------------------------------------------------------------------