2021-10-26 19:20:52 +08:00
/*
* 由ZCY01二次修改:脚本默认� � 行
* 由 X1a0He 修� :� 然� � 脚本默认� � 行
* 如需è¿� è¡Œè¯·è‡ªè¡Œæ·»åŠ çŽ¯å¢ƒå� ˜é‡� :JD_TRY,值填 true å� ³å� ¯è¿� 行
* TG交� 群:https://t.me/jd_zero205
* TG通知频é� “:https://t.me/jd_zero205_tz
*
update 2021/09/05
京东试用:脚本更新地å� € https://github.com/zero205/JD_tencent_scf/raw/main/jd_try.js
脚本兼容: Node.js
� 天最多关注300个商店,但用户商店关注上� 为500个。
请é…� å� ˆå� –关脚本试用,使用 jd_unsubscribe.js æ� � å‰� å� –关至少250个商店确ä¿� 京东试用脚本æ£å¸¸è¿� 行。
*
* X1a0Heç•™
* 由于没有兼容Qx,原脚本已失效,建议原脚本的兼容Qxæ³¨é‡Šåˆ äº†
* 脚本是å� ¦è€—æ—¶å� ªçœ‹args_xh.maxLength的大å°�
* 上一作者说了æ¯� 天最多300个商店,总上é™� 为500个,jd_unsubscribe.js我已更新为批é‡� å� –关版
* 请æ� � å‰� å� –关至少250个商店确ä¿� 京东试用脚本æ£å¸¸è¿� 行
* 没有写通知,是å� ¦ç”³è¯·æˆ� 功没有进行通知,但脚本会把状æ€� log出日志
*/
2021-11-09 14:13:03 +08:00
let dingtalk = "https://oapi.dingtalk.com/robot/send?access_token=d2b6042cb38f0df63e20797c002208d2710104750c18a1dc84d54106a859a3f0"
let dingtalk1 = "https://oapi.dingtalk.com/robot/send?access_token=a3e80da6f064321881fc38e43a07bfde7a61b6f18245454520fb749556cebfcd"
2021-11-10 23:07:52 +08:00
let dingtalk2 = "https://oapi.dingtalk.com/robot/send?access_token=1832f969da101ef8273e8ba2258f06f15ec34bc22282066b28ab617042a7a9b6"
2021-11-09 14:13:03 +08:00
let getManName = ""
let totalPages = 999999 //总页数
const $ = new Env ( '京东试用' )
2021-11-10 23:07:52 +08:00
let roleMap = {
"jd_4521b375ebb5d" : "锟å� 怪" ,
"jd_542c10c0222bc" : "康å� 怪" ,
"jd_66dcb31363ef6" : "æ¶›å� 怪" ,
"jd_45d917547c763" : "跑腿� 怪" ,
"417040678_m" : "æ–Œå� 怪" ,
"jd_73d88459d908e" : "æ� °æ� °å� " ,
"381550701lol" : "漪漪å� " ,
"jd_4333d5dc1ac5f" : "èˆ’æ¥ å� " ,
"jd_66ea783827d30" : "军å� " ,
"jd_4311ac0ff4456" : "å±…å� "
}
2021-11-09 14:13:03 +08:00
const URL = 'https://api.m.jd.com/client.action'
let trialActivityIdList = [ ]
let sensMessage = "试用\n\n"
let trialActivityTitleList = [ ]
let notifyMsg = ''
let message = ""
let minItemValue = 500
let wordLength = 1000
let process = {
env : {
"JD_TRY" : "true"
}
}
// default params
let args _xh = {
channelEnd : Math . floor ( Math . random ( ) * ( 4 ) + 3 ) ,
channel : [ 1 , 2 , 3 , 4 , 5 , 10 , 12 , 15 ] ,
maxSize : 15 ,
listCount : 0 ,
/*
* 是å� ¦è¿›è¡Œé€šçŸ¥
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_NOTIFY
* */
// isNotify: process.env.JD_TRY_NOTIFY || true,
// 商å“� åŽŸä»·ï¼Œä½ŽäºŽè¿™ä¸ªä»·æ ¼éƒ½ä¸� 会试用
jdPrice : 15 ,
/*
* 获å� –试用商å“� 类型,默认为1
* 1 - 精选
* 2 - 闪电试用
* 3 - 家用电器(å� ¯èƒ½ä¼šæœ‰å� ˜åŒ–)
* 4 - 手机数ç � (å� ¯èƒ½ä¼šæœ‰å� ˜åŒ–)
* 5 - 电脑办公(å� ¯èƒ½ä¼šæœ‰å� ˜åŒ–)
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_TABID
* */
// TODO: tab ids as array(support multi tabIds)
// tabId: process.env.JD_TRY_TABID && process.env.JD_TRY_TABID.split('@').map(Number) || [1],
tabId : process . env . JD _TRY _TABID || 1 ,
/*
* 试用商å“� æ ‡é¢˜è¿‡æ»¤
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_TITLEFILTERS,关键è¯� 与关键è¯� 之间用@分隔
* */
2021-11-10 23:07:52 +08:00
titleFilters : [ "登山包" , "抵用券" , "急救箱" , "染头å� ‘è†� " , "å� ˜å”‡è†� " , "弹力带" , "儿童零食" , "儿童剪头å� ‘工具" , "平剪牙剪刀打薄剪刀" , "刘海内扣直å� ‘器" , "益生è� Œå°� Eæ� ¡æ¼±å� £æ°´" , "二锅头" , "锿³•士干脆é� ¢æ–¹ä¾¿é� ¢24袋整箱装" , "樱ã� ®è‰²é±¼å� é…±" , "轻酸瓶3%" , "é� ’æ±� " , "隔离霜" , "åŽ»æž£æ ¸ " , "å·� å“� 社" , "矶钓钓鱼é…� ä»¶" , "棉线结矶æ� †" , "å� Šåœ†æ»‘漂挡" , "远投路滑é…� ä»¶" , "滑漂座" , "软电线" , "激光剑" , "ç� é¼ " , "æ€� 维棋" , "å� Œå±‚片" , "猫用" , "鼻腔喷雾" , "电脑包" , "鸥曼GTL" , "å� §é“ºæ¯›æ¯¯" , "å� Œå¯¼å� ‘ " , "翻页笔" , "蛋白肽" , "Tå� £å¼¯å¤´" , "货车用å“� " , "床垫套" , "电焊护脚" , "G100" , "擦车清æ´� 工具" , "掸å� " , "å°„ç� ¯" , "欧布圣剑" , "超比ä¹� " , "滚梳直柄" , "å‡� 胶糖果" , "DHA藻油" , "水带" , "摘果神器" , "å®� å®� 儿童零食" , "总å¤� ä¹ " , "满分冲刺" , "黄冈" , "å°� 状元" , "é’“é±¼æ� ’ä»¶" , "寒å� ‡ä½œä¸š" , "作业" , "è� œç½©" , "手机线" , "美容油" , "è´ºå� ¡" , "眼贴" , "å°� 斗篷" , "å°� å©å� æ¼”å¥� " , "ç � 柴刀" , "消防应急ç� ¯" , "é£Ÿç”¨è‰²ç´ " , "烘焙彩针糖果" , "德尔地æ� ¿" , "水管ä¿� 温套" , "水管é� “" , "定ä½� 器" , "追踪器" , "电瓶" , "快递纸箱" , "尤克里里" , "金龙鱼 é� ¢æ� ¡æŒ‚é� ¢" , "痛风" , "KVM切æ� ¢å™¨" , "æ°´æ³¥" , "猫ç½� 头" , "去斑霜" , "0-12å²� " , "4/3膜" , "FMJ" , "H10E" , "HDMI" , "HEISHA" , "HPV" , "KB216有线键盘" , "LED" , "MS116 æœ‰çº¿é¼ æ ‡" , "N1162æœ‰çº¿é¼ æ ‡" , "Ockered" , "PVCæ� ¿" , "SD" , "SDå� ¡" , "SMOVES" , "SUP掌机" , "U盘" , "VGA" , "hdmi" , "hpv" , "led开关电æº� " , "uv镜" , "win10" , "windows" , "一次性" , "一片装" , "一盒" , "万å� ‘滑轮" , "万用表" , "万藓ç� µ" , "三角阀" , "三轮车" , "ä¸� å¹²èƒ¶æ ‡ç¾å¸¦" , "专å� ‡æœ¬" , "专用贴" , "ä¸� 袜" , "ä¸å›½ç”µä¿¡" , "ä¸å›½ç»“" , "ä¸å¤®æ‰¶æ‰‹ç®±" , "䏿€§æ°´ç¬”" , "䏿€§ç¬”" , "ä¸è€� å¹´" , "丰胸" , "串ç� 玩具" , "丸" , "乒乓ç� ƒ" , "ä¹� ä¹� 乘法" , "ä¹� ä¹� 乘除" , "书包" , "乳液" , "乳腺" , "交æ� ¢" , "交æ� ¢æœº" , "产å“� 体验" , "享底价" , "亲å� 互动" , "亿优信" , "ä»“é¼ é›¶é£Ÿ" , "仿真å°� 蛋糕" , "伊å¨� " , "优盘" , "会员" , "会员å� ¡" , "会议æ� ¯å� " , "会议记录" , "ä¼ è� œé“ƒ" , "体温计" , "体验装" , "侧挂å¼� " , "便秘" , "ä¿� å� ¥" , "ä¿� 护壳" , "ä¿� 护套" , "ä¿� 护膜" , "ä¿� 护镜" , "ä¿� 暖女裤" , "ä¿� 暖裤" , "ä¿� 温棉" , "ä¿� 鲜膜" , "ä¿¡å°� " , "信纸" , "修护" , "ä¿®æ£å¸¦" , "修眉" , "修眉剪" , "倒车" , "倒车镜" , "å� ‡å� ‘ " , "å� ‡ç� «æ¯›" , "å� œè½¦ç‰Œ" , "å� ¥åº·æ£€æµ‹" , "储奶袋" , "å„¿ç«¥n95" , "儿童串ç� 玩具" , "å„¿ç«¥ä¹� å›" , "儿童便æ� ·" , "å„¿ç«¥ä¿� 温水æ� ¯" , "儿童医生" , "å„¿ç«¥å� £ç½©" , "å„¿ç«¥å� ¸ç®¡" , "儿童奶粉" , "å„¿ç«¥æˆ� é•¿" , "儿童拌é¥" , "儿童暖暖套" , "儿童椅å� " , "å„¿ç«¥æ²� 浴露" , "儿童牙è†� " , "儿童玩具枪" , "儿童电动牙刷" , "儿童电è¯� 手表" , "儿童益生è� Œ" , "儿童磨牙饼" , "儿童背包" , "å„¿ç«¥éš� 身" , "儿童雨伞" , "充电头" , "充电桩" , "光和é� ’春" , "光驱" , "å…� 钉胶水" , "å…«å€� 镜" , "公主项链" , "公文包" , "å…»èŠ� å ‚ " , "内胆包" , "内衣" , "内裤" , "冰箱贴" , "冰袋" , "冷兵器" , "冷å‡� 胶" , "冷敷贴" , "冻干粉" , "净水剂" , "å‡� 关镜" , "å‡� è‚¥" , "凳å� 套" , "刀头" , "刀片" , "分æµ� " , "分æµ� 器" , "分线盒" , "切割片" , "切è� œæ� ¿" , "创å� ¯è´´" , "刨木" , "别针" , "刮痧" , "刮痧æ� ¿" , "刷头" , "刷å� " , "刷牙头" , "刹车油" , "刺激贴" , "剂" , "剃须刀é…� ä»¶" , "削皮刀" , "å‰� 列腺" , "剥虾" , "剪" , "剪钳" , "割è� ‰æœº" , "办公会议茶æ� ¯" , "办公å®� " , "办公æ� ¯" , "åŠ å¯†ç‹—" , "åŠ æ¸©å™¨" , "å‹¿æ‹� " , "包皮" , "包装膜" , "化妆" , "匙扣" , "医生" , "å� Šèº«ä¸� é� ‚ " , "å� Šèº«è£™" , "å� •æ‹� ä¸� å� ‘è´§" , "å� ¡å†Œ" , "å� ¡å¥—" , "å� ¡å°º" , "å� ¡æ‰˜" , "å� ¡ç‰Œ" , "å� ¡é’ˆ" , "å� §é“ºåž«" , "å� ¸å¦†" , "å� ¸å¦†æ°´" , "压差表" , "压片" , "去毛器" , "去角质" , "å� ‚肽片" , "å� Œé� ¢æ� ¿" , "å� � å…‰æ� ¡è´´" , "å� � å…‰æ� ¿" , "å� � 光贴" , "å� � 光镜" , "å� � 弹器" , "å� ˜èº«å™¨" , "å� £ç� ´ " , "å� £çº¢" , "å� £ç½©" , "å� £ç½©ç›’" , "å� £è…”" , "å� £è…”抑è� Œ" , "å� £é¦™ç³–" , "å� °ç� ¯" , "å� °è´¦æœ¬" , "å� ·ç � å� ¡" , "å� ƒé¥è¡£" , "å� ˆæˆ� 机油" , "å� Œä»� å ‚ " , "å� Žè†œ" , "å� ¯åŠ¨ç”µæº� " , "å� ¸å¥¶å™¨" , "å� ¸é¡¶ç� ¯" , "告知牌" , "周å²
2021-11-09 14:13:03 +08:00
// è¯•ç”¨ä»·æ ¼(ä¸äº†è¦� 花多少钱)ï¼Œé«˜äºŽè¿™ä¸ªä»·æ ¼éƒ½ä¸� 会试用,å°� 于ç‰äºŽæ‰� 会试用
trialPrice: 0,
/*
* 最å°� æ� � 供数é‡� ,例如试用商å“� å� ªæ� � ä¾›2ä»½è¯•ç”¨èµ„æ ¼ï¼Œå½“å‰� 设置为1,则会进行申请
* è‹¥å� ªæ� � ä¾›5åˆ†è¯•ç”¨èµ„æ ¼ï¼Œå½“å‰� 设置为10,则ä¸� 会申请
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_MINSUPPLYNUM
* */
minSupplyNum: 20,
/*
* 过滤大于设定值的已申请人数,例如下é� ¢è®¾ç½®çš„1000,A商å“� å·²ç»� 有1001人申请了,则A商å“� ä¸� 会进行申请,会被跳过
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_APPLYNUMFILTER
* */
applyNumFilter: process.env.JD_TRY_APPLYNUMFILTER || 99999,
/*
* 商å“� 试用之间和获å� –商å“� 之间的间隔, å� •ä½� :毫秒(1ç§’=1000毫秒)
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_APPLYINTERVAL
* */
applyInterval: process.env.JD_TRY_APPLYINTERVAL || 5000,
/*
* 商å“� 数组的最大长度,通俗æ� ¥è¯´å°±æ˜¯å� ³å°†ç”³è¯·çš„商å“� 队列长度
* 例如设置为20,当第一次获å� –å� ŽèŽ·å¾—12件,过滤å� Žå‰©ä¸‹5件,将会进行第二次获å� –,过滤å� ŽåŠ ä¸Šç¬¬ä¸€æ¬¡å‰©ä½™ä»¶æ•°
* 例如是18件,将会进行第三次获å� –,直到过滤完毕å� Žä¸º20ä»¶æ‰� 会å� œæ¢ï¼Œä¸� 建议设置太大
* å� ¯è®¾ç½®çŽ¯å¢ƒå� ˜é‡� :JD_TRY_MAXLENGTH
* */
maxLength: 10
}
!(async () => {
// console.log(`\n本脚本默认ä¸� è¿� 行,也ä¸� 建议è¿� 行\n如需è¿� è¡Œè¯·è‡ªè¡Œæ·»åŠ çŽ¯å¢ƒå� ˜é‡� :JD_TRY,值填:true\n`)
await $.wait(1000)
if (process.env.JD_TRY && process.env.JD_TRY === 'true') {
await requireConfig()
if (!$.cookiesArr[0]) {
$.msg($.name, 'ã€� æ� � 示】请先获å� –京东账å� ·ä¸€cookie\n直接使用NobyDa的京东ç¾åˆ°èŽ·å� –', 'https://bean.m.jd.com/', {
" open - url ": " https : //bean.m.jd.com/"
} )
return
}
for ( let i = 0 ; i < $ . cookiesArr . length ; i ++ ) {
message += "<font color=\'#FFA500\'>[通知] </font><font color=\'#006400\' size='3'>� 机试用</font> \n\n --- \n\n"
await $ . wait ( Math . floor ( Math . random ( ) * ( 175000 ) + 5000 ) ) ;
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 请é‡� 新登录获å� – \n https://bean.m.jd.com/bean/signIndex.action ` , {
"open-url" : "https://bean.m.jd.com/bean/signIndex.action"
} ) ;
await $ . notify . sendNotify ( ` ${ $ . name } cookie已失效 - ${ $ . UserName } ` , ` 京东账å� · ${ $ . index } ${ $ . UserName } \n 请é‡� 新登录获å� –cookie ` ) ;
continue
}
username = $ . UserName
2021-11-10 23:07:52 +08:00
//èµ°å� ¦å¤–的途径å� ¦å¤–处ç� †
if ( $ . UserName == "jd_66ea783827d30" || $ . UserName == "jd_45d917547c763" ) {
getManName = roleMap [ username ]
justGetGain ( )
2021-11-09 14:13:03 +08:00
continue
}
2021-11-10 23:07:52 +08:00
if ( roleMap [ username ] != undefined ) {
username = roleMap [ username ]
2021-11-09 14:13:03 +08:00
}
2021-11-10 23:07:52 +08:00
2021-11-09 14:13:03 +08:00
getManName = username
args _xh . maxLength = Math . floor ( Math . random ( ) * ( 20 ) + 10 )
let list = getList ( )
//åŠ ä¸Šå� � ç§°
message = message + "<font color=\'#778899\' size=2>� 羊毛� 妹】<font color=\'#FFA500\' size=3>" + username + " </font> </font> \n\n "
message = message + "<font color=\'#778899\' size=2>" + "数� 大� :" + args _xh . maxLength + "申请列表:" + list + "</font> </font> \n\n "
$ . totalTry = 0
$ . totalSuccess = 0
let size = 1 ;
m = i
for ( let i = 0 ; i < list . length ; i ++ ) {
args _xh . maxSize = Math . floor ( Math . random ( ) * ( 30 ) + 10 )
message = message + "<font color=\'#FF0000\' size=2>" + "最大列表长度:" + args _xh . maxSize + " 申请列表:" + list [ i ] + "</font> </font> \n\n"
while ( args _xh . listCount + trialActivityIdList . length < args _xh . maxLength && size < args _xh . maxSize && size < totalPages - 1 ) {
console . log ( ` \n æ£åœ¨è¿›è¡Œç¬¬ ${ size } 次获å� –试用商å“� \n ` )
console . log ( ` \n 当å‰� 产å“� 页é� ¢æ€»é•¿åº¦ä¸º ${ totalPages } 页 \n ` )
await try _feedsList ( list [ i ] , size ++ )
2021-11-10 09:42:02 +08:00
if ( m == 1 && sensMessage . length > wordLength ) {
2021-11-09 14:13:03 +08:00
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
console . log ( "-----------------------------------" )
postToDingTalk1 ( sensMessage )
sensMessage = "试用\n\n"
} else {
console . log ( "------------清空------------" )
console . log ( "------------清空------------" )
sensMessage = "试用\n\n"
}
if ( args _xh . listCount + trialActivityIdList . length < args _xh . maxLength ) {
args _xh . applyInterval = Math . floor ( Math . random ( ) * ( 4000 ) + 5000 )
console . log ( ` 间隔延时ä¸ï¼Œè¯·ç‰å¾… ${ args _xh . applyInterval } ms ` )
await $ . wait ( args _xh . applyInterval ) ;
}
}
args _xh . listCount += trialActivityIdList . length
console . log ( "æ£åœ¨æ‰§è¡Œè¯•用申请..." )
await $ . wait ( args _xh . applyInterval ) ;
for ( let i = 0 ; i < trialActivityIdList . length ; i ++ ) {
args _xh . applyInterval = Math . floor ( Math . random ( ) * ( 4000 ) + 5000 )
await try _apply ( trialActivityTitleList [ i ] , trialActivityIdList [ i ] )
console . log ( ` 间隔延时ä¸ï¼Œè¯·ç‰å¾… ${ args _xh . applyInterval } ms \n ` )
await $ . wait ( args _xh . applyInterval ) ;
}
message = message + "<font color=\'#33ff00\' size=2>" + "本循环申请数� :" + trialActivityIdList . length + "总� � 制为:" + args _xh . listCount + "</font> </font> \n\n "
trialActivityIdList = [ ]
trialActivityTitleList = [ ]
size = 1
totalPages == 999999
}
console . log ( "试用申请执行完毕..." )
// await try_MyTrials(1, 1) //申请ä¸çš„商å“�
await try _MyTrials ( 1 , 2 ) //申请� 功的商�
// await try_MyTrials(1, 3) //申请失败的商�
await showMsg ( )
//下一个� � 新去拉列表
trialActivityIdList = [ ]
trialActivityTitleList = [ ]
await $ . wait ( Math . floor ( Math . random ( ) * ( 15000 ) + 5000 ) ) ;
}
args _xh . listCount = 0
postToDingTalk ( message )
message = ""
totalPages == 999999
}
await $ . notify . sendNotify ( ` ${ $ . name } ` , notifyMsg ) ;
} else {
console . log ( ` \n 您未设置è¿� 行ã€� 京东试用】脚本,结æ� Ÿè¿� 行ï¼� \n ` )
}
} ) ( ) . catch ( ( e ) => {
postToDingTalk ( e + message )
console . log ( ` â� —ï¸� ${ $ . name } è¿� 行错误ï¼� \n ${ e } ` )
} ) . finally ( ( ) => {
$ . done ( )
} )
2021-11-10 23:07:52 +08:00
function justGetGain ( ) {
message = message + "<font color=\'#778899\' size=2>� 羊毛� 妹】<font color=\'#FFA500\' size=3>" + username + " </font> </font> \n\n "
2021-11-10 23:16:41 +08:00
try _MyTrials ( 1 , 2 ) //申请� 功的商�
showMsg ( )
2021-11-10 23:07:52 +08:00
//下一个� � 新去拉列表
trialActivityIdList = [ ]
trialActivityTitleList = [ ]
args _xh . listCount = 0
postToDingTalk ( message )
message = ""
totalPages == 999999
}
2021-11-09 14:13:03 +08:00
function getList ( ) {
for ( i = 0 ; i < Math . floor ( Math . random ( ) * ( 5001 ) + 500 ) ; i ++ ) {
index1 = Math . floor ( Math . random ( ) * ( args _xh . channel . length ) + 0 )
index2 = Math . floor ( Math . random ( ) * ( args _xh . channel . length ) + 0 )
temp = args _xh . channel [ index1 ]
args _xh . channel [ index1 ] = args _xh . channel [ index2 ]
args _xh . channel [ index2 ] = temp
}
return args _xh . channel . slice ( 0 , args _xh . channelEnd )
}
function requireConfig ( ) {
return new Promise ( resolve => {
console . log ( '开始获å� –é…� 置文件\n' )
$ . notify = $ . isNode ( ) ? require ( './sendNotify' ) : { sendNotify : async ( ) => { } }
//获å� – Cookies
$ . cookiesArr = [ ]
if ( $ . isNode ( ) ) {
//Node.js用户请在jdCookie.js处填写京东ck;
const jdCookieNode = require ( './jdCookie.js' ) ;
Object . keys ( jdCookieNode ) . forEach ( ( item ) => {
if ( jdCookieNode [ item ] ) {
$ . cookiesArr . push ( jdCookieNode [ item ] )
}
} )
if ( process . env . JD _DEBUG && process . env . JD _DEBUG === 'false' ) console . log = ( ) => { } ;
} else {
//IOSç‰ç”¨æˆ·ç›´æŽ¥ç”¨NobyDaçš„jd $.cookie
$ . cookiesArr = [ $ . getdata ( 'CookieJD' ) , $ . getdata ( 'CookieJD2' ) , ... jsonParse ( $ . getdata ( 'CookiesJD' ) || "[]" ) . map ( item => item . cookie ) ] . filter ( item => ! ! item ) ;
}
console . log ( ` å…± ${ $ . cookiesArr . length } 个京东账å� · \n ` )
for ( const key in args _xh ) {
if ( typeof args _xh [ key ] == 'string' ) {
args _xh [ key ] = Number ( args _xh [ key ] )
}
}
// console.debug(args_xh)
resolve ( )
} )
}
//获å� –商å“� 列表并且过滤 By X1a0He
function try _feedsList ( tabId , page ) {
return new Promise ( ( resolve , reject ) => {
const body = JSON . stringify ( {
"tabId" : ` ${ tabId } ` ,
"page" : page ,
"previewTime" : ""
} ) ;
let option = taskurl _xh ( 'newtry' , 'try_feedsList' , body )
$ . get ( option , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` 🚫 ${ arguments . callee . name . toString ( ) } API请求失败,请检查网路 \n ${ JSON . stringify ( err ) } ` )
} else {
// console.debug(data)
// return
data = JSON . parse ( data )
if ( totalPages == 999999 ) {
message = message + "<font color=\'#FF0000\' size=2>" + " 当� 最大页数为:" + data . data . pages + "</font> </font> \n\n"
}
if ( data . success ) {
$ . totalPages = data . data . pages
totalPages = data . data . pages
console . log ( ` 获å� –到商å“� ${ data . data . feedList . length } æ� ¡ \n ` )
for ( let i = 0 ; i < data . data . feedList . length ; i ++ ) {
if ( args _xh . listCount + trialActivityIdList . length >= args _xh . maxLength ) {
console . log ( '商å“� 列表长度已满.结æ� ŸèŽ·å� –' )
} else
if ( data . data . feedList [ i ] . applyState === 1 ) {
console . log ( ` 商� 已申请试用: ${ data . data . feedList [ i ] . skuTitle } ` )
continue
} else
if ( data . data . feedList [ i ] . applyState !== null ) {
console . log ( ` 商� 状� 异常,跳过: ${ data . data . feedList [ i ] . skuTitle } ` )
continue
} else
if ( data . data . feedList [ i ] . skuTitle ) {
console . log ( ` 检测第 ${ page } 页 第 ${ i + 1 } 个商� \n ${ data . data . feedList [ i ] . skuTitle } ` )
if ( parseFloat ( data . data . feedList [ i ] . jdPrice ) <= args _xh . jdPrice ) {
console . log ( ` 商� 被过滤, ${ data . data . feedList [ i ] . jdPrice } < ${ args _xh . jdPrice } \n ` )
2021-11-10 23:07:52 +08:00
} else if ( parseFloat ( data . data . feedList [ i ] . applyNum ) > args _xh . applyNumFilter && data . data . feedList [ i ] . applyNum !== null ) {
2021-11-09 14:13:03 +08:00
console . log ( ` 商� 被过滤,已申请试用人数大于预设人数 \n ` )
} else if ( args _xh . titleFilters . some ( fileter _word => data . data . feedList [ i ] . skuTitle . includes ( fileter _word ) ) ) {
sensMessage += "<font color=\'#FF0000\' size=2>" + data . data . feedList [ i ] . skuTitle + "</font> </font> \n\n"
args _xh . titleFilters . some ( fileter _word => {
if ( data . data . feedList [ i ] . skuTitle . includes ( fileter _word ) ) {
sensMessage += "<font color=\'#000099\' size=2>" + "� 感� 汇:" + fileter _word + "</font> </font> \n\n"
}
2021-10-26 19:20:52 +08:00
} )
2021-11-09 14:13:03 +08:00
console . log ( '商å“� 被过滤,å� «æœ‰å…³é”®è¯� \n' )
2021-11-10 23:07:52 +08:00
} else if ( parseFloat ( data . data . feedList [ i ] . trialPrice ) > args _xh . trialPrice && data . data . feedList [ i ] . jdPrice < minItemValue ) {
sensMessage += "<font color=\'#FF0000\' size=2>" + data . data . feedList [ i ] . skuTitle + "</font> </font> \n\n"
sensMessage += "<font color=\'#FF0000\' size=2>" + "需� 花费:" + parseFloat ( data . data . feedList [ i ] . trialPrice ) + "</font> </font> \n\n"
sensMessage += "<font color=\'#FF0000\' size=2>" + "实际价值:" + parseFloat ( data . data . feedList [ i ] . jdPrice ) + "</font> </font> \n\n"
console . log ( ` 商å“� è¢«è¿‡æ»¤ï¼ŒæœŸå¾…ä»·æ ¼é«˜äºŽé¢„è®¾ä»·æ ¼ \n ` )
} else if ( parseFloat ( data . data . feedList [ i ] . supplyNum ) > args _xh . minSupplyNum && data . data . feedList [ i ] . supplyNum !== null ) {
console . log ( ` 商å“� 被过滤,æ� � 供申请的份数大于预设申请的份数 \n ` )
sensMessage += "<font color=\'#FF0000\' size=2>" + data . data . feedList [ i ] . skuTitle + "</font> </font> \n\n"
sensMessage += "<font color=\'#FF0000\' size=2>" + "æ� � 供申请的份数为:" + parseFloat ( data . data . feedList [ i ] . supplyNum ) + "</font> </font> \n\n"
2021-11-09 14:13:03 +08:00
} else {
console . log ( ` 商å“� é€šè¿‡ï¼Œå°†åŠ å…¥è¯•ç”¨ç»„ï¼ŒtrialActivityId为 ${ data . data . feedList [ i ] . trialActivityId } \n ` )
trialActivityIdList . push ( data . data . feedList [ i ] . trialActivityId )
trialActivityTitleList . push ( data . data . feedList [ i ] . skuTitle )
}
} else {
console . log ( 'skuTitle解� 异常' )
return
}
}
console . log ( ` 当� 试用组id如下,长度为: ${ trialActivityIdList . length } \n ${ trialActivityIdList } \n ` )
} else {
console . log ( ` 💩 获得试用列表失败: ${ data . message } ` )
}
}
} catch ( e ) {
console . log ( e ) ;
reject ( ` ⚠� ${ arguments . callee . name . toString ( ) } API返回结果解� 出错 \n ${ e } \n ${ JSON . stringify ( data ) } ` )
console . log ( ` ${ JSON . stringify ( data ) } ` )
} finally {
resolve ( )
}
} )
} )
}
function try _apply ( title , activityId ) {
return new Promise ( ( resolve , reject ) => {
console . log ( ` 申请试用商å“� ä¸... ` )
console . log ( ` 商� : ${ title } ` )
console . log ( ` id为: ${ activityId } ` )
const body = JSON . stringify ( {
"activityId" : activityId ,
"previewTime" : ""
} ) ;
let option = taskurl _xh ( 'newtry' , 'try_apply' , body )
$ . get ( option , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` 🚫 ${ arguments . callee . name . toString ( ) } API请求失败,请检查网路 \n ${ JSON . stringify ( err ) } ` )
} else {
$ . totalTry ++
data = JSON . parse ( data )
if ( data . success && data . code === "1" ) { // 申请� 功
message += "<font color=\'#778899\' size=2>" + title + "</font>\n\n"
message += "<font color=\'#778899\' size=2>" + ` ------- \n \n ` + "</font>\n\n"
console . log ( data . message )
$ . totalSuccess ++
} else if ( data . code === "-106" ) {
console . log ( data . message ) // 未在申请时间内�
} else if ( data . code === "-110" ) {
console . log ( data . message ) // 您的申请已æˆ� 功æ� � 交,请勿é‡� å¤� 申请…
} else if ( data . code === "-120" ) {
console . log ( data . message ) // 您还ä¸� 是会员,本å“� å� ªé™� 会员申请试用,请注册会员å� Žç”³è¯·ï¼�
} else if ( data . code === "-167" ) {
console . log ( data . message ) // 抱æ‰ï¼Œæ¤è¯•用需为ç§� è� ‰å®˜æ‰� 能申请。查看下方详情了解更多。
} else {
console . log ( "申请失败" , JSON . stringify ( data ) )
}
}
} catch ( e ) {
reject ( ` ⚠� ${ arguments . callee . name . toString ( ) } API返回结果解� 出错 \n ${ e } \n ${ JSON . stringify ( data ) } ` )
} finally {
resolve ( )
}
} )
} )
}
function try _MyTrials ( page , selected ) {
return new Promise ( ( resolve , reject ) => {
switch ( selected ) {
case 1 :
console . log ( 'æ£åœ¨èŽ·å� –已申请的商å“� ...' )
break ;
case 2 :
console . log ( 'æ£åœ¨èŽ·å� –申请æˆ� 功的商å“� ...' )
break ;
case 3 :
console . log ( 'æ£åœ¨èŽ·å� –申请失败的商å“� ...' )
break ;
default :
console . log ( 'selected错误' )
}
const body = JSON . stringify ( {
"page" : page ,
"selected" : selected , // 1 - 已申请 2 - � 功列表,3 - 失败列表
"previewTime" : ""
} ) ;
let option = taskurl _xh ( 'newtry' , 'try_MyTrials' , body )
option . headers . Referer = 'https://pro.m.jd.com/'
$ . get ( option , ( err , resp , data ) => {
try {
if ( err ) {
console . log ( ` 🚫 ${ arguments . callee . name . toString ( ) } API请求失败,请检查网路 \n ${ JSON . stringify ( err ) } ` )
} else {
// console.log(data)
// return
data = JSON . parse ( data )
if ( data . success ) {
//temp adjustment
if ( selected == 2 ) {
if ( data . success && data . data ) {
$ . successList = data . data . list . filter ( item => {
return item . text . text . includes ( 'è¯•ç”¨èµ„æ ¼å°†ä¿� ç•™10天' )
} )
console . log ( ` 待领å� – : ${ $ . successList . length } 个 ` )
} else {
console . log ( ` 获得� 功列表失败: ${ data . message } ` )
}
}
if ( data . data . list . length > 0 ) {
let count = 0
for ( let item of data . data . list ) {
console . log ( ` 申请时间: ${ new Date ( parseInt ( item . applyTime ) ) . toLocaleString ( ) } ` )
console . log ( ` 申请商� : ${ item . trialName } ` )
console . log ( ` 当� 状� : ${ item . text . text } ` )
console . log ( ` 剩余时间: ${ remaining ( item . leftTime ) } ` )
if ( count < 3 ) {
message += "<font color=\'#4B0082\' size=1>" + ` 申请商� : ${ item . trialName } ` + "</font>\n\n"
message += "<font color=\'#4B0082\' size=1>" + ` 申请时间: ${ new Date ( parseInt ( item . applyTime ) ) . toLocaleString ( ) } ` + "</font>\n\n"
message += "<font color=\'#4B0082\' size=1>" + ` 当� 状� : ${ item . text . text } ` + "</font>\n\n"
message += "<font color=\'#4B0082\' size=1>" + ` 剩余时间: ${ remaining ( item . leftTime ) } ` + "</font>\n\n"
message += "<font color=\'#4B0082\' size=1>" + ` ----- \n \n ` + "</font>\n\n"
count ++
}
2021-11-10 09:42:02 +08:00
if ( item . text . text . includes ( 'è¯•ç”¨èµ„æ ¼å°†ä¿� ç•™10天' ) ) {
2021-11-09 14:13:03 +08:00
message1 = "<font color=\'#4B0082\' size=1>" + ` ${ getManName } ,ä½ çš„å•†å“� 待领å� –,请尽快领å� – ` + "</font>\n\n"
message1 += "<font color=\'#4B0082\' size=1>" + ` 申请商� : ${ item . trialName } ` + "</font>\n\n"
message1 += "<font color=\'#4B0082\' size=1>" + ` 剩余时间: ${ remaining ( item . leftTime ) } ` + "</font>\n\n"
postToDingTalk2 ( message1 )
}
console . log ( )
}
}
// else {
// switch(selected){
// case 1:
// console.log('æ— å·²ç”³è¯·çš„å•†å“� \n')
// break;
// case 2:
// console.log('æ— ç”³è¯·æˆ� 功的商å“� \n')
// break;
// case 3:
// console.log('æ— ç”³è¯·å¤±è´¥çš„å•†å“� \n')
// break;
// default:
// console.log('selected错误')
// }
// }
} else {
console . log ( ` ERROR:try_MyTrials ` )
}
}
} catch ( e ) {
reject ( ` ⚠� ${ arguments . callee . name . toString ( ) } API返回结果解� 出错 \n ${ e } \n ${ JSON . stringify ( data ) } ` )
} finally {
resolve ( )
}
} )
} )
}
function remaining ( time ) {
let days = parseInt ( time / ( 1000 * 60 * 60 * 24 ) ) ;
let hours = parseInt ( ( time % ( 1000 * 60 * 60 * 24 ) ) / ( 1000 * 60 * 60 ) ) ;
let minutes = parseInt ( ( time % ( 1000 * 60 * 60 ) ) / ( 1000 * 60 ) ) ;
return ` ${ days } 天 ${ hours } � 时 ${ minutes } 分 `
}
function taskurl _xh ( appid , functionId , body = JSON . stringify ( { } ) ) {
return {
"url" : ` ${ URL } ?appid= ${ appid } &functionId= ${ functionId } &clientVersion=10.1.2&client=wh5&body= ${ encodeURIComponent ( body ) } ` ,
'headers' : {
'Host' : 'api.m.jd.com' ,
'Accept-Encoding' : 'gzip, deflate, br' ,
'Cookie' : $ . cookie ,
'Connection' : 'keep-alive' ,
'UserAgent' : 'jdapp;iPhone;10.1.2;15.0;ff2caa92a8529e4788a34b3d8d4df66d9573f499;network/wifi;model/iPhone13,4;addressid/2074196292;appBuild/167802;jdSupportDarkMode/1;Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1' ,
'Accept-Language' : 'zh-cn' ,
'Referer' : 'https://prodev.m.jd.com/'
} ,
}
}
async function showMsg ( ) {
let message1 = ` 京东账å� · ${ $ . index } ${ $ . nickName || $ . UserName } \n 🎉 本次申请: ${ $ . totalSuccess } / ${ $ . totalTry } 个商å“� 🛒 \n 🎉 ${ $ . successList . length } 个商å“� 待领å� – `
message += "<font color=\'#778899\' size=2>" + ` 🎉 本次申请: ${ $ . totalSuccess } / ${ $ . totalTry } 个商å“� 🛒 \n 🎉 ${ $ . successList . length } 个商å“� 待领å� – ` + "</font>\n\n"
if ( ! args _xh . jdNotify || args _xh . jdNotify === 'false' ) {
$ . msg ( $ . name , ` ` , message1 , {
"open-url" : 'https://try.m.jd.com/user'
} )
if ( $ . isNode ( ) )
notifyMsg += ` ${ message1 } \n \n `
} else {
console . log ( message1 )
}
}
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" )
} ,
"timeout" : 10000 ,
}
$ . 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 [ ] ;
}
}
}
// æ� ¥è‡ª @chavyleung 大佬
// https://raw.githubusercontent.com/chavyleung/scripts/master/Env.js
function Env ( name , opts ) {
class Http {
constructor ( env ) {
this . env = env
}
send ( opts , method = 'GET' ) {
opts = typeof opts === 'string' ? {
url : opts
} : opts
let sender = this . get
if ( method === 'POST' ) {
sender = this . post
}
return new Promise ( ( resolve , reject ) => {
sender . call ( this , opts , ( err , resp , body ) => {
if ( err ) reject ( err )
else resolve ( resp )
} )
} )
}
get ( opts ) {
return this . send . call ( this . env , opts )
}
post ( opts ) {
return this . send . call ( this . env , opts , 'POST' )
}
}
return new ( class {
constructor ( name , opts ) {
this . name = name
this . http = new Http ( this )
this . data = null
this . dataFile = 'box.dat'
this . logs = [ ]
this . isMute = false
this . isNeedRewrite = false
this . logSeparator = '\n'
this . startTime = new Date ( ) . getTime ( )
Object . assign ( this , opts )
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 ( str , defaultValue = null ) {
try {
return JSON . parse ( str )
} catch {
return defaultValue
}
}
toStr ( obj , defaultValue = null ) {
try {
return JSON . stringify ( obj )
} catch {
return defaultValue
}
}
getjson ( key , defaultValue ) {
let json = defaultValue
const val = this . getdata ( key )
if ( val ) {
try {
json = JSON . parse ( this . getdata ( key ) )
} catch { }
}
return json
}
setjson ( val , key ) {
try {
return this . setdata ( JSON . stringify ( val ) , key )
} catch {
return false
}
}
getScript ( url ) {
return new Promise ( ( resolve ) => {
this . get ( {
url
} , ( err , resp , body ) => resolve ( body ) )
} )
}
runScript ( script , runOpts ) {
return new Promise ( ( resolve ) => {
let httpapi = this . getdata ( '@chavy_boxjs_userCfgs.httpapi' )
httpapi = httpapi ? httpapi . replace ( /\n/g , '' ) . trim ( ) : httpapi
let httpapi _timeout = this . getdata ( '@chavy_boxjs_userCfgs.httpapi_timeout' )
httpapi _timeout = httpapi _timeout ? httpapi _timeout * 1 : 20
httpapi _timeout = runOpts && runOpts . timeout ? runOpts . timeout : httpapi _timeout
const [ key , addr ] = httpapi . split ( '@' )
const opts = {
url : ` http:// ${ addr } /v1/scripting/evaluate ` ,
body : {
script _text : script ,
mock _type : 'cron' ,
timeout : httpapi _timeout
} ,
headers : {
'X-Key' : key ,
'Accept' : '*/*'
}
}
this . post ( opts , ( err , resp , body ) => resolve ( body ) )
} ) . catch ( ( e ) => this . logErr ( e ) )
}
loaddata ( ) {
if ( this . isNode ( ) ) {
this . fs = this . fs ? this . fs : require ( 'fs' )
this . path = this . path ? this . path : require ( 'path' )
const curDirDataFilePath = this . path . resolve ( this . dataFile )
const rootDirDataFilePath = this . path . resolve ( process . cwd ( ) , this . dataFile )
const isCurDirDataFile = this . fs . existsSync ( curDirDataFilePath )
const isRootDirDataFile = ! isCurDirDataFile && this . fs . existsSync ( rootDirDataFilePath )
if ( isCurDirDataFile || isRootDirDataFile ) {
const datPath = isCurDirDataFile ? curDirDataFilePath : rootDirDataFilePath
try {
return JSON . parse ( this . fs . readFileSync ( datPath ) )
} catch ( e ) {
return { }
}
} else return { }
} else return { }
}
writedata ( ) {
if ( this . isNode ( ) ) {
this . fs = this . fs ? this . fs : require ( 'fs' )
this . path = this . path ? this . path : require ( 'path' )
const curDirDataFilePath = this . path . resolve ( this . dataFile )
const rootDirDataFilePath = this . path . resolve ( process . cwd ( ) , this . dataFile )
const isCurDirDataFile = this . fs . existsSync ( curDirDataFilePath )
const isRootDirDataFile = ! isCurDirDataFile && this . fs . existsSync ( rootDirDataFilePath )
const jsondata = JSON . stringify ( this . data )
if ( isCurDirDataFile ) {
this . fs . writeFileSync ( curDirDataFilePath , jsondata )
} else if ( isRootDirDataFile ) {
this . fs . writeFileSync ( rootDirDataFilePath , jsondata )
} else {
this . fs . writeFileSync ( curDirDataFilePath , jsondata )
}
}
}
lodash _get ( source , path , defaultValue = undefined ) {
const paths = path . replace ( /\[(\d+)\]/g , '.$1' ) . split ( '.' )
let result = source
for ( const p of paths ) {
result = Object ( result ) [ p ]
if ( result === undefined ) {
return defaultValue
}
}
return result
}
lodash _set ( obj , path , value ) {
if ( Object ( obj ) !== obj ) return obj
if ( ! Array . isArray ( path ) ) path = path . toString ( ) . match ( /[^.[\]]+/g ) || [ ]
path . slice ( 0 , - 1 ) . reduce ( ( a , c , i ) => ( Object ( a [ c ] ) === a [ c ] ? a [ c ] : ( a [ c ] = Math . abs ( path [ i + 1 ] ) >> 0 === + path [ i + 1 ] ? [ ] : { } ) ) , obj ) [
path [ path . length - 1 ]
] = value
return obj
}
getdata ( key ) {
let val = this . getval ( key )
// 如果以 @
if ( /^@/ . test ( key ) ) {
const [ , objkey , paths ] = /^@(.*?)\.(.*?)$/ . exec ( key )
const objval = objkey ? this . getval ( objkey ) : ''
if ( objval ) {
try {
const objedval = JSON . parse ( objval )
val = objedval ? this . lodash _get ( objedval , paths , '' ) : val
} catch ( e ) {
val = ''
}
}
}
return val
}
setdata ( val , key ) {
let issuc = false
if ( /^@/ . test ( key ) ) {
const [ , objkey , paths ] = /^@(.*?)\.(.*?)$/ . exec ( key )
const objdat = this . getval ( objkey )
const objval = objkey ? ( objdat === 'null' ? null : objdat || '{}' ) : '{}'
try {
const objedval = JSON . parse ( objval )
this . lodash _set ( objedval , paths , val )
issuc = this . setval ( JSON . stringify ( objedval ) , objkey )
} catch ( e ) {
const objedval = { }
this . lodash _set ( objedval , paths , val )
issuc = this . setval ( JSON . stringify ( objedval ) , objkey )
}
} else {
issuc = this . setval ( val , key )
}
return issuc
}
getval ( key ) {
if ( this . isSurge ( ) || this . isLoon ( ) ) {
return $persistentStore . read ( key )
} else if ( this . isQuanX ( ) ) {
return $prefs . valueForKey ( key )
} else if ( this . isNode ( ) ) {
this . data = this . loaddata ( )
return this . data [ key ]
} else {
return ( this . data && this . data [ key ] ) || null
}
}
setval ( val , key ) {
if ( this . isSurge ( ) || this . isLoon ( ) ) {
return $persistentStore . write ( val , key )
} else if ( this . isQuanX ( ) ) {
return $prefs . setValueForKey ( val , key )
} else if ( this . isNode ( ) ) {
this . data = this . loaddata ( )
this . data [ key ] = val
this . writedata ( )
return true
} else {
return ( this . data && this . data [ key ] ) || null
}
}
initGotEnv ( opts ) {
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 ( )
if ( opts ) {
opts . headers = opts . headers ? opts . headers : { }
if ( undefined === opts . headers . Cookie && undefined === opts . cookieJar ) {
opts . cookieJar = this . ckjar
}
}
}
get ( opts , callback = ( ) => { } ) {
if ( opts . headers ) {
delete opts . headers [ 'Content-Type' ]
delete opts . headers [ 'Content-Length' ]
}
if ( this . isSurge ( ) || this . isLoon ( ) ) {
if ( this . isSurge ( ) && this . isNeedRewrite ) {
opts . headers = opts . headers || { }
Object . assign ( opts . headers , {
'X-Surge-Skip-Scripting' : false
} )
}
$httpClient . get ( opts , ( err , resp , body ) => {
if ( ! err && resp ) {
resp . body = body
resp . statusCode = resp . status
}
callback ( err , resp , body )
} )
} else if ( this . isQuanX ( ) ) {
if ( this . isNeedRewrite ) {
opts . opts = opts . opts || { }
Object . assign ( opts . opts , {
hints : false
} )
}
$task . fetch ( opts ) . then (
( resp ) => {
const {
statusCode : status ,
statusCode ,
headers ,
body
} = resp
callback ( null , {
status ,
statusCode ,
headers ,
body
} , body )
} ,
( err ) => callback ( err )
)
} else if ( this . isNode ( ) ) {
this . initGotEnv ( opts )
this . got ( opts ) . on ( 'redirect' , ( resp , nextOpts ) => {
try {
if ( resp . headers [ 'set-cookie' ] ) {
const ck = resp . headers [ 'set-cookie' ] . map ( this . cktough . Cookie . parse ) . toString ( )
if ( ck ) {
this . ckjar . setCookieSync ( ck , null )
}
nextOpts . cookieJar = this . ckjar
}
} catch ( e ) {
this . logErr ( e )
}
// this.ckjar.setCookieSync(resp.headers['set-cookie'].map(Cookie.parse).toString())
} ) . then (
( resp ) => {
const {
statusCode : status ,
statusCode ,
headers ,
body
} = resp
callback ( null , {
status ,
statusCode ,
headers ,
body
} , body )
} ,
( err ) => {
const {
message : error ,
response : resp
} = err
callback ( error , resp , resp && resp . body )
}
)
}
}
post ( opts , callback = ( ) => { } ) {
// 如果指定了请求体, 但没指定`Content-Type`, 则自动生�
if ( opts . body && opts . headers && ! opts . headers [ 'Content-Type' ] ) {
opts . headers [ 'Content-Type' ] = 'application/x-www-form-urlencoded'
}
if ( opts . headers ) delete opts . headers [ 'Content-Length' ]
if ( this . isSurge ( ) || this . isLoon ( ) ) {
if ( this . isSurge ( ) && this . isNeedRewrite ) {
opts . headers = opts . headers || { }
Object . assign ( opts . headers , {
'X-Surge-Skip-Scripting' : false
} )
}
$httpClient . post ( opts , ( err , resp , body ) => {
if ( ! err && resp ) {
resp . body = body
resp . statusCode = resp . status
}
callback ( err , resp , body )
} )
} else if ( this . isQuanX ( ) ) {
opts . method = 'POST'
if ( this . isNeedRewrite ) {
opts . opts = opts . opts || { }
Object . assign ( opts . opts , {
hints : false
} )
}
$task . fetch ( opts ) . then (
( resp ) => {
const {
statusCode : status ,
statusCode ,
headers ,
body
} = resp
callback ( null , {
status ,
statusCode ,
headers ,
body
} , body )
} ,
( err ) => callback ( err )
)
} else if ( this . isNode ( ) ) {
this . initGotEnv ( opts )
const {
url ,
... _opts
} = opts
this . got . post ( url , _opts ) . then (
( resp ) => {
const {
statusCode : status ,
statusCode ,
headers ,
body
} = resp
callback ( null , {
status ,
statusCode ,
headers ,
body
} , body )
} ,
( err ) => {
const {
message : error ,
response : resp
} = err
callback ( error , resp , resp && resp . body )
}
)
}
}
/**
*
* 示例:$.time('yyyy-MM-dd qq HH:mm:ss.S')
* :$.time('yyyyMMddHHmmssS')
* y:å¹´ M:月 d:æ—¥ q:å£ H:æ—¶ m:分 s:ç§’ S:毫秒
* å…¶ä¸yå� ¯é€‰0-4ä½� å� ä½� 符ã€� Så� ¯é€‰0-1ä½� å� ä½� 符,其余å� ¯é€‰0-2ä½� å� ä½� 符
* @param {*} fmt æ ¼å¼� 化å� ‚æ•°
*
*/
time ( fmt ) {
let o = {
'M+' : new Date ( ) . getMonth ( ) + 1 ,
'd+' : new Date ( ) . getDate ( ) ,
'H+' : new Date ( ) . getHours ( ) ,
'm+' : new Date ( ) . getMinutes ( ) ,
's+' : new Date ( ) . getSeconds ( ) ,
'q+' : Math . floor ( ( new Date ( ) . getMonth ( ) + 3 ) / 3 ) ,
'S' : new Date ( ) . getMilliseconds ( )
}
if ( /(y+)/ . test ( fmt ) ) fmt = fmt . replace ( RegExp . $1 , ( new Date ( ) . getFullYear ( ) + '' ) . substr ( 4 - RegExp . $1 . length ) )
for ( let k in o )
if ( new RegExp ( '(' + k + ')' ) . test ( fmt ) )
fmt = fmt . replace ( RegExp . $1 , RegExp . $1 . length == 1 ? o [ k ] : ( '00' + o [ k ] ) . substr ( ( '' + o [ k ] ) . length ) )
return fmt
}
/**
* 系统通知
*
* > 通知å� ‚æ•°: å� Œæ—¶æ”¯æŒ� QuanX å’Œ Loon 两ç§� æ ¼å¼� , EnvJsæ ¹æ� ®è¿� 行环境自动转æ� ¢, Surge 环境ä¸� 支æŒ� 多媒体通知
*
* 示例:
* $.msg(title, subt, desc, 'twitter://')
* $.msg(title, subt, desc, { 'open-url': 'twitter://', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' })
* $.msg(title, subt, desc, { 'open-url': 'https://bing.com', 'media-url': 'https://github.githubassets.com/images/modules/open_graph/github-mark.png' })
*
* @param {*} title æ ‡é¢˜
* @param {*} subt å‰¯æ ‡é¢˜
* @param {*} desc 通知详情
* @param {*} opts 通知å� ‚æ•°
*
*/
msg ( title = name , subt = '' , desc = '' , opts ) {
const toEnvOpts = ( rawopts ) => {
if ( ! rawopts ) return rawopts
if ( typeof rawopts === 'string' ) {
if ( this . isLoon ( ) ) return rawopts
else if ( this . isQuanX ( ) ) return {
'open-url' : rawopts
}
else if ( this . isSurge ( ) ) return {
url : rawopts
}
else return undefined
} else if ( typeof rawopts === 'object' ) {
if ( this . isLoon ( ) ) {
let openUrl = rawopts . openUrl || rawopts . url || rawopts [ 'open-url' ]
let mediaUrl = rawopts . mediaUrl || rawopts [ 'media-url' ]
return {
openUrl ,
mediaUrl
}
} else if ( this . isQuanX ( ) ) {
let openUrl = rawopts [ 'open-url' ] || rawopts . url || rawopts . openUrl
let mediaUrl = rawopts [ 'media-url' ] || rawopts . mediaUrl
return {
'open-url' : openUrl ,
'media-url' : mediaUrl
}
} else if ( this . isSurge ( ) ) {
let openUrl = rawopts . url || rawopts . openUrl || rawopts [ 'open-url' ]
return {
url : openUrl
}
}
} else {
return undefined
}
}
if ( ! this . isMute ) {
if ( this . isSurge ( ) || this . isLoon ( ) ) {
$notification . post ( title , subt , desc , toEnvOpts ( opts ) )
} else if ( this . isQuanX ( ) ) {
$notify ( title , subt , desc , toEnvOpts ( opts ) )
}
}
if ( ! this . isMuteLog ) {
let logs = [ '' , '==============📣系统通知📣==============' ]
logs . push ( title )
subt ? logs . push ( subt ) : ''
desc ? logs . push ( desc ) : ''
console . log ( logs . join ( '\n' ) )
this . logs = this . logs . concat ( logs )
}
}
log ( ... logs ) {
if ( logs . length > 0 ) {
this . logs = [ ... this . logs , ... logs ]
}
console . log ( logs . join ( this . logSeparator ) )
}
logErr ( err , msg ) {
const isPrintSack = ! this . isSurge ( ) && ! this . isQuanX ( ) && ! this . isLoon ( )
if ( ! isPrintSack ) {
this . log ( '' , ` â� —ï¸� ${ this . name } , 错误! ` , err )
} else {
this . log ( '' , ` â� —ï¸� ${ this . name } , 错误! ` , err . stack )
}
}
wait ( time ) {
return new Promise ( ( resolve ) => setTimeout ( resolve , time ) )
}
done ( val = { } ) {
const endTime = new Date ( ) . getTime ( )
const costTime = ( endTime - this . startTime ) / 1000
this . log ( '' , ` 🔔 ${ this . name } , 结æ� Ÿ! 🕛 ${ costTime } ç§’ ` )
this . log ( )
if ( this . isSurge ( ) || this . isQuanX ( ) || this . isLoon ( ) ) {
$done ( val )
}
}
} ) ( name , opts )
}
//æˆ‘åŠ çš„å‡½æ•°
function postToDingTalk ( messgae ) {
const message1 = "" + messgae
// that.log(messgae)
const body = {
"msgtype" : "markdown" ,
"markdown" : {
"title" : "� 机试用" ,
"text" : message1
} ,
"at" : {
"atMobiles" : [ ] ,
2021-11-10 09:42:02 +08:00
"isAtAll" : false
2021-11-09 14:13:03 +08:00
}
}
$ . post ( toDingtalk ( dingtalk , JSON . stringify ( body ) ) , ( data , status , xhr ) => {
try {
that . log ( resp )
that . log ( data )
if ( err ) {
that . log ( JSON . stringify ( err ) ) ;
$ . logErr ( err ) ;
} else {
if ( safeGet ( data ) ) {
$ . duckRes = JSON . parse ( data ) ;
}
}
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resolve ( ) ;
}
} , "json" )
}
function toDingtalk ( urlmain , bodyMain ) {
return {
url : urlmain ,
body : bodyMain ,
headers : { 'Content-Type' : 'application/json;charset=utf-8' } ,
timeout : 10000 ,
}
}
function postToDingTalk1 ( messgae ) {
2021-10-26 19:20:52 +08:00
const message1 = "" + messgae
// that.log(messgae)
const body = {
"msgtype" : "markdown" ,
"markdown" : {
"title" : "错误ç›é€‰" ,
"text" : message1
} ,
"at" : {
"atMobiles" : [ ] ,
"isAtAll" : false
}
}
$ . post ( toDingtalk ( dingtalk1 , JSON . stringify ( body ) ) , ( data , status , xhr ) => {
try {
that . log ( resp )
that . log ( data )
if ( err ) {
that . log ( JSON . stringify ( err ) ) ;
$ . logErr ( err ) ;
} else {
if ( safeGet ( data ) ) {
$ . duckRes = JSON . parse ( data ) ;
}
}
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resolve ( ) ;
}
} , "json" )
2021-11-09 14:13:03 +08:00
}
function postToDingTalk2 ( messgae ) {
const message1 = "" + messgae
// that.log(messgae)
const body = {
"msgtype" : "markdown" ,
"markdown" : {
"title" : "éš� 机试用(待领å� –)" ,
"text" : message1
} ,
"at" : {
"atMobiles" : [ ] ,
"isAtAll" : true
}
}
$ . post ( toDingtalk ( dingtalk2 , JSON . stringify ( body ) ) , ( data , status , xhr ) => {
try {
that . log ( resp )
that . log ( data )
if ( err ) {
that . log ( JSON . stringify ( err ) ) ;
$ . logErr ( err ) ;
} else {
if ( safeGet ( data ) ) {
$ . duckRes = JSON . parse ( data ) ;
}
}
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resolve ( ) ;
}
} , "json" )
2021-10-26 19:20:52 +08:00
}