2024-06-28 15:38:28 +08:00
/ *
cron "28 8,21 * * *" jd _bean _change . js , tag : 资产变化强化版by - ccwav
* /
//详细说明参考 https://github.com/ccwav/QLScript2.
const $ = new Env ( '京东资产统计' ) ;
const notify = $ . isNode ( ) ? require ( './sendNotify' ) : '' ;
//Node.js用户请在jdCookie.js处填写京东ck;
const jdCookieNode = $ . isNode ( ) ? require ( './jdCookie.js' ) : '' ;
2024-07-16 00:46:19 +08:00
const dyx = require ( './function/dylanx.js' ) ;
2024-06-28 15:38:28 +08:00
let NowHour = new Date ( ) . getHours ( ) ;
//默认开启缓存模式
let checkbeanDetailMode = 1 ;
if ( $ . isNode ( ) && process . env . BEANCHANGE _BEANDETAILMODE ) {
checkbeanDetailMode = process . env . BEANCHANGE _BEANDETAILMODE * 1 ;
}
const fs = require ( 'fs' ) ;
const CR = require ( 'crypto-js' ) ;
const moment = require ( "moment" ) ;
let matchtitle = "昨日" ;
let yesterday = "" ;
let TodayDate = "" ;
let startDate = "" ;
let endDate = "" ;
try {
yesterday = moment ( ) . subtract ( 1 , 'days' ) . format ( 'YYYY-MM-DD' ) ;
TodayDate = moment ( ) . format ( "YYYY-MM-DD" ) ;
startDate = moment ( ) . startOf ( "month" ) . format ( "YYYY_MM" ) ;
endDate = moment ( ) . endOf ( "month" ) . format ( "YYYY-MM-DD" ) ;
} catch ( e ) {
console . log ( "依赖缺失, 请先安装依赖moment!" ) ;
return
}
if ( ! fs . existsSync ( "./BeanCache" ) ) {
fs . mkdirSync ( "./BeanCache" ) ;
}
let strBeanCache = "./BeanCache/" + yesterday + ".json" ;
let strNewBeanCache = "./BeanCache/" + TodayDate + ".json" ;
let TodayCache = [ ] ;
let Fileexists = fs . existsSync ( strBeanCache ) ;
let TempBeanCache = [ ] ;
if ( ! Fileexists ) {
yesterday = TodayDate ;
strBeanCache = strNewBeanCache ;
Fileexists = fs . existsSync ( strBeanCache ) ;
matchtitle = "今日" ;
}
if ( Fileexists ) {
console . log ( "检测到资产变动缓存文件" + yesterday + ".json, 载入..." ) ;
TempBeanCache = fs . readFileSync ( strBeanCache , 'utf-8' ) ;
if ( TempBeanCache ) {
TempBeanCache = TempBeanCache . toString ( ) ;
TempBeanCache = JSON . parse ( TempBeanCache ) ;
}
}
Fileexists = fs . existsSync ( strNewBeanCache ) ;
if ( Fileexists ) {
console . log ( "检测到资产变动缓存文件" + TodayDate + ".json, 载入..." ) ;
TodayCache = fs . readFileSync ( strNewBeanCache , 'utf-8' ) ;
if ( TodayCache ) {
TodayCache = TodayCache . toString ( ) ;
TodayCache = JSON . parse ( TodayCache ) ;
}
}
let allMessage = '' ;
let allMessage2 = '' ;
let allReceiveMessage = '' ;
let allWarnMessage = '' ;
let ReturnMessage = '' ;
let ReturnMessageMonth = '' ;
let allMessageMonth = '' ;
let MessageUserGp2 = '' ;
let ReceiveMessageGp2 = '' ;
let WarnMessageGp2 = '' ;
let allMessageGp2 = '' ;
let allMessage2Gp2 = '' ;
let allMessageMonthGp2 = '' ;
let IndexGp2 = 0 ;
let MessageUserGp3 = '' ;
let ReceiveMessageGp3 = '' ;
let WarnMessageGp3 = '' ;
let allMessageGp3 = '' ;
let allMessage2Gp3 = '' ;
let allMessageMonthGp3 = '' ;
let IndexGp3 = 0 ;
let MessageUserGp4 = '' ;
let ReceiveMessageGp4 = '' ;
let WarnMessageGp4 = '' ;
let allMessageGp4 = '' ;
let allMessageMonthGp4 = '' ;
let allMessage2Gp4 = '' ;
let IndexGp4 = 0 ;
let notifySkipList = "" ;
let IndexAll = 0 ;
let EnableMonth = "false" ;
let isSignError = false ;
let ReturnMessageTitle = "" ;
//IOS等用户直接用NobyDa的jd cookie
let cookiesArr = [ ] , cookie = '' ;
const JD _API _HOST = 'https://api.m.jd.com/client.action' ;
let intPerSent = 0 ;
let i = 0 ;
let llShowMonth = false ;
let Today = new Date ( ) ;
let strAllNotify = "" ;
let strSubNotify = "" ;
let llPetError = false ;
let strGuoqi = "" ;
let RemainMessage = '\n' ;
RemainMessage += "⭕提醒:⭕" + '\n' ;
RemainMessage += '【特价金币】特价版APP->我的->金币(可兑换无门槛红包)\n' ;
RemainMessage += '【话费积分】APP->充值中心-赚积分兑话费( 180天效期) \n' ;
RemainMessage += '【礼品卡额】APP->我的->礼品卡( 包含E卡, 品牌类卡, 超市卡) \n' ;
RemainMessage += '【超市卡】APP首页->京东超市->超市卡(超市商品可用)\n' ;
RemainMessage += '【老农场】APP->我的->东东农场->回旧版,完成可兑换无门槛红包,可用于任意商品\n' ;
RemainMessage += '【新农场】APP->我的->东东农场,完成可在记录里查看奖品\n' ;
RemainMessage += '【奖票】APP->我的->玩一玩,可兑换京豆、红包等\n' ;
2024-07-16 00:46:19 +08:00
RemainMessage += '【汪贝余额】APP首页->京东超市->每日签到,可兑换\n' ;
2024-06-28 15:38:28 +08:00
RemainMessage += '【其他】不同类别红包不能叠加使用,自测' ;
let WP _APP _TOKEN _ONE = "" ;
let TempBaipiao = "" ;
let llgeterror = false ;
let time = new Date ( ) . getHours ( ) ;
if ( $ . isNode ( ) ) {
if ( process . env . WP _APP _TOKEN _ONE ) {
WP _APP _TOKEN _ONE = process . env . WP _APP _TOKEN _ONE ;
}
}
//if(WP_APP_TOKEN_ONE)
//console.log(`检测到已配置Wxpusher的Token, 启用一对一推送...`);
//else
//console.log(`检测到未配置Wxpusher的Token, 禁用一对一推送...`);
let jdSignUrl = 'https://api.nolanstore.cc/sign'
if ( process . env . SIGNURL )
jdSignUrl = process . env . SIGNURL ;
let epsignurl = ""
if ( process . env . epsignurl )
epsignurl = process . env . epsignurl ;
if ( $ . isNode ( ) && process . env . BEANCHANGE _PERSENT ) {
intPerSent = parseInt ( process . env . BEANCHANGE _PERSENT ) ;
console . log ( ` 检测到设定了分段通知: ` + intPerSent ) ;
}
if ( $ . isNode ( ) && process . env . BEANCHANGE _USERGP2 ) {
MessageUserGp2 = process . env . BEANCHANGE _USERGP2 ? process . env . BEANCHANGE _USERGP2 . split ( '&' ) : [ ] ;
intPerSent = 0 ; //分组推送,禁用账户拆分
console . log ( ` 检测到设定了分组推送2,将禁用分段通知 ` ) ;
}
if ( $ . isNode ( ) && process . env . BEANCHANGE _USERGP3 ) {
MessageUserGp3 = process . env . BEANCHANGE _USERGP3 ? process . env . BEANCHANGE _USERGP3 . split ( '&' ) : [ ] ;
intPerSent = 0 ; //分组推送,禁用账户拆分
console . log ( ` 检测到设定了分组推送3,将禁用分段通知 ` ) ;
}
if ( $ . isNode ( ) && process . env . BEANCHANGE _USERGP4 ) {
MessageUserGp4 = process . env . BEANCHANGE _USERGP4 ? process . env . BEANCHANGE _USERGP4 . split ( '&' ) : [ ] ;
intPerSent = 0 ; //分组推送,禁用账户拆分
console . log ( ` 检测到设定了分组推送4,将禁用分段通知 ` ) ;
}
//取消月结查询
//if ($.isNode() && process.env.BEANCHANGE_ENABLEMONTH) {
//EnableMonth = process.env.BEANCHANGE_ENABLEMONTH;
//}
if ( $ . isNode ( ) && process . env . BEANCHANGE _SUBNOTIFY ) {
strSubNotify = process . env . BEANCHANGE _SUBNOTIFY ;
strSubNotify += "\n" ;
console . log ( ` 检测到预览置顶内容,将在一对一推送的预览显示... \n ` ) ;
}
if ( $ . isNode ( ) && process . env . BEANCHANGE _ALLNOTIFY ) {
strAllNotify = process . env . BEANCHANGE _ALLNOTIFY ;
console . log ( ` 检测到设定了公告,将在推送信息中置顶显示... ` ) ;
strAllNotify = "✨✨✨✨✨✨✨公告✨✨✨✨✨✨✨\n" + strAllNotify ;
console . log ( strAllNotify + "\n" ) ;
strAllNotify += "\n🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏🎏\n"
}
if ( EnableMonth == "true" && Today . getDate ( ) == 1 && Today . getHours ( ) > 17 )
llShowMonth = true ;
let userIndex2 = - 1 ;
let userIndex3 = - 1 ;
let userIndex4 = - 1 ;
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 strDisableList = "" ;
let DisableIndex = - 1 ;
if ( $ . isNode ( ) ) {
strDisableList = process . env . BEANCHANGE _DISABLELIST ? process . env . BEANCHANGE _DISABLELIST . split ( '&' ) : [ ] ;
}
//老农场
let EnableJdFruit = true ;
DisableIndex = strDisableList . findIndex ( ( item ) => item === "老农场" ) ;
if ( DisableIndex != - 1 ) {
console . log ( "检测到设定关闭老农场查询" ) ;
EnableJdFruit = false ;
}
//7天过期京豆
let EnableOverBean = true ;
DisableIndex = strDisableList . findIndex ( ( item ) => item === "过期京豆" ) ;
if ( DisableIndex != - 1 ) {
console . log ( "检测到设定关闭过期京豆查询" ) ;
EnableOverBean = false
}
//查优惠券
let EnableChaQuan = false ;
DisableIndex = strDisableList . findIndex ( ( item ) => item === "查优惠券" ) ;
if ( DisableIndex != - 1 ) {
console . log ( "检测到设定关闭优惠券查询" ) ;
EnableChaQuan = false
}
DisableIndex = strDisableList . findIndex ( ( item ) => item === "活动攻略" ) ;
if ( DisableIndex != - 1 ) {
console . log ( "检测到设定关闭活动攻略显示" ) ;
RemainMessage = "" ;
}
//京豆收益查询
let EnableCheckBean = true ;
DisableIndex = strDisableList . findIndex ( ( item ) => item === "京豆收益" ) ;
if ( DisableIndex != - 1 ) {
console . log ( "检测到设定关闭京豆收益查询" ) ;
EnableCheckBean = false
}
const bdy _0x4d8a20 = bdy _0x467d ; ( function ( _0x90c948 , _0x9403f5 ) { const bdy _0x3399e2 = { _0x39ed90 : '0x29c' , _0x195615 : 'swYa' , _0x1b057b : '0x316' , _0x3a5f09 : 'KQAa' , _0x82aad : '0x292' , _0x292649 : '$&Sv' , _0xe3d324 : '0x21b' , _0x17ea3d : '&pHw' , _0x3787b0 : '0x2fe' , _0x10b2eb : 'E0p(' , _0x1fb37d : '0x276' , _0x5ef5d0 : '%v^B' , _0x3ba1df : '0x25e' , _0x47ceb : 'o3ro' , _0x8f35a : '0x240' , _0x58d227 : 't*2b' , _0x51e0fb : '0x288' , _0x390246 : 'OQ@V' , _0x358364 : '0x205' , _0x414837 : 'H2@y' , _0x53f9f9 : '0x299' , _0x4db26c : 'thG9' } , _0x344b2b = bdy _0x467d , _0x3e3609 = _0x90c948 ( ) ; while ( ! ! [ ] ) { try { const _0x71b8b6 = parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x39ed90 , bdy _0x3399e2 . _0x195615 ) ) / ( - 0x561 * - 0x3 + - 0x1 * 0x135a + 0x338 ) + parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x1b057b , bdy _0x3399e2 . _0x3a5f09 ) ) / ( - 0x1 * - 0x1f67 + - 0x15e1 + - 0x984 ) * ( - parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x82aad , bdy _0x3399e2 . _0x292649 ) ) / ( 0x263b + 0x157 * - 0xf + 0x121f * - 0x1 ) ) + parseInt ( _0x344b2b ( bdy _0x3399e2 . _0xe3d324 , bdy _0x3399e2 . _0x17ea3d ) ) / ( 0xb7d + 0x1e9e + 0x2a17 * - 0x1 ) + parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x3787b0 , bdy _0x3399e2 . _0x10b2eb ) ) / ( 0x66f * 0x1 + 0x640 + 0x655 * - 0x2 ) * ( - parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x1fb37d , bdy _0x3399e2 . _0x5ef5d0 ) ) / ( - 0x125 * - 0x1d + - 0x1fa3 * 0x1 + - 0x188 ) ) + - parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x3ba1df , bdy _0x3399e2 . _0x47ceb ) ) / ( 0x1 * 0x1f01 + 0x9e0 + 0x6cf * - 0x6 ) * ( parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x8f35a , bdy _0x3399e2 . _0x58d227 ) ) / ( - 0x1 * - 0x33d + 0x22f1 * 0x1 + 0x1 * - 0x2626 ) ) + parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x51e0fb , bdy _0x3399e2 . _0x390246 ) ) / ( 0x2097 + 0x6c3 + 0xb7 * - 0x37 ) + - parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x358364 , bdy _0x3399e2 . _0x414837 ) ) / ( - 0x743 + 0xba7 * 0x2 + - 0x1001 ) * ( - parseInt ( _0x344b2b ( bdy _0x3399e2 . _0x53f9f9 , bdy _0x3399e2 . _0x4db26c ) ) / ( 0x592 + - 0xea4 + 0x91d ) ) ; if ( _0x71b8b6 === _0x9403f5 ) break ; else _0x3e3609 [ 'push' ] ( _0x3e3609 [ 'shift' ] ( ) ) ; } catch ( _0x2d85ee ) { _0x3e3609 [ 'push' ] ( _0x3e3609 [ 'shift' ] ( ) ) ; } } } ( bdy _0xb839 , 0x2cd66 * 0x5 + 0x1 * - 0xdcea7 + - 0xd * - 0x10b63 ) ) ; function bdy _0x467d ( _0xb796e6 , _0x20adcf ) { const _0x483806 = bdy _0xb839 ( ) ; return bdy _0x467d = function ( _0x4cab42 , _0x404e84 ) { _0x4cab42 = _0x4cab42 - ( 0x1877 + - 0x1477 + - 0x22d ) ; let _0x425064 = _0x483806 [ _0x4cab42 ] ; if ( bdy _0x467d [ 'dQjBlH' ] === undefined ) { var _0x12dbcf = function ( _0x368eeb ) { const _0x5c9588 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=' ; let _0xab6ebe = '' , _0x394820 = '' , _0x4d238b = _0xab6ebe + _0x12dbcf ; for ( let _0x89ad8e = 0x21a8 + 0x59d + - 0x45d * 0x9 , _0x4d9c60 , _0x3b4d5 , _0x4cd79e = - 0x187 * - 0x12 + 0x463 + - 0x1fe1 ; _0x3b4d5 = _0x368eeb [ 'charAt' ] ( _0x4cd79e ++ ) ; ~ _0x3b4d5 && ( _0x4d9c60 = _0x89ad8e % ( 0x250c + - 0x17c5 + - 0xd43 ) ? _0x4d9c60 * ( - 0xc75 * - 0x3 + 0xb44 + - 0x3063 ) + _0x3b4d5 : _0x3b4d5 , _0x89ad8e ++ % ( 0x11 * - 0x25 + - 0x15ad + 0x1826 ) ) ? _0xab6ebe += _0x4d238b [ 'charCodeAt' ] ( _0x4cd79e + ( 0x49a + 0x1 * 0x437 + - 0x1 * 0x8c7 ) ) - ( - 0x2 * 0x67 + - 0x205b + - 0x3 * - 0xb11 ) !== 0x111f + 0x19f9 + - 0x2b18 ? String [ 'fromCharCode' ] ( - 0x108a * 0x1 + 0xa7 * - 0x11 + 0x1ca0 & _0x4d9c60 >> ( - ( - 0x1 * - 0x20bf + 0x25ef + 0x2356 * - 0x2 ) * _0x89ad8e & 0x229d + - 0x9e * 0x10 + 0x18b7 * - 0x1 ) ) : _0x89ad8e : 0xb1 + 0x16f9 + - 0x1 * 0x17aa ) { _0x3b4d5 = _0x5c9588 [ 'indexOf' ] ( _0x3b4d5 ) ; } for ( let _0x230dff = - 0x22 * - 0x115 + 0x1d4d + - 0x4217 , _0x1b80fa = _0xab6ebe [ 'length' ] ; _0x230dff < _0x1b80fa ; _0x230dff ++ ) { _0x394820 += '%' + ( '00' + _0xab6ebe [ 'charCodeAt' ] ( _0x230dff ) [ 'toString' ] ( 0x1 * 0x20b1 + 0x206d + - 0x410e ) ) [ 'slice' ] ( - ( 0xb * - 0x13f + 0x3 * 0x9e + 0xbdd * 0x1 ) ) ; } return decodeURIComponent ( _0x394820 ) ; } ; const _0x3e37e2 = function ( _0x3c6fbb , _0xd550ba ) { let _0x317f3f = [ ] , _0x351017 = 0x4e * - 0x7c + 0x3 * 0xa9b + 0x5f7 , _0x1604bb , _0x4c2abb = '' ; _0x3c6fbb = _0x12dbcf ( _0x3c6fbb ) ; let _0x366cc4 ; for ( _0x366cc4 = - 0x21 * - 0x2e + 0x1 * 0x11cf + - 0x17bd * 0x1 ; _0x366cc4 < 0x234f + 0x1 * 0x809 + - 0x2a58 ; _0x366cc4 ++ ) { _0x317f3f [ _0x366cc4 ] = _0x366cc4 ; } for ( _0x366cc4 = 0x9ae + 0x46d * - 0x5 + - 0xc73 * - 0x1 ; _0x366cc4 < - 0xc8b * 0x3 + 0x8 * - 0x36d + 0x4209 ; _0x366cc4 ++ ) { _0x351017 = ( _0x351017 + _0x317f3f [ _0x366cc4 ] + _0xd550ba [ 'charCodeAt' ] ( _0x366cc4 % _0xd550ba [ 'length' ] ) ) % ( - 0x1a + 0x1 * 0x822 + - 0x4b * 0x18 ) , _0x1604bb = _0x317f3f [ _0x366cc4 ] , _0x317f3f [ _0x366cc4 ] = _0x317f3f [ _0x351017 ] , _0x317f3f [ _0x351017 ] = _0x1604bb ; } _0x366cc4 = - 0x96 * - 0x7 + - 0x1fdb + 0x3f7 * 0x7 , _0x351017 = 0x15c1 + - 0x24ef + 0xf2e ; for ( let _0x3b5e14 = - 0xdc6 + 0x2186 + - 0x13c0 ; _0x3b5e14 < _0x3c6fbb [ 'length' ] ; _0x3b5e14 ++ ) { _0x366cc4 = ( _0x366cc4 + ( - 0x1ed * - 0x2 + 0x105d + - 0x1436 ) ) % ( 0x1320 + - 0x209 + - 0x1 * 0x1017 ) , _0x351017 = ( _0x351017 + _0x317f3f [ _0x366cc4 ] ) % ( - 0x58e + - 0x1079 * 0x1 + 0x1707 ) , _0x1604bb = _0x317f3f [ _0x36
! ( async ( ) => {
if ( ! cookiesArr [ 0 ] ) {
$ . msg ( $ . name , '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取' , 'https://bean.m.jd.com/bean/signIndex.action' , {
"open-url" : "https://bean.m.jd.com/bean/signIndex.action"
} ) ;
return ;
}
for ( i = 0 ; i < cookiesArr . length ; i ++ ) {
if ( cookiesArr [ i ] ) {
cookie = cookiesArr [ i ] ;
$ . pt _pin = ( cookie . match ( /pt_pin=([^; ]+)(?=;?)/ ) && cookie . match ( /pt_pin=([^; ]+)(?=;?)/ ) [ 1 ] ) ;
$ . UserName = decodeURIComponent ( cookie . match ( /pt_pin=([^; ]+)(?=;?)/ ) && cookie . match ( /pt_pin=([^; ]+)(?=;?)/ ) [ 1 ] ) ;
$ . CryptoJS = $ . isNode ( ) ? require ( 'crypto-js' ) : CryptoJS ;
$ . index = i + 1 ;
$ . beanCount = 0 ;
$ . incomeBean = 0 ;
$ . expenseBean = 0 ;
$ . todayIncomeBean = 0 ;
$ . todayOutcomeBean = 0 ;
$ . errorMsg = '' ;
$ . isLogin = true ;
$ . nickName = '' ;
$ . levelName = '' ;
$ . message = '' ;
$ . balance = 0 ;
$ . expiredBalance = 0 ;
$ . JdFarmProdName = '' ;
$ . JdtreeEnergy = 0 ;
$ . JdtreeTotalEnergy = 0 ;
$ . treeState = 0 ;
$ . JdwaterTotalT = 0 ;
$ . JdwaterD = 0 ;
$ . JDwaterEveryDayT = 0 ;
$ . JDtotalcash = 0 ;
$ . jdCash = 0 ;
$ . isPlusVip = false ;
$ . isRealNameAuth = false ;
$ . JingXiang = "" ;
$ . allincomeBean = 0 ; //月收入
$ . allexpenseBean = 0 ; //月支出
$ . beanChangeXi = 0 ;
$ . YunFeiTitle = "" ;
$ . YunFeiQuan = 0 ;
$ . YunFeiQuanEndTime = "" ;
$ . YunFeiTitle2 = "" ;
$ . YunFeiQuan2 = 0 ;
$ . YunFeiQuanEndTime2 = "" ;
$ . JoyRunningAmount = "" ;
$ . ECardinfo = "" ;
$ . PlustotalScore = 0 ;
$ . CheckTime = "" ;
$ . beanCache = 0 ;
$ . fruitnewinfo = '' ;
$ . newfarm _info = '' ;
TempBaipiao = "" ;
strGuoqi = "" ;
$ . wyw _score = '' ;
$ . wb _score = '' ;
console . log ( ` ******开始查询【京东账号 ${ $ . index } 】 ${ $ . nickName || $ . UserName } ********* ` ) ;
$ . UA = require ( './USER_AGENTS' ) . UARAM ( ) ;
await getuserinfo _6dy ( ) ;
//await TotalBean2();
if ( $ . beanCount == 0 ) {
console . log ( "数据获取失败, 等待30秒后重试...." )
await $ . wait ( 30 * 1000 ) ;
await TotalBean ( ) ;
}
if ( $ . beanCount == 0 ) {
console . log ( "疑似获取失败,等待10秒后用第二个接口试试...." )
await $ . wait ( 10 * 1000 ) ;
var userdata = await getuserinfo ( ) ;
if ( userdata . code == 1 ) {
$ . beanCount = userdata . content . jdBean ;
}
}
if ( ! $ . isLogin ) {
await isLoginByX1a0He ( ) ;
}
if ( ! $ . isLogin ) {
$ . msg ( $ . name , ` 【提示】cookie已失效 ` , ` 京东账号 ${ $ . index } ${ $ . nickName || $ . UserName } \n 请重新登录获取 \n https://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
}
if ( TempBeanCache ) {
for ( let j = 0 ; j < TempBeanCache . length ; j ++ ) {
if ( TempBeanCache [ j ] . pt _pin == $ . UserName ) {
$ . CheckTime = TempBeanCache [ j ] . CheckTime ;
$ . beanCache = TempBeanCache [ j ] . BeanNum ;
break ;
}
}
}
var llfound = false ;
var timeString = "" ;
var nowHour = new Date ( ) . getHours ( ) ;
var nowMinute = new Date ( ) . getMinutes ( ) ;
if ( nowHour < 10 )
timeString += "0" + nowHour + ":" ;
else
timeString += nowHour + ":" ;
if ( nowMinute < 10 )
timeString += "0" + nowMinute ;
else
timeString += nowMinute ;
if ( TodayCache ) {
for ( let j = 0 ; j < TodayCache . length ; j ++ ) {
if ( TodayCache [ j ] . pt _pin == $ . UserName ) {
TodayCache [ j ] . CheckTime = timeString ;
TodayCache [ j ] . BeanNum = $ . beanCount ;
llfound = true ;
break ;
}
}
}
if ( ! llfound ) {
var tempAddCache = {
"pt_pin" : $ . UserName ,
"CheckTime" : timeString ,
"BeanNum" : $ . beanCount
} ;
TodayCache . push ( tempAddCache ) ;
}
await getjdfruitinfo ( ) ; //老农场
await $ . wait ( 1000 ) ;
await fruitnew ( ) ;
//await checkplus();
await Promise . all ( [
wanyiwan ( ) ,
wb _info ( ) ,
bean ( ) , //京豆查询
queryScores ( ) ,
getek ( ) ,
newfarm _info ( )
] )
await showMsg ( ) ;
if ( intPerSent > 0 ) {
if ( ( i + 1 ) % intPerSent == 0 ) {
console . log ( "分段通知条件达成,处理发送通知...." ) ;
if ( $ . isNode ( ) && allMessage ) {
var TempMessage = allMessage ;
if ( strAllNotify )
allMessage = strAllNotify + ` \n ` + allMessage ;
await notify . sendNotify ( ` ${ $ . name } ` , ` ${ allMessage } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
}
if ( $ . isNode ( ) && allMessageMonth ) {
await notify . sendNotify ( ` 京东月资产统计 ` , ` ${ allMessageMonth } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
}
allMessage = "" ;
allMessageMonth = "" ;
}
}
}
}
var str = JSON . stringify ( TodayCache , null , 2 ) ;
fs . writeFile ( strNewBeanCache , str , function ( err ) {
if ( err ) {
console . log ( err ) ;
console . log ( "添加缓存" + TodayDate + ".json失败!" ) ;
} else {
console . log ( "添加缓存" + TodayDate + ".json成功!" ) ;
}
} )
//组1通知
if ( ReceiveMessageGp4 ) {
allMessage2Gp4 = ` 【⏰商品白嫖清单⏰】 \n ` + ReceiveMessageGp4 ;
}
if ( WarnMessageGp4 ) {
if ( allMessage2Gp4 ) {
allMessage2Gp4 = ` \n ` + allMessage2Gp4 ;
}
allMessage2Gp4 = ` 【⏰商品白嫖活动任务提醒⏰】 \n ` + WarnMessageGp4 + allMessage2Gp4 ;
}
//组2通知
if ( ReceiveMessageGp2 ) {
allMessage2Gp2 = ` 【⏰商品白嫖清单⏰】 \n ` + ReceiveMessageGp2 ;
}
if ( WarnMessageGp2 ) {
if ( allMessage2Gp2 ) {
allMessage2Gp2 = ` \n ` + allMessage2Gp2 ;
}
allMessage2Gp2 = ` 【⏰商品白嫖活动任务提醒⏰】 \n ` + WarnMessageGp2 + allMessage2Gp2 ;
}
//组3通知
if ( ReceiveMessageGp3 ) {
allMessage2Gp3 = ` 【⏰商品白嫖清单⏰】 \n ` + ReceiveMessageGp3 ;
}
if ( WarnMessageGp3 ) {
if ( allMessage2Gp3 ) {
allMessage2Gp3 = ` \n ` + allMessage2Gp3 ;
}
allMessage2Gp3 = ` 【⏰商品白嫖活动任务提醒⏰】 \n ` + WarnMessageGp3 + allMessage2Gp3 ;
}
//其他通知
if ( allReceiveMessage ) {
allMessage2 = ` 【⏰商品白嫖清单⏰】 \n ` + allReceiveMessage ;
}
if ( allWarnMessage ) {
if ( allMessage2 ) {
allMessage2 = ` \n ` + allMessage2 ;
}
allMessage2 = ` 【⏰商品白嫖活动任务提醒⏰】 \n ` + allWarnMessage + allMessage2 ;
}
if ( intPerSent > 0 ) {
//console.log("分段通知还剩下" + cookiesArr.length % intPerSent + "个账号需要发送...");
if ( allMessage || allMessageMonth ) {
console . log ( "分段通知收尾,处理发送通知...." ) ;
if ( $ . isNode ( ) && allMessage ) {
var TempMessage = allMessage ;
if ( strAllNotify )
allMessage = strAllNotify + ` \n ` + allMessage ;
await notify . sendNotify ( ` ${ $ . name } ` , ` ${ allMessage } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
}
if ( $ . isNode ( ) && allMessageMonth ) {
await notify . sendNotify ( ` 京东月资产统计 ` , ` ${ allMessageMonth } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
}
}
} else {
if ( $ . isNode ( ) && allMessageGp2 ) {
var TempMessage = allMessageGp2 ;
if ( strAllNotify )
allMessageGp2 = strAllNotify + ` \n ` + allMessageGp2 ;
await notify . sendNotify ( ` ${ $ . name } #2 ` , ` ${ allMessageGp2 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageGp3 ) {
var TempMessage = allMessageGp3 ;
if ( strAllNotify )
allMessageGp3 = strAllNotify + ` \n ` + allMessageGp3 ;
await notify . sendNotify ( ` ${ $ . name } #3 ` , ` ${ allMessageGp3 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageGp4 ) {
var TempMessage = allMessageGp4 ;
if ( strAllNotify )
allMessageGp4 = strAllNotify + ` \n ` + allMessageGp4 ;
await notify . sendNotify ( ` ${ $ . name } #4 ` , ` ${ allMessageGp4 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessage ) {
var TempMessage = allMessage ;
if ( strAllNotify )
allMessage = strAllNotify + ` \n ` + allMessage ;
await notify . sendNotify ( ` ${ $ . name } ` , ` ${ allMessage } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} , undefined , TempMessage )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageMonthGp2 ) {
await notify . sendNotify ( ` 京东月资产统计#2 ` , ` ${ allMessageMonthGp2 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageMonthGp3 ) {
await notify . sendNotify ( ` 京东月资产统计#3 ` , ` ${ allMessageMonthGp3 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageMonthGp4 ) {
await notify . sendNotify ( ` 京东月资产统计#4 ` , ` ${ allMessageMonthGp4 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessageMonth ) {
await notify . sendNotify ( ` 京东月资产统计 ` , ` ${ allMessageMonth } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
}
if ( $ . isNode ( ) && allMessage2Gp2 ) {
allMessage2Gp2 += RemainMessage ;
await notify . sendNotify ( "京东白嫖提醒#2" , ` ${ allMessage2Gp2 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessage2Gp3 ) {
allMessage2Gp3 += RemainMessage ;
await notify . sendNotify ( "京东白嫖提醒#3" , ` ${ allMessage2Gp3 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessage2Gp4 ) {
allMessage2Gp4 += RemainMessage ;
await notify . sendNotify ( "京东白嫖提醒#4" , ` ${ allMessage2Gp4 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
if ( $ . isNode ( ) && allMessage2 ) {
allMessage2 += RemainMessage ;
await notify . sendNotify ( "京东白嫖提醒" , ` ${ allMessage2 } ` , {
url : ` https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean `
} )
await $ . wait ( 10 * 1000 ) ;
}
} ) ( )
. catch ( ( e ) => {
$ . log ( '' , ` ❌ ${ $ . name } , 失败! 原因: ${ e } ! ` , '' )
} )
. finally ( ( ) => {
$ . done ( ) ;
} )
async function showMsg ( ) {
//if ($.errorMsg)
//return
ReturnMessageTitle = "" ;
ReturnMessage = "" ;
var strsummary = "" ;
if ( MessageUserGp2 ) {
userIndex2 = MessageUserGp2 . findIndex ( ( item ) => item === $ . pt _pin ) ;
}
if ( MessageUserGp3 ) {
userIndex3 = MessageUserGp3 . findIndex ( ( item ) => item === $ . pt _pin ) ;
}
if ( MessageUserGp4 ) {
userIndex4 = MessageUserGp4 . findIndex ( ( item ) => item === $ . pt _pin ) ;
}
if ( userIndex2 != - 1 ) {
IndexGp2 += 1 ;
ReturnMessageTitle = ` 【账号 ${ IndexGp2 } 🆔】 ${ $ . nickName || $ . UserName } ` ;
}
if ( userIndex3 != - 1 ) {
IndexGp3 += 1 ;
ReturnMessageTitle = ` 【账号 ${ IndexGp3 } 🆔】 ${ $ . nickName || $ . UserName } ` ;
}
if ( userIndex4 != - 1 ) {
IndexGp4 += 1 ;
ReturnMessageTitle = ` 【账号 ${ IndexGp4 } 🆔】 ${ $ . nickName || $ . UserName } ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
IndexAll += 1 ;
ReturnMessageTitle = ` 【账号 ${ IndexAll } 🆔】 ${ $ . nickName || $ . UserName } ` ;
}
if ( $ . JingXiang || 1 ) {
if ( $ . isRealNameAuth )
if ( cookie . includes ( "app_open" ) )
ReturnMessageTitle += ` (wskey已实名) \n ` ;
else
ReturnMessageTitle += ` (已实名) \n ` ;
else
if ( cookie . includes ( "app_open" ) )
ReturnMessageTitle += ` (wskey未实名) \n ` ;
else
ReturnMessageTitle += ` (未实名) \n ` ;
ReturnMessage += ` 【账号信息】 ` ;
if ( $ . isPlusVip ) {
ReturnMessage += ` Plus会员 ` ;
} else {
ReturnMessage += ` 普通会员 ` ;
}
if ( $ . PlustotalScore )
ReturnMessage += ` ( ${ $ . PlustotalScore } 分) `
ReturnMessage += ` \n ` ;
//ReturnMessage += `,京享值${$.JingXiang}\n`;
} else {
ReturnMessageTitle += ` \n ` ;
}
if ( llShowMonth ) {
ReturnMessageMonth = ReturnMessage ;
ReturnMessageMonth += ` \n 【上月收入】: ${ $ . allincomeBean } 京豆 🐶 \n ` ;
ReturnMessageMonth += ` 【上月支出】: ${ $ . allexpenseBean } 京豆 🐶 \n ` ;
console . log ( ReturnMessageMonth ) ;
if ( userIndex2 != - 1 ) {
allMessageMonthGp2 += ReturnMessageMonth + ` \n ` ;
}
if ( userIndex3 != - 1 ) {
allMessageMonthGp3 += ReturnMessageMonth + ` \n ` ;
}
if ( userIndex4 != - 1 ) {
allMessageMonthGp4 += ReturnMessageMonth + ` \n ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
allMessageMonth += ReturnMessageMonth + ` \n ` ;
}
if ( $ . isNode ( ) && WP _APP _TOKEN _ONE ) {
try {
await notify . sendNotifybyWxPucher ( "京东月资产统计" , ` ${ ReturnMessageMonth } ` , ` ${ $ . UserName } ` ) ;
} catch {
$ . log ( ` 一对一推送异常, 请拷贝库里的sendnotify.js文件到deps目录下, 在拉库重试! ! ! \n ` ) ;
}
}
}
if ( EnableCheckBean ) {
if ( checkbeanDetailMode == 0 ) {
ReturnMessage += ` 【今日京豆】收 ${ $ . todayIncomeBean } 豆 ` ;
strsummary += ` 收 ${ $ . todayIncomeBean } 豆, ` ;
if ( $ . todayOutcomeBean != 0 ) {
ReturnMessage += ` ,支 ${ $ . todayOutcomeBean } 豆 ` ;
}
ReturnMessage += ` \n ` ;
ReturnMessage += ` 【昨日京豆】收 ${ $ . incomeBean } 豆 ` ;
if ( $ . expenseBean != 0 ) {
ReturnMessage += ` ,支 ${ $ . expenseBean } 豆 ` ;
}
ReturnMessage += ` \n ` ;
} else {
if ( TempBeanCache ) {
ReturnMessage += ` 【京豆变动】 ${ $ . beanCount - $ . beanCache } 豆(与 ${ matchtitle } ${ $ . CheckTime } 比较) ` ;
strsummary += ` 变动 ${ $ . beanCount - $ . beanCache } 豆, ` ;
ReturnMessage += ` \n ` ;
}
else {
ReturnMessage += ` 【京豆变动】未找到缓存,下次出结果统计 ` ;
ReturnMessage += ` \n ` ;
}
}
}
if ( $ . beanCount ) {
ReturnMessage += ` 【当前京豆】 ${ $ . beanCount - $ . beanChangeXi } 豆(≈ ${ ( ( $ . beanCount - $ . beanChangeXi ) / 100 ) . toFixed ( 2 ) } 元) \n ` ;
} else {
if ( $ . levelName || $ . JingXiang )
ReturnMessage += ` 【当前京豆】获取失败,接口返回空数据 \n ` ;
else {
ReturnMessage += ` 【当前京豆】 ${ $ . beanCount - $ . beanChangeXi } 豆(≈ ${ ( ( $ . beanCount - $ . beanChangeXi ) / 100 ) . toFixed ( 2 ) } 元) \n ` ;
}
}
if ( $ . JDtotalcash ) {
ReturnMessage += ` 【特价金币】 ${ $ . JDtotalcash } 币(≈ ${ ( $ . JDtotalcash / 10000 ) . toFixed ( 2 ) } 元) \n ` ;
}
if ( $ . ECardinfo )
ReturnMessage += ` 【礼品卡额】 ${ $ . ECardinfo } 元 \n ` ;
if ( $ . JoyRunningAmount )
ReturnMessage += ` 【汪汪赛跑】 ${ $ . JoyRunningAmount } 元 \n ` ;
if ( $ . JdFarmProdName != "" ) {
if ( $ . JdtreeEnergy != 0 ) {
if ( $ . treeState === 2 || $ . treeState === 3 ) {
ReturnMessage += ` 【老农场】 ${ $ . JdFarmProdName } 可以兑换了! \n ` ;
TempBaipiao += ` 【老农场】 ${ $ . JdFarmProdName } 可以兑换了! \n ` ;
if ( userIndex2 != - 1 ) {
ReceiveMessageGp2 += ` 【账号 ${ IndexGp2 } ${ $ . nickName || $ . UserName } 】 ${ $ . JdFarmProdName } (老农场) \n ` ;
}
if ( userIndex3 != - 1 ) {
ReceiveMessageGp3 += ` 【账号 ${ IndexGp3 } ${ $ . nickName || $ . UserName } 】 ${ $ . JdFarmProdName } (老农场) \n ` ;
}
if ( userIndex4 != - 1 ) {
ReceiveMessageGp4 += ` 【账号 ${ IndexGp4 } ${ $ . nickName || $ . UserName } 】 ${ $ . JdFarmProdName } (老农场) \n ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
allReceiveMessage += ` 【账号 ${ IndexAll } ${ $ . nickName || $ . UserName } 】 ${ $ . JdFarmProdName } (老农场) \n ` ;
}
} else {
//if ($.JdwaterD != 'Infinity' && $.JdwaterD != '-Infinity') {
//ReturnMessage += `【老农场】${$.JdFarmProdName}(${(($.JdtreeEnergy / $.JdtreeTotalEnergy) * 100).toFixed(0)}%,${$.JdwaterD}天)\n`;
//} else {
ReturnMessage += ` 【老农场】 ${ $ . JdFarmProdName } ( ${ ( ( $ . JdtreeEnergy / $ . JdtreeTotalEnergy ) * 100 ) . toFixed ( 0 ) } %) \n ` ;
//}
}
} else {
if ( $ . treeState === 0 ) {
TempBaipiao += ` 【老农场】水果领取后未重新种植! \n ` ;
if ( userIndex2 != - 1 ) {
WarnMessageGp2 += ` 【账号 ${ IndexGp2 } ${ $ . nickName || $ . UserName } 】水果领取后未重新种植! (老农场) \n ` ;
}
if ( userIndex3 != - 1 ) {
WarnMessageGp3 += ` 【账号 ${ IndexGp3 } ${ $ . nickName || $ . UserName } 】水果领取后未重新种植! (老农场) \n ` ;
}
if ( userIndex4 != - 1 ) {
WarnMessageGp4 += ` 【账号 ${ IndexGp4 } ${ $ . nickName || $ . UserName } 】水果领取后未重新种植! (老农场) \n ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
allWarnMessage += ` 【账号 ${ IndexAll } ${ $ . nickName || $ . UserName } 】水果领取后未重新种植! (老农场) \n ` ;
}
} else if ( $ . treeState === 1 ) {
ReturnMessage += ` 【老农场】 ${ $ . JdFarmProdName } 种植中... \n ` ;
} else {
TempBaipiao += ` 【老农场】状态异常! \n ` ;
if ( userIndex2 != - 1 ) {
WarnMessageGp2 += ` 【账号 ${ IndexGp2 } ${ $ . nickName || $ . UserName } 】状态异常! (老农场) \n ` ;
}
if ( userIndex3 != - 1 ) {
WarnMessageGp3 += ` 【账号 ${ IndexGp3 } ${ $ . nickName || $ . UserName } 】状态异常! (老农场) \n ` ;
}
if ( userIndex4 != - 1 ) {
WarnMessageGp4 += ` 【账号 ${ IndexGp4 } ${ $ . nickName || $ . UserName } 】状态异常! (老农场) \n ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
allWarnMessage += ` 【账号 ${ IndexAll } ${ $ . nickName || $ . UserName } 】状态异常! (老农场) \n ` ;
}
//ReturnMessage += `【老农场】${$.JdFarmProdName}状态异常${$.treeState}...\n`;
}
}
}
if ( $ . fruitnewinfo ) {
//ReturnMessage += `【新农场】种植进度${$.fruitnewinfo}\n`;
if ( $ . fruitnewinfo . skuName && $ . fruitnewinfo . treeFullStage == 5 ) {
ReturnMessage += ` 【新农场】种植完成! \n ` ;
TempBaipiao += ` 【新农场】种植完成! \n ` ;
allReceiveMessage += ` 【账号 ${ IndexAll } ${ $ . nickName || $ . UserName } 】种植完成,去领取吧 (新农场) \n ` ;
} else if ( $ . fruitnewinfo . skuName && $ . fruitnewinfo . treeCurrentState === 0 ) {
ReturnMessage += '【新农场】种植进度' + $ . fruitnewinfo . treeFullStage + '/5(' + $ . fruitnewinfo . currentProcess + '%)\n' ;
} else if ( $ . fruitnewinfo . treeFullStage === 0 ) {
ReturnMessage += ` 【新农场】未种植! \n ` ;
//TempBaipiao += `【新农场】未种植!\n`;
//allWarnMessage += `【账号${IndexAll} ${$.nickName || $.UserName}】未种植,快去种植吧! (新农场)\n`;
} else {
ReturnMessage += '【新农场】可能枯萎了,请重新种植!\n' ;
}
}
if ( $ . newfarm _info ) {
//ReturnMessage += `【新农场】奖品未兑换!\n`;
TempBaipiao += ` 【新农场】奖品未兑换! \n ` ;
allReceiveMessage += ` 【账号 ${ IndexAll } ${ $ . nickName || $ . UserName } 】 \n ${ $ . newfarm _info } \n 快去兑换吧 (新农场) \n ` ;
}
let dwscore = await dwappinfo ( ) ;
if ( dwscore ) {
let dwappex = await dwappexpire ( ) ;
ReturnMessage += ` 【话费积分】 ${ dwscore } ` ;
if ( dwappex ) {
ReturnMessage += ` (近7日将过期 ${ dwappex } ) ` ;
}
ReturnMessage += ` \n ` ;
}
let marketcard = await marketCard ( ) ;
if ( marketcard && marketcard . balance != '0.00' ) {
ReturnMessage += ` 【超市卡】 ${ marketcard . balance } 元 ` ;
if ( marketcard . expirationGiftAmountDes ) {
ReturnMessage += ` ( ${ marketcard . expirationGiftAmountDes } ) ` ;
}
ReturnMessage += ` \n ` ;
}
if ( $ . wyw _score != '' ) {
ReturnMessage += ` 【玩一玩奖票】 ${ $ . wyw _score } 个 ` ;
ReturnMessage += ` \n ` ;
}
if ( $ . wb _score != '' ) {
ReturnMessage += ` 【汪贝余额】 ${ $ . wb _score } ${ $ . wb _expire != 0 ? '(近7日将过期' + $ . wb _expire + ')' : '' } ` ;
ReturnMessage += ` \n ` ;
}
if ( $ . jdCash ) {
ReturnMessage += ` 【其他信息】 ` ;
if ( $ . jdCash ) {
ReturnMessage += ` 领现金: ${ $ . jdCash } 元 ` ;
}
ReturnMessage += ` \n ` ;
}
if ( strGuoqi ) {
ReturnMessage += ` 💸💸💸临期京豆明细💸💸💸 \n ` ;
ReturnMessage += ` ${ strGuoqi } ` ;
}
ReturnMessage += ` 🧧🧧🧧红包明细🧧🧧🧧 \n ` ;
ReturnMessage += ` ${ $ . message } ` ;
strsummary += ` 红包 ${ $ . balance } 元 `
if ( $ . YunFeiQuan ) {
var strTempYF = "【免运费券】" + $ . YunFeiQuan + "张" ;
if ( $ . YunFeiQuanEndTime )
strTempYF += "(有效期至" + $ . YunFeiQuanEndTime + ")" ;
strTempYF += "\n" ;
ReturnMessage += strTempYF
}
if ( $ . YunFeiQuan2 ) {
var strTempYF2 = "【免运费券】" + $ . YunFeiQuan2 + "张" ;
if ( $ . YunFeiQuanEndTime2 )
strTempYF += "(有效期至" + $ . YunFeiQuanEndTime2 + ")" ;
strTempYF2 += "\n" ;
ReturnMessage += strTempYF2
}
if ( userIndex2 != - 1 ) {
allMessageGp2 += ReturnMessageTitle + ReturnMessage + ` \n ` ;
}
if ( userIndex3 != - 1 ) {
allMessageGp3 += ReturnMessageTitle + ReturnMessage + ` \n ` ;
}
if ( userIndex4 != - 1 ) {
allMessageGp4 += ReturnMessageTitle + ReturnMessage + ` \n ` ;
}
if ( userIndex2 == - 1 && userIndex3 == - 1 && userIndex4 == - 1 ) {
allMessage += ReturnMessageTitle + ReturnMessage + ` \n ------ \n ` ;
}
console . log ( ` ${ ReturnMessageTitle + ReturnMessage } ` ) ;
if ( $ . isNode ( ) && WP _APP _TOKEN _ONE ) {
var strTitle = "京东资产统计" ;
if ( $ . JingXiang || 1 ) {
if ( $ . isRealNameAuth )
if ( cookie . includes ( "app_open" ) )
ReturnMessage = ` 【账号名称】 ${ $ . nickName || $ . UserName } (wskey已实名) \n ` + ReturnMessage ;
else
ReturnMessage = ` 【账号名称】 ${ $ . nickName || $ . UserName } (已实名) \n ` + ReturnMessage ;
else
if ( cookie . includes ( "app_open" ) )
ReturnMessage = ` 【账号名称】 ${ $ . nickName || $ . UserName } (wskey未实名) \n ` + ReturnMessage ;
else
ReturnMessage = ` 【账号名称】 ${ $ . nickName || $ . UserName } (未实名) \n ` + ReturnMessage ;
} else {
ReturnMessage = ` 【账号名称】 ${ $ . nickName || $ . UserName } \n ` + ReturnMessage ;
}
if ( TempBaipiao ) {
TempBaipiao = ` 【⏰商品白嫖活动提醒⏰】 \n ` + TempBaipiao ;
ReturnMessage = TempBaipiao + ` \n ` + ReturnMessage ;
}
ReturnMessage += RemainMessage ;
if ( strAllNotify )
ReturnMessage = strAllNotify + ` \n ` + ReturnMessage ;
try {
await notify . sendNotifybyWxPucher ( strTitle , ` ${ ReturnMessage } ` , ` ${ $ . UserName } ` , undefined , strsummary ) ;
} catch {
$ . log ( ` 一对一推送异常, 请拷贝库里的sendnotify.js文件到deps目录下, 在拉库重试! ! ! \n ` ) ;
}
}
//$.msg($.name, '', ReturnMessage , {"open-url": "https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean"});
}
async function bean ( ) {
if ( EnableCheckBean && checkbeanDetailMode == 0 ) {
// console.log(`北京时间零点时间戳:${parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000}`);
// console.log(`北京时间2020-10-28 06:16:05::${new Date("2020/10/28 06:16:05+08:00").getTime()}`)
// 不管哪个时区。得到都是当前时刻北京时间的时间戳 new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000
//前一天的0:0:0时间戳
const tm = parseInt ( ( Date . now ( ) + 28800000 ) / 86400000 ) * 86400000 - 28800000 - ( 24 * 60 * 60 * 1000 ) ;
// 今天0:0:0时间戳
const tm1 = parseInt ( ( Date . now ( ) + 28800000 ) / 86400000 ) * 86400000 - 28800000 ;
let page = 1 ,
t = 0 ,
yesterdayArr = [ ] ,
todayArr = [ ] ;
do {
let response = await getJingBeanBalanceDetail ( page ) ;
await $ . wait ( 1000 ) ;
// console.log(`第${page}页: ${JSON.stringify(response)}`);
if ( response && response . code === "0" ) {
page ++ ;
let detailList = response . jingDetailList ;
if ( detailList && detailList . length > 0 ) {
for ( let item of detailList ) {
const date = item . date . replace ( /-/g , '/' ) + "+08:00" ;
if ( new Date ( date ) . getTime ( ) >= tm1 && ( ! item [ 'eventMassage' ] . includes ( "退还" ) && ! item [ 'eventMassage' ] . includes ( "物流" ) && ! item [ 'eventMassage' ] . includes ( '扣赠' ) ) ) {
todayArr . push ( item ) ;
} else if ( tm <= new Date ( date ) . getTime ( ) && new Date ( date ) . getTime ( ) < tm1 && ( ! item [ 'eventMassage' ] . includes ( "退还" ) && ! item [ 'eventMassage' ] . includes ( "物流" ) && ! item [ 'eventMassage' ] . includes ( '扣赠' ) ) ) {
//昨日的
yesterdayArr . push ( item ) ;
} else if ( tm > new Date ( date ) . getTime ( ) ) {
//前天的
t = 1 ;
break ;
}
}
} else {
$ . errorMsg = ` 数据异常 ` ;
$ . msg ( $ . name , ` ` , ` 账号 ${ $ . index } : ${ $ . nickName } \n ${ $ . errorMsg } ` ) ;
t = 1 ;
}
} else if ( response && response . code === "3" ) {
console . log ( ` cookie已过期, 或者填写不规范, 跳出 ` )
t = 1 ;
} else {
console . log ( ` 未知情况: ${ JSON . stringify ( response ) } ` ) ;
console . log ( ` 未知情况,跳出 ` )
t = 1 ;
}
} while ( t === 0 ) ;
for ( let item of yesterdayArr ) {
if ( Number ( item . amount ) > 0 ) {
$ . incomeBean += Number ( item . amount ) ;
} else if ( Number ( item . amount ) < 0 ) {
$ . expenseBean += Number ( item . amount ) ;
}
}
for ( let item of todayArr ) {
if ( Number ( item . amount ) > 0 ) {
$ . todayIncomeBean += Number ( item . amount ) ;
} else if ( Number ( item . amount ) < 0 ) {
$ . todayOutcomeBean += Number ( item . amount ) ;
}
}
$ . todayOutcomeBean = - $ . todayOutcomeBean ;
$ . expenseBean = - $ . expenseBean ;
}
if ( EnableOverBean ) {
await jingBeanDetail ( ) ; //过期京豆
}
await redPacket ( ) ;
if ( EnableChaQuan )
await getCoupon ( ) ;
}
async function Monthbean ( ) {
let time = new Date ( ) ;
let year = time . getFullYear ( ) ;
let month = parseInt ( time . getMonth ( ) ) ; //取上个月
if ( month == 0 ) {
//一月份, 取去年12月, 所以月份=12, 年份减1
month = 12 ;
year -= 1 ;
}
//开始时间 时间戳
let start = new Date ( year + "-" + month + "-01 00:00:00" ) . getTime ( ) ;
console . log ( ` 计算月京豆起始日期: ` + GetDateTime ( new Date ( year + "-" + month + "-01 00:00:00" ) ) ) ;
//结束时间 时间戳
if ( month == 12 ) {
//取去年12月, 进1个月, 所以月份=1, 年份加1
month = 1 ;
year += 1 ;
}
let end = new Date ( year + "-" + ( month + 1 ) + "-01 00:00:00" ) . getTime ( ) ;
console . log ( ` 计算月京豆结束日期: ` + GetDateTime ( new Date ( year + "-" + ( month + 1 ) + "-01 00:00:00" ) ) ) ;
let allpage = 1 ,
allt = 0 ,
allyesterdayArr = [ ] ;
do {
let response = await getJingBeanBalanceDetail ( allpage ) ;
await $ . wait ( 1000 ) ;
// console.log(`第${allpage}页: ${JSON.stringify(response)}`);
if ( response && response . code === "0" ) {
allpage ++ ;
let detailList = response . jingDetailList ;
if ( detailList && detailList . length > 0 ) {
for ( let item of detailList ) {
const date = item . date . replace ( /-/g , '/' ) + "+08:00" ;
if ( start <= new Date ( date ) . getTime ( ) && new Date ( date ) . getTime ( ) < end ) {
//日期区间内的京豆记录
allyesterdayArr . push ( item ) ;
} else if ( start > new Date ( date ) . getTime ( ) ) {
//前天的
allt = 1 ;
break ;
}
}
} else {
$ . errorMsg = ` 数据异常 ` ;
$ . msg ( $ . name , ` ` , ` 账号 ${ $ . index } : ${ $ . nickName } \n ${ $ . errorMsg } ` ) ;
allt = 1 ;
}
} else if ( response && response . code === "3" ) {
console . log ( ` cookie已过期, 或者填写不规范, 跳出 ` )
allt = 1 ;
} else {
console . log ( ` 未知情况: ${ JSON . stringify ( response ) } ` ) ;
console . log ( ` 未知情况,跳出 ` )
allt = 1 ;
}
} while ( allt === 0 ) ;
for ( let item of allyesterdayArr ) {
if ( Number ( item . amount ) > 0 ) {
$ . allincomeBean += Number ( item . amount ) ;
} else if ( Number ( item . amount ) < 0 ) {
$ . allexpenseBean += Number ( item . amount ) ;
}
}
}
function apptaskUrl ( functionId = "" , body = "" ) {
return {
url : ` ${ JD _API _HOST } ?functionId= ${ functionId } ` ,
body ,
headers : {
'Cookie' : cookie ,
'Host' : 'api.m.jd.com' ,
'Connection' : 'keep-alive' ,
'Content-Type' : 'application/x-www-form-urlencoded' ,
'Referer' : '' ,
'User-Agent' : 'JD4iPhone/167774 (iPhone; iOS 14.7.1; Scale/3.00)' ,
'Accept-Language' : 'zh-Hans-CN;q=1' ,
'Accept-Encoding' : 'gzip, deflate, br' ,
} ,
timeout : 10000
}
}
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" : $ . UA
}
}
$ . 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 ;
//$.isPlusVip=data['isPlusVip'];
$ . isRealNameAuth = data [ 'isRealNameAuth' ] ;
$ . beanCount = ( data [ 'base' ] && data [ 'base' ] . jdNum ) || 0 ;
$ . JingXiang = ( data [ 'base' ] && data [ 'base' ] . jvalue ) || 0 ;
} else {
$ . nickName = $ . UserName
}
} else {
console . log ( ` 京东服务器返回空数据 ` )
}
}
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resolve ( ) ;
}
} )
} )
}
function TotalBean2 ( ) {
return new Promise ( async ( resolve ) => {
const options = {
url : ` https://wxapp.m.jd.com/kwxhome/myJd/home.json?&useGuideModule=0&bizId=&brandId=&fromType=wxapp×tamp= ${ Date . now ( ) } ` ,
headers : {
Cookie : cookie ,
'content-type' : ` application/x-www-form-urlencoded ` ,
Connection : ` keep-alive ` ,
'Accept-Encoding' : ` gzip,compress,br,deflate ` ,
Referer : ` https://servicewechat.com/wxa5bf5ee667d91626/161/page-frame.html ` ,
Host : ` wxapp.m.jd.com ` ,
'User-Agent' : ` Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.10(0x18000a2a) NetType/WIFI Language/zh_CN ` ,
} ,
timeout : 10000
} ;
$ . post ( options , ( err , resp , data ) => {
try {
if ( err ) {
$ . logErr ( err ) ;
} else {
if ( data ) {
data = JSON . parse ( data ) ;
if ( ! data . user ) {
return ;
}
const userInfo = data . user ;
if ( userInfo ) {
if ( ! $ . nickName )
$ . nickName = userInfo . petName ;
if ( $ . beanCount == 0 ) {
$ . beanCount = userInfo . jingBean ;
}
$ . JingXiang = userInfo . uclass ;
}
} else {
$ . log ( '京东服务器返回空数据' ) ;
}
}
} catch ( e ) {
$ . logErr ( e ) ;
}
finally {
resolve ( ) ;
}
} ) ;
} ) ;
}
function wanyiwan ( ) {
return new Promise ( async ( resolve ) => {
const options = {
url : ` http://api.m.jd.com/client.action ` ,
body : ` functionId=wanyiwan_exchange_page&appid=signed_wh5&body={"version":1}&&networkType=wifi&client=ios&clientVersion= ${ $ . UA . split ( ';' ) [ 2 ] } &t= ${ Date . now ( ) } ` ,
headers : {
Cookie : cookie ,
'content-type' : ` application/x-www-form-urlencoded ` ,
// 'Accept-Encoding': `gzip,compress,br,deflate`,
Origin : ` https://pro.m.jd.com ` ,
Referer : ` https://pro.m.jd.com/ ` ,
'User-Agent' : $ . UA ,
} ,
timeout : 30000
} ;
$ . post ( options , ( err , resp , data ) => {
try {
if ( err ) {
$ . logErr ( err ) ;
} else {
if ( data ) {
data = $ . toObj ( data ) ;
if ( data . data . bizCode == 0 ) {
$ . wyw _score = data . data . result . score || 0 ;
}
} else {
$ . log ( '服务器返回空数据' ) ;
}
}
} catch ( e ) {
$ . logErr ( e ) ;
}
finally {
resolve ( ) ;
}
} ) ;
} ) ;
}
function wb _info ( ) {
return new Promise ( async ( resolve ) => {
const options = {
url : ` http://api.m.jd.com/functionId=atop_channel_my_score ` ,
body : ` appid=jd-super-market&functionId=atop_channel_my_score&client=m&body=%7B%22bizCode%22%3A%22cn_retail_jdsupermarket%22%2C%22scenario%22%3A%22sign%22%2C%22babelChannel%22%3A%22ttt1%22%2C%22isJdApp%22%3A%221%22%2C%22isWx%22%3A%220%22%7D&t= ${ Date . now ( ) } ` ,
headers : {
Cookie : cookie ,
'content-type' : ` application/x-www-form-urlencoded ` ,
// 'Accept-Encoding': `gzip,compress,br,deflate`,
Origin : ` https://pro.m.jd.com ` ,
Referer : ` https://pro.m.jd.com/ ` ,
'User-Agent' : $ . UA ,
} ,
timeout : 30000
} ;
$ . post ( options , ( err , resp , data ) => {
try {
if ( err ) {
$ . logErr ( err ) ;
} else {
if ( data ) {
data = $ . toObj ( data ) ;
if ( data . success ) {
try {
$ . wb _score = data . data . floorData . items [ 0 ] . restScore || 0 ;
$ . wb _expire = data . data . floorData . items [ 0 ] . nexp || 0 ;
} catch { }
}
} else {
$ . log ( '服务器返回空数据' ) ;
}
}
} catch ( e ) {
$ . logErr ( e ) ;
}
finally {
resolve ( ) ;
}
} ) ;
} ) ;
}
function isLoginByX1a0He ( ) {
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" ,
} ,
timeout : 10000
}
$ . 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 ` )
$ . error = ` ${ $ . nickName } : ` + ` 使用X1a0He写的接口加强检测: 未知返回... \n `
}
}
} catch ( e ) {
console . log ( e ) ;
}
finally {
resolve ( ) ;
}
} ) ;
} ) ;
}
function getJingBeanBalanceDetail ( page ) {
return new Promise ( async resolve => {
const options = {
"url" : ` https://bean.m.jd.com/beanDetail/detail.json?page= ${ page } ` ,
"body" : ` body= ${ escape ( JSON . stringify ( { "pageSize" : "20" , "page" : page . toString ( ) } ))}&appid=ld ` ,
"headers" : {
'User-Agent' : $ . UA ,
'Content-Type' : 'application/x-www-form-urlencoded' ,
'Cookie' : cookie ,
}
}
$ . post ( options , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` getJingBeanBalanceDetail API请求失败, 请检查网路重试 ` )
} else {
if ( data ) {
data = JSON . parse ( data ) ;
// console.log(data)
} else {
// console.log(`京东服务器返回空数据`)
}
}
} catch ( e ) {
// $.logErr(e, resp)
} finally {
resolve ( data ) ;
}
} )
} )
}
function jingBeanDetail ( ) {
return new Promise ( async resolve => {
setTimeout ( async ( ) => {
var strsign = "" ;
if ( epsignurl ) {
strsign = await getepsign ( 'jingBeanDetail' , { "pageSize" : "20" , "page" : "1" } ) ;
strsign = strsign . body ;
}
else
2024-07-16 00:46:19 +08:00
strsign = await dyx . getbody ( 'jingBeanDetail' , { "pageSize" : "20" , "page" : "1" } ) ;
2024-06-28 15:38:28 +08:00
const options = {
"url" : ` https://api.m.jd.com/client.action?functionId=jingBeanDetail ` ,
"body" : strsign ,
"headers" : {
'User-Agent' : $ . UA ,
'Host' : 'api.m.jd.com' ,
'Content-Type' : 'application/x-www-form-urlencoded' ,
'Cookie' : cookie ,
}
}
$ . post ( options , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` ${ $ . name } jingBeanDetail API请求失败, 请检查网路重试 ` )
} else {
if ( data ) {
data = JSON . parse ( data ) ;
if ( data ? . others ? . jingBeanExpiringInfo ? . detailList ) {
const { detailList = [ ] } = data ? . others ? . jingBeanExpiringInfo ;
detailList . map ( item => {
strGuoqi += ` 【 ${ ( item [ 'eventMassage' ] ) . replace ( "即将过期京豆" , "" ) . replace ( "年" , "-" ) . replace ( "月" , "-" ) . replace ( "日" , "" ) } 】过期 ${ item [ 'amount' ] } 豆 \n ` ;
} )
}
} else {
console . log ( ` jingBeanDetail 京东服务器返回空数据 ` )
}
}
} catch ( e ) {
if ( epsignurl )
$ . logErr ( e , resp )
else
console . log ( "因为没有指定带ep的Sign,获取过期豆子信息次数多了就会失败." )
} finally {
resolve ( data ) ;
}
} )
} , 0 * 1000 ) ;
} )
}
function getepsign ( n , o , t = "sign" ) {
let e = {
url : epsignurl ,
form : {
functionId : n , body : $ . toStr ( o ) ,
} , headers : {
'Content-Type' : 'application/x-www-form-urlencoded' ,
}
} ;
return new Promise ( n => {
$ . post ( e , async ( o , t , e ) => {
try {
o ? console . log ( o ) : e = JSON . parse ( e )
if ( e . code === 200 && e . data ) {
n ( { body : e . data . convertUrlNew } )
}
} catch ( n ) {
$ . logErr ( n , t )
} finally {
n ( { body : e . convertUrlNew } )
}
} )
} )
}
function getSignfromNolan ( functionId , body ) {
var strsign = '' ;
let data = {
"fn" : functionId ,
"body" : body
}
return new Promise ( ( resolve ) => {
let url = {
url : jdSignUrl ,
body : JSON . stringify ( data ) ,
followRedirect : false ,
headers : {
'Accept' : '*/*' ,
"accept-encoding" : "gzip, deflate, br" ,
'Content-Type' : 'application/json'
} ,
timeout : 30000
}
$ . post ( url , async ( err , resp , data ) => {
try {
data = JSON . parse ( data ) ;
if ( data && data . body ) {
if ( data . body )
strsign = data . body || '' ;
if ( strsign != '' )
resolve ( strsign ) ;
else
console . log ( "签名获取失败." ) ;
} else {
console . log ( "签名获取失败." ) ;
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
} finally {
resolve ( strsign ) ;
}
} )
} )
}
function redPacket ( ) {
return new Promise ( async resolve => {
const options = {
"url" : ` https://api.m.jd.com/client.action?functionId=myhongbao_getUsableHongBaoList&body=%7B%22appId%22%3A%22appHongBao%22%2C%22appToken%22%3A%22apphongbao_token%22%2C%22platformId%22%3A%22appHongBao%22%2C%22platformToken%22%3A%22apphongbao_token%22%2C%22platform%22%3A%221%22%2C%22orgType%22%3A%222%22%2C%22country%22%3A%22cn%22%2C%22childActivityId%22%3A%22-1%22%2C%22childActiveName%22%3A%22-1%22%2C%22childActivityTime%22%3A%22-1%22%2C%22childActivityUrl%22%3A%22-1%22%2C%22openId%22%3A%22-1%22%2C%22activityArea%22%3A%22-1%22%2C%22applicantErp%22%3A%22-1%22%2C%22eid%22%3A%22-1%22%2C%22fp%22%3A%22-1%22%2C%22shshshfp%22%3A%22-1%22%2C%22shshshfpa%22%3A%22-1%22%2C%22shshshfpb%22%3A%22-1%22%2C%22jda%22%3A%22-1%22%2C%22activityType%22%3A%221%22%2C%22isRvc%22%3A%22-1%22%2C%22pageClickKey%22%3A%22-1%22%2C%22extend%22%3A%22-1%22%2C%22organization%22%3A%22JD%22%7D&appid=JDReactMyRedEnvelope&client=apple&clientVersion=7.0.0 ` ,
"headers" : {
'Host' : 'api.m.jd.com' ,
'Accept' : '*/*' ,
'Connection' : 'keep-alive' ,
'Accept-Language' : 'zh-cn' ,
'Referer' : 'https://h5.m.jd.com/' ,
'Accept-Encoding' : 'gzip, deflate, br' ,
"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" )
}
}
$ . get ( options , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` redPacket API请求失败, 请检查网路重试 ` )
} else {
if ( data ) {
data = JSON . parse ( data ) ;
$ . jxRed = 0 ,
$ . jsRed = 0 ,
$ . jdRed = 0 ,
$ . jdhRed = 0 ,
$ . jdwxRed = 0 ,
$ . jdGeneralRed = 0 ,
$ . jxRedExpire = 0 ,
$ . jsRedExpire = 0 ,
$ . jdRedExpire = 0 ,
$ . jdhRedExpire = 0 ;
$ . jdwxRedExpire = 0 ,
$ . jdGeneralRedExpire = 0
let t = new Date ( ) ;
t . setDate ( t . getDate ( ) + 1 ) ;
t . setHours ( 0 , 0 , 0 , 0 ) ;
t = parseInt ( ( t - 1 ) / 1000 ) * 1000 ;
for ( let vo of data . hongBaoList || [ ] ) {
if ( vo . orgLimitStr ) {
if ( vo . orgLimitStr . includes ( "京喜" ) && ! vo . orgLimitStr . includes ( "特价" ) ) {
$ . jxRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jxRedExpire += parseFloat ( vo . balance )
}
continue ;
} else if ( vo . orgLimitStr . includes ( "购物小程序" ) ) {
$ . jdwxRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jdwxRedExpire += parseFloat ( vo . balance )
}
continue ;
} else if ( vo . orgLimitStr . includes ( "京东商城" ) ) {
$ . jdRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jdRedExpire += parseFloat ( vo . balance )
}
continue ;
} else if ( vo . orgLimitStr . includes ( "极速" ) || vo . orgLimitStr . includes ( "京东特价" ) || vo . orgLimitStr . includes ( "京喜特价" ) ) {
$ . jsRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jsRedExpire += parseFloat ( vo . balance )
}
continue ;
} else if ( vo . orgLimitStr && vo . orgLimitStr . includes ( "京东健康" ) ) {
$ . jdhRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jdhRedExpire += parseFloat ( vo . balance )
}
continue ;
}
}
$ . jdGeneralRed += parseFloat ( vo . balance )
if ( vo [ 'endTime' ] === t ) {
$ . jdGeneralRedExpire += parseFloat ( vo . balance )
}
}
$ . balance = ( $ . jxRed + $ . jsRed + $ . jdRed + $ . jdhRed + $ . jdwxRed + $ . jdGeneralRed ) . toFixed ( 2 ) ;
$ . jxRed = $ . jxRed . toFixed ( 2 ) ;
$ . jsRed = $ . jsRed . toFixed ( 2 ) ;
$ . jdRed = $ . jdRed . toFixed ( 2 ) ;
$ . jdhRed = $ . jdhRed . toFixed ( 2 ) ;
$ . jdwxRed = $ . jdwxRed . toFixed ( 2 ) ;
$ . jdGeneralRed = $ . jdGeneralRed . toFixed ( 2 ) ;
$ . expiredBalance = ( $ . jxRedExpire + $ . jsRedExpire + $ . jdRedExpire + $ . jdhRedExpire + $ . jdwxRedExpire + $ . jdGeneralRedExpire ) . toFixed ( 2 ) ;
$ . message += ` 【红包总额】 ${ $ . balance } (总过期 ${ $ . expiredBalance } )元 \n ` ;
if ( $ . jxRed > 0 ) {
if ( $ . jxRedExpire > 0 )
$ . message += ` 【京喜红包】 ${ $ . jxRed } (将过期 ${ $ . jxRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【京喜红包】 ${ $ . jxRed } 元 \n ` ;
}
if ( $ . jsRed > 0 ) {
if ( $ . jsRedExpire > 0 )
$ . message += ` 【京喜特价】 ${ $ . jsRed } (将过期 ${ $ . jsRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【京喜特价】 ${ $ . jsRed } 元 \n ` ;
}
if ( $ . jdRed > 0 ) {
if ( $ . jdRedExpire > 0 )
$ . message += ` 【京东红包】 ${ $ . jdRed } (将过期 ${ $ . jdRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【京东红包】 ${ $ . jdRed } 元 \n ` ;
}
if ( $ . jdhRed > 0 ) {
if ( $ . jdhRedExpire > 0 )
$ . message += ` 【健康红包】 ${ $ . jdhRed } (将过期 ${ $ . jdhRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【健康红包】 ${ $ . jdhRed } 元 \n ` ;
}
if ( $ . jdwxRed > 0 ) {
if ( $ . jdwxRedExpire > 0 )
$ . message += ` 【微信小程序】 ${ $ . jdwxRed } (将过期 ${ $ . jdwxRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【微信小程序】 ${ $ . jdwxRed } 元 \n ` ;
}
if ( $ . jdGeneralRed > 0 ) {
if ( $ . jdGeneralRedExpire > 0 )
$ . message += ` 【全平台通用】 ${ $ . jdGeneralRed } (将过期 ${ $ . jdGeneralRedExpire . toFixed ( 2 ) } )元 \n ` ;
else
$ . message += ` 【全平台通用】 ${ $ . jdGeneralRed } 元 \n ` ;
}
} else {
console . log ( ` 京东服务器返回空数据 ` )
}
}
} catch ( e ) {
$ . logErr ( e , resp )
}
finally {
resolve ( data ) ;
}
} )
} )
}
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" : $ . UA ,
'accept' : '*/*' ,
'referer' : 'https://wqs.jd.com/' ,
'accept-language' : 'zh-CN,zh;q=0.9,en;q=0.8' ,
'cookie' : cookie
} ,
timeout : 10000
}
$ . 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 <= 100 && 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 ;
var decquota = parseFloat ( useable [ i ] . quota ) . toFixed ( 2 ) ;
var decdisc = parseFloat ( useable [ i ] . discount ) . toFixed ( 2 ) ;
if ( useable [ i ] . quota > useable [ i ] . discount + 5 && useable [ i ] . discount < 2 )
continue
$ . message += ` 【全品类券】满 ${ decquota } 减 ${ decdisc } 元 ` ;
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 ( '运费券' ) > - 1 && useable [ i ] . limitStr . indexOf ( '自营商品运费' ) > - 1 ) {
if ( ! $ . YunFeiTitle ) {
$ . YunFeiTitle = useable [ i ] . couponTitle ;
$ . YunFeiQuanEndTime = new Date ( parseInt ( useable [ i ] . endTime ) ) . Format ( 'yyyy-MM-dd' ) ;
$ . YunFeiQuan += 1 ;
} else {
if ( $ . YunFeiTitle == useable [ i ] . couponTitle ) {
$ . YunFeiQuanEndTime = new Date ( parseInt ( useable [ i ] . endTime ) ) . Format ( 'yyyy-MM-dd' ) ;
$ . YunFeiQuan += 1 ;
} else {
if ( ! $ . YunFeiTitle2 )
$ . YunFeiTitle2 = useable [ i ] . couponTitle ;
if ( $ . YunFeiTitle2 == useable [ i ] . couponTitle ) {
$ . YunFeiQuanEndTime2 = new Date ( parseInt ( useable [ i ] . endTime ) ) . Format ( 'yyyy-MM-dd' ) ;
$ . YunFeiQuan2 += 1 ;
}
}
}
}
if ( useable [ i ] . couponTitle . indexOf ( '特价版APP活动' ) > - 1 && useable [ i ] . limitStr == '仅可购买活动商品' ) {
$ . beginTime = useable [ i ] . beginTime ;
if ( $ . beginTime < new Date ( ) . getTime ( ) && useable [ i ] . coupontype === 1 ) {
if ( useable [ i ] . platFormInfo )
$ . platFormInfo = useable [ i ] . platFormInfo ;
var decquota = parseFloat ( useable [ i ] . quota ) . toFixed ( 2 ) ;
var decdisc = parseFloat ( useable [ i ] . discount ) . toFixed ( 2 ) ;
$ . message += ` 【特价版券】满 ${ decquota } 减 ${ decdisc } 元 ` ;
if ( useable [ i ] . endTime < $ . todayEndTime ) {
$ . message += ` (今日过期, ${ $ . platFormInfo } ) \n ` ;
} else if ( useable [ i ] . endTime < $ . tomorrowEndTime ) {
$ . message += ` (明日将过期, ${ $ . platFormInfo } ) \n ` ;
} else {
$ . message += ` ( ${ $ . platFormInfo } ) \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 < useable [ i ] . quota )
$ . message += ` 【 ${ $ . couponType } 】满 ${ useable [ i ] . quota } 减 ${ useable [ i ] . discount } 元 ` ;
else
$ . message += ` 【 ${ $ . couponType } 】立减 ${ useable [ i ] . discount } 元 ` ;
if ( useable [ i ] . platFormInfo )
$ . platFormInfo = useable [ i ] . platFormInfo ;
//$.couponEndTime = new Date(parseInt(useable[i].endTime)).Format('yyyy-MM-dd');
if ( useable [ i ] . endTime < $ . todayEndTime ) {
$ . message += ` (今日过期, ${ $ . platFormInfo } ) \n ` ;
} else if ( useable [ i ] . endTime < $ . tomorrowEndTime ) {
$ . message += ` (明日将过期, ${ $ . platFormInfo } ) \n ` ;
} else {
$ . message += ` ( ${ $ . platFormInfo } ) \n ` ;
}
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
}
finally {
resolve ( ) ;
}
} )
} )
}
function jdfruitRequest ( function _id , body = { } , timeout = 1000 ) {
return new Promise ( resolve => {
setTimeout ( ( ) => {
$ . get ( taskfruitUrl ( function _id , body ) , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( '\n老农场: API查询请求失败 ‼️‼️' )
console . log ( JSON . stringify ( err ) ) ;
console . log ( ` function_id: ${ function _id } ` )
$ . logErr ( err ) ;
} else {
if ( safeGet ( data ) ) {
data = JSON . parse ( data ) ;
if ( data . code == "400" ) {
console . log ( '老农场: ' + data . message ) ;
llgeterror = true ;
}
else
$ . JDwaterEveryDayT = data . firstWaterInit . totalWaterTimes ;
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
}
finally {
resolve ( data ) ;
}
} )
} , timeout )
} )
}
async function getjdfruitinfo ( ) {
if ( EnableJdFruit ) {
llgeterror = false ;
//await jdfruitRequest('taskInitForFarm', {
// "version": 14,
// "channel": 1,
// "babelChannel": "120"
//});
//
//if (llgeterror)
// return
//
await fruitinfo ( ) ;
if ( llgeterror ) {
console . log ( ` 老农场API查询失败,等待10秒后再次尝试... ` )
await $ . wait ( 10 * 1000 ) ;
await fruitinfo ( ) ;
}
if ( llgeterror ) {
console . log ( ` 老农场API查询失败,有空重启路由器换个IP吧. ` )
}
}
return ;
}
async function getjdfruit ( ) {
return new Promise ( resolve => {
const option = {
url : ` ${ JD _API _HOST } ?functionId=initForFarm ` ,
body : ` body= ${ escape ( JSON . stringify ( { "version" : 4 } ))}&appid=wh5&clientVersion=9.1.0 ` ,
headers : {
"accept" : "*/*" ,
"accept-encoding" : "gzip, deflate, br" ,
"accept-language" : "zh-CN,zh;q=0.9" ,
"cache-control" : "no-cache" ,
"cookie" : cookie ,
"origin" : "https://home.m.jd.com" ,
"pragma" : "no-cache" ,
"referer" : "https://home.m.jd.com/myJd/newhome.action" ,
"sec-fetch-dest" : "empty" ,
"sec-fetch-mode" : "cors" ,
"sec-fetch-site" : "same-site" ,
"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" ) ,
"Content-Type" : "application/x-www-form-urlencoded"
} ,
timeout : 10000
} ;
$ . post ( option , ( err , resp , data ) => {
try {
if ( err ) {
if ( ! llgeterror ) {
console . log ( '\n老农场: API查询请求失败 ‼️‼️' ) ;
console . log ( JSON . stringify ( err ) ) ;
}
llgeterror = true ;
} else {
llgeterror = false ;
if ( safeGet ( data ) ) {
$ . farmInfo = JSON . parse ( data )
if ( $ . farmInfo . farmUserPro ) {
$ . JdFarmProdName = $ . farmInfo . farmUserPro . name ;
$ . JdtreeEnergy = $ . farmInfo . farmUserPro . treeEnergy ;
$ . JdtreeTotalEnergy = $ . farmInfo . farmUserPro . treeTotalEnergy ;
$ . treeState = $ . farmInfo . treeState ;
let waterEveryDayT = $ . JDwaterEveryDayT ;
let waterTotalT = ( $ . farmInfo . farmUserPro . treeTotalEnergy - $ . farmInfo . farmUserPro . treeEnergy ) / 10 ; //一共还需浇多少次水
let waterD = Math . ceil ( waterTotalT / waterEveryDayT ) ;
$ . JdwaterTotalT = waterTotalT ;
$ . JdwaterD = waterD ;
}
}
}
} catch ( e ) {
$ . logErr ( e , resp )
}
finally {
resolve ( ) ;
}
} )
} )
}
function taskfruitUrl ( function _id , body = { } ) {
return {
url : ` ${ JD _API _HOST } ?functionId= ${ function _id } &body= ${ encodeURIComponent ( JSON . stringify ( body ) ) } &appid=wh5 ` ,
headers : {
"Host" : "api.m.jd.com" ,
"Accept" : "*/*" ,
"Origin" : "https://carry.m.jd.com" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"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,zh-Hans;q=0.9" ,
"Referer" : "https://carry.m.jd.com/" ,
"Cookie" : cookie
} ,
timeout : 10000
}
}
function safeGet ( data ) {
try {
if ( typeof JSON . parse ( data ) == "object" ) {
return true ;
}
} catch ( e ) {
console . log ( e ) ;
console . log ( ` 京东服务器访问数据为空,请检查自身设备网络情况 ` ) ;
return false ;
}
}
function taskcashUrl ( functionId , body = { } ) {
const struuid = randomString ( 16 ) ;
let nowTime = Date . now ( ) ;
let _0x7683x5 = ` ${ "lite-android&" } ${ JSON [ "stringify" ] ( body ) } ${ "&android&3.1.0&" } ${ functionId } & ${ nowTime } & ${ struuid } ` ;
let _0x7683x6 = "12aea658f76e453faf803d15c40a72e0" ;
const _0x7683x7 = $ [ "isNode" ] ( ) ? require ( "crypto-js" ) : CryptoJS ;
let sign = _0x7683x7 . HmacSHA256 ( _0x7683x5 , _0x7683x6 ) . toString ( ) ;
let strurl = JD _API _HOST + "api?functionId=" + functionId + "&body=" + ` ${ escape ( JSON [ "stringify" ] ( body ) ) } &appid=lite-android&client=android&uuid= ` + struuid + ` &clientVersion=3.1.0&t= ${ nowTime } &sign= ${ sign } ` ;
return {
url : strurl ,
headers : {
'Host' : "api.m.jd.com" ,
'accept' : "*/*" ,
'kernelplatform' : "RN" ,
'user-agent' : "JDMobileLite/3.1.0 (iPad; iOS 14.4; Scale/2.00)" ,
'accept-language' : "zh-Hans-CN;q=1, ja-CN;q=0.9" ,
'Cookie' : cookie
} ,
timeout : 10000
}
}
function randomString ( e ) {
e = e || 32 ;
let t = "0123456789abcdef" ,
a = t . length ,
n = "" ;
for ( let i = 0 ; i < e ; i ++ )
n += t . charAt ( Math . floor ( Math . random ( ) * a ) ) ;
return n
}
Date . prototype . Format = function ( fmt ) {
var e ,
n = this ,
d = fmt ,
l = {
"M+" : n . getMonth ( ) + 1 ,
"d+" : n . getDate ( ) ,
"D+" : n . getDate ( ) ,
"h+" : n . getHours ( ) ,
"H+" : n . getHours ( ) ,
"m+" : n . getMinutes ( ) ,
"s+" : n . getSeconds ( ) ,
"w+" : n . getDay ( ) ,
"q+" : Math . floor ( ( n . getMonth ( ) + 3 ) / 3 ) ,
"S+" : n . getMilliseconds ( )
} ;
/(y+)/i . test ( d ) && ( d = d . replace ( RegExp . $1 , "" . concat ( n . getFullYear ( ) ) . substr ( 4 - RegExp . $1 . length ) ) ) ;
for ( var k in l ) {
if ( new RegExp ( "(" . concat ( k , ")" ) ) . test ( d ) ) {
var t ,
a = "S+" === k ? "000" : "00" ;
d = d . replace ( RegExp . $1 , 1 == RegExp . $1 . length ? l [ k ] : ( "" . concat ( a ) + l [ k ] ) . substr ( "" . concat ( l [ k ] ) . length ) )
}
}
return d ;
}
function jsonParse ( str ) {
if ( typeof str == "string" ) {
try {
return JSON . parse ( str ) ;
} catch ( e ) {
console . log ( e ) ;
$ . msg ( $ . name , '' , '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie' )
return [ ] ;
}
}
}
function timeFormat ( time ) {
let date ;
if ( time ) {
date = new Date ( time )
} else {
date = new Date ( ) ;
}
return date . getFullYear ( ) + '-' + ( ( date . getMonth ( ) + 1 ) >= 10 ? ( date . getMonth ( ) + 1 ) : '0' + ( date . getMonth ( ) + 1 ) ) + '-' + ( date . getDate ( ) >= 10 ? date . getDate ( ) : '0' + date . getDate ( ) ) ;
}
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 ;
}
async function getuserinfo ( ) {
var body = [ { "pin" : "$cooMrdGatewayUid$" } ] ;
var ua = ` jdapp;iPhone; ${ random ( [ "11.1.0" , "10.5.0" , "10.3.6" ] ) } ; ${ random ( [ "13.5" , "14.0" , "15.0" ] ) } ; ${ uuidRandom ( ) } ;network/wifi;supportApplePay/0;hasUPPay/0;hasOCPay/0;model/iPhone11,6;addressid/7565095847;supportBestPay/0;appBuild/167541;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1 ` ;
let config = {
url : 'https://lop-proxy.jd.com/JingIntegralApi/userAccount' ,
body : JSON . stringify ( body ) ,
headers : {
"host" : "lop-proxy.jd.com" ,
"jexpress-report-time" : Date . now ( ) . toString ( ) ,
"access" : "H5" ,
"source-client" : "2" ,
"accept" : "application/json, text/plain, */*" ,
"d_model" : "iPhone11,6" ,
"accept-encoding" : "gzip" ,
"lop-dn" : "jingcai.jd.com" ,
"user-agent" : ua ,
"partner" : "" ,
"screen" : "375*812" ,
"cookie" : cookie ,
"x-requested-with" : "XMLHttpRequest" ,
"version" : "1.0.0" ,
"uuid" : randomNumber ( 10 ) ,
"clientinfo" : "{\"appName\":\"jingcai\",\"client\":\"m\"}" ,
"d_brand" : "iPhone" ,
"appparams" : "{\"appid\":158,\"ticket_type\":\"m\"}" ,
"sdkversion" : "1.0.7" ,
"area" : area ( ) ,
"client" : "iOS" ,
"referer" : "https://jingcai-h5.jd.com/" ,
"eid" : "" ,
"osversion" : random ( [ "13.5" , "14.0" , "15.0" ] ) ,
"networktype" : "wifi" ,
"jexpress-trace-id" : uuid ( ) ,
"origin" : "https://jingcai-h5.jd.com" ,
"app-key" : "jexpress" ,
"event-id" : uuid ( ) ,
"clientversion" : random ( [ "11.1.0" , "10.5.0" , "10.3.6" ] ) ,
"content-type" : "application/json;charset=utf-8" ,
"build" : "167541" ,
"biz-type" : "service-monitor" ,
"forcebot" : "0"
}
}
return new Promise ( resolve => {
$ . post ( config , async ( err , resp , data ) => {
try {
//console.log(data)
if ( err ) {
console . log ( err )
} else {
data = JSON . parse ( data ) ;
}
} catch ( e ) {
$ . logErr ( e , resp )
}
finally {
resolve ( data || '' ) ;
}
} )
} )
}
function dwappinfo ( ) {
let ts = Date . now ( ) ;
let opt = {
url : ` https://dwapp.jd.com/user/dwSignInfo ` ,
body : JSON . stringify ( { "t" : ts , "channelSource" : "txzs" , "encStr" : CR . MD5 ( ts + 'e9c398ffcb2d4824b4d0a703e38yffdd' ) . toString ( ) } ) ,
headers : {
'Origin' : 'https://txsm-m.jd.com' ,
'Content-Type' : 'application/json' ,
'User-Agent' : $ . UA ,
'Cookie' : cookie
}
}
return new Promise ( async ( resolve ) => {
$ . post ( opt , async ( err , resp , data ) => {
let ccc = '' ;
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` dwappinfo 请求失败,请检查网路重试 ` )
} else {
data = JSON . parse ( data ) ;
if ( data . code == 200 ) {
ccc = data . data . balanceNum ;
} else {
console . log ( data . msg ) ;
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
} finally {
resolve ( ccc ) ;
}
} )
} )
}
function dwappexpire ( ) {
let opt = {
url : ` https://api.m.jd.com/api?functionId=DATAWALLET_USER_QUERY_EXPIRED_SCORE&appid=h5-sep&body=%7B%22expireDayNum%22%3A7%7D&client=m&clientVersion=6.0.0 ` ,
headers : {
'Origin' : 'https://prodev.m.jd.com' ,
'User-Agent' : $ . UA ,
'Cookie' : cookie
}
}
return new Promise ( async ( resolve ) => {
$ . post ( opt , async ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` dwappexpire 请求失败,请检查网路重试 ` )
} else {
data = JSON . parse ( data )
if ( data . code == 200 ) {
data = data . data . expireNum ;
} else {
//console.log(data.msg);
data = '' ;
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
} finally {
resolve ( data ) ;
}
} )
} )
}
function getek ( ) {
let opt = {
url : ` https://mygiftcard.jd.com/giftcard/queryChannelUserCard ` ,
//body: `appid=wh5&clientVersion=1.0.0&functionId=wanrentuan_superise_send&body={"channel":2}&area=2_2813_61130_0`,
headers : {
//'Host': 'api.m.jd.com',
'Origin' : 'https://o.jd.com' ,
'Content-Type' : 'application/x-www-form-urlencoded' ,
'User-Agent' : $ . UA ,
'Cookie' : cookie
}
}
return new Promise ( async ( resolve ) => {
$ . get ( opt , async ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` getek请求失败!!!! ` )
} else {
data = JSON . parse ( data )
if ( data . code == 000000 ) {
$ . ECardinfo = Number ( data . data . totalAmount ) ;
} else {
console . log ( data . msg )
}
}
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resolve ( data )
}
} )
} )
}
function marketCard ( ) {
let opt = {
url : ` https://api.m.jd.com/atop_channel_marketCard_cardInfo ` ,
body : ` appid=jd-super-market&t= ${ Date . now ( ) } &functionId=atop_channel_marketCard_cardInfo&client=m&uuid=&body=%7B%22babelChannel%22%3A%22ttt9%22%2C%22isJdApp%22%3A%221%22%2C%22isWx%22%3A%220%22%7D ` ,
headers : {
'Origin' : 'https://pro.m.jd.com' ,
'User-Agent' : $ . UA ,
'Cookie' : cookie
}
}
let carddata = '' ;
return new Promise ( async ( resolve ) => {
$ . post ( opt , async ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` marketCard 请求失败,请检查网路重试 ` )
} else {
data = JSON . parse ( data )
if ( data . success ) {
carddata = data . data ? . floorData ? . items ? data . data ? . floorData ? . items [ 0 ] . marketCardVO : '' ;
} else {
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
} finally {
resolve ( carddata ) ;
}
} )
} )
}
function newfarm _info ( ) {
let opt = {
url : ` https://api.m.jd.com/client.action ` ,
body : ` appid=signed_wh5&client=android&clientVersion=12.4.2&screen=393*0&wqDefault=false&build=99108&osVersion=12&t= ${ Date . now ( ) } &body={"version":1,"type":1}&functionId=farm_award_detail ` ,
headers : {
'Origin' : 'https://h5.m.jd.com' ,
'User-Agent' : $ . UA ,
'Cookie' : cookie
}
}
return new Promise ( async ( resolve ) => {
$ . post ( opt , async ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` ${ JSON . stringify ( err ) } ` )
console . log ( ` newfarm_info 请求失败,请检查网路重试 ` )
} else {
data = JSON . parse ( data ) ;
if ( data . data . success ) {
if ( data . data . result . plantAwards && data . data . result . plantAwards . length > 0 ) {
for ( let i of data . data . result . plantAwards ) {
if ( i . awardStatus == 1 ) {
$ . newfarm _info = ` ${ i . skuName } -> ${ i . exchangeRemind } ` ;
}
}
}
} else {
}
}
} catch ( e ) {
$ . logErr ( e , resp ) ;
} finally {
resolve ( ) ;
}
} )
} )
}
function area ( ) {
let i = getRand ( 1 , 30 )
let o = getRand ( 70 , 3000 )
let x = getRand ( 900 , 60000 )
let g = getRand ( 600 , 30000 )
let a = i + '_' + o + '_' + x + '_' + g ;
return a
} ;
function getRand ( min , max ) {
return parseInt ( Math . random ( ) * ( max - min ) ) + min ;
} ;
function uuid ( ) {
var s = [ ] ;
var hexDigits = "0123456789abcdef" ;
for ( var i = 0 ; i < 36 ; i ++ ) {
s [ i ] = hexDigits . substr ( Math . floor ( Math . random ( ) * 0x10 ) , 1 ) ;
}
s [ 14 ] = "4" ;
s [ 19 ] = hexDigits . substr ( ( s [ 19 ] & 0x3 ) | 0x8 , 1 ) ;
s [ 8 ] = s [ 13 ] = s [ 18 ] = s [ 23 ] = "-" ;
var uuid = s . join ( "" ) ;
return uuid ;
} ;
function uuidRandom ( ) {
return Math . random ( ) . toString ( 16 ) . slice ( 2 , 10 ) +
Math . random ( ) . toString ( 16 ) . slice ( 2 , 10 ) +
Math . random ( ) . toString ( 16 ) . slice ( 2 , 10 ) +
Math . random ( ) . toString ( 16 ) . slice ( 2 , 10 ) +
Math . random ( ) . toString ( 16 ) . slice ( 2 , 10 ) ;
}
function random ( arr ) {
return arr [ Math . floor ( Math . random ( ) * arr . length ) ] ;
}
function randomNumber ( len ) {
let chars = '0123456789' ;
let maxPos = chars . length ;
let str = '' ;
for ( let i = 0 ; i < len ; i ++ ) {
str += chars . charAt ( Math . floor ( Math . random ( ) * maxPos ) ) ;
}
return Date . now ( ) + str ;
}
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 )
}