diff --git a/jd_bean_change.js b/jd_bean_change.js index 38d811f..bb7d4be 100644 --- a/jd_bean_change.js +++ b/jd_bean_change.js @@ -1061,6 +1061,7 @@ async function bean() { } await redPacket(); + await getCoupon(); } async function Monthbean() { @@ -1571,6 +1572,107 @@ function redPacket() { }) } +function getCoupon() { + return new Promise(resolve => { + let options = { + url: `https://wq.jd.com/activeapi/queryjdcouponlistwithfinance?state=1&wxadd=1&filterswitch=1&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBKB&g_ty=ls`, + headers: { + 'authority': 'wq.jd.com', + "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"), + 'accept': '*/*', + 'referer': 'https://wqs.jd.com/', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', + 'cookie': cookie + } + } + $.get(options, async(err, resp, data) => { + try { + data = JSON.parse(data.match(new RegExp(/jsonpCBK.?\((.*);*/))[1]); + let couponTitle = ''; + let couponId = ''; + // 删除可使用且非超市、生鲜、京贴; + let useable = data.coupon.useable; + $.todayEndTime = new Date(new Date(new Date().getTime()).setHours(23, 59, 59, 999)).getTime(); + $.tomorrowEndTime = new Date(new Date(new Date().getTime() + 24 * 60 * 60 * 1000).setHours(23, 59, 59, 999)).getTime(); + $.platFormInfo=""; + for (let i = 0; i < useable.length; i++) { + //console.log(useable[i]); + if (useable[i].limitStr.indexOf('全品类') > -1) { + $.beginTime = useable[i].beginTime; + if ($.beginTime < new Date().getTime() && useable[i].quota < 20 && useable[i].coupontype === 1) { + //$.couponEndTime = new Date(parseInt(useable[i].endTime)).Format('yyyy-MM-dd'); + $.couponName = useable[i].limitStr; + if (useable[i].platFormInfo) + $.platFormInfo = useable[i].platFormInfo; + + $.message += `【全品类券】满${useable[i].quota}减${useable[i].discount}元`; + + if (useable[i].endTime < $.todayEndTime) { + $.message += `(今日过期,${$.platFormInfo})\n`; + } else if (useable[i].endTime < $.tomorrowEndTime) { + $.message += `(明日将过期,${$.platFormInfo})\n`; + } else { + $.message += `(${$.platFormInfo})\n`; + } + + } + } + /* if (useable[i].couponTitle.indexOf('极速版APP活动') > -1) { + $.couponEndTime = useable[i].endTime; + $.startIndex = useable[i].couponTitle.indexOf('-') - 3; + $.endIndex = useable[i].couponTitle.indexOf('元') + 1; + $.couponName = useable[i].couponTitle.substring($.startIndex, $.endIndex); + + if ($.couponEndTime < $.todayEndTime) { + $.message += `【极速版券】${$.couponName}(今日过期)\n`; + } else if ($.couponEndTime < $.tomorrowEndTime) { + $.message += `【极速版券】${$.couponName}(明日将过期)\n`; + } else { + $.couponEndTime = timeFormat(parseInt($.couponEndTime)); + $.message += `【极速版券】${$.couponName}(有效期至${$.couponEndTime})\n`; + } + + } */ + //8是支付券, 7是白条券 + if (useable[i].couponStyle == 7 || useable[i].couponStyle == 8) { + $.beginTime = useable[i].beginTime; + if ($.beginTime > new Date().getTime() || useable[i].quota > 50 || useable[i].coupontype != 1) { + continue; + } + + if (useable[i].couponStyle == 8) { + $.couponType = "支付立减"; + }else{ + $.couponType = "白条优惠"; + } + if(useable[i].discount { $.get(taskJDZZUrl("interactTaskIndex"), async(err, resp, data) => { diff --git a/jd_unsubscribe.js b/jd_unsubscribe.js deleted file mode 100644 index 8b2f097..0000000 --- a/jd_unsubscribe.js +++ /dev/null @@ -1,380 +0,0 @@ -/* -脚本:取关京东店铺和商品 -更新时间:2021-05-08 -因种豆得豆和宠汪汪以及NobyDa大佬的京东签到脚本会关注店铺和商品,故此脚本用来取消已关注的店铺和商品 -默认:每运行一次脚本全部已关注的店铺与商品 -建议此脚本运行时间在 种豆得豆和宠汪汪脚本运行之后 再执行 -现有功能: 1、取关商品。2、取关店铺。3、匹配到boxjs输入的过滤关键词后,不再进行此商品/店铺后面(包含输入的关键词商品/店铺)的取关 -脚本兼容: Quantumult X, Surge, Loon, JSBox, Node.js, 小火箭 -==============Quantumult X=========== -[task_local] -#取关京东店铺商品 -55 23 * * * jd_unsubscribe.js, tag=取关京东店铺商品, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true -===========Loon============ -[Script] -cron "55 23 * * *" script-path=jd_unsubscribe.js,tag=取关京东店铺商品 -============Surge============= -取关京东店铺商品 = type=cron,cronexp="55 23 * * *",wake-system=1,timeout=3600,script-path=jd_unsubscribe.js -===========小火箭======== -取关京东店铺商品 = type=cron,script-path=jd_unsubscribe.js, cronexpr="55 23 * * *", timeout=3600, enable=true - */ -const $ = new Env('取关京东店铺和商品'); -//Node.js用户请在jdCookie.js处填写京东ck; -const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; -const notify = $.isNode() ? require('./sendNotify') : ''; - -//IOS等用户直接用NobyDa的jd cookie -let cookiesArr = [], cookie = ''; -if ($.isNode()) { - Object.keys(jdCookieNode).forEach((item) => { - cookiesArr.push(jdCookieNode[item]) - }) - if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { - }; -} else { - cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); -} -const jdNotify = $.getdata('jdUnsubscribeNotify');//是否关闭通知,false打开通知推送,true关闭通知推送 -let goodPageSize = $.getdata('jdUnsubscribePageSize') || 20;// 运行一次取消多全部已关注的商品。数字0表示不取关任何商品 -let shopPageSize = $.getdata('jdUnsubscribeShopPageSize') || 20;// 运行一次取消全部已关注的店铺。数字0表示不取关任何店铺 -let stopGoods = $.getdata('jdUnsubscribeStopGoods') || '';//遇到此商品不再进行取关,此处内容需去商品详情页(自营处)长按拷贝商品信息 -let stopShop = $.getdata('jdUnsubscribeStopShop') || '';//遇到此店铺不再进行取关,此处内容请尽量从头开始输入店铺名称 -const JD_API_HOST = 'https://wq.jd.com/fav'; -!(async () => { - if (!cookiesArr[0]) { - $.msg('【京东账号一】取关京东店铺商品失败', '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', {"open-url": "https://bean.m.jd.com/bean/signIndex.action"}); - } - for (let i = 0; i < cookiesArr.length; i++) { - if (cookiesArr[i]) { - cookie = cookiesArr[i]; - $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) - $.index = i + 1; - $.isLogin = true; - $.nickName = ''; - await TotalBean(); - console.log(`\n****开始【京东账号${$.index}】${$.nickName || $.UserName}*****\n`); - if (!$.isLogin) { - $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, {"open-url": "https://bean.m.jd.com/bean/signIndex.action"}); - - if ($.isNode()) { - await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); - } - continue - } - await requireConfig(); - await jdUnsubscribe(); - await showMsg(); - } - } -})() - .catch((e) => { - $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') - }) - .finally(() => { - $.done(); - }) - -async function jdUnsubscribe() { - await Promise.all([ - goodsMain(), - shopMain() - ]) - //再次获取还有多少已关注的店铺与商品 - await Promise.all([ - getFollowGoods(), - getFollowShops() - ]) -} - -function showMsg() { - if (!jdNotify || jdNotify === 'false') { - $.msg($.name, ``, `【京东账号${$.index}】${$.nickName}\n【已取消关注店铺】${$.unsubscribeShopsCount}个\n【已取消关注商品】${$.unsubscribeGoodsCount}个\n【还剩关注店铺】${$.shopsTotalNum}个\n【还剩关注商品】${$.goodsTotalNum}个\n`); - } else { - $.log(`\n【京东账号${$.index}】${$.nickName}\n【已取消关注店铺】${$.unsubscribeShopsCount}个\n【已取消关注商品】${$.unsubscribeGoodsCount}个\n【还剩关注店铺】${$.shopsTotalNum}个\n【还剩关注商品】${$.goodsTotalNum}个\n`); - } -} - -async function goodsMain() { - $.unsubscribeGoodsCount = 0; - if ((goodPageSize * 1) !== 0) { - await unsubscribeGoods(); - const le = Math.ceil($.goodsTotalNum / 20) - 1 >= 0 ? Math.ceil($.goodsTotalNum / 20) - 1 : 0; - for (let i = 0; i < new Array(le).length; i++) { - await $.wait(100); - await unsubscribeGoods(); - } - } else { - console.log(`\n您设置的是不取关商品\n`); - } -} - -async function unsubscribeGoods() { - let followGoods = await getFollowGoods(); - if (followGoods.iRet === '0') { - if (followGoods.totalNum > 0) { - for (let item of followGoods['data']) { - console.log(`是否匹配::${item.commTitle.indexOf(stopGoods.replace(/\ufffc|\s*/g, ''))}`) - if (stopGoods && item.commTitle.indexOf(stopGoods.replace(/\ufffc|\s*/g, '')) > -1) { - console.log(`匹配到了您设定的商品--${stopGoods},不在进行取消关注商品`) - break; - } - let res = await unsubscribeGoodsFun(item.commId); - if (res.iRet === 0 && res.errMsg === 'success') { - console.log(`取消关注商品---${item.commTitle.substring(0, 20).concat('...')}---成功`) - $.unsubscribeGoodsCount++; - console.log(`已成功取消关注【商品】:${$.unsubscribeGoodsCount}个\n`) - } else { - console.log(`取关商品失败:${JSON.stringify(res)}`) - console.log(`取消关注商品---${item.commTitle.substring(0, 20).concat('...')}---失败\n`) - } - await $.wait(1000); - } - } - } else { - console.log(`获取已关注商品失败:${JSON.stringify(followGoods)}`); - } -} - -function getFollowGoods() { - $.goodsTotalNum = 0; - return new Promise((resolve) => { - const option = { - url: `${JD_API_HOST}/comm/FavCommQueryFilter?cp=1&pageSize=20&_=${Date.now()}&category=0&promote=0&cutPrice=0&coupon=0&stock=0&areaNo=1_72_4139_0&sceneval=2&g_login_type=1&callback=jsonpCBKB&g_ty=ls`, - headers: { - "Host": "wq.jd.com", - "Accept": "*/*", - "Connection": "keep-alive", - "Cookie": cookie, - "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"), - "Accept-Language": "zh-cn", - "Referer": "https://wqs.jd.com/my/fav/goods_fav.shtml?ptag=37146.4.1&sceneval=2&jxsid=15963530166144677970", - "Accept-Encoding": "gzip, deflate, br" - }, - } - $.get(option, async (err, resp, data) => { - try { - data = JSON.parse(data.slice(14, -13)); - if (data.iRet === '0') { - $.goodsTotalNum = data.totalNum; - console.log(`当前已关注【商品】:${$.goodsTotalNum}个\n`) - } else { - $.goodsTotalNum = 0; - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -function unsubscribeGoodsFun(commId) { - return new Promise(resolve => { - const option = { - url: `${JD_API_HOST}/comm/FavCommDel?commId=${commId}&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBKP&g_ty=ls`, - headers: { - "Host": "wq.jd.com", - "Accept": "*/*", - "Connection": "keep-alive", - '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"), - 'Referer': 'https://wqs.jd.com/my/fav/goods_fav.shtml?ptag=37146.4.1&sceneval=2&jxsid=15963530166144677970', - 'Cookie': cookie, - "Accept-Language": "zh-cn", - "Accept-Encoding": "gzip, deflate, br" - }, - } - $.get(option, (err, resp, data) => { - try { - data = JSON.parse(data.slice(14, -13).replace(',}', '}')); - // console.log('data', data); - // console.log('data', data.errMsg); - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -async function shopMain() { - $.unsubscribeShopsCount = 0; - if ((shopPageSize * 1) !== 0) { - await unsubscribeShops(); - const le = Math.ceil($.shopsTotalNum / 20) - 1 >= 0 ? Math.ceil($.shopsTotalNum / 20) - 1 : 0; - for (let i = 0; i < new Array(le).length; i++) { - await $.wait(100); - await unsubscribeShops(); - } - } else { - console.log(`\n您设置的是不取关店铺\n`); - } -} - -async function unsubscribeShops() { - let followShops = await getFollowShops(); - if (followShops.iRet === '0') { - if (followShops.totalNum > 0) { - for (let item of followShops.data) { - if (stopShop && (item.shopName && item.shopName.indexOf(stopShop.replace(/\s*/g, '')) > -1)) { - console.log(`匹配到了您设定的店铺--${item.shopName},不在进行取消关注店铺`) - break; - } - let res = await unsubscribeShopsFun(item.shopId); - if (res.iRet === '0') { - console.log(`取消已关注店铺---${item.shopName}----成功`) - $.unsubscribeShopsCount++; - console.log(`已成功取消关注【店铺】:${$.unsubscribeShopsCount}个\n`) - } else { - console.log(`取消已关注店铺---${item.shopName}----失败\n`) - } - await $.wait(1000); - } - } - } else { - console.log(`获取已关注店铺失败:${JSON.stringify(followShops)}`); - } -} - -function getFollowShops() { - $.shopsTotalNum = 0; - return new Promise((resolve) => { - const option = { - url: `${JD_API_HOST}/shop/QueryShopFavList?cp=1&pageSize=20&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBKA&g_ty=ls`, - headers: { - "Host": "wq.jd.com", - "Accept": "*/*", - "Connection": "keep-alive", - "Cookie": cookie, - "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"), - "Accept-Language": "zh-cn", - "Referer": "https://wqs.jd.com/my/fav/shop_fav.shtml?sceneval=2&jxsid=15963530166144677970&ptag=7155.1.9", - "Accept-Encoding": "gzip, deflate, br" - }, - } - $.get(option, (err, resp, data) => { - try { - data = JSON.parse(data.slice(14, -13)); - if (data.iRet === '0') { - $.shopsTotalNum = data.totalNum; - console.log(`当前已关注【店铺】:${$.shopsTotalNum}个\n`) - } else { - $.shopsTotalNum = 0; - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -function unsubscribeShopsFun(shopId) { - return new Promise(resolve => { - const option = { - url: `${JD_API_HOST}/shop/DelShopFav?shopId=${shopId}&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBKG&g_ty=ls`, - headers: { - "Host": "wq.jd.com", - "Accept": "*/*", - "Connection": "keep-alive", - '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"), - 'Referer': 'https://wqs.jd.com/my/fav/shop_fav.shtml?sceneval=2&jxsid=15960121319555534107&ptag=7155.1.9', - 'Cookie': cookie, - "Accept-Language": "zh-cn", - "Accept-Encoding": "gzip, deflate, br" - }, - } - $.get(option, (err, resp, data) => { - try { - data = JSON.parse(data.slice(14, -13)); - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -function TotalBean() { - 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": $.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") - } - } - $.post(options, (err, resp, data) => { - try { - if (err) { - console.log(`${JSON.stringify(err)}`) - console.log(`${$.name} API请求失败,请检查网路重试`) - } 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) || $.UserName; - } else { - $.nickName = $.UserName - } - } else { - console.log(`京东服务器返回空数据`) - } - } - } catch (e) { - $.logErr(e, resp) - } finally { - resolve(); - } - }) - }) -} - -function requireConfig() { - return new Promise(resolve => { - if ($.isNode() && process.env.UN_SUBSCRIBES) { - if (process.env.UN_SUBSCRIBES.indexOf('&') > -1) { - $.UN_SUBSCRIBES = process.env.UN_SUBSCRIBES.split('&'); - } else if (process.env.UN_SUBSCRIBES.indexOf('\n') > -1) { - $.UN_SUBSCRIBES = process.env.UN_SUBSCRIBES.split('\n'); - } else if (process.env.UN_SUBSCRIBES.indexOf('\\n') > -1) { - $.UN_SUBSCRIBES = process.env.UN_SUBSCRIBES.split('\\n'); - } else { - $.UN_SUBSCRIBES = process.env.UN_SUBSCRIBES.split(); - } - console.log(`您环境变量 UN_SUBSCRIBES 设置的内容为:\n${JSON.stringify($.UN_SUBSCRIBES)}`) - goodPageSize = $.UN_SUBSCRIBES[0] || goodPageSize; - shopPageSize = $.UN_SUBSCRIBES[1] || shopPageSize; - stopGoods = $.UN_SUBSCRIBES[2] || stopGoods; - stopShop = $.UN_SUBSCRIBES[3] || stopShop; - } - resolve() - }) -} - -function jsonParse(str) { - if (typeof str == "string") { - try { - return JSON.parse(str); - } catch (e) { - console.log(e); - $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') - return []; - } - } -} -// prettier-ignore -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)} \ No newline at end of file diff --git a/jd_unsubscribe_xh.js b/jd_unsubscribe_xh.js new file mode 100644 index 0000000..ceab670 --- /dev/null +++ b/jd_unsubscribe_xh.js @@ -0,0 +1,799 @@ +/* + * @Author: X1a0He + * @LastEditors: X1a0He + * @Description: 批量取关京东店铺和商品 + * @Fixed: 不再支持Qx,仅支持Node.js + */ +const $ = new Env('批量取关店铺和商品'); +//Node.js用户请在jdCookie.js处填写京东ck; +const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; +const notify = $.isNode() ? require('./sendNotify') : ''; +//IOS等用户直接用NobyDa的jd cookie +let cookiesArr = [], cookie = ''; +if($.isNode()){ + Object.keys(jdCookieNode).forEach((item) => { + cookiesArr.push(jdCookieNode[item]) + }) + if(process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; +} else { + cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); +} +let args_xh = { + /* + * 跳过某个指定账号,默认为全部账号清空 + * 填写规则:例如当前Cookie1为pt_key=key; pt_pin=pin1;则环境变量填写pin1即可,此时pin1的购物车将不会被清空 + * 若有更多,则按照pin1@pin2@pin3进行填写 + * 环境变量名称:XH_UNSUB_EXCEPT + */ + except: process.env.XH_UNSUB_EXCEPT && process.env.XH_UNSUB_EXCEPT.split('@') || [], + /* + * 是否执行取消关注,默认true + * 可通过环境变量控制:JD_UNSUB + * */ + isRun: process.env.JD_UNSUB === 'true' || true, + /* + * 执行完毕是否进行通知,默认false + * 可用环境变量控制:JD_UNSUB_NOTIFY + * */ + isNotify: process.env.JD_UNSUB_NOTIFY === 'true' || false, + /* + * 每次获取已关注的商品数 + * 可设置环境变量:JD_UNSUB_GPAGESIZE,默认为20,不建议超过20 + * */ + goodPageSize: process.env.JD_UNSUB_GPAGESIZE * 1 || 20, + /* + * 每次获取已关注的店铺数 + * 可设置环境变量:JD_UNSUB_SPAGESIZE,默认为20,不建议超过20 + * */ + shopPageSize: process.env.JD_UNSUB_SPAGESIZE * 1 || 20, + /* + * 商品类过滤关键词,只要商品名内包含关键词,则不会被取消关注 + * 可设置环境变量:JD_UNSUB_GKEYWORDS,用@分隔 + * */ + goodsKeyWords: process.env.JD_UNSUB_GKEYWORDS && process.env.JD_UNSUB_GKEYWORDS.split('@') || [], + /* + * 店铺类过滤关键词,只要店铺名内包含关键词,则不会被取消关注 + * 可设置环境变量:JD_UNSUB_SKEYWORDS,用@分隔 + * */ + shopKeyWords: process.env.JD_UNSUB_SKEYWORDS && process.env.JD_UNSUB_SKEYWORDS.split('@') || [], + /* + * 间隔,防止提示操作频繁,单位毫秒(1秒 = 1000毫秒) + * 可用环境变量控制:JD_UNSUB_INTERVAL,默认为3000毫秒 + * */ + unSubscribeInterval: process.env.JD_UNSUB_INTERVAL * 1 || 1000, + /* + * 是否打印日志 + * 可用环境变量控制:JD_UNSUB_PLOG,默认为true + * */ + printLog: process.env.JD_UNSUB_PLOG === 'true' || true, + /* + * 失败次数,当取关商品或店铺时,如果连续 x 次失败,则结束本次取关,防止死循环 + * 可用环境变量控制:JD_UNSUB_FAILTIMES,默认为3次 + * */ + failTimes: process.env.JD_UNSUB_FAILTIMES || 3 +} +!(async() => { + console.log('X1a0He留:运行前请看好脚本内的注释,日志已经很清楚了,有问题带着日志来问') + if(args_xh.isRun){ + if(!cookiesArr[0]){ + $.msg('【京东账号一】取关京东店铺商品失败', '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', { + "open-url": "https://bean.m.jd.com/bean/signIndex.action" + }); + } + await requireConfig(); + for(let i = 0; i < cookiesArr.length; i++){ + if(cookiesArr[i]){ + cookie = cookiesArr[i]; + $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) + $.index = i + 1; + $.isLogin = true; + $.nickName = ''; + await TotalBean(); + console.log(`\n****开始【京东账号${$.index}】${$.nickName || $.UserName}*****\n`); + if(args_xh.except.includes($.UserName)){ + console.log(`跳过账号:${$.nickName || $.UserName}`) + continue + } + if(!$.isLogin){ + $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { + "open-url": "https://bean.m.jd.com/bean/signIndex.action" + }); + if($.isNode()){ + await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); + } + continue + } + $.shopsKeyWordsNum = 0; + $.goodsKeyWordsNum = 0; + $.unsubscribeGoodsNum = 0; + $.unsubscribeShopsNum = 0; + $.goodsTotalNum = 0 //记录当前总共关注了多少商品 + $.shopsTotalNum = 0; //记录当前总共关注了多少店铺 + $.commIdList = ``; + $.shopIdList = ``; + $.endGoods = $.endShops = false; + $.failTimes = 0; + // console.log(`=====京东账号${$.index} ${$.nickName || $.UserName}内部变量=====`) + // console.log(`$.unsubscribeGoodsNum: ${$.unsubscribeGoodsNum}`) + // console.log(`$.unsubscribeShopsNum: ${$.unsubscribeShopsNum}`) + // console.log(`$.goodsTotalNum: ${$.goodsTotalNum}`) + // console.log(`$.shopsTotalNum: ${$.shopsTotalNum}`) + // console.log(`$.commIdList: ${$.commIdList}`) + // console.log(`$.shopIdList: ${$.shopIdList}`) + // console.log(`$.failTimes: ${$.failTimes}`) + // console.log(`================`) + await favCommQueryFilter(); //获取商品并过滤 + await $.wait(args_xh.unSubscribeInterval) + if(!$.endGoods && parseInt($.goodsTotalNum) !== parseInt($.goodsKeyWordsNum)) await favCommBatchDel();//取关商品 + else console.log("不执行取消收藏商品\n") + await $.wait(args_xh.unSubscribeInterval) + await queryShopFavList(); //获取店铺并过滤 + await $.wait(args_xh.unSubscribeInterval) + if(!$.endShops && parseInt($.shopsTotalNum) !== parseInt($.shopsKeyWordsNum)) await batchunfollow(); //取关店铺 + else console.log("不执行取消收藏店铺\n") + do { + //如果商品总数和店铺总数都为0则已清空,跳出循环 + if(parseInt($.goodsTotalNum) === 0 && parseInt($.shopsTotalNum) === 0) break; + else { + //如果商品总数或店铺总数有一个不为0的话,先判断是哪个不为0 + if(parseInt($.goodsTotalNum) !== 0){ + if(parseInt($.goodsTotalNum) === parseInt($.goodsKeyWordsNum)) break; + else { + $.commIdList = `` + await favCommQueryFilter(); //获取商品并过滤 + await $.wait(args_xh.unSubscribeInterval) + if(!$.endGoods && parseInt($.goodsTotalNum) !== parseInt($.goodsKeyWordsNum)) await favCommBatchDel(); //取关商品 + else console.log("不执行取消收藏商品\n") + } + } else if(parseInt($.shopsTotalNum) !== 0){ + if(parseInt($.shopsTotalNum) === parseInt($.shopsKeyWordsNum)) break; + else { + $.shopIdList = `` + await queryShopFavList(); //获取店铺并过滤 + await $.wait(args_xh.unSubscribeInterval) + if(!$.endShops && parseInt($.shopsTotalNum) !== parseInt($.shopsKeyWordsNum)) await batchunfollow(); //取关店铺 + else console.log("不执行取消收藏店铺\n") + } + } + } + if($.failTimes >= args_xh.failTimes){ + console.log('失败次数到达设定值,触发防死循环机制,该帐号已跳过'); + break; + } + } while(true) + await showMsg_xh(); + } + } + } +})().catch((e) => { + $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') +}).finally(() => { + $.done(); +}) + +function requireConfig(){ + return new Promise(resolve => { + if($.isNode() && process.env.JD_UNSUB){ + console.log('=====环境变量配置如下=====') + console.log(`except: ${typeof args_xh.except}, ${args_xh.except}`) + console.log(`isNotify: ${typeof args_xh.isNotify}, ${args_xh.isNotify}`) + console.log(`goodPageSize: ${typeof args_xh.goodPageSize}, ${args_xh.goodPageSize}`) + console.log(`shopPageSize: ${typeof args_xh.shopPageSize}, ${args_xh.shopPageSize}`) + console.log(`goodsKeyWords: ${typeof args_xh.goodsKeyWords}, ${args_xh.goodsKeyWords}`) + console.log(`shopKeyWords: ${typeof args_xh.shopKeyWords}, ${args_xh.shopKeyWords}`) + console.log(`unSubscribeInterval: ${typeof args_xh.unSubscribeInterval}, ${args_xh.unSubscribeInterval}`) + console.log(`printLog: ${typeof args_xh.printLog}, ${args_xh.printLog}`) + console.log(`failTimes: ${typeof args_xh.failTimes}, ${args_xh.failTimes}`) + console.log('=======================') + } + resolve() + }) +} + +function showMsg_xh(){ + if(args_xh.isNotify){ + $.msg($.name, ``, `【京东账号${$.index}】${$.nickName}\n【还剩关注店铺】${$.shopsTotalNum}个\n【还剩关注商品】${$.goodsTotalNum}个`); + } else { + $.log(`【京东账号${$.index}】${$.nickName}\n【还剩关注店铺】${$.shopsTotalNum}个\n【还剩关注商品】${$.goodsTotalNum}个`); + } +} + +function getSubstr(str, leftStr, rightStr){ + let left = str.indexOf(leftStr); + let right = str.indexOf(rightStr, left); + if(left < 0 || right < left) return ''; + return str.substring(left + leftStr.length, right); +} + +function favCommQueryFilter(){ + return new Promise((resolve) => { + console.log('正在获取已关注的商品...') + const option = { + url: `https://wq.jd.com/fav/comm/FavCommQueryFilter?cp=1&pageSize=${args_xh.goodPageSize}&category=0&promote=0&cutPrice=0&coupon=0&stock=0&sceneval=2`, + headers: { + "Cookie": cookie, + "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"), + "Referer": "https://wqs.jd.com/" + }, + } + $.get(option, async(err, resp, data) => { + try{ + if(data.indexOf("Authorization") !== -1){ + console.log("获取数据失败,401 Authorization Required,可能是User-Agent的问题") + return; + } + data = JSON.parse(getSubstr(data, "try{(", ");}catch(e){}")); + if(data.iRet === '0'){ + $.goodsTotalNum = parseInt(data.totalNum); + console.log(`当前已关注商品:${$.goodsTotalNum}个`) + $.goodsKeyWordsNum = 0; + for(let item of data.data){ + if(args_xh.goodsKeyWords.some(keyword => item.commTitle.includes(keyword))){ + args_xh.printLog ? console.log(`${item.commTitle} `) : '' + args_xh.printLog ? console.log('商品被过滤,含有关键词\n') : '' + $.goodsKeyWordsNum += 1; + } else { + $.commIdList += item.commId + ","; + $.unsubscribeGoodsNum++; + } + } + } else { + $.endGoods = true; + console.log("无商品可取消收藏\n"); + } + } catch(e){ + $.logErr(e, resp); + } finally{ + resolve(data); + } + }); + }) +} + +function favCommBatchDel(){ + return new Promise(resolve => { + console.log("正在取消收藏商品...") + const option = { + url: `https://wq.jd.com/fav/comm/FavCommBatchDel?commId=${$.commIdList}&sceneval=2&g_login_type=1`, + headers: { + "Cookie": cookie, + "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"), + "Referer": "https://wqs.jd.com/" + }, + } + $.get(option, (err, resp, data) => { + try{ + if(data.indexOf("Authorization") !== -1){ + console.log("获取数据失败,401 Authorization Required,可能是User-Agent的问题") + return; + } + data = JSON.parse(data); + if(data.iRet === "0" && data.errMsg === "success"){ + console.log(`成功取消收藏商品:${$.unsubscribeGoodsNum}个\n`) + $.failTimes = 0; + } else { + console.log(`批量取消收藏商品失败,失败次数:${++$.failTimes}\n`, data) + } + } catch(e){ + $.logErr(e, resp); + } finally{ + resolve(data); + } + }); + }) +} + +function queryShopFavList(){ + return new Promise((resolve) => { + console.log("正在获取已关注的店铺...") + const option = { + url: `https://wq.jd.com/fav/shop/QueryShopFavList?cp=1&pageSize=${args_xh.shopPageSize}&sceneval=2&g_login_type=1&callback=jsonpCBKA`, + headers: { + "Cookie": cookie, + "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"), + "Referer": "https://wqs.jd.com/" + }, + } + $.get(option, (err, resp, data) => { + try{ + if(data.indexOf("Authorization") !== -1){ + console.log("获取数据失败,401 Authorization Required,可能是User-Agent的问题") + return; + } + data = JSON.parse(getSubstr(data, "try{jsonpCBKA(", ");}catch(e){}")); + if(data.iRet === '0'){ + $.shopsTotalNum = parseInt(data.totalNum); + console.log(`当前已关注店铺:${$.shopsTotalNum}个`) + if(data.data.length > 0){ + $.shopsKeyWordsNum = 0; + for(let item of data.data){ + if(args_xh.shopKeyWords.some(keyword => item.shopName.includes(keyword))){ + args_xh.printLog ? console.log('店铺被过滤,含有关键词') : '' + args_xh.printLog ? console.log(`${item.shopName}\n`) : '' + $.shopsKeyWordsNum += 1; + } else { + $.shopIdList += item.shopId + ","; + $.unsubscribeShopsNum++; + } + } + } else { + $.endShops = true; + console.log("无店铺可取消关注\n"); + } + } else console.log(`获取已关注店铺失败:${JSON.stringify(data)}`) + } catch(e){ + $.logErr(e, resp); + } finally{ + resolve(data); + } + }); + }) +} + +function batchunfollow(){ + return new Promise(resolve => { + console.log('正在执行批量取消关注店铺...') + const option = { + url: `https://wq.jd.com/fav/shop/batchunfollow?shopId=${$.shopIdList}&sceneval=2&g_login_type=1`, + headers: { + "Cookie": cookie, + "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"), + "Referer": "https://wqs.jd.com/" + }, + } + $.get(option, (err, resp, data) => { + try{ + if(data.indexOf("Authorization") !== -1){ + console.log("获取数据失败,401 Authorization Required,可能是User-Agent的问题") + return; + } + data = JSON.parse(data); + if(data.iRet === "0"){ + console.log(`已成功取消关注店铺:${$.unsubscribeShopsNum}个\n`) + $.failTimes = 0; + } else { + console.log(`批量取消关注店铺失败,失败次数:${++$.failTimes}\n`) + } + } catch(e){ + $.logErr(e, resp); + } finally{ + resolve(data); + } + }); + }) +} + +function TotalBean(){ + 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": $.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") + } + } + $.post(options, (err, resp, data) => { + try{ + if(err){ + console.log(`${JSON.stringify(err)}`) + console.log(`${$.name} API请求失败,请检查网路重试`) + } 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) || $.UserName; + } else { + $.nickName = $.UserName + } + } else { + console.log(`京东服务器返回空数据`) + } + } + } catch(e){ + $.logErr(e, resp) + } finally{ + resolve(); + } + }) + }) +} + +function jsonParse(str){ + if(typeof str == "string"){ + try{ + return JSON.parse(str); + } catch(e){ + console.log(e); + $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') + return []; + } + } +} + +// prettier-ignore +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) +} diff --git a/sendNotify.js b/sendNotify.js index 5685de3..d7549a0 100644 --- a/sendNotify.js +++ b/sendNotify.js @@ -14,7 +14,7 @@ const querystring = require('querystring'); const exec = require('child_process').exec; const $ = new Env(); const timeout = 15000; //超时时间(单位毫秒) - +console.log("加载sendNotify,当前版本: 20220217"); // =======================================go-cqhttp通知设置区域=========================================== //gobot_url 填写请求地址http://127.0.0.1/send_private_msg //gobot_token 填写在go-cqhttp文件设置的访问密钥 @@ -136,18 +136,18 @@ let strCKFile = '/ql/scripts/CKName_cache.json'; let Fileexists = fs.existsSync(strCKFile); let TempCK = []; if (Fileexists) { - console.log("加载sendNotify,检测到别名缓存文件,载入..."); + console.log("检测到别名缓存文件CKName_cache.json,载入..."); TempCK = fs.readFileSync(strCKFile, 'utf-8'); if (TempCK) { TempCK = TempCK.toString(); TempCK = JSON.parse(TempCK); } } -let strUidFile = './CK_WxPusherUid.json'; +let strUidFile = '/ql/scripts/CK_WxPusherUid.json'; let UidFileexists = fs.existsSync(strUidFile); let TempCKUid = []; if (UidFileexists) { - console.log("检测到WxPusherUid文件,载入..."); + console.log("检测到一对一Uid文件WxPusherUid.json,载入..."); TempCKUid = fs.readFileSync(strUidFile, 'utf-8'); if (TempCKUid) { TempCKUid = TempCKUid.toString(); @@ -165,9 +165,32 @@ let Notify_SkipText = []; let isLogin = false; if (process.env.NOTIFY_SHOWNAMETYPE) { ShowRemarkType = process.env.NOTIFY_SHOWNAMETYPE; + if (ShowRemarkType == "2") + console.log("检测到显示备注名称,格式为: 京东别名(备注)"); + if (ShowRemarkType == "3") + console.log("检测到显示备注名称,格式为: 京东账号(备注)"); + if (ShowRemarkType == "4") + console.log("检测到显示备注名称,格式为: 备注"); } -async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By ccwav Mod',strsummary="") { - console.log(`开始发送通知...`); +async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By ccwav Mod', strsummary = "") { + console.log(`开始发送通知...`); + + //NOTIFY_FILTERBYFILE代码来自Ca11back. + 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 变量 @@ -258,7 +281,14 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc isLogin = true; await isLoginByX1a0He(temptest.value); if (!isLogin) { - const DisableCkBody = await DisableCk(temptest._id); + 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 = ""; @@ -310,12 +340,12 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc text = "京东CK检测"; } if (process.env.CHECKCK_ALLNOTIFY) { - var strTempNotify = process.env.CHECKCK_ALLNOTIFY ? process.env.CHECKCK_ALLNOTIFY.split('&') : []; - if (strTempNotify.length > 0) { - for (var TempNotifyl in strTempNotify) { - strAllNotify += strTempNotify[TempNotifyl] + '\n'; - } + 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); @@ -364,6 +394,7 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc } if (strtext.indexOf("cookie已失效") != -1 || strdesp.indexOf("重新登录获取") != -1 || strtext == "Ninja 运行通知") { if (Notify_NoCKFalse == "true" && text != "Ninja 运行通知") { + console.log(`检测到NOTIFY_NOCKFALSE变量为true,不发送ck失效通知...`); return; } } @@ -439,7 +470,9 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc const titleIndexGp5 = notifyGroup5List.findIndex((item) => item === strTitle); const notifyGroup6List = process.env.NOTIFY_GROUP6_LIST ? process.env.NOTIFY_GROUP6_LIST.split('&') : []; const titleIndexGp6 = notifyGroup6List.findIndex((item) => item === strTitle); - + const notifyGroup7List = process.env.NOTIFY_GROUP7_LIST ? process.env.NOTIFY_GROUP7_LIST.split('&') : []; + const titleIndexGp7 = notifyGroup7List.findIndex((item) => item === strTitle); + if (titleIndex2 !== -1) { console.log(`${strTitle} 在群组2推送名单中,初始化群组推送`); UseGroupNotify = 2; @@ -459,6 +492,10 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc if (titleIndexGp6 !== -1) { console.log(`${strTitle} 在群组6推送名单中,初始化群组推送`); UseGroupNotify = 6; + } + if (titleIndexGp7 !== -1) { + console.log(`${strTitle} 在群组7推送名单中,初始化群组推送`); + UseGroupNotify = 7; } if (process.env.NOTIFY_CUSTOMNOTIFY) { strCustom = process.env.NOTIFY_CUSTOMNOTIFY; @@ -495,7 +532,10 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc console.log("自定义设定强制使用组6配置通知..."); UseGroupNotify = 6; } - + if (strCustomTempArr[1] == "组7") { + console.log("自定义设定强制使用组6配置通知..."); + UseGroupNotify = 7; + } if (strCustomTempArr.length > 2) { console.log("关闭所有通知变量..."); Use_serverNotify = false; @@ -1200,6 +1240,110 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc if (process.env.GOTIFY_PRIORITY6) { GOTIFY_PRIORITY = process.env.GOTIFY_PRIORITY6; } + break; + + case 7: + //==========================第七套环境变量赋值========================= + + if (process.env.GOBOT_URL7 && Use_gobotNotify) { + GOBOT_URL = process.env.GOBOT_URL7; + } + if (process.env.GOBOT_TOKEN7 && Use_gobotNotify) { + GOBOT_TOKEN = process.env.GOBOT_TOKEN7; + } + if (process.env.GOBOT_QQ7 && Use_gobotNotify) { + GOBOT_QQ = process.env.GOBOT_QQ7; + } + + if (process.env.PUSH_KEY7 && Use_serverNotify) { + SCKEY = process.env.PUSH_KEY7; + } + + if (process.env.WP_APP_TOKEN7 && Use_WxPusher) { + WP_APP_TOKEN = process.env.WP_APP_TOKEN7; + } + + if (process.env.WP_TOPICIDS7 && Use_WxPusher) { + WP_TOPICIDS = process.env.WP_TOPICIDS7; + } + + if (process.env.WP_UIDS7 && Use_WxPusher) { + WP_UIDS = process.env.WP_UIDS7; + } + + if (process.env.WP_URL7 && Use_WxPusher) { + WP_URL = process.env.WP_URL7; + } + if (process.env.BARK_PUSH7 && Use_BarkNotify) { + if (process.env.BARK_PUSH7.indexOf('https') > -1 || process.env.BARK_PUSH7.indexOf('http') > -1) { + //兼容BARK自建用户 + BARK_PUSH = process.env.BARK_PUSH7; + } else { + BARK_PUSH = `https://api.day.app/${process.env.BARK_PUSH7}`; + } + if (process.env.BARK_SOUND7) { + BARK_SOUND = process.env.BARK_SOUND7; + } + if (process.env.BARK_GROUP7) { + BARK_GROUP = process.env.BARK_GROUP7; + } + } + if (process.env.TG_BOT_TOKEN7 && Use_tgBotNotify) { + TG_BOT_TOKEN = process.env.TG_BOT_TOKEN7; + } + if (process.env.TG_USER_ID7 && Use_tgBotNotify) { + TG_USER_ID = process.env.TG_USER_ID7; + } + if (process.env.TG_PROXY_AUTH7 && Use_tgBotNotify) + TG_PROXY_AUTH = process.env.TG_PROXY_AUTH7; + if (process.env.TG_PROXY_HOST7 && Use_tgBotNotify) + TG_PROXY_HOST = process.env.TG_PROXY_HOST7; + if (process.env.TG_PROXY_PORT7 && Use_tgBotNotify) + TG_PROXY_PORT = process.env.TG_PROXY_PORT7; + if (process.env.TG_API_HOST7 && Use_tgBotNotify) + TG_API_HOST = process.env.TG_API_HOST7; + + if (process.env.DD_BOT_TOKEN7 && Use_ddBotNotify) { + DD_BOT_TOKEN = process.env.DD_BOT_TOKEN7; + if (process.env.DD_BOT_SECRET7) { + DD_BOT_SECRET = process.env.DD_BOT_SECRET7; + } + } + + if (process.env.QYWX_KEY7 && Use_qywxBotNotify) { + QYWX_KEY = process.env.QYWX_KEY7; + } + + if (process.env.QYWX_AM7 && Use_qywxamNotify) { + QYWX_AM = process.env.QYWX_AM7; + } + + if (process.env.IGOT_PUSH_KEY7 && Use_iGotNotify) { + IGOT_PUSH_KEY = process.env.IGOT_PUSH_KEY7; + } + + if (process.env.PUSH_PLUS_TOKEN7 && Use_pushPlusNotify) { + PUSH_PLUS_TOKEN = process.env.PUSH_PLUS_TOKEN7; + } + if (process.env.PUSH_PLUS_USER7 && Use_pushPlusNotify) { + PUSH_PLUS_USER = process.env.PUSH_PLUS_USER7; + } + + if (process.env.PUSH_PLUS_TOKEN_hxtrip7 && Use_pushPlushxtripNotify) { + PUSH_PLUS_TOKEN_hxtrip = process.env.PUSH_PLUS_TOKEN_hxtrip7; + } + if (process.env.PUSH_PLUS_USER_hxtrip7 && Use_pushPlushxtripNotify) { + PUSH_PLUS_USER_hxtrip = process.env.PUSH_PLUS_USER_hxtrip7; + } + if (process.env.GOTIFY_URL7) { + GOTIFY_URL = process.env.GOTIFY_URL7; + } + if (process.env.GOTIFY_TOKEN7) { + GOTIFY_TOKEN = process.env.GOTIFY_TOKEN7; + } + if (process.env.GOTIFY_PRIORITY7) { + GOTIFY_PRIORITY = process.env.GOTIFY_PRIORITY7; + } break; } @@ -1230,6 +1374,17 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc //开始读取青龙变量列表 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]); @@ -1285,17 +1440,16 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc 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 = getQLinfo(cookie, envs[i].created, envs[i].timestamp, envs[i].remarks); if (Tempinfo) { $.Remark += Tempinfo; } } - desp = desp.replace(new RegExp(`${$.UserName}|${$.nickName}`, 'gm'), $.Remark); + 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)) { @@ -1303,6 +1457,7 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc //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) { @@ -1320,6 +1475,9 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc } console.log("处理完成,开始发送通知..."); + if (strAllNotify) { + desp = strAllNotify + "\n" + desp; + } } } catch (error) { console.error(error); @@ -1383,7 +1541,7 @@ async function sendNotify(text, desp, params = {}, author = '\n\n本通知 By cc tgBotNotify(text, desp), //telegram 机器人 ddBotNotify(text, desp), //钉钉机器人 qywxBotNotify(text, desp), //企业微信机器人 - qywxamNotify(text, desp,strsummary), //企业微信应用消息推送 + qywxamNotify(text, desp, strsummary), //企业微信应用消息推送 iGotNotify(text, desp, params), //iGot gobotNotify(text, desp), //go-cqhttp gotifyNotify(text, desp), //gotify @@ -1396,7 +1554,7 @@ function getuuid(strRemark, PtPin) { if (strRemark) { var Tempindex = strRemark.indexOf("@@"); if (Tempindex != -1) { - console.log(PtPin+": 检测到NVJDC的一对一格式,瑞思拜~!"); + console.log(PtPin + ": 检测到NVJDC的一对一格式,瑞思拜~!"); var TempRemarkList = strRemark.split("@@"); for (let j = 1; j < TempRemarkList.length; j++) { if (TempRemarkList[j]) { @@ -1427,7 +1585,7 @@ function getuuid(strRemark, PtPin) { 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 strPtPin = decodeURIComponent(strCK.match(/pt_pin=([^; ]+)(?=;?)/) && strCK.match(/pt_pin=([^; ]+)(?=;?)/)[1]); var strReturn = ""; if (strCheckCK.substring(0, 4) == "AAJh") { var DateCreated = new Date(intcreated); @@ -1436,30 +1594,30 @@ function getQLinfo(strCK, intcreated, strTimestamp, strRemark) { if (strRemark) { var Tempindex = strRemark.indexOf("@@"); if (Tempindex != -1) { - console.log(strPtPin+": 检测到NVJDC的备注格式,尝试获取登录时间,瑞思拜~!"); + //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)); + //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); if (LogoutDay < 1) { - strReturn = "\n【登录信息】已服务" + UseDay + "天(登录状态即将到期,请重新登录)" + strReturn = "\n【登录信息】总挂机" + UseDay + "天(账号即将到期,请重登续期)" } else { - strReturn = "\n【登录信息】已服务" + UseDay + "天(有效期约剩" + LogoutDay + "天)" + strReturn = "\n【登录信息】总挂机" + UseDay + "天(有效期约剩" + LogoutDay + "天)" } } - return strReturn } @@ -1485,6 +1643,17 @@ async function sendNotifybyWxPucher(text, desp, PtPin, author = '\n\n本通知 B 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) { @@ -1552,6 +1721,9 @@ async function sendNotifybyWxPucher(text, desp, PtPin, author = '\n\n本通知 B } console.log("处理完成,开始发送通知..."); desp = buildLastDesp(desp, author); + if (strAllNotify) { + desp = strAllNotify + "\n" + desp; + } await wxpusherNotifyByOne(text, desp, strsummary); } else { console.log("未查询到用户的Uid,取消一对一通知发送..."); @@ -1676,15 +1848,18 @@ function gotifyNotify(text, desp) { function gobotNotify(text, desp, time = 2100) { return new Promise((resolve) => { if (GOBOT_URL) { - const options = { - url: `${GOBOT_URL}?access_token=${GOBOT_TOKEN}&${GOBOT_QQ}&message=标题:${encodeURIComponent(text+"\n")}内容:${encodeURIComponent(desp)}`, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - timeout, - }; + const options = { + url: `${GOBOT_URL}?access_token=${GOBOT_TOKEN}&${GOBOT_QQ}`, + json: { + message: `${text}\n${desp}` + }, + headers: { + 'Content-Type': 'application/json', + }, + timeout, + }; setTimeout(() => { - $.get(options, (err, resp, data) => { + $.post(options, (err, resp, data) => { try { if (err) { console.log('发送go-cqhttp通知调用API失败!!\n'); @@ -1993,7 +2168,7 @@ function ChangeUserId(desp) { } } -function qywxamNotify(text, desp, strsummary="") { +function qywxamNotify(text, desp, strsummary = "") { return new Promise((resolve) => { if (QYWX_AM) { const QYWX_AM_AY = QYWX_AM.split(','); @@ -2011,7 +2186,7 @@ function qywxamNotify(text, desp, strsummary="") { $.post(options_accesstoken, (err, resp, data) => { html = desp.replace(/\n/g, '
'); html = `${html}`; - if (strsummary=="") { + if (strsummary == "") { strsummary = desp; } var json = JSON.parse(data); @@ -2256,7 +2431,7 @@ function wxpusherNotifyByOne(text, desp, strsummary = "") { } if (strsummary.length > 96) { - strsummary = strsummary.substring(0, 95)+"..."; + strsummary = strsummary.substring(0, 95) + "..."; } let uids = []; for (let i of WP_UIDS_ONE.split(";")) {