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出日志
*/
let dingtalk = "https://oapi.dingtalk.com/robot/send?access_token=d2b6042cb38f0df63e20797c002208d2710104750c18a1dc84d54106a859a3f0"
let dingtalk1 = "https://oapi.dingtalk.com/robot/send?access_token=a3e80da6f064321881fc38e43a07bfde7a61b6f18245454520fb749556cebfcd"
let totalPages = 999999 //总页数
const $ = new Env ( '京东试用' )
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 : process . env . JD _TRY _PRICE || 0 ,
/*
* 获å� –试用商å“� 类型,默认为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-10-26 19:55:18 +08:00
titleFilters : [ "门档" , "地å� ¸ " , "地桩" , "玻璃" , "清æ´� ç� ƒ" , "é’¢ä¸� ç� ƒ" , "消毒液" , "泡澡ç� ƒ" , "隔音耳塞" , "翻分器" , "眼罩" , "乒乓ç� ƒ" , "布袋" , "枕头套" , "ä»“é¼ é›¶é£Ÿ" , "胸包" , "书包" , "周å²� " , "抓周" , "干眼症" , "密ç � é”� " , "防滑垫" , "椅背置物袋" , "艾è„� è´´" , "车内清æ´� " , "清æ´� 刷" , "香薰" , "防疫" , "密å°� 袋" , "æ—©æ•™" , "ä¿� 鲜膜" , "底座" , "万å� ‘滑轮" , "高å� ‡ä¸“" , "专å� ‡æœ¬" , "å¦åކ" , "床头å� °ç� ¯" , "收敛水" , "鸡毛掸å� " , "ä¸å›½ç»“" , "匙扣" , "糖糖粉" , "ç� è� ‡" , "è‹� è� ‡è� ¯" , "è‹� è� ‡æ‹� " , "å� ‡å� ‘ " , "è¡¥å� ‘ " , "é™¶ç“·ç“¶" , "冷兵器" , "汽车椅背" , "擦玻璃" , "垃圾袋" , "擦窗" , "平光镜" , "眼镜" , "气垫霜" , "ç� ƒå¸½" , "食ç›� " , "彩铅" , "手动幕" , "玻ç� 幕" , "玻ç� " , "电脑电æº� " , "切è� œæ� ¿" , "éš”çƒæ£‰" , "过滤棉" , "å›è‰ºå·¥å…·" , "ç � è� œåˆ€" , "枇æ� ·ç§‹æ¢¨è†� " , "唑溶液" , "滑å� —袋" , "育苗盘" , "éš”çƒæ� ¿" , "碟å� " , "é…µç´ " , "å„¿ç«¥å� ¸ç®¡" , "体温计" , "茗æ� ¯" , "ç ‚é”…" , "呼噜" , "湿粮" , "è†� ç›–è´´" , "é� ¢é…±" , "切è� œæ� ¿" , "æ²¹ç½� " , "油壶" , "茶具" , "èŒ¶å® " , "眼è� ¯æ°´" , "体温计" , "å„¿ç«¥ä¹� å›" , "çƒæ•·åŒ…" , "茶壶" , "ä¿� 温棉" , "å� Œé� ¢æ� ¿" , "消防水带" , "æ‘„åƒ� 头" , "除è� Œæ´—地液" , "地é� ¢æ¸…æ´� æ¶²" , "清æ´� é…� ä»¶" , "洗地专用" , "鱼缸" , "鱼竿" , "挂篓" , "茶壶" , "沉香" , "盘香" , "å� ¯åŠ¨ç”µæº� " , "摆件车模" , "æ‘„åƒ� 头" , "咖啡豆" , "投å±� 器" , "声å� ¡å¥—装" , "é� 背收纳袋" , "切è� œæ� ¿" , "è¶´è¶´æž•" , "洗地液" , "刹车油" , "æ� � 示牌" , "告知牌" , "è¦ç¤ºç‰Œ" , "é� ™éŸ³é˜»å°¼" , "信纸" , "ä¿¡å°� " , "PVCæ� ¿" , "æ ‡è¯†ç‰Œ" , "æ ‡å¿—ç‰Œ" , "锯æ� ¡" , "摇æ¥å™¨" , "圣æ� ¯" , "æ’‘è¡£æ� †" , "梳å� " , "马桶刷" , "鱼缸" , "刨木" , "改光膜" , "手推车" , "电钻" , "行车记录仪" , "垃圾处ç� †å™¨" , "拉柳枪" , "花洒" , "自æ‹� æ� †" , "百日宴" , "å˜å‚¨å� ¡" , "艾绒贴" , "艾ç� ¸è´´" , "清æ´� 软胶" , "ä¿� 护镜" , "uv镜" , "枇æ� ·é›ªæ¢¨è†� " , "枇æ� ·è†� " , "皮套" , "ä¿� 护壳" , "徽墨" , "SUP掌机" , "å� °è´¦æœ¬" , "墨æ� ¡" , "墨å� —" , "去毛器" , "高清é…� ä»¶" , "拾音器" , "麦克风" , "类纸膜" , "å� � 骨è†� " , "神ç»� 痛贴" , "专用贴" , "鸳鸯锅" , "4/3膜" , "镜头贴" , "å� Žè†œ" , "æ‘„åƒ� 头膜" , "镜头膜" , "去角质" , "æ»çš®" , "U盘" , "接线å¼� 直管" , "香囊袋" , "防疫香包" , "ç‚–ç›…" , "如æ„� 碗" , "汽车头枕腰é� 套装" , "湿手器" , "汤盅" , "é� ¢ç¢—" , "风水鱼" , "打å� °æœºç¢³å¸¦" , "æ ‡ç¾çº¸" , "ä¸� å¹²èƒ¶æ ‡ç¾å¸¦:" , "清æ´� æ¶²" , "æ� � è¯� 器" , "å� ¡é’ˆ" , "儿童电è¯� 手表" , "绷带" , "çŸè£™" , "护具" , "å� ¡å†Œ" , "黄金å� ¡" , "贴布" , "护腕" , "é¼ æ ‡æ‰‹" , "儿童牙è†� " , "é”� 头" , "闹钟" , "储奶袋" , "æ¯� ä¹³" , "儿童电动牙刷" , "涂鸦贴纸" , "贴纸" , "抚奶嘴" , "牙套" , "戒奶嘴" , "æ–奶" , "é¥ç›’" , "æ°´å‡� 膜" , "覆盖膜" , "背膜" , "百褶" , "å� Šèº«è£™" , "牙è†� " , "风湿贴" , "刺激贴" , "冷敷贴" , "腰肌劳æ� Ÿ" , "键盘垫" , "æ‰æ‰è½¦" , "å©å„¿ä¹� " , "å„¿ç«¥æ²� 浴露" , "眼线笔" , "贴膜" , "笔" , "å±� 幕膜" , "ä¿®æ£å¸¦" , "å°� å� £æœº" , "对接头" , "网线" , "少儿读物" , "é� ®ç‘•" , "惯性å°� 汽车" , "çš®ç‹æžª" , "身体乳" , "救生衣" , "裤" , "éž‹" , "三轮车" , "起雾棒" , "干洗剂" , "白酒" , "å� £ç½©" , "碳粉" , "ç§� 处" , "创å� ¯è´´" , "脖套" , "牵引器" , "木糖醇" , "富贵包" , "延长器" , "网å� ¡" , "泡泡纸" , "戒烟" , "喷壶" , "刷头" , "é� ¢éœœ" , "å®� å®� 霜" , "黑头" , "眼袋" , "防晒霜" , "护手霜" , "ç²¾å� Žéœ²" , "鼻头" , "细纹霜" , "抬头纹" , "美肌霜" , "ç´ é¢œéœœ" , "å„¿ç«¥ä¿� 温水æ� ¯" , "滋养霜" , "帽å� " , "护è†� " , "领带" , "露指" , "飞机æ� ¯" , "打飞机" , "ä¿� 护膜" , "大头围" , "å„¿ç«¥éš� 身" , "马ä¸� é� ´ " , "爸爸鞋" , "ç� †å� ‘推" , "ç� †å� ‘器" , "刀头" , "幕布" , "挡风玻璃" , "挡风æ� ¿" , "乳液" , "测电笔" , "测试" , "请勿下å� •" , "牛舌" , "儿童玩具枪" , "宣纸" , "洋娃娃" , "å� £ç� ´ " , "ç£¨ç ‚å£³" , "亲å� 互动" , "防å� «å°–刺" , "折å� 锯å� " , "牙ç¾é˜²æ°´" , "è´ç‰©åˆ¸" , "æ� � 料包" , "水勺" , "碎å� ‘ " , "æ•´ç� †æ£’" , "内裤" , "莆田官网" , "蚊香" , "空调é� ¥æŽ§å™¨" , "电视é� ¥æŽ§å™¨" , "马桶垫" , "锅铲" , "电容笔" , "茶勺" , "瓜刨" , "耳钉" , "茶æ� ¯" , "滤æ� ¯" , "红绳" , "装修" , "钥匙扣" , "美容院" , "芦è� Ÿ" , "仿真å°� 蛋糕" , "儿童便æ� ·" , "é� ®ç‘•è†� " , "汽车摆件" , "水枪" , "润唇è†� " , "衬衫" , "ä¸è€� å¹´" , "æ‹� æ� – " , "牙ç¾ç›’" , "电风扇罩" , "茶æ� ¯" , "袜å� " , "æŽ� 耳" , "爬爬垫" , "滑æ� ¿è
2021-10-26 19:20:52 +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 ( ) * ( 10000 ) + 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
if ( $ . UserName == "jd_4521b375ebb5d" ) {
username = "锟å� "
}
if ( $ . UserName == "jd_542c10c0222bc" ) {
username = "康å� "
}
if ( $ . UserName == "jd_66dcb31363ef6" ) {
username = "æ¶›å� "
}
if ( $ . UserName == "18070420956_p" ) {
username = "奇怪å� "
}
if ( $ . UserName == "jd_45d917547c763" ) {
username = "è·‘è…¿å°� 弟å� "
}
if ( $ . UserName == "jd_66ea783827d30" ) {
username = "军å� "
}
if ( $ . UserName == "jd_4311ac0ff4456" ) {
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 ++ )
if ( m == 0 && sensMessage . length > wordLength ) {
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 ( )
} )
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 ` )
} else if ( parseFloat ( data . data . feedList [ i ] . supplyNum ) > args _xh . minSupplyNum && data . data . feedList [ i ] . supplyNum !== null ) {
console . log ( ` 商å“� 被过滤,æ� � 供申请的份数大于预设申请的份数 \n ` )
} else if ( parseFloat ( data . data . feedList [ i ] . applyNum ) > args _xh . applyNumFilter && data . data . feedList [ i ] . applyNum !== null ) {
console . log ( ` 商� 被过滤,已申请试用人数大于预设人数 \n ` )
} else if ( parseFloat ( data . data . feedList [ i ] . trialPrice ) > args _xh . trialPrice && data . data . feedList [ i ] . jdPrice < minItemValue ) {
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"
}
} )
console . log ( '商å“� 被过滤,å� «æœ‰å…³é”®è¯� \n' )
} 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 ) )
message += "<font color=\'#778899\' size=2>" + JSON . stringify ( data ) + "</font>\n\n"
message += "<font color=\'#778899\' size=2>" + ` ------- \n \n ` + "</font>\n\n"
}
}
} 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>" + ` 当� 状� : ${ item . text . text } ` + "</font>\n\n"
message += "<font color=\'#4B0082\' size=1>" + ` ----- \n \n ` + "</font>\n\n"
count ++
}
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" : [ ] ,
"isAtAll" : true
}
}
$ . 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 ) {
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" )
}