├── .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 | }
--------------------------------------------------------------------------------