免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

微博一键批量隐藏:weibo-hide-all前端自动化脚本实战解析

微博一键批量隐藏:weibo-hide-all前端自动化脚本实战解析 简介一款面向微博用户的隐藏辅助工具主打“自己可见”式批量处理解决逐条手动隐藏微博的麻烦。主文件为weibo-hide-all.js通过Chrome控制台执行fetch调用脚本后即可自动遍历并隐藏微博整套资源仅6KB共3个文件包含核心js脚本、README说明文档和开源许可证结构精简方便快速查看源码逻辑与使用方式。目前已有760人学习下载适合具备基础浏览器调试能力、想掌握自动化脚本写法的前端学习者。借助这份小体积工具可以直观了解fetch拉取远程脚本、eval执行、类封装以及页面元素批量隐藏的完整思路同时干净的文件划分也为二次开发或迁移至其他社交平台提供了清晰参照。 去年有一阵子我突然想收拾一下自己的微博主页翻着翻着就尴尬了七八年前转发的中二内容、随手发的牢骚、早就忘了来龙去脉的日程碎碎念……全都在主页上摊着。手动一条条改成仅自己可见点了十几条就烦了太慢了。于是干脆写了个小工具起名叫weibo-hide-all作用就是把当前账号的全部微博一键批量设置成自己可见。这个项目本身不复杂是个纯前端自动化的小脚本你登录微博网页版在个人主页打开浏览器控制台跑一下就行不需要装额外软件也不用求人开接口权限。整个过程顺便把滚动加载、DOM解析、批量操作这些前端基本功都过了一遍我做完之后顺手整理了一下这篇就当作完整复盘把思路、实现细节、踩过的坑都摊开来讲清楚。适合在网上冲浪时想快速清理主页、又不想一条条手动操作的朋友也适合刚上手油猴脚本或控制台脚本的开发者拿来做练习。1. 为什么要做的全部微博自己可见需求场景拆解1.1 手动操作的痛点在哪里微博早期的内容策略是公开是默认态发出去的东西默认所有人都能看见。平时大家发动态也就是随手一发没想那么多但等时间久了回头看主页上什么内容都有跟朋友repo的日常、吐槽老板的碎碎念、转发的抽奖、带定位的打卡……有些内容被无关的人看到就会觉得不舒服。要把这些内容隐藏起来微博网页版提供的方式是逐条操作鼠标移到某条微博上点右下角的小箭头在弹出来的菜单里选择仅自己可见。听起来不复杂但真正操作起来就痛苦了每条微博都要单独点击两次一次展开菜单一次选择权限两条微博之间还得等页面反应过来微博主页是无限滚动的今天看了一部分明天再点开又得重新往下拉几年攒下来的几百上千条微博手动操作意味着重复几百上千次点击而且中途手滑点错还可能把不该公开的公开了。实测手动处理 100 条大概要 10 到 15 分钟如果微博有一千条就得一两个小时。这完全是有规律、可重复、能自动化的操作没必要浪费生命。1.2 可能的实现思路与场景延伸所以当时我的判断很简单找到批量处理的方法让它自己跑。可行的路线有三条浏览器控制台脚本利用网页端的 DOM 结构遍历当前页面上已加载的微博逐条模拟点击设置权限。优点是简单直接、不需要额外工具缺点是受微博前端结构变化影响大浏览器油猴脚本Tampermonkey本质还是浏览器端脚本但可以把代码挂载到指定页面自动运行方便重复使用、分享给别人接口请求方式分析微博网页端发送的修改权限的请求拿到登录态后直接请求接口批量更改权限。速度最快但需要处理加密参数、Cookie 有效期等问题维护成本也高。对比下来前两种方案的门槛和风险都小很多实际执行效果也完全够用。我最终选择了控制台脚本为主、附带简单版本的油猴封装这也是 weibo-hide-all 项目的核心实现逻辑。2. 工具的核心原理与机制2.1 weibo-hide-all 的底层工作逻辑不管脚本怎么封装做的事情无非是三步加载全部微博 → 定位可见的微博条目 → 模拟点击设置仅自己可见。第一步是滚动加载。微博个人主页默认只会加载最近几十条想处理全部内容必须先让页面把历史微博都加载出来。实现方式是在控制台跑一个循环滚动的函数不断把页面滚动到底部页面会自动发起 AJAX 请求加载接下来的内容滚动一次、等待内容渲染、再滚动直到页面高度不再变化。第二步是定位微博条目。微博网页版经过多次改版DOM 结构经常调整但总有一条可循的规律每条微博最外层有一个独立的容器节点容器的右下角有一个触发下拉菜单的控件。脚本要做的就是用 DOM 选择器把当前页面上所有这样的容器节点找出来。第三步是模拟操作。对每个容器节点通过 JavaScript 触发对应控件的 click 事件让权限菜单弹出再从菜单里选中仅自己可见这个选项。这个操作本质上是替你完成了手动点击做的事情所以不会绕过任何平台规则和你自己一个个点完全等效。2.2 为什么选择视觉化模拟点击方案写脚本的时候最容易想到的是直接调用微博的接口把某条微博的可见范围从公开改成仅自己可见。这个路子确实快一次请求就能搞定一条几百条微博理论上几秒钟就能完成。但我实测后放弃了这个方案原因有三个门槛高需要从浏览器开发者工具里找到修改权限的接口地址还要带上完整的 Cookie、Referer、以及微博自己生成的请求签名参数任何一个字段不对就会被拒绝稳定性差微博服务端的参数校验策略经常变今天能用的请求格式明天可能就返回错误码脚本需要长期维护风险大直接在接口层批量操作行为特征和正常用户差别很大容易触发风控策略轻则验证码重则临时限制操作。模拟点击方案看起来笨但胜在每次点击都是真实浏览器环境中的一次真实操作和用户手动设置几乎没有行为差异触发风控的概率要小得多。性能上虽然比接口慢但一次批量操作也就是几分钟的事完全能接受。提示不管用哪种方案操作自己的账号是合规的。但如果你掌握了某个自动化方法不要拿去处理别人账号的内容也不要批量操作来绕过平台管控这是底线问题。3. 安装与使用一步步操作全流程3.1 准备工作weibo-hide-all 是纯前端的脚本依赖的东西很少。你需要准备的只有最新版的 Chrome、Edge 或 Firefox 浏览器一个正常登录状态的微博网页版账号打开浏览器开发者工具的快捷键记一下Chrome/Edge 是 F12Mac 上是 CmdOptionI。准备工作只需要确认你的浏览器控制台能够正常执行 JavaScript并且你有权限操作微博网页版页面。不需要安装 Python、Node.js 等任何运行环境。3.2 详细操作步骤我以最常用的控制台运行方式为例按步骤走完全程。第一步进入微博个人主页。登录微博网页端weibo.com点击页面右上角个人头像进入自己的个人主页。此时地址栏里的 URL 类似https://weibo.com/u/你的UID也可能带一些额外参数不管它这里是脚本运行的起点。注意脚本只对当前打开的页面生效。如果你有多份账号记得只保留当前登录的这个以免误操作到其他账号。第二步打开开发者工具。按 F12 打开开发者工具面板切到 Console控制台标签页。如果你之前没怎么用过控制台这里看到的是一个有点像命令行的地方可以直接输入代码回车运行这就是我们要用的环境。第三步执行滚动加载函数让全部微博显示出来。微博是分页加载的不滚动就不会加载历史内容。直接在控制台粘贴以下代码回车运行async function autoScroll() { let totalHeight 0; let scrollAttempts 0; const maxAttempts 200; // 上限保护防止异常死循环 while (scrollAttempts maxAttempts) { const before document.body.scrollHeight; window.scrollTo(0, before); // 等待页面加载新内容 await new Promise(r setTimeout(r, 300)); const after document.body.scrollHeight; // 如果滚动后高度没变说明到底了 if (after before) { scrollAttempts; // 连续 5 次高度没变化判定加载完成 if (scrollAttempts 5) break; } else { scrollAttempts 0; } } console.log(滚动加载完成已到达底部或不再有新内容); } autoScroll();注意脚本设置了maxAttempts 200这是为了防止万一页面本身有问题时脚本无限滚下去。微博内容少的话大部分情况十几秒就到底了内容很多的话这个函数会持续滚动直到全部加载完过程中控制台会不断输出提示等它安静下来就说明加载完了。第四步运行批量设置脚本。滚动完成后粘贴下面的代码到控制台运行(function hideAllVisiblePosts() { // 每一轮最多处理 50 条处理完一轮休息一下避免把页面卡死 const BATCH_SIZE 50; const DELAY_MS 500; // 每一个需要处理的微博节点 function isPostCard(el) { return el el.getAttribute(mid) ! null; } function findController(postNode) { // 优先在卡片右下角范围内找按钮 const actionList postNode.querySelector([class*action]); if (actionList) return actionList; return null; } function clickHideOption(container) { // 展开下拉菜单后找到文字为“仅自己可见”或包含相关图标的选项 const items document.querySelectorAll([class*dropdown] li, [class*menu] li, [class*popover] li); for (let item of items) { const text (item.innerText || ).trim(); if (text.includes(仅自己可见)) { item.click(); return true; } } return false; } async function run() { const cards Array.from(document.querySelectorAll([class*Card])).filter(isPostCard); let processed 0; for (let i 0; i cards.length; i) { const card cards[i]; const ctrl findController(card); if (!ctrl) continue; ctrl.click(); await new Promise(r setTimeout(r, 300)); const ok clickHideOption(card); processed; if (ok) { console.log(已设置隐藏, i 1 / cards.length); } else { console.warn(未找到“仅自己可见”选项, i 1); } // 每处理一批停下来给页面喘息时间 if (processed % BATCH_SIZE 0) { console.log(已完成 processed 条休息一下); await new Promise(r setTimeout(r, DELAY_MS)); } } console.log(本次处理完成共处理 processed 条); } run(); })();脚本会遍历当前页面的所有微博卡片在每个卡片上找到操作按钮点开下拉菜单后按文本匹配方式找到仅自己可见并点击。这里有个细节代码里用了[class*Card]这个模糊选择器来匹配微博的卡片容器。不同时期微博卡片类名都不一样我写这个版本是基于 2023 年底到 2024 年常见的类名结构。如果微博改了前端结构你看到的效果可能不同后面我会专门讲怎么排查和修复。第五步检查结果。运行完脚本后回到微博主页刷新页面确认所有历史微博是否都已经显示为仅自己可见。如果滚动加载那一步中途断了刷新后重新走一遍流程即可。脚本本身是幂等的即使某条微博已经被设置成仅自己可见了再运行一次也不会出问题。3.3 油猴脚本封装重命名与便利性控制台脚本的缺点是每次都要把代码复制粘贴进去。如果你需要经常使用这个功能建议把它封装成一个油猴脚本这样每次进入个人主页就自动运行连控制台都不需要打开。油猴脚本的本质是在页面加载时自动注入 JS。你只需要装好 Tampermonkey 扩展在扩展面板里新建一个脚本把上面的 JS 代码包在一个(function(){ ... })();的结构里再配上match规则匹配https://weibo.com/u/*这个地址保存后刷新微博主页脚本就会自动执行。油猴封装的价值不只在于省去复制代码。你还可以把需要确认的逻辑抽出来比如首次运行时弹一个确认框防止不小心进入页面就直接执行批量操作。我觉得这个功能很重要因为微博个人主页是高频访问页面如果脚本无脑自动运行很容易在生产环境里误伤还没准备好的内容。后来我加了一个confirm(是否执行批量隐藏)的前置确认体验瞬间安全很多。4. 常见问题与故障排查4.1 微博改版了按钮找不到了怎么办这是所有前端自动化脚本都逃不掉的坑。微博的 DOM 结构和类名经常调整哪怕是同一年内的版本不同机型、不同账号状态下看到的页面也可能不一样。排查思路不是去改脚本里每一个类名而是先搞清楚当前页面长什么样。在微博主页按 F12用开发者工具的选择元素功能鼠标移到你想要点击的那个按钮上看它有什么特征。然后调整脚本里的 CSS 选择器和关键词匹配规则。具体来说如果点了操作按钮但菜单没弹出来先在控制台执行一句document.querySelectorAll([class*action]).length看返回的数字是不是 0。如果是 0说明类名已经完全变了需要重新找按钮的定位方式。如果数字正常再看菜单选项的文本仅自己可见这个文字的措辞有没有变比如改成设为仅自己可见如果变了把includes(仅自己可见)改成对应的新文本即可。4.2 脚本卡在滚动加载阶段一直不结束微博的滚动加载并不总是那么顺畅。可能的原因有三类网络慢页面还在等待接口返回但你的脚本已经等不及了。解决方法是把每次滚动的等待时间从 300 毫秒加到 800 到 1000 毫秒并把连续无变化的次数阈值从 5 次提高到 10 次页面懒加载策略变了微博可能把滚动加载从滚动到底就加载改成滚动到底还要再等几秒甚至要求用户点击查看更多。这种情况下脚本就不能只靠滚动需要额外判断页面上是否出现了查看更多之类的按钮如果有就点掉到了真实底部但检测逻辑有误连续 5 次高度不变就判定到底这是经验值如果网络抖动导致页面高度短暂不变化可能误判。我把阈值提高之后这个问题基本消失了。4.3 批量操作时提示操作频繁或触发了验证码这属于最让人糟心的情况但其实是减速没做好。微博对操作频率有隐形限制短时间内在大量微博上执行点击操作很容易触发异常检测。解决办法是在脚本里加入随机延时。每次操作之间不要用固定的 300 毫秒而是改为随机生成 400 到 900 毫秒的间隔让行为更像真人操作。实测下来随机延时脚本跑一整天都没问题固定延时的版本在操作几百条之后就会遇到验证码弹窗。等脚本跑完之后再手动输入一次验证码就能恢复正常不会对账号产生持久影响。提示操作频率是一个经验值没有绝对标准。如果微博加强对异常操作的检测可能需要把延时拉得更长。好好保护自己的账号比一次跑完更重要哪怕多花几分钟也值。4.4 脚本运行完了但微博数量比较多只处理了部分这种情况几乎百分百是滚动加载没有把全部微博都加载出来。很多人在执行批量脚本前没有先跑滚动加载或者滚动加载中途被中断了。微博的滚动加载有一个上限保护机制默认最多加载 1000 条左右。如果你的微博超过这个数量滚动到底之后还有更多内容但页面不会自动加载。这时你需要刷新页面然后多滚动几次或者手动点击页面上的加载更多按钮把剩余内容刷出来。不过说实话真有一千条以上微博的话我建议你换个思路按月份分批处理比如只处理某年某月的内容比一次性处理全部历史内容更可靠。5. 项目总结与扩展建议5.1 做个项目复盘weibo-hide-all 这个项目给我最大的感受是很多看似繁琐的重复操作拆解下来都有自动化的可能性。它需要的技术知识并不高深核心是三条理解页面的 DOM 结构、理解什么时候可以安全地模拟操作、理解怎么让脚本运行得足够温柔。写这个脚本的经历也让我养成了几个习惯不管多简单的脚本都加上超时保护和随机延时跑批量操作前先在小范围试跑一遍确认选择器无误操作前认真看页面结构而不是凭记忆写类名。5.2 可以怎么继续扩展如果想让 weibo-hide-all 做得更完善有几个方向值得尝试增加内容预览功能运行脚本前先把即将设置的微博标题或前 50 字列出来让你确认哪些可以隐藏、哪些需要额外处理精确筛选支持只隐藏某段时间内的微博、只隐藏带图片的微博、只隐藏转发内容等让它从全部隐藏变成按条件隐藏反向操作如果你某天想重新公开某条微博脚本逻辑可以倒过来用只要把仅自己可见换成对应选项即可做成独立工具页可以把控制台逻辑包装成一个简单的 Web 页面输入 UID 后自动在后台执行体验会更好。这次项目做到最后我反而建议大家动手前想清楚自己的目标是什么。是清理我个人主页上的黑历史是减少公共可见的信息暴露还是单纯想学自动化脚本目标不同方案选择会很不一样。对我来说做这个工具最有意义的不是脚本本身而是让我真正搞懂了微博前端页面的运行逻辑以后再遇到类似的网页自动化需求都能快速上手了。本文还有配套的精品资源点击获取
返回列表