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×tamp=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&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">Found</a>.
并且手机版的b站网页非常难用,不小心碰到就开始给你下客户端,有时候还跟某国产rom的奇怪bug相辅相成让人根本看不了视频(originOS浏览器会自动跳转应用,然后网页自动关闭,又拉不起来应用),还会往你的剪切版里塞东西,覆盖原本复制的东西,但有时要看朋友分享的视频,也常会用到,于是打算做点什么改善下体验
想要的效果:
- 点击短链接之后直接到一个简单的视频播放页面
- 去除短链转换的带跟踪信息的连接
过程记录
要想做到点击短链接之后直接到一个简单的视频播放页面
可以在浏览器下功夫塞脚本,但是第一个设备多,不是所有设备都有能放脚本的浏览器,然后很多软件的链接会在应用内浏览器打开,不行
这里注意到默认分享的是http协议,这就好办了,直接劫持到自己的服务器,我这openwrt软路由的自定义主机名功能其实就是一个dns劫持,局域网内设备的dns服务器都是软路由
这里先用局域网设备试验下,之后放到云服务器上去,最大可能隔离家里的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, () => { });
完事,收工