简介:这是一份面向微博重度用户与前端脚本爱好者的浏览器端工具资源,用于将账号下所有微博批量设置为仅自己可见,解决手动逐条隐藏效率低、易遗漏的问题。资源包共3个文件,压缩后约6KB,体量轻巧,包含1个JavaScript核心脚本、1份README说明文档和1份LICENSE授权文件;其中js文件承载隐藏逻辑与执行入口,md文档交代使用前提与注意事项,license明确开源使用边界。使用方式为在Chrome浏览器登录微博后,于调试窗口的console中加载并执行脚本,即可自动遍历并隐藏全部微博内容。目前已有763人学习下载,适合希望快速清理历史微博、保护个人隐私或研究浏览器端DOM批量操作思路的读者参考,脚本结构简洁,便于二次修改与功能扩展。
1. 从「自己可见」说起:weibo-hide-all 到底解决什么场景
刷微博时手滑发了一条带定位的动态,三分钟后想删又舍不得——删了评论和转发全没,留着又怕被人翻旧账。微博自带的「设为仅自己可见」要一条条点进去改,几十条历史微博翻下来手指都酸。weibo-hide-all就是冲这个场景来的:一个纯 JavaScript 写的批量操作脚本,把指定范围内的微博一次性转成「自己可见」,不删除、不清空,只是把可见性收回来。
它适合三类人:一是账号里攒了大量早期碎碎念、现在不想被新关注者翻到的老用户;二是做运营或测试时批量发过内容、事后需要统一收口的从业者;三是想拿微博练手前端自动化、又不愿碰复杂框架的 JavaScript 学习者。核心逻辑不依赖后端接口签名,走的是页面 DOM 操作加事件模拟,所以对账号安全边界比较友好。下面把它怎么跑、参数怎么调、哪里容易翻车拆开讲。
2. 拆开 weibo-hide-all:DOM 遍历与可见性切换的实现逻辑
2.1 为什么选 DOM 操作而不是直接调接口
微博的「设为自己可见」在网页端对应一个下拉菜单里的选项,点下去会触发一个带uid、mid和visibility参数的 POST 请求。直接抓这个请求用fetch重放,看起来更高效,但有两个硬伤:一是请求头里的x-csrf-token和x-requested-with会随会话变化,硬编码后隔天就失效;二是微博对高频同源请求有频控,连续几十次 POST 容易触发验证码甚至临时限制。
weibo-hide-all选择模拟真实点击:脚本先滚动加载出微博卡片,找到每张卡片右上角的「更多」按钮,展开菜单,再点「设为自己可见」。整个过程和人工操作在浏览器看来几乎一致,频控压力被摊到每次点击的间隔里。代价是速度慢,但换来的是稳定和低风险。常见做法是配合setTimeout或requestIdleCallback控制节奏,而不是一口气循环到底。
2.2 核心遍历流程与关键代码
脚本的主循环分三步:定位卡片、展开菜单、触发切换。下面这段是简化后的骨架,保留了关键选择器和等待逻辑:
// 遍历当前页面所有微博卡片,逐条切换可见性 async function hideAllVisiblePosts(options = {}) { const { delay = 1200, maxCount = 50 } = options; // 微博卡片容器,class 名随版本可能变化,需按实际 DOM 调整 const cards = document.querySelectorAll('article[class*="woo-panel"]'); let done = 0; for (const card of cards) { if (done >= maxCount) break; // 1. 找到卡片内的“更多”按钮,通常是带 aria-haspopup 的 div const moreBtn = card.querySelector('[aria-haspopup="true"]'); if (!moreBtn) continue; moreBtn.click(); // 2. 等待下拉菜单渲染,菜单项文本含“自己可见” await sleep(400); const menuItems = document.querySelectorAll('div[role="menuitem"]'); const target = [...menuItems].find(el => el.textContent.includes('自己可见') ); if (!target) { // 菜单没出来或已是自己可见,关闭菜单继续 document.body.click(); continue; } // 3. 点击切换,等待请求完成 target.click(); done++; await sleep(delay); } return done; } const sleep = ms => new Promise(r => setTimeout(r, ms));逻辑说明:cards拿到的是当前视口内已渲染的卡片,微博是懒加载,滚动才会出新的,所以脚本通常配合一个自动滚动函数反复调用hideAllVisiblePosts。delay控制每条之间的间隔,默认 1200 毫秒是保守值,网络好可以降到 800,再低就容易撞上频控。maxCount是单次运行上限,防止误操作把整年微博全扫一遍。
参数说明:aria-haspopup="true"是菜单按钮的通用特征,比依赖具体 class 名更稳;role="menuitem"同理。如果微博改版导致选择器失效,优先检查这两个属性是否还在。sleep的等待时间不是随便写的——菜单动画大约 300 毫秒,请求往返 200 到 500 毫秒,留 400 毫秒是给渲染和网络留余量。
2.3 自动滚动与分页衔接
单页卡片有限,要处理历史微博必须滚动。脚本里一般会注入一个滚动触发器:
// 滚动到底部触发懒加载,返回是否还有新内容 async function scrollToLoadMore() { const before = document.body.scrollHeight; window.scrollTo(0, document.body.scrollHeight); await sleep(1500); // 等新卡片渲染 const after = document.body.scrollHeight; return after > before; // 高度没变说明到底了 }把hideAllVisiblePosts和scrollToLoadMore串起来,就是完整的批量流程:处理当前屏 → 滚到底 → 再处理 → 直到高度不变或达到maxCount。这里有个细节,滚动后旧卡片的 DOM 可能被回收,所以每轮都要重新querySelectorAll,不能缓存 NodeList。
3. 跑起来:控制台注入与参数调优的完整步骤
3.1 环境准备与脚本注入方式
不需要装 Node、不需要构建工具,打开微博网页版,登录后按 F12 调出开发者工具,切到 Console 面板,把脚本整段粘贴进去回车即可。如果提示「粘贴保护」,在 Console 输入allow pasting再回车,这是浏览器对陌生代码的默认拦截,不是脚本问题。
注入前建议先做两件事:一是把微博页面语言切成中文,脚本匹配的是「自己可见」这个文本,英文界面下会找不到菜单项;二是关掉其他占用网络的标签页,减少请求竞争。脚本运行期间不要手动滚动或点击,否则可能和自动滚动打架,导致卡片错位。
3.2 参数怎么设:delay、maxCount 与滚动阈值
三个参数直接决定成败和速度,建议按账号情况分档:
| 参数 | 保守值 | 激进值 | 适用场景 |
|---|---|---|---|
| delay | 1500ms | 800ms | 新号/网络差用保守,老号网络好用激进 |
| maxCount | 20 | 100 | 先小批量试水,确认无误再放大 |
| 滚动等待 | 2000ms | 1200ms | 卡片多、图片多时加长 |
第一次跑强烈建议maxCount: 5,盯着看五条是不是都正确变成了「自己可见」,确认选择器和点击路径没问题,再改成 50 或 100。delay低于 800 毫秒时,微博可能返回「操作过于频繁」,这时候脚本不会报错,但那条其实没改成功,所以跑完要抽查。
3.3 验证结果与失败重试
跑完后刷新页面,被处理的微博右上角会显示一个锁形图标或「自己可见」标签。如果发现有的没变,大概率是那一轮菜单没展开就继续了。可以在脚本里加一个失败计数:
let failed = []; // 在 target 找不到时记录 failed.push(card.dataset.mid || 'unknown'); // 结束后打印 console.log('未处理:', failed);拿到失败列表后,单独针对这几条重跑一次,或者手动处理。不要盲目加大maxCount重跑全部,已经改过的再点一次「自己可见」会变成公开,这是最容易翻车的地方——脚本没有幂等判断,重复执行会把状态切回去。
4. 避坑与排查:五条血泪经验
4.1 现象:脚本跑完微博反而全公开了
原因:重复执行。第二次运行时,已经是「自己可见」的微博,菜单里对应项变成了「公开」,脚本按文本匹配「自己可见」找不到,但如果选择器写成了按位置取第一项,就会点到「公开」。解决:在点击前判断当前卡片是否已有锁形图标,有则跳过;或者每次运行前刷新页面,确保状态干净。
4.2 现象:Console 报Cannot read properties of null
原因:moreBtn或target为空。常见于微博改版后 class 名变化,或者卡片还没渲染完就执行了查询。解决:给querySelector加空值判断(脚本里已有if (!moreBtn) continue),同时把滚动等待从 1500 提到 2000 毫秒。如果持续报错,在 Elements 面板手动检查aria-haspopup是否还在。
4.3 现象:跑到一半卡住不动
原因:触发了微博的频控,页面弹出了验证码或滑块。此时脚本的click无效,但循环还在空转。解决:脚本里加一个检测,如果document.querySelector('.geetest_panel')存在就throw new Error('触发验证,请手动处理后重跑'),直接中断,别硬撑。
4.4 现象:部分微博没有「自己可见」选项
原因:该微博是转发、含话题或来自特定来源,微博对这类内容不提供可见性切换。解决:这是平台限制,脚本无解。在遍历时判断菜单项数量,少于两项的直接跳过,不要报错中断。
4.5 现象:刷新后设置又变回公开
原因:网络请求实际失败了,但点击事件已经触发,脚本以为成功。解决:把delay调回 1500 毫秒以上,并在每轮结束后抽查一条。更稳的做法是监听fetch的响应,但会侵入页面逻辑,一般不值得。
5. 进阶:把脚本改造成可配置的浏览器书签
控制台粘贴每次都要复制一大段,麻烦。可以把脚本压缩后做成书签(Bookmarklet),点一下自动执行。做法是把代码包成javascript:(function(){...})(),但注意书签有长度限制,需要先压缩。更实用的进阶是加一个简单的配置弹窗:
// 运行时弹出输入框,让用户填参数 const input = prompt('输入 delay,maxCount(如 1200,30)', '1200,30'); const [delay, maxCount] = input.split(',').map(Number); hideAllVisiblePosts({ delay, maxCount });这样不用改代码就能调参。另一个技巧是加进度提示,每处理 10 条在 Console 打印一次已处理 X 条,长任务时心里有数。验证方法很简单:跑完后用微博自带的「仅自己可见」筛选功能,看列表里是不是多了对应条目,数量对得上就说明成功。
我自己的习惯是每次改完脚本先拿小号跑 3 条,确认状态切换正确再上大号。从那以后我每次批量操作前都强制走一遍「小批量验证 → 抽查 → 放大」的流程,再没出现过把公开当隐藏的翻车。希望帮到你。
本文还有配套的精品资源,点击获取