实战学习油猴脚本 Make Bilibili Great Again!

3,916 阅读3分钟

前言

有没有读者和作者一样,在满心欢喜的打开 UP 主的动态希望可以开心干饭时,却发现 UP 发布的是一个广告?例如:

image.png

有没有办法可以去掉这些广告呢?

本来将通过一个案例分享如何利用油猴脚本增强网站体验(为所欲为),让我们开始吧!

什么是油猴脚本

油猴脚本(Tampermonkey)是一种浏览器扩展,用于在网页上运行自定义的用户脚本。这些脚本可以修改网页的行为和外观,以增强用户体验或实现特定功能。油猴脚本通常用于自动化任务、屏蔽广告、修改网页样式等。它支持多种浏览器,如Chrome、Firefox、Safari等。

分析案例

通过查看控制台,我们发现 Feed 流是调用的这个接口: /x/polymer/web-dynamic/v1/feed/al:

image.png

通过进一步分析,我们看到 Feed 中的数据结构如下:

image.png

思路分析

一个非常直观的思路即,过滤掉非视频元素 ('DYNAMIC_TYPE_AV'(视频类型))。

image.png 另外,我们观察到,这个接口的调用是利用的 xhr,而不是 fetch

那么一个非常直观的思路就是,劫持 xhr,通过判断调用地址定位到 Feed 流接口,手动过滤掉非视频元素。

为了避免造轮子,我们发现一个非常好用的库 github.com/jpillora/xh… ,使用也非常简单:

image.png 但是我们发现如果直接引用 xhook 脚本到油猴脚本中,并不起作用。原因是油猴脚本需要使用者手动调用 unsafeWindow 而不是 window

而在 xhook 脚本中,劫持 XMLHttpRequest 时使用的是 window

image.png

github.com/jpillora/xh…

image.png

所以我们无法直接加载 xhook 的脚本,那么我们索性全库引用,然后传入 unsafeWindow 作为代码中 window 的真正引用。

image.png

  • 我们增加了 window 作为 xhook 这个函数的参数
  • 我们传入了 unsafeWindow 作为真正的 window 的引用

这样我们完成了加载 xhook 的功能。

核心实现

核心逻辑非常简单直白,作者就不做额外的说明了。代码仓库在 github.com/xiaoyu2er/b…

image.png

额外说明

油猴脚本需要一系列的指令来让油猴扩展了解脚本的元信息,以本脚本为例:

image.png

  • line-7 表明这个脚本是需要在 t.bilibili.com 域名下才需要启动
  • line-8 表明这个脚本需要使用 unsafeWindow
  • line-11 表明这个脚本的更新地址
  • line-12 表明这个脚本的执行是在 document-start 因为我们需要修改 xhr 的定义,所以这个时机应该在页面逻辑执行前就完成

效果展示

我们首先需要安装油猴的扩展,然后打开我们的油猴脚本,github.com/xiaoyu2er/b… 点击 Raw 就会触发油猴扩展,然后我们点击安装(或者更新)

image.png

image.png

当我们安装了油猴脚本之后,再次打开哔哩哔哩 Feed 页面:

image.png

我们发现油猴扩展有一个脚本正在运行,而且 Feed 页面已经没有广告了!让我们开心的干饭吧!

脑洞大开

好了,一个让哔哩哔哩体验更好的脚本就完成了,思路打开,我们可以使用油猴脚本做非常多的事情,剩下的就交给读者吧!