├── README.md ├── USER_AGENTS.js ├── addCookie.js ├── bindingAccount.js ├── checkCookie.js ├── clean_cart.js ├── continuous_limit_up.js ├── deleteInvalidUser.js ├── deleteLogs.js ├── deleteOverdueCookie.js ├── eleme_addCookie.js ├── en.js ├── huodong.js ├── huodonglingqu.js ├── jdCookie.js ├── jd_WskeyConvert.js ├── jd_addWskey.js ├── jd_base.js ├── jd_bean_change.js ├── jd_clean_car.js ├── jd_commandToUrl.js ├── jd_coupon_10_4.js ├── jd_coupon_15_8.js ├── jd_coupon_19_5.js ├── jd_coupon_19_8.js ├── jd_coupon_5_2.js ├── jd_delete_cookie.js ├── jd_month_bean_change.js ├── jd_rebate.js ├── jd_try.js ├── jd_tyt_order.js ├── jd_wabao.js ├── ks_addCookie.js ├── ks_base.js ├── ks_query.js ├── love.js ├── meituan_addCookie.js ├── myCookie.js ├── nyn.js ├── overdueNotify.js ├── package-lock.json ├── package.json ├── qBittorrentAdd.js ├── qBittorrentBase.js ├── qBittorrentMaindata.js ├── quantum-ark.js ├── quantum.js ├── quantum_bill.js ├── quantum_bill_statistical.js ├── quantum_custom_data_title_init.js ├── quantum_enen.js ├── quantum_env_forward.js ├── quantum_env_monitor_execution_tasks.js ├── quantum_env_monitor_sync.js ├── quantum_group_whole_ban_disable.js ├── quantum_group_whole_ban_enable.js ├── quantum_mine.js ├── quantum_myScore.js ├── quantum_passwod.js ├── quantum_passwod_query.js ├── quantum_setpassword.js ├── quantum_sn.js ├── quantum_subscribe.js ├── quantum_syncEnv.js ├── quantum_validate_sn.js ├── reping.js ├── saohua.js ├── sendNotify.js ├── sqlite.js ├── syncEnv.js ├── syncQQBotEnv.js ├── syncXdd.js ├── tasks.json ├── tgrj.js ├── ttl.js ├── ttl_charge.js ├── ttlck.js ├── update_ttl_token.js ├── weather.js ├── wxpusher.js ├── yiyan.js ├── 买家秀.js ├── 挖宝转单.js ├── 推一推转单.js └── 获取京豆详细.js /README.md: -------------------------------------------------------------------------------- 1 | ## 特别声明: 2 | 3 | * 本仓库涉仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 4 | 5 | * 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。 6 | 7 | * 作者对任何代码问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害。 8 | 9 | * 间接使用本仓库搭建的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 作者对于由此引起的任何隐私泄漏或其他后果概不负责。 10 | 11 | * 请勿将本项目的任何内容用于商业或非法目的,否则后果自负。 12 | 13 | * 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关代码。 14 | 15 | * 任何以任何方式查看此项目的人或直接或间接使用本仓库项目的任何脚本的使用者都应仔细阅读此声明。作者保留随时更改或补充此免责声明的权利。一旦使用并复制了任何本仓库项目的规则,则视为您已接受此免责声明。 16 | 17 | **您必须在下载后的24小时内从计算机或手机中完全删除以上内容.**
18 | 19 | > ***您使用或者复制了本仓库且本人制作的任何脚本,则视为`已接受`此声明,请仔细阅读*** 20 | 21 | tg : https://t.me/quantum_Scripts -------------------------------------------------------------------------------- /USER_AGENTS.js: -------------------------------------------------------------------------------- 1 | const USER_AGENTS = [ 2 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 3 | "jdapp;iPhone;10.0.2;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", 4 | "jdapp;android;10.0.2;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 5 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 6 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 7 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 8 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 9 | "jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 10 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 11 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 12 | "jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 13 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 14 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 15 | "jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 16 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 17 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 18 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36", 19 | "jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79", 20 | "jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 21 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 22 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36", 23 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 24 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 25 | "jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 26 | "jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 27 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 28 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 29 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 30 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 31 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 32 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 33 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 34 | "jdapp;iPhone;10.0.2;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", 35 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36", 36 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 37 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 38 | ] 39 | /** 40 | * 生成随机数字 41 | * @param {number} min 最小值(包含) 42 | * @param {number} max 最大值(不包含) 43 | */ 44 | function randomNumber(min = 0, max = 100) { 45 | return Math.min(Math.floor(min + Math.random() * (max - min)), max); 46 | } 47 | const USER_AGENT = USER_AGENTS[randomNumber(0, USER_AGENTS.length)]; 48 | 49 | module.exports = { 50 | USER_AGENT 51 | } 52 | -------------------------------------------------------------------------------- /bindingAccount.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 微信,QQ,公众号,web 相互绑定操作。 3 | * 如使用用户使用微信给微信机器人发送“绑定”,机器人回复一串绑定码。 4 | * 用户再使用QQ 将绑定发送给微信机器人,则这个QQ 和 微信的数据合并,并绑定为一个账号 5 | */ 6 | //const got = require('got'); 7 | const { 8 | sendNotify, api 9 | } = require('./quantum'); 10 | 11 | var user_id = process.env.user_id; 12 | 13 | //const api = got.extend({ 14 | // retry: { limit: 0 }, 15 | //}); 16 | 17 | !(async () => { 18 | try { 19 | var options = { 20 | url: process.env.serverAddres + "/api/User/GetBindingCode/" + user_id, 21 | method: 'get', 22 | headers: { 23 | Accept: 'text/plain', 24 | "Content-Type": "application/json-patch+json" 25 | } 26 | }; 27 | const body = await api(options).json(); 28 | if (body.Code == 200) { 29 | await sendNotify("[CQ:face,id=66]请使用其他通讯工具将以下发送代码给机器人\n" + body.Data); 30 | } else { 31 | await sendNotify("[CQ:face,id=67]" + JSON.stringify(body)); 32 | } 33 | } 34 | catch (e) { 35 | console.log(JSON.stringify(e)) 36 | } 37 | })().catch((e) => {console.log("脚本异常:" + e);}); 38 | -------------------------------------------------------------------------------- /checkCookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 可用环境变量 请通过环境变量添加量子变量 3 | * 4 | * NO_CK_NOTIFY ,说明未提交京东CK时提醒信息。 5 | * CK_Failure_Notify (检测到失效CK是否通知管理员,默认通知,不需要通知则配置为 false) 6 | * 7 | * */ 8 | 9 | const got = require('got'); 10 | 11 | if (!process.env.NO_CK_NOTIFY) { 12 | process.env.NO_CK_NOTIFY = "您没有提交CK。请按照教程获取CK发送给机器人。"; 13 | } 14 | /** 15 | * 16 | * 京东CK失效检查 17 | * 可用环境变量CK_Failure_Notify 失效CK是否通知管理员, 默认不通知,如果需要通知请设置量子变量CK_Failure_Notify,值为true 18 | * 19 | * */ 20 | let CK_Failure_Notify = process.env.CK_Failure_Notify == "true"; //失效CK是否通知管理员 21 | 22 | const { disableEnvs, sendNotify, getEnvs 23 | } = require('./quantum'); 24 | 25 | const api = got.extend({ 26 | retry: { limit: 0 }, 27 | }); 28 | 29 | let isLogin = true; 30 | 31 | !(async () => { 32 | var cookiesArr = await getEnvs("JD_COOKIE", null, 2); 33 | var managerNotifyMessage = ""; 34 | var overdueCKs = []; 35 | process.env.CommunicationType = ""; 36 | for (let i = 0; i < cookiesArr.length; i++) { 37 | if (cookiesArr[i].Value && cookiesArr[i].Enable) { 38 | cookie = cookiesArr[i].Value; 39 | var pt_pin = cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1] 40 | var UserName = (cookie.match(/pt_pin=([^; ]+)(?=;?)/) && pt_pin) 41 | var UserName2 = decodeURI(UserName); 42 | console.log(`开始检测【京东账号】${UserName2} ....\n`); 43 | try { 44 | await isLoginByX1a0He(); 45 | } catch (e) { 46 | console.log("检测CK出现异常," + cookie); 47 | console.log("异常信息," + JSON.stringify(e)); 48 | continue; 49 | } 50 | if (!isLogin) { 51 | console.log(cookie + "失效,自动禁用失效COOKIE!") 52 | if (cookiesArr[i].UserId && cookie.indexOf("app_open") == -1) { 53 | await sendNotify(`账号:${UserName2},失效了,请重新提交!`, false, cookiesArr[i].UserId); 54 | } 55 | if (CK_Failure_Notify) { 56 | managerNotifyMessage += `pt_pin:${pt_pin || '-'},账号名:${UserName2},过期!\n` 57 | } 58 | overdueCKs.push(cookie) 59 | } 60 | } 61 | } 62 | if (CK_Failure_Notify && managerNotifyMessage) { 63 | await sendNotify(managerNotifyMessage, true); 64 | } 65 | if (overdueCKs && overdueCKs.length > 0) { 66 | console.log("禁用失效返回结果:" + JSON.stringify(await disableEnvs(overdueCKs))); 67 | } else { 68 | console.log("无过期CK."); 69 | } 70 | })() 71 | .catch((e) => console.log(JSON.stringify(e))) 72 | 73 | async function isLoginByX1a0He() { 74 | const options = { 75 | url: 'https://plogin.m.jd.com/cgi-bin/ml/islogin', 76 | headers: { 77 | "Cookie": cookie, 78 | "referer": "https://h5.m.jd.com/", 79 | "User-Agent": "jdapp;iPhone;10.1.2;15.0;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 80 | }, 81 | method: 'get', 82 | } 83 | const body = await api(options).json(); 84 | isLogin = (body.islogin == "1"); 85 | } -------------------------------------------------------------------------------- /clean_cart.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 可用环境变量 请通过环境变量添加量子变量 3 | * 4 | * NO_CK_NOTIFY ,说明未提交京东CK时提醒信息。 5 | * 6 | * */ 7 | 8 | let jdSignUrl = 'https://jd.smiek.tk/jdcleancatr_21102717' // 算法url 9 | let cleancartRun = 'true' 10 | let cleancartProducts = '*@&@' 11 | const $ = new Env('清空购物车'); 12 | 13 | if (!process.env.NO_CK_NOTIFY) { 14 | process.env.NO_CK_NOTIFY = "您没有提交CK。请按照教程获取CK发送给机器人。"; 15 | } 16 | const { sendNotify } = require('./quantum'); 17 | let cookiesArr = [], cookie = ''; 18 | let EnableConc = process.env.EnableConc == "True"; //是否开启并发 19 | 20 | if (process.env.JD_COOKIE) { 21 | cookiesArr = process.env.JD_COOKIE.split("&"); 22 | } 23 | let productsArr = [] 24 | let cleancartProductsAll = [] 25 | message = '' 26 | for (let i of cleancartProducts && cleancartProducts.split('|-|')) { 27 | productsArr.push(i) 28 | } 29 | for (let i of cleancartProducts && cleancartProducts.split('|-|')) { 30 | productsArr.push(i) 31 | } 32 | for (let i in productsArr) { 33 | if (productsArr[i].indexOf('@&@') > -1) { 34 | let arr = productsArr[i].split('@&@') 35 | cleancartProductsAll[arr[0]] = arr[1].split(',') 36 | } 37 | } 38 | !(async () => { 39 | 40 | if (cookiesArr.length == 0) { 41 | console.log("没有Cookies信息结束任务。"); 42 | if (process.env.NO_CK_NOTIFY) { 43 | await sendNotify(process.env.NO_CK_NOTIFY); 44 | } 45 | return; 46 | } 47 | if (cleancartRun !== 'true') { 48 | console.log('脚本停止\n请添加环境变量[gua_cleancart_Run]为"true"') 49 | return 50 | } 51 | if (!cleancartProducts) { 52 | console.log('脚本停止\n请添加环境变量[gua_cleancart_products]\n清空商品\n内容规则看脚本文件') 53 | return 54 | } 55 | $.out = false 56 | for (let i = 0; i < cookiesArr.length; i++) { 57 | cookie = cookiesArr[i]; 58 | if (cookie) { 59 | $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) 60 | $.index = i + 1; 61 | console.log(`\n\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`); 62 | if (cleancartProductsAll[$.UserName]) { 63 | $.cleancartProductsArr = cleancartProductsAll[$.UserName] 64 | } else if (cleancartProductsAll["*"]) { 65 | $.cleancartProductsArr = cleancartProductsAll["*"] 66 | } else $.cleancartProductsArr = false 67 | if ($.cleancartProductsArr) console.log($.cleancartProductsArr) 68 | await run(); 69 | if ($.out) break 70 | } 71 | } 72 | if (message) { 73 | $.msg($.name, ``, `${message}`); 74 | if ($.isNode()) { 75 | await sendNotify(message); 76 | } 77 | } 78 | })() 79 | .catch((e) => $.logErr(e)) 80 | .finally(() => $.done()) 81 | 82 | async function run() { 83 | try { 84 | let msg = '' 85 | let signBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":true,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","adid":""}` 86 | let body = await jdSign('cartClearQuery', signBody) 87 | if ($.out) return 88 | if (!body) { 89 | console.log('获取不到算法') 90 | return 91 | } 92 | let data = await jdApi('cartClearQuery', body) 93 | let res = $.toObj(data, data); 94 | if (typeof res == 'object' && res) { 95 | if (res.resultCode == 0) { 96 | if (!res.clearCartInfo || !res.subTitle) { 97 | msg += `${res.mainTitle}\n` 98 | console.log(res.mainTitle) 99 | } else { 100 | let num = 0 101 | if (res.subTitle) { 102 | num = res.subTitle.match(/共(\d+)件商品/).length > 0 && res.subTitle.match(/共(\d+)件商品/)[1] || 0 103 | msg += res.subTitle + "\n" 104 | console.log(res.subTitle) 105 | } 106 | // console.log(`共${num}件商品`) 107 | if (num != 0) { 108 | let operations = [] 109 | let operNum = 0 110 | for (let a of res.clearCartInfo || {}) { 111 | // console.log(a.groupName) 112 | // if(a.groupName.indexOf('7天前加入购物车') > -1){ 113 | for (let s of a.groupDetails || []) { 114 | if (toSDS(s.name)) { 115 | // console.log(s.unusable,s.skuUuid,s.name) 116 | operNum += s.clearSkus && s.clearSkus.length || 1; 117 | operations.push({ 118 | "itemType": s.itemType + "", 119 | "suitType": s.suitType, 120 | "skuUuid": s.skuUuid + "", 121 | "itemId": s.itemId || s.skuId, 122 | "useUuid": typeof s.useUuid !== 'undefined' && s.useUuid || false 123 | }) 124 | } 125 | } 126 | // } 127 | } 128 | console.log(`准备清空${operNum}件商品`) 129 | if (operations.length == 0) { 130 | console.log(`清空${operNum}件商品|没有找到要清空的商品`) 131 | msg += `清空${operNum}件商品|没有找到要清空的商品\n` 132 | } else { 133 | let clearBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":false,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","operations":${$.toStr(operations, operations)},"adid":"","coord_type":"0"}` 134 | clearBody = await jdSign('cartClearRemove', clearBody) 135 | if ($.out) return 136 | if (!clearBody) { 137 | console.log('获取不到算法') 138 | } else { 139 | let clearData = await jdApi('cartClearRemove', clearBody) 140 | let clearRes = $.toObj(clearData, clearData); 141 | if (typeof clearRes == 'object') { 142 | if (clearRes.resultCode == 0) { 143 | msg += `清空${operNum}件商品成功\n` 144 | console.log(`清空${operNum}件商品|✅\n`) 145 | } else if (clearRes.mainTitle) { 146 | msg += `清空${operNum}件商品|${clearRes.mainTitle}\n` 147 | console.log(`清空${operNum}件商品|${clearRes.mainTitle}\n`) 148 | } else { 149 | msg += `清空${operNum}件商品失败\n` 150 | console.log(`清空${operNum}件商品|❌\n`) 151 | console.log(clearData) 152 | } 153 | } else { 154 | msg += `清空${operNum}件商品|❌\n` 155 | console.log(`清空${operNum}件商品|❌\n`) 156 | console.log(clearData) 157 | } 158 | } 159 | } 160 | } else if (res.mainTitle) { 161 | msg += `${res.mainTitle}\n` 162 | console.log(res.mainTitle) 163 | } else { 164 | msg += `未识别到购物车有商品\n` 165 | console.log(data) 166 | } 167 | } 168 | } else { 169 | console.log(data) 170 | } 171 | } else { 172 | console.log(data) 173 | } 174 | if (msg) { 175 | message += `账号${$.index}:${$.nickName || $.UserName}\n${msg}\n` 176 | } 177 | await $.wait(parseInt(Math.random() * 2000 + 2000, 10)) 178 | } catch (e) { 179 | console.log(e) 180 | } 181 | } 182 | function toSDS(name) { 183 | let res = true 184 | if ($.cleancartProductsArr === false) return false 185 | for (let t of $.cleancartProductsArr || []) { 186 | if (t && name.indexOf(t) > -1 || t == '不清空') { 187 | res = false 188 | break 189 | } 190 | } 191 | return res 192 | } 193 | function jdApi(functionId, body) { 194 | if (!functionId || !body) return 195 | return new Promise(resolve => { 196 | $.post(taskPostUrl(`/client.action?functionId=${functionId}`, body), async (err, resp, data) => { 197 | try { 198 | if (err) { 199 | console.log(`${$.toStr(err)}`) 200 | console.log(`${$.name} API请求失败,请检查网路重试`) 201 | } else { 202 | // console.log(data) 203 | let res = $.toObj(data, data); 204 | if (typeof res == 'object') { 205 | if (res.mainTitle) console.log(res.mainTitle) 206 | if (res.resultCode == 0) { 207 | resolve(res); 208 | } 209 | } 210 | } 211 | } catch (e) { 212 | $.logErr(e, resp) 213 | } finally { 214 | resolve(''); 215 | } 216 | }) 217 | }) 218 | } 219 | 220 | function jdSign(fn, body) { 221 | let sign = '' 222 | let flag = false 223 | try { 224 | const fs = require('fs'); 225 | if (fs.existsSync('./gua_encryption_sign.js')) { 226 | const encryptionSign = require('./gua_encryption_sign'); 227 | sign = encryptionSign.getSign(fn, body) 228 | } else { 229 | flag = true 230 | } 231 | sign = sign.data && sign.data.sign && sign.data.sign || '' 232 | } catch (e) { 233 | flag = true 234 | } 235 | if (!flag) return sign 236 | if (!jdSignUrl.match(/^https?:\/\//)) { 237 | console.log('请填写算法url') 238 | $.out = true 239 | return '' 240 | } 241 | return new Promise((resolve) => { 242 | let url = { 243 | url: jdSignUrl, 244 | body: `{"fn":"${fn}","body":${body}}`, 245 | followRedirect: false, 246 | headers: { 247 | 'Accept': '*/*', 248 | "accept-encoding": "gzip, deflate, br", 249 | 'Content-Type': 'application/json', 250 | }, 251 | timeout: 30000 252 | } 253 | $.post(url, async (err, resp, data) => { 254 | try { 255 | // console.log(data) 256 | let res = $.toObj(data, data) 257 | if (typeof res === 'object' && res) { 258 | if (res.code && res.code == 200 && res.msg == "ok" && res.data) { 259 | if (res.data.sign) sign = res.data.sign || '' 260 | if (sign != '') resolve(sign) 261 | } else { 262 | console.log(data) 263 | } 264 | } else { 265 | console.log(data) 266 | } 267 | } catch (e) { 268 | $.logErr(e, resp); 269 | } finally { 270 | resolve('') 271 | } 272 | }) 273 | }) 274 | } 275 | 276 | 277 | function taskPostUrl(url, body) { 278 | return { 279 | url: `https://api.m.jd.com${url}`, 280 | body: body, 281 | headers: { 282 | "Accept": "*/*", 283 | "Accept-Language": "zh-cn", 284 | "Accept-Encoding": "gzip, deflate, br", 285 | "Connection": "keep-alive", 286 | "Content-Type": "application/x-www-form-urlencoded", 287 | 'Cookie': `${cookie}`, 288 | "Host": "api.m.jd.com", 289 | "User-Agent": "JD4iPhone/167853 (iPhone; iOS; Scale/2.00)", 290 | } 291 | } 292 | } 293 | 294 | 295 | // prettier-ignore 296 | function Env(t, e) { "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0); class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, i) => { s.call(this, t, (t, s, r) => { t ? i(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const i = this.getdata(t); if (i) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, i) => e(i)) }) } runScript(t, e) { return new Promise(s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [o, h] = i.split("@"), n = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(n, (t, e, i) => s(i)) }).catch(t => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; try { return JSON.parse(this.fs.readFileSync(i)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of i) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } getdata(t) { let e = this.getval(t); if (/^@/.test(t)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : ""; if (r) try { const t = JSON.parse(r); e = t ? this.lodash_get(t, i, "") : e } catch (t) { e = "" } } return e } setdata(t, e) { let s = !1; if (/^@/.test(e)) { const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e), o = this.getval(i), h = i ? "null" === o ? null : o || "{}" : "{}"; try { const e = JSON.parse(h); this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), i) } catch (e) { const o = {}; this.lodash_set(o, r, t), s = this.setval(JSON.stringify(o), i) } } else s = this.setval(t, e); return s } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null } setval(t, e) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null } initGotEnv(t) { this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.post(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) }); else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: s, ...i } = t; this.got.post(s, i).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) }) } } time(t, e = null) { const s = e ? new Date(e) : new Date; let i = { "M+": s.getMonth() + 1, "d+": s.getDate(), "H+": s.getHours(), "m+": s.getMinutes(), "s+": s.getSeconds(), "q+": Math.floor((s.getMonth() + 3) / 3), S: s.getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length))); return t } msg(e = t, s = "", i = "", r) { const o = t => { if (!t) return t; if ("string" == typeof t) return this.isLoon() ? t : this.isQuanX() ? { "open-url": t } : this.isSurge() ? { url: t } : void 0; if ("object" == typeof t) { if (this.isLoon()) { let e = t.openUrl || t.url || t["open-url"], s = t.mediaUrl || t["media-url"]; return { openUrl: e, mediaUrl: s } } if (this.isQuanX()) { let e = t["open-url"] || t.url || t.openUrl, s = t["media-url"] || t.mediaUrl; return { "open-url": e, "media-url": s } } if (this.isSurge()) { let e = t.url || t.openUrl || t["open-url"]; return { url: e } } } }; if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } 297 | 298 | 299 | -------------------------------------------------------------------------------- /continuous_limit_up.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 连扳天梯 3 | * */ 4 | 5 | const got = require('got'); 6 | const { 7 | sendNotify 8 | } = require('./quantum'); 9 | 10 | const moment = require('moment'); 11 | 12 | const api = got.extend({ 13 | retry: { limit: 0 }, 14 | }); 15 | 16 | //触发指令 17 | var command = process.env.command; 18 | 19 | !(async () => { 20 | var pattern = /[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])/ 21 | var date = ""; 22 | if (pattern.test(command)) { 23 | date = command.match(/[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])/)[0] 24 | } else { 25 | date = moment().format("YYYYMMDD"); 26 | //let d = new Date() 27 | //var m = (d.getMonth() + 1); 28 | //var day = d.getDate(); 29 | //date = d.getFullYear().toString() + (m > 9 ? m.toString() : "0" + m) + (day > 9 ? day.toString() : "0" + day) 30 | } 31 | console.log(date) 32 | if (moment(date, 'YYYYMMDD') > moment()) { 33 | await sendNotify("无法预知未来!"); 34 | return; 35 | } 36 | var week = moment(date, 'YYYYMMDD').weekday(); 37 | console.log(week); 38 | if (week == 6) { 39 | await sendNotify("周六休市!") 40 | return; 41 | } 42 | if (week == 0) { 43 | await sendNotify("周日休市!") 44 | return; 45 | } 46 | 47 | var config = { 48 | method: 'get', 49 | url: 'https://data.10jqka.com.cn/dataapi/limit_up/continuous_limit_up?filter=HS,GEM2STAR&date=' + date 50 | }; 51 | 52 | await api(config).then(async response => { 53 | console.log(response.body) 54 | var body = JSON.parse(response.body) 55 | if (body.status_code == 0) { 56 | if (body.data && body.data.length > 0) { 57 | var message = ""; 58 | for (var i = 0; i < body.data.length; i++) { 59 | message += `高度:${body.data[i].height} 60 | ` 61 | for (var x = 0; x < body.data[i].code_list.length; x++) { 62 | message += `${body.data[i].code_list[x].code} ${body.data[i].code_list[x].name},` 63 | } 64 | message = message.trim(",") + "\r"; 65 | } 66 | await sendNotify("连板天梯" + "\n" + "当前查询日期:" + date + "\n" + message); 67 | } else { 68 | await sendNotify("接口未返回数据。") 69 | } 70 | } else { 71 | console.log(response.body); 72 | } 73 | }); 74 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /deleteInvalidUser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 删除所有无效用户信息 (无用户环境变量,积分为0的用户) 4 | * 5 | **/ 6 | 7 | const { 8 | sendNotify, getUser, getEnvs, deleteUser 9 | } = require('./quantum'); 10 | 11 | !(async () => { 12 | console.log("获取所有用户信息"); 13 | var users = await getUser(); 14 | users = users.Data; 15 | console.log(`获取用户数量${users.length}个。`); 16 | console.log("获取所有用户环境变量"); 17 | var envs = await getEnvs("", "", 2); 18 | console.log(`获取环境变量数量${envs.length}个。`); 19 | for (var i = 0; i < envs.length; i++) { 20 | users = users.filter((y) => y.Id != envs[i].UserId && y.MaxEnvCount == 0); 21 | } 22 | console.log(`待清理用户数量${users.length}个。`); 23 | var ids = []; 24 | for (var u = 0; u < users.length; u++) { 25 | ids.push(users[u].Id); 26 | } 27 | if (ids.length > 0) { 28 | var t = await deleteUser(ids); 29 | await sendNotify("清理过期用户" + ids.length + "个"); 30 | } else { 31 | await sendNotify("没有可清理的用户。") 32 | } 33 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /deleteLogs.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 定时删除量子日志 3 | * 4 | * 支持环境变量:DELETE_LOG_DAY 指定删除 多少天前的CK ,不指定默认3天。 5 | * 6 | */ 7 | 8 | const { 9 | api, serverAddres 10 | } = require('./quantum'); 11 | 12 | const moment = require('moment'); 13 | 14 | var day = process.env.DELETE_LOG_DAY || 3; 15 | try { 16 | day = parseInt(day); 17 | } 18 | catch { 19 | day = 3; 20 | } 21 | !(async () => { 22 | var start = "2022-01-01 1:00:00" 23 | var end = moment().add(-day, 'day').format('YYYY-MM-DD HH:00:00') 24 | const body = await api({ 25 | url: serverAddres + 'api/Logs', 26 | method: 'get', 27 | searchParams: { 28 | PageIndex: 1, 29 | PageSize: 999999, 30 | StartTime: start, 31 | EndTime: end 32 | }, 33 | headers: { 34 | "Content-Type": "application/json" 35 | } 36 | }).json(); 37 | var logs = body.Data.Data; 38 | console.log("获取日志" + logs.length + "条"); 39 | var logIds = [] 40 | for (var i = 0; i < logs.length; i++) { 41 | logIds.push(logs[i].Id); 42 | } 43 | if (logs.length > 0) { 44 | const body = await api({ 45 | url: serverAddres + 'api/logs', 46 | body: JSON.stringify(logIds), 47 | method: 'delete', 48 | headers: { 49 | "Content-Type": "application/json" 50 | } 51 | }).json(); 52 | console.log("删除日志返回结果:" + JSON.stringify(body)); 53 | } 54 | })().catch((e) => { console.log("脚本异常:" + e); }); -------------------------------------------------------------------------------- /deleteOverdueCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 删除过期账号提醒 3 | * 可配置环境变量名称:OVERDUE_DEL_NOTIFY_MSG (删除过期提醒文字) 4 | */ 5 | const { 6 | sendNotify, allEnvs, syncEnv, deleteEnvByIds 7 | } = require('./quantum'); 8 | 9 | var message = process.env.OVERDUE_DEL_NOTIFY_MSG || "您的以下京东账号已经过期,管理员已删除:"; 10 | 11 | !(async () => { 12 | var envs = await allEnvs("JD_COOKIE", 2, false, ""); 13 | console.log("获取过期环境变量" + envs.length + "个"); 14 | var ts = []; 15 | var ids = []; 16 | for (var i = 0; i < envs.length; i++) { 17 | ids.push(envs[i].Id); 18 | if (envs[i].UserId) { 19 | if (ts.length > 0 && ts.filter((t) => t.UserId === envs[i].UserId).length > 0) { 20 | ts.filter((t) => t.UserId === envs[i].UserId)[0].List.push(envs[i].UserRemark) 21 | } else { 22 | ts.push({ 23 | UserId: envs[i].UserId, 24 | List: [envs[i].UserRemark] 25 | }); 26 | } 27 | } 28 | } 29 | if (ids.length > 0) { 30 | var body1 = await deleteEnvByIds(ids); 31 | console.log("删除过期CK结果:" + JSON.stringify(body1)); 32 | var body2 = await syncEnv(); 33 | console.log("单项CK同步结果:" + JSON.stringify(body2)); 34 | sendNotify(`删除过期CK${envs.length}个。`, true); 35 | console.log("开始给韭菜发通知了。"); 36 | if (ts.length > 0) { 37 | process.env.CommunicationType = ""; 38 | for (var i = 0; i < ts.length; i++) { 39 | await sendNotify(message + "\n" + ts[i].List.join(","), false, ts[i].UserId); 40 | } 41 | } 42 | } else { 43 | await sendNotify("没有过期的账号。", true); 44 | } 45 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /eleme_addCookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 用户提交饿了么CK 4 | * ADD_ELEMECOOKIE_USE_SCORE 添加饿了么 CK需要多少积分。(设置为0 或者 不设置时则表示不需要积分。) 5 | * 6 | * */ 7 | 8 | 9 | let ADD_ELEMECOOKIE_USE_SCORE = (process.env.ADD_ELEMECOOKIE_USE_SCORE || 0) * 1; 10 | const { sendNotify, allEnvs, addEnvs, getUserInfo, updateUserInfo } = require('./quantum'); 11 | 12 | let user_id = process.env.user_id; //用户id 13 | let command = process.env.command; 14 | 15 | !(async () => { 16 | var USERID = null; 17 | try { 18 | command.match(/USERID=([^; ]+)(?=;?)/)[1] 19 | } catch { 20 | console.log("提交的信息中获取USERID失败!"); 21 | } 22 | console.log("USERID:" + USERID); 23 | var c = { 24 | Name: 'elmCookie', 25 | Enable: true, 26 | Value: command, 27 | UserRemark: USERID || "", 28 | UserId: user_id, 29 | EnvType: 2 30 | }; 31 | if (!USERID) { 32 | console.log("没有USERID参数,直接做新增处理."); 33 | } else { 34 | var data2 = await allEnvs(USERID, 2); 35 | if (data2.length > 0) { 36 | console.log("重复的饿了么用户CK ,更新操作"); 37 | c.Id = data2[0].Id; 38 | c.Weight = data2[0].Weight; 39 | c.UserRemark = data2[0].UserRemark; 40 | c.Remark = data2[0].Remark; 41 | } 42 | } 43 | if (ADD_ELEMECOOKIE_USE_SCORE > 0) { 44 | var user = (await getUserInfo()) || {}; 45 | user.MaxEnvCount -= ADD_ELEMECOOKIE_USE_SCORE; 46 | if (ADD_ELEMECOOKIE_USE_SCORE > 0 && user.MaxEnvCount < 0) { 47 | await sendNotify(`该操作需要${ADD_ELEMECOOKIE_USE_SCORE}积分 48 | 您当前积分剩余${user.MaxEnvCount + ADD_ELEMECOOKIE_USE_SCORE}`); 49 | return; 50 | } 51 | console.log(`扣除用户积分:${ADD_ELEMECOOKIE_USE_SCORE},剩余积分:${user.MaxEnvCount}`) 52 | await updateUserInfo(user); 53 | } 54 | console.log('开始提交快手饿了么到量子数据库'); 55 | var data = await addEnvs([c]); 56 | console.log('提交结果:' + JSON.stringify(data)); 57 | await sendNotify( 58 | '饿了么提交成功!\n扣除积分:' + 59 | ADD_ELEMECOOKIE_USE_SCORE + 60 | '\n用户ID:' + (USERID || '') 61 | ); 62 | })().catch((e) => { console.log("脚本异常:" + e); }); -------------------------------------------------------------------------------- /en.js: -------------------------------------------------------------------------------- 1 | // 每日英语 2 | 3 | const got = require('got'); 4 | const api = got.extend({ 5 | retry: { limit: 0 }, 6 | }); 7 | const { 8 | sendNotify 9 | } = require('./quantum'); 10 | 11 | 12 | !(async () => { 13 | await api({ 14 | url: 'https://api.vvhan.com/api/en', 15 | headers: { 16 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 17 | }, 18 | method: 'get', 19 | }).then(async response => { 20 | var body = JSON.parse(response.body) 21 | var message = body.data.zh + "\n" + body.data.en; 22 | await sendNotify(message) 23 | }); 24 | })().catch((e) => {console.log("脚本异常:" + e);}); 25 | -------------------------------------------------------------------------------- /jdCookie.js: -------------------------------------------------------------------------------- 1 | let CookieJDs = [] 2 | // 判断环境变量里面是否有京东ck 3 | if (process.env.JD_COOKIE) { 4 | 5 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 6 | CookieJDs = process.env.JD_COOKIE.replace(/[\r\n]/g, "").split('&'); 7 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 8 | CookieJDs = process.env.JD_COOKIE.split('\n'); 9 | } else { 10 | CookieJDs = [process.env.JD_COOKIE]; 11 | } 12 | } 13 | CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] 14 | 15 | console.log("CK数量:" + CookieJDs.length) 16 | 17 | for (let i = 0; i < CookieJDs.length; i++) { 18 | if (!CookieJDs[i].match(/pt_pin=(.+?);/) || !CookieJDs[i].match(/pt_key=(.+?);/)) console.log(`\n提示:京东cookie 【${CookieJDs[i]}】填写不规范,可能会影响部分脚本正常使用。正确格式为: pt_key=xxx;pt_pin=xxx;(分号;不可少)\n`); 19 | const index = (i + 1 === 1) ? '' : (i + 1); 20 | exports['CookieJD' + index] = CookieJDs[i].trim(); 21 | } -------------------------------------------------------------------------------- /jd_WskeyConvert.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 定时转换wskey 4 | * 转换依赖脚本 jd_base.js , 如需修改转换服务请自行修改。 5 | * 建议每12小时转换一次。 6 | * 表达式,请自行调整时间,否则同一时间转换太多会黑IP 7 | * 8 | * 0 12 0/12 * * ? 9 | * 10 | * 支持 量子变量 WskeyConvertService wskey 转换服务,不指定默认使用小菜鸡的服务。 11 | * 自建服务教程:https://blog.csdn.net/h394047464/article/details/126680864?spm=1001.2014.3001.5502 12 | * 13 | * */ 14 | 15 | const { sendNotify, getCustomData, updateCustomData, sleep } = require('./quantum'); 16 | const { convertWskey, addOrUpdateJDCookie } = require('./jd_base'); 17 | const { 18 | syncEnvs 19 | } = require('./quantum_syncEnv'); 20 | 21 | /** 22 | * customDataType 该值请勿随意更改 23 | * */ 24 | const customDataType = "wskey_record"; 25 | var successCount = 0; 26 | var overdueCount = 0; 27 | var failedCount = 0; 28 | !(async () => { 29 | var datas = await getWskey(); 30 | var m1 = `开始转换,有效wskey:${datas.length}个。` 31 | console.log(m1) 32 | await sendNotify(m1, true) 33 | for (var i = 0; i < datas.length; i++) { 34 | // 3秒转一个,防止过快转换失败了 35 | await sleep(3000); 36 | var data = datas[i]; 37 | var wskey = `pin=${data.Data5};wskey=${data.Data4};` 38 | var convertResult = await convertWskey(wskey); 39 | if (!convertResult.success) { 40 | failedCount += 1; 41 | console.log(`wskey:【${wskey}】,转换失败。`) 42 | continue; 43 | } 44 | if (convertResult.data.indexOf("pt_key=app_open") < 0) { 45 | var msg = `wskey失效了,账户昵称:【${data.Data6}】,pin:【${data.Data5}】` 46 | console.log(msg); 47 | await sendNotify(msg, false, data.Data1); 48 | console.log("开始禁用失效wskey。") 49 | data.Data7 = "否"; 50 | overdueCount += 1; 51 | try { 52 | await updateCustomData(data); 53 | } catch { 54 | console.log("禁用wskey出现了异常。") 55 | } 56 | } else { 57 | successCount += 1; 58 | console.log("开始处理提交JDCOOKIE:" + convertResult.data) 59 | await addOrUpdateJDCookie(convertResult.data, data.Data1, data.Data6); 60 | } 61 | } 62 | await sendNotify(`wskey转换完成,成功:${successCount},失效:${overdueCount},转换失败:${failedCount}。`, true) 63 | console.log("开始同步环境变量到青龙。") 64 | await syncEnvs(true); 65 | })().catch((e) => { 66 | console.log("执行脚本出现异常了。"); 67 | console.log(e); 68 | }); 69 | 70 | /** 71 | * 获取有效的wskey信息 72 | * */ 73 | async function getWskey() { 74 | var datas = await getCustomData(customDataType, null, null, { 75 | Data7: "是" 76 | }); 77 | return datas; 78 | } -------------------------------------------------------------------------------- /jd_addWskey.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 用户提交京东wskey 3 | * 4 | * wskey将存放在 自定义数据表中, 5 | * 请通过数据管理查看信息 6 | * */ 7 | const { sendNotify, addOrUpdateCustomDataTitle, addCustomData, getCustomData, updateCustomData } = require('./quantum'); 8 | 9 | const { convertWskey, GetJDUserInfoUnion, addOrUpdateJDCookie } = require('./jd_base'); 10 | 11 | /** 12 | * customDataType 该值请勿随意更改 13 | * */ 14 | const customDataType = "wskey_record"; 15 | 16 | let user_id = process.env.user_id; //用户id 17 | let command = process.env.command; 18 | 19 | let CommunicationUserId = process.env.CommunicationUserId; //通讯工具id qq。wx 20 | let CommunicationUserName = process.env.CommunicationUserName; //通讯工具昵称 21 | 22 | let key = ''; 23 | let pin = ''; 24 | 25 | 26 | !(async () => { 27 | let wskeys = command.split("&"); 28 | addCustomDataTile(); 29 | for (var i = 0; i < wskeys.length; i++) { 30 | var wskey = wskeys[i]+";"; 31 | if (!wskey) { 32 | continue; 33 | } 34 | if (wskey.indexOf("pin") < 0) { 35 | console.log(` 提交的信息【${wskey}】缺少pin信息。`) 36 | continue; 37 | } 38 | wskey = wskey.replace(/[\r\n]/g, ""); 39 | try { 40 | key = wskey.match(/wskey=([^; ]+)(?=;?)/)[1] 41 | pin = wskey.match(/pin=([^; ]+)(?=;?)/)[1] 42 | } 43 | catch (e) { 44 | console.log("wskey:【 " + wskey + "】格式不对,已跳过"); 45 | continue; 46 | } 47 | var reg = new RegExp("[\\u4E00-\\u9FFF]+", "g"); 48 | if (reg.test(pin)) { 49 | pin = encodeURI(pin); 50 | } 51 | wskey = `wskey=${key};pin=${pin};` 52 | console.log("开始将wskey转换成app_open格式:" + wskey) 53 | var convertResult = await convertWskey(wskey); 54 | 55 | if (!convertResult.success || convertResult.data.indexOf("pt_key=app_open") < 0) { 56 | console.log("wskey转换失败了,给韭菜发送通知。"); 57 | await sendNotify(`wskey提交失败:【${wskey}】`); 58 | continue; 59 | } 60 | var cookie = convertResult.data; 61 | console.log("开始获取京东账户基本信息"); 62 | var userInfo = await GetJDUserInfoUnion(cookie) 63 | console.log("获取京东账户基本信息结果:" + JSON.stringify(userInfo)); 64 | if (!userInfo || !userInfo.data || userInfo.retcode != "0") { 65 | sendNotify(`wskey似乎失效了:【${wskey}】`); 66 | continue; 67 | } 68 | var msg = `提交成功辣! 69 | 账号昵称:${userInfo.data.userInfo.baseInfo.nickname} 70 | 用户等级:${userInfo.data.userInfo.baseInfo.levelName} 71 | 剩余京豆:${userInfo.data.assetInfo.beanNum} 72 | 剩余红包:${userInfo.data.assetInfo.redBalance}`; 73 | await sendNotify(msg); 74 | await addOrUpdateWskey(key, pin, userInfo.data.userInfo.baseInfo.nickname) 75 | console.log("开始处理提交JDCOOKIE:" + convertResult.data) 76 | await addOrUpdateJDCookie(convertResult.data, user_id, userInfo.data.userInfo.baseInfo.nickname); 77 | } 78 | })().catch((e) => {console.log("脚本异常:" + e);}); 79 | 80 | /** 81 | * 添加或更新wskey 到自定义数据表中 82 | * @param {any} wskey key 83 | * @param {any} pin pin 84 | * @param {any} nickname 京东账号昵称 85 | */ 86 | async function addOrUpdateWskey(wskey, pin, nickname) { 87 | console.log("开始提交wskey到自定义数据中"); 88 | var customDatas = await getCustomData(customDataType, null, null, { Data5: pin }) 89 | var customData = { 90 | Type: customDataType, 91 | Data1: user_id, 92 | Data2: CommunicationUserName, 93 | Data3: CommunicationUserId, 94 | Data4: wskey, 95 | Data5: pin, 96 | Data6: nickname, 97 | Data7: "是" 98 | } 99 | if (customDatas && customDatas.length > 0) { 100 | console.log("更新wskey信息到自定义数据中"); 101 | customData.Id = customDatas[0].Id; 102 | await updateCustomData(customData); 103 | } 104 | else { 105 | var result = await addCustomData([customData]); 106 | console.log("新增wskey信息到自定义数据中,提交结果" + JSON.stringify(result)); 107 | } 108 | } 109 | 110 | /** 111 | * 添加或者更新自定义数据标题 112 | * */ 113 | function addCustomDataTile() { 114 | addOrUpdateCustomDataTitle({ 115 | Type: customDataType, 116 | TypeName: "京东wskey", 117 | Title1: "用户ID", 118 | Title2: "用户昵称", 119 | Title3: "QQ/WX", 120 | Title4: "wskey", 121 | Title5: "pin", 122 | Title6: "账号名称", 123 | Title7: "是否有效" 124 | }) 125 | } -------------------------------------------------------------------------------- /jd_base.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 京东基础方法脚本 3 | * */ 4 | 5 | const got = require('got'); 6 | if (!process.env.NO_CK_NOTIFY) { 7 | process.env.NO_CK_NOTIFY = "您没有提交CK。请按照教程获取CK发送给机器人。"; 8 | } 9 | 10 | const { disableEnvs, sendNotify, addEnvs, allEnvs 11 | } = require('./quantum'); 12 | 13 | const api = got.extend({ 14 | retry: { limit: 0 }, 15 | }); 16 | 17 | 18 | /** 19 | * 检查京东ck登录状态 20 | * @param {any} jdCookie 21 | */ 22 | module.exports.islogin = islogin; 23 | 24 | async function islogin(jdCookie) { 25 | try { 26 | const options = { 27 | url: 'https://plogin.m.jd.com/cgi-bin/ml/islogin', 28 | headers: { 29 | "Cookie": jdCookie, 30 | "referer": "https://h5.m.jd.com/", 31 | "User-Agent": "jdapp;iPhone;10.1.2;15.0;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 32 | }, 33 | method: 'get', 34 | } 35 | const body = await api(options).json(); 36 | return (body.islogin == "1"); 37 | } catch (e) { 38 | console.log(" https://plogin.m.jd.com/cgi-bin/ml/islogin 验证登录状态请求异常。"); 39 | } 40 | } 41 | 42 | /** 43 | * 将wskey 转换成 app_open 44 | * wskey 转换服务可以替换成其他的,兼容标准的服务 45 | * 或者根据自己服务调整此处代码即可 46 | * @param {any} wskey 47 | */ 48 | module.exports.convertWskey = async (wskey) => { 49 | var convertServiceUrl = "http://114.215.146.116:8015/api/open/ConvertWskey"; 50 | if (process.env.WskeyConvertService) { 51 | convertServiceUrl = process.env.WskeyConvertService; 52 | console.log("使用自定义的Wskey转换服务!"); 53 | } 54 | 55 | console.log("Wskey 转换服务地址:" + convertServiceUrl); 56 | try { 57 | const options = { 58 | url: convertServiceUrl, 59 | headers: { 60 | 'Content-Type': 'application/json' 61 | }, 62 | method: 'post', 63 | body: JSON.stringify([wskey]) 64 | } 65 | const body = await api(options).json(); 66 | console.log("wskey 转换结果:" + JSON.stringify(body)); 67 | if (body.success) { 68 | return { 69 | success: true, 70 | data: body.data[0] 71 | } 72 | } else { 73 | console.log("wskey 转换失败,可能是黑IP了"); 74 | } 75 | } 76 | catch (e) { 77 | console.log("wskey转换 app_open出现了异常!"); 78 | } 79 | return { 80 | success: false 81 | }; 82 | } 83 | 84 | /** 85 | * 获取账号基本信息 86 | * @param {any} jdCookie 87 | */ 88 | module.exports.GetJDUserInfoUnion = async (jdCookie) => { 89 | const options = { 90 | url: "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion", 91 | headers: { 92 | Host: "me-api.jd.com", 93 | Accept: "*/*", 94 | Connection: "keep-alive", 95 | Cookie: jdCookie, 96 | "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", 97 | "Accept-Language": "zh-cn", 98 | "Referer": "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&", 99 | "Accept-Encoding": "gzip, deflate, br" 100 | } 101 | } 102 | const body = await api(options).json(); 103 | return body; 104 | } 105 | 106 | 107 | /** 108 | * 添加或者更新jdCookie pt_key 格式 109 | * @param {any} jdCookie 京东ck 110 | * @param {any} user_id 用户id 111 | * @param {any} nickname 京东账号昵称 112 | */ 113 | module.exports.addOrUpdateJDCookie = async (jdCookie, user_id, nickname) => { 114 | var pt_key = jdCookie.match(/pt_key=([^; ]+)(?=;?)/)[1] 115 | var pt_pin = jdCookie.match(/pt_pin=([^; ]+)(?=;?)/)[1] 116 | if (!pt_key || !pt_pin) { 117 | return; 118 | } 119 | var c = { 120 | Name: "JD_COOKIE", 121 | Enable: true, 122 | Value: `pt_key=${pt_key};pt_pin=${pt_pin};`, 123 | UserRemark: nickname, 124 | UserId: user_id, 125 | EnvType: 2 126 | } 127 | var data2 = await allEnvs(pt_pin, 2); 128 | if (data2.length > 0) { 129 | console.log("pt_pin存在,尝试更新JD_COOKIE"); 130 | c.Id = data2[0].Id; 131 | c.Weight = data2[0].Weight; 132 | c.UserRemark = nickname; 133 | c.QLPanelEnvs = data2[0].QLPanelEnvs; 134 | c.Remark = data2[0].Remark; 135 | 136 | if (process.env.UPDATE_COOKIE_NOTIFY) { 137 | await sendNotify(`Cookie更新通知 138 | 用户ID:${process.env.CommunicationUserId} 139 | 用户昵称:${process.env.CommunicationUserName || ""} 140 | 京东昵称:${nickname}`, true) 141 | } 142 | } else { 143 | console.log("全新韭菜上线拉!"); 144 | c.Id = null; 145 | if (process.env.ADD_COOKIE_NOTIFY) { 146 | await sendNotify(`Cookie新增通知 147 | 用户ID:${process.env.CommunicationUserId} 148 | 用户昵称:${process.env.CommunicationUserName || ""} 149 | 京东昵称:${nickname}`, true) 150 | } 151 | } 152 | var data = await addEnvs([c]); 153 | console.log("环境变量提交结果:" + JSON.stringify(data)); 154 | } 155 | 156 | /** 157 | * 京东口令 158 | * @param {any} command 159 | */ 160 | module.exports.jCommand = async (command) => { 161 | var result = null; 162 | try { 163 | var options = { 164 | 'method': 'POST', 165 | 'url': 'http://119.3.233.105:8080/JDSign/jCommand', 166 | 'headers': { 167 | 'Content-Type': 'application/x-www-form-urlencoded' 168 | }, 169 | body: JSON.stringify({ 170 | code: command 171 | }) 172 | }; 173 | var response = await api(options); 174 | console.log(`${command} 175 | 解析结果:${response.body}`); 176 | return JSON.parse(response.body); 177 | } catch (e) { 178 | console.log("转链失败:" + JSON.stringify(e)); 179 | } 180 | return result; 181 | } 182 | 183 | 184 | /** 185 | * 自定义卡密天数 186 | * key 能不重复 187 | * name 为提示标题 188 | * value 为天数 189 | * */ 190 | 191 | module.exports.sntypes = [{ 192 | "name": "1天", 193 | "value": 1, 194 | "key": "1" 195 | }, { 196 | "name": "7天", 197 | "value": 7, 198 | "key": "2" 199 | }, { 200 | "name": "1月", 201 | "value": 30, 202 | "key": "3" 203 | }, { 204 | "name": "1年", 205 | "value": 365, 206 | "key": "4" 207 | }, { 208 | "name": "永久", 209 | "value": 99 * 365, 210 | "key": "5" 211 | }]; -------------------------------------------------------------------------------- /jd_commandToUrl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 口令转换链接 4 | * 使用第三方接口完成 5 | * 6 | **/ 7 | const got = require('got'); 8 | const { 9 | sendNotify 10 | } = require('./quantum'); 11 | const { 12 | jCommand 13 | } = require('./jd_base'); 14 | const api = got.extend({ 15 | retry: { limit: 0 }, 16 | }); 17 | !(async () => { 18 | var result = await jCommand(process.env.jd_command); 19 | if (!result) { 20 | await sendNotify("解析异常了!"); 21 | } else { 22 | console.log(result) 23 | await sendNotify([{ 24 | MessageType: 2, 25 | msg: result.data.img 26 | }, { 27 | 28 | MessageType: 1, 29 | msg: `标题:${result.data.title} 30 | 用户:${result.data.userName} 31 | 地址:${result.data.jumpUrl}` 32 | }]); 33 | } 34 | })().catch((e) => {console.log("脚本异常:" + e);}); 35 | -------------------------------------------------------------------------------- /jd_coupon_10_4.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 10-4优惠券 4 | * 环境变量:coupon_10_4_pin, 参与抢券的ck pt_pin,多个用 & 分割 5 | * 6 | * */ 7 | const { 8 | getEnvs 9 | } = require('./quantum'); 10 | 11 | const moment = require('moment'); 12 | const got = require('got'); 13 | 14 | var apiUrl = "https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&client=wh5&body=%7B%22activityId%22%3A%22vN4YuYXS1mPse7yeVPRq4TNvCMR%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D440A3074D8054F656466EE989DEF40E4DE6342B45A4AB5D48889C7B31DD4E52ED6EB7F5C0174376325C72F3C5D85C6AA_bingo%2CroleId%3DB1781EF2C2537FB0E4A5B23AC99529A4_bingo%2CstrengthenKey%3D19F512DCD8EE34ABE9C4FB4A92C2F42AA1447D26BB4D8F8F1ADD929FC07559FC_bingo%22%7D"; 15 | 16 | const api = got.extend({ 17 | retry: { limit: 0 }, 18 | }); 19 | let coupon_10_4_pin = process.env.coupon_10_4_pin; 20 | !(async () => { 21 | console.log("当前时间:" + moment().format("YYYY-MM-DD HH:mm:ss.fff")); 22 | if (!coupon_10_4_pin) { 23 | console.log("未提供 coupon_10_4_pin 环境变量。"); 24 | return; 25 | } 26 | var envs = await getEnvs("JD_COOKIE", null, 2); 27 | var coupon_10_4_pins = coupon_10_4_pin.split("&"); 28 | for (var i = 0; i < coupon_10_4_pins.length; i++) { 29 | var pin = coupon_10_4_pins[i]; 30 | var c = envs.filter((e) => e.Value.indexOf("pt_pin=" + pin) > -1)[0]; 31 | if (c) { 32 | const nm = { 33 | url: apiUrl, 34 | headers: { 35 | "Cookie": c.Value, 36 | }, 37 | method: "get" 38 | } 39 | await api(nm).then(async response => { 40 | console.log(pin + ":" + JSON.parse(response.body).subCodeMsg); 41 | }); 42 | } else { 43 | console.log(`未找到pt_pin为:${pin}的JD_COOKIE`); 44 | } 45 | } 46 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /jd_coupon_15_8.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 15-8优惠券 4 | * 环境变量:coupon_15_8_pin, 参与抢券的ck pt_pin,多个用 & 分割 5 | * 6 | **/ 7 | const { 8 | getEnvs 9 | } = require('./quantum'); 10 | 11 | const moment = require('moment'); 12 | const got = require('got'); 13 | 14 | var apiUrl = "https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&client=wh5&body=%7B%22activityId%22%3A%223H885vA4sQj6ctYzzPVix4iiYN2P%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D79F6166D6F9BB11C9ED9696C6E30D9C1D392C277F9B79AB559E9868E1EE0910308189D1B2C9883FC5560EDA0CD002985_bingo%2CroleId%3DC6DCE94E14C0BEE454EA964509F4B26C_bingo%2CstrengthenKey%3D19F512DCD8EE34ABE9C4FB4A92C2F42A3E4F1D227F16BC3264497B20B54D33F5_bingo%22%7D"; 15 | const api = got.extend({ 16 | retry: { limit: 0 }, 17 | }); 18 | let coupon_15_8_pin = process.env.coupon_15_8_pin; 19 | !(async () => { 20 | console.log("当前时间:" + moment().format("YYYY-MM-DD HH:mm:ss.fff")); 21 | if (!coupon_15_8_pin) { 22 | console.log("未提供 coupon_15_8_pin 环境变量。"); 23 | return; 24 | } 25 | var envs = await getEnvs("JD_COOKIE", null, 2); 26 | var coupon_15_8_pins = coupon_15_8_pin.split("&"); 27 | for (var i = 0; i < coupon_15_8_pins.length; i++) { 28 | var pin = coupon_15_8_pins[i]; 29 | var c = envs.filter((e) => e.Value.indexOf("pt_pin=" + pin) > -1)[0]; 30 | if (c) { 31 | const nm = { 32 | url: apiUrl, 33 | headers: { 34 | "Cookie": c.Value, 35 | }, 36 | method: "get" 37 | } 38 | await api(nm).then(async response => { 39 | console.log(pin + ":" + JSON.parse(response.body).subCodeMsg); 40 | }); 41 | } else { 42 | console.log(`未找到pt_pin为:${pin}的JD_COOKIE`); 43 | } 44 | } 45 | })().catch((e) => {console.log("脚本异常:" + e);}); 46 | -------------------------------------------------------------------------------- /jd_coupon_19_5.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 19-5优惠券 4 | * 环境变量:coupon_19_5_pin, 参与抢券的ck pt_pin,多个用 & 分割 5 | * 6 | * */ 7 | const { 8 | getEnvs 9 | } = require('./quantum'); 10 | 11 | const moment = require('moment'); 12 | const got = require('got'); 13 | 14 | var apiUrl = "https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&client=wh5&body=%7B%22activityId%22%3A%22vN4YuYXS1mPse7yeVPRq4TNvCMR%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D13CE10DEFD75052795FFEBDA31379B65F2F22C26C5C5F0E3B8A128B978111DBB7A5BB54EBDB1373E0C35F5DEB9B67446_bingo%2CroleId%3DADAC87F1EC515A647C5357A175E3519B_bingo%2CstrengthenKey%3D19F512DCD8EE34ABE9C4FB4A92C2F42AAEFAF03A89700155D56A825B54D6675D_bingo%22%7D"; 15 | 16 | const api = got.extend({ 17 | retry: { limit: 0 }, 18 | }); 19 | 20 | let coupon_19_5_pin = process.env.coupon_19_5_pin; 21 | !(async () => { 22 | console.log("当前时间:" + moment().format("YYYY-MM-DD HH:mm:ss.fff")); 23 | if (!coupon_19_5_pin) { 24 | console.log("未提供 coupon_19_5_pin 环境变量。"); 25 | return; 26 | } 27 | var envs = await getEnvs("JD_COOKIE", null, 2); 28 | var coupon_19_5_pins = coupon_19_5_pin.split("&"); 29 | for (var i = 0; i < coupon_19_5_pins.length; i++) { 30 | var pin = coupon_19_5_pins[i]; 31 | var c = envs.filter((e) => e.Value.indexOf("pt_pin=" + pin) > -1)[0]; 32 | if (c) { 33 | const nm = { 34 | url: apiUrl, 35 | headers: { 36 | "Cookie": c.Value, 37 | }, 38 | method: "get" 39 | } 40 | await api(nm).then(async response => { 41 | console.log(pin + ":" + JSON.parse(response.body).subCodeMsg); 42 | }); 43 | } else { 44 | console.log(`未找到pt_pin为:${pin}的JD_COOKIE`); 45 | } 46 | } 47 | })().catch((e) => {console.log("脚本异常:" + e);}); 48 | -------------------------------------------------------------------------------- /jd_coupon_19_8.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 19-8优惠券 4 | * 环境变量:coupon_19_8_pin, 参与抢券的ck pt_pin,多个用 & 分割 5 | * 6 | * */ 7 | const { 8 | getEnvs 9 | } = require('./quantum'); 10 | 11 | const moment = require('moment'); 12 | const got = require('got'); 13 | 14 | var apiUrl = "https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&client=wh5&body=%7B%22activityId%22%3A%223H885vA4sQj6ctYzzPVix4iiYN2P%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D79F6166D6F9BB11C9ED9696C6E30D9C1D392C277F9B79AB559E9868E1EE0910308189D1B2C9883FC5560EDA0CD002985_bingo%2CroleId%3DC6DCE94E14C0BEE454EA964509F4B26C_bingo%2CstrengthenKey%3D19F512DCD8EE34ABE9C4FB4A92C2F42A3E4F1D227F16BC3264497B20B54D33F5_bingo%22%7D"; 15 | 16 | const api = got.extend({ 17 | retry: { limit: 0 }, 18 | }); 19 | 20 | let coupon_19_8_pin = process.env.coupon_19_8_pin; 21 | !(async () => { 22 | 23 | console.log("当前时间:" + moment().format("YYYY-MM-DD HH:mm:ss.fff")); 24 | if (!coupon_19_8_pin) { 25 | console.log("未提供 coupon_19_8_pin 环境变量。"); 26 | return; 27 | } 28 | var envs = await getEnvs("JD_COOKIE", null, 2); 29 | var coupon_19_8_pins = coupon_19_8_pin.split("&"); 30 | for (var i = 0; i < coupon_19_8_pins.length; i++) { 31 | var c = envs.filter((e) => e.Value.indexOf("pt_pin=" + coupon_19_8_pins[i]) > -1)[0]; 32 | if (c) { 33 | const nm = { 34 | url: apiUrl, 35 | headers: { 36 | "Cookie": c.Value, 37 | }, 38 | method: "get" 39 | } 40 | await api(nm).then(async response => { 41 | console.log(coupon_19_8_pins[i] + ":" + JSON.parse(response.body).subCodeMsg); 42 | }); 43 | } else { 44 | console.log(`未找到pt_pin为:${coupon_19_8_pins[i]}的JD_COOKIE`); 45 | } 46 | } 47 | })().catch((e) => {console.log("脚本异常:" + e);}); 48 | 49 | -------------------------------------------------------------------------------- /jd_coupon_5_2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 5-2优惠券 4 | * 环境变量:coupon_5_2_pin, 参与抢券的ck pt_pin,多个用 & 分割 5 | * 6 | * */ 7 | const { 8 | getEnvs 9 | } = require('./quantum'); 10 | 11 | const moment = require('moment'); 12 | const got = require('got'); 13 | 14 | var apiUrl = "https://api.m.jd.com/client.action?functionId=newBabelAwardCollection&client=wh5&body=%7B%22activityId%22%3A%223H885vA4sQj6ctYzzPVix4iiYN2P%22%2C%22scene%22%3A%221%22%2C%22args%22%3A%22key%3D64616D6FB9F745A939AEBE59B5331E98A02F7F3EBE7E2A8C6BC39900A5FB433C383A3885B1901C0036F186675FDB6B40_bingo%2CroleId%3D454CDE7D149EE1DA28FDC5C9AD4D3FF6_bingo%2CstrengthenKey%3D19F512DCD8EE34ABE9C4FB4A92C2F42AD9B1F4308CB2085C9DAE51ED67591679_bingo%22%7D"; 15 | 16 | const api = got.extend({ 17 | retry: { limit: 0 }, 18 | }); 19 | 20 | let coupon_5_2_pin = process.env.coupon_5_2_pin; 21 | !(async () => { 22 | console.log("当前时间:" + moment().format("YYYY-MM-DD HH:mm:ss.fff")); 23 | if (!coupon_5_2_pin) { 24 | console.log("未提供 coupon_5_2_pin 环境变量。"); 25 | return; 26 | } 27 | var envs = await getEnvs("JD_COOKIE", null, 2); 28 | var coupon_5_2_pins = coupon_5_2_pin.split("&"); 29 | for (var i = 0; i < coupon_5_2_pins.length; i++) { 30 | var pin = coupon_5_2_pins[i]; 31 | var c = envs.filter((e) => e.Value.indexOf("pt_pin=" + pin) > -1)[0]; 32 | if (c) { 33 | const nm = { 34 | url: apiUrl, 35 | headers: { 36 | "Cookie": c.Value, 37 | }, 38 | method: "get" 39 | } 40 | await api(nm).then(async response => { 41 | console.log(pin + ":" + JSON.parse(response.body).subCodeMsg); 42 | }); 43 | } else { 44 | console.log(`未找到pt_pin为:${pin}的JD_COOKIE`); 45 | } 46 | } 47 | })().catch((e) => {console.log("脚本异常:" + e);}); 48 | -------------------------------------------------------------------------------- /jd_delete_cookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 跳车脚本 4 | * 可用指令:删除账号 或者 删除账号 xxxxx 5 | * 6 | **/ 7 | const { 8 | sendNotify, getEnvs, deleteEnvByIds 9 | } = require('./quantum'); 10 | 11 | let CommunicationUserId = process.env.CommunicationUserId; 12 | let user_id = process.env.user_id; //用户id 13 | let command = process.env.command; 14 | !(async () => { 15 | if (!user_id) { 16 | return; 17 | } 18 | var p = ""; 19 | if (command.split(" ").length == 2) { 20 | p = command.split(" ")[1]; 21 | } 22 | var cks = await getEnvs("JD_COOKIE", p, 2, user_id) 23 | console.log("CK个数:" + cks.length); 24 | await sendNotify("删除账号成功!\n感谢使用,有缘再见!") 25 | if (cks.length == 0) { 26 | return; 27 | } else { 28 | var ids = []; 29 | console.log("删除CK信息:"); 30 | cks.forEach((item) => { 31 | console.log(item.Value); 32 | ids.push(item.Id); 33 | }); 34 | await deleteEnvByIds(ids) 35 | await sendNotify("有人删除账号跑路了,用户:" + CommunicationUserId, true); 36 | } 37 | })().catch((e) => { 38 | console.log(e); 39 | }); -------------------------------------------------------------------------------- /jd_rebate.js: -------------------------------------------------------------------------------- 1 | // 京粉返利 2 | /* 3 | * 支持环境变量 4 | * 5 | * JFID 京粉 联盟id(必填) 6 | * JFPTPIN 京粉转码ck的 pt_pin 部分 (必填) 7 | * REBATE_QQGROUP 转链后转发QQ群(支持多个,或者用&符号隔开) 8 | * REBATE_WXGROUP 转链后转发微信群(支持多个,或者用&符号隔开) 9 | * 10 | */ 11 | 12 | const got = require('got'); 13 | const { 14 | sendNotify, getEnvs, sleep 15 | } = require('./quantum'); 16 | 17 | const api = got.extend({ 18 | retry: { limit: 0 }, 19 | }); 20 | 21 | let jd_rebat = process.env.jd_rebat; 22 | let JFID = process.env.JFID; 23 | 24 | let JFPTPIN = process.env.JFPTPIN; 25 | let QQGROUP = process.env.REBATE_QQGROUP; 26 | let WXGROUP = process.env.REBATE_WXGROUP; 27 | 28 | if (!JFID) { 29 | console.log("没有填写JFID环境变量"); 30 | return; 31 | } 32 | 33 | if (!JFPTPIN) { 34 | console.log("没有填写JFPTPIN环境变量"); 35 | return; 36 | } 37 | 38 | !(async () => { 39 | var jdcookie = await getEnvs("JD_COOKIE", JFPTPIN) 40 | if (jdcookie.length === 0) { 41 | console.log(`没有找到${JFPTPIN}的ck`); 42 | return; 43 | } 44 | jdcookie = jdcookie[0]; 45 | if (!jdcookie || !jdcookie.Enable) { 46 | console.log(`${JFPTPIN}的ck似乎无效了`); 47 | await sendNotify("返利CK失效", true); 48 | return; 49 | } 50 | while (jd_rebat.indexOf("[CQ:image") > -1) { 51 | var e = jd_rebat.indexOf("]") 52 | jd_rebat = jd_rebat.substr(e + 1, jd_rebat.length - e) 53 | } 54 | jd_rebat = jd_rebat.split("?")[0]; 55 | console.log("返利商品信息:" + jd_rebat); 56 | var b = JSON.stringify({ 57 | funName: "getSuperClickUrl", 58 | param: { 59 | materialInfo: jd_rebat 60 | }, 61 | unionId: JFID 62 | }); 63 | try { 64 | await api({ 65 | url: `https://api.m.jd.com/api?functionId=ConvertSuperLink&appid=u&body=${b}&loginType=2`, 66 | headers: { 67 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 68 | Cookie: jdcookie.Value 69 | }, 70 | method: 'get', 71 | }).then(async response => { 72 | var body = JSON.parse(response.body); 73 | if (body.code === 200) { 74 | console.log(body.data.formatContext); 75 | if (QQGROUP) { 76 | console.log("转链转发QQ群:" + QQGROUP); 77 | for (var i = 0; i < QQGROUP.split("&").length; i++) { 78 | await sendNotify(body.data.formatContext, false, "NULL", QQGROUP.split("&")[i], 1) 79 | } 80 | } else { 81 | console.log("未指定转发QQ群"); 82 | } 83 | if (WXGROUP) { 84 | console.log("转链转发微信群:" + WXGROUP); 85 | for (var i = 0; i < WXGROUP.split("&").length; i++) { 86 | await sendNotify(body.data.formatContext, false, "NULL", WXGROUP.split("&")[i], 4) 87 | } 88 | } else { 89 | console.log("未指定转发微信群"); 90 | } 91 | console.log("回复转链结果"); 92 | await sendNotify(body.data.formatContext); 93 | } else { 94 | console.log(response.body); 95 | } 96 | }); 97 | } catch (e) { 98 | console.log("请求京东接口异常"); 99 | console.log(JSON.stringify(e)); 100 | } 101 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /jd_tyt_order.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 推一推 4 | * 入口 极速版 赚金币 5 | * 6 | * TYT_USE_SCORE 推一推需要多少积分。(设置为0或者不设置时则表示不需要积分。) 7 | * TYT_MAX_THREAD 推一推最大线程数 (不设置默认5) 实际运行时因为同一时间请求量大,计算请求时差的原因可能会大于该数量。 8 | * 9 | **/ 10 | const got = require('got'); 11 | const { 12 | sendNotify, getUserInfo, updateUserInfo, addOrUpdateCustomDataTitle, addCustomData, getCustomData, sleep, getEnvs, updateCustomData, deleteEnvByIds 13 | } = require('./quantum'); 14 | const api = got.extend({ 15 | retry: { limit: 0 }, 16 | }); 17 | const moment = require('moment'); 18 | 19 | let tyt_url = process.env.tyt_url; 20 | let TYT_USE_SCORE = (process.env.TYT_USE_SCORE || 0) * 1; 21 | 22 | let customerDataType = "tyt_order_record"; 23 | let CommunicationUserId = process.env.CommunicationUserId; 24 | let CommunicationUserName = process.env.CommunicationUserName; 25 | let ManagerQQ = process.env.ManagerQQ; 26 | let group_id = process.env.group_id; //群组ID 27 | let max_thread = (process.env.TYT_MAX_THREAD || 5) * 1; // 同时运行推一推的线程数量 28 | 29 | 30 | let tytCustomerDataType = "tyt_record"; 31 | 32 | let status = 0; 33 | 34 | !(async () => { 35 | 36 | var packetId = tyt_url.match(/packetId=([^&]+)(?=&?)/)[1] 37 | console.log("packetId:" + packetId); 38 | if (!packetId) { 39 | console.log(tyt_url + "中未取到packetId"); 40 | return; 41 | } 42 | var startTime = moment().format("YYYY-MM-DD") 43 | var endTime = moment().format("YYYY-MM-DD HH:mm:ss"); 44 | var ss = await getCustomData(customerDataType, startTime, endTime, { Data6: process.env.user_id }); 45 | 46 | if (ss && ss.length > 0 && ss.filter((t) => t.Data1.indexOf(packetId) > -1).length > 0) { 47 | var msg = "重复的推一推任务,已自动跳过。"; 48 | console.log(msg); 49 | await sendNotify(msg) 50 | return; 51 | } 52 | 53 | 54 | var m = ""; 55 | if (TYT_USE_SCORE > 0) { 56 | user = await getUserInfo(); 57 | user.MaxEnvCount = user.MaxEnvCount - TYT_USE_SCORE; 58 | if (user.MaxEnvCount < 0) { 59 | await sendNotify(`推一推需要${TYT_USE_SCORE}积分,当前积分:${(user.MaxEnvCount + TYT_USE_SCORE)}`); 60 | return false; 61 | } else { 62 | await updateUserInfo(user); 63 | } 64 | m = `\n本次扣除${TYT_USE_SCORE}个积分。剩余积分:${user.MaxEnvCount}`; 65 | } 66 | 67 | 68 | await addOrUpdateCustomDataTitle({ 69 | Type: tytCustomerDataType, 70 | TypeName: "推一推JD_COOKIE记录", 71 | Title1: "PIN", 72 | Title2: "CK状态", 73 | Title3: "更新时间", 74 | Title4: "说明" 75 | }); 76 | await addOrUpdateCustomDataTitle({ 77 | Type: customerDataType, 78 | TypeName: "推一推订单记录", 79 | Title1: "助力链接", 80 | Title2: "推一推状态", 81 | Title3: "QQ/WX", 82 | Title4: "昵称", 83 | Title5: "任务编号", 84 | Title6: "用户Id" 85 | }) 86 | var tytOrder = { 87 | Type: customerDataType, 88 | Data1: tyt_url, 89 | Data2: "未开始", 90 | Data3: CommunicationUserId, 91 | Data4: CommunicationUserName, 92 | Data6: process.env.user_id 93 | } 94 | var no = (ss.length + 1) 95 | tytOrder.Data5 = no; 96 | var sss = await addCustomData([tytOrder]) 97 | tytOrder = sss[0]; 98 | var cookies = await getEnvs("JD_COOKIE", null, 2); 99 | cookies = cookies.filter((t) => t.Enable).sort(function () { 100 | return Math.random() - 0.5; 101 | }); 102 | console.log("cookie数量:" + cookies.length); 103 | var result = ""; 104 | var packetId = tytOrder.Data1.match(/packetId=([^&]+)(?=&?)/)[1] 105 | await sendNotify("开始推一推任务:" + tytOrder.Data5 + m) 106 | 107 | var currentTaskCount = 0; 108 | 109 | do { 110 | var currentTask = await getCustomData(customerDataType, startTime, endTime, { Data2: "运行中" }); 111 | currentTaskCount = currentTask.length; 112 | if (currentTaskCount > max_thread) 113 | await sleep(30 * 1000 + (Math.floor((Math.random() * 10000) + 1000))); 114 | } while (currentTaskCount > max_thread) 115 | 116 | tytOrder.Data2 = "进行中"; 117 | await updateCustomData(tytOrder); 118 | 119 | 120 | for (var index = 0; index <= cookies.length; index++) { 121 | try { 122 | var cookie = cookies[index]; 123 | if (!cookie || !cookie.Value) { 124 | continue; 125 | } 126 | var c = cookie.Value.replace(/[\r\n]/g, ""); 127 | var pt_pin = c.match(/pin=([^; ]+)(?=;?)/)[1]; 128 | if (!pt_pin) { 129 | continue; 130 | } 131 | var sss = await getCustomData(tytCustomerDataType, startTime, null, { 132 | Data1: pt_pin 133 | }); 134 | if (sss.length > 0) { 135 | continue; 136 | } 137 | ckStatus = 0; 138 | await help(packetId, c, cookie.Id); 139 | if (status == 1) { 140 | result = "任务编号:" + tytOrder.Data5 + ",推一推完成。" 141 | break; 142 | } 143 | if (status == 2) { 144 | result = "任务编号:" + tytOrder.Data5 + ",帮砍排队放弃吧。" 145 | break; 146 | } 147 | if (status == 3) { 148 | result = "任务编号:" + tytOrder.Data5 + ",推一推链接过期了。" 149 | break; 150 | } 151 | } catch (e) { 152 | 153 | } 154 | await sleep(3000 + (Math.floor((Math.random() * 1500) + 500))); 155 | } 156 | if (!result) { 157 | result = "任务编号:" + tytOrder.Data5 + ",推不完了!"; 158 | } 159 | console.log(result); 160 | tytOrder.Data2 = result; 161 | await updateCustomData(tytOrder); 162 | await sendNotify(result + "\n用户:" + CommunicationUserName, true); 163 | if (tytOrder.Data3 != ManagerQQ) { 164 | await sendNotify(result, false, process.env.user_id); 165 | } 166 | })().catch((e) => {console.log("脚本异常:" + e);}); 167 | 168 | async function help(packetId, cookie, id) { 169 | const nm = { 170 | url: `https://api.m.jd.com?functionId=helpCoinDozer&appid=station-soa-h5&client=H5&clientVersion=1.0.0&t=1636015855103&body={"actId":"49f40d2f40b3470e8d6c39aa4866c7ff","channel":"coin_dozer","antiToken":"","referer":"-1","frontendInitStatus":"s","packetId":"${packetId}"}&_ste=1&_stk=appid,body,client,clientVersion,functionId,t&h5st=20211104165055104;9806356985655163;10005;tk01wd1ed1d5f30nBDriGzaeVZZ9vuiX+cBzRLExSEzpfTriRD0nxU6BbRIOcSQvnfh74uInjSeb6i+VHpnHrBJdVwzs;017f330f7a84896d31a8d6017a1504dc16be8001273aaea9a04a8d04aad033d9`, 171 | headers: { 172 | "Cookie": cookie, 173 | "Origin": "https://pushgold.jd.com", 174 | }, 175 | method: "get" 176 | } 177 | try { 178 | await api(nm).then(async response => { 179 | var data = response.body; 180 | if (safeGet(data)) { 181 | data = JSON.parse(data); 182 | if (data.success == true) { 183 | amount = data.data.amount; 184 | dismantledAmount = data.data.dismantledAmount; 185 | console.log("助力成功:" + amount + ",已砍:" + dismantledAmount); 186 | } 187 | } 188 | if (data.msg.indexOf("未登录") > -1 || data.msg.indexOf("火爆") > -1) { 189 | //console.log("失效或者火爆,删除环境变量"); 190 | //await deleteEnvByIds([id]); 191 | } 192 | if (data.msg.indexOf("完成") != -1) { 193 | status = 1 194 | } 195 | else if (data.msg == "帮砍排队") { 196 | status = 2 197 | } 198 | else if (data.msg.indexOf("过期") > -1) { 199 | status = 3 200 | } 201 | if (data.success == false) { 202 | console.log("助力失败,京东返回数据:" + data.msg) 203 | if (data.msg.indexOf("帮砍机会已用完") > -1) { 204 | ckStatus = 99; 205 | } 206 | else if (data.msg.indexOf("verify") > -1 || data.msg.indexOf("活动太火爆") > -1 || data.msg.indexOf("未登录") > -1) { 207 | ckStatus = -1; 208 | } 209 | } 210 | }); 211 | } 212 | catch (e) { 213 | console.log("请求京东错了,今天标记成助力完了,明天再试"); 214 | ckStatus = 99; 215 | } 216 | } 217 | 218 | function safeGet(data) { 219 | try { 220 | if (typeof JSON.parse(data) == "object") { 221 | return true; 222 | } 223 | } catch (e) { 224 | console.log(`京东服务器访问数据为空,请检查自身设备网络情况`); 225 | return false; 226 | } 227 | } -------------------------------------------------------------------------------- /jd_wabao.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 挖宝 多线程爆炸版本 4 | * 可以指定助力次数,链接后面空格+助力次数如: 5 | * 6 | *https://bnzf.jd.com/?activityId=pTTvJeSTrpthgk9ASBVGsw&inviterId=AnGSL6Zn3cdZbSu5yaWZzlto-x3UjipJydBT7cHxeqo&inviterCode=eaa56da106944c6499696f389dc3a03512911649694825215&utm_user=plusmember&ad_od=share&utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=Wxfriends 30 7 | * 8 | * 以上链接则只助力30次 9 | * 10 | * 需要量子变量: 11 | * 12 | * 13 | * WB_USE_SCORE 挖宝需要多少积分 (整数) 14 | * 15 | * 16 | * 17 | * XM_PROXY 熊猫代理API 地址: 18 | * 19 | * 熊猫代理注册:http://www.xiongmaodaili.com?invitationCode=2E416FEA-9B77-4CD3-B7FE-D5CD4A8C60AB 20 | * 注册登录后购买2元1000条的。 21 | * 购买后回到订管理,点击生成API 22 | * 提取数量:1 23 | * 数据格式:JSON 24 | * 其他默认 25 | * 复制生成的API地址添加到量子环境变量。 26 | * 27 | **/ 28 | const got = require('got'); 29 | var HttpsProxyAgent = require("https-proxy-agent"); 30 | 31 | var CryptoJS = require('crypto-js'); 32 | const { 33 | sendNotify, getUserInfo, updateUserInfo, addOrUpdateCustomDataTitle, addCustomData, getCustomData, sleep, getEnvs, updateCustomData, deleteEnvByIds 34 | } = require('./quantum'); 35 | const api = got.extend({ 36 | retry: { limit: 0 }, 37 | }); 38 | const moment = require('moment'); 39 | 40 | // 挖宝活动id 41 | let ActivityId = "pTTvJeSTrpthgk9ASBVGsw"; 42 | let wabao_url = process.env.wabao_url; 43 | let WB_USE_SCORE = (process.env.WB_USE_SCORE || 0) * 1; 44 | 45 | let customerDataType = "wabao_order"; 46 | let CommunicationUserId = process.env.CommunicationUserId; 47 | let CommunicationUserName = process.env.CommunicationUserName; 48 | let ManagerQQ = process.env.ManagerQQ; 49 | let XM_PROXY = process.env.XM_PROXY; 50 | 51 | //最大助力次数 52 | let maxCount = 40; 53 | let count = 0; 54 | 55 | var xmProxy = null; 56 | var error = false; 57 | var appId = "63d78"; 58 | var genKey = null; 59 | var token; 60 | var fp; 61 | 62 | 63 | !(async () => { 64 | var inviterId = wabao_url.match(/inviterId=([^&]+)(?=&?)/)[1] 65 | var inviterCode = wabao_url.match(/inviterCode=([^&]+)(?=&?)/)[1] 66 | console.log("inviterId:" + inviterId); 67 | console.log("inviterCode:" + inviterCode); 68 | if (!inviterId) { 69 | console.log(wabao_url + "中未取到inviterId"); 70 | return; 71 | } if (!inviterCode) { 72 | console.log(wabao_url + "中未取到inviterCode"); 73 | return; 74 | } 75 | var url = `https://bnzf.jd.com/?activityId=${ActivityId}&inviterId=${inviterId}&inviterCode=${inviterCode}&` 76 | var startTime = moment().format("YYYY-MM-DD") 77 | var endTime = moment().format("YYYY-MM-DD HH:mm:ss"); 78 | var ss = await getCustomData(customerDataType, startTime, endTime, { Data6: process.env.user_id }); 79 | 80 | if (ss && ss.length > 0 && ss.filter((t) => t.Data6.indexOf(inviterId) > -1).length > 0) { 81 | var msg = "重复的挖宝任务,已自动跳过。"; 82 | console.log(msg); 83 | await sendNotify(msg) 84 | return; 85 | } 86 | var m = ""; 87 | if (WB_USE_SCORE > 0) { 88 | user = await getUserInfo(); 89 | user.MaxEnvCount = user.MaxEnvCount - WB_USE_SCORE; 90 | if (user.MaxEnvCount < 0) { 91 | await sendNotify(`挖宝需要${WB_USE_SCORE}积分,当前积分:${(user.MaxEnvCount + WB_USE_SCORE)}`); 92 | return false; 93 | } else { 94 | await updateUserInfo(user); 95 | } 96 | m = `\n本次扣除${WB_USE_SCORE}个积分。剩余积分:${user.MaxEnvCount}`; 97 | } 98 | 99 | await addOrUpdateCustomDataTitle({ 100 | Type: customerDataType, 101 | TypeName: "挖宝订单", 102 | Title1: "助力链接", 103 | Title2: "状态", 104 | Title3: "QQ/WX", 105 | Title4: "昵称", 106 | Title5: "任务编号", 107 | Title6: "原链接", 108 | Title7: "助力次数" 109 | }) 110 | var wbOrder = { 111 | Type: customerDataType, 112 | Data1: "", 113 | Data2: "进行中", 114 | Data3: CommunicationUserId, 115 | Data4: CommunicationUserName, 116 | Data6: url, 117 | Data7: "0" 118 | } 119 | var no = (ss.length + 1) 120 | wbOrder.Data5 = no; 121 | 122 | var cookies = await getEnvs("JD_COOKIE", null, 2); 123 | if (cookies.length == 0) { 124 | var message = "未提供JD_COOKIE无法执行任务!" 125 | console.log(message); 126 | await sendNotify(message) 127 | return; 128 | } 129 | await requestAlgo(); 130 | wbOrder.Data1 = `https://api.m.jd.com/?functionId=happyDigHelp&appid=activities_platform&client=H5&clientVersion=1.0.0&body={"linkId":"${ActivityId}","inviter":"${inviterId}","inviteCode":"${inviterCode}"}&t=1649865711362&h5st=` + geth5st(); 131 | var sss = await addCustomData([wbOrder]) 132 | wbOrder = sss[0]; 133 | cookies = cookies.filter((t) => t.Enable).sort(function () { 134 | return Math.random() - 0.5; 135 | }); 136 | console.log("cookie数量:" + cookies.length); 137 | var result = ""; 138 | await sendNotify("开始挖宝任务:" + wbOrder.Data5 + m) 139 | var threadCount = 0; 140 | var threadCompleteCount = 0; 141 | if (wabao_url.split(" ").length == 2) { 142 | try { 143 | maxCount = parseInt(wabao_url.split(" ")[1]) 144 | console.log("挖宝指定助力次数:" + maxCount) 145 | } catch (e) { 146 | } 147 | } 148 | await getProxy(); 149 | for (var index = 0; index < cookies.length; index++) { 150 | try { 151 | var cookie = cookies[index]; 152 | if (!cookie || !cookie.Value) { 153 | continue; 154 | } 155 | var c = cookie.Value.replace(/[\r\n]/g, ""); 156 | var pt_pin = c.match(/pin=([^; ]+)(?=;?)/)[1]; 157 | if (!pt_pin) { 158 | continue; 159 | } 160 | const nm = { 161 | url: wbOrder.Data1, 162 | headers: { 163 | "User-Agent": "jdltapp;iPhone;3.8.12;;;M/5.0;hasUPPay/0;pushNoticeIsOpen/1;lang/zh_CN;hasOCPay/0;appBuild/1129;supportBestPay/0;jdSupportDarkMode/0;ef/1;ep/%7B%22ciphertype%22%3A5%2C%22cipher%22%3A%7B%22ud%22%3A%22DQG2YJuzCJC3CJC4CwDuZJPvZtZuCJHrDwG5YtU3YwVuENS4YzU1Cq%3D%3D%22%2C%22sv%22%3A%22CJUkDK%3D%3D%22%2C%22iad%22%3A%22%22%7D%2C%22ts%22%3A1647603296%2C%22hdid%22%3A%22IdJDIlAUU%2BIuqLovL%5C%2FO7UFEwuvf2f9O%2BazbGA9gGd9w%3D%22%2C%22version%22%3A%221.0.3%22%2C%22appname%22%3A%22com.jd.jdmobilelite%22%2C%22ridx%22%3A1%7D;Mozilla/5.0 (iPhone; CPU iPhone OS 15_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1; Edg/99.0.4844.51", 164 | "Cookie": cookie.Value, 165 | "referer": "https://bnzf.jd.com/", 166 | "origin": "https://bnzf.jd.com", 167 | "pragma": "no-cache", 168 | "Host": "api.m.jd.com", 169 | "accept": "application/json, text/plain, */*", 170 | "Accept-Encoding": "gzip, deflate, br", 171 | "Origin": "https://pushgold.jd.com", 172 | }, 173 | method: "get", 174 | } 175 | if (xmProxy) { 176 | var agent = new HttpsProxyAgent(`http://${xmProxy.ip}:${xmProxy.port}`); 177 | nm.agent = { 178 | https: agent, 179 | http: agent, 180 | } 181 | } 182 | var result = null; 183 | api(nm).then(async response => { 184 | result = JSON.parse(response.body); 185 | console.log("挖宝助力结果:" + result.errMsg); 186 | result = JSON.parse(response.body); 187 | if (result.errMsg == "success") { 188 | count++; 189 | console.log("成功次数:" + count); 190 | } 191 | threadCompleteCount++; 192 | }).catch(async error => { 193 | console.log(JSON.stringify(error.response)); 194 | threadCompleteCount++; 195 | if (!XM_PROXY) { 196 | error = true; 197 | } else { 198 | await getProxy(); 199 | } 200 | }); 201 | threadCount++; 202 | while ((threadCount >= maxCount - count && threadCount > threadCompleteCount)) { 203 | await sleep(100); 204 | } 205 | if (index == cookies.length - 1) { 206 | await sleep(5000); 207 | } 208 | if (error) { 209 | break; 210 | } 211 | if (threadCount == threadCompleteCount) { 212 | threadCount = 0; 213 | threadCompleteCount = 0; 214 | } 215 | if (count >= maxCount) { 216 | wbOrder.Data2 = "完成"; 217 | wbOrder.Data7 = count; 218 | console.log("任务编号:" + wbOrder.Data5 + "助力次数达到" + maxCount); 219 | break; 220 | } 221 | } catch (e) { 222 | console.log(e) 223 | } 224 | } 225 | if (count < maxCount) { 226 | wbOrder.Data2 = "未完成"; 227 | } 228 | result = "任务编号:" + wbOrder.Data5 + "执行结束,挖宝结果:" + wbOrder.Data2 + ",助力次数:" + count; 229 | console.log(result); 230 | await updateCustomData(wbOrder); 231 | await sendNotify(result + "\n用户:" + CommunicationUserName, true); 232 | if (wbOrder.Data3 != ManagerQQ) { 233 | await sendNotify(result, false, process.env.user_id); 234 | } 235 | })().catch((e) => {console.log("脚本异常:" + e);}); 236 | 237 | 238 | 239 | async function requestAlgo() { 240 | var s = "", a = "0123456789", u = a, c = (Math.random() * 10) | 0; 241 | do { 242 | ss = getRandomIDPro({ size: 1, customDict: a }) + "" 243 | if (s.indexOf(ss) == -1) s += ss 244 | } while (s.length < 3) 245 | for (let i of s.slice()) u = u.replace(i, '') 246 | fp = getRandomIDPro({ size: c, customDict: u }) + "" + s + getRandomIDPro({ size: (14 - (c + 3)) + 1, customDict: u }) + c + "" 247 | let opts = { 248 | url: `https://cactus.jd.com/request_algo?g_ty=ajax`, 249 | headers: { 250 | 'Accept': 'application/json', 251 | 'Content-Type': 'application/json', 252 | "Accept-Encoding": "gzip, deflate, br", 253 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", 254 | 'Origin': 'https://prodev.m.jd.com', 255 | 'Referer': 'https://prodev.m.jd.com/' 256 | }, 257 | method: "post", 258 | body: `{"version":"3.0","fp":"${fp}","appId":"${appId}","timestamp":${Date.now()},"platform":"web","expandParams":""}` 259 | } 260 | var response = await api(opts); 261 | data = response.body; 262 | const { data: { result } = {} } = JSON.parse(data); 263 | token = result.tk 264 | genKey = new Function(`return ${result.algo}`)(); 265 | } 266 | 267 | function getRandomIDPro() { 268 | var e, 269 | t, 270 | a = void 0 === (n = (t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}).size) ? 10 : n, 271 | n = void 0 === (n = t.dictType) ? 'number' : n, 272 | i = ''; 273 | if ((t = t.customDict) && 'string' == typeof t) e = t; 274 | else 275 | switch (n) { 276 | case 'alphabet': 277 | e = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 278 | break; 279 | case 'max': 280 | e = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-'; 281 | break; 282 | case 'number': 283 | default: 284 | e = '0123456789'; 285 | } 286 | 287 | for (; a--;) i += e[(Math.random() * e.length) | 0]; 288 | return i; 289 | } 290 | 291 | 292 | function geth5st() { 293 | let t = [{ "key": "City", "value": "City" }] 294 | let a = t.map(function (e) { 295 | return e["key"] + ":" + e["value"] 296 | }) 297 | let time = Date.now() 298 | let timestamp = format("yyyyMMddhhmmssSSS", time); 299 | hash1 = genKey(token, fp.toString(), timestamp.toString(), appId.toString(), CryptoJS).toString(); 300 | const hash2 = CryptoJS.HmacSHA256(a, hash1.toString()).toString(); 301 | let h5st = ["".concat(timestamp.toString()), "".concat(fp.toString()), "".concat(appId.toString()), "".concat(token), "".concat(hash2), "3.0", "".concat(time)].join(";") 302 | return h5st 303 | } 304 | 305 | function format(a, time) { 306 | if (!a) a = 'yyyy-MM-dd'; 307 | var t; 308 | if (!time) { 309 | t = Date.now(); 310 | } else { 311 | t = new Date(time); 312 | } 313 | var e, 314 | n = new Date(t), 315 | d = a, 316 | l = { 317 | 'M+': n.getMonth() + 1, 318 | 'd+': n.getDate(), 319 | 'D+': n.getDate(), 320 | 'h+': n.getHours(), 321 | 'H+': n.getHours(), 322 | 'm+': n.getMinutes(), 323 | 's+': n.getSeconds(), 324 | 'w+': n.getDay(), 325 | 'q+': Math.floor((n.getMonth() + 3) / 3), 326 | 'S+': n.getMilliseconds(), 327 | }; 328 | /(y+)/i.test(d) && (d = d.replace(RegExp.$1, ''.concat(n.getFullYear()).substr(4 - RegExp.$1.length))); 329 | Object.keys(l).forEach(e => { 330 | if (new RegExp('('.concat(e, ')')).test(d)) { 331 | var t, 332 | a = 'S+' === e ? '000' : '00'; 333 | d = d.replace(RegExp.$1, 1 == RegExp.$1.length ? l[e] : ''.concat(a).concat(l[e]).substr(''.concat(l[e]).length)); 334 | } 335 | }); 336 | return d; 337 | } 338 | 339 | /** 340 | * 341 | * 获取熊猫代理 342 | * 343 | * */ 344 | async function getProxy() { 345 | if (XM_PROXY == null) { 346 | console.log("未配置熊猫代理API地址,可能出现403"); 347 | return null; 348 | } 349 | console.log("获取熊猫代理:"); 350 | try { 351 | var options = { 352 | 'method': 'get', 353 | 'url': XM_PROXY, 354 | 'headers': { 355 | 'Content-Type': 'application/json' 356 | } 357 | }; 358 | var response = await api(options); 359 | console.log("获取代理IP结果:" + response.body); 360 | result = JSON.parse(response.body); 361 | } catch (e) { 362 | console.log("熊猫代理获取异常。"); 363 | console.log(JSON.stringify(e)); 364 | } 365 | if (result.code == "0" && result.obj) { 366 | xmProxy = result.obj[0]; 367 | } else if (result.code == "-102") { 368 | console.log(result.msg) 369 | await sleep(1050); 370 | await getProxy(); 371 | } 372 | } -------------------------------------------------------------------------------- /ks_addCookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 用户提交快手CK 4 | * ADD_KSCOOKIE_USE_SCORE 添加快手CK需要多少积分。(设置为0 或者 不设置时则表示不需要积分。) 5 | * 6 | * */ 7 | 8 | //用户提交新CK是否通知管理员,默认通知,如果不想通知,添加量子环境变量:ADD_COOKIE_NOTIFY 值 false 9 | let ADD_COOKIE_NOTIFY = true; 10 | if (process.env.ADD_COOKIE_NOTIFY) { 11 | ADD_COOKIE_NOTIFY = process.env.ADD_COOKIE_NOTIFY == 'true'; 12 | } 13 | 14 | //用户更新CK是否通知管理员 量子环境变量:UPDATE_COOKIE_NOTIFY:true 15 | let UPDATE_COOKIE_NOTIFY = true; 16 | if (process.env.UPDATE_COOKIE_NOTIFY) { 17 | UPDATE_COOKIE_NOTIFY = process.env.UPDATE_COOKIE_NOTIFY == 'true'; 18 | } 19 | 20 | let ADD_KSCOOKIE_USE_SCORE = (process.env.ADD_KSCOOKIE_USE_SCORE || 0) * 1; 21 | const { sendNotify, allEnvs, addEnvs, getUserInfo, updateUserInfo } = require('./quantum'); 22 | 23 | const { ks_query } = require('./ks_base'); 24 | 25 | let user_id = process.env.user_id; //用户id 26 | let command = process.env.command; 27 | 28 | !(async () => { 29 | var user = (await getUserInfo()) || {}; 30 | command = command + ';'; 31 | var v = command.match(/kuaishou.api_st=([^; ]+)(?=;?)/)[1] + ';@'; 32 | console.log(v); 33 | var data2 = await allEnvs(v, 2); 34 | if (data2.length > 0) { 35 | await sendNotify('提交失败,重复的CK!'); 36 | return; 37 | } 38 | command = `kuaishou.api_st=${v}`; 39 | console.log('开始查询快手CK信息'); 40 | var body = await ks_query(command); 41 | console.log('CK查询返回结果:' + JSON.stringify(body)); 42 | if (body.result == 1 && body.data.userData) { 43 | var c = { 44 | Name: 'ksjsbCookie', 45 | Enable: true, 46 | Value: command, 47 | UserRemark: body.data.userData.nickname, 48 | UserId: user_id, 49 | EnvType: 2 50 | }; 51 | user.MaxEnvCount -= ADD_KSCOOKIE_USE_SCORE; 52 | if (ADD_KSCOOKIE_USE_SCORE > 0 && user.MaxEnvCount < 0) { 53 | await sendNotify(`该操作需要${ADD_KSCOOKIE_USE_SCORE}积分 54 | 您当前积分剩余${user.MaxEnvCount + ADD_KSCOOKIE_USE_SCORE}`); 55 | return; 56 | } 57 | if (ADD_KSCOOKIE_USE_SCORE > 0) { 58 | await updateUserInfo(user); 59 | } 60 | console.log('开始提交快手CK到量子数据库'); 61 | var data = await addEnvs([c]); 62 | console.log('提交结果:' + JSON.stringify(data)); 63 | await sendNotify( 64 | '提交成功!\n扣除积分:' + 65 | ADD_KSCOOKIE_USE_SCORE + 66 | '\n剩余积分:' + 67 | user.MaxEnvCount + 68 | '\n' + 69 | '金币:' + 70 | body.data.totalCoin + 71 | '\n' + 72 | '现金:' + 73 | body.data.totalCash + 74 | '\n' + 75 | '昵称:' + 76 | body.data.userData.nickname 77 | ); 78 | } else { 79 | await sendNotify('提交失败!'); 80 | } 81 | })().catch((e) => {console.log("脚本异常:" + e);}); 82 | -------------------------------------------------------------------------------- /ks_base.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | const api = got.extend({ 3 | retry: { limit: 0 }, 4 | }); 5 | module.exports.ks_query = async (ck) => { 6 | console.log("快手CK:" + ck); 7 | return await api({ 8 | url: 'https://nebula.kuaishou.com/rest/n/nebula/activity/earn/overview/basicInfo', 9 | headers: { 10 | Cookie: 'client_key=2ac2a76d;' + ck, 11 | "User-Agent": "Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.226 KsWebView/1.8.90.404 (rel;r) Mobile Safari/537.36 Yoda/2.7.3-rc7 StatusHT/30 CV/null ksNebula/10.1.10.2811 OS_PRO_BIT/64 MAX_PHY_MEM/7544 AZPREFIX/zw ICFO/0 TitleHT/50 NetType/WIFI ISLP/0 ISDM/0 ISLB/0 ISLD/0 locale/zh-cn evaSupported/false CT/0", 12 | }, 13 | method: 'get', 14 | }).json(); 15 | } -------------------------------------------------------------------------------- /ks_query.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 该脚本作者来源量子用户:灰色头像@,QQ:97393412 3 | * 快手极速版 金币,现金查询 4 | * 用户变量:ksjsbCookie 5 | * 值是:CK 6 | * */ 7 | const { 8 | sendNotify, getEnvs, deleteEnvByIds 9 | } = require('./quantum'); 10 | const { ks_query 11 | } = require("./ks_base") 12 | let user_id = process.env.user_id; //用户id 13 | !(async () => { 14 | console.log("user_id:" + user_id); 15 | var cks = await getEnvs("ksjsbCookie", "kuaishou.api_st", 2, user_id) 16 | if (cks.length == 0) { 17 | console.log("没有提交过快手极速版CK,结束任务。"); 18 | return; 19 | } 20 | await sendNotify(`您一共绑定了${cks.length}个快手极速版`); 21 | for (var i = 0; i < cks.length; i++) { 22 | var ck = cks[i]; 23 | var body = await ks_query(ck.Value); 24 | if (body.result == 1 && body.data.userData) { 25 | await sendNotify("金币:" + body.data.totalCoin + "\n" + "现金:" + body.data.totalCash + "\n" + "昵称:" + body.data.userData.nickname) 26 | } else { 27 | console.log(ck + "已失效"); 28 | await sendNotify(`快手账号:${ck.UserRemark}已失效,重新获取提交。`) 29 | } 30 | } 31 | })(); -------------------------------------------------------------------------------- /love.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | const { 3 | sendNotify 4 | } = require('./quantum'); 5 | 6 | const api = got.extend({ 7 | retry: { limit: 0 }, 8 | }); 9 | 10 | !(async () => { 11 | var len = 20; 12 | await api({ 13 | url: 'https://api.vvhan.com/api/love', 14 | headers: { 15 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 16 | }, 17 | method: 'get', 18 | }).then(async response => { 19 | var body = response.body 20 | var message = ""; 21 | for (var i = 0; i < body.split("\n").length; i++) { 22 | var t = body.split("\n")[i]; 23 | if (t.length < len + 5) { 24 | message += t + "\n" 25 | } else { 26 | for (var x = 0; x < t.length / len; x++) { 27 | message += t.substring(x * len, (x + 1) * len) + "\n"; 28 | } 29 | } 30 | } 31 | await sendNotify(message) 32 | console.log(message) 33 | }); 34 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /meituan_addCookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 用户提交美团CK 4 | * ADD_MEITUANCOOKIE_USE_SCORE 添加美团 CK需要多少积分。(设置为0 或者 不设置时则表示不需要积分。) 5 | * 6 | * */ 7 | 8 | 9 | let ADD_MEITUANCOOKIE_USE_SCORE = (process.env.ADD_MEITUANCOOKIE_USE_SCORE || 0) * 1; 10 | const { sendNotify, allEnvs, addEnvs, getUserInfo, updateUserInfo } = require('./quantum'); 11 | 12 | let user_id = process.env.user_id; //用户id 13 | let command = process.env.command; 14 | 15 | !(async () => { 16 | command += ";"; 17 | var USERID = null; 18 | var token = null; 19 | try { 20 | token = command.match(/token=([^; ]+)(?=;?)/)[1]; 21 | USERID = command.match(/userId=([^; ]+)(?=;?)/)[1] 22 | } catch { 23 | console.log("提交的信息中获取USERID失败!"); 24 | } 25 | if (!token) { 26 | await sendNotify("提交的美团CK错误。") 27 | return; 28 | } 29 | console.log("USERID:" + USERID); 30 | var c = { 31 | Name: 'meituanCookie', 32 | Enable: true, 33 | Value: `token=${token};${(USERID ? `userId=${USERID};` : '')}`, 34 | UserRemark: USERID || "", 35 | UserId: user_id, 36 | EnvType: 2 37 | }; 38 | if (!USERID) { 39 | console.log("没有USERID参数,直接做新增处理."); 40 | } else { 41 | var data2 = await allEnvs(USERID, 2); 42 | if (data2.length > 0) { 43 | console.log("重复的美团用户CK ,更新操作"); 44 | c.Id = data2[0].Id; 45 | c.Weight = data2[0].Weight; 46 | c.UserRemark = data2[0].UserRemark; 47 | c.Remark = data2[0].Remark; 48 | } 49 | } 50 | if (ADD_MEITUANCOOKIE_USE_SCORE > 0) { 51 | var user = (await getUserInfo()) || {}; 52 | user.MaxEnvCount -= ADD_MEITUANCOOKIE_USE_SCORE; 53 | if (ADD_MEITUANCOOKIE_USE_SCORE > 0 && user.MaxEnvCount < 0) { 54 | await sendNotify(`该操作需要${ADD_MEITUANCOOKIE_USE_SCORE}积分 55 | 您当前积分剩余${user.MaxEnvCount + ADD_MEITUANCOOKIE_USE_SCORE}`); 56 | return; 57 | } 58 | console.log(`扣除用户积分:${ADD_MEITUANCOOKIE_USE_SCORE},剩余积分:${user.MaxEnvCount}`) 59 | await updateUserInfo(user); 60 | } 61 | console.log('开始提交快手美团到量子数据库'); 62 | var data = await addEnvs([c]); 63 | console.log('提交结果:' + JSON.stringify(data)); 64 | await sendNotify( 65 | '美团提交成功!\n扣除积分:' + 66 | ADD_MEITUANCOOKIE_USE_SCORE + 67 | '\n用户ID:' + (USERID || '') 68 | ); 69 | })(); -------------------------------------------------------------------------------- /myCookie.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 可用环境变量 请通过环境变量添加量子变量 3 | * 4 | * NO_CK_NOTIFY ,说明未提交京东CK时提醒信息。 5 | * 6 | **/ 7 | 8 | const moment = require('moment'); 9 | const { 10 | sendNotify, getEnvs 11 | } = require('./quantum'); 12 | 13 | let user_id = process.env.user_id; //用户id 14 | !(async () => { 15 | if (!user_id) { 16 | return; 17 | } 18 | 19 | console.log("user_id:" + user_id); 20 | var cks = await getEnvs("JD_COOKIE", "pt_key", 2, user_id) 21 | if (cks.length == 0) { 22 | console.log("没有Cookies信息结束任务。"); 23 | if (process.env.NO_CK_NOTIFY) { 24 | await sendNotify(process.env.NO_CK_NOTIFY); 25 | } 26 | return; 27 | } 28 | var message = `一共绑定了${cks.length}个京东:`; 29 | for (var i = 0; i < cks.length; i++) { 30 | var ck = cks[i]; 31 | var name = ck.UserRemark || ck.Value.match(/pt_pin=([^; ]+)(?=;?)/) && ck.Value.match(/pt_pin=([^; ]+)(?=;?)/)[1]; 32 | var overdueDate = moment(ck.CreateTime); 33 | var day = moment(new Date()).diff(overdueDate, 'day'); 34 | message += `\n${(i + 1)}:${name},${(ck.Enable ? `有效✅,挂机${day}天。` : '失效❌,请重新获取提交。')}` 35 | console.log(message); 36 | } 37 | console.log(message); 38 | await sendNotify(message); 39 | })().catch((e) => { 40 | console.log(e); 41 | }); -------------------------------------------------------------------------------- /nyn.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | const { 3 | sendNotify 4 | } = require('./quantum'); 5 | 6 | const api = got.extend({ 7 | retry: { limit: 0 }, 8 | }); 9 | 10 | !(async () => { 11 | await api({ 12 | url: 'https://api.linhun.vip/api/Littlesistervideo?type=json', 13 | headers: { 14 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 15 | }, 16 | method: 'get', 17 | }).then(async response => { 18 | var body = JSON.parse(response.body); 19 | console.log(body.video) 20 | await sendNotify({ msg: body.video, MessageType: 3 }) 21 | }); 22 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /overdueNotify.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * 给用户推送过期账号提醒 4 | * 可配置环境变量名称:OVERDUE_NOTIFY_MSG (过期提醒文字) 5 | * 6 | */ 7 | 8 | const { 9 | sendNotify, allEnvs,sleep 10 | } = require('./quantum'); 11 | 12 | var message = process.env.OVERDUE_NOTIFY_MSG || "您的以下京东账号已经过期,请重更新提交CK:"; 13 | 14 | !(async () => { 15 | var envs = await allEnvs("JD_COOKIE", 2, false, ""); 16 | console.log("获取过期环境变量" + envs.length + "个"); 17 | var ts = []; 18 | for (var i = 0; i < envs.length; i++) { 19 | if (ts.length > 0 && ts.filter((t) => t.UserId === envs[i].UserId).length > 0) { 20 | ts.filter((t) => t.UserId === envs[i].UserId)[0].List.push(envs[i].UserRemark) 21 | } else { 22 | ts.push({ 23 | UserId: envs[i].UserId, 24 | List: [envs[i].UserRemark] 25 | }); 26 | } 27 | } 28 | if (ts.length > 0) { 29 | for (var i = 0; i < ts.length; i++) { 30 | await sleep(5000); 31 | await sendNotify(message + "\n" + ts[i].List.join(","), false, ts[i].UserId); 32 | } 33 | } 34 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "quantum", 3 | "version": "1.0.0", 4 | "description": "quantum scripts", 5 | "author": "asupc <17919100150@qq.com>", 6 | "private": true, 7 | "dependencies": { 8 | "axois": "0.0.1-security", 9 | "crypto-js": "^4.1.1", 10 | "fs": "^0.0.1-security", 11 | "got": "^11.8.2", 12 | "moment": "^2.29.1", 13 | "sqlite3": "^5.0.2", 14 | "tough-cookie": "^4.0.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /qBittorrentAdd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * qBittorrent 添加 磁力任务脚本 4 | * 5 | * 未实现通过账号密码登录,请关闭身份认证或添加白名单。 6 | * 7 | * 请通过设置>Web UI>勾选 对本地主机上的客户端跳过身份验证 和 对 IP 子网白名单中的客户端跳过身份验证 , 填入量子的IP 地址。 8 | * 如果不这样,你需要添加qb账号密码环境变量,以便机器人自动登录授权。 9 | * 10 | * qbusername (账号) 11 | * qbpassword (密码) 12 | * 13 | * 14 | * 必要环境变量 qBittorrentURL 如 http://192.168.10.91:8080 15 | * 16 | * 17 | * 18 | * */ 19 | 20 | const got = require('got'); 21 | var FormData = require('form-data'); 22 | const { 23 | sendNotify 24 | } = require('./quantum'); 25 | 26 | const { 27 | qblogin 28 | } = require('./qBittorrentBase'); 29 | 30 | const api = got.extend({ 31 | retry: { limit: 0 }, 32 | }); 33 | 34 | !(async () => { 35 | var qBittorrentURL = process.env.qBittorrentURL 36 | if (!qBittorrentURL) { 37 | await sendNotify("未设置qBittorrent服务地址,请添加量子变量 :qBittorrentURL。") 38 | return; 39 | } 40 | if (qBittorrentURL.startsWith("http") == -1) { 41 | qBittorrentURL = "http://" + qBittorrentURL; 42 | } 43 | qBittorrentURL = qBittorrentURL.trimEnd("/"); 44 | 45 | 46 | var cookie = await qblogin(qBittorrentURL); 47 | if (cookie) { 48 | console.log("认证返回cookie:" + cookie) 49 | } 50 | 51 | var data = new FormData(); 52 | data.append('urls', process.env.command); 53 | data.append('autoTMM', 'true'); 54 | data.append('paused', 'false'); 55 | data.append('contentLayout', 'Original'); 56 | console.log("磁力信息:" + process.env.command); 57 | var config = { 58 | method: 'post', 59 | url: qBittorrentURL + '/api/v2/torrents/add', 60 | headers: { 61 | Cookie: cookie 62 | }, 63 | body: data 64 | }; 65 | await api(config).then(async response => { 66 | console.log(response.body); 67 | await sendNotify("磁力任务添加结果:" + response.body) 68 | }).catch(async function (error) { 69 | await sendNotify(`添加磁力任务失败了: 70 | ${error.name} 71 | ${error.code}`) 72 | console.log(error) 73 | }); 74 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /qBittorrentBase.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | var FormData = require('form-data'); 3 | 4 | const api = got.extend({ 5 | retry: { limit: 0 }, 6 | }); 7 | 8 | 9 | module.exports.qblogin = async (qBittorrentURL) => { 10 | qBittorrentURL = qBittorrentURL.trimEnd("/"); 11 | var data = new FormData(); 12 | if (!process.env.qbusername || !process.env.qbpassword) { 13 | console.log("未配置qb 账号密码,跳过登录,可能出现请求拒绝访问(403)") 14 | return; 15 | } 16 | data.append('username', process.env.qbusername); 17 | data.append('password', process.env.qbpassword); 18 | var config = { 19 | method: 'post', 20 | url: qBittorrentURL + '/api/v2/auth/login', 21 | body: data 22 | }; 23 | var cookie = ""; 24 | await api(config).then(async response => { 25 | cookie = response.headers["set-cookie"][0]; 26 | var SID = cookie.match(/SID=([^; ]+)(?=;?)/)[1] 27 | cookie = `SID=${SID}`; 28 | console.log("认证授权Cookie:" + cookie) 29 | }).catch(async function (error) { 30 | console.log("qb登录认证出现异常") 31 | console.log(error) 32 | }); 33 | return cookie; 34 | } -------------------------------------------------------------------------------- /qBittorrentMaindata.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * qBittorrent 下载任务详情 4 | * 5 | * 未实现通过账号密码登录,请关闭身份认证或添加白名单。 6 | * 7 | * 请通过设置>Web UI>勾选 对本地主机上的客户端跳过身份验证 和 对 IP 子网白名单中的客户端跳过身份验证 , 填入量子的IP 地址。 8 | * 9 | * 如果不这样,你需要添加qb账号密码环境变量,以便机器人自动登录授权。 10 | * 11 | * qbusername (账号) 12 | * qbpassword (密码) 13 | * 14 | * 15 | * 必要环境变量 qBittorrentURL 如 http://192.168.10.91:8080 16 | * 17 | * */ 18 | 19 | const got = require('got'); 20 | var moment = require('moment'); 21 | const { 22 | sendNotify 23 | } = require('./quantum'); 24 | const { 25 | qblogin 26 | } = require('./qBittorrentBase'); 27 | 28 | const api = got.extend({ 29 | retry: { limit: 0 }, 30 | }); 31 | 32 | !(async () => { 33 | var qBittorrentURL = process.env.qBittorrentURL; 34 | if (!qBittorrentURL) { 35 | await sendNotify("未设置qBittorrent服务地址,请添加量子变量 :qBittorrentURL。") 36 | return; 37 | } 38 | if (!qBittorrentURL.startsWith("http")) { 39 | qBittorrentURL = "http://" + qBittorrentURL; 40 | } 41 | qBittorrentURL = qBittorrentURL.trimEnd("/"); 42 | 43 | var cookie = await qblogin(qBittorrentURL); 44 | if (cookie) { 45 | console.log("认证返回cookie:" + cookie) 46 | } 47 | console.log("开始获取 maindata") 48 | var config = { 49 | method: 'get', 50 | url: qBittorrentURL + '/api/v2/sync/maindata', 51 | headers: { 52 | Cookie: cookie 53 | } 54 | }; 55 | 56 | api(config) 57 | .then(async function (response) { 58 | var data = JSON.parse(response.body); 59 | var msg = `可用磁盘空间:${(data.server_state.free_space_on_disk/1024/1024/1024).toFixed(2)}G 60 | 获取下载任务数量:`; 61 | var taskCount = 0; 62 | var details= ""; 63 | for (let key in data.torrents) { 64 | var torrent = data.torrents[key] 65 | taskCount++; 66 | details+=` 67 | 任务序号:${taskCount} 68 | 任务名:${torrent.name} 69 | 添加时间:${moment(torrent.added_on*1000).format("YYYY-MM-DD HH:mm")} 70 | 任务状态:${getStateText(torrent.state)} 71 | 文件大小:${(torrent.total_size/1024/1024).toFixed(2)}MB 72 | 比率:${(torrent.ratio).toFixed(2)} 73 | 下载进度:${(torrent.progress*100).toFixed(1)}%` 74 | 75 | } 76 | msg = msg + taskCount+details; 77 | console.log(msg); 78 | await sendNotify(msg); 79 | }) 80 | 81 | .catch(function (error) { 82 | console.log("请求数据异常:") 83 | console.log(error); 84 | }); 85 | 86 | })().catch((e) => { 87 | console.log("脚本执行异常") 88 | console.log(e) 89 | }); 90 | 91 | function getStateText(state){ 92 | switch (state) { 93 | case "downloading": 94 | status = "下载"; 95 | break; 96 | case "stalledDL": 97 | status = "等待"; 98 | break; 99 | case "metaDL": 100 | status = "下载元数据"; 101 | break; 102 | case "forcedMetaDL": 103 | status = "[F] 下载元数据"; 104 | break; 105 | case "forcedDL": 106 | status = "[F] 下载"; 107 | break; 108 | case "uploading": 109 | case "stalledUP": 110 | status = "做种"; 111 | break; 112 | case "forcedUP": 113 | status = "[F] 做种"; 114 | break; 115 | case "queuedDL": 116 | case "queuedUP": 117 | status = "排队"; 118 | break; 119 | case "checkingDL": 120 | case "checkingUP": 121 | status = "校验"; 122 | break; 123 | case "queuedForChecking": 124 | status = "排队等待校验"; 125 | break; 126 | case "checkingResumeData": 127 | status = "校验恢复数据"; 128 | break; 129 | case "pausedDL": 130 | status = "暂停"; 131 | break; 132 | case "pausedUP": 133 | status = "完成"; 134 | break; 135 | case "moving": 136 | status = "移动中"; 137 | break; 138 | case "missingFiles": 139 | status = "丢失文件"; 140 | break; 141 | case "error": 142 | status = "错误"; 143 | break; 144 | default: 145 | status = "未知"; 146 | } 147 | return status; 148 | } -------------------------------------------------------------------------------- /quantum-ark.js: -------------------------------------------------------------------------------- 1 | require('./env.js'); 2 | const got = require('got'); 3 | const { 4 | sendNotify 5 | } = require('./quantum'); 6 | 7 | var user_id = process.env.user_id; 8 | var ark = process.env.ark; 9 | 10 | const api = got.extend({ 11 | retry: { limit: 0 }, 12 | }); 13 | 14 | !(async () => { 15 | console.log(ark) 16 | if (ark.split(" ").length != 2) { 17 | return; 18 | } 19 | try { 20 | var options = { 21 | url: 'http://localhost:7777/api/ark?id=' + ark.split(" ")[1] + "&user_id=" + user_id, 22 | method: 'get', 23 | headers: { 24 | Accept: 'text/plain', 25 | "Content-Type": "application/json-patch+json" 26 | }, 27 | }; 28 | console.log(options) 29 | const body = await api(options).json(); 30 | 31 | console.log(body) 32 | await sendNotify(body.message); 33 | } 34 | catch (e) { 35 | console.log(JSON.stringify(e)) 36 | } 37 | })(); -------------------------------------------------------------------------------- /quantum_bill.js: -------------------------------------------------------------------------------- 1 | // 个人账单 2 | 3 | const { 4 | sendNotify, addCustomData, addOrUpdateCustomDataTitle, getCustomData 5 | } = require('./quantum'); 6 | 7 | const moment = require('moment'); 8 | 9 | let CommunicationUserId = process.env.CommunicationUserId; 10 | let CommunicationUserName = process.env.CommunicationUserName; 11 | let ChargeAccount = process.env.ChargeAccount; 12 | let customeDataType = "quantum_bill"; 13 | 14 | !(async () => { 15 | var ttt = ChargeAccount.split(" ") 16 | if (!ChargeAccount || ttt.length != 3) { 17 | await sendNotify("记账功能指令格式\n“支出 买衣服 300”或“收入 捡到钱了 200”"); 18 | return; 19 | } 20 | var money = parseFloat(ttt[2]); 21 | if (money <= 0) { 22 | await sendNotify("记账金额不能为0!"); 23 | return; 24 | } 25 | var titleInfo = { 26 | Type: customeDataType, 27 | TypeName: "记账本", 28 | Title1: "事项", 29 | Title2: "金额", 30 | Title3: "QQ/微信", 31 | Title4: "昵称", 32 | Title5: "类型" 33 | } 34 | var stamp1 = new Date(new Date().setHours(0, 0, 0, 0)) 35 | var startTime = moment(stamp1).format("YYYY-MM-DD HH:mm:ss") 36 | var endTime = moment().format("YYYY-MM-DD HH:mm:ss"); 37 | //await addOrUpdateCustomDataTitle(titleInfo) 38 | var info = { 39 | Type: "quantum_bill", 40 | Data1: ttt[1], 41 | Data2: money, 42 | Data3: CommunicationUserId, 43 | Data4: CommunicationUserName, 44 | Data5: ttt[0].indexOf("支出") > -1 ? "支出" : "收入" 45 | } 46 | 47 | var zc = 0; 48 | var sr = 0; 49 | var ss = await getCustomData(customeDataType, startTime, endTime, { Data3: CommunicationUserId }); 50 | for (var i = 0; i < ss.length; i++) { 51 | if (ss[i].Data5 == "支出") { 52 | zc += parseFloat(ss[i].Data2); 53 | } else { 54 | sr += parseFloat(ss[i].Data2); 55 | } 56 | } 57 | if (ttt[0].indexOf("支出") > -1) { 58 | zc += money; 59 | } else { 60 | sr += money; 61 | } 62 | await addCustomData([info]); 63 | await sendNotify("记账成功!\n" + ChargeAccount + "\n今日统计,收入:" + sr + ",支出:" + zc); 64 | })().catch((e) => {console.log("脚本异常:" + e);}); 65 | -------------------------------------------------------------------------------- /quantum_bill_statistical.js: -------------------------------------------------------------------------------- 1 | // 个人账单 2 | 3 | const { 4 | sendNotify, addCustomData, addOrUpdateCustomDataTitle, getCustomData 5 | } = require('./quantum'); 6 | 7 | const moment = require('moment'); 8 | 9 | let command = process.env.command; 10 | 11 | let CommunicationUserId = process.env.CommunicationUserId; 12 | let CommunicationUserName = process.env.CommunicationUserName; 13 | let ChargeAccount = process.env.ChargeAccount; 14 | let customeDataType = "quantum_bill"; 15 | 16 | !(async () => { 17 | var startTime; 18 | var endTime = moment().format("yyyy-MM-DD HH:mm:ss"); 19 | if (command.indexOf("今日") > -1 || command.indexOf("本日") > -1) { 20 | startTime = moment().format("yyyy-MM-DD 00:00:00"); 21 | } else if (command == "本周账单") { 22 | var wk1 = moment().weekday(1); 23 | if (wk1 > moment()) { 24 | wk1 = wk1.subtract(1, "weeks"); 25 | } 26 | startTime = wk1.format('YYYY-MM-DD 00:00:00'); 27 | } 28 | else if (command.indexOf("当月") > -1 || command.indexOf("本月") > -1) { 29 | startTime = moment().format("yyyy-MM-01 00:00:00"); 30 | } else if (command.indexOf("上月") > -1) { 31 | startTime = moment(new Date()).subtract(1, 'months').format('YYYY-MM-01 00:00:00'); 32 | endTime = moment().format('YYYY-MM-01 00:00:00'); 33 | } 34 | else if (command.indexOf("当年") > -1 || command.indexOf("今年") > -1 || command.indexOf("本年") > -1) { 35 | startTime = moment().format("yyyy-01-01 00:00:00"); 36 | } else if (command.indexOf("全部")) { 37 | startTime = "2020-01-01"; 38 | } 39 | console.log(`查询开始时间:${startTime},结束时间:${endTime}`); 40 | 41 | var ss = await getCustomData(customeDataType, startTime, endTime, { Data3: CommunicationUserId }); 42 | 43 | 44 | var zc = 0; 45 | var sr = 0; 46 | var ss = await getCustomData(customeDataType, startTime, endTime, { Data3: CommunicationUserId }); 47 | for (var i = 0; i < ss.length; i++) { 48 | if (ss[i].Data5 == "支出") { 49 | zc += parseFloat(ss[i].Data2); 50 | } else { 51 | sr += parseFloat(ss[i].Data2); 52 | } 53 | } 54 | await sendNotify(command + "\n" + "\n收入:" + sr + "\n支出:" + zc); 55 | })().catch((e) => {console.log("脚本异常:" + e);}); 56 | -------------------------------------------------------------------------------- /quantum_custom_data_title_init.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 初始化自定义数据标题 4 | * 该标题用于展示数据管理 5 | * Type 不能重复,不能为空。 6 | * 自定义数据共计15个自定义数据字段标题 为 Title1..Title15,数据字段 Data1 ... Data15 7 | * 8 | * */ 9 | const { 10 | addOrUpdateCustomDataTitle, sendNotify 11 | } = require('./quantum'); 12 | 13 | !(async () => { 14 | var quantum_bill = { 15 | Type: "quantum_bill", 16 | TypeName: "记账本", 17 | Title1: "事项", 18 | Title2: "金额", 19 | Title3: "QQ/微信", 20 | Title4: "昵称", 21 | Title5: "类型" 22 | }; 23 | await addOrUpdateCustomDataTitle(quantum_bill) 24 | console.log("初始化量子记账本基础信息。"); 25 | 26 | await addOrUpdateCustomDataTitle({ 27 | Type: "quantum_sn", 28 | TypeName: "积分卡密", 29 | Title1: "卡密", 30 | Title2: "积分", 31 | Title3: "是否使用", 32 | Title4: "QQ/微信", 33 | Title5: "昵称", 34 | Title6: "批次号", 35 | }) 36 | console.log("初始化量子积分卡密基础信息。"); 37 | await addOrUpdateCustomDataTitle({ 38 | Type: "quantum_password", 39 | TypeName: "随机密码", 40 | Title1: "说明", 41 | Title2: "密码", 42 | Title3: "备注", 43 | Title4: "QQ/WX", 44 | Title5: "昵称" 45 | }) 46 | console.log("初始化量子随机密码基础信息。"); 47 | 48 | await addOrUpdateCustomDataTitle({ 49 | Type: "quantum_env_monitor_execution_tasks", 50 | TypeName: "环境变量任务触发", 51 | Title1: "任务名称", 52 | Title2: "青龙脚本名", 53 | Title3: "变量名(多个&隔开)", 54 | Title4: "状态(启用/禁用)", 55 | Title5: "备注" 56 | }) 57 | console.log("初始化量子环境变量监听任务执行基础信息。"); 58 | 59 | 60 | await addOrUpdateCustomDataTitle({ 61 | Type: "quantum_env_monitor_execution_tasks_records", 62 | TypeName: "环境变量监控记录", 63 | Title1: "任务名称", 64 | Title2: "青龙脚本名", 65 | Title3: "变量名(多个&隔开)", 66 | Title4: "变量数据", 67 | Title5: "线报信息" 68 | }) 69 | console.log("初始化环境变量监控记录。"); 70 | 71 | await sendNotify("初始化量子自定义数据标题标题信息完成\r该通知来源脚本:quantum_custom_data_title_init.js") 72 | })().catch((e) => {console.log("脚本异常:" + e);}); 73 | -------------------------------------------------------------------------------- /quantum_enen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * enen 3 | * */ 4 | const { 5 | getEnvs 6 | } = require('./quantum'); 7 | 8 | const got = require('got'); 9 | 10 | 11 | const api = got.extend({ 12 | retry: { limit: 0 }, 13 | }); 14 | 15 | !(async () => { 16 | var jdCookies = await getEnvs("JD_COOKIE", null, 2); 17 | for (var i = 0; i < jdCookies.length; i++) { 18 | const nm = { 19 | url: `https://api.m.jd.com?functionId=helpCoinDozer&appid=station-soa-h5&client=H5&clientVersion=1.0.0&t=1636015855103&body={"actId":"49f40d2f40b3470e8d6c39aa4866c7ff","channel":"coin_dozer","antiToken":"","referer":"-1","frontendInitStatus":"s","packetId":"${packetId}"}&_ste=1&_stk=appid,body,client,clientVersion,functionId,t&h5st=20211104165055104;9806356985655163;10005;tk01wd1ed1d5f30nBDriGzaeVZZ9vuiX+cBzRLExSEzpfTriRD0nxU6BbRIOcSQvnfh74uInjSeb6i+VHpnHrBJdVwzs;017f330f7a84896d31a8d6017a1504dc16be8001273aaea9a04a8d04aad033d9`, 20 | headers: { 21 | "Cookie": cookie, 22 | "Origin": "https://pushgold.jd.com", 23 | }, 24 | method: "get" 25 | } 26 | api(nm).then(async response => { }); 27 | } 28 | })().catch((e) => {console.log("脚本异常:" + e);}); 29 | -------------------------------------------------------------------------------- /quantum_env_forward.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 消息转发 3 | * 4 | * */ 5 | const { 6 | sendNotify 7 | } = require('./quantum'); 8 | 9 | !(async () => { 10 | await sendNotify(process.env.command, false, null, "QQ群号", 1); 11 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /quantum_env_monitor_execution_tasks.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 监控环境变量执行青龙任务 4 | * 5 | * 工作原理 6 | * 1. 监听到export xxx="xxxx" 信息获取到环境变量 7 | * 2. 将环境变量同步到青龙 8 | * 3. 执行脚本 9 | * 10 | * 使用说明 11 | * 1. 请先使用管理员QQ发送 “初始化数据管理标题”给机器人或者通过脚本线报执行,该操作只需要执行一次 12 | * 2. 打开数据管理,筛选到“环境变量任务触发” 13 | * 3. 添加需要触发的环境变量 14 | * 15 | * 任务名填写该任务的名称 如“入会开卡领取 16 | * 青龙脚本名:“jd_OpenCard_Force.js” 17 | * 环境变量填写:“VENDER_ID” 如果有多个环境变量请用&隔开 如 “jd_cjhy_activityId&jd_cjhy_activityUrl” 18 | * 状态:“启用”,如果是其他状态则不执行。 19 | * 20 | * 4. 在青龙配置文件中删除类似 export jd_cjhy_activityId="" 的环境变量 21 | * 22 | * 23 | * */ 24 | 25 | const { 26 | qinglong, getCustomData, getEnvs, addEnvs, sendNotify, sleep, addCustomData 27 | } = require('./quantum'); 28 | const { 29 | syncEnvs 30 | } = require('./quantum_syncEnv'); 31 | 32 | var command = process.env.command+'"'; 33 | var customType = "quantum_env_monitor_execution_tasks" 34 | 35 | /** 36 | * 等待100次(50分钟)后强制执行任务。 37 | * */ 38 | const enforceCount = 200; 39 | var awaitCount = 0; 40 | 41 | /** 42 | * 43 | * 线报执行记录 44 | * 45 | * */ 46 | var recordCustomType = "quantum_env_monitor_execution_tasks_records" 47 | var ManagerQQ = process.env.ManagerQQ 48 | var CommunicationUserId = process.env.CommunicationUserId; //用户通讯id,qq/wx 49 | 50 | var isManager = (ManagerQQ == CommunicationUserId); 51 | var runTask = null; 52 | 53 | !(async () => { 54 | console.log("接收线报信息:" + command); 55 | var tasks = await GetTasks(); 56 | if (!tasks || tasks.length == 0) { 57 | console.log("未配置监控环境变量执行青龙任务!") 58 | return; 59 | } 60 | 61 | var t = Math.round(Math.random() * 3000) + Math.round(Math.random() * 3000) + Math.round(Math.random() * 3000); 62 | console.log("随机延迟" + t + "毫秒"); 63 | await sleep(t); 64 | 65 | var envs = []; 66 | var scriptName = ""; 67 | console.log(`获取到【${tasks.length}】个环境变量触发任务,开始匹配信息。`) 68 | for (var i = 0; i < tasks.length; i++) { 69 | var task = tasks[i]; 70 | if (!task.Data1 || !task.Data2 || !task.Data3) { 71 | console.log("存在不完整的任务信息,请通过数据管理检查相关配置,脚本名,环境变量,任务名不可缺少。"); 72 | continue; 73 | } 74 | var sf = false; 75 | for (var x = 0; x < task.Data3.split("&").length; x++) { 76 | var envName = task.Data3.split("&")[x]; 77 | var reg = `var pattern =/export ${envName}="(.+?)"/`; 78 | eval(reg); 79 | if (pattern.test(command)) { 80 | sf = true; 81 | var value = command.match(pattern)[1]; 82 | console.log(`获取到环境变量:【${envName}】,值:【${value}】`) 83 | envs.push({ 84 | Name: envName, 85 | Value: value, 86 | EnvType: 1, 87 | Enable: true, 88 | }) 89 | } 90 | } 91 | if (sf) { 92 | runTask = task; 93 | scriptName = task.Data2; 94 | console.log(`匹配到任务:【${task.Data1}】,执行脚本:【${task.Data2}】`) 95 | break; 96 | } 97 | } 98 | if (!scriptName || envs.length == 0) { 99 | var tmsg = `线报:【${command}】 100 | 没有配置可执行任务,请通过数据管理配置。` 101 | console.log(tmsg); 102 | await sendNotify(tmsg, true); 103 | return; 104 | } 105 | 106 | console.log("开始检查环境变量是否重复。") 107 | 108 | var sameCount = 0; 109 | 110 | var envKeyValue = []; 111 | for (var i = 0; i < envs.length; i++) { 112 | envKeyValue.push({ 113 | Name: envs[i].Name, 114 | Value: envs[i].Value, 115 | }) 116 | var env = await getEnvs(envs[i].Name, null, 1); 117 | if (env && env.length > 0) { 118 | if (env[0].Value == envs[i].Value) { 119 | console.log(`变量名:【${envs[i].Name}】,值:【${envs[i].Value}】`); 120 | sameCount++; 121 | } 122 | envs[i].Id = env[0].Id; 123 | } 124 | } 125 | 126 | if (sameCount == envs.length) { 127 | var tmsg = `线报:【${command}】 128 | 任务:【${scriptName}】,变量重复。` 129 | console.log(tmsg); 130 | await sendNotify(tmsg, true); 131 | return; 132 | } 133 | 134 | var keyValueString = JSON.stringify(envKeyValue); 135 | console.log("开始检查历史执行记录。"); 136 | 137 | var records = await getCustomData(recordCustomType, null, null, { 138 | Data4: keyValueString 139 | }); 140 | 141 | console.log("keyValueString:" + keyValueString + ",records:" + JSON.stringify(records)) 142 | 143 | if (records.length > 0) { 144 | var tmsg = `线报:【${command}】 145 | 任务:【${scriptName}】跑过了,任务执行时间:【${records[0].CreateTime}】。` 146 | console.log(tmsg); 147 | await sendNotify(tmsg, true); 148 | return; 149 | } 150 | console.log("从青龙中获取脚本任务。") 151 | var tt = await isRunning(scriptName); 152 | 153 | if (tt.notifyMessage && tt.notifyMessage.length > 0) { 154 | await sendNotify(tt.notifyMessage, true); 155 | return; 156 | } 157 | await addCustomData([{ 158 | Type: recordCustomType, 159 | Data1: runTask.Data1, 160 | Data2: runTask.Data2, 161 | Data3: runTask.Data3, 162 | Data4: keyValueString, 163 | Data5: command, 164 | }]) 165 | if (tt.Running) { 166 | await sendNotify(`【${scriptName}】正在执行中,任务加入执行队列!`, true); 167 | await WaitTask(scriptName, envs); 168 | } else { 169 | await RunTask(tt.runTasks, envs, tt.qlName); 170 | } 171 | })().catch((e) => {console.log("脚本异常:" + e);}); 172 | 173 | /** 174 | * 获取启用的任务 175 | * */ 176 | async function GetTasks() { 177 | return await getCustomData(customType, null, null, { 178 | Data4: "启用" 179 | }); 180 | } 181 | 182 | async function isRunning(scriptName) { 183 | var QLTasks = await qinglong.getTask(scriptName); 184 | var running = false; 185 | var runTasks = []; 186 | var qlName = ""; 187 | var notifyMessage = null; 188 | if (!QLTasks.Data || QLTasks.Data.length == 0) { 189 | notifyMessage = `青龙面板中未找到脚本:【${scriptName}】` 190 | console.log(notifyMessage); 191 | } else { 192 | console.log(`在【${QLTasks.Data[0].QLTasks.length}】个青龙中找到脚本任务:【${scriptName}】`); 193 | QLTasks = QLTasks.Data[0].QLTasks; 194 | for (var i = 0; i < QLTasks.length; i++) { 195 | qlName += QLTasks[i].QLName + ","; 196 | if (QLTasks[i].status == 0) { 197 | if (awaitCount > enforceCount) { 198 | console.log(`【${QLTasks[i].QLName}】还在执行任务,等了他妈这么久还没跑完,强制执行脚本:【${scriptName}】!`) 199 | } 200 | else { 201 | console.log(`【${QLTasks[i].QLName}】正在执行脚本:【${scriptName}】!`) 202 | running = true; 203 | break; 204 | } 205 | } 206 | runTasks.push({ 207 | "QLId": QLTasks[i].QLId, 208 | "TaskIds": [ 209 | QLTasks[i]._id 210 | ] 211 | }) 212 | } 213 | } 214 | return { 215 | Running: running, 216 | runTasks: runTasks, 217 | qlName: qlName, 218 | notifyMessage: notifyMessage 219 | }; 220 | } 221 | 222 | /** 223 | * 等待青龙任务 224 | * @param {any} scriptName 脚本名 225 | * @param {any} envs 环境变量 226 | */ 227 | async function WaitTask(scriptName, envs) { 228 | console.log("等待30秒,让原来的任务执行完成吧!"); 229 | awaitCount++; 230 | await sleep(30 * 1000); 231 | var tt = await isRunning(scriptName); 232 | if (tt.Running) { 233 | await WaitTask(scriptName, envs); 234 | } else { 235 | await RunTask(tt.runTasks, envs, tt.qlName); 236 | } 237 | } 238 | 239 | /** 240 | * 执行青龙脚本 241 | * @param {any} runTasks 执行任务队形 242 | * @param {any} envs 环境变量 243 | * @param {any} qlName 青龙 244 | */ 245 | async function RunTask(runTasks, envs, qlName) { 246 | var msg = `从以下青龙中执行监控任务:【${runTask.Data1}】 247 | ${(qlName.substring(0, qlName.length - 1))}`; 248 | if (runTasks.length > 0) { 249 | console.log("同步环境变量到量子中。"); 250 | await addEnvs(envs); 251 | console.log("青龙量子环境变量双向同步"); 252 | await syncEnvs(false) 253 | console.log(msg); 254 | await qinglong.runTask(runTasks); 255 | } 256 | await sendNotify(msg, true); 257 | } -------------------------------------------------------------------------------- /quantum_env_monitor_sync.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 环境变量执行青龙任务数据同步 4 | * 5 | * */ 6 | 7 | const got = require('got'); 8 | const api = got.extend({ 9 | retry: { limit: 0 }, 10 | }); 11 | const { 12 | getCustomData, addCustomData, sendNotify 13 | } = require('./quantum'); 14 | 15 | const type = "quantum_env_monitor_execution_tasks"; 16 | !(async () => { 17 | var config = { 18 | method: 'get', 19 | url: 'http://114.215.146.116:8018/quantum_env_monitor_execution_tasks.json', 20 | }; 21 | const body = JSON.parse((await api(config)).body); 22 | console.log(`从服务器获取${body.length}个监听配置.`); 23 | var ldata = await getCustomData(type) 24 | console.log(`本地获取${body.length}个监听配置.`); 25 | var ndata = []; 26 | var n = ""; 27 | for (var i = 0; i < body.length; i++) { 28 | if (ldata.filter(n => n.Data2 == body[i].Data2 || n.Data3 == body[i].Data3).length > 0) { 29 | console.log(`任务名:${body[i].Data1},脚本名:${body[i].Data2},环境变量:${body[i].Data3}已存在!`); 30 | continue; 31 | } 32 | ndata.push(body[i]) 33 | n += body[i].Data1+"," 34 | } 35 | if (n.length > 1) { 36 | n = n.substring(0, n.length - 1); 37 | n =`【${n}】` 38 | } 39 | if (ndata.length > 0) { 40 | await addCustomData(ndata); 41 | } 42 | await sendNotify(`本次更新到监听任务${ndata.length}个 43 | ${n}请通过量子助手数据管理查看调整。 44 | 本通知来源脚本:quantum_env_monitor_sync.js。`, true); 45 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /quantum_group_whole_ban_disable.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 设置群组全员禁言(取消) 3 | * 需要机器人是管理员 4 | * 设置量子变量 WHOLE_BAN_GROUPS,值为群号,多个群号用&隔开 5 | * 6 | * 取消禁言后发送消息:group_whole_ban_enable_msg 7 | * */ 8 | 9 | const { 10 | set_group_whole_ban 11 | } = require('./quantum'); 12 | 13 | !(async () => { 14 | var groups = process.env.WHOLE_BAN_GROUPS; 15 | console.log("开始执行QQ群组全员禁言(取消禁言):" + groups) 16 | if (!groups) { 17 | console.log("未设置环境变量:WHOLE_BAN_GROUPS,结束了。") 18 | return; 19 | } else { 20 | var group_whole_ban_enable_msg = process.env.group_whole_ban_enable_msg || ""; 21 | console.log("取消全员禁言后发送群消息:" + group_whole_ban_enable_msg); 22 | await set_group_whole_ban(groups, false, group_whole_ban_enable_msg); 23 | } 24 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /quantum_group_whole_ban_enable.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 设置群组全员禁言 4 | * 需要机器人是管理员 5 | * 设置量子变量 WHOLE_BAN_GROUPS,值为群号,多个群号用&隔开 6 | * 7 | * 取消禁言后发送消息:group_whole_ban_disable_msg 8 | * */ 9 | 10 | const { 11 | set_group_whole_ban 12 | } = require('./quantum'); 13 | 14 | 15 | !(async () => { 16 | var groups = process.env.WHOLE_BAN_GROUPS; 17 | console.log("开始执行QQ群组全员禁言:" + groups) 18 | if (!groups) { 19 | console.log("未设置环境变量:WHOLE_BAN_GROUPS,结束了。") 20 | return; 21 | } else { 22 | var group_whole_ban_disable_msg = process.env.group_whole_ban_disable_msg || ""; 23 | console.log("全员禁言后发送群消息:" + group_whole_ban_disable_msg ) 24 | await set_group_whole_ban(groups, true, group_whole_ban_disable_msg); 25 | } 26 | })().catch((e) => {console.log("脚本异常:" + e);}); 27 | -------------------------------------------------------------------------------- /quantum_mine.js: -------------------------------------------------------------------------------- 1 | const { 2 | sendNotify, getUserInfo 3 | } = require('./quantum'); 4 | 5 | !(async () => { 6 | var user = await getUserInfo(); 7 | await sendNotify(`绑定QQ:${user.qq || '未绑定'} 8 | 绑定微信:${user.wxid || '未绑定'} 9 | Web用户:${user.UserName || '未绑定'} 10 | 用户权重:${user.Weight} 11 | 剩余积分:${user.MaxEnvCount}`); 12 | })().catch((e) => {console.log("脚本异常:" + e);}); 13 | -------------------------------------------------------------------------------- /quantum_myScore.js: -------------------------------------------------------------------------------- 1 | // 验证卡密 2 | 3 | const { 4 | sendNotify, getUserInfo 5 | } = require('./quantum'); 6 | 7 | 8 | !(async () => { 9 | var user = await getUserInfo(); 10 | await sendNotify(`您的剩余积分:${user.MaxEnvCount}`); 11 | })(); 12 | -------------------------------------------------------------------------------- /quantum_passwod.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 生成一个随机密码 4 | * 如果带 -1 则不保存数据库 5 | * 如 随机密码-1 6 | * 7 | * */ 8 | 9 | const { 10 | sendNotify, addOrUpdateCustomDataTitle, addCustomData, uuid 11 | } = require('./quantum'); 12 | 13 | var custom_data_type = "quantum_password" 14 | 15 | !(async () => { 16 | var sns = []; 17 | var nnn = uuid(18, null, "!@#$%^&*()-=_+,.;':"); 18 | sns.push({ 19 | Type: custom_data_type, 20 | Data1: process.env.command.replace("随机密码", ""), 21 | Data2: nnn, 22 | Data3: process.env.command, 23 | Data4: process.env.CommunicationUserId, 24 | Data5: process.env.CommunicationUserName, 25 | }); 26 | 27 | console.log("生成密码:" + nnn); 28 | if (process.env.command.indexOf("-1") < 0) { 29 | await addCustomData(sns); 30 | } else { 31 | await sendNotify("该密码不会被保存,请妥善保管。") 32 | } 33 | await sendNotify(nnn); 34 | })().catch((e) => {console.log("脚本异常:" + e);}); 35 | -------------------------------------------------------------------------------- /quantum_passwod_query.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 查询我的密码 3 | * 4 | * 如: 我的密码 量子 5 | * 则查询有关量子的密码 6 | * 7 | * */ 8 | 9 | const { 10 | sendNotify, getCustomData 11 | } = require('./quantum'); 12 | 13 | var custom_data_type = "quantum_password" 14 | var command = process.env.command; 15 | !(async () => { 16 | command = command.replace("我的密码", "").trim(); 17 | if(!command){ 18 | await sendNotify("该指令格式为:我的密码xxxx"); 19 | return; 20 | } 21 | var datas = await getCustomData(custom_data_type, null, null, { Data1: command, Data4: process.env.CommunicationUserId }); 22 | if (datas.length<=0){ 23 | await sendNotify(`没有找到关键词:${command}的密码。`); 24 | return; 25 | } 26 | var message ="为您找到以下密码:"; 27 | for (let index = 0; index < datas.length; index++) { 28 | const element = datas[index]; 29 | message+=`\r${element.Data1},密码:${element.Data2},备注:${element.Data3}`; 30 | } 31 | await sendNotify(message); 32 | })().catch((e) => {console.log("脚本异常:" + e);}); 33 | -------------------------------------------------------------------------------- /quantum_setpassword.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 重设Web登录密码 4 | * 5 | * */ 6 | 7 | const { 8 | sendNotify, api,serverAddres 9 | } = require('./quantum'); 10 | 11 | 12 | let user_id = process.env.user_id; 13 | let password = process.env.password 14 | 15 | !(async () => { 16 | if (!password) { 17 | await sendNotify("请回复您要设置的密码,长度8至16个字符:"); 18 | return; 19 | } 20 | var body = await api({ 21 | url: serverAddres+'api/User/setPassword', 22 | method: 'post', 23 | body: JSON.stringify({ 24 | UserId: user_id, 25 | Password: password 26 | }), 27 | headers: { 28 | Accept: 'text/plain', 29 | "Content-Type": "application/json-patch+json" 30 | }, 31 | }).json(); 32 | console.log(body); 33 | if (!body.Data) { 34 | await sendNotify("设置密码出错了,请联系管理员吧!"); 35 | } else { 36 | await sendNotify("密码设置成功!"); 37 | } 38 | })().catch((e) => { 39 | console.log("设置Web登录密码出现异常:"); 40 | console.log(e) 41 | }) 42 | -------------------------------------------------------------------------------- /quantum_sn.js: -------------------------------------------------------------------------------- 1 | // 生成卡密 2 | 3 | const { 4 | sendNotify, uuid, addCustomData, addOrUpdateCustomDataTitle 5 | } = require('./quantum'); 6 | 7 | 8 | //一个序列号多少个积分 9 | let sn_score = process.env.sn_score; 10 | 11 | //一次生成多少个序列号 12 | let sn_count = process.env.sn_count; 13 | 14 | var custom_data_type = "quantum_sn" 15 | 16 | !(async () => { 17 | /** 18 | * 19 | * 自定义数据 type: quantum_sn 20 | * Data1 序列号 21 | * Data2 积分 22 | * Data3 是否使用 23 | * 24 | **/ 25 | 26 | if (sn_score && sn_count) { 27 | if (sn_count * 1 < 1) { 28 | await sendNotify("卡密积分必须大于0") 29 | return; 30 | } 31 | var sns = []; 32 | var nnn = uuid(12); 33 | for (var i = 0; i < sn_count; i++) { 34 | var sss = "QTSN" + uuid(22, 16) 35 | sns.push({ 36 | Type: custom_data_type, 37 | Data1: sss, 38 | Data2: sn_score, 39 | Data3: "否", 40 | Data6: nnn 41 | }); 42 | console.log(sss); 43 | } 44 | 45 | //await addOrUpdateCustomDataTitle({ 46 | // Type: custom_data_type, 47 | // TypeName: "积分卡密", 48 | // Title1: "卡密", 49 | // Title2: "积分", 50 | // Title3: "是否使用", 51 | // Title4: "QQ/微信", 52 | // Title5: "昵称", 53 | // Title6: "批次号", 54 | //}) 55 | result = await addCustomData(sns); 56 | var tt = `[CQ:face,id=66]创建${sn_count}个卡密,每个${sn_score}积分\n卡密批次:` + nnn; 57 | for (var i = 0; i < result.length; i++) { 58 | tt += "\n" + result[i].Data1; 59 | if (i + 1 % 30 == 0) { 60 | await sendNotify(tt); 61 | tt = ""; 62 | } 63 | } 64 | await sendNotify(tt); 65 | } else if (sn_count) { 66 | if (sn_count * 1 < 1) { 67 | await sendNotify("卡密个数必须大于0") 68 | return; 69 | } 70 | await sendNotify("请回复每个卡密多少积分:") 71 | } else { 72 | await sendNotify("请回复生成卡密个数:") 73 | } 74 | })().catch((e) => {console.log("脚本异常:" + e);}); 75 | -------------------------------------------------------------------------------- /quantum_subscribe.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 量子订阅 4 | * 只支持无需指令参数 或者参数和指令同时发送给机器人的 5 | * 6 | **/ 7 | const { 8 | sendNotify, uuid, addCustomData 9 | } = require('./quantum'); 10 | // 开始订阅 11 | let subscribe = process.env.subscribe; 12 | // 订阅类型 13 | let subscribe_type = process.env.subscribe_type; 14 | // 触发时间 15 | let subscribe_time = process.env.subscribe_time; 16 | // 指令参数 17 | let subscribe_params = process.env.subscribe_params; 18 | 19 | 20 | !(async () => { 21 | 22 | var subscribes = [{ 23 | Command: "查询" 24 | }, { 25 | Command: "天气", 26 | Param: true, 27 | ParamTip: '请回复您要订阅天气的城市:' 28 | }, { 29 | Command: "每日英语" 30 | }, { 31 | Command: "情话" 32 | }, { 33 | Command: "网易云热评" 34 | }, { 35 | Command: "清理购物车" 36 | }, { 37 | Command: "买家秀" 38 | }, { 39 | Command: "一言" 40 | }, { 41 | Command: "骚话" 42 | }, { 43 | Command: "活动领取" 44 | }, { 45 | Command: "月度查询" 46 | }, { 47 | Command: "舔狗日记" 48 | }] 49 | 50 | 51 | 52 | 53 | /** 54 | * 55 | * 订阅自定义数据 56 | * Type: subscribe 57 | * Data1: user_id 58 | * Data2: 触发指令 59 | * Data3: 订阅参数 60 | * Data4: 触发时间 61 | * 62 | **/ 63 | 64 | 65 | 66 | })().catch((e) => {console.log("脚本异常:" + e);}); 67 | -------------------------------------------------------------------------------- /quantum_syncEnv.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 环境变量同步 4 | * 5 | * */ 6 | 7 | 8 | 9 | const { 10 | addEnvs, sendNotify, allEnvs, getQLPanels, getQLEnvs, syncEnv 11 | } = require('./quantum'); 12 | 13 | let notifyMessage = ""; 14 | 15 | /** 16 | * 青龙量子双向 同步环境变量 17 | * @param {any} notify 18 | */ 19 | async function sync(notify) { 20 | console.log("开始同步环境变量。") 21 | var allQuantumEnvs = await allEnvs(); 22 | var commonEnvs = allQuantumEnvs.filter((n => n.EnvType == 1)); 23 | var userEnvs = allQuantumEnvs.filter((n => n.EnvType == 2)); 24 | var qlPanels = (await getQLPanels()).filter((n) => n.Enable); 25 | 26 | var m = `环境变量:${allQuantumEnvs.length}个 27 | 公共变量:${commonEnvs.length}个 28 | 用户变量:${userEnvs.length}个 29 | 量子变量:${allQuantumEnvs.filter((n => n.EnvType == 3)).length}个 30 | 青龙容器:${qlPanels.length}个`; 31 | console.log(m); 32 | notifyMessage = m; 33 | 34 | if (qlPanels.length == 0) { 35 | console.log("没青龙容器,不同步."); 36 | return; 37 | } 38 | //新增或者更新的CK 39 | var newCKs = []; 40 | 41 | for (var i = 0; i < qlPanels.length; i++) { 42 | var ql = qlPanels[i]; 43 | if (ql.Weight <= 0) { 44 | console.log(`青龙容器:${ql.Name}权重小于1跳过同步`); 45 | continue; 46 | } 47 | var qlEnvs = await getQLEnvs(ql); 48 | console.log(`青龙容器:${ql.Name},获取环境变量:${qlEnvs.length}个`); 49 | for (var x = 0; x < qlEnvs.length; x++) { 50 | var qlenv = qlEnvs[x]; 51 | if (qlenv == undefined) { 52 | continue; 53 | } 54 | if (qlenv.name == "JD_COOKIE" && qlenv.status == 0) { 55 | var pt_pin = qlenv.value.match(/pt_pin=([^; ]+)(?=;?)/)[1] 56 | try { 57 | var qEnv = userEnvs.filter((n) => n.Value.indexOf(pt_pin) > -1)[0]; 58 | //如果青龙中的环境变量更新时间更晚,则使用青龙的环境变量. 59 | if (qEnv && qEnv.Value != qlenv.value && Date.parse(qlenv.timestamp) > Date.parse(qEnv.UpdateTime)) { 60 | qEnv.Value = qlenv.value; 61 | qEnv.Enable = true; 62 | console.log(`容器:${ql.Name}中,pt_pin:${pt_pin} CK更新时间${qlenv.timestamp},将青龙中的环境变量更新到量子。`); 63 | newCKs.push(qEnv); 64 | } 65 | //如果在量子中没有找到对应的环境变量则新增 66 | else if (!qEnv || !qEnv.Id) { 67 | console.log("青龙容器中有新的CK:" + qlenv.value); 68 | //已经新增的变量同步更新对应关联的容器 69 | var newCK = newCKs.filter((b) => b.Value == qlenv.value)[0]; 70 | if (newCK) { 71 | newCK.QLPanelEnvs.push({ 72 | QLPanelId: ql.Id, 73 | Mode: 2 74 | }); 75 | } else { 76 | newCKs.push({ 77 | Value: qlenv.value, 78 | Name: qlenv.name, 79 | Enable: true, 80 | UserRemark: qlenv.remarks, 81 | Remark: qlenv.remarks, 82 | EnvType: 2, 83 | Weight: 0, 84 | QLPanelEnvs: [{ 85 | QLPanelId: ql.Id, 86 | Mode: 2 87 | }] 88 | }); 89 | } 90 | } 91 | } catch (e) { 92 | console.log("Error:" + console.log(qlenv)); 93 | } 94 | } 95 | } 96 | qlPanels[i].Envs = []; 97 | qlPanels[i].EnvCount = 0; 98 | } 99 | 100 | console.log("CK处理完成") 101 | if (newCKs && newCKs.length > 0) { 102 | console.log("将新增或更新的CK同步到量子助手:" + newCKs.length); 103 | notifyMessage += "\r从青龙更新变量:" + newCKs.length + "个"; 104 | await addEnvs(newCKs); 105 | } 106 | let message = await syncEnv(); 107 | if (message) { 108 | for (var i = 0; i < message.length; i++) { 109 | console.log(message[i]); 110 | notifyMessage += "\r" + message[i] 111 | } 112 | } 113 | if (notify) { 114 | sendNotify(notifyMessage, true) 115 | } 116 | } 117 | 118 | module.exports.syncEnvs = sync; 119 | -------------------------------------------------------------------------------- /quantum_validate_sn.js: -------------------------------------------------------------------------------- 1 | // 验证卡密 2 | 3 | const { 4 | sendNotify, getCustomData, getUserInfo, updateUserInfo, updateCustomData 5 | } = require('./quantum'); 6 | 7 | //用户提交的序列号 8 | let sn = process.env.quantum_validate_sn; 9 | 10 | let CommunicationUserId = process.env.CommunicationUserId; 11 | let CommunicationUserName = process.env.CommunicationUserName; 12 | 13 | !(async () => { 14 | /** 15 | * 16 | * 自定义数据 type: quantum_sn 17 | * Data1 序列号 18 | * Data2 积分 19 | * Data3 是否使用 20 | * 21 | **/ 22 | 23 | if (!sn || sn.length != 26) { 24 | await sendNotify("错误的卡密。"); 25 | return; 26 | } 27 | 28 | console.log("获取所有的卡密信息"); 29 | var datas = await getCustomData("quantum_sn"); 30 | 31 | var ts = datas.filter((t) => t.Data1 == sn); 32 | if (ts.length == 0) { 33 | console.log("您的卡密错误:" + sn); 34 | await sendNotify("您的卡密错误。") 35 | return; 36 | } 37 | 38 | if (ts[0].Data3 == "1" || ts[0].Data3 == "是") { 39 | console.log("该卡密已经使用过了:" + sn); 40 | await sendNotify("该卡密已经使用过了!") 41 | return; 42 | } 43 | var user = await getUserInfo(); 44 | if (user) { 45 | user.MaxEnvCount += parseInt(ts[0].Data2); 46 | } else { 47 | console.log("获取用户信息失败了:" + JSON.stringify(user)); 48 | } 49 | var updateInfo = await updateUserInfo(user); 50 | if (updateInfo) { 51 | ts[0].Data3 = "是" 52 | ts[0].Data4 = CommunicationUserId; 53 | ts[0].Data5 = CommunicationUserName; 54 | var updateSNInfo = await updateCustomData(ts[0]); 55 | console.log("更新卡密状态:" + updateSNInfo.Code); 56 | await sendNotify("提交卡密成功,剩余积分:" + user.MaxEnvCount); 57 | } else { 58 | console.log("更新用户信息失败了!"); 59 | await sendNotify("更新剩余积分失败!"); 60 | } 61 | })().catch((e) => {console.log("脚本异常:" + e);}); 62 | -------------------------------------------------------------------------------- /reping.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 网易云热评 3 | * */ 4 | 5 | const got = require('got'); 6 | const { 7 | sendNotify 8 | } = require('./quantum'); 9 | 10 | const api = got.extend({ 11 | retry: { limit: 0 }, 12 | }); 13 | 14 | !(async () => { 15 | var len = 20; 16 | await api({ 17 | url: 'https://api.vvhan.com/api/reping', 18 | headers: { 19 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 20 | }, 21 | method: 'get', 22 | }).then(async response => { 23 | var body = JSON.parse(response.body) 24 | console.log(body); 25 | var message = `${body.data.content} --- ${body.data.auther} 26 | [CQ:image,file=${body.data.picUrl.replace("\\", "")},type=show,id=40004]` 27 | console.log(message) 28 | await sendNotify(message) 29 | }); 30 | })().catch((e) => {console.log("脚本异常:" + e);}); 31 | -------------------------------------------------------------------------------- /saohua.js: -------------------------------------------------------------------------------- 1 | // 骚话 2 | 3 | const got = require('got'); 4 | const { 5 | sendNotify 6 | } = require('./quantum'); 7 | 8 | const api = got.extend({ 9 | retry: { limit: 0 }, 10 | }); 11 | 12 | !(async () => { 13 | var len = 20; 14 | await api({ 15 | url: 'https://api.vvhan.com/api/sao', 16 | headers: { 17 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 18 | }, 19 | method: 'get', 20 | }).then(async response => { 21 | var body = response.body 22 | var message = ""; 23 | for (var i = 0; i < body.split("\n").length; i++) { 24 | var t = body.split("\n")[i]; 25 | if (t.length < len + 5) { 26 | message += t + "\n" 27 | } else { 28 | for (var x = 0; x < t.length / len; x++) { 29 | message += t.substring(x * len, (x + 1) * len) + "\n"; 30 | } 31 | } 32 | } 33 | await sendNotify(message) 34 | console.log(message) 35 | }); 36 | })().catch((e) => {console.log("脚本异常:" + e);}); 37 | -------------------------------------------------------------------------------- /sendNotify.js: -------------------------------------------------------------------------------- 1 | 2 | const { 3 | sendNotify2 4 | } = require('./quantum'); 5 | 6 | async function sendNotify( 7 | text, 8 | desp, 9 | params = {}, 10 | ) { 11 | await sendNotify2(desp); 12 | } 13 | 14 | module.exports = { 15 | sendNotify 16 | }; -------------------------------------------------------------------------------- /sqlite.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var sqlite3 = require('sqlite3').verbose(); 3 | 4 | var DB = DB || {}; 5 | 6 | DB.SqliteDB = function (file) { 7 | DB.db = new sqlite3.Database(file); 8 | 9 | DB.exist = fs.existsSync(file); 10 | if (!DB.exist) { 11 | console.log(file + "文件不存在!"); 12 | fs.openSync(file, 'w'); 13 | }; 14 | }; 15 | 16 | DB.printErrorInfo = function (err) { 17 | console.log("Error Message:" + err.message + " ErrorNumber:" + errno); 18 | }; 19 | 20 | DB.SqliteDB.prototype.queryData = function (sql, callback) { 21 | DB.db.all(sql, function (err, rows) { 22 | if (null != err) { 23 | DB.printErrorInfo(err); 24 | return; 25 | } 26 | if (callback) { 27 | callback(rows); 28 | } 29 | }); 30 | }; 31 | 32 | DB.SqliteDB.prototype.close = function () { 33 | DB.db.close(); 34 | }; 35 | 36 | exports.SqliteDB = DB.SqliteDB; -------------------------------------------------------------------------------- /syncEnv.js: -------------------------------------------------------------------------------- 1 | const { 2 | sendNotify 3 | } = require('./quantum'); 4 | const { 5 | syncEnvs 6 | } = require('./quantum_syncEnv'); 7 | 8 | let isSystem = process.env.IsSystem == "true"; 9 | 10 | !(async () => { 11 | if (!isSystem) { 12 | await sendNotify("开始同步环境变量了,可能要点时间,骚等一下。", true) 13 | } 14 | await syncEnvs(!isSystem); 15 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /syncQQBotEnv.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * 本脚本支持环境变量 及 说明 4 | * QQBotAddress QQBot 访问地址如:http://192.168.1.100:5010 5 | * QQBotUserName QQBot 用户名名 如:admin 6 | * QQBotPassWord QQBot 密码 如: admin123 7 | **/ 8 | const got = require('got'); 9 | const { 10 | addEnvs, sendNotify 11 | } = require('./quantum'); 12 | 13 | // 在环境变量中添加下面这三个环境变量 14 | let QQBotAddress = process.env.QQBotAddress; //qqbot 地址 http://1.1.1.1:5010 15 | let QQBotUserName = process.env.QQBotUserName; //qqbot 用户名 16 | let QQBotPassWord = process.env.QQBotPassWord; //qqbot 密码 17 | 18 | 19 | 20 | let isSystem = process.env.IsSystem == "true"; 21 | 22 | const api = got.extend({ 23 | retry: { limit: 0 }, 24 | }); 25 | 26 | !(async () => { 27 | console.log("开始同步QQBot 环境变量数据。。。。。请骚后。。。。") 28 | if (!QQBotAddress || !QQBotUserName || !QQBotPassWord) { 29 | var message = "QQBot 地址,账号,密码环境变量缺一不可。\r请查看脚本配置环境变量" 30 | console.log(message) 31 | sendNotify(message, true) 32 | return false; 33 | } 34 | if (!isSystem) { 35 | sendNotify("开始从qqbot同步环境变量了,可能要点时间,骚等一下。", true) 36 | } 37 | console.log("开始同步环境变量。" + new Date()) 38 | 39 | var options = { 40 | url: QQBotAddress + '/api/login', 41 | form: { 42 | username: QQBotUserName, password: QQBotPassWord 43 | }, 44 | method: 'post', 45 | headers: { 46 | Accept: 'text/plain', 47 | "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" 48 | }, 49 | }; 50 | const body = await api(options).json(); 51 | var token = ""; 52 | if (body.Code == 200) { 53 | token = body.Data; 54 | } else { 55 | console.log(body.Message); 56 | return; 57 | } 58 | 59 | const jdCookies = await api({ 60 | url: QQBotAddress + '/api/JDCookie?Available=true', 61 | headers: { 62 | Accept: 'text/plain', 63 | Authorization: "Bearer " + token 64 | }, 65 | }).json(); 66 | 67 | if (jdCookies.Code == 200) { 68 | var cks = jdCookies.Data; 69 | console.log("获取COOKIE完成,共计有效CK:" + cks.length + "个."); 70 | console.log("开始同步到量子助手。请稍后。。。。。"); 71 | var envs = []; 72 | for (var i = 0; i < cks.length; i++) { 73 | var ck = cks[i]; 74 | envs.push({ 75 | Name: "JD_COOKIE", 76 | Enable: true, 77 | Value: `pt_key=${ck.PTKey};pt_pin=${ck.PTPin};`, 78 | Remark: ck.Remark, 79 | UserRemark: ck.nickname, 80 | Weight: ck.Priority, 81 | UserId: ck.QQ, 82 | EnvType: 2 83 | }) 84 | } 85 | 86 | var data = await addEnvs(envs); 87 | if (data.Code != 200) { 88 | console.log("同步CK异常") 89 | return; 90 | } 91 | console.log("同步完成拉!"); 92 | sendNotify("同步qqbot环境变量完成了,一共有" + cks.length + "个有效CK。", true) 93 | } else { 94 | console.log(jdCookies.Message); 95 | } 96 | })().catch((e) => {console.log("脚本异常:" + e);}); 97 | -------------------------------------------------------------------------------- /syncXdd.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var SqliteDB = require('./sqlite.js').SqliteDB; 3 | 4 | const { 5 | addEnvs 6 | } = require('./quantum'); 7 | 8 | 9 | var file = process.env.XDD_DB || '../../db/xdd.db'; 10 | if (!file) { 11 | console.log("没有配置 XDD_DB 环境变量."); 12 | return; 13 | } 14 | 15 | (async () => { 16 | try { 17 | var res = await isFileExisted(); 18 | console.log(res); 19 | var sqliteDB = new SqliteDB(file); 20 | var querySql = `select PtKey,PtPin,QQ,Priority,Nickname from jd_cookies WHERE PtKey<>'' and Available='true'`; 21 | sqliteDB.queryData(querySql, dataDeal); 22 | sqliteDB.close(); 23 | } catch (error) { 24 | console.log(error); 25 | } 26 | })().catch((e) => {console.log("脚本异常:" + e);}); 27 | 28 | 29 | function isFileExisted() { 30 | return new Promise(function (resolve, reject) { 31 | fs.access(file, (err) => { 32 | if (err) { 33 | console.log(`访问${file}文件失败,文件不存在.`); 34 | reject(err.message); 35 | } else { 36 | resolve('existed'); 37 | } 38 | }) 39 | }) 40 | } 41 | 42 | async function dataDeal(objects) { 43 | 44 | console.log("从xdd数据库中获取有效CK共" + objects.length + "条."); 45 | var envs = []; 46 | for (var i = 0; i < objects.length; ++i) { 47 | 48 | var ck = objects[i]; 49 | var c = `pt_key=${ck.PtKey};pt_pin=${ck.PtPin};` 50 | console.log(c); 51 | envs.push({ 52 | Name: "JD_COOKIE", 53 | Enable: true, 54 | Value: c, 55 | Remark: ck.Remark, 56 | UserRemark: ck.nickname, 57 | Weight: ck.Priority, 58 | UserId: ck.QQ, 59 | EnvType: 2 60 | }) 61 | } 62 | console.log("开始同步到量子环境变量"); 63 | var data = await addEnvs(envs); 64 | if (data.Code != 200) { 65 | console.log("同步CK异常") 66 | return; 67 | } 68 | console.log("XDD数据库同步完成拉!"); 69 | } -------------------------------------------------------------------------------- /tgrj.js: -------------------------------------------------------------------------------- 1 |  2 | ///舔狗日记 3 | const got = require('got'); 4 | const { 5 | sendNotify 6 | } = require('./quantum'); 7 | 8 | const api = got.extend({ 9 | retry: { limit: 0 }, 10 | }); 11 | 12 | !(async () => { 13 | 14 | var len = 20; 15 | await api({ 16 | url: 'http://shengapi.cn/api/tgrj.php', 17 | headers: { 18 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 19 | }, 20 | method: 'get', 21 | }).then(async response => { 22 | var body = response.body 23 | var message = ""; 24 | for (var i = 0; i < body.split("\n").length; i++) { 25 | var t = body.split("\n")[i]; 26 | if (t.length < len + 5) { 27 | message += t + "\n" 28 | } else { 29 | for (var x = 0; x < t.length / len; x++) { 30 | message += t.substring(x * len, (x + 1) * len) + "\n"; 31 | } 32 | } 33 | } 34 | await sendNotify(message) 35 | console.log(message) 36 | }); 37 | })().catch((e) => {console.log("脚本异常:" + e);}); 38 | -------------------------------------------------------------------------------- /ttl.js: -------------------------------------------------------------------------------- 1 | const $ = new Env('太太乐'); 2 | var request = require("request"); 3 | let status; 4 | status = (status = ($.getval("ttlstatus") || "1")) > 1 ? `${status}` : ""; // 账号扩展字符 5 | let ttlhdArr = [] 6 | 7 | 8 | const host = 'https://www.ttljf.com/ttl_chefHub/' 9 | 10 | 11 | const { 12 | sendNotify, allEnvs 13 | } = require('./quantum'); 14 | 15 | const got = require('got'); 16 | 17 | 18 | const api = got.extend({ 19 | retry: { limit: 0 }, 20 | }); 21 | 22 | 23 | !(async () => { 24 | if (process.env.ttlhd) { 25 | ttlhdArr = process.env.ttlhd.split('&'); 26 | } 27 | console.log(`共${ttlhdArr.length}个太太乐 token`) 28 | console.log(`任务提示未登录请通过微信小程序“太太乐餐饮服务”登陆一次\n并且通过“太太乐餐饮服务”公众号 底部“积分商城”,“完善信息”`) 29 | for (let k = 0; k < ttlhdArr.length; k++) { 30 | $.message = "" 31 | ttlhd = ttlhdArr[k] 32 | console.log(`开始【太太乐${k + 1}】`) 33 | await $.wait(5000); 34 | await sign() 35 | await $.wait(5000); 36 | await blog() 37 | await $.wait(5000); 38 | await my() 39 | } 40 | })() 41 | .catch((e) => $.logErr(e)) 42 | .finally(() => $.done()) 43 | 44 | 45 | async function blog() { 46 | return new Promise((resolve) => { 47 | body = { "id": "A35D575F-C004-4717-AABC-ED9D1979C3FA", "type": "blog" } 48 | request.put(ttl('Common/share/A35D575F-C004-4717-AABC-ED9D1979C3FA/blog', body), function (error, response, body) { 49 | try { 50 | if (error) { 51 | console.log(`${JSON.stringify(err)}`) 52 | console.log(`${$.name} API请求失败,请检查网路重试`) 53 | } 54 | data = JSON.parse(body); 55 | if (data.code == 0) { 56 | console.log('分享任务:' + data.message) 57 | } else 58 | if (data.code != 0) { 59 | console.log('分享任务:' + data.message) 60 | } 61 | } catch (e) { 62 | $.logErr(e, resp) 63 | } finally { 64 | resolve(data); 65 | } 66 | }); 67 | }) 68 | } 69 | 70 | async function sign() { 71 | return new Promise((resolve) => { 72 | request.put(ttl('user/api/sign/today', ''), function (error, response, body) { 73 | try { 74 | if (error) { 75 | console.log(`${JSON.stringify(err)}`) 76 | console.log(`${$.name} API请求失败,请检查网路重试`) 77 | } 78 | data = JSON.parse(body); 79 | if (data.code == 0) { 80 | console.log('签到任务:' + data.message) 81 | 82 | } else 83 | if (data.code != 0) { 84 | console.log('签到任务:' + data.message) 85 | } 86 | } catch (e) { 87 | $.logErr(e, resp) 88 | } finally { 89 | resolve(data); 90 | } 91 | }); 92 | }) 93 | } 94 | function my() { 95 | return new Promise((resolve) => { 96 | $.get(ttlget('user/api/my'), async (err, resp, data) => { 97 | 98 | try { 99 | if (err) { 100 | console.log(`${JSON.stringify(err)}`) 101 | console.log(`${$.name} API请求失败,请检查网路重试`) 102 | } 103 | if (safeGet(data)) { 104 | data = JSON.parse(data); 105 | if (data.code == 0) { 106 | console.log('\n积分:' + data.data.integral) 107 | 108 | 109 | } 110 | } else if (data.code != 0) { 111 | console.log(data.message) 112 | 113 | } 114 | } catch (e) { 115 | $.logErr(e, resp) 116 | } finally { 117 | resolve(data); 118 | } 119 | }) 120 | }) 121 | } 122 | 123 | 124 | function ttl(a, body) { 125 | return { 126 | url: `${host}${a}`, 127 | body: `${body}`, 128 | headers: { 129 | 'Host': 'www.ttljf.com', 130 | 'Accept': 'application/json, text/plain, */*', 131 | 'content-type': 'application/json', 132 | 'token': ttlhd, 133 | 'X-Requested-With': 'XMLHttpRequest', 134 | 'Accept-Encoding': 'gzip,compress,br,deflate', 135 | '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.14(0x18000e2f) NetType/4G Language/zh_CN', 136 | 'Referer': 'https://servicewechat.com/wxe9aa8f1c4a77ddf5/17/page-frame.html', 137 | 138 | } 139 | } 140 | } 141 | function ttlget(a) { 142 | return { 143 | 144 | url: `${host}${a}`, 145 | headers: { 146 | 'Host': 'www.ttljf.com', 147 | 'Accept': 'application/json, text/plain, */*', 148 | 'content-type': 'application/json', 149 | 'token': ttlhd, 150 | 'X-Requested-With': 'XMLHttpRequest', 151 | 'Accept-Encoding': 'gzip,compress,br,deflate', 152 | '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.14(0x18000e2f) NetType/4G Language/zh_CN', 153 | 'Referer': 'https://servicewechat.com/wxe9aa8f1c4a77ddf5/17/page-frame.html', 154 | 155 | } 156 | } 157 | } 158 | 159 | function safeGet(data) { 160 | try { 161 | if (typeof JSON.parse(data) == "object") { 162 | return true; 163 | } 164 | } catch (e) { 165 | console.log(e); 166 | console.log(`京东服务器访问数据为空,请检查自身设备网络情况`); 167 | return false; 168 | } 169 | } 170 | 171 | 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(); s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { 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 } } } }; if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { let t = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } 172 | -------------------------------------------------------------------------------- /ttl_charge.js: -------------------------------------------------------------------------------- 1 |  2 | //太太乐自动兑换 3 | const got = require('got'); 4 | const { 5 | allEnvs 6 | } = require('./quantum'); 7 | 8 | //https://www.ttljf.com/ttl_site/chargeApi.do?giftId=话费id&method=charge&mobile=手机号&userId=ID变量&loginToken=token 9 | 10 | //联通2 61 联通 5 62 电信10 633 移动 30 631 11 | const api = got.extend({ 12 | retry: { limit: 0 }, 13 | }); 14 | 15 | !(async () => { 16 | 17 | var ids = [{ 18 | Key: "移动30", 19 | Id: 631, 20 | }, { 21 | Key: "电信10", 22 | Id: 633, 23 | }, { 24 | Key: "联通5", 25 | Id: 62, 26 | }, { 27 | Key: "联通2", 28 | Id: 61, 29 | }] 30 | 31 | var t = await allEnvs("ttlhd", 3, true); 32 | if (t.length > 0) { 33 | for (var c = 0; c < 5; c++) { 34 | console.log(`开始第${c + 1}次兑换`); 35 | for (var x = 0; x < t.length; x++) { 36 | var r = JSON.parse(t[x].UserRemark) 37 | for (var i = 0; i < ids.length; i++) { 38 | const body = await api({ 39 | url: `https://www.ttljf.com/ttl_site/chargeApi.do?giftId=${ids[i].Id}&method=charge&mobile=${r.mobile}&userId=${r.userId}&loginToken=${t[x].Value}`, 40 | method: 'get', 41 | headers: { 42 | "Content-Type": "application/x-www-form-urlencoded", 43 | "Connection": "keep-alive", 44 | "Accept": "*/*", 45 | "Accept-Language": "en-CN;q=1, zh-Hans-CN;q=0.9", 46 | "Accept-Encoding": "gzip, deflate", 47 | "User-Agent": "otole/1.4.8 (iPhone; iOS 13.5; Scale/2.00)", 48 | "Host": "www.ttljf.com" 49 | }, 50 | }).json(); 51 | console.log(`手机号:${r.mobile},${ids[i].Key}兑换结果:${body.message}`) 52 | } 53 | } 54 | } 55 | } 56 | })().catch((e) => {console.log("脚本异常:" + e);}); 57 | -------------------------------------------------------------------------------- /ttlck.js: -------------------------------------------------------------------------------- 1 |  2 | /** 3 | * 4 | * 5 | * ADD_TTL_USE_SCORE 添加太太乐需要多少积分。(设置为0 或者 不设置时则表示不需要积分。) 6 | * 7 | * */ 8 | 9 | const got = require('got'); 10 | const { 11 | addEnvs, sendNotify, allEnvs, getUserInfo, updateUserInfo 12 | } = require('./quantum'); 13 | 14 | let ttl = process.env.ttl; 15 | let mobile = process.env.ttlmobile; 16 | let ttlpassword = process.env.ttlpassword; 17 | let user_id = process.env.user_id; 18 | let CommunicationType = process.env.CommunicationType; 19 | 20 | 21 | 22 | let ADD_TTL_USE_SCORE = (process.env.ADD_TTL_USE_SCORE || 0) * 1; 23 | 24 | const api = got.extend({ 25 | retry: { limit: 0 }, 26 | }); 27 | 28 | !(async () => { 29 | 30 | 31 | var user = await getUserInfo(); 32 | 33 | if (ADD_TTL_USE_SCORE > 0) { 34 | if (!user || user.MaxEnvCount < ADD_TTL_USE_SCORE) { 35 | await sendNotify(`该操作需要${ADD_TTL_USE_SCORE}积分 36 | 您当前积分剩余${user.MaxEnvCount}`) 37 | return; 38 | } 39 | } 40 | if (mobile && ttlpassword) { 41 | const body = await api({ 42 | url: 'https://www.ttljf.com/ttl_site/user.do', 43 | method: 'post', 44 | body: `username=${mobile}&password=${ttlpassword}&device_brand=apple&device_model=iPhone11,8&device_uuid=&device_version=13.5&mthd=login&platform=ios&sign=`, 45 | headers: { 46 | "Content-Type": "application/x-www-form-urlencoded", 47 | "Connection": "keep-alive", 48 | "Accept": "*/*", 49 | "Accept-Language": "en-CN;q=1, zh-Hans-CN;q=0.9", 50 | "Accept-Encoding": "gzip, deflate", 51 | "User-Agent": "otole/1.4.8 (iPhone; iOS 13.5; Scale/2.00)", 52 | "Host": "www.ttljf.com" 53 | }, 54 | }).json(); 55 | console.log(JSON.stringify(body)) 56 | if (body.code == '0000') { 57 | console.log(body.user.loginToken); 58 | var r = { 59 | userId: body.user.userId, mobile: mobile, password: ttlpassword 60 | }; 61 | 62 | var c = { 63 | Name: "ttlhd", 64 | Enable: true, 65 | Value: body.user.loginToken, 66 | UserRemark: JSON.stringify(r), 67 | UserId: user_id, 68 | EnvType: 3, 69 | CommunicationType: CommunicationType 70 | } 71 | var data1 = await allEnvs(mobile, 3); 72 | data1 = data1.filter((n) => n.Name == "ttlhd"); 73 | if (data1.length > 0) { 74 | c.Id = data1[0].Id; 75 | c.Weight = data1[0].Weight; 76 | c.QLPanelEnvs = data1[0].QLPanelEnvs; 77 | c.Remark = data1[0].Remark; 78 | } 79 | 80 | user.MaxEnvCount -= ADD_TTL_USE_SCORE; 81 | if (ADD_TTL_USE_SCORE > 0 && user.MaxEnvCount < 0) { 82 | await sendNotify(`该操作需要${ADD_TTL_USE_SCORE}积分 83 | 您当前积分剩余${(user.MaxEnvCount + ADD_TTL_USE_SCORE)}`) 84 | return; 85 | } 86 | 87 | var data = await addEnvs([c]); 88 | console.log("开始提交ttl token到量子数据库"); 89 | console.log("提交结果:" + JSON.stringify(data)); 90 | if (data.Code != 200) { 91 | console.log("addEnvs Error :" + JSON.stringify(data)); 92 | await sendNotify(`提交失败,发生异常,已通知管理员处理啦!`) 93 | await sendNotify(`太太乐提交token 发生异常,Token:${body.user.loginToken}`, true) 94 | user.MaxEnvCount += ADD_TTL_USE_SCORE; 95 | } else { 96 | if (ADD_TTL_USE_SCORE > 0) { 97 | await updateUserInfo(user); 98 | } 99 | await sendNotify(`如果是新注册的账号请通过“太太乐餐饮服务”小程序登陆一次账号否则无法自动领取积分 100 | 并且通过公众号菜单“积分商城”,“完善信息”否则无法自动换取话费`) 101 | await sendNotify(`登录成功\n会员等级:${body.user.memberLevel}\n可用积分:${body.user.integral} 102 | 剩余积分:${user.MaxEnvCount}`) 103 | } 104 | } else { 105 | sendNotify("登录失败!"); 106 | } 107 | } else if (mobile) { 108 | sendNotify("请回复太太乐密码:"); 109 | } else if (ttl) { 110 | sendNotify("请回复太太乐账号:"); 111 | } 112 | })().catch((e) => {console.log("脚本异常:" + e);}); 113 | -------------------------------------------------------------------------------- /update_ttl_token.js: -------------------------------------------------------------------------------- 1 | //更新太太乐token 2 | const got = require('got'); 3 | const { 4 | addEnvs, sendNotify, allEnvs 5 | } = require('./quantum'); 6 | 7 | const api = got.extend({ 8 | retry: { limit: 0 }, 9 | }); 10 | 11 | !(async () => { 12 | var t = await allEnvs("ttlhd", 3, true); 13 | if (t.length > 0) { 14 | for (var i = 0; i < t.length; i++) { 15 | var r = JSON.parse(t[i].UserRemark) 16 | const body = await api({ 17 | url: 'https://www.ttljf.com/ttl_site/user.do', 18 | method: 'post', 19 | body: `username=${r.mobile}&password=${r.password}&device_brand=apple&device_model=iPhone11,8&device_uuid=&device_version=13.5&mthd=login&platform=ios&sign=`, 20 | headers: { 21 | "Content-Type": "application/x-www-form-urlencoded", 22 | "Connection": "keep-alive", 23 | "Accept": "*/*", 24 | "Accept-Language": "en-CN;q=1, zh-Hans-CN;q=0.9", 25 | "Accept-Encoding": "gzip, deflate", 26 | "User-Agent": "otole/1.4.8 (iPhone; iOS 13.5; Scale/2.00)", 27 | "Host": "www.ttljf.com" 28 | }, 29 | }).json(); 30 | if (body.code == '0000') { 31 | console.log(`更新-------${r.mobile}-------成功`); 32 | console.log(body.user.loginToken); 33 | t[i].Value = body.user.loginToken; 34 | } else { 35 | sendNotify(`太太乐账号${r.mobile}登录失败!`); 36 | } 37 | } 38 | console.log("更新环境变量到量子"); 39 | await addEnvs(t); 40 | } 41 | })().catch((e) => {console.log("脚本异常:" + e);}); 42 | -------------------------------------------------------------------------------- /weather.js: -------------------------------------------------------------------------------- 1 | // 骚话 2 | 3 | const got = require('got'); 4 | const { 5 | sendNotify 6 | } = require('./quantum'); 7 | 8 | const api = got.extend({ 9 | retry: { limit: 0 }, 10 | }); 11 | 12 | let city = process.env.weather; 13 | if (city && city.split(" ").length == 2) { 14 | !(async () => { 15 | var len = 20; 16 | await api({ 17 | url: 'https://api.vvhan.com/api/weather?city=' + city.split(" ")[1], 18 | headers: { 19 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 20 | }, 21 | method: 'get', 22 | }).then(async response => { 23 | console.log(response.body) 24 | var body = JSON.parse(response.body) 25 | 26 | if (body.success) { 27 | var message = `${body.info.date} 28 | ${city.split(" ")[1]} ${body.info.type} 29 | ${body.info.high} ${body.info.low} 30 | ${body.info.fengxiang} ${body.info.fengli} 31 | ${body.info.tip}` 32 | await sendNotify(message) 33 | console.log(message) 34 | } else { 35 | sendNotify(city.split(" ")[1] + " 天气查询失败。") 36 | } 37 | }); 38 | })().catch((e) => {console.log("脚本异常:" + e);}); 39 | } else { 40 | sendNotify("天气查询指令:天气 北京。") 41 | } -------------------------------------------------------------------------------- /wxpusher.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | let prefixUrl = process.env.serverAddres || 'http://localhost:5088'; 3 | const api = got.extend({ 4 | prefixUrl: prefixUrl, 5 | retry: { limit: 0 }, 6 | }); 7 | const { 8 | sendNotify 9 | } = require('./quantum'); 10 | 11 | let user_id = process.env.user_id; //用户id 12 | !(async () => { 13 | if (!user_id) { 14 | return; 15 | } 16 | if (process.env.CommunicationType == "3") { 17 | await sendNotify("您当前是wxpusher 用户,无法使用绑定服务了。"); 18 | return; 19 | } 20 | var data = await CreateQrcode(); 21 | if (data.Code == 200) { 22 | await sendNotify("请在2分钟使用微信扫码,完成关注。[CQ:image,file=" + data.Data + ",type=show,id=40000,cache=0]"); 23 | } else { 24 | await sendNotify(data.Message); 25 | } 26 | 27 | })().catch((e) => { 28 | console.log(e); 29 | }); 30 | 31 | async function CreateQrcode() { 32 | const body = await api({ 33 | url: 'api/wxpusher/CreateQrcode/' + user_id, 34 | method: 'get', 35 | headers: { 36 | "Content-Type": "application/json" 37 | } 38 | }).json(); 39 | return body; 40 | }; -------------------------------------------------------------------------------- /yiyan.js: -------------------------------------------------------------------------------- 1 | // 一言 2 | const got = require('got'); 3 | const { 4 | sendNotify 5 | } = require('./quantum'); 6 | 7 | const api = got.extend({ 8 | retry: { limit: 0 }, 9 | }); 10 | 11 | !(async () => { 12 | await api({ 13 | url: 'https://api.uixsj.cn/hitokoto/get', 14 | headers: { 15 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 16 | }, 17 | method: 'get', 18 | }).then(async response => { 19 | var body = response.body 20 | var message = ""; 21 | for (var i = 0; i < body.split("\n").length; i++) { 22 | var t = body.split("\n")[i]; 23 | if (t.length < len + 5) { 24 | message += t + "\n" 25 | } else { 26 | for (var x = 0; x < t.length / len; x++) { 27 | message += t.substring(x * len, (x + 1) * len) + "\n"; 28 | } 29 | } 30 | } 31 | await sendNotify(message) 32 | console.log(message) 33 | }); 34 | })().catch((e) => {console.log("脚本异常:" + e);}); 35 | -------------------------------------------------------------------------------- /买家秀.js: -------------------------------------------------------------------------------- 1 | // 一言 2 | 3 | const got = require('got'); // http 请求封装库。 4 | 5 | const { 6 | sendNotify 7 | } = require('./quantum'); // 引用quantum.js 已经封装的方法。需要用到哪些引用即可。 8 | 9 | const api = got.extend({ 10 | retry: { limit: 0 }, 11 | }); 12 | 13 | !(async () => { 14 | // --------------------逻辑代码开始-------------------- 15 | 16 | await api({ 17 | url: 'https://api.vvhan.com/api/tao?type=json', // 请求接口地址。 18 | headers: { 19 | Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 20 | }, 21 | method: 'get', // 通常有get,post,put,delete 请求。 22 | }).then(async response => { 23 | // 请求接口后数据处理部分, 24 | console.log(response.body); 25 | // 将body 转换成 JSON 对象 26 | var t = JSON.parse(response.body); 27 | 28 | if (t) { 29 | await sendNotify([{ msg: t.title, MessageType: 1 }, { msg: t.pic, MessageType: 2 }]) 30 | } 31 | }); 32 | // --------------------逻辑代码结束-------------------- 33 | })().catch((e) => {console.log("脚本异常:" + e);}); -------------------------------------------------------------------------------- /挖宝转单.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 量子转单 4 | * 该示例为转挖宝 5 | * 6 | **/ 7 | const got = require('got'); 8 | const { 9 | sendNotify, getUserInfo, updateUserInfo, addOrUpdateCustomDataTitle, addCustomData, getCustomData, sleep 10 | } = require('./quantum'); 11 | 12 | 13 | const api = got.extend({ 14 | retry: { limit: 0 }, 15 | }); 16 | const moment = require('moment'); 17 | 18 | // 触发消息指令 19 | let command = process.env.command; 20 | 21 | /*-----------------自行修改参数部分-----------------*/ 22 | // 使用积分,如果不要积分则赋值为0 23 | 24 | let USE_SCORE = 350; 25 | 26 | // 订单类型 请直接修改脚本里的 “挖宝”为推一推或其他 27 | let customerDataType = "挖宝"; 28 | 29 | /** 30 | * 消息要转发的通讯类型 31 | * 1:QQ 32 | * 4:微信(vlw) 33 | * */ 34 | let targetCommunicationType = 1; 35 | 36 | /** 37 | * 38 | * 消息要转给的目标人QQ或者微信ID(请与上面的通讯类型匹配) 39 | * 40 | * */ 41 | let targetCommunicationUserId = "179100150"; 42 | 43 | 44 | /** 45 | * 黑名单,可以是QQ 或者 微信ID 46 | * 多个用英文的逗号隔开 47 | * 建议将上家微信QQ加入黑名单,否则上家回执带链接时会触发转单 48 | * */ 49 | let blackList = "123456,8888888,888888" 50 | 51 | /** 52 | * 转单限制开始时间 53 | * 以下表示0:30分(包含00:30)才开始转单 54 | * */ 55 | let startLimitTime = '00:30:00' 56 | 57 | /** 58 | * 转单限制结束时间 59 | * */ 60 | let endLimitTime = '22:30:00' 61 | 62 | 63 | /*-----------------自行修改参数部分-----------------*/ 64 | 65 | 66 | 67 | let CommunicationUserId = process.env.CommunicationUserId; 68 | let CommunicationUserName = process.env.CommunicationUserName; 69 | 70 | !(async () => { 71 | if (blackList.split(",").indexOf(CommunicationUserId) > -1) { 72 | console.log(CommunicationUserId + "在黑名单中,不处理转单信息"); 73 | return; 74 | } 75 | var startTime = moment(moment().format("YYYY-MM-DD " + startLimitTime)); 76 | var endTime = moment(moment().format("YYYY-MM-DD " + endLimitTime)); 77 | var now = moment(); 78 | if (now < startTime || now > endTime) { 79 | console.log(`转单时间结束,转单时间 ${startLimitTime}-${endLimitTime}`); 80 | return; 81 | } 82 | 83 | var t = Math.round(Math.random() * 3000) + 300; 84 | console.log("随机延迟" + t + "毫秒"); 85 | await sleep(t); 86 | 87 | /*** 88 | * 重组xml 消息中的url信息 89 | * 如发财挖宝 90 | * 因为锦鲤本身是口令,则不需要进行重组消息,直接转发即可 91 | * https://bnzf.jd.com/?activityId=pTTvJeSTrpthgk9ASBVGsw&inviterId=wJgdJ8ZDemfPlhjkWEBr0E878IikZSVhF1e29X_fe4M&inviterCode=6455212d609e4a9d9f8bf6a19997456b67721650038447629& 92 | * */ 93 | // var activityId = command.match(/activityId=([^&]+)(?=&?)/)[1] 94 | var inviterId = command.match(/inviterId=([^&]+)(?=&?)/)[1] 95 | var inviterCode = command.match(/inviterCode=([^&]+)(?=&?)/)[1] 96 | if (!inviterId || !inviterCode) { 97 | await sendNotify("消息中的助力链接参数异常!"); 98 | return; 99 | } 100 | // url 为重新拼接的助力链接 101 | var url = `https://bnzf.jd.com/?activityId=pTTvJeSTrpthgk9ASBVGsw&inviterId=${inviterId}&inviterCode=${inviterCode}&` 102 | 103 | 104 | var startTime = moment().format("YYYY-MM-DD") 105 | var endTime = moment().format("YYYY-MM-DD HH:mm:ss"); 106 | 107 | // 查询当天用户的发送的所有的订单数据 108 | var ss = await getCustomData(customerDataType, startTime, endTime, { Data2: CommunicationUserId }); 109 | 110 | //通常将助力链接放在数据管理的Data1 字段,通过判断Data1 中是否包含邀请码是否重复来判断订单是否重复 111 | 112 | if (ss && ss.length > 0 && ss.filter((t) => t.Data1.indexOf(inviterCode) > -1).length > 0) { 113 | var msg = `邀请码:${inviterCode}重复`; 114 | console.log(msg); 115 | await sendNotify(msg) 116 | return; 117 | } 118 | //扣除积分的通知 119 | var m = ""; 120 | // 如果启用了积分,则扣除用户积分 121 | if (USE_SCORE > 0) { 122 | user = await getUserInfo(); 123 | user.MaxEnvCount = user.MaxEnvCount - USE_SCORE; 124 | if (user.MaxEnvCount < 0) { 125 | await sendNotify(`挖宝需要${USE_SCORE}积分,当前积分:${(user.MaxEnvCount + USE_SCORE)}`); 126 | return false; 127 | } else { 128 | await updateUserInfo(user); 129 | } 130 | m = `\n本次扣除${USE_SCORE}个积分。剩余积分:${user.MaxEnvCount}`; 131 | } 132 | 133 | await addOrUpdateCustomDataTitle({ 134 | Type: customerDataType, 135 | TypeName: "挖宝转单记录", 136 | Title1: "助力链接", 137 | Title2: "QQ/WX", 138 | Title3: "昵称", 139 | Title4: "订单编号", 140 | Title5: "助力码" 141 | }); 142 | var no = (ss.length + 1) 143 | var tytOrder = { 144 | Type: customerDataType, // 订单类型 145 | Data1: url, // 重新拼接好的助力链接 146 | Data2: CommunicationUserId, // QQ/WX 147 | Data3: CommunicationUserName, //昵称 148 | Data4: no, // 订单编号 149 | Data5: inviterCode 150 | } 151 | // 保存订单数据 152 | await addCustomData([tytOrder]) 153 | 154 | console.log(` 155 | 用户:${CommunicationUserId} 156 | 昵称:${CommunicationUserName} 157 | 订单编号:${no} 158 | 扣除积分:${USE_SCORE} 159 | 转单消息:${url} 160 | 接收人:${targetCommunicationType}`); 161 | // 将消息发送给转单对象 162 | await sendNotify(url, false, targetCommunicationUserId, null, targetCommunicationType); 163 | 164 | // 提交成功回执给用户 165 | await sendNotify("挖宝提交成功,订单编号:" + no + "\r邀请码:" + inviterCode + m); 166 | })(); 167 | 168 | -------------------------------------------------------------------------------- /推一推转单.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 量子转单 4 | * 该示例为转推一推 5 | * 6 | **/ 7 | const got = require('got'); 8 | const { 9 | sendNotify, getUserInfo, updateUserInfo, addOrUpdateCustomDataTitle, addCustomData, getCustomData, sleep 10 | } = require('./quantum'); 11 | 12 | 13 | const api = got.extend({ 14 | retry: { limit: 0 }, 15 | }); 16 | const moment = require('moment'); 17 | 18 | // 触发消息指令 19 | let command = process.env.command; 20 | 21 | /*-----------------自行修改参数部分-----------------*/ 22 | // 使用积分,如果不要积分则赋值为0 23 | 24 | let USE_SCORE = 100; 25 | 26 | // 订单类型 请直接修改脚本里的 “推一推”为推一推或其他 27 | let customerDataType = "推一推"; 28 | 29 | /** 30 | * 消息要转发的通讯类型 31 | * 1:QQ 32 | * 4:微信(vlw) 33 | * */ 34 | let targetCommunicationType = 1; 35 | 36 | /** 37 | * 38 | * 消息要转给的目标人QQ或者微信ID(请与上面的通讯类型匹配) 39 | * 40 | * */ 41 | let targetCommunicationUserId = "179100150"; 42 | 43 | /** 44 | * 黑名单,可以是QQ 或者 微信ID 45 | * 多个用英文的逗号隔开 46 | * 建议将上家微信QQ加入黑名单,否则上家回执带链接时会触发转单 47 | * */ 48 | let blackList = "123456,8888888,888888"; 49 | 50 | 51 | /** 52 | * 转单限制开始时间 53 | * 以下表示0:30分(包含00:30)才开始转单 54 | * */ 55 | let startLimitTime = '00:30:00' 56 | 57 | /** 58 | * 转单限制结束时间 59 | * */ 60 | let endLimitTime = '22:30:00' 61 | 62 | /*-----------------自行修改参数部分-----------------*/ 63 | 64 | 65 | 66 | let CommunicationUserId = process.env.CommunicationUserId; 67 | let CommunicationUserName = process.env.CommunicationUserName; 68 | 69 | !(async () => { 70 | if (blackList.split(",").indexOf(CommunicationUserId) > -1) { 71 | console.log(CommunicationUserId + "在黑名单中,不处理转单信息"); 72 | return; 73 | } 74 | var startTime = moment(moment().format("YYYY-MM-DD " + startLimitTime)); 75 | var endTime = moment(moment().format("YYYY-MM-DD " + endLimitTime)); 76 | var now = moment(); 77 | if (now < startTime || now > endTime) { 78 | console.log(`转单时间结束,转单时间 ${startLimitTime}-${endLimitTime}`); 79 | return; 80 | } 81 | var t = Math.round(Math.random() * 3000) + 300; 82 | console.log("随机延迟" + t + "毫秒"); 83 | await sleep(t); 84 | 85 | /*** 86 | * 重组xml 消息中的url信息 87 | * 因为锦鲤本身是口令,则不需要进行重组消息,直接转发即可 88 | * https://pushgold.jd.com/#/helper?activityId=49f40d2f40b3470e8d6c39aa4866c7ff&packetId=a9291e3804264121afefaed915468b30-amRfUU1IWWRaUVlwb05I¤tActId=49f40d2f40b3470e8d6c39aa4866c7ff&utm_user=plusmember&ad_od=share&utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends 89 | * */ 90 | var packetId = command.match(/packetId=([^&]+)(?=&?)/)[1] 91 | if (!packetId) { 92 | await sendNotify("消息中的助力链接参数异常!"); 93 | return; 94 | } 95 | // url 为重新拼接的助力链接 96 | var url = `https://pushgold.jd.com/#/helper?activityId=49f40d2f40b3470e8d6c39aa4866c7ff&packetId=${packetId}¤tActId=49f40d2f40b3470e8d6c39aa4866c7ff&utm_user=plusmember&ad_od=share&utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends` 97 | 98 | 99 | var startTime = moment().format("YYYY-MM-DD") 100 | var endTime = moment().format("YYYY-MM-DD HH:mm:ss"); 101 | 102 | // 查询当天用户的发送的所有的订单数据 103 | var ss = await getCustomData(customerDataType, startTime, endTime, { Data2: CommunicationUserId }); 104 | 105 | //通常将助力链接放在数据管理的Data1 字段,通过判断Data1 中是否包含邀请码是否重复来判断订单是否重复 106 | 107 | if (ss && ss.length > 0 && ss.filter((t) => t.Data1.indexOf(packetId) > -1).length > 0) { 108 | var msg = `邀请码:${packetId}重复`; 109 | console.log(msg); 110 | await sendNotify(msg) 111 | return; 112 | } 113 | //扣除积分的通知 114 | var m = ""; 115 | // 如果启用了积分,则扣除用户积分 116 | if (USE_SCORE > 0) { 117 | user = await getUserInfo(); 118 | user.MaxEnvCount = user.MaxEnvCount - USE_SCORE; 119 | if (user.MaxEnvCount < 0) { 120 | await sendNotify(`推一推需要${USE_SCORE}积分,当前积分:${(user.MaxEnvCount + USE_SCORE)}`); 121 | return false; 122 | } else { 123 | await updateUserInfo(user); 124 | } 125 | m = `\n本次扣除${USE_SCORE}个积分。剩余积分:${user.MaxEnvCount}`; 126 | } 127 | 128 | await addOrUpdateCustomDataTitle({ 129 | Type: customerDataType, 130 | TypeName: "推一推转单记录", 131 | Title1: "助力链接", 132 | Title2: "QQ/WX", 133 | Title3: "昵称", 134 | Title4: "订单编号", 135 | Title5: "助力码" 136 | }); 137 | var no = (ss.length + 1) 138 | var tytOrder = { 139 | Type: customerDataType, // 订单类型 140 | Data1: url, // 重新拼接好的助力链接 141 | Data2: CommunicationUserId, // QQ/WX 142 | Data3: CommunicationUserName, //昵称 143 | Data4: no, // 订单编号 144 | Data5: packetId 145 | } 146 | // 保存订单数据 147 | await addCustomData([tytOrder]) 148 | 149 | console.log(` 150 | 用户:${CommunicationUserId} 151 | 昵称:${CommunicationUserName} 152 | 订单编号:${no} 153 | 扣除积分:${USE_SCORE} 154 | 转单消息:${url} 155 | 接收人:${targetCommunicationType}`); 156 | // 将消息发送给转单对象 157 | await sendNotify(url, false, targetCommunicationUserId, null, targetCommunicationType); 158 | 159 | // 提交成功回执给用户 160 | await sendNotify("推一推提交成功,订单编号:" + no + "\r邀请码:" + packetId + m); 161 | })(); 162 | -------------------------------------------------------------------------------- /获取京豆详细.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 详细版京东京豆统计 3 | * 默认不发送通知。 4 | [task_local] 5 | #京豆详情统计 6 | 20 22 * * * jd_bean_info.js, tag=京豆详情统计, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true 7 | * */ 8 | const $ = new Env('京豆详情统计'); 9 | const { sendNotify, getCookies } = require('./quantum'); 10 | let allMessage = ''; 11 | let myMap = new Map(); 12 | let allBean = 0; 13 | 14 | if (!process.env.NO_CK_NOTIFY) { 15 | process.env.NO_CK_NOTIFY = "您没有提交CK。请按照教程获取CK发送给机器人。"; 16 | } 17 | 18 | !(async () => { 19 | var cookiesArr = await getCookies(); 20 | console.log(`\n正在查询今天所有账号的京豆收入......`); 21 | for (let i = 0; i < cookiesArr.length; i++) { 22 | if (cookiesArr[i].Value && cookiesArr[i].Enable) { 23 | cookie = cookiesArr[i].Value; 24 | $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) 25 | $.index = i + 1; 26 | $.beanCount = 0; 27 | $.incomeBean = 0; 28 | $.expenseBean = 0; 29 | $.todayIncomeBean = 0; 30 | $.errorMsg = ''; 31 | $.isLogin = true; 32 | $.nickName = ''; 33 | $.message = ''; 34 | $.balance = 0; 35 | $.expiredBalance = 0; 36 | await TotalBean(); 37 | await bean(); 38 | await showMsg(); 39 | } 40 | } 41 | })() 42 | .catch((e) => { 43 | }) 44 | .finally(() => { 45 | $.done(); 46 | }) 47 | async function showMsg() { 48 | if ($.errorMsg) 49 | return 50 | allMessage = `京东账号:${$.nickName || $.UserName} \n`; 51 | allMessage += `今日收入总计:${$.todayIncomeBean}京豆\n` 52 | allBean = allBean + parseInt($.todayIncomeBean) 53 | for (let key of myMap.keys()) { 54 | allMessage += '活动:' + key + '获得' + myMap.get(key) + '京豆\n' 55 | } 56 | console.log(`${allMessage}`) 57 | await sendNotify(allMessage); 58 | allMessage = null; 59 | } 60 | async function bean() { 61 | //前一天的0:0:0时间戳 62 | const tm = parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000 - (24 * 60 * 60 * 1000); 63 | // 今天0:0:0时间戳 64 | const tm1 = parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000; 65 | let page = 1, t = 0, yesterdayArr = [], todayArr = []; 66 | do { 67 | let response = await getJingBeanBalanceDetail(page); 68 | // console.log(`第${page}页: ${JSON.stringify(response)}`); 69 | if (response && response.code === "0") { 70 | page++; 71 | let detailList = response.detailList; 72 | if (detailList && detailList.length > 0) { 73 | for (let item of detailList) { 74 | const date = item.date.replace(/-/g, '/') + "+08:00"; 75 | if (new Date(date).getTime() >= tm1 && (!item['eventMassage'].includes("退还") && !item['eventMassage'].includes('扣赠'))) { 76 | todayArr.push(item); 77 | } else if (tm <= new Date(date).getTime() && new Date(date).getTime() < tm1 && (!item['eventMassage'].includes("退还") && !item['eventMassage'].includes('扣赠'))) { 78 | //昨日的 79 | yesterdayArr.push(item); 80 | } else if (tm > new Date(date).getTime()) { 81 | //前天的 82 | t = 1; 83 | break; 84 | } 85 | } 86 | } else { 87 | $.errorMsg = `数据异常`; 88 | t = 1; 89 | } 90 | } else if (response && response.code === "3") { 91 | t = 1; 92 | } else { 93 | t = 1; 94 | } 95 | } while (t === 0); 96 | for (let item of yesterdayArr) { 97 | if (Number(item.amount) > 0) { 98 | $.incomeBean += Number(item.amount); 99 | } else if (Number(item.amount) < 0) { 100 | $.expenseBean += Number(item.amount); 101 | } 102 | } 103 | for (let item of todayArr) { 104 | if (Number(item.amount) > 0) { 105 | $.todayIncomeBean += Number(item.amount); 106 | myMap.set(item.eventMassage, 0) 107 | } 108 | } 109 | for (let item of todayArr) { 110 | if (Number(item.amount) > 0) { 111 | myMap.set(item.eventMassage, parseInt(myMap.get(item.eventMassage)) + parseInt(item.amount)) 112 | } 113 | } 114 | } 115 | function TotalBean() { 116 | return new Promise(async resolve => { 117 | const options = { 118 | url: "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion", 119 | headers: { 120 | Host: "me-api.jd.com", 121 | Accept: "*/*", 122 | Connection: "keep-alive", 123 | Cookie: cookie, 124 | "User-Agent": $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "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"), 125 | "Accept-Language": "zh-cn", 126 | "Referer": "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&", 127 | "Accept-Encoding": "gzip, deflate, br" 128 | } 129 | } 130 | $.get(options, (err, resp, data) => { 131 | try { 132 | if (err) { 133 | // $.logErr(err) 134 | } else { 135 | if (data) { 136 | data = JSON.parse(data); 137 | if (data['retcode'] === "1001") { 138 | $.isLogin = false; //cookie过期 139 | return; 140 | } 141 | if (data['retcode'] === "0" && data.data && data.data.hasOwnProperty("userInfo")) { 142 | $.nickName = data.data.userInfo.baseInfo.nickname; 143 | } 144 | if (data['retcode'] === '0' && data.data && data.data['assetInfo']) { 145 | $.beanCount = data.data && data.data['assetInfo']['beanNum']; 146 | } 147 | } else { 148 | $.log('京东服务器返回空数据'); 149 | } 150 | } 151 | } catch (e) { 152 | // $.logErr(e) 153 | } finally { 154 | resolve(); 155 | } 156 | }) 157 | }) 158 | } 159 | function getJingBeanBalanceDetail(page) { 160 | return new Promise(async resolve => { 161 | const options = { 162 | "url": `https://api.m.jd.com/client.action?functionId=getJingBeanBalanceDetail`, 163 | "body": `body=${escape(JSON.stringify({ "pageSize": "20", "page": page.toString() }))}&appid=ld`, 164 | "headers": { 165 | 'User-Agent': $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "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"), 166 | 'Host': 'api.m.jd.com', 167 | 'Content-Type': 'application/x-www-form-urlencoded', 168 | 'Cookie': cookie, 169 | } 170 | } 171 | $.post(options, (err, resp, data) => { 172 | try { 173 | if (err) { 174 | } else { 175 | if (data) { 176 | data = JSON.parse(data); 177 | } else { 178 | } 179 | } 180 | } catch (e) { 181 | } finally { 182 | resolve(data); 183 | } 184 | }) 185 | }) 186 | } 187 | // prettier-ignore 188 | function Env(t, e) { "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0); class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, i) => { s.call(this, t, (t, s, r) => { t ? i(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const i = this.getdata(t); if (i) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, i) => e(i)) }) } runScript(t, e) { return new Promise(s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [o, h] = i.split("@"), n = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(n, (t, e, i) => s(i)) }).catch(t => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; try { return JSON.parse(this.fs.readFileSync(i)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of i) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } getdata(t) { let e = this.getval(t); if (/^@/.test(t)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : ""; if (r) try { const t = JSON.parse(r); e = t ? this.lodash_get(t, i, "") : e } catch (t) { e = "" } } return e } setdata(t, e) { let s = !1; if (/^@/.test(e)) { const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e), o = this.getval(i), h = i ? "null" === o ? null : o || "{}" : "{}"; try { const e = JSON.parse(h); this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), i) } catch (e) { const o = {}; this.lodash_set(o, r, t), s = this.setval(JSON.stringify(o), i) } } else s = this.setval(t, e); return s } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null } setval(t, e) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null } initGotEnv(t) { this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.post(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) }); else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: s, ...i } = t; this.got.post(s, i).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) }) } } time(t, e = null) { const s = e ? new Date(e) : new Date; let i = { "M+": s.getMonth() + 1, "d+": s.getDate(), "H+": s.getHours(), "m+": s.getMinutes(), "s+": s.getSeconds(), "q+": Math.floor((s.getMonth() + 3) / 3), S: s.getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length))); return t } msg(e = t, s = "", i = "", r) { const o = t => { if (!t) return t; if ("string" == typeof t) return this.isLoon() ? t : this.isQuanX() ? { "open-url": t } : this.isSurge() ? { url: t } : void 0; if ("object" == typeof t) { if (this.isLoon()) { let e = t.openUrl || t.url || t["open-url"], s = t.mediaUrl || t["media-url"]; return { openUrl: e, mediaUrl: s } } if (this.isQuanX()) { let e = t["open-url"] || t.url || t.openUrl, s = t["media-url"] || t.mediaUrl; return { "open-url": e, "media-url": s } } if (this.isSurge()) { let e = t.url || t.openUrl || t["open-url"]; return { url: e } } } }; if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } --------------------------------------------------------------------------------