• Ylogos

    人在海外b站网页版真的卡麻了。

    claude 抓包一通分析, 大概行为如下, 视屏前几秒走b站走海外cdn节点, 然后切pcdn(这我玩个毛 跨洋p2p我怎么看,ps.一想到有用户被迫站跨洋p2p webrtc stun 传输我就乐)。

    解决方案

    图片```

    // ==UserScript==
    // @name B站海外CDN优化(alib锁定+PCDN击杀)
    // @namespace local.bili.akam
    // @version 2.0
    // @description ①分片锁 upos-sz-mirroralib(实测深冷内容10-21Mbps,唯一稳定喂饱4K) ②每次加载强杀PCDN/P2P(播放器挂死真凶) ③可选强制H264
    // @match ://.bilibili.com/*
    // @run-at document-start
    // @grant none
    // ==/UserScript==
    (function () {
    'use strict';
    const PRIMARY = 'upos-sz-mirroralib.bilivideo.com';
    const SECOND = 'upos-sz-mirrorhw.bilivideo.com';
    const FORCE_AVC = localStorage.getItem('bili_force_avc') === '1';

    // ① PCDN/P2P 击杀(每次加载强制执行,防服务端配置复活)
    try {
    const K='bilibili_player_dash_fawkes_config';
    const cfg=JSON.parse(localStorage.getItem(K)||'{}');
    cfg['common_policy.pcdn_enabled_browser_list']=btoa('[]');
    cfg['dash_config.p2p_disable']=btoa('true');
    cfg['reward_pcdn_loader_policy.web_loader_grey_test_percentage']=btoa('0');
    localStorage.setItem(K,JSON.stringify(cfg));
    } catch(e){}

    // ② 可选强制 H.264
    if (FORCE_AVC) {
    const bad=/hev1|hvc1|av01/i;
    if (window.MediaSource?.isTypeSupported){ const o=MediaSource.isTypeSupported.bind(MediaSource); MediaSource.isTypeSupported=t=>bad.test(t)?false:o(t); }
    const cpt=HTMLMediaElement.prototype.canPlayType;
    HTMLMediaElement.prototype.canPlayType=function(t){ return bad.test(t)?'':cpt.call(this,t); };
    if (navigator.mediaCapabilities?.decodingInfo){ const od=navigator.mediaCapabilities.decodingInfo.bind(navigator.mediaCapabilities);
    navigator.mediaCapabilities.decodingInfo=c=>(c?.video?.contentType&&bad.test(c.video.contentType))?Promise.resolve({supported:false,smooth:false,powerEfficient:false}):od(c); }
    }

    // ③ CDN 锁定:主=alib,备=hw→akamai→原始
    const swapTo = (u,h) => { try{ const x=new URL(u); if(/^upos-/i.test(x.host)){ x.host=h; return x.href; } return u; }catch(e){ return u; } };
    const fixStream = s => {
    if(!s) return;
    const base = s.baseUrl || s.base_url; if(!base) return;
    const backups = s.backupUrl || s.backup_url || [];
    const all=[base,...backups];
    const primary = swapTo(base, PRIMARY);
    const akamExisting = all.filter(u=>/akamaized\.net/i.test(u));
    const rest = [...new Set([swapTo(base,SECOND), ...akamExisting, base])].filter(u=>u!==primary);
    if(s.baseUrl!==undefined||s.backupUrl!==undefined){ s.baseUrl=primary; s.backupUrl=rest; }
    if(s.base_url!==undefined||s.backup_url!==undefined){ s.base_url=primary; s.backup_url=rest; }
    };
    const patch = j => { try{
    const d=j?.data||j?.result||j;
    if(d?.dash){ (d.dash.video||[]).forEach(fixStream); (d.dash.audio||[]).forEach(fixStream);
    d.dash.dolby?.audio?.forEach(fixStream); if(d.dash.flac?.audio) fixStream(d.dash.flac.audio); }
    if(d?.durl) d.durl.forEach(x=>{ if(x.url)x.url=swapTo(x.url,PRIMARY); if(Array.isArray(x.backup_url))x.backup_url=x.backup_url.map(u=>swapTo(u,SECOND)); });
    }catch(e){} return j; };

    try { let _pi; Object.defineProperty(window,'__playinfo__',{configurable:true,get(){return _pi;},set(v){_pi=patch(v);}}); } catch(e){}
    const _fetch=window.fetch;
    const isPlayurl=u=>/\/(player\/(wbi\/)?playurl|pgc\/player\/web\/playurl)/.test(u||'');
    window.fetch=async function(input,init){ const url=typeof input==='string'?input:(input?.url||''); const resp=await _fetch.call(this,input,init);
    if(isPlayurl(url)){ try{ const j=patch(JSON.parse(await resp.clone().text())); return new Response(JSON.stringify(j),{status:resp.status,statusText:resp.statusText,headers:resp.headers}); }catch(e){ return resp; } } return resp; };
    const _open=XMLHttpRequest.prototype.open,_send=XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.open=function(m,u,...r){ this.__u=u; return _open.call(this,m,u,...r); };
    XMLHttpRequest.prototype.send=function(...a){ if(isPlayurl(this.__u)){ this.addEventListener('readystatechange',function(){ if(this.readyState===4&&this.status===200){ try{ const f=JSON.stringify(patch(JSON.parse(this.responseText))); Object.defineProperty(this,'responseText',{get:()=>f}); Object.defineProperty(this,'response',{get:()=>f}); }catch(e){} } }); } return _send.apply(this,a); };

    console.log('[bili-cdn] v2.0 | 主镜像=alib | PCDN已杀 | 强制H264='+(FORCE_AVC?'ON':'OFF'));
    })();

    主楼
  • jasonshu

    咋不贴源码,好奇了,楼主考虑一下

    #1
  • 𝓕-𝓓𝓻𝓸𝓲𝓭

    是啊,应该用```直接贴出来,小字眼睛看得真痛

    #2

发表回复

登录后回复