2021-04-09 19:34:05 +08:00
const scriptName = '饿了么' ;
2022-08-30 21:21:56 +08:00
const getCoordinateRegex1 = /^https?:\/\/air\.tb\.ele\.me\/app\/conch-page\/svip-home-tasklist-new\/home\?.*longitude=([^&]*).*latitude=([^&]*)/ ;
const getCoordinateRegex2 = /^https?:\/\/tb\.ele\.me\/wow\/alsc\/mod\/.*longitude=([^&]*).*latitude=([^&]*)/ ;
const getCoordinateRegex3 = /^https?:\/\/h5\.ele\.me\/restapi\/biz\.svip_scene\/svip\/engine\/queryTrafficSupply\?.*longitude=([^&]*).*latitude=([^&]*)/ ;
2022-09-15 21:10:09 +08:00
const getCookiesRegex = /^https?:\/\/air\.tb\.ele\.me\/app\/conch-page\/svip-foodie-card\/home/ ;
const elemeCookieKey = 'eleme_cookies' ;
const elemeCoordinateKey = 'eleme_coordinate' ;
const elemeMissionKey = 'eleme_mission' ;
const elemeSyncQinglongKey = 'eleme_sync_qinglong' ;
const elemeTaskKey = "eleme_task_keywords" ;
let currentUserId = "" ;
let currentCookies = "" ;
let currentCoordinate = null ;
2021-04-09 19:34:05 +08:00
2022-09-15 21:10:09 +08:00
const $ = MagicJS ( scriptName , "INFO" ) ;
2021-04-09 19:34:05 +08:00
2022-09-15 21:10:09 +08:00
function getUserId ( cookies ) {
if ( ! ! cookies ) {
let userId = /USERID=(\d*)/ . exec ( cookies ) [ 1 ] ;
$ . logger . info ( ` 当前UserId: ${ userId } ` ) ;
return userId ;
}
}
async function getCoordinate ( ) {
2022-08-30 21:21:56 +08:00
try {
2022-09-15 21:10:09 +08:00
$ . logger . debug ( ` 当前获取的header \n ${ $ . request . headers } ` ) ;
currentUserId = getUserId ( $ . request . headers . Cookie ) ;
let hisCoordinate = $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
arr = $ . request . url . match ( getCoordinateRegex1 ) ;
2022-08-30 21:21:56 +08:00
if ( arr && arr . length < 2 ) {
2022-09-15 21:10:09 +08:00
arr = $ . request . url . match ( getCoordinateRegex2 ) ;
2022-08-30 21:21:56 +08:00
}
if ( arr && arr . length < 2 ) {
2022-09-15 21:10:09 +08:00
arr = $ . request . url . match ( getCoordinateRegex3 ) ;
2022-08-30 21:21:56 +08:00
}
const longitude = arr [ 1 ] ;
const latitude = arr [ 2 ] ;
2022-09-15 21:10:09 +08:00
if ( ! hisCoordinate || ( ! ! hisCoordinate && ( hisCoordinate . longitude !== longitude || hisCoordinate . latitude !== latitude ) ) ) {
$ . data . write ( elemeCoordinateKey , { longitude , latitude } , currentUserId ) ;
$ . notification . post ( "更新坐标成功" ) ;
}
const syncQinglong = $ . data . read ( elemeSyncQinglongKey , false ) ;
if ( syncQinglong === true ) {
// 获取青龙面板存储的坐标
hisCoordinate = await $ . qinglong . read ( elemeCoordinateKey , "" , currentUserId ) ;
if ( ! hisCoordinate || ( ! ! hisCoordinate && ( hisCoordinate . longitude !== longitude || hisCoordinate . latitude !== latitude ) ) ) {
await $ . qinglong . write ( elemeCoordinateKey , { longitude , latitude } , currentUserId ) ;
$ . notification . post ( "同步坐标至青龙面板成功" ) ;
}
2021-04-09 19:34:05 +08:00
}
}
2022-08-30 21:21:56 +08:00
catch ( err ) {
2022-09-15 21:10:09 +08:00
$ . notify ( '获取坐标出现异常,请查阅日志。' ) ;
$ . logError ( ` 获取坐标出现执行异常,异常信息: ${ err } ` ) ;
2022-08-30 21:21:56 +08:00
}
}
2022-09-15 21:10:09 +08:00
async function getCookies ( ) {
try {
const cookie = $ . request . headers . Cookie ;
$ . logger . info ( ` 本次运行获取的新Cookies \n ${ cookie } ` ) ;
currentUserId = getUserId ( cookie ) ;
const compareCookie2 = ! ! cookie ? /cookie2=([a-zA-Z0-9]*)/ . exec ( cookie ) [ 1 ] : null ;
// 获取存储池中的旧Cookie
let hisCookie = $ . data . read ( elemeCookieKey , "" , currentUserId ) ;
$ . logger . info ( ` 存储池中旧的Cookies \n ${ hisCookie } ` ) ;
if ( ! ! cookie ) {
if ( ! hisCookie ) {
$ . data . write ( elemeCookieKey , cookie , currentUserId ) ;
$ . notification . post ( "Cookie获取成功! " ) ;
}
else {
const compareHisCookie2 = ! ! hisCookie ? /cookie2=([a-zA-Z0-9]*)/ . exec ( hisCookie ) [ 1 ] : null ;
$ . logger . info ( ` 用于比较Cookie变化 \n 新: ${ compareCookie2 } \n 旧: ${ compareHisCookie2 } ` ) ;
if ( compareCookie2 !== compareHisCookie2 ) {
$ . data . write ( elemeCookieKey , cookie , currentUserId ) ;
$ . notification . post ( "Cookie更新成功! " ) ;
}
}
if ( $ . data . read ( elemeSyncQinglongKey , false ) === true ) {
hisCookie = await $ . qinglong . read ( elemeCookieKey , "" , currentUserId ) ;
$ . logger . info ( ` 青龙面板中旧的Cookies \n ${ hisCookie } ` ) ;
if ( ! hisCookie ) {
await $ . qinglong . write ( elemeCookieKey , cookie , currentUserId ) ;
$ . notification . post ( "Cookie同步至青龙面板成功! " ) ;
}
else {
const compareHisCookie2 = ! ! hisCookie ? /cookie2=([a-zA-Z0-9]*)/ . exec ( hisCookie ) [ 1 ] : null ;
$ . logger . info ( ` 用于比较Cookie变化 \n 新: ${ compareCookie2 } \n 旧: ${ compareHisCookie2 } ` ) ;
if ( compareCookie2 !== compareHisCookie2 ) {
await $ . qinglong . write ( elemeCookieKey , cookie , currentUserId ) ;
$ . notification . post ( "Cookie同步至青龙面板成功! " ) ;
}
}
}
}
else {
$ . logger . warning ( '没有获取到有效的Cookies, Surge请关闭MITM over HTTP/2' )
}
2022-08-30 21:21:56 +08:00
}
2022-09-15 21:10:09 +08:00
catch ( err ) {
$ . logger . error ( ` 获取Cookies出现异常 \n ${ err } ` ) ;
2021-04-09 19:34:05 +08:00
}
}
2022-09-15 21:10:09 +08:00
function addConfig ( config ) {
currentCoordinate = currentCoordinate || $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
config . headers . Cookie = currentCookies ;
config . headers [ "x-shard" ] = ` loc= ${ currentCoordinate . longitude } , ${ currentCoordinate . latitude } ` ;
return config ;
}
$ . http . interceptors . request . use ( addConfig ) ;
2021-04-09 19:34:05 +08:00
// 获取待领取的吃货豆列表
2022-09-15 21:10:09 +08:00
function getPeaList ( ) {
2022-08-30 21:21:56 +08:00
return new Promise ( ( resolve , reject ) => {
2022-09-15 21:10:09 +08:00
currentCoordinate = currentCoordinate || $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
$ . http . get ( {
url : ` https://h5.ele.me/restapi/biz.svip_core/v1/foodie/homepage?longitude= ${ currentCoordinate . longitude } &latitude= ${ currentCoordinate . latitude } ` ,
2021-04-09 19:34:05 +08:00
headers : {
"Accept" : "application/json, text/plain, */*" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"Accept-Language" : "zh-cn" ,
"Connection" : "keep-alive" ,
"Host" : "h5.ele.me" ,
"Referer" : "https://h5.ele.me/svip/home?entryStat=profile" ,
"User-Agent" : "Rajax/1 Apple/iPhone10,3 iOS/14.2 Eleme/9.3.8" ,
"f-pTraceId" : "WVNet_WV_2-3-74" ,
2022-09-15 21:10:09 +08:00
"f-refer" : "wv_h5"
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
} ) . then ( resp => {
const obj = resp . body ;
if ( obj . success === true ) {
let peaList = [ ] ;
obj . foodiePeaBlock . peaList . forEach ( element => {
peaList . push ( { 'id' : element . id , 'count' : element . count , 'description' : element . description } ) ;
} ) ;
$ . logger . info ( ` 获取待领取的吃货豆成功: ${ JSON . stringify ( peaList ) } ` ) ;
resolve ( peaList ) ;
2021-04-09 19:34:05 +08:00
}
2022-08-30 21:21:56 +08:00
else {
2022-09-15 21:10:09 +08:00
const msg = ` 获取待领取的吃货豆失败 \n ${ JSON . stringify ( obj ) } ` ;
$ . logger . warning ( msg ) ;
reject ( msg ) ;
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
} ) . catch ( err => {
const msg = ` 获取待领取的吃货豆出现异常 \n ${ err } ` ;
$ . logger . error ( msg ) ;
reject ( msg ) ;
2021-04-09 19:34:05 +08:00
} )
} )
}
// 领取吃货豆
2022-09-15 21:10:09 +08:00
function drawPea ( peaId ) {
2022-08-30 21:21:56 +08:00
return new Promise ( ( resolve , reject ) => {
2022-09-15 21:10:09 +08:00
currentCoordinate = currentCoordinate || $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
$ . http . post ( {
2021-04-09 19:34:05 +08:00
url : ` https://h5.ele.me/restapi/biz.svip_bonus/v1/users/supervip/pea/draw?peaId= ${ peaId } ` ,
headers : {
"Accept" : "application/json, text/plain, */*" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"Accept-Language" : "zh-cn" ,
"Connection" : "keep-alive" ,
"Content-Type" : "application/json;charset=utf-8" ,
"Host" : "h5.ele.me" ,
"Origin" : "https://h5.ele.me" ,
"Referer" : "https://h5.ele.me/svip/home?entryStat=profile" ,
"User-Agent" : "Rajax/1 Apple/iPhone10,3 iOS/14.2 Eleme/9.3.8" ,
"f-pTraceId" : "WVNet_WV_2-3-73" ,
2022-09-15 21:10:09 +08:00
"f-refer" : "wv_h5"
2021-04-09 19:34:05 +08:00
} ,
2022-09-15 21:10:09 +08:00
body : JSON . stringify ( currentCoordinate )
} ) . then ( resp => {
const obj = resp . body ;
if ( obj . success === true ) {
$ . logger . info ( ` 领取吃货豆成功 \n ${ JSON . stringify ( obj ) } ` ) ;
resolve ( true ) ;
2021-04-09 19:34:05 +08:00
}
2022-08-30 21:21:56 +08:00
else {
2022-09-15 21:10:09 +08:00
const msg = ` 领取吃货豆失败 \n ${ JSON . stringify ( obj ) } ` ;
$ . logger . warning ( msg ) ;
reject ( msg )
}
} ) . catch ( err => {
const msg = ` 领取吃货豆异常 \n ${ err } ` ;
$ . logger . error ( msg ) ;
reject ( msg )
} )
} )
}
// 获取超级会员任务列表
function getSuperVipMissions ( ) {
return new Promise ( ( resolve , reject ) => {
// 获取配置的任务关键词
let taskKeywords = $ . data . read ( elemeTaskKey , "美食外卖" ) ;
$ . logger . info ( ` 只获取含有以下关键词的任务: ${ taskKeywords } ` ) ;
taskKeywords = taskKeywords . split ( ';' ) ;
// 获取坐标
currentCoordinate = currentCoordinate || $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
$ . http . get ( {
url : ` https://h5.ele.me/restapi/svip_biz/v1/supervip/query_mission_list?longitude= ${ currentCoordinate . longitude } &latitude= ${ currentCoordinate . latitude } ` ,
headers : {
"Accept" : "application/json, text/plain, */*" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"Accept-Language" : "zh-cn" ,
"Connection" : "keep-alive" ,
"Host" : "h5.ele.me" ,
"Referer" : "https://h5.ele.me/svip/home?entryStat=profile" ,
"User-Agent" : "Rajax/1 Apple/iPhone10,3 iOS/14.2 Eleme/9.3.8" ,
"f-pTraceId" : "WVNet_WV_2-3-30" ,
"f-refer" : "wv_h5"
} ,
} ) . then ( resp => {
const obj = resp . body ;
if ( obj && obj . missions ) {
let result = [ ] ;
obj . missions . forEach ( ( element ) => {
let missionInfo = JSON . stringify ( element ) ;
let flag = false ;
for ( keyword of taskKeywords ) {
if ( missionInfo . indexOf ( keyword ) >= 0 ) {
flag = true ;
break ;
}
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
if ( flag === true ) {
result . push ( element . mission _id ) ;
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
} ) ;
resolve ( result ) ;
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
else {
const msg = ` 获取待领取的会员任务失败 \n ${ JSON . stringify ( obj ) } ` ;
$ . logger . warning ( msg ) ;
reject ( msg ) ;
}
} ) . catch ( err => {
const msg = ` 获取待领取的会员任务异常 \n ${ JSON . stringify ( err ) } ` ;
$ . logger . error ( msg ) ;
reject ( msg ) ;
2021-04-09 19:34:05 +08:00
} )
2022-09-15 21:10:09 +08:00
} ) ;
2021-04-09 19:34:05 +08:00
}
2022-09-15 21:10:09 +08:00
// 接受超级会员任务列表中的任务
function acceptMission ( missionId ) {
return new Promise ( ( resolve , reject ) => {
const _mission _id = encodeURIComponent ( missionId ) ;
// 获取坐标
currentCoordinate = currentCoordinate || $ . data . read ( elemeCoordinateKey , "" , currentUserId ) ;
$ . http . post ( {
url : ` https://h5.ele.me/restapi/svip_biz/v1/supervip/accept_mission?type=0&receiveType=1&mission_id= ${ _mission _id } ` ,
headers : {
"Accept" : "application/json, text/plain, */*" ,
"Accept-Encoding" : "gzip, deflate, br" ,
"Accept-Language" : "zh-cn" ,
"Connection" : "keep-alive" ,
"Content-Type" : "application/json;charset=utf-8" ,
"Host" : "h5.ele.me" ,
"Origin" : "https://h5.ele.me" ,
"Referer" : "https://h5.ele.me/svip/home?entryStat=profile" ,
"User-Agent" : "Rajax/1 Apple/iPhone10,3 iOS/14.5.1 Eleme/9.8.5" ,
"f-pTraceId" : "WVNet_WV_1-1-40" ,
"f-refer" : "wv_h5"
} ,
body : currentCoordinate ,
} ) . then ( resp => {
const obj = resp . body ;
if ( obj . success === true ) {
$ . logger . info ( ` 领取会员任务成功, 任务Id: ${ missionId } ,任务描述: ${ obj . mission . checkout _description } ` ) ;
resolve ( obj . mission . checkout _description ) ;
} else {
const msg = ` 领取会员任务失败, 任务Id: ${ missionId } \n ${ JSON . stringify ( obj ) } ` ;
$ . logger . warning ( msg ) ;
reject ( msg ) ;
}
} ) . catch ( err => {
const msg = ` 领取会员任务异常, 任务Id: ${ missionId } \n ${ err } ` ;
$ . logger . error ( msg ) ;
reject ( msg ) ;
} )
} ) ;
}
2022-08-30 21:21:56 +08:00
; ( async ( ) => {
2022-09-15 21:10:09 +08:00
if ( $ . isRequest ) {
2022-08-30 21:21:56 +08:00
if ( (
2022-09-15 21:10:09 +08:00
getCoordinateRegex1 . test ( $ . request . url ) ||
getCoordinateRegex2 . test ( $ . request . url ) ||
getCoordinateRegex3 . test ( $ . request . url )
) && $ . request . method == "GET" ) {
await getCoordinate ( ) ;
2022-08-30 21:21:56 +08:00
}
2022-09-15 21:10:09 +08:00
else if ( getCookiesRegex . test ( $ . request . url ) ) {
await getCookies ( ) ;
2021-04-09 19:34:05 +08:00
}
}
2022-08-30 21:21:56 +08:00
else {
2022-09-15 21:10:09 +08:00
const allSessions = $ . data . allSessions ( elemeCookieKey ) ;
if ( ! allSessions ) {
const msg = "没有读取到需要执行的Cookies, 请先打开饿了么获取!" ;
$ . logger . warning ( msg ) ;
$ . notification . post ( msg ) ;
2021-04-09 19:34:05 +08:00
}
2022-08-30 21:21:56 +08:00
else {
2022-09-15 21:10:09 +08:00
$ . logger . info ( ` 共 ${ allSessions . length } 个Cookies需要执行 ` ) ;
for ( let [ index , session ] of allSessions . entries ( ) ) {
$ . logger . info ( ` 正在执行第 ${ index + 1 } 个Cookie的任务 ` ) ;
let content = "" ;
currentUserId = session ;
currentCookies = $ . data . read ( elemeCookieKey , "" , session ) ;
// 获取待领取的吃货豆
$ . logger . info ( "开始领取吃货豆" )
2021-04-09 19:34:05 +08:00
let peaCount = 0 ;
let drawPeaContent = '' ;
2022-09-15 21:10:09 +08:00
const peaList = await getPeaList ( ) ;
if ( ! ! peaList && peaList . length > 0 ) {
let tasks = [ ] ;
peaList . forEach ( pea => {
tasks . push ( $ . utils . retry ( drawPea , 3 , 500 ) ( pea . id ) . then ( ( ) => {
peaCount += pea . count ;
drawPeaContent += ` \n ${ pea . description } - ${ pea . count } 吃货豆-领取成功 ` ;
} ) . catch ( ( ) => {
drawPeaContent += ` \n ${ pea . description } - ${ pea . count } 吃货豆-领取失败 ` ;
} ) ) ;
} ) ;
await Promise . all ( tasks ) . then ( ( ) => {
content = ` 本次共领取吃货豆 ${ peaCount } 个 ` ;
$ . logger . info ( drawPeaContent ) ;
} )
}
else {
const msg = "没发现待领取的吃货豆" ;
content = msg ;
$ . logger . info ( msg ) ;
}
// 根据关键词领取任务
if ( $ . data . read ( elemeMissionKey , true ) === true ) {
const missionIds = await $ . utils . retry ( getSuperVipMissions , 3 , 1000 ) ( ) . catch ( err => {
$ . notification . post ( err ) ;
} ) ;
if ( ! ! missionIds && missionIds . length > 0 ) {
$ . logger . info ( ` 匹配关键词的任务Id: \n ${ JSON . stringify ( missionIds ) } ` ) ;
content += ! ! content ? "\n" : "" ;
content += "会员任务领取结果:\n" ;
for ( let missionId of missionIds ) {
await $ . utils . retry ( acceptMission , 3 , 1000 ) ( missionId ) . then ( ( desc ) => {
content += desc ;
} ) . catch ( err => {
$ . notification . post ( err ) ;
} )
}
2021-04-09 19:34:05 +08:00
}
}
2022-09-15 21:10:09 +08:00
$ . notification . post ( ` ${ scriptName } - ${ currentUserId } ` , "" , content ) ;
$ . logger . info ( ` 第 ${ index + 1 } 个Cookie任务执行完毕 ` ) ;
2021-04-09 19:34:05 +08:00
}
}
}
2022-09-15 21:10:09 +08:00
$ . done ( ) ;
2021-04-09 19:34:05 +08:00
} ) ( ) ;
2022-09-15 21:10:09 +08:00
/ * *
*
* $$ \ $$ \ $$ \ $$$$$ \ $$$$$$ \ $$$$$$ \
* $$$ \ $$$ | \ _ _ | \ _ _$$ | $$ _ _$$ \ $$ _ _ _$$ \
* $$$$ \ $$$$ | $$$$$$ \ $$$$$$ \ $$ \ $$$$$$$ \ $$ | $$ / \ _ _ | \ _ / $$ |
* $$ \ $$ \ $$ $$ | \ _ _ _ _$$ \ $$ _ _$$ \ $$ | $$ _ _ _ _ _ | $$ | \ $$$$$$ \ $$$$$ /
* $$ \ $$$ $$ | $$$$$$$ | $$ / $$ | $$ | $$ / $$ \ $$ | \ _ _ _ _$$ \ \ _ _ _$$ \
* $$ | \ $ / $$ | $$ _ _$$ | $$ | $$ | $$ | $$ | $$ | $$ | $$ \ $$ | $$ \ $$ |
* $$ | \ _ / $$ | \ $$$$$$$ | \ $$$$$$$ | $$ | \ $$$$$$$ \ \ $$$$$$ | \ $$$$$$ | \ $$$$$$ |
* \ _ _ | \ _ _ | \ _ _ _ _ _ _ _ | \ _ _ _ _$$ | \ _ _ | \ _ _ _ _ _ _ _ | \ _ _ _ _ _ _ / \ _ _ _ _ _ _ / \ _ _ _ _ _ _ /
* $$ \ $$ |
* \ $$$$$$ |
* \ _ _ _ _ _ _ /
*
* /
function MagicJS ( e = "MagicJS" , t = "INFO" ) { const r = ( ) => { const e = typeof $loon !== "undefined" ; const t = typeof $task !== "undefined" ; const n = typeof module !== "undefined" ; const r = typeof $httpClient !== "undefined" && ! e ; const i = typeof $storm !== "undefined" ; const o = typeof $environment !== "undefined" && typeof $environment [ "stash-build" ] !== "undefined" ; const s = r || e || i || o ; const a = typeof importModule !== "undefined" ; return { isLoon : e , isQuanX : t , isNode : n , isSurge : r , isStorm : i , isStash : o , isSurgeLike : s , isScriptable : a , get name ( ) { if ( e ) { return "Loon" } else if ( t ) { return "QuantumultX" } else if ( n ) { return "NodeJS" } else if ( r ) { return "Surge" } else if ( a ) { return "Scriptable" } else { return "unknown" } } , get build ( ) { if ( r ) { return $environment [ "surge-build" ] } else if ( o ) { return $environment [ "stash-build" ] } else if ( i ) { return $storm . buildVersion } } , get language ( ) { if ( r || o ) { return $environment [ "language" ] } } , get version ( ) { if ( r ) { return $environment [ "surge-version" ] } else if ( o ) { return $environment [ "stash-version" ] } else if ( i ) { return $storm . appVersion } else if ( n ) { return process . version } } , get system ( ) { if ( r ) { return $environment [ "system" ] } else if ( n ) { return process . platform } } , get systemVersion ( ) { if ( i ) { return $storm . systemVersion } } , get deviceName ( ) { if ( i ) { return $storm . deviceName } } } } ; const i = ( n , e = "INFO" ) => { let r = e ; const i = { SNIFFER : 6 , DEBUG : 5 , INFO : 4 , NOTIFY : 3 , WARNING : 2 , ERROR : 1 , CRITICAL : 0 , NONE : - 1 } ; const o = { SNIFFER : "" , DEBUG : "" , INFO : "" , NOTIFY : "" , WARNING : "❗ " , ERROR : "❌ " , CRITICAL : "❌ " , NONE : "" } ; const t = ( e , t = "INFO" ) => { if ( ! ( i [ r ] < i [ t . toUpperCase ( ) ] ) ) console . log ( ` [ ${ t } ] [ ${ n } ] \n ${ o [ t . toUpperCase ( ) ] } ${ e } \n ` ) } ; const s = e => { r = e } ; return { setLevel : s , sniffer : e => { t ( e , "SNIFFER" ) } , debug : e => { t ( e , "DEBUG" ) } , info : e => { t ( e , "INFO" ) } , notify : e => { t ( e , "NOTIFY" ) } , warning : e => { t ( e , "WARNING" ) } , error : e => { t ( e , "ERROR" ) } , retry : e => { t ( e , "RETRY" ) } } } ; return new class { constructor ( e , t ) { this . _startTime = Date . now ( ) ; this . version = "3.0.0" ; this . scriptName = e ; this . env = r ( ) ; this . logger = i ( e , t ) ; this . http = typeof MagicHttp === "function" ? MagicHttp ( this . env , this . logger ) : undefined ; this . data = typeof MagicData === "function" ? MagicData ( this . env , this . logger ) : undefined ; this . notification = typeof MagicNotification === "function" ? MagicNotification ( this . scriptName , this . env , this . logger , this . http ) : undefined ; this . utils = typeof MagicUtils === "function" ? MagicUtils ( this . env , this . logger ) : undefined ; this . qinglong = typeof MagicQingLong === "function" ? MagicQingLong ( this . env , this . data , this . logger ) : undefined ; if ( typeof this . data !== "undefined" ) { let e = this . data . read ( "magic_loglevel" ) ; const n = this . data . read ( "magic_bark_url" ) ; if ( e ) { this . logger . setLevel ( e . toUpperCase ( ) ) } if ( n ) { this . notification . setBark ( n ) } } } get isRequest ( ) { return typeof $request !== "undefined" && typeof $response === "undefined" } get isResponse ( ) { return typeof $response !== "undefined" } get isDebug ( ) { return this . logger . level === "DEBUG" } get request ( ) { return typeof $request !== "undefined" ? $request : undefined } get response ( ) { if ( typeof $response !== "undefined" ) { if ( $response . hasOwnProperty ( "status" ) ) $response [ "statusCode" ] = $response [ "status" ] ; if ( $response . hasOwnProperty ( "statusCode" ) ) $response [ "status" ] = $response [ "statusCode" ] ; return $response } else { return undefined } } done = ( e = { } ) => { this . _endTime = Date . now ( ) ; let t = ( this . _endTime - this . _startTime ) / 1e3 ; this . logger . info ( ` SCRIPT COMPLETED: ${ t } S. ` ) ; if ( typeof $done !== "undefined" ) { $done ( e ) } } } ( e , t ) } function MagicHttp ( u , c ) { const t = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1" ; const n = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.59"