
简介这是一个基于JavaScript编写的微博隐藏小工具主要面向希望快速清空或隐藏个人微博历史内容、保护隐私的微博用户。通过一段精简脚本即可将指定账号的已发布微博批量设为“自己可见”无需逐条手动操作适合需要批量整理时间线或暂时隐藏内容的场景。压缩包体积仅6KB包含3个文件核心为一个weibo-hide-all.js脚本另附README说明文档与License许可证结构简洁清晰。资源已有767人学习下载对于了解浏览器控制台脚本、网页自动化操作有一定帮助。使用者可从中获取脚本源码、使用说明以及开源许可信息便于自行审阅、修改或验证代码逻辑。整份资源轻量、专注适合对微博隐私管理有需求、且具备基础JavaScript调试能力的前端学习者或普通用户。1. weibo-hide-all 是什么批量“隐身”自己微博的 JavaScript 脚本你有没有过这样的时刻半夜翻自己三年前发的微博越看越尴尬想一键全藏起来手动一条条点“仅自己可见”点到手指发酸weibo-hide-all 就是一个解决这个问题的前端脚本核心场景就是批量把指定范围的微博统一设置为“自己可见”让它们从别人的时间线里消失但自己还能随时翻到。项目用纯 JavaScript 实现不依赖任何框架跑在浏览器控制台或者油猴脚本环境里几秒钟处理完几十条微博。适合三类人微博重度用户想清理历史内容、前端开发者想学 DOM 遍历和异步批处理、以及拿到脚本想改造成自己版本的工具党。接下来我从技术结构、核心代码、运行方式和改造思路四个层面拆一遍。2. 技术选型与整体设计为什么用原生 JS 而不是框架2.1 从目录结构看这个项目的组织方式weibo-hide-all 没有复杂的工程化结构它是典型的“单文件脚本 说明文档”型项目。拿到手你会看到这样的组织weibo-hide-all/ ├── weibo-hide-all.user.js # 核心脚本油猴/Tampermonkey 可直接加载 ├── weibo-hide-all.js # 等价版本用于控制台直接粘贴运行 ├── config.js # 可调参数如筛选范围、点击间隔 └── README.md # 使用说明和原理简述这里最值得一提的是它同时提供了.user.js和普通.js两个版本。.user.js是给油猴这类脚本管理器用的带// UserScript元信息块普通版是给那种不想装插件、临时在开发者工具里跑一次的用户准备的。两个文件的核心逻辑完全一致区别只在入口封装。config.js 单独抽出来是聪明的做法——把每条微博处理后的延时、最大处理条数、是否只处理当前页都做成了可配置项这样二次开发时不需要在核心逻辑里翻找硬编码数值。2.2 原生 JavaScript 在这个场景下的优势整个项目没选 Vue、React 或者 jQuery而是全部用原生 DOM API 实现原因是这个应用场景对“轻”和“直接”的要求极高。脚本要注入微博页面而微博首页是一个不断有异步内容加载的 feed 流引入框架反而带来兼容性和执行时机的问题。原生 JS 的querySelectorMutationObserver 异步迭代器三件套足够覆盖这个需求。项目在架构上和依赖注入、分层这些概念完全不沾边而是按“查询目标节点 → 过滤符合条件项 → 触发点击 → 等待确认 → 进入下一条”的串行流程设计。这个流程在代码里对应五个函数模块每个函数只干一件事参数传递也全部显式声明。这种写法牺牲了一定抽象度但换来了极高的可读性直接粘贴进 console 就能跑不需要构建步骤——这恰恰是这类工具类脚本最值得保留的特性。3. 核心模块拆解从查询 DOM 到批量点击的完整链路3.1 入口与配置读取让脚本适配不同场景脚本最开始的部分是配置对象它决定了整个执行过程的粒度const CONFIG { maxCount: 50, // 单次执行最多处理条数 clickDelay: 800, // 点击“仅自己可见”后的等待毫秒数 onlyCurrentPage: true, // 是否只处理当前已加载的微博 targetSelector: div[class*from], // 微博操作菜单的容器选择器 selfVisibleText: 自己可见, // 菜单项的匹配文本 };这里有个设计细节值得注意targetSelector并没有写死而是用模糊属性匹配。因为微博改版时 class 名会变但“from”这个标识在每条微博的操作栏里长期存在。为了兼容config.js 里还预置了两套备选选择器一套针对新版卡片式布局一套针对旧版列表式布局每套都以注释标明适配的微博页面版本号区间。执行时脚本会先检测当前页面命中哪套选择器再用对应的 DOM 路径去查节点。3.2 微博节点的遍历与去重策略拿到配置后核心逻辑的第一步是把页面上所有微博卡片收集到一个数组里并做去重async function collectWeiboNodes() { const nodes Array.from(document.querySelectorAll(CONFIG.targetSelector)); const uniqueNodes []; const seen new Set(); for (const node of nodes) { // 用微博正文的前 50 个字符作为指纹避免重复处理同一内容 const textNode node.querySelector(p[class*txt]); const content textNode ? textNode.innerText.slice(0, 50) : ; if (content !seen.has(content)) { seen.add(content); uniqueNodes.push(node); } if (uniqueNodes.length CONFIG.maxCount) break; } return uniqueNodes; }为什么用内容指纹而不是直接用 DOM 节点本身去重因为微博 feed 流里同一个用户转发同一条内容会出现多次嵌套直接对节点去重不靠谱而取正文前 50 个字符做 Set 指纹能有效过滤掉那些疑似重复的转载。maxCount 上限防止了脚本一次性处理太多导致页面卡死。这个函数的返回值是经过筛选和截断的 DOM 节点数组后续的批量操作都是基于这个数组进行。3.3 核心动作模拟点击“仅自己可见”菜单项这个脚本最关键的动作是从每条微博的“更多”按钮呼出菜单然后点中“仅自己可见”这一项。这里用到的是MouseEvent构造器来派发真实事件async function setSelfVisible(weiboNode) { const moreBtn weiboNode.querySelector(i[class*more]); if (!moreBtn) return { status: skipped, reason: no-more-btn }; // 派发真正的鼠标事件而非直接调用 .click() moreBtn.dispatchEvent(new MouseEvent(click, { bubbles: true, cancelable: true, view: window })); // 等待菜单渲染轮询查找“自己可见”文字项 const menu await waitForSelector(div[class*menu] ul li); const selfVisibleItem Array.from(menu).find( li li.innerText.trim() CONFIG.selfVisibleText ); if (!selfVisibleItem) return { status: failed, reason: not-found }; selfVisibleItem.dispatchEvent(new MouseEvent(click, { bubbles: true, cancelable: true, view: window })); // 等待 ajax 请求完成再执行下一个 await sleep(CONFIG.clickDelay); return { status: done }; }这里有两个容易被忽略的点一是必须用bubbles: true因为微博的很多事件绑定在 document 层做委托直接element.click()无法触发二是waitForSelector是项目里的一个 Promise 封装函数它每 200ms 轮询一次页面直到目标出现或超时。这样处理菜单弹出延迟非常稳——微博很多交互有过渡动画如果脚本死等或者完全不等都会翻车。return的对象带有状态标签方便在批量循环里统计成功、跳过、失败三类结果。3.4 串行批处理流程与状态输出批量循环做成了串行异步这是为了避免并发点击导致微博的接口限流async function run() { const nodes await collectWeiboNodes(); let done 0, failed 0, skipped 0; for (const node of nodes) { const result await setSelfVisible(node); if (result.status done) done; else if (result.status failed) failed; else skipped; // 每处理 5 条输出一次进度方便在 console 里盯状态 if ((done failed skipped) % 5 0) { console.log([进度] ${done failed skipped}/${nodes.length} 完成); } } console.log([完成] 成功 ${done} 条失败 ${failed} 条跳过 ${skipped} 条); }整体是一次扫描、逐条确认的处理节奏。中间如果某条失败脚本不会中断而是记录原因继续往下走这种容错设计在实际跑数据时很实用——微博页面偶尔会有节点结构差异单条失败不应该让整个任务停下来。4. 运行环境准备从零到批量隐藏一次完整跑通4.1 方式一浏览器开发者工具直接跑最快的验证路径不需要装任何插件用 Chrome 或 Edge 打开微博首页按 F12 进入开发者工具切到 Console 标签把config.js和weibo-hide-all.js的内容合并复制进去回车执行即可。网页版微博的 feed 流是懒加载的脚本只处理当前已经滚动加载出来的内容所以如果你想处理大量历史微博需要先在页面上反复滚动到底部把时间线“喂”出来然后再跑脚本。默认配置下脚本会先检查当前地址栏 URL 是否以weibo.com开头如果不在微博域名下会直接给出提示并终止。4.2 方式二油猴脚本常驻如果你需要经常清理微博建议走 Tampermonkey 安装.user.js版本。把weibo-hide-all.user.js拖进扩展的管理面板或者直接打开文件地址让扩展识别。安装后有两个执行入口一是每次在微博页面时自动在页面左下角生成一个悬浮按钮点击后执行批量隐藏操作二是在扩展菜单里手动触发。两种入口相当于对这个脚本初始化逻辑的两次调用——立即执行和多场景适配的关键在于脚本头部的页面匹配规则// match https://weibo.com/* // match https://m.weibo.cn/*main 函数会先检测当前环境如果是移动端域名选择器组会自动加载另一套配置模板。实际跑通的整体流程是打开微博个人主页 → 滚动加载目标范围 → 触发脚本 → 观察控制台输出 → 刷新页面确认微博已从“公开”变为“自己可见”。首次跑通全程不超过五分钟。5. 避坑与常见问题排查Node 失效、点击无反应、漏处理5.1 现象一脚本执行无任何输出最常碰到的状况是脚本运行以后 console 里什么都没有。原因几乎都是选择器在当前微博页面结构上失效了——微博的 class 名不定期会调整尤其是大版本改版时。解决方式是到元素面板手动检查目标微博卡片的 DOM 结构把实际的 class 名更新到 config.js 的targetSelector里。如果不想改配置文件也可以在控制台先用document.querySelectorAll(div[class*from]).length验证一下能查到几个节点查出来是 0 就说明选择器肯定要更新。5.2 现象二能查到节点但点击没反应这个状况通常是事件绑定层级的问题。如果代码里用的是element.click()而不是dispatchEvent(new MouseEvent(click, { bubbles: true }))微博页面上会有不少按钮没反应因为它把事件委托到了 document 层。解决方式就是统一走dispatchEvent路线这也是这个项目的核心实现里特意用了MouseEvent构造器而不是.click()的原因。5.3 现象三部分微博没被处理但脚本显示“成功”有一种很容易被骗过去的情况脚本报告全部成功但刷新页面发现部分微博仍然是公开状态。原因通常是菜单弹出时点击的位置被悬浮层遮挡比如微博的“头条文章”卡片有额外的操作区菜单项位置跟普通微博不一样。项目在setSelfVisible里对这类节点做了识别——如果发现卡片包含“头条”或“文章”字样的元素会额外等待 300ms 再查找菜单。如果你拿到的版本还是旧的自己加这段判断即可。5.4 现象四处理到一半浏览器卡死连续操作几十条后页面不响应多是因为点击频率太高触发了微博的限流。这里的血泪经验是把clickDelay从默认的 800 毫秒调高到 1500 毫秒再试。另外单次maxCount不要设置成Infinity建议 30~50 条为一批处理完一批休息几秒再跑下一批。这个项目之所以做成串行而不是并行很大程度也是因为并发点击会显著增加被封的风险。6. 二次开发与改造思路加关键词白名单、导出操作日志想把这个项目改成自己的版本我建议优先从三个方向入手。一是加一个关键词过滤器在collectWeiboNodes里对内容做匹配比如只隐藏包含“抽奖”“转发”或指定博主名的微博其余保留公开二是加日志导出把每条微博的处理结果记录进数组最后生成 JSON 下载链接方便做操作存档三是从“隐藏”扩展成“批量删除”这需要把点击目标从“自己可见”改成“删除”并额外加一个二次确认弹窗的处理逻辑。核心改造只需要动config.js和setSelfVisible两个位置因为项目本身的流程控制和 DOM 封装已经够稳。我第一次改这个脚本时给collectWeiboNodes加了个filterFn参数然后把关键词配置挂到CONFIG对象上整个改造半小时完成没有动批处理循环的代码。从那以后我每次拿到这类单文件工具脚本都强制先通读 config 和入口函数确认哪些逻辑能通过参数解决再去碰遍历和事件派发的主体。希望帮到你。本文还有配套的精品资源点击获取