刚打开B站消息中心那一瞬间很多人应该都体会过那种无力感右上角堆着“999”回复、、点赞和系统通知混在一起想找一条真正重要的私信你得在一大堆已读未读里翻好几页。更麻烦的是B站网页端没有那种“一键全部已读”的消息整理能力就算只清理几十条低价值动态提醒也得手动一条条点开、标记、忽略整个过程基本是重复劳动。“B站消息清理助手 v0.2”这类油猴插件解决的就是这个痛点。它不是一个独立App也不需要在手机和电脑上反复登录账号。它是运行在浏览器里的用户脚本跟随你当前的B站会话工作把消息中心里那些机械操作变成自动化的批量流程。这篇文章不只讲怎么装还会拆开来看它背后的油猴脚本原理、多端适配思路、免登录机制的实现逻辑以及实际使用中容易踩的坑。如果你正在被B站消息红点困扰或者你自己想写一个针对站点页面的油猴插件这篇内容值得看完。1. B站消息清理到底难在哪里先说一个判断B站消息清理并不是“不能清理”而是“清理成本太高”。这里的成本主要是操作次数和注意力成本。1.1 消息类型多处理方式不统一B站消息中心至少包含以下几类消息类型来源常见处理诉求回复消息评论/弹幕被回复想要知道对方说了什么消息别人在评论或动态中你需要点进去看上下文点赞消息点赞了你的评论或动态基本无信息量系统通知B站运营活动、公告大部分不想看私信用户私聊重要程度高需保留问题在于不同消息类型的价值完全不一样。点赞消息和系统通知属于低价值消息但又会持续产生未读红点回复和消息属于需要处理的消息但处理完以后也没必要一直留在未读列表里。如果只是简单粗暴地“全部已读”你可能会错过真正重要的内容这才是清理脚本真正需要设计的地方。1.2 手动清理的场景有多低效如果你只有几十条未读手动点也就算了。但对于长期不清理消息的用户未读数量很容易到几百甚至上千。这时B站消息中心的交互就变得非常难受列表是分页加载的一页一页翻效率很低部分消息需要点进去才能标记已读不能直接在列表里批量处理每一条消息的“忽略”或“移除”操作通常都要经过菜单或弹层确认消息列表还可能在滚动加载后重新渲染导致你找不到刚才定位的位置。这些零碎的操作加起来清理一次消息可能要花十几分钟而且过程极度枯燥。一个能遍历当前列表、识别已读状态、自动执行忽略或标记操作的脚本就能把这十几分钟压缩到几秒钟。1.3 为什么不直接用接口或第三方客户端有人会问B站有API直接用接口清理不就行了技术上是可行的但实际使用有门槛需要理解B站消息接口的鉴权机制比如 Cookie、CSRF Token高频率请求可能触发风控第三方客户端或协议库未必长期维护接口一变就失效直接在本地写脚本调用可能需要额外处理登录态安全性很难保证。而油猴脚本运行在浏览器页面环境里天然继承了当前页面的登录态不用自己管理Cookie、不用存储密码、也不用单独做登录页面。这也是“多端免登录”含义的一部分不是绕过B站登录而是利用浏览器里已经存在的登录会话来完成操作。理解这一点非常重要后面我们还会详细展开。2. 油猴脚本的核心概念与适用边界2.1 什么是油猴脚本“油猴”是用户脚本管理器的通俗称呼最早源于Greasemonkey后来在中文社区里被泛指为Tampermonkey、Violentmonkey等用户脚本管理器。它们的作用是让用户通过一段 JavaScript 脚本在特定网页加载后自动执行自定义逻辑。油猴脚本和浏览器扩展Extension不同对比项油猴脚本浏览器扩展安装成本低复制安装或打开.user.js链接即可较高需要打包、加载、审核权限范围由匹配规则限制权限较小可申请完整权限能力更强开发难度低适合个人小工具中高需要了解扩展API更新方式可通过updateURL或用户脚本源自动更新依赖商店或手动加载适用场景页面增强、数据填充、重复操作自动化需要原生能力、后台服务、多标签协同“B站消息清理助手 v0.2”选择做成油猴脚本而不是浏览器扩展核心原因就是它只依赖B站页面本身和API接口不需要额外的后台权限。安装一个脚本管理器再安装一个脚本就可以在B站消息中心页面运行。2.2 用户脚本的运行方式用户脚本不是运行在浏览器插件后台而是注入到匹配的页面中。简单说当你打开message.bilibili.com时脚本管理器会检查当前网址是否匹配脚本里的match规则如果匹配就把脚本注入到页面里执行。这里要解释一个细节用户脚本既可以直接操作页面DOM也可以通过GM_xmlhttpRequest发起跨域请求或者借用页面已有的Cookie、Token向B站同域接口发送请求。大多数消息管理类脚本会选择后一种方式因为它不依赖页面上的按钮结构稳定性更好。2.3 什么是“多端免登录”“多端”通常指两件事第一脚本能同时适配桌面浏览器和移动端页面。B站在不同设备上可能使用不同页面结构或跳转到不同子域名脚本需要识别当前环境选择合适的处理逻辑。第二脚本的配置和运行状态可以跟随账号而不是绑定某一台电脑。用户脚本管理器通常支持云同步只要你在多个设备上安装同一个管理器并登录同步账号脚本就能在多个设备上同时生效。“免登录”则体现在脚本本身不保存账号密码不诱导额外授权也不要求你去填写任何B站凭证。它的运行过程是“借用”当前Tab页里的登录会话。也就是说只有当你在浏览器里已经登录B站时脚本才有权限清理消息未登录状态下脚本只会提示或停止执行不会偷偷尝试登录。这个设计既降低了滥用风险也让普通用户更容易安装使用开一个已登录B站的标签页刷新一下消息中心脚本就自动就绪了。2.4 新手最容易误解的地方很多新手会把“免登录”理解成“不用登录B站也能清理消息”这个理解是错的。B站消息数据属于用户私有数据不可能在未登录状态下访问。正确理解是免去的是脚本侧的“额外登录流程”。只要你浏览器里已经登录B站脚本拿起这个会话就能直接工作不需要再输一次账号密码也不用扫码。对于用户来说体验上接近“打开页面就能用”所以叫“免登录”。3. 环境准备与安装前置条件在安装“B站消息清理助手 v0.2”之前需要先准备好运行环境。下面以最常见的桌面浏览器为例说明。3.1 支持的浏览器和管理器用户脚本的主流运行环境包括浏览器推荐的脚本管理器Chrome / EdgeTampermonkey、ViolentmonkeyFirefoxTampermonkey、ViolentmonkeySafariTampermonkey需要使用扩展方式移动端浏览器Kiwi BrowserChrome内核等支持扩展的浏览器可安装Tampermonkey安装脚本管理器本身属于浏览器扩展安装不在本文章法不安全范围内建议从官方应用商店搜索 Tampermonkey 或 Violentmonkey 后安装。安装完成后浏览器工具栏一般会出现管理器图标点开就能看到“管理面板”入口。3.2 获取脚本的两种常见方式用户脚本的发布通常有两种形式第一种直接打开 .user.js 链接当开发者提供一个以.user.js结尾的安装链接时安装了Tampermonkey的浏览器会弹出安装确认页。点击“安装”即可完成。第二种复制源码到管理面板如果脚本以纯文本发布你也可以打开Tampermonkey管理面板新建脚本把源码粘贴进去并保存。由于“B站消息清理助手 v0.2”在不同渠道发布的版本可能不同安装时应优先选择作者提供的最新.user.js文件地址。如果只找到旧版本不要直接使用以免B站页面更新后脚本失效。3.3 安装后的状态检查安装成功后需要确认以下三个条件是否满足脚本管理器处于启用状态脚本没有因为语法错误被禁用B站账号已经登录。此时打开https://message.bilibili.com或从B站首页进入“消息”页面如果脚本正确注入页面右上角或自定义按钮区域会出现清理入口。如果没有出现可以点击脚本管理器图标查看当前页面是否匹配脚本的match规则。3.4 版本选择建议v0.2 更多是功能迭代版本而不是稳定正式版。从命名习惯看这类“小版本号”脚本往往意味着刚解决了一个重要问题但还没有经过大量用户验证。如果你依赖脚本处理重要消息建议在使用前先备份B站私信等重要数据或者先在未读消息较少的账号上测试效果。4. 核心实现逻辑与关键代码拆解这一节从技术角度拆解一个类似“B站消息清理助手”的用户脚本通常由哪些关键部分组成。下面代码是通用实现演示用来帮助理解脚本的验证逻辑。安装时应以作者发布的完整源码为准。4.1 用户脚本的元数据块所有用户脚本都要在文件头声明一个元数据块用来描述脚本名称、匹配网址、版本、权限等信息。一个典型的元数据块如下// UserScript // name B站消息清理助手 v0.2多端免登录 // namespace bili-msg-cleaner // version 0.2 // description 在B站消息中心批量清理低价值消息兼容桌面与移动端常见页面 // author bili-msg-cleaner // match https://message.bilibili.com/* // match https://www.bilibili.com/* // match https://t.bilibili.com/* // run-at document-idle // grant GM_registerMenuCommand // grant GM_getValue // grant GM_setValue // grant GM_xmlhttpRequest // /UserScript这段代码的要点是match决定了脚本在哪些网址生效。消息中心的域名通常是message.bilibili.com但有些动态消息会跳转到t.bilibili.com所以需要一并匹配。run-at document-idle表示页面加载完成后运行脚本。这样能避免页面结构和脚本初始化逻辑冲突。grant声明了需要使用的油猴API。如果脚本要跨域请求或者持久化配置就必须在元数据中列出对应权限。4.2 判断移动端还是桌面端“多端”不是一句空话页面结构差异意味着选择器、点击坐标、接口调用方式都可能不同。下面是一段常见的环境识别代码。(function () { use strict; const UA navigator.userAgent; const isMobile /Android|iPhone|iPad|iPod|Mobile/i.test(UA); const isBiliMessagePage location.hostname.indexOf(message.bilibili.com) ! -1; console.log([B站消息清理助手] 当前设备 (isMobile ? 移动端 : 桌面端)); console.log([B站消息清理助手] 当前页面 location.href); if (!isBiliMessagePage) { console.log([B站消息清理助手] 不在消息中心脚本不执行清理逻辑); return; } // 后续不同端逻辑从这里分支 if (isMobile) { initMobileCleaner(); } else { initDesktopCleaner(); } })(); function initDesktopCleaner() { // 桌面端消息中心适配逻辑 console.log([B站消息清理助手] 桌面端清理器启动); } function initMobileCleaner() { // 移动端或响应式页面适配逻辑 console.log([B站消息清理助手] 移动端清理器启动); }注意实际脚本不会只靠navigator.userAgent判断因为很多浏览器在PC上也会伪装移动端UA。更稳妥的做法是结合页面宽度、是否存在移动端导航栏、消息区块的DOM特征综合判断。4.3 注册一个可点击的菜单命令用户脚本最常见的交互方式是往Tampermonkey菜单里注册一个命令。用户点击菜单项后脚本立即执行某个清理函数。function startClean(feedType) { // 不同消息类型可以传入不同参数 console.log([B站消息清理助手] 开始清理类型, feedType || 全部); // 这里通常会调用下一页要展示的批量处理核心逻辑 } GM_registerMenuCommand(清理全部未读消息, function () { startClean(all); }); GM_registerMenuCommand(清理点赞/互动类消息, function () { startClean(like); });GM_registerMenuCommand是Tampermonkey提供的菜单注册API。点击脚本管理器图标时鼠标悬停在脚本名称上会展开菜单用户就能看到这些自定义命令。这种交互方式的好处是不需要修改B站页面本身也不容易因为B站改版导致按钮消失。缺点是不够直观普通用户不知道去菜单里找。4.4 处理B站单页应用的动态加载B站消息中心属于典型的单页应用结构。页面切换、列表加载不一定触发整页刷新而是由前端JavaScript动态更新DOM。如果脚本初始化后只绑定一次事件很容易因为页面内容变化而失效。一个成熟的选择是使用MutationObserver监听页面变化let observer; function waitForPageChange(callback) { const debounceTimer 300; let timer null; if (observer) { observer.disconnect(); } observer new MutationObserver(function (mutations) { clearTimeout(timer); timer setTimeout(function () { callback(); }, debounceTimer); }); observer.observe(document.body, { childList: true, subtree: true }); } waitForPageChange(function () { console.log([B站消息清理助手] 页面结构发生变化开始重新扫描消息列表); // 建议在这里重新获取列表元素而不是保留旧的元素引用 });使用MutationObserver有两个好处一是能捕获前端路由切换带来的页面变化二是不会像setInterval那样频繁执行浪费性能。但这里有个细节脚本不能每次DOM变化都执行一次完整清理。一次清理操作可能触发多个DOM变化从而引发连锁调用。所以主逻辑里通常会有“是否正在清理”的锁标记或者用“清理按钮存在就不重复添加”的判断。4.5 批量操作的安全节奏清理脚本面临一个实际风险高频请求会被B站风控拦截。比如你一次性对几十条消息调用“忽略”接口服务器很可能返回异常状态码甚至临时封禁接口权限。一个常见的处理是引入节奏控制每次只处理一小批完成后再等待几百毫秒继续下一批。function processInBatches(items, batchSize, delayMs, callback) { const batchCount Math.ceil(items.length / batchSize); let currentBatch 0; function runNextBatch() { if (currentBatch batchCount) { callback(任务完成); return; } const start currentBatch * batchSize; const end Math.min(start batchSize, items.length); const batch items.slice(start, end); // 处理当前批次的业务逻辑 console.log([B站消息清理助手] 处理第 (currentBatch 1) / batchCount 批共 batch.length 条); currentBatch; setTimeout(runNextBatch, delayMs); } runNextBatch(); } // 示例调用将100个待处理ID按每批10个处理每批间隔800ms processInBatches([], 10, 800, function (message) { console.log([B站消息清理助手] message); });这里把items留空是为了避免与真实B站接口参数混淆。实际使用时你需要根据自己的消息数据结构来填充这个数组。4.6 免登录请求的基本思路用户脚本里请求B站接口时一般不会把用户名密码写在代码里而是依靠浏览器在当前域名下保存的Cookie。比如消息中心页面会携带用户的登录凭证脚本只要向同域API发起请求请求头里就会自动带上Cookie。在油猴环境里如果请求的接口和当前页面同域可以直接用fetch或XMLHttpRequest如果需要跨域请求通常要用GM_xmlhttpRequest并在元数据里声明授权。一个简化的同域请求示意如下async function markMessageRead(messageId) { const csrfToken getCsrfTokenFromPage(); const formData new FormData(); formData.append(id, messageId); formData.append(csrf, csrfToken); try { const response await fetch(/api/msg/mark_read, { method: POST, credentials: include, body: formData }); const result await response.json(); if (result.code 0) { // 操作成功 } else { // 处理失败 } } catch (error) { console.error([B站消息清理助手] 标记已读失败, error); } }这段代码不完整因为B站具体消息接口的路径和参数并不是固定不变的且不同版本可能有差异。这里只是想说明请求逻辑的骨架从页面读取csrf参数、携带Cookie、用POST提交、按返回码判断成功还是失败。如果你要自己分析真实接口可以在B站消息中心打开浏览器开发者工具手动点击一次“标记已读”或“忽略”再观察Network面板中实际发起的是哪个接口、传了什么参数。5. 桌面端和移动端的使用体验差异5.1 桌面端消息中心桌面端是“B站消息清理助手”最常用的场景。B站消息中心在桌面浏览器上通常有左侧分类导航和右侧消息列表。脚本可以扫描当前分类下的所有列表项判断哪些是未读哪些已经处理过。用户更关心的是以下操作是否被拆分清楚只清理低价值消息保留未读的私信和重要回复提供进度提示不会误删任何消息。理想情况下脚本的“清理”不是删除数据而是标记已读、忽略或从当前列表中移除。这样才能避免不可逆损失。5.2 移动端浏览器的适配难度很多用户希望在手机浏览器上通过Kiwi Browser等支持扩展的浏览器使用油猴脚本。然而移动端适配没有想象中简单移动端可能使用不同的路由地址部分B站页面在移动端会强制跳转到App内打开浏览器无法正常获取信息移动端页面的DOM类名可能与桌面端完全不同小屏环境下不适合在页面插入复杂按钮更适合用菜单命令触发。所以如果你看到脚本标明“多端”不要默认它一定在所有移动端App内置浏览器里都能用。通常它优先支持的是手机版Chrome内核浏览器中的消息中心网页。5.3 配置与状态的跨端同步“多端免登录”会给用户带来一个疑问我在电脑上清理过的消息在手机端还会出现吗这个问题的答案取决于B站消息状态是否已经同步。如果脚本通过官方接口标记了已读或忽略那么服务端状态会变更其他设备重新拉取消息时也会显示已处理。也就是说脚本实现的是真正的清理操作而不是只隐藏当前页面上的元素。假如是纯前端隐藏那就只是在当前浏览器里“看着没了”服务端数据还在换设备之后消息又会重新出现。这是判断一个清理脚本是否成熟的重要标准。6. 脚本使用中的常见问题与排查方法在使用类似“B站消息清理助手”的用户脚本时你可能会遇到下面这些问题。这里整理了一份常见的排查表问题现象可能原因排查方式解决方案打开消息中心后看不到脚本按钮网址不匹配脚本的 match 规则点击油猴图标查看脚本是否在当前页面生效修改元数据中的 match添加当前域名脚本菜单存在但点击无反应页面结构变化脚本绑定的DOM节点失效打开控制台查看报错信息更新脚本到最新版本或检查B站是否改版清理进行到一半停止触发了B站风控或接口限流查看Network面板中是否有非200响应降低处理速度增加批次间隔部分消息没有被清理消息类型不同脚本没有覆盖该分类检查脚本支持的消息类型列表手动处理这类消息或反馈给脚本作者换设备后配置丢失脚本配置没有开启同步或没有云同步查看浏览器脚本管理器的同步状态开启同步功能或在多端手动配置6.1 脚本管理器图标显示红色有些浏览器扩展在“无痕模式”下默认禁用。如果脚本在普通页面正常但在无痕页面失效需要进入扩展管理页允许Tampermonkey在无痕模式下运行。6.2 B站页面改版后脚本失效这是油猴脚本最常见的问题。B站只要修改了某个按钮的CSS类名、调整了消息接口的返回字段脚本就可能失灵。遇到这种情况请先确认你安装的脚本是否有新版本作者通常会在评论区或发布页说明适配情况。如果找不到新版就暂时停止使用等待更新。6.3 清理结果与预期不一致使用任何消息管理工具都要先明确一个原则不同消息类型需要的操作不同。盲目“清理全部”可能把你还没有看过的重要回复一起标记为已读。脚本如果提供了“仅清理低价值消息”“跳过未读回复”这类选项你最好在正式使用前理解清楚参数含义。7. 最佳实践与安全建议7.1 将消息分类再清理对你的使用场景进行分类永远是最高优先级私信不要自动清理回复/消息需要先查看内容确认无价值后再清理点赞消息可以放心批量清理系统通知部分具有活动提醒价值自行判断是否清理。如果脚本只提供“全部清理”功能建议你谨慎使用。真正的效率工具应该允许用户定义哪些消息可清理、哪些必须保留。7.2 用小批量验证再全量执行第一次使用脚本时不要直接对几百条未读消息执行全量清理。建议先选择“只处理当前页”或“只处理一批”这类小范围模式。确认效果符合预期后再执行全量操作。这样可以避免因为选择器错误或接口参数异常造成不可预期的结果。7.3 注意脚本来源安全这是油猴脚本用户最容易忽视的问题。用户脚本能读取当前页面内容、模拟用户操作、甚至向接口发送请求。如果是一个恶意脚本它可以窃取你当前网站的数据也可能伪装成清理工具诱导你点击危险操作。因此安装任何用户脚本都应当遵循三个原则只从作者的官方发布渠道或可信社区获取脚本检查脚本源码尤其注意是否有向第三方域名发送数据的代码不使用来路不明的“一键版”“破解版”脚本。不要因为某个脚本号称“免登录”“多端”就放松对安全性的警惕。7.4 不要依赖脚本管理重要私信B站私信可能包含工作沟通、朋友联系方式等重要信息。消息清理脚本的主要价值是整理低价值通知而不是替你管理重要对话。在运行任何清理操作前对私信等关键数据做好离线备份始终是稳妥的工程习惯。7.5 保持脚本更新节奏油猴脚本的更新不像App Store那样有强制审核很多人安装后可能几个月不更新直到某天B站页面改版才发现脚本失效。建议你每隔一段时间回到脚本发布页检查版本号或者在Tampermonkey设置里开启脚本更新检查。如果你自己修改过脚本源码更新时要注意本地修改可能会被覆盖。8. 自己写一个消息清理脚本需要什么能力如果你对“B站消息清理助手”的内部实现好奇也可以把这个项目当作一个学习样本。自己写一个类似的油猴脚本需要以下能力理解JavaScript基础语法、异步编程和DOM操作能使用浏览器开发者工具分析页面结构和网络请求熟悉用户脚本管理器的元数据规则和API了解B站消息中心的页面分类和基本交互逻辑具备一定的接口请求节奏控制和异常处理经验。更具体地说你首先要做的是打开B站消息中心用开发者工具查看消息列表的HTML结构找出每条消息的唯一定位方式。接着手动执行一次标记已读或清理操作观察Network面板里的请求详情。当你理解了“页面上做了什么操作、底层发了什么请求”之后再用脚本把整个过程自动化这就是开发用户脚本的基本路径。另外提醒一句油猴脚本本质是浏览器前端自动化不应当被用来绕过平台限制或批量发送恶意请求。把它用在提升自己的操作效率上才是合理的方向。9. 总结与下一步建议“B站消息清理助手 v0.2多端免登录”并不是一个复杂到无法理解的工具。它展示了用户脚本体系的一个典型价值在网页端的机械操作太多时用一段JavaScript把重复劳动自动化同时借助浏览器已有的登录态避开复杂的账号接入流程。对于使用层面的读者来说你要做的准备很明确安装Tampermonkey或Violentmonkey从可信渠道获取脚本在已登录B站的浏览器中进入消息中心再通过脚本菜单触发清理。对于想深入技术原理的读者来说这篇文章提到的元数据配置、移动端判断、MutationObserver监听、批量请求节奏控制以及“先从页面操作和网络请求反推实现”的开发思路都是你开始写第一个油猴脚本时可以继续深挖的方向。最后还想补充一个实用建议像B站这样的前端页面每隔一段时间就可能调整旧版脚本失效是常态不是个例。安装一个脚本后不要把它当成永久有效的工具。每当脚本表现异常先检查B站页面是否更新再去看脚本作者是否发布了新版本。对于消息类数据操作前备份重要内容永远比事后想办法恢复数据更可靠。