AIGC标识 B站首页,点击视频卡片之后首页自动刷新的问题

突然在某一天,发现了标题的这个问题,一直没怎么去管,因为影响不是很大。
但是有的时候首页有很多想看的视频,点进一个之后,首页自动刷新了,非常难受!

发现有可能是插件的问题,更新了几个插件之后,还是存在这样的问题。于是大概率是插件冲突了。
但是我不会前端啊,找到了大概是哪个插件的问题,然后交给Astra去修了,果然修好了。

有同样问题的人,可以参考这个文章去修改,我这边已经没有问题了。

接下来是Astra给出的报告:

B站首页打开视频后推荐列表消失:一次插件冲突排查记录

问题表现

在 B 站首页浏览视频时,点击某个视频并进入新标签页,原来的首页会出现异常:

  • 回到原首页后,之前看到的视频列表不见了;
  • 首页推荐内容像是重新加载了一遍;
  • 有时看起来像页面刷新,但实际上原标签页主要经历的是失焦、隐藏和恢复可见;
  • 关闭某个油猴脚本后,问题消失。

这个问题容易被误认为是浏览器、B站本身,或者“打开新标签页”的操作出了问题。实际排查后,原因是两个脚本对 B 站登录状态的理解不一致。

涉及的两个插件

BewlyCat

BewlyCat 是一个修改 B 站页面布局和首页体验的浏览器扩展。它会维护自己的首页推荐列表、顶栏状态和标签页状态。页面从后台恢复到前台时,它会重新检查当前登录状态,并在必要时同步或重建相关页面数据。

本次使用的源码来自 BewlyCat 的公开仓库:

keleus/BewlyCat

源码已保存在本地的 BewlyCat 目录中,仅用于排查和定位问题。

哔哩免登录看评论+1080p视频+免弹窗

这是一个油猴脚本。它通过拦截 B 站部分接口响应,模拟登录状态,从而提供以下功能:

  • 未登录状态下查看较完整的评论;
  • 观看较高清的视频;
  • 减少部分登录提示或弹窗;
  • 处理字幕、播放器和部分 B 站接口。

这个脚本不是普通的页面美化脚本。它会在页面很早的阶段修改全局 fetch 和 XMLHttpRequest,并写入 DedeUserID Cookie,因此会影响其他扩展对 B 站状态和接口的判断。

排查过程

最初通过浏览器开发者工具确认,问题发生时没有发现油猴脚本直接调用 location.reload()、window.open() 或 location.assign()。因此,表面上的“刷新”并不是辅助脚本直接执行了刷新命令。

随后增加了一个临时取证脚本,记录了点击、页面隐藏、页面恢复、路由变化、网络请求和页面生命周期。日志显示:

  1. 点击目标确实是 B 站视频卡片;
  2. 原首页先触发 blur 和 visibilitychange: hidden;
  3. 视频页在新标签页中正常打开;
  4. 原首页恢复可见时,BewlyCat 会重新处理页面状态;
  5. 首页推荐内容随后被重新初始化。

日志中还能看到 BewlyCat 注册的 visibilitychange 监听器,以及 plugin.js 注入的 XHR 请求拦截器。这说明冲突发生在两个脚本共享页面状态的地方,而不是单纯的鼠标点击行为。

真正的冲突原因

问题核心是 DedeUserID 和 /x/web-interface/nav 接口返回的用户 ID 不一致。

plugin.js 为了模拟登录状态,会在页面启动时写入一个随机的 DedeUserID。与此同时,它原本在伪造 /x/web-interface/nav 接口时,返回了一个固定的用户 mid。

于是 BewlyCat 可能看到这样的状态:

Cookie 中的 DedeUserID:随机值 A
nav 接口返回的 data.mid:固定值 B

BewlyCat 会把 DedeUserID 当作本地登录用户 ID,并在页面从后台恢复时重新校验它。如果 Cookie 中的 ID 和接口返回的 ID 不一致,BewlyCat 会按照“账号发生变化”处理,清理旧账号相关状态,并重置首页推荐数据。

这就解释了为什么问题通常出现在“点击视频打开新标签页,再回到首页”之后:新标签页和原标签页都会运行油猴脚本,Cookie 和页面状态的重新检查恰好在标签页切换时被触发。

修改了哪个插件、哪个位置

本次修改的是油猴脚本,没有修改 BewlyCat 的源码,也没有修改 B 站页面。

修改集中在两个位置。

1. 伪造导航用户信息的位置

在处理 B 站 /x/web-interface/nav 请求的逻辑附近,增加了用户 ID 同步处理:

  • 读取当前页面的 DedeUserID;
  • 将伪造导航响应中的 data.mid 设置为同一个 ID;
  • 同步伪造钱包信息中的 mid。

这样,BewlyCat 看到的 Cookie 用户 ID 和导航接口用户 ID 就保持一致,不会因为标签页切换被误判成账号切换。

在脚本初始化和写入 DedeUserID 的位置,调整了判断条件:

  • 只有在真实登录 Cookie 和已有的伪造 DedeUserID 都不存在时,才生成新的伪造 ID;
  • 如果已有伪造 ID,则继续沿用,不在每个新标签页中重新生成;
  • 只有检测到真实登录 Cookie 时,才清除免登录请求拦截。

这里有一个容易出错的细节:已有伪造 DedeUserID 不代表用户已经真实登录。若把它和真实登录 Cookie 混为一谈,脚本会错误地停止所有请求拦截,导致免登录评论、高清画质等原功能失效。

另外,伪造 ID 的生成范围也限制在 JavaScript 能准确表示的安全整数范围内,避免因为数字精度造成 Cookie 值和接口返回值再次不一致。

没有改动的部分

本次修复没有改动以下功能的主体逻辑:

  • 评论接口处理;
  • 视频播放地址处理;
  • 1080P 请求参数处理;
  • 字幕处理;
  • 弹幕 WebSocket 处理;
  • BewlyCat 的页面布局和首页组件。

文章只记录故障原因和修改范围,没有附上任一插件的完整源码,也没有复制第三方项目的实现代码。

验证方式

修改油猴脚本后,需要在 Tampermonkey 中保存最新内容,并确认没有同时启用旧版本。由于脚本头可能带有自动更新地址,建议关闭该脚本的自动更新,避免本地修改被覆盖。

验证时可以按下面的顺序操作:

  1. 完全关闭已经打开的 B 站标签页;
  2. 新开一个 B 站首页;
  3. 确认 BewlyCat 和修正版油猴脚本都已启用;
  4. 点击一个视频,让它打开新标签页;
  5. 切回原来的首页;
  6. 检查原来的推荐列表是否仍然保留;
  7. 再进入视频页确认评论和高清播放功能仍然正常。

如果问题再次出现,应优先检查当前实际运行的油猴脚本版本,以及浏览器中是否同时启用了旧版和修正版。多个版本同时运行会让请求拦截器和 Cookie 状态再次互相覆盖。

posted @ 2026-09-27 13:26  粉紫系超人气月兔铃仙  阅读(62)  评论(0)    收藏  举报