Clash/script/bilibili/bilibili_plus.js

223 lines
21 KiB
JavaScript
Raw Normal View History

2021-04-09 19:34:05 +08:00
const scriptName = 'BiliBili';
const storyAidKey = 'story_aid';
let magicJS = MagicJS(scriptName, 'INFO');
const blackKey = 'blackmatrix7_bilibili_feed_black';
//Customize blacklist
let blacklist = [];
if (magicJS.read(blackKey)){
blacklist = magicJS.read(blackKey).split(';');
} else {
const defaultList = '';
magicJS.write(blackKey, defaultList);
blacklist = defaultList.split(';');
}
2021-04-09 19:34:05 +08:00
;(() => {
let body = null;
if (magicJS.isResponse){
switch (true){
// 推荐去广告最后问号不能去掉以免匹配到story模式
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['is_ad'] != true && banner['is_ad_loc'] != true){
bannerItems.push(banner);
}
}
// 去除广告后如果banner大于等于1个才添加到响应体
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 &&
(item['card_type'] === 'small_cover_v2' || item['card_type'] === 'large_cover_v1')
){
2021-04-09 19:34:05 +08:00
items.push(item);
}
}
obj['data']['items'] = items;
body = JSON.stringify(obj);
}
catch (err){
magicJS.logError(`推荐去广告出现异常:${err}`);
}
break;
// 匹配story模式用于记录Story的aid
case /^https:\/\/app\.bilibili\.com\/x\/v2\/feed\/index\/story\?/.test(magicJS.request.url):
try{
let obj = JSON.parse(magicJS.response.body);
let lastItem = obj['data']['items'].pop();
let aid = lastItem['stat']['aid'].toString();
magicJS.write(storyAidKey, aid);
}
catch (err){
magicJS.logError(`记录Story的aid出现异常${err}`);
}
break;
// 开屏广告处理
case /^https?:\/\/app\.bilibili\.com\/x\/v2\/splash\/list/.test(magicJS.request.url):
try{
let obj = JSON.parse(magicJS.response.body);
obj['data']['max_time'] = 0;
obj['data']['min_interval'] = 31536000;
obj['data']['pull_interval'] = 31536000;
for(let i=0;i<obj['data']['list'].length;i++){
obj['data']['list'][i]['duration'] = 0;
obj['data']['list'][i]['begin_time'] = 1915027200;
obj['data']['list'][i]['end_time'] = 1924272000;
}
body = JSON.stringify(obj);
}
catch (err){
magicJS.logError(`开屏广告处理出现异常:${err}`);
}
break;
// 标签页处理,如去除会员购等等
case /^https?:\/\/app\.bilibili\.com\/x\/resource\/show\/tab/.test(magicJS.request.url):
try{
// 442 开始为概念版id 适配港澳台代理模式
const tabList = new Set([39, 40, 41, 42, 151, 442, 99, 100, 101, 554 , 556]);
// 107 概念版游戏中心获取修改为Story模式
const topList = new Set([176,222,107]);
// 102 开始为概念版id
const bottomList = new Set([177, 178, 179, 181, 102, 103, 104, 105, 106]);
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;
}
// 将 id222 & 107调整为Story功能按钮
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;
// 我的页面处理,去除一些推广按钮
case /^https?:\/\/app\.bilibili\.com\/x\/v2\/account\/mine/.test(magicJS.request.url):
try{
let obj = JSON.parse(magicJS.response.body);
// 425 开始为概念版id
const itemList = new Set([396,397,398,399,171,172,534,8,4,428,352,1,405,402,404,544,407,410,425,426,427,428,171,430,431,432]);
obj['data']['sections_v2'].forEach((element, index) => {
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;
obj['data']['sections_v2'][index]['items'] = items;
});
body = JSON.stringify(obj);
}
catch (err){
magicJS.logError(`我的页面处理出现异常:${err}`);
}
break;
// 直播去广告
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;
// 追番去广告
case /^https?:\/\/api\.bilibili\.com\/pgc\/page\/bangumi/.test(magicJS.request.url):
try{
let obj = JSON.parse(magicJS.response.body);
for (let card of obj.data.cards){
delete card['extra'];
}
delete obj['data']['attentions'];
body = JSON.stringify(obj);
}
catch (err){
magicJS.logError(`追番去广告出现异常:${err}`);
}
break;
// 动态去广告
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){
// 解决number类型精度问题导致B站动态中图片无法打开的问题
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;
// 去除统一设置的皮肤
case /^https?:\/\/app\.bilibili\.com\/x\/resource\/show\/skin\?/.test(magicJS.request.url):
try{
let obj = JSON.parse(magicJS.response.body);
if (obj && obj.hasOwnProperty('data')){
obj['data']['common_equip'] = {};
}
body = JSON.stringify(obj);
}
catch (err){
magicJS.logError(`去除强制设置的皮肤出现异常:${err}`);
}
break;
default:
magicJS.logWarning('触发意外的请求处理,请确认脚本或复写配置正常。');
break;
}
}
else{
magicJS.logWarning('触发意外的请求处理,请确认脚本或复写配置正常。');
}
if (body){
magicJS.done({body});
}
else{
magicJS.done();
}
})();
function MagicJS(e="MagicJS",t="INFO"){const s={accept:"Accept","accept-ch":"Accept-CH","accept-charset":"Accept-Charset","accept-features":"Accept-Features","accept-encoding":"Accept-Encoding","accept-language":"Accept-Language","accept-ranges":"Accept-Ranges","access-control-allow-credentials":"Access-Control-Allow-Credentials","access-control-allow-origin":"Access-Control-Allow-Origin","access-control-allow-methods":"Access-Control-Allow-Methods","access-control-allow-headers":"Access-Control-Allow-Headers","access-control-max-age":"Access-Control-Max-Age","access-control-expose-headers":"Access-Control-Expose-Headers","access-control-request-method":"Access-Control-Request-Method","access-control-request-headers":"Access-Control-Request-Headers",age:"Age",allow:"Allow",alternates:"Alternates",authorization:"Authorization","cache-control":"Cache-Control",connection:"Connection","content-encoding":"Content-Encoding","content-language":"Content-Language","content-length":"Content-Length","content-location":"Content-Location","content-md5":"Content-MD5","content-range":"Content-Range","content-security-policy":"Content-Security-Policy","content-type":"Content-Type",cookie:"Cookie",dnt:"DNT",date:"Date",etag:"ETag",expect:"Expect",expires:"Expires",from:"From",host:"Host","if-match":"If-Match","if-modified-since":"If-Modified-Since","if-none-match":"If-None-Match","if-range":"If-Range","if-unmodified-since":"If-Unmodified-Since","last-event-id":"Last-Event-ID","last-modified":"Last-Modified",link:"Link",location:"Location","max-forwards":"Max-Forwards",negotiate:"Negotiate",origin:"Origin",pragma:"Pragma","proxy-authenticate":"Proxy-Authenticate","proxy-authorization":"Proxy-Authorization",range:"Range",referer:"Referer","retry-after":"Retry-After","sec-websocket-extensions":"Sec-Websocket-Extensions","sec-websocket-key":"Sec-Websocket-Key","sec-websocket-origin":"Sec-Websocket-Origin","sec-websocket-protocol":"Sec-Websocket-Protocol","sec-websocket-version":"Sec-Websocket-Version",server:"Server","set-cookie":"Set-Cookie","set-cookie2":"Set-Cookie2","strict-transport-security":"Strict-Transport-Security",tcn:"TCN",te:"TE",trailer:"Trailer","transfer-encoding":"Transfer-Encoding",upgrade:"Upgrade","user-agent":"User-Agent","variant-vary":"Variant-Vary",vary:"Vary",via:"Via",warning:"Warning","www-authenticate":"WWW-Authenticate","x-content-duration":"X-Content-Duration","x-content-security-policy":"X-Content-Security-Policy","x-dnsprefetch-control":"X-DNSPrefetch-Control","x-frame-options":"X-Frame-Options","x-requested-with":"X-Requested-With","x-surge-skip-scripting":"X-Surge-Skip-Scripting"};return new class{constructor(){this.version="2.2.3.3";this.scriptName=e;this.logLevels={DEBUG:5,INFO:4,NOTIFY:3,WARNING:2,ERROR:1,CRITICAL:0,NONE:-1};this.isLoon=typeof $loon!=="undefined";this.isQuanX=typeof $task!=="undefined";this.isJSBox=typeof $drive!=="undefined";this.isNode=typeof module!=="undefined"&&!this.isJSBox;this.isSurge=typeof $httpClient!=="undefined"&&!this.isLoon;this.platform=this.getPlatform();this.node={request:undefined,fs:undefined,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=t;this._unifiedPushUrl="";if(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(e){this.node.fs.writeFileSync("./magic.json","{}",{encoding:"utf8"})}this.node.data=require("./magic.json")}else if(this.isJSBox){if(!$file.exists("drive://MagicJS")){$file.mkdir("drive://MagicJS")}if(!$file.exists("drive://MagicJS/magic.json")){$file.write({data:$data({string:"{}"}),path:"drive://MagicJS/magic.json"})}}}set unifiedPushUrl(e){this._unifiedPushUrl=!!e?e.replace(/\/+$/g,""):""}set logLevel(e){this._logLevel=typeof e==="string"?e.