/* * @Author: ccwav https://github.com/ccwav/QLScript2 * sendNotify 推送通知功能 (text, desp, params , author , strsummary) * @param text 通知标题 (必要) * @param desp 通知内容 (必要) * @param params 某些推送通知方式点击弹窗可跳转, 例:{ url: 'https://abc.com' } ,没啥用,只是为了兼容旧脚本保留 (非必要) * @param author 通知底部作者` (非必要) * @param strsummary 指定某些微信模板通知的预览信息,空则默认为desp (非必要) * sendNotifybyWxPucher 一对一推送通知功能 (text, desp, PtPin, author, strsummary ) * @param text 通知标题 (必要) * @param desp 通知内容 (必要) * @param PtPin CK的PTPIN (必要) * @param author 通知底部作者` (非必要) * @param strsummary 指定某些微信模板通知的预览信息,空则默认为desp (非必要) */ //详细说明参考 https://github.com/ccwav/QLScript2. const querystring = require('querystring') const exec = require('child_process').exec const $ = new Env() const timeout = 15000 //超时时间(单位毫秒) console.log('\n====加载sendNotify,频道:https://t.me/Rebels_channel====\n') const common = require('./utils/Rebels_jdCommon') $.UA = common.genUA($.UserName) // =======================================go-cqhttp通知设置区域=========================================== //gobot_url 填写请求地址http://127.0.0.1/send_private_msg //gobot_token 填写在go-cqhttp文件设置的访问密钥 //gobot_qq 填写推送到个人QQ或者QQ群号 //go-cqhttp相关API https://docs.go-cqhttp.org/api let GOBOT_URL = '' // 推送到个人QQ: http://127.0.0.1/send_private_msg 群:http://127.0.0.1/send_group_msg let GOBOT_TOKEN = '' //访问密钥 let GOBOT_QQ = '' // 如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群 // =======================================微信server酱通知设置区域=========================================== //此处填你申请的SCKEY. //(环境变量名 PUSH_KEY) let SCKEY = '' // =======================================PushDeer通知设置区域=========================================== //此处填你申请的PushDeer KEY. //(环境变量名 DEER_KEY) let PUSHDEER_KEY = '' // =======================================Bark App通知设置区域=========================================== //此处填你BarkAPP的信息(IP/设备码,例如:https://api.day.app/XXXXXXXX) let BARK_PUSH = '' //BARK app推送铃声,铃声列表去APP查看复制填写 let BARK_SOUND = '' //BARK app推送消息的分组, 默认为"QingLong" let BARK_GROUP = 'QingLong' // =======================================telegram机器人通知设置区域=========================================== //此处填你telegram bot 的Token,telegram机器人通知推送必填项.例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw //(环境变量名 TG_BOT_TOKEN) let TG_BOT_TOKEN = '' //此处填你接收通知消息的telegram用户的id,telegram机器人通知推送必填项.例如:129xxx206 //(环境变量名 TG_USER_ID) let TG_USER_ID = '' //tg推送HTTP代理设置(不懂可忽略,telegram机器人通知推送功能中非必填) let TG_PROXY_HOST = '' //例如:127.0.0.1(环境变量名:TG_PROXY_HOST) let TG_PROXY_PORT = '' //例如:1080(环境变量名:TG_PROXY_PORT) let TG_PROXY_AUTH = '' //tg代理配置认证参数 //Telegram api自建的反向代理地址(不懂可忽略,telegram机器人通知推送功能中非必填),默认tg官方api(环境变量名:TG_API_HOST) let TG_API_HOST = 'api.telegram.org' // =======================================钉钉机器人通知设置区域=========================================== //此处填你钉钉 bot 的webhook,例如:5a544165465465645d0f31dca676e7bd07415asdasd //(环境变量名 DD_BOT_TOKEN) let DD_BOT_TOKEN = '' //密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 let DD_BOT_SECRET = '' // =======================================企业微信机器人通知设置区域=========================================== //此处填你企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa //(环境变量名 QYWX_KEY) let QYWX_KEY = '' // =======================================企业微信应用消息通知设置区域=========================================== /* 此处填你企业微信应用消息的值(详见文档 https://work.weixin.qq.com/api/doc/90000/90135/90236) 环境变量名 QYWX_AM依次填入 corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcff56746d9adwers,B-791548lnzXBE6_BWfxdf3kSTMJr9vFEPKAbh6WERQ,mingcheng,1000001,2COXgjH2UIfERF2zxrtUOKgQ9XklUqMdGSWLBoW_lSDAdafat 可选推送消息类型(推荐使用图文消息(mpnews)): - 文本卡片消息: 0 (数字零) - 文本消息: 1 (数字一) - 图文消息(mpnews): 素材库图片id, 可查看此教程(http://note.youdao.com/s/HMiudGkb)或者(https://note.youdao.com/ynoteshare1/index.html?id=1a0c8aff284ad28cbd011b29b3ad0191&type=note) */ let QYWX_AM = '' // =======================================飞书机器人通知设置区域=========================================== //此处填你飞书机器人的 webhook(详见文档 https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN) //(环境变量名 FS_KEY) let FS_KEY = '' // =======================================iGot聚合推送通知设置区域=========================================== //此处填您iGot的信息(推送key,例如:https://push.hellyw.com/XXXXXXXX) let IGOT_PUSH_KEY = '' // =======================================push+设置区域======================================= //官方文档:http://www.pushplus.plus/ //PUSH_PLUS_TOKEN:微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送 //PUSH_PLUS_USER: 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送) let PUSH_PLUS_TOKEN = '' let PUSH_PLUS_USER = '' // ======================================= WxPusher 通知设置区域 =========================================== // 此处填你申请的 appToken. 官方文档:https://wxpusher.zjiecode.com/docs // WP_APP_TOKEN 可在管理台查看: https://wxpusher.zjiecode.com/admin/main/app/appToken // WP_TOPICIDS 群发, 发送目标的 topicId, 以 ; 分隔! 使用 WP_UIDS 单发的时候, 可以不传 // WP_UIDS 发送目标的 uid, 以 ; 分隔。注意 WP_UIDS 和 WP_TOPICIDS 可以同时填写, 也可以只填写一个。 // WP_URL 原文链接, 可选参数 let WP_APP_TOKEN = '' let WP_TOPICIDS = '' let WP_UIDS = '' let WP_URL = '' let WP_APP_TOKEN_ONE = '' if (process.env.WP_APP_TOKEN_ONE) { WP_APP_TOKEN_ONE = process.env.WP_APP_TOKEN_ONE } let WP_UIDS_ONE = '' // =======================================gotify通知设置区域============================================== //gotify_url 填写gotify地址,如https://push.example.de:8080 //gotify_token 填写gotify的消息应用token //gotify_priority 填写推送消息优先级,默认为0 let GOTIFY_URL = '' let GOTIFY_TOKEN = '' let GOTIFY_PRIORITY = 0 // =======================================BncrBot通知设置区域============================================== //BncrHost 填写BncrHost地址,如https://192.168.31.192:9090 //BncrToken 填写Bncr的消息应用Token let BncrHost = '' let BncrToken = '' let PushErrorTime = 0 let strTitle = '' let ShowRemarkType = '1' let Notify_NoCKFalse = 'false' let Notify_NoLoginSuccess = 'false' let UseGroupNotify = 1 //const { // getEnvs, // DisableCk, // getEnvByPtPin //} = require('./function/ql'); const fs = require('fs') let isnewql = fs.existsSync('/ql/data/config/auth.json') let strCKFile = '' let strUidFile = '' if (isnewql) { strCKFile = '/ql/data/scripts/CKName_cache.json' strUidFile = '/ql/data/scripts/CK_WxPusherUid.json' } else { strCKFile = '/ql/scripts/CKName_cache.json' strUidFile = '/ql/scripts/CK_WxPusherUid.json' } let Fileexists = fs.existsSync(strCKFile) let TempCK = [] if (Fileexists) { //console.log("检测到别名缓存文件CKName_cache.json,载入..."); TempCK = fs.readFileSync(strCKFile, 'utf-8') if (TempCK) { TempCK = TempCK.toString() TempCK = JSON.parse(TempCK) } } let UidFileexists = fs.existsSync(strUidFile) let TempCKUid = [] if (UidFileexists) { //console.log("检测到一对一Uid文件WxPusherUid.json,载入..."); TempCKUid = fs.readFileSync(strUidFile, 'utf-8') if (TempCKUid) { TempCKUid = TempCKUid.toString() TempCKUid = JSON.parse(TempCKUid) } } let tempAddCK = {} let boolneedUpdate = false let strCustom = '' let strCustomArr = [] let strCustomTempArr = [] let Notify_CKTask = '' let Notify_SkipText = [] let isLogin = false if (process.env.NOTIFY_SHOWNAMETYPE) { ShowRemarkType = process.env.NOTIFY_SHOWNAMETYPE } async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By https://github.com/9Rebels/jdmax', strsummary = '') { console.log(`开始发送通知...`) if (process.env.NOTIFY_FILTERBYFILE) { var no_notify = process.env.NOTIFY_FILTERBYFILE.split('&') if (module.parent.filename) { const script_name = module.parent.filename.split('/').slice(-1)[0] if ( no_notify.some((key_word) => { const flag = script_name.includes(key_word) if (flag) { console.log(`${script_name}含有关键字${key_word},不推送`) } return flag }) ) { return } } } try { //Reset 变量 UseGroupNotify = 1 strTitle = '' GOBOT_URL = '' GOBOT_TOKEN = '' GOBOT_QQ = '' SCKEY = '' PUSHDEER_KEY = '' BARK_PUSH = '' BARK_SOUND = '' BARK_GROUP = 'QingLong' TG_BOT_TOKEN = '' TG_USER_ID = '' TG_PROXY_HOST = '' TG_PROXY_PORT = '' TG_PROXY_AUTH = '' TG_API_HOST = 'api.telegram.org' DD_BOT_TOKEN = '' DD_BOT_SECRET = '' QYWX_KEY = '' QYWX_AM = '' FS_KEY = '' IGOT_PUSH_KEY = '' PUSH_PLUS_TOKEN = '' PUSH_PLUS_USER = '' Notify_CKTask = '' Notify_SkipText = [] //变量开关 var Use_serverNotify = true var Use_pushdeerNotify = true var Use_pushPlusNotify = true var Use_BarkNotify = true var Use_tgBotNotify = true var Use_ddBotNotify = true var Use_qywxBotNotify = true var Use_qywxamNotify = true var Use_fsBotNotify = true var Use_iGotNotify = true var Use_gobotNotify = true var Use_WxPusher = true var strtext = text var strdesp = desp var titleIndex = -1 if (process.env.NOTIFY_NOCKFALSE) { Notify_NoCKFalse = process.env.NOTIFY_NOCKFALSE } if (process.env.NOTIFY_NOLOGINSUCCESS) { Notify_NoLoginSuccess = process.env.NOTIFY_NOLOGINSUCCESS } if (process.env.NOTIFY_CKTASK) { Notify_CKTask = process.env.NOTIFY_CKTASK } if (process.env.NOTIFY_SKIP_TEXT && desp) { Notify_SkipText = process.env.NOTIFY_SKIP_TEXT.split('&') if (Notify_SkipText.length > 0) { for (var Templ in Notify_SkipText) { if (desp.indexOf(Notify_SkipText[Templ]) != -1) { console.log('检测内容到内容存在屏蔽推送的关键字(' + Notify_SkipText[Templ] + '),将跳过推送...') return } } } } if (text.indexOf('cookie已失效') != -1 || desp.indexOf('重新登录获取') != -1 || text == 'Ninja 运行通知') { if (Notify_CKTask) { console.log('触发CK脚本,开始执行....') await exec(`ps -ef|grep -v grep|grep ${Notify_CKTask}`, async function (err, stdout, stderr) { if (!stdout) { Notify_CKTask = 'task ' + Notify_CKTask + ' now' console.log(Notify_CKTask) await exec(Notify_CKTask) } else { console.log('已有相同任务在执行,跳过此次执行!\n') return } }) } } if (process.env.NOTIFY_AUTOCHECKCK == 'true') { if (text.indexOf('cookie已失效') != -1 || desp.indexOf('重新登录获取') != -1) { console.log(`捕获CK过期通知,开始尝试处理...`) var strPtPin = await GetPtPin(text) var strdecPtPin = decodeURIComponent(strPtPin) var llHaderror = false if (strPtPin) { var temptest = await getEnvByPtPin(strdecPtPin) if (temptest) { if (temptest.status == 0) { isLogin = true await isLoginByX1a0He(temptest.value) if (!isLogin) { var tempid = 0 if (temptest._id) { tempid = temptest._id } if (temptest.id) { tempid = temptest.id } const DisableCkBody = await DisableCk(tempid) strPtPin = temptest.value strPtPin = strPtPin.match(/pt_pin=([^; ]+)(?=;?)/) && strPtPin.match(/pt_pin=([^; ]+)(?=;?)/)[1] var strAllNotify = '' var MessageUserGp2 = '' var MessageUserGp3 = '' var MessageUserGp4 = '' var userIndex2 = -1 var userIndex3 = -1 var userIndex4 = -1 var strNotifyOneTemp = '' if ($.isNode() && process.env.BEANCHANGE_USERGP2) { MessageUserGp2 = process.env.BEANCHANGE_USERGP2 ? process.env.BEANCHANGE_USERGP2.split('&') : [] } if ($.isNode() && process.env.BEANCHANGE_USERGP3) { MessageUserGp3 = process.env.BEANCHANGE_USERGP3 ? process.env.BEANCHANGE_USERGP3.split('&') : [] } if ($.isNode() && process.env.BEANCHANGE_USERGP4) { MessageUserGp4 = process.env.BEANCHANGE_USERGP4 ? process.env.BEANCHANGE_USERGP4.split('&') : [] } if (MessageUserGp4) { userIndex4 = MessageUserGp4.findIndex((item) => item === strPtPin) } if (MessageUserGp2) { userIndex2 = MessageUserGp2.findIndex((item) => item === strPtPin) } if (MessageUserGp3) { userIndex3 = MessageUserGp3.findIndex((item) => item === strPtPin) } if (userIndex2 != -1) { console.log(`该账号属于分组2`) text = '京东CK检测#2' } if (userIndex3 != -1) { console.log(`该账号属于分组3`) text = '京东CK检测#3' } if (userIndex4 != -1) { console.log(`该账号属于分组4`) text = '京东CK检测#4' } if (userIndex4 == -1 && userIndex2 == -1 && userIndex3 == -1) { text = '京东CK检测' } if (process.env.CHECKCK_ALLNOTIFY) { strAllNotify = process.env.CHECKCK_ALLNOTIFY /* if (strTempNotify.length > 0) { for (var TempNotifyl in strTempNotify) { strAllNotify += strTempNotify[TempNotifyl] + '\n'; } }*/ console.log(`检测到设定了温馨提示,将在推送信息中置顶显示...`) strAllNotify = `\n【✨✨✨✨温馨提示✨✨✨✨】\n` + strAllNotify console.log(strAllNotify) } if (DisableCkBody.code == 200) { console.log(`京东账号` + strdecPtPin + `已失效,自动禁用成功!\n`) strNotifyOneTemp = `京东账号: ` + strdecPtPin + ` 已失效,已自动禁用!\n如果要继续挂机,请重新登录账号,账号有效期为30天.` strNotifyOneTemp += '\n任务标题:' + strtext if (strAllNotify) strNotifyOneTemp += `\n` + strAllNotify desp = strNotifyOneTemp if (WP_APP_TOKEN_ONE) { await sendNotifybyWxPucher(`账号过期下线通知`, strNotifyOneTemp, strdecPtPin) } } else { console.log(`京东账号` + strPtPin + `已失效,自动禁用失败!\n`) strNotifyOneTemp = `京东账号: ` + strdecPtPin + ` 已失效!\n如果要继续挂机,请重新登录账号,账号有效期为30天.` strNotifyOneTemp += '\n任务标题:' + strtext if (strAllNotify) strNotifyOneTemp += `\n` + strAllNotify desp = strNotifyOneTemp if (WP_APP_TOKEN_ONE) { await sendNotifybyWxPucher(`账号过期下线通知`, strNotifyOneTemp, strdecPtPin) } } } else { console.log(`该CK已经检测没有有效,跳过通知...`) llHaderror = true } } else { console.log(`该CK已经禁用不需要处理`) llHaderror = true } } } else { console.log(`CK过期通知处理失败...`) } if (llHaderror) return } } if (strtext.indexOf('cookie已失效') != -1 || strdesp.indexOf('重新登录获取') != -1 || strtext == 'Ninja 运行通知') { if (Notify_NoCKFalse == 'true' && text != 'Ninja 运行通知') { console.log(`检测到NOTIFY_NOCKFALSE变量为true,不发送ck失效通知...`) return } } if (text.indexOf('已可领取') != -1) { if (text.indexOf('农场') != -1) { strTitle = '东东农场领取' } else { strTitle = '东东萌宠领取' } } if (text.indexOf('汪汪乐园养joy') != -1) { strTitle = '汪汪乐园养joy领取' } if (text.indexOf('任务') != -1 && (text.indexOf('新增') != -1 || text.indexOf('删除') != -1)) { strTitle = '脚本任务更新' } if (strTitle) { const notifyRemindList = process.env.NOTIFY_NOREMIND ? process.env.NOTIFY_NOREMIND.split('&') : [] titleIndex = notifyRemindList.findIndex((item) => item === strTitle) if (titleIndex !== -1) { console.log(`${text} 在领取信息黑名单中,已跳过推送`) return } } else { strTitle = text } if (Notify_NoLoginSuccess == 'true') { if (desp.indexOf('登陆成功') != -1) { console.log(`登陆成功不推送`) return } } if (strTitle == '汪汪乐园养joy领取' && WP_APP_TOKEN_ONE) { console.log(`捕获汪汪乐园养joy领取通知,开始尝试一对一推送...`) var strPtPin = await GetPtPin(text) var strdecPtPin = decodeURIComponent(strPtPin) if (strPtPin) { await sendNotifybyWxPucher('汪汪乐园领取通知', `【京东账号】${strdecPtPin}\n当前等级: 30\n请到京东极速版APP提现6.66\n活动入口:京东极速版APP->我的->汪汪乐园->点礼包`, strdecPtPin) } } console.log('通知标题: ' + strTitle) //检查黑名单屏蔽通知 const notifySkipList = process.env.NOTIFY_SKIP_LIST ? process.env.NOTIFY_SKIP_LIST.split('&') : [] titleIndex = notifySkipList.findIndex((item) => item === strTitle) if (titleIndex !== -1) { console.log(`${strTitle} 在推送黑名单中,已跳过推送`) return } //检查脚本名称是否需要通知到Group2,Group2读取原环境配置的变量名后加2的值.例如: QYWX_AM2 for (lncount = 2; lncount < 20; lncount++) { if (process.env['NOTIFY_GROUP' + lncount + '_LIST']) { const strtemp = process.env['NOTIFY_GROUP' + lncount + '_LIST'] const notifyGroupList = strtemp ? strtemp.split('&') : [] const titleIndex = notifyGroupList.findIndex((item) => item === strTitle) if (titleIndex !== -1) { console.log(`${strTitle} 在群组${lncount}推送名单中,初始化群组推送`) UseGroupNotify = lncount } } } if (process.env.NOTIFY_CUSTOMNOTIFY) { strCustom = process.env.NOTIFY_CUSTOMNOTIFY strCustomArr = strCustom.replace(/^\[|\]$/g, '').split(',') strCustomTempArr = [] for (var Tempj in strCustomArr) { strCustomTempArr = strCustomArr[Tempj].split('&') if (strCustomTempArr.length > 1) { if (strTitle == strCustomTempArr[0]) { console.log('检测到自定义设定,开始执行配置...') if (strCustomTempArr[1].indexOf('组') != -1) { UseGroupNotify = strCustomTempArr[1].replace('组', '') * 1 console.log('自定义设定强制使用组' + UseGroupNotify + '配置通知...') } else { UseGroupNotify = 1 } if (strCustomTempArr.length > 2) { console.log('关闭所有通知变量...') Use_serverNotify = false Use_pushdeerNotify = false Use_pushPlusNotify = false Use_BarkNotify = false Use_tgBotNotify = false Use_ddBotNotify = false Use_qywxBotNotify = false Use_fsBotNotify = false Use_qywxamNotify = false Use_iGotNotify = false Use_gobotNotify = false for (let Tempk = 2; Tempk < strCustomTempArr.length; Tempk++) { var strTrmp = strCustomTempArr[Tempk] switch (strTrmp) { case 'Server酱': Use_serverNotify = true console.log('自定义设定启用Server酱进行通知...') break case 'pushdeer': Use_pushdeerNotify = true console.log('自定义设定启用pushdeer进行通知...') break case 'pushplus': Use_pushPlusNotify = true console.log('自定义设定启用pushplus(推送加)进行通知...') break case 'Bark': Use_BarkNotify = true console.log('自定义设定启用Bark进行通知...') break case 'TG机器人': Use_tgBotNotify = true console.log('自定义设定启用telegram机器人进行通知...') break case '钉钉': Use_ddBotNotify = true console.log('自定义设定启用钉钉机器人进行通知...') break case '企业微信机器人': Use_qywxBotNotify = true console.log('自定义设定启用企业微信机器人进行通知...') break case '企业微信应用消息': Use_qywxamNotify = true console.log('自定义设定启用企业微信应用消息进行通知...') break case '飞书机器人': Use_fsBotNotify = true console.log('自定义设定启用飞书机器人进行通知...') break case 'iGotNotify': Use_iGotNotify = true console.log('自定义设定启用iGot进行通知...') break case 'gobotNotify': Use_gobotNotify = true console.log('自定义设定启用go-cqhttp进行通知...') break case 'WxPusher': Use_WxPusher = true console.log('自定义设定启用WxPusher进行通知...') break } } } } } } } if (desp) { for (lncount = 2; lncount < 20; lncount++) { if (process.env['NOTIFY_INCLUDE_TEXT' + lncount]) { Notify_IncludeText = process.env['NOTIFY_INCLUDE_TEXT' + lncount].split('&') if (Notify_IncludeText.length > 0) { for (var Templ in Notify_IncludeText) { if (desp.indexOf(Notify_IncludeText[Templ]) != -1) { console.log('检测内容到内容存在组别推送的关键字(' + Notify_IncludeText[Templ] + '),将推送到组' + lncount + '...') UseGroupNotify = lncount break } } } } } } if (UseGroupNotify == 1) UseGroupNotify = '' if (process.env['GOBOT_URL' + UseGroupNotify] && Use_gobotNotify) { GOBOT_URL = process.env['GOBOT_URL' + UseGroupNotify] } if (process.env['GOBOT_TOKEN' + UseGroupNotify] && Use_gobotNotify) { GOBOT_TOKEN = process.env['GOBOT_TOKEN' + UseGroupNotify] } if (process.env['GOBOT_QQ' + UseGroupNotify] && Use_gobotNotify) { GOBOT_QQ = process.env['GOBOT_QQ' + UseGroupNotify] } if (process.env['PUSH_KEY' + UseGroupNotify] && Use_serverNotify) { SCKEY = process.env['PUSH_KEY' + UseGroupNotify] } if (process.env['DEER_KEY' + UseGroupNotify] && Use_pushdeerNotify) { PUSHDEER_KEY = process.env['DEER_KEY' + UseGroupNotify] } if (process.env['WP_APP_TOKEN' + UseGroupNotify] && Use_WxPusher) { WP_APP_TOKEN = process.env['WP_APP_TOKEN' + UseGroupNotify] } if (process.env['WP_TOPICIDS' + UseGroupNotify] && Use_WxPusher) { WP_TOPICIDS = process.env['WP_TOPICIDS' + UseGroupNotify] } if (process.env['WP_UIDS' + UseGroupNotify] && Use_WxPusher) { WP_UIDS = process.env['WP_UIDS' + UseGroupNotify] } if (process.env['WP_URL' + UseGroupNotify] && Use_WxPusher) { WP_URL = process.env['WP_URL' + UseGroupNotify] } if (process.env['BARK_PUSH' + UseGroupNotify] && Use_BarkNotify) { if (process.env['BARK_PUSH' + UseGroupNotify].indexOf('https') > -1 || process.env['BARK_PUSH' + UseGroupNotify].indexOf('http') > -1) { //兼容BARK自建用户 BARK_PUSH = process.env['BARK_PUSH' + UseGroupNotify] } else { //兼容BARK本地用户只填写设备码的情况 BARK_PUSH = `https://api.day.app/${process.env['BARK_PUSH' + UseGroupNotify]}` } if (process.env['BARK_SOUND' + UseGroupNotify]) { BARK_SOUND = process.env['BARK_SOUND' + UseGroupNotify] } if (process.env['BARK_GROUP' + UseGroupNotify]) { BARK_GROUP = process.env } } if (process.env['TG_BOT_TOKEN' + UseGroupNotify] && Use_tgBotNotify) { TG_BOT_TOKEN = process.env['TG_BOT_TOKEN' + UseGroupNotify] } if (process.env['TG_USER_ID' + UseGroupNotify] && Use_tgBotNotify) { TG_USER_ID = process.env['TG_USER_ID' + UseGroupNotify] } if (process.env['TG_PROXY_AUTH']) TG_PROXY_AUTH = process.env['TG_PROXY_AUTH'] if (process.env['TG_PROXY_HOST']) TG_PROXY_HOST = process.env['TG_PROXY_HOST'] if (process.env['TG_PROXY_PORT']) TG_PROXY_PORT = process.env['TG_PROXY_PORT'] if (process.env['TG_API_HOST']) TG_API_HOST = process.env['TG_API_HOST'] if (process.env['DD_BOT_TOKEN' + UseGroupNotify] && Use_ddBotNotify) { DD_BOT_TOKEN = process.env['DD_BOT_TOKEN' + UseGroupNotify] if (process.env['DD_BOT_SECRET' + UseGroupNotify]) { DD_BOT_SECRET = process.env['DD_BOT_SECRET' + UseGroupNotify] } } if (process.env['QYWX_KEY' + UseGroupNotify] && Use_qywxBotNotify) { QYWX_KEY = process.env['QYWX_KEY' + UseGroupNotify] } if (process.env['QYWX_AM' + UseGroupNotify] && Use_qywxamNotify) { QYWX_AM = process.env['QYWX_AM' + UseGroupNotify] } if (process.env['FS_KEY' + UseGroupNotify] && Use_fsBotNotify) { FS_KEY = process.env['FS_KEY' + UseGroupNotify] } if (process.env['IGOT_PUSH_KEY' + UseGroupNotify] && Use_iGotNotify) { IGOT_PUSH_KEY = process.env['IGOT_PUSH_KEY' + UseGroupNotify] } if (process.env['PUSH_PLUS_TOKEN' + UseGroupNotify] && Use_pushPlusNotify) { PUSH_PLUS_TOKEN = process.env['PUSH_PLUS_TOKEN' + UseGroupNotify] } if (process.env['PUSH_PLUS_USER' + UseGroupNotify] && Use_pushPlusNotify) { PUSH_PLUS_USER = process.env['PUSH_PLUS_USER' + UseGroupNotify] } if (process.env['GOTIFY_URL' + UseGroupNotify]) { GOTIFY_URL = process.env['GOTIFY_URL' + UseGroupNotify] } if (process.env['GOTIFY_TOKEN' + UseGroupNotify]) { GOTIFY_TOKEN = process.env['GOTIFY_TOKEN' + UseGroupNotify] } if (process.env['GOTIFY_PRIORITY' + UseGroupNotify]) { GOTIFY_PRIORITY = process.env['GOTIFY_PRIORITY' + UseGroupNotify] } if (process.env['BncrHost' + UseGroupNotify]) { BncrHost = process.env['BncrHost' + UseGroupNotify] } if (process.env['BncrToken' + UseGroupNotify]) { BncrToken = process.env['BncrToken' + UseGroupNotify] } //检查是否在不使用Remark进行名称替换的名单 const notifySkipRemarkList = process.env.NOTIFY_SKIP_NAMETYPELIST ? process.env.NOTIFY_SKIP_NAMETYPELIST.split('&') : [] const titleIndex3 = notifySkipRemarkList.findIndex((item) => item === strTitle) if (ShowRemarkType != '1' && titleIndex3 == -1) { console.log('sendNotify正在处理账号Remark.....') //开始读取青龙变量列表 const envs = await getEnvs() if (envs[0]) { var strTempdesp = [] var strAllNotify = '' if (text == '京东资产统计' || text == '京东资产统计#2' || text == '京东资产统计#3' || text == '京东资产统计#4') { strTempdesp = desp.split('🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏') if (strTempdesp.length == 2) { strAllNotify = strTempdesp[0] desp = strTempdesp[1] } } for (let i = 0; i < envs.length; i++) { cookie = envs[i].value $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) $.Remark = getRemark(envs[i].remarks) $.nickName = '' $.FoundnickName = '' $.FoundPin = '' //判断有没有Remark,没有搞个屁,有的继续 if ($.Remark) { //先查找缓存文件中有没有这个账号,有的话直接读取别名 if (envs[i].status == 0) { if (TempCK) { for (let j = 0; j < TempCK.length; j++) { if (TempCK[j].pt_pin == $.UserName) { $.FoundPin = TempCK[j].pt_pin $.nickName = TempCK[j].nickName } } } if (!$.FoundPin) { //缓存文件中有没有这个账号,调用京东接口获取别名,并更新缓存文件 console.log($.UserName + '好像是新账号,尝试获取别名.....') await GetnickName() if (!$.nickName) { console.log('别名获取失败,尝试调用另一个接口获取别名.....') await GetnickName2() } if ($.nickName) { console.log('好像是新账号,从接口获取别名' + $.nickName) } else { console.log($.UserName + '该账号没有别名.....') } tempAddCK = { pt_pin: $.UserName, nickName: $.nickName, } TempCK.push(tempAddCK) //标识,需要更新缓存文件 boolneedUpdate = true } } $.nickName = $.nickName || $.UserName //开始替换内容中的名字 if (ShowRemarkType == '2') { $.Remark = $.nickName + '(' + $.Remark + ')' } if (ShowRemarkType == '3') { $.Remark = $.UserName + '(' + $.Remark + ')' } try { //额外处理1,nickName包含星号 $.nickName = $.nickName.replace(new RegExp(`[*]`, 'gm'), '[*]') text = text.replace(new RegExp(`${$.UserName}|${$.nickName}`, 'gm'), $.Remark) if (text == '京东资产统计' || text == '京东资产统计#2' || text == '京东资产统计#3' || text == '京东资产统计#4') { var Tempinfo = '' if (envs[i].created) Tempinfo = getQLinfo(cookie, envs[i].created, envs[i].timestamp, envs[i].remarks) else if (envs[i].updatedAt) Tempinfo = getQLinfo(cookie, envs[i].createdAt, envs[i].updatedAt, envs[i].remarks) else Tempinfo = getQLinfo(cookie, envs[i].createdAt, envs[i].timestamp, envs[i].remarks) if (Tempinfo) { $.Remark += Tempinfo } } desp = desp.replace(new RegExp(`${$.UserName}|${$.nickName}`, 'gm'), $.Remark) strsummary = strsummary.replace(new RegExp(`${$.UserName}|${$.nickName}`, 'gm'), $.Remark) //额外处理2,nickName不包含星号,但是确实是手机号 var tempname = $.UserName if (tempname.length == 13 && tempname.substring(8)) { tempname = tempname.substring(0, 3) + '[*][*][*][*][*]' + tempname.substring(8) //console.log("额外处理2:"+tempname); text = text.replace(new RegExp(tempname, 'gm'), $.Remark) desp = desp.replace(new RegExp(tempname, 'gm'), $.Remark) strsummary = strsummary.replace(new RegExp(tempname, 'gm'), $.Remark) } } catch (err) { console.log('替换出错了') console.log('Debug Name1 :' + $.UserName) console.log('Debug Name2 :' + $.nickName) console.log('Debug Remark :' + $.Remark) } //console.log($.nickName+$.Remark); } } } console.log('处理完成,开始发送通知...') if (strAllNotify) { desp = strAllNotify + '\n' + desp } } } catch (error) { console.error(error) } if (boolneedUpdate) { var str = JSON.stringify(TempCK, null, 2) fs.writeFile(strCKFile, str, function (err) { if (err) { console.log(err) console.log('更新CKName_cache.json失败!') } else { console.log('缓存文件CKName_cache.json更新成功!') } }) } //提供6种通知 desp = buildLastDesp(desp, author) await serverNotify(text, desp) //微信server酱 if (PUSH_PLUS_TOKEN) { console.log('PUSH_PLUS TOKEN :' + PUSH_PLUS_TOKEN) } if (PUSH_PLUS_USER) { console.log('PUSH_PLUS USER :' + PUSH_PLUS_USER) } PushErrorTime = 0 await pushPlusNotify(text, desp) //pushplus(推送加) if (PushErrorTime > 0) { console.log('等待1分钟后重试.....') await $.wait(60000) await pushPlusNotify(text, desp) //pushplus(推送加) } if (PushErrorTime > 0) { console.log('等待1分钟后重试.....') await $.wait(60000) await pushPlusNotify(text, desp) //pushplus(推送加) } //由于上述两种微信通知需点击进去才能查看到详情,故text(标题内容)携带了账号序号以及昵称信息,方便不点击也可知道是哪个京东哪个活动 text = text.match(/.*?(?=\s?-)/g) ? text.match(/.*?(?=\s?-)/g)[0] : text await Promise.all([ BarkNotify(text, desp, params), //iOS Bark APP tgBotNotify(text, desp), //telegram 机器人 ddBotNotify(text, desp), //钉钉机器人 qywxBotNotify(text, desp), //企业微信机器人 qywxamNotify(text, desp, strsummary), //企业微信应用消息推送 fsBotNotify(text, desp), //飞书机器人 iGotNotify(text, desp, params), //iGot gobotNotify(text, desp), //go-cqhttp gotifyNotify(text, desp), //gotify bncrNotify(text, desp), //bncr wxpusherNotify(text, desp), // wxpusher PushDeerNotify(text, desp), //pushdeer推送 ]) } function getuuid(strRemark, PtPin) { var strTempuuid = '' if (strRemark) { var Tempindex = strRemark.indexOf('@@') if (Tempindex != -1) { console.log(PtPin + ': 检测到NVJDC的一对一格式,瑞思拜~!') var TempRemarkList = strRemark.split('@@') for (let j = 0; j < TempRemarkList.length; j++) { if (TempRemarkList[j]) { if (TempRemarkList[j].length > 4) { if (TempRemarkList[j].substring(0, 4) == 'UID_') { strTempuuid = TempRemarkList[j] break } } } } if (!strTempuuid) { console.log('检索资料失败...') } } } if (!strTempuuid && TempCKUid) { console.log('正在从CK_WxPusherUid文件中检索资料...') for (let j = 0; j < TempCKUid.length; j++) { if (PtPin == decodeURIComponent(TempCKUid[j].pt_pin)) { strTempuuid = TempCKUid[j].Uid break } } } return strTempuuid } function getQLinfo(strCK, intcreated, strTimestamp, strRemark) { var strCheckCK = strCK.match(/pt_key=([^; ]+)(?=;?)/) && strCK.match(/pt_key=([^; ]+)(?=;?)/)[1] var strPtPin = decodeURIComponent(strCK.match(/pt_pin=([^; ]+)(?=;?)/) && strCK.match(/pt_pin=([^; ]+)(?=;?)/)[1]) var strReturn = '' if (strCheckCK.substring(0, 3) == 'AAJ') { var DateCreated = new Date(intcreated) var DateTimestamp = new Date(strTimestamp) var DateToday = new Date() if (strRemark) { var Tempindex = strRemark.indexOf('@@') if (Tempindex != -1) { //console.log(strPtPin + ": 检测到NVJDC的备注格式,尝试获取登录时间,瑞思拜~!"); var TempRemarkList = strRemark.split('@@') for (let j = 1; j < TempRemarkList.length; j++) { if (TempRemarkList[j]) { if (TempRemarkList[j].length == 13) { DateTimestamp = new Date(parseInt(TempRemarkList[j])) //console.log(strPtPin + ": 获取登录时间成功:" + GetDateTime(DateTimestamp)); break } } } } } //过期时间 var UseDay = Math.ceil((DateToday.getTime() - DateCreated.getTime()) / 86400000) var LogoutDay = 30 - Math.ceil((DateToday.getTime() - DateTimestamp.getTime()) / 86400000) let Loginday = Math.ceil((DateToday.getTime() - DateTimestamp.getTime()) / 86400000) //if (LogoutDay < 1) { strReturn = '\n【登录信息】已服务' + UseDay + '天(已登录' + Loginday + '天)' //} else { // strReturn = "\n【登录信息】已服务" + UseDay + "天(有效期约剩" + LogoutDay + "天)" //} } return strReturn } function getRemark(strRemark) { if (strRemark) { var Tempindex = strRemark.indexOf('@@') if (Tempindex != -1) { var TempRemarkList = strRemark.split('@@') return TempRemarkList[0].trim() } else { //这是为了处理ninjia的remark格式 strRemark = strRemark.replace('remark=', '') strRemark = strRemark.replace(';', '') return strRemark.trim() } } else { return '' } } async function sendNotifybyWxPucher(text, desp, PtPin, author = '\n\n本通知 By JDmax仓库', strsummary = '') { try { var Uid = '' var UserRemark = '' var strTempdesp = [] var strAllNotify = '' if (text == '京东资产统计') { strTempdesp = desp.split('🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏') if (strTempdesp.length == 2) { strAllNotify = strTempdesp[0] desp = strTempdesp[1] } } if (WP_APP_TOKEN_ONE) { var tempEnv = await getEnvByPtPin(PtPin) if (tempEnv) { cookie = tempEnv.value Uid = getuuid(tempEnv.remarks, PtPin) UserRemark = getRemark(tempEnv.remarks) if (Uid) { console.log('查询到Uid :' + Uid) WP_UIDS_ONE = Uid console.log('正在发送一对一通知,请稍后...') if (text == '京东资产统计') { try { $.nickName = '' $.FoundPin = '' $.UserName = PtPin if (tempEnv.status == 0) { if (TempCK) { for (let j = 0; j < TempCK.length; j++) { if (TempCK[j].pt_pin == $.UserName) { $.FoundPin = TempCK[j].pt_pin $.nickName = TempCK[j].nickName } } } if (!$.FoundPin) { //缓存文件中有没有这个账号,调用京东接口获取别名,并更新缓存文件 console.log($.UserName + '好像是新账号,尝试获取别名.....') await GetnickName() if (!$.nickName) { console.log('别名获取失败,尝试调用另一个接口获取别名.....') await GetnickName2() } } } $.nickName = $.nickName || $.UserName //额外处理1,nickName包含星号 $.nickName = $.nickName.replace(new RegExp(`[*]`, 'gm'), '[*]') var Tempinfo = '' if (tempEnv.created) Tempinfo = getQLinfo(cookie, tempEnv.created, tempEnv.timestamp, tempEnv.remarks) else if (tempEnv.updatedAt) Tempinfo = getQLinfo(cookie, tempEnv.createdAt, tempEnv.updatedAt, tempEnv.remarks) else Tempinfo = getQLinfo(cookie, tempEnv.createdAt, tempEnv.timestamp, tempEnv.remarks) if (Tempinfo) { Tempinfo = $.nickName + Tempinfo desp = desp.replace(new RegExp(`${$.UserName}|${$.nickName}`, 'gm'), Tempinfo) } //额外处理2,nickName不包含星号,但是确实是手机号 var tempname = $.UserName if (tempname.length == 13 && tempname.substring(8)) { tempname = tempname.substring(0, 3) + '[*][*][*][*][*]' + tempname.substring(8) desp = desp.replace(new RegExp(tempname, 'gm'), $.Remark) } } catch (err) { console.log('替换出错了') console.log('Debug Name1 :' + $.UserName) console.log('Debug Name2 :' + $.nickName) console.log('Debug Remark :' + $.Remark) } } if (UserRemark) { text = text + ' (' + UserRemark + ')' } console.log('处理完成,开始发送通知...') desp = buildLastDesp(desp, author) if (strAllNotify) { desp = strAllNotify + '\n' + desp } await wxpusherNotifyByOne(text, desp, strsummary) } else { console.log('未查询到用户的Uid,取消一对一通知发送...') } } } else { console.log('变量WP_APP_TOKEN_ONE未配置WxPusher的appToken, 取消发送...') } } catch (error) { console.error(error) } } async function GetPtPin(text) { try { const TempList = text.split('- ') if (TempList.length > 1) { var strNickName = TempList[TempList.length - 1] var strPtPin = '' console.log(`捕获别名:` + strNickName) if (TempCK) { for (let j = 0; j < TempCK.length; j++) { if (TempCK[j].nickName == strNickName) { strPtPin = TempCK[j].pt_pin break } if (TempCK[j].pt_pin == strNickName) { strPtPin = TempCK[j].pt_pin break } } if (strPtPin) { console.log(`反查PtPin成功:` + strPtPin) return strPtPin } else { console.log(`别名反查PtPin失败: 1.用户更改了别名 2.可能是新用户,别名缓存还没有。`) return strNickName } } } else { console.log(`标题格式无法捕获别名...`) return '' } } catch (error) { console.error(error) return '' } } async function isLoginByX1a0He(cookie) { return new Promise((resolve) => { const options = { url: 'https://plogin.m.jd.com/cgi-bin/ml/islogin', headers: { Cookie: cookie, referer: 'https://h5.m.jd.com/', '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', }, } $.get(options, (err, resp, data) => { try { if (data) { data = JSON.parse(data) if (data.islogin === '1') { console.log(`使用X1a0He写的接口加强检测: Cookie有效\n`) } else if (data.islogin === '0') { isLogin = false console.log(`使用X1a0He写的接口加强检测: Cookie无效\n`) } else { console.log(`使用X1a0He写的接口加强检测: 未知返回,不作变更...\n`) } } } catch (e) { console.log(e) } finally { resolve() } }) }) } function bncrNotify(text, desp) { return new Promise((resolve) => { try { if (BncrHost && BncrToken) { const options = { url: `${BncrHost}/api/qinglongMessage`, body: `title=${encodeURIComponent(text)}&message=${encodeURIComponent(desp)}&token=${BncrToken}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, } $.post(options, (err, resp, data) => { if (err) { console.log('\nBncr发送通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.code === 200) { console.log('\nBncr发送通知消息成功🎉\n') } else { console.log(`\nBncr发送通知调用API失败:${data.msg}\n`) } } }) } else { resolve() } } catch (e) { $.logErr(`\nBncr发送通知调用API失败:`, e) } finally { resolve() } }) } function gotifyNotify(text, desp) { return new Promise((resolve) => { if (GOTIFY_URL && GOTIFY_TOKEN) { const options = { url: `${GOTIFY_URL}/message?token=${GOTIFY_TOKEN}`, body: `title=${encodeURIComponent(text)}&message=${encodeURIComponent(desp)}&priority=${GOTIFY_PRIORITY}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, } $.post(options, (err, resp, data) => { try { if (err) { console.log('gotify发送通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.id) { console.log('gotify发送通知消息成功🎉\n') } else { console.log(`${data.message}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve() } }) } else { resolve() } }) } function gobotNotify(text, desp, time = 2100) { return new Promise((resolve) => { if (GOBOT_URL) { const options = { url: `${GOBOT_URL}?access_token=${GOBOT_TOKEN}&${GOBOT_QQ}`, json: { message: `${text}\n${desp}`, }, headers: { 'Content-Type': 'application/json', }, timeout, } setTimeout(() => { $.post(options, (err, resp, data) => { try { if (err) { console.log('发送go-cqhttp通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.retcode === 0) { console.log('go-cqhttp发送通知消息成功🎉\n') } else if (data.retcode === 100) { console.log(`go-cqhttp发送通知消息异常: ${data.errmsg}\n`) } else { console.log(`go-cqhttp发送通知消息异常\n${JSON.stringify(data)}`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) }, time) } else { resolve() } }) } function serverNotify(text, desp, time = 2100) { return new Promise((resolve) => { if (SCKEY) { //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换 desp = desp.replace(/[\n\r]/g, '\n\n') const options = { url: SCKEY.includes('SCT') ? `https://sctapi.ftqq.com/${SCKEY}.send` : `https://sc.ftqq.com/${SCKEY}.send`, body: `text=${text}&desp=${desp}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, timeout, } setTimeout(() => { $.post(options, (err, resp, data) => { try { if (err) { console.log('发送通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) //server酱和Server酱·Turbo版的返回json格式不太一样 if (data.errno === 0 || data.data.errno === 0) { console.log('server酱发送通知消息成功🎉\n') } else if (data.errno === 1024) { // 一分钟内发送相同的内容会触发 console.log(`server酱发送通知消息异常: ${data.errmsg}\n`) } else { console.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) }, time) } else { resolve() } }) } function BarkNotify(text, desp, params = {}) { return new Promise((resolve) => { if (BARK_PUSH) { const options = { url: `${BARK_PUSH}`, json: { title: text, body: desp, group: `${BARK_GROUP}`, //icon: `${BARK_ICON}`, sound: `${BARK_SOUND}`, }, headers: { 'Content-Type': 'application/json; charset=utf-8', }, timeout, } $.post(options, (err, resp, data) => { try { if (err) { console.log('Bark APP发送通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.code === 200) { console.log('Bark APP发送通知消息成功🎉\n') } else { console.log(`${data.message}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve() } }) } else { resolve() } }) } function tgBotNotify(text, desp) { return new Promise((resolve) => { if (TG_BOT_TOKEN && TG_USER_ID) { const maxSegmentLength = 4000 const despSegments = [] let remainingDesp = desp while (remainingDesp.length > maxSegmentLength) { let index = remainingDesp.lastIndexOf('\n', maxSegmentLength) if (index === -1) { index = maxSegmentLength } despSegments.push(remainingDesp.slice(0, index)) remainingDesp = remainingDesp.slice(index).trimLeft() } if (remainingDesp) { despSegments.push(remainingDesp) } const sendSegment = (index) => { if (index < despSegments.length) { const options = { url: `https://${TG_API_HOST}/bot${TG_BOT_TOKEN}/sendMessage`, json: { chat_id: `${TG_USER_ID}`, text: `${text}\n\n${despSegments[index]}`, disable_web_page_preview: true, }, headers: { 'Content-Type': 'application/json', }, timeout, } if (TG_PROXY_HOST && TG_PROXY_PORT) { const tunnel = require('tunnel') const agent = { https: tunnel.httpsOverHttp({ proxy: { host: TG_PROXY_HOST, port: TG_PROXY_PORT * 1, proxyAuth: TG_PROXY_AUTH, }, }), } Object.assign(options, { agent }) } $.post(options, (err, resp, data) => { if (err) { console.log('telegram发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.ok) { console.log('Telegram发送通知消息成功🎉\n') } else if (data.error_code === 400) { console.log('请主动给bot发送一条消息并检查接收用户ID是否正确。\n') } else if (data.error_code === 401) { console.log('Telegram bot token 填写错误。\n') } } // 继续发送下一段消息 sendSegment(index + 1) }) } else { // 所有消息发送完成后 resolve resolve() } } // 开始发送第一段消息 sendSegment(0) } else { resolve() } }) } function ddBotNotify(text, desp) { return new Promise((resolve) => { const options = { url: `https://oapi.dingtalk.com/robot/send?access_token=${DD_BOT_TOKEN}`, json: { msgtype: 'text', text: { content: ` ${text}\n\n${desp}`, }, }, headers: { 'Content-Type': 'application/json', }, timeout, } if (DD_BOT_TOKEN && DD_BOT_SECRET) { const crypto = require('crypto') const dateNow = Date.now() const hmac = crypto.createHmac('sha256', DD_BOT_SECRET) hmac.update(`${dateNow}\n${DD_BOT_SECRET}`) const result = encodeURIComponent(hmac.digest('base64')) options.url = `${options.url}×tamp=${dateNow}&sign=${result}` $.post(options, (err, resp, data) => { try { if (err) { console.log('钉钉发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.errcode === 0) { console.log('钉钉发送通知消息成功🎉。\n') } else { console.log(`${data.errmsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else if (DD_BOT_TOKEN) { $.post(options, (err, resp, data) => { try { if (err) { console.log('钉钉发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.errcode === 0) { console.log('钉钉发送通知消息完成。\n') } else { console.log(`${data.errmsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function qywxBotNotify(text, desp) { return new Promise((resolve) => { const options = { url: `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${QYWX_KEY}`, json: { msgtype: 'text', text: { content: ` ${text}\n\n${desp}`, }, }, headers: { 'Content-Type': 'application/json', }, timeout, } if (QYWX_KEY) { $.post(options, (err, resp, data) => { try { if (err) { console.log('企业微信发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.errcode === 0) { console.log('企业微信发送通知消息成功🎉。\n') } else { console.log(`${data.errmsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function fsBotNotify(text, desp) { return new Promise((resolve) => { const options = { url: `https://open.feishu.cn/open-apis/bot/v2/hook/${FS_KEY}`, json: { msg_type: 'text', content: { text: ` ${text}\n\n${desp}`, }, }, headers: { 'Content-Type': 'application/json', }, timeout, } if (FS_KEY) { $.post(options, (err, resp, data) => { try { if (err) { console.log('飞书发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.errcode === 0) { console.log('飞书发送通知消息成功🎉。\n') } else { console.log(`${data.errmsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function buildLastDesp(desp, author = '') { author = process.env.NOTIFY_AUTHOR || author if (process.env.NOTIFY_AUTHOR_BLANK || !author) { return desp.trim() } else { if (!author.match(/本通知 By/)) { author = `\n\n${author}` } return desp.trim() + author + '\n现在时刻: ' + GetDateTime(new Date()) } } function ChangeUserId(desp) { const QYWX_AM_AY = QYWX_AM.split(',') if (QYWX_AM_AY[2]) { const userIdTmp = QYWX_AM_AY[2].split('|') let userId = '' for (let i = 0; i < userIdTmp.length; i++) { const count = '账号' + (i + 1) const count2 = '签到号 ' + (i + 1) if (desp.match(count2)) { userId = userIdTmp[i] } } if (!userId) userId = QYWX_AM_AY[2] return userId } else { return '@all' } } function qywxamNotify(text, desp, strsummary = '') { return new Promise((resolve) => { if (QYWX_AM) { const QYWX_AM_AY = QYWX_AM.split(',') const options_accesstoken = { url: `https://qyapi.weixin.qq.com/cgi-bin/gettoken`, json: { corpid: `${QYWX_AM_AY[0]}`, corpsecret: `${QYWX_AM_AY[1]}`, }, headers: { 'Content-Type': 'application/json', }, timeout, } $.post(options_accesstoken, (err, resp, data) => { html = desp.replace(/\n/g, '
') html = `${html}` if (strsummary == '') { strsummary = desp } var json = JSON.parse(data) accesstoken = json.access_token let options switch (QYWX_AM_AY[4]) { case '0': options = { msgtype: 'textcard', textcard: { title: `${text}`, description: `${strsummary}`, url: 'https://github.com/whyour/qinglong', btntxt: '更多', }, } break case '1': options = { msgtype: 'text', text: { content: `${text}\n\n${desp}`, }, } break default: options = { msgtype: 'mpnews', mpnews: { articles: [ { title: `${text}`, thumb_media_id: `${QYWX_AM_AY[4]}`, author: `智能助手`, content_source_url: ``, content: `${html}`, digest: `${strsummary}`, }, ], }, } } if (!QYWX_AM_AY[4]) { //如不提供第四个参数,则默认进行文本消息类型推送 options = { msgtype: 'text', text: { content: `${text}\n\n${desp}`, }, } } options = { url: `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}`, json: { touser: `${ChangeUserId(desp)}`, agentid: `${QYWX_AM_AY[3]}`, safe: '0', ...options, }, headers: { 'Content-Type': 'application/json', }, } $.post(options, (err, resp, data) => { try { if (err) { console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.errcode === 0) { console.log('成员ID:' + ChangeUserId(desp) + '企业微信应用消息发送通知消息成功🎉。\n') } else { console.log(`${data.errmsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) }) } else { resolve() } }) } function iGotNotify(text, desp, params = {}) { return new Promise((resolve) => { if (IGOT_PUSH_KEY) { // 校验传入的IGOT_PUSH_KEY是否有效 const IGOT_PUSH_KEY_REGX = new RegExp('^[a-zA-Z0-9]{24}$') if (!IGOT_PUSH_KEY_REGX.test(IGOT_PUSH_KEY)) { console.log('您所提供的IGOT_PUSH_KEY无效\n') resolve() return } const options = { url: `https://push.hellyw.com/${IGOT_PUSH_KEY.toLowerCase()}`, body: `title=${text}&content=${desp}&${querystring.stringify(params)}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, timeout, } $.post(options, (err, resp, data) => { try { if (err) { console.log('发送通知调用API失败!!\n') console.log(err) } else { if (typeof data === 'string') data = JSON.parse(data) if (data.ret === 0) { console.log('iGot发送通知消息成功🎉\n') } else { console.log(`iGot发送通知消息失败:${data.errMsg}\n`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function pushPlusNotify(text, desp) { return new Promise((resolve) => { if (PUSH_PLUS_TOKEN) { //desp = `${desp}`; desp = desp.replace(/[\n\r]/g, '
') // 默认为html, 不支持plaintext const body = { token: `${PUSH_PLUS_TOKEN}`, title: `${text}`, content: `${desp}`, topic: `${PUSH_PLUS_USER}`, } const options = { url: `https://www.pushplus.plus/send`, body: JSON.stringify(body), headers: { 'Content-Type': ' application/json', }, timeout, } $.post(options, (err, resp, data) => { try { if (err) { console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`) PushErrorTime += 1 console.log(err) } else { data = JSON.parse(data) if (data.code === 200) { console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`) PushErrorTime = 0 } else { console.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`) PushErrorTime += 1 } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function wxpusherNotifyByOne(text, desp, strsummary = '') { return new Promise((resolve) => { if (WP_APP_TOKEN_ONE) { var WPURL = '' if (strsummary) { strsummary = text + '\n' + strsummary } else { strsummary = text + '\n' + desp } if (strsummary.length > 96) { strsummary = strsummary.substring(0, 95) + '...' } let uids = [] for (let i of WP_UIDS_ONE.split(';')) { if (i.length != 0) uids.push(i) } let topicIds = [] //desp = `${desp}`; desp = desp.replace(/[\n\r]/g, '
') // 默认为html, 不支持plaintext desp = `

${text}

📢

${desp}

` const body = { appToken: `${WP_APP_TOKEN_ONE}`, content: `${desp}`, summary: `${strsummary}`, contentType: 2, topicIds: topicIds, uids: uids, url: `${WPURL}`, } const options = { url: `http://wxpusher.zjiecode.com/api/send/message`, body: JSON.stringify(body), headers: { 'Content-Type': 'application/json', }, timeout, } $.post(options, (err, resp, data) => { try { if (err) { console.log('WxPusher 发送通知调用 API 失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.code === 1000) { console.log('WxPusher 发送通知消息成功!\n') } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function wxpusherNotify(text, desp) { return new Promise((resolve) => { if (WP_APP_TOKEN) { let uids = [] for (let i of WP_UIDS.split(';')) { if (i.length != 0) uids.push(i) } let topicIds = [] for (let i of WP_TOPICIDS.split(';')) { if (i.length != 0) topicIds.push(i) } desp = `${text}\n\n${desp}` desp = desp.replace(/[\n\r]/g, '
') // 默认为html, 不支持plaintext const body = { appToken: `${WP_APP_TOKEN}`, content: `${text}\n\n${desp}`, summary: `${text}`, contentType: 2, topicIds: topicIds, uids: uids, url: `${WP_URL}`, } const options = { url: `http://wxpusher.zjiecode.com/api/send/message`, body: JSON.stringify(body), headers: { 'Content-Type': 'application/json', }, timeout, } $.post(options, (err, resp, data) => { try { if (err) { console.log('WxPusher 发送通知调用 API 失败!!\n') console.log(err) } else { data = JSON.parse(data) if (data.code === 1000) { console.log('WxPusher 发送通知消息成功!\n') } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function PushDeerNotify(text, desp) { return new Promise((resolve) => { if (PUSHDEER_KEY) { desp = encodeURI(desp) desp = desp.replace(/%0A/g, '%0A%0A') const options = { url: `https://api2.pushdeer.com/message/push`, body: `pushkey=${PUSHDEER_KEY}&text=${text}&desp=${desp}&type="markdown"`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, timeout: 5000, } $.post(options, (err, resp, data) => { try { if (err) { console.log('发送通知调用API失败!!\n') console.log(err) } else { data = JSON.parse(data) // 通过返回的result的长度来判断是否成功 if (data.content.result.length !== undefined && data.content.result.length > 0) { console.log('PushDeer发送通知消息成功🎉\n') } else { console.log(`PushDeer发送通知消息异常\n${JSON.stringify(data)}`) } } } catch (e) { $.logErr(e, resp) } finally { resolve(data) } }) } else { resolve() } }) } function GetDateTime(date) { var timeString = '' var timeString = date.getFullYear() + '-' if (date.getMonth() + 1 < 10) timeString += '0' + (date.getMonth() + 1) + '-' else timeString += date.getMonth() + 1 + '-' if (date.getDate() < 10) timeString += '0' + date.getDate() + ' ' else timeString += date.getDate() + ' ' if (date.getHours() < 10) timeString += '0' + date.getHours() + ':' else timeString += date.getHours() + ':' if (date.getMinutes() < 10) timeString += '0' + date.getMinutes() + ':' else timeString += date.getMinutes() + ':' if (date.getSeconds() < 10) timeString += '0' + date.getSeconds() else timeString += date.getSeconds() return timeString } function GetnickName() { return new Promise(async (resolve) => { const options = { url: 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion', headers: { Host: 'me-api.jd.com', Accept: '*/*', Connection: 'keep-alive', Cookie: cookie, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42', 'Accept-Language': 'zh-cn', Referer: 'https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&', 'Accept-Encoding': 'gzip, deflate, br', }, } $.get(options, (err, resp, data) => { try { if (err) { $.logErr(err) } else { if (data) { data = JSON.parse(data) if (data['retcode'] === '1001') { return } if (data['retcode'] === '0' && data.data && data.data.hasOwnProperty('userInfo')) { $.nickName = data.data.userInfo.baseInfo.nickname } } else { $.log('京东服务器返回空数据') } } } catch (e) { $.logErr(e) } finally { resolve() } }) }) } function GetnickName2() { return new Promise(async (resolve) => { const options = { url: `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`, headers: { Accept: 'application/json,text/plain, */*', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-cn', Connection: 'keep-alive', Cookie: cookie, Referer: 'https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2', 'User-Agent': $.UA, }, } $.post(options, (err, resp, data) => { try { if (err) { $.logErr(err) } else { if (data) { data = JSON.parse(data) if (data['retcode'] === 13) { $.isLogin = false //cookie过期 return } if (data['retcode'] === 0) { $.nickName = (data['base'] && data['base'].nickname) || '' } } else { $.log('京东服务器返回空数据') } } } catch (e) { $.logErr(e) } finally { resolve() } }) }) } const got = require('got') require('dotenv').config() const tokenFileList = ['/ql/data/db/keyv.sqlite', '/ql/data/config/auth.json', '/ql/config/auth.json'] let authFile = getLatestFile(tokenFileList) const api = got.extend({ prefixUrl: 'http://127.0.0.1:5600', retry: { limit: 0 }, }) function getLatestFile(files) { let latestFile = null let latestMtime = 0 for (const file of files) { try { const stats = fs.statSync(file) const mtime = stats.mtimeMs if (mtime > latestMtime) { latestMtime = mtime latestFile = file } } catch (e) {} } return latestFile } async function getToken() { const authConfig = await fs.readFileSync(authFile) // console.log(authConfig.toString().match(/"token":"(.*?)",/)[1]) return authConfig.toString().match(/"token":"([^"]*)"(?!.*"token":)/)[1] } async function getEnvs() { const token = await getToken() const body = await api({ url: 'api/envs', searchParams: { searchValue: 'JD_COOKIE', t: Date.now(), }, headers: { Accept: 'application/json', authorization: `Bearer ${token}`, }, }).json() return body.data } async function getEnvsCount() { const data = await getEnvs() return data.length } async function addEnv(cookie, remarks) { const token = await getToken() const body = await api({ method: 'post', url: 'api/envs', params: { t: Date.now() }, json: [ { name: 'JD_COOKIE', value: cookie, remarks, }, ], headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } async function updateEnv(cookie, eid, remarks) { const token = await getToken() const body = await api({ method: 'put', url: 'api/envs', params: { t: Date.now() }, json: { name: 'JD_COOKIE', value: cookie, _id: eid, remarks, }, headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } async function updateEnv11(cookie, eid, remarks) { const token = await getToken() const body = await api({ method: 'put', url: 'api/envs', params: { t: Date.now() }, json: { name: 'JD_COOKIE', value: cookie, id: eid, remarks, }, headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } async function DisableCk(eid) { const token = await getToken() const body = await api({ method: 'put', url: 'api/envs/disable', params: { t: Date.now() }, body: JSON.stringify([eid]), headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } async function EnableCk(eid) { const token = await getToken() const body = await api({ method: 'put', url: 'api/envs/enable', params: { t: Date.now() }, body: JSON.stringify([eid]), headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } async function getstatus(eid) { const envs = await getEnvs() var tempid = 0 for (let i = 0; i < envs.length; i++) { tempid = 0 if (envs[i]._id) { tempid = envs[i]._id } if (envs[i].id) { tempid = envs[i].id } if (tempid == eid) { return envs[i].status } } return 99 } async function getEnvById(eid) { const envs = await getEnvs() var tempid = 0 for (let i = 0; i < envs.length; i++) { tempid = 0 if (envs[i]._id) { tempid = envs[i]._id } if (envs[i].id) { tempid = envs[i].id } if (tempid == eid) { return envs[i].value } } return '' } async function getEnvByPtPin(Ptpin) { const envs = await getEnvs() for (let i = 0; i < envs.length; i++) { var tempptpin = decodeURIComponent(envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/) && envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/)[1]) if (tempptpin == Ptpin) { return envs[i] } } return '' } async function delEnv(eid) { const token = await getToken() const body = await api({ method: 'delete', url: 'api/envs', params: { t: Date.now() }, body: JSON.stringify([eid]), headers: { Accept: 'application/json', authorization: `Bearer ${token}`, 'Content-Type': 'application/json;charset=UTF-8', }, }).json() return body } module.exports = { sendNotify, sendNotifybyWxPucher, BARK_PUSH, } // prettier-ignore function Env(t, s) { return new (class { constructor(t, s) { (this.name = t), (this.data = null), (this.dataFile = 'box.dat'), (this.logs = []), (this.logSeparator = '\n'), (this.startTime = new Date().getTime()), Object.assign(this, s), this.log('', `\ud83d\udd14${this.name}, \u5f00\u59cb!`); } isNode() { return 'undefined' != typeof module && !!module.exports; } isQuanX() { return 'undefined' != typeof $task; } isSurge() { return 'undefined' != typeof $httpClient && 'undefined' == typeof $loon; } isLoon() { return 'undefined' != typeof $loon; } getScript(t) { return new Promise((s) => { $.get({ url: t }, (t, e, i) => s(i)); }); } runScript(t, s) { return new Promise((e) => { let i = this.getdata('@chavy_boxjs_userCfgs.httpapi'); i = i ? i.replace(/\n/g, '').trim() : i; let o = this.getdata('@chavy_boxjs_userCfgs.httpapi_timeout'); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split('@'), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: 'cron', timeout: o }, headers: { 'X-Key': h, Accept: '*/*' }, }; $.post(r, (t, s, i) => e(i)); }).catch((t) => this.logErr(t)); } loaddata() { if (!this.isNode()) return {}; { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s); if (!e && !i) return {}; { const i = e ? t : s; try { return JSON.parse(this.fs.readFileSync(i)); } catch (t) { return {}; } } } } writedata() { if (this.isNode()) { (this.fs = this.fs ? this.fs : require('fs')), (this.path = this.path ? this.path : require('path')); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s), o = JSON.stringify(this.data); e ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o); } } lodash_get(t, s, e) { const i = s.replace(/\[(\d+)\]/g, '.$1').split('.'); let o = t; for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e; return o; } lodash_set(t, s, e) { return Object(t) !== t ? t : (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []), (s.slice(0, -1).reduce((t, e, i) => (Object(t[e]) === t[e] ? t[e] : (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {})), t)[s[s.length - 1]] = e), t); } getdata(t) { let s = this.getval(t); if (/^@/.test(t)) { const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t), o = e ? this.getval(e) : ''; if (o) try { const t = JSON.parse(o); s = t ? this.lodash_get(t, i, '') : s; } catch (t) { s = ''; } } return s; } setdata(t, s) { let e = !1; if (/^@/.test(s)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s), h = this.getval(i), a = i ? ('null' === h ? null : h || '{}') : '{}'; try { const s = JSON.parse(a); this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i)); } catch (s) { const h = {}; this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i)); } } else e = $.setval(t, s); return e; } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? ((this.data = this.loaddata()), this.data[t]) : (this.data && this.data[t]) || null; } setval(t, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (this.data && this.data[s]) || null; } initGotEnv(t) { (this.got = this.got ? this.got : require('got')), (this.cktough = this.cktough ? this.cktough : require('tough-cookie')), (this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)); } get(t, s = () => { }) { t.headers && (delete t.headers['Content-Type'], delete t.headers['Content-Length']), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }) : this.isQuanX() ? $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t)) : this.isNode() && (this.initGotEnv(t), this.got(t).on('redirect', (t, s) => { try { const e = t.headers['set-cookie'].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar); } catch (t) { this.logErr(t); } }).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t))); } post(t, s = () => { }) { if ((t.body && t.headers && !t.headers['Content-Type'] && (t.headers['Content-Type'] = 'application/x-www-form-urlencoded'), delete t.headers['Content-Length'], this.isSurge() || this.isLoon())) $httpClient.post(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i); }); else if (this.isQuanX()) (t.method = 'POST'), $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h); }, (t) => s(t)); } } time(t) { let s = { 'M+': new Date().getMonth() + 1, 'd+': new Date().getDate(), 'H+': new Date().getHours(), 'm+': new Date().getMinutes(), 's+': new Date().getSeconds(), 'q+': Math.floor((new Date().getMonth() + 3) / 3), S: new Date().getMilliseconds(), }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (new Date().getFullYear() + '').substr(4 - RegExp.$1.length))); for (let e in s) new RegExp('(' + e + ')').test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ('00' + s[e]).substr(('' + s[e]).length))); return t; } msg(s = t, e = '', i = '', o) { const h = (t) => !t || (!this.isLoon() && this.isSurge()) ? t : 'string' == typeof t ? this.isLoon() ? t : this.isQuanX() ? { 'open-url': t } : void 0 : 'object' == typeof t && (t['open-url'] || t['media-url']) ? this.isLoon() ? t['open-url'] : this.isQuanX() ? t : void 0 : void 0; $.isMute || (this.isSurge() || this.isLoon() ? $notification.post(s, e, i, h(o)) : this.isQuanX() && $notify(s, e, i, h(o))), this.logs.push('', '==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============='), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i); } log(...t) { t.length > 0 ? (this.logs = [...this.logs, ...t]) : console.log(this.logs.join(this.logSeparator)); } logErr(t, s) { const e = !this.isSurge() && !this.isQuanX() && !this.isLoon(); e ? $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : $.log('', `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t); } wait(t) { return new Promise((s) => setTimeout(s, t)); } done(t = {}) { const s = new Date().getTime(), e = (s - this.startTime) / 1e3; this.log('', `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t); } })(t, s); }