CUBERWR/BLOG

劫持B站短链接洗去隐私信息简化网页

2023.08.06

b站分享链接默认是短链,解析之后跳转会附带分享者的各种信息,后面访问者跟分享者相关广告推送什么的估计就来了,也可能是一种“朋友说了个什么,我手机就推送了”的原因吧

curl -i "https://b23.tv/c7gB76o"
HTTP/2 302 
date: Sun, 06 Aug 2023 01:27:31 GMT
content-type: text/html; charset=utf-8
content-length: 433
bili-trace-id: 5496fa165964cef7
location: https://www.bilibili.com/video/BV1mN411h73J?buvid=XU237172D2A96BFF23E1A13F2E2790CE60962&is_story_h5=false&mid=B94bHdMqFivHMaTaXbe25g%3D%3D&p=1&plat_id=116&share_from=ugc&share_medium=android_i&share_plat=android&share_session_id=d890337c-e408-45a1-b95b-387f775d6e12&share_source=COPY&share_tag=s_i&timestamp=1691285211&unique_k=c7gB76o&up_id=3493115675543974
x-bili-trace-id: 6934c643512bdbc95496fa165964cef7
expires: Sun, 06 Aug 2023 01:27:30 GMT
cache-control: no-cache
x-cache-webcdn: BYPASS from blzone01

<a href="https://www.bilibili.com/video/BV1mN411h73J?buvid=XU237172D2A96BFF23E1A13F2E2790CE60962&amp;is_story_h5=false&amp;mid=B94bHdMqFivHMaTaXbe25g%3D%3D&amp;p=1&amp;plat_id=116&amp;share_from=ugc&amp;share_medium=android_i&amp;share_plat=android&amp;share_session_id=d890337c-e408-45a1-b95b-387f775d6e12&amp;share_source=COPY&amp;share_tag=s_i&amp;timestamp=1691285211&amp;unique_k=c7gB76o&amp;up_id=3493115675543974">Found</a>.

并且手机版的b站网页非常难用,不小心碰到就开始给你下客户端,有时候还跟某国产rom的奇怪bug相辅相成让人根本看不了视频(originOS浏览器会自动跳转应用,然后网页自动关闭,又拉不起来应用),还会往你的剪切版里塞东西,覆盖原本复制的东西,但有时要看朋友分享的视频,也常会用到,于是打算做点什么改善下体验

想要的效果:

  • 点击短链接之后直接到一个简单的视频播放页面
  • 去除短链转换的带跟踪信息的连接

过程记录

要想做到点击短链接之后直接到一个简单的视频播放页面

可以在浏览器下功夫塞脚本,但是第一个设备多,不是所有设备都有能放脚本的浏览器,然后很多软件的链接会在应用内浏览器打开,不行

这里注意到默认分享的是http协议,这就好办了,直接劫持到自己的服务器,我这openwrt软路由的自定义主机名功能其实就是一个dns劫持,局域网内设备的dns服务器都是软路由

image.png

这里先用局域网设备试验下,之后放到云服务器上去,最大可能隔离家里的ip信息

劫持到之后访问b23.tv会访问到我自己的设备,这时候处理请求,找到真实的视频地址(在header的location里面),放一个iframe里面传回设备

async function short2bv(short) {
    const res = await fetch('https://b23.tv' + short, { redirect: 'manual' })
    return res.headers.get('location').split('?')[0].split('/').at(-1)
}
require('http').createServer(async (req, res) => {
    if (req.url.includes('.')) return
    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end(`<iframe src="//player.bilibili.com/player.html?bvid=${await short2bv(req.url)}" style="position:absolute; top:0; left:0; width:100%; height:100%;" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>`);
    return
}).listen(80, () => { });

完事,收工