2022-10-29 12:39:16 +08:00
/ *
应用名称 : 自用B站去广告脚本
脚本作者 : Cuttlefish
微信账号 : 公众号墨鱼手记
2022-11-13 15:37:10 +08:00
更新时间 : 2022 - 11 - 08
脚本版本 : ( 74 )
2022-10-29 12:39:16 +08:00
通知频道 : https : //t.me/ddgksf2021
问题反馈 : ddgksf2013 @ 163. com
* /
2022-11-13 15:37:10 +08:00
2022-10-29 12:39:16 +08:00
const scriptName = "BiliBili" ;
const storyAidKey = "bilibili_story_aid" ;
const blackKey = "bilibili_feed_black" ;
let magicJS = MagicJS ( scriptName , "INFO" ) ;
//Customize blacklist
let blacklist = [ ] ;
if ( magicJS . read ( blackKey ) ) {
blacklist = magicJS . read ( blackKey ) . split ( ";" ) ;
} else {
const defaultList = "" ;
magicJS . write ( blackKey , defaultList ) ;
blacklist = defaultList . split ( ";" ) ;
}
( ( ) => {
let body = null ;
if ( magicJS . isResponse ) {
switch ( true ) {
2022-11-13 15:37:10 +08:00
// 推荐去广告, 最后问号不能去掉, 以免匹配到story模式
2022-10-29 12:39:16 +08:00
case /^https:\/\/app\.bilibili\.com\/x\/v2\/feed\/index\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
let items = [ ] ;
for ( let item of obj [ "data" ] [ "items" ] ) {
if ( item . hasOwnProperty ( "banner_item" ) ) {
let bannerItems = [ ] ;
for ( let banner of item [ "banner_item" ] ) {
if ( banner [ "type" ] === "ad" ) {
continue ;
} else if ( banner [ "static_banner" ] && banner [ "static_banner" ] [ "is_ad_loc" ] != true ) {
bannerItems . push ( banner ) ;
}
}
2022-11-13 15:37:10 +08:00
// 去除广告后, 如果banner大于等于1个才添加到响应体
2022-10-29 12:39:16 +08:00
if ( bannerItems . length >= 1 ) {
item [ "banner_item" ] = bannerItems ;
items . push ( item ) ;
}
} else if (
! item . hasOwnProperty ( "ad_info" ) &&
! blacklist . includes ( item [ "args" ] [ "up_name" ] ) &&
item . card _goto . indexOf ( "ad" ) === - 1 &&
2022-11-13 15:37:10 +08:00
( item [ "card_type" ] === "small_cover_v2" || item [ "card_type" ] === "large_cover_v1" || item [ "card_type" ] === "large_cover_single_v9" )
2022-10-29 12:39:16 +08:00
) {
items . push ( item ) ;
}
}
obj [ "data" ] [ "items" ] = items ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 推荐去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 匹配story模式, 用于记录Story的aid
case /^https?:\/\/app\.bilibili\.com\/x\/v2\/feed\/index\/story\?/ . test ( magicJS . request . url ) :
2022-10-29 12:39:16 +08:00
try {
let obj = JSON . parse ( magicJS . response . body ) ;
let items = [ ] ;
for ( let item of obj [ "data" ] [ "items" ] ) {
2022-11-13 15:37:10 +08:00
if ( ! item . hasOwnProperty ( "ad_info" ) && item . card _goto . indexOf ( "ad" ) === - 1 ) {
2022-10-29 12:39:16 +08:00
items . push ( item ) ;
}
}
obj [ "data" ] [ "items" ] = items ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 记录Story的aid出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
//teenagers modified
case /^https?:\/\/app\.bilibili\.com\/x\/v\d\/account\/teenagers\/status\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
obj . data . teenagers _status = 0 ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` teenagers出现异常: ${ err } ` ) ;
}
break ;
// 标签页处理,如去除会员购等等
2022-10-29 12:39:16 +08:00
case /^https?:\/\/app\.bilibili\.com\/x\/resource\/show\/tab/ . test ( magicJS . request . url ) :
try {
const tabList = new Set ( [ 39 , 40 , 41 , 774 , 857 , 545 , 151 , 442 , 99 , 100 , 101 , 554 , 556 ] ) ;
const topList = new Set ( [ 176 , 107 ] ) ;
2022-11-13 15:37:10 +08:00
const bottomList = new Set ( [ 177 , 178 , 179 , 181 , 102 , 104 , 106 , 486 , 488 , 489 ] ) ;
2022-10-29 12:39:16 +08:00
let obj = JSON . parse ( magicJS . response . body ) ;
if ( obj [ "data" ] [ "tab" ] ) {
let tab = obj [ "data" ] [ "tab" ] . filter ( ( e ) => {
return tabList . has ( e . id ) ;
} ) ;
obj [ "data" ] [ "tab" ] = tab ;
}
2022-11-13 15:37:10 +08:00
// 将 id( 222 & 107) 调整为Story功能按钮
2022-10-29 12:39:16 +08:00
let storyAid = magicJS . read ( storyAidKey ) ;
if ( ! storyAid ) {
storyAid = "246834163" ;
}
if ( obj [ "data" ] [ "top" ] ) {
let top = obj [ "data" ] [ "top" ] . filter ( ( e ) => {
if ( e . id === 222 || e . id === 107 ) {
e . uri = ` bilibili://story/ ${ storyAid } ` ;
e . icon = "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/bilibili/bilibili_icon.png" ;
e . tab _id = "Story_Top" ;
e . name = "Story" ;
}
return topList . has ( e . id ) ;
} ) ;
obj [ "data" ] [ "top" ] = top ;
}
if ( obj [ "data" ] [ "bottom" ] ) {
let bottom = obj [ "data" ] [ "bottom" ] . filter ( ( e ) => {
return bottomList . has ( e . id ) ;
} ) ;
obj [ "data" ] [ "bottom" ] = bottom ;
}
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 标签页处理出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 我的页面处理,去除一些推广按钮
2022-10-29 12:39:16 +08:00
case /^https?:\/\/app\.bilibili\.com\/x\/v2\/account\/mine/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
const itemList = new Set ( [ 396 , 397 , 398 , 399 , 402 , 404 , 407 , 410 , 425 , 426 , 427 , 428 , 430 , 432 , 433 , 434 , 494 , 495 , 496 , 497 , 500 , 501 ] ) ;
obj [ "data" ] [ "sections_v2" ] . forEach ( ( element , index ) => {
element [ "items" ] . forEach ( ( e ) => {
if ( e [ "id" ] === 622 ) {
e [ "title" ] = "会员购" ;
e [ "uri" ] = "bilibili://mall/home" ;
}
} ) ;
let items = element [ "items" ] . filter ( ( e ) => {
return itemList . has ( e . id ) ;
} ) ;
obj [ "data" ] [ "sections_v2" ] [ index ] . button = { } ;
delete obj [ "data" ] [ "sections_v2" ] [ index ] . be _up _title ;
delete obj [ "data" ] [ "sections_v2" ] [ index ] . tip _icon ;
delete obj [ "data" ] [ "sections_v2" ] [ index ] . tip _title ;
2022-11-13 15:37:10 +08:00
//2022-02-16 add by ddgksf2013
2022-10-29 12:39:16 +08:00
for ( let ii = 0 ; ii < obj [ "data" ] [ "sections_v2" ] . length ; ii ++ ) {
2022-11-13 15:37:10 +08:00
if ( obj . data . sections _v2 [ ii ] . title == "推荐服务" || obj . data . sections _v2 [ ii ] . title == "推薦服務" ) {
//obj.data.sections_v2[ii].items[0].title='\u516C\u773E\u865F';
//obj.data.sections_v2[ii].items[1].title='\u58A8\u9B5A\u624B\u8A18';
2022-10-29 12:39:16 +08:00
}
2022-11-13 15:37:10 +08:00
if ( obj . data . sections _v2 [ ii ] . title == "更多服務" || obj . data . sections _v2 [ ii ] . title == "更多服务" ) {
if ( obj . data . sections _v2 [ ii ] . items [ 0 ] . id == 500 ) {
//obj.data.sections_v2[ii].items[0].title='\u516C\u773E\u865F';
2022-10-29 12:39:16 +08:00
}
2022-11-13 15:37:10 +08:00
if ( obj . data . sections _v2 [ ii ] . items [ 1 ] . id == 501 ) {
//obj.data.sections_v2[ii].items[1].title='\u58A8\u9B5A\u624B\u8A18';
2022-10-29 12:39:16 +08:00
}
}
2022-11-13 15:37:10 +08:00
if ( obj . data . sections _v2 [ ii ] . title == "创作中心" || obj . data . sections _v2 [ ii ] . title == "創作中心" ) {
2022-10-29 12:39:16 +08:00
delete obj . data . sections _v2 [ ii ] . title ;
delete obj . data . sections _v2 [ ii ] . type ;
}
}
delete obj . data . vip _section _v2 ;
delete obj . data . vip _section ;
obj [ "data" ] [ "sections_v2" ] [ index ] [ "items" ] = items ;
2022-11-13 15:37:10 +08:00
//2022-03-05 add by ddgksf2013
if ( obj . data . hasOwnProperty ( "live_tip" ) ) {
obj [ "data" ] [ "live_tip" ] = { } ;
2022-10-29 12:39:16 +08:00
}
2022-11-13 15:37:10 +08:00
if ( obj . data . hasOwnProperty ( "answer" ) ) {
obj [ "data" ] [ "answer" ] = { } ;
2022-10-29 12:39:16 +08:00
}
obj [ "data" ] [ "vip_type" ] = 2 ;
obj [ "data" ] [ "vip" ] [ "type" ] = 2 ;
obj [ "data" ] [ "vip" ] [ "status" ] = 1 ;
obj [ "data" ] [ "vip" ] [ "vip_pay_type" ] = 1 ;
obj [ "data" ] [ "vip" ] [ "due_date" ] = 4669824160 ;
} ) ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 我的页面处理出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 直播去广告
2022-10-29 12:39:16 +08:00
case /^https?:\/\/api\.live\.bilibili\.com\/xlive\/app-room\/v1\/index\/getInfoByRoom/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
obj [ "data" ] [ "activity_banner_info" ] = null ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 直播去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 右上角活动
case /^https?:\/\/app\.bilibili\.com\/x\/resource\/top\/activity/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
if ( obj . data ) {
obj . data . hash = "ddgksf2013" ;
obj . data . online . icon = "" ;
}
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 右上角去广告出现异常: ${ err } ` ) ;
}
break ;
//屏蔽热搜
2022-10-29 12:39:16 +08:00
case /^https?:\/\/app\.bilibili\.com\/x\/v2\/search\/square/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
2022-11-13 15:37:10 +08:00
obj . data = {
type : "history" ,
title : "搜索历史" ,
search _hotword _revision : 2 ,
2022-10-29 12:39:16 +08:00
} ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 热搜去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
//2022-03-05 add by ddgksf2013
2022-10-29 12:39:16 +08:00
case /https?:\/\/app\.bilibili\.com\/x\/v2\/account\/myinfo\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
2022-11-13 15:37:10 +08:00
//magicJS.logInfo(`公众号墨鱼手记`);
2022-10-29 12:39:16 +08:00
obj [ "data" ] [ "vip" ] [ "type" ] = 2 ;
obj [ "data" ] [ "vip" ] [ "status" ] = 1 ;
obj [ "data" ] [ "vip" ] [ "vip_pay_type" ] = 1 ;
obj [ "data" ] [ "vip" ] [ "due_date" ] = 4669824160 ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 1080P出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 追番去广告
2022-10-29 12:39:16 +08:00
case /pgc\/page\/bangumi/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
obj . result . modules . forEach ( ( module ) => {
2022-11-13 15:37:10 +08:00
// 头部banner
2022-10-29 12:39:16 +08:00
if ( module . style . startsWith ( "banner" ) ) {
2022-11-13 15:37:10 +08:00
//i.source_content && i.source_content.ad_content
module . items = module . items . filter ( ( i ) => ! ( i . link . indexOf ( "play" ) == - 1 ) ) ;
2022-10-29 12:39:16 +08:00
}
if ( module . style . startsWith ( "function" ) ) {
2022-11-13 15:37:10 +08:00
module . items = module . items . filter ( ( i ) => i . blink . indexOf ( "www.bilibili.com" ) == - 1 ) ;
2022-10-29 12:39:16 +08:00
}
if ( module . style . startsWith ( "tip" ) ) {
module . items = null ;
}
} ) ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 追番去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 观影页去广告
2022-10-29 12:39:16 +08:00
case /pgc\/page\/cinema\/tab\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
obj . result . modules . forEach ( ( module ) => {
2022-11-13 15:37:10 +08:00
// 头部banner
2022-10-29 12:39:16 +08:00
if ( module . style . startsWith ( "banner" ) ) {
2022-11-13 15:37:10 +08:00
module . items = module . items . filter ( ( i ) => ! ( i . link . indexOf ( "play" ) == - 1 ) ) ;
2022-10-29 12:39:16 +08:00
}
if ( module . style . startsWith ( "function" ) ) {
2022-11-13 15:37:10 +08:00
module . items = module . items . filter ( ( i ) => i . blink . indexOf ( "www.bilibili.com" ) == - 1 ) ;
2022-10-29 12:39:16 +08:00
}
if ( module . style . startsWith ( "tip" ) ) {
module . items = null ;
}
} ) ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 观影页去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 动态去广告
2022-10-29 12:39:16 +08:00
case /^https?:\/\/api\.vc\.bilibili\.com\/dynamic_svr\/v1\/dynamic_svr\/dynamic_(history|new)\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
let cards = [ ] ;
obj . data . cards . forEach ( ( element ) => {
if ( element . hasOwnProperty ( "display" ) && element . card . indexOf ( "ad_ctx" ) <= 0 ) {
2022-11-13 15:37:10 +08:00
// 解决number类型精度问题导致B站动态中图片无法打开的问题
2022-10-29 12:39:16 +08:00
element [ "desc" ] [ "dynamic_id" ] = element [ "desc" ] [ "dynamic_id_str" ] ;
element [ "desc" ] [ "pre_dy_id" ] = element [ "desc" ] [ "pre_dy_id_str" ] ;
element [ "desc" ] [ "orig_dy_id" ] = element [ "desc" ] [ "orig_dy_id_str" ] ;
element [ "desc" ] [ "rid" ] = element [ "desc" ] [ "rid_str" ] ;
cards . push ( element ) ;
}
} ) ;
obj . data . cards = cards ;
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 动态去广告出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 去除统一设置的皮肤
2022-10-29 12:39:16 +08:00
case /^https?:\/\/app\.bilibili\.com\/x\/resource\/show\/skin\?/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
2022-11-13 15:37:10 +08:00
if ( obj && obj . hasOwnProperty ( "data" ) && obj . data . hasOwnProperty ( "common_equip" ) && obj . data . common _equip . hasOwnProperty ( "package_url" ) ) {
//obj["data"]["common_equip"]["package_url"] = "";
2022-10-29 12:39:16 +08:00
}
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 去除强制设置的皮肤出现异常: ${ err } ` ) ;
}
break ;
2022-11-13 15:37:10 +08:00
// 开屏广告(预加载)如果粗暴地关掉,那么就使用预加载的数据,就会导致关不掉
2022-10-29 12:39:16 +08:00
case /^https:\/\/app\.bilibili\.com\/x\/v2\/splash\/list/ . test ( magicJS . request . url ) :
try {
let obj = JSON . parse ( magicJS . response . body ) ;
2022-11-13 15:37:10 +08:00
if ( obj . data ) {
2022-10-29 12:39:16 +08:00
for ( let item of obj [ "data" ] [ "list" ] ) {
2022-11-13 15:37:10 +08:00
item [ "duration" ] = 0 ;
// 显示时间
// 2040 年
2022-10-29 12:39:16 +08:00
item [ "begin_time" ] = 2240150400 ;
item [ "end_time" ] = 2240150400 ;
}
}
body = JSON . stringify ( obj ) ;
} catch ( err ) {
magicJS . logError ( ` 开屏广告(预加载)出现异常: ${ err } ` ) ;
}
break ;
default :
magicJS . logWarning ( "触发意外的请求处理,请确认脚本或复写配置正常。" ) ;
break ;
}
} else {
magicJS . logWarning ( "触发意外的请求处理,请确认脚本或复写配置正常。" ) ;
}
if ( body ) {
2022-11-13 15:37:10 +08:00
magicJS . done ( {
body ,
} ) ;
2022-10-29 12:39:16 +08:00
} else {
magicJS . done ( ) ;
}
} ) ( ) ;
2022-11-13 15:37:10 +08:00
2022-10-29 12:39:16 +08:00
// prettier-ignore
function MagicJS ( scriptName = "MagicJS" , logLevel = "INFO" ) { return new class { constructor ( ) { if ( this . version = "2.2.3.3" , this . scriptName = scriptName , this . logLevels = { DEBUG : 5 , INFO : 4 , NOTIFY : 3 , WARNING : 2 , ERROR : 1 , CRITICAL : 0 , NONE : - 1 } , this . isLoon = "undefined" != typeof $loon , this . isQuanX = "undefined" != typeof $task , this . isJSBox = "undefined" != typeof $drive , this . isNode = "undefined" != typeof module && ! this . isJSBox , this . isSurge = "undefined" != typeof $httpClient && ! this . isLoon , this . node = { request : void 0 , fs : void 0 , data : { } } , this . iOSUserAgent = "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" , this . pcUserAgent = "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" , this . logLevel = logLevel , this . _barkUrl = "" , this . isNode ) { this . node . fs = require ( "fs" ) , this . node . request = require ( "request" ) ; try { this . node . fs . accessSync ( "./magic.json" , this . node . fs . constants . R _OK | this . node . fs . constants . W _OK ) } catch ( err ) { this . node . fs . writeFileSync ( "./magic.json" , "{}" , { encoding : "utf8" } ) } this . node . data = require ( "./magic.json" ) } else this . isJSBox && ( $file . exists ( "drive://MagicJS" ) || $file . mkdir ( "drive://MagicJS" ) , $file . exists ( "drive://MagicJS/magic.json" ) || $file . write ( { data : $data ( { string : "{}" } ) , path : "drive://MagicJS/magic.json" } ) ) } set barkUrl ( url ) { this . _barkUrl = url . replace ( /\/+$/g , "" ) } set logLevel ( level ) { this . _logLevel = "string" == typeof level ? level . toUpperCase ( ) : "DEBUG" } get logLevel ( ) { return this . _logLevel } get isRequest ( ) { return "undefined" != typeof $request && "undefined" == typeof $response } get isResponse ( ) { return "undefined" != typeof $response } get request ( ) { return "undefined" != typeof $request ? $request : void 0 } get response ( ) { return "undefined" != typeof $response ? ( $response . hasOwnProperty ( "status" ) && ( $response . statusCode = $response . status ) , $response . hasOwnProperty ( "statusCode" ) && ( $response . status = $response . statusCode ) , $response ) : void 0 } get platform ( ) { return this . isSurge ? "Surge" : this . isQuanX ? "Quantumult X" : this . isLoon ? "Loon" : this . isJSBox ? "JSBox" : this . isNode ? "Node.js" : "Unknown" } read ( key , session = "" ) { let val = "" ; this . isSurge || this . isLoon ? val = $persistentStore . read ( key ) : this . isQuanX ? val = $prefs . valueForKey ( key ) : this . isNode ? val = this . node . data : this . isJSBox && ( val = $file . read ( "drive://MagicJS/magic.json" ) . string ) ; try { this . isNode && ( val = val [ key ] ) , this . isJSBox && ( val = JSON . parse ( val ) [ key ] ) , session && ( "string" == typeof val && ( val = JSON . parse ( val ) ) , val = val && "object" == typeof val ? val [ session ] : null ) } catch ( err ) { this . logError ( err ) , val = session ? { } : null , this . del ( key ) } void 0 === val && ( val = null ) ; try { val && "string" == typeof val && ( val = JSON . parse ( val ) ) } catch ( err ) { } return this . logDebug ( ` READ DATA [ ${ key } ] ${ session ? ` [ ${ session } ] ` : "" } ( ${ typeof val } ) \n ${ JSON . stringify ( val ) } ` ) , val } write ( key , val , session = "" ) { let data = session ? { } : "" ; if ( session && ( this . isSurge || this . isLoon ) ? data = $persistentStore . read ( key ) : session && this . isQuanX ? data = $prefs . valueForKey ( key ) : this . isNode ? data = this . node . data : this . isJSBox && ( data = JSON . parse ( $file . read ( "drive://MagicJS/magic.json" ) . string ) ) , session ) { try { "string" == typeof data && ( data = JSON . parse ( data ) ) , data = "object" == typeof data && data ? data : { } } catch ( err ) { this . logError ( err ) , this . del ( key ) , data = { } } this . isJSBox || this . isNode ? ( data [ key ] && "object" == typeof data [ key ] || ( data [ key ] = { } ) , data [ key ] . hasOwnProperty ( session ) || ( data [ key ] [ session ] = null ) , void 0 === val ? delete data [ key ] [ session ] : data [ key ] [ session ] = val ) : void 0 === val ? delete data [ session ] : data [ session ] = val } else this . isNode || this . isJSBox ? void 0 === val ? delete data [ key ] : data [ key ] = val : data = void 0 === val ? null : val ; "object" == typeof data && ( data = JSON . stringify ( data ) ) , this . isSurge || this . isLoon ? $persistentStore . write ( data , key ) : this . isQuanX ? $prefs . setValueForKey ( data , key ) : this . isNode ? this . node . fs . writeFileSync ( "./magic.json" , data ) : this . isJSBox && $file . write ( { data : $data ( { string : data } ) , path : "drive://MagicJS/magic.json" } ) , this . logDebug ( ` WRITE DATA [ ${ key } ] ${ session ? ` [ ${ session } ] ` : "" } ( ${ typeof val } ) \n ${ JSON . stringify ( val ) } ` ) } del ( key , session = "" ) { this . logDebug ( ` DELETE KEY [ ${ key } ] ${ session ? ` [ ${ session } ] ` : "" } ` ) , this . write ( key , null , session ) } notify ( title = thi