恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
weibo-hide-all:批量将公开微博设为仅自己可见
首页
资讯中心
/
weibo-hide-all:批量将公开微博设为仅自己可见
weibo-hide-all:批量将公开微博设为仅自己可见
发布时间:2026/10/14 4:07:59
简介这是一款面向微博用户的小型JavaScript工具用于一键隐藏当前账号下的全部微博内容实现“自己可见”的隐私清理效果适合希望批量“隐藏历史动态”或整理个人主页的普通用户与前端爱好者。压缩包共3个文件、大小仅6KB内含一个核心JavaScript脚本、一份Markdown说明文档及一份开源License文件分别承载隐藏逻辑、配置说明与使用条款。已有766人学习/下载。配合网页版微博的控制台运行环境脚本可自动遍历账号下全部博文并批量隐藏省去逐条手动处理的繁琐。脚本代码量小、结构清晰也方便有一定JavaScript基础的读者阅读与二次修改按需扩展为按时间、分组隐藏等个性化功能。1. 把几百条公开微博批量切成“仅自己可见”weibo-hide-all 在解决什么你有没有认真逛过自己账号主页的可见范围很多账号用了三五年从随手转发的段子到深夜碎碎念清一色都是“公开”。某天想收口时一条条点进权限菜单、选择“仅自己可见”、再点确认两百条公开微博能花掉一个下午。weibo-hide-all 要解决的正是这件事打开自己的微博时间线脚本自动扫到每条公开微博的权限入口批量切换成“仅自己可见”连确认框都替你点掉。它适合做账号隐私整理、注销前把历史内容收进私域、或者不想删微博但不想让陌生人继续浏览的人。这篇文从原理、最小脚本到高频踩坑给你一套可以直接照搬的落地做法。2. 批量隐藏的两条技术路线模拟点击与接口请求2.1 模拟点击走正常页面交互风控上最省心微博网页版个人主页上每条已发布微博都带一个可见范围入口公开微博会显示“公开”字样。鼠标点开它菜单里能看到“公开”“仅粉丝可见”“仅自己可见”有时还会有分组选项。手动操作一次动作可以拆成三步点开权限入口、找到“仅自己可见”、点确认保存。weibo-hide-all 最常见的实现就是把这三步放进一个循环里反复执行。用户脚本本质上是跑在页面里的 JavaScript它能拿到当前页面上所有微博卡片节点遍历每个节点查找“公开”按钮找到后调用click()等菜单渲染出来再用文本匹配找“仅自己可见”并点击。如果页面弹出确认框再点一次“确定”。整个过程与真实手点没有任何区别服务器收到的也是一次正常的前端请求所以它的风控特征最接近真人操作。对于只想跑一次清理任务的人这是最不容易翻车的路线。有人会问为什么不直接请求接口接口确实更快但微博前端接口的入参、请求头、Cookie 校验都比较碎而且千万不能忽略一点——接口路径会随版本更新而变化。相比之下模拟点击的维护点集中在“找按钮”和“匹配文案”这两件事上直观得多。我自己的习惯是第一版永远先做模拟点击跑通之后如果批量规模很大、失败重试要求很高再考虑要不要升级成接口直调。2.2 接口请求精确失败重试可行但门槛更高接口直调也不是不能做。打开浏览器开发者工具手动把一条微博切成“仅自己可见”在 Network 面板里找到对应的权限变更请求能看到它通常是个 POST 请求带着这条微博的 ID、目标可见范围值、以及当前登录态的 Cookie 等参数。把这些参数固化成脚本里的常量就可以绕过界面操作直接对每条微博发请求。这样做的好处很明显速度快一条微博从请求到返回只要几百毫秒失败时可以精确捕获单条微博的 ID 和状态码做重试队列不会像模拟点击那样“点完也不知道到底成功没有”。缺点是参数真不好拼。可见范围的值在不同版本里可能是数字、字符串或布尔组合错了可能出现最尴尬的情况——把一条公开微博切成了“仅粉丝可见”自己还以为成功了。我一般只在两种情况下换接口方案一是单账号要处理的公开微博超过几千条模拟点击太慢二是界面按钮因为改版找不到了而接口还能用。否则模拟点击的性价比高得多。另外一个技术前提是接口方案必须妥善处理登录态脚本里不能把 Cookie 写死成固定字符串否则过几天就失效最好让请求自动带上页面自身的 Cookie。2.3 为什么不推荐“编辑重发”或“删除重建”清理可见范围时有人会走歪路把公开微博编辑一遍、清空正文再保存或者干脆删除后重新上传一次。这两类做法都不应该出现在批量隐藏脚本里。编辑微博会改变内容的更新时间原本排序在时间线上也会跟着挪动删除重建更严重原微博 ID、转发数、点赞记录全部归零图片还可能因为重新上传被二次压缩。我们要的是“原文还在只是别人看不到了”而不是“换了一条新微博”。这也是标题里“自己可见”四个字的含义微博本身保留访问权限从公开收敛到仅自己可见。判断一个方案正不正确就看一个标准——普通访客打开你的主页时这些微博是否全部消失但你本人登录后依然能在主页看到完整内容。凡是不满足这个标准的旁门左道都不要用。3. 最小可用脚本装好管理器跑通第一次批量隐藏3.1 先装一个用户脚本管理器在浏览器扩展商店里搜索“用户脚本管理器”选一个下载量靠前的装上。装完后浏览器右上角会出现管理器图标。点击图标选择新建脚本会出现一个编辑页把下面的代码整体粘贴进去按 CtrlS 保存。修改脚本的匹配范围脚本默认匹配微博网页版域名如果你平时打开的是https://weibo.com那直接保持默认就行。保存后打开自己的微博主页如果脚本已经运行浏览器控制台会打印日志。第一次跑之前建议先在控制台手动执行一小段选择器探测确认能找到权限按钮这个步骤放在 3.3 里详细说。3.2 最小脚本代码逐条把“公开”切成“仅自己可见”// UserScript // name weibo-hide-all 自己可见 // namespace local.weibo.hideall // version 0.1.0 // description 批量将微博网页版当前时间线上的公开微博切换为“仅自己可见” // match https://weibo.com/* // grant none // run-at document-idle // /UserScript (function () { use strict; // 可调参数匹配公开状态的文案、目标权限文案、处理间隔 const NEED_TEXT 公开; const RESULT_TEXT 仅自己可见; const MIN_DELAY 2000; const MAX_DELAY 5000; function sleep(ms) { return new Promise((resolve) setTimeout(resolve, ms)); } // 在微博卡片里找到可见范围入口按钮 function findVisibleTrigger(card) { // 不同版本的微博页面这个入口的 class 不一样 // 常见的是 morepop / visible / permission 这类关键词 const candidates card.querySelectorAll([class*morepop], [class*visible], [class*permission]); for (const el of candidates) { if (el.textContent el.textContent.includes(NEED_TEXT)) { return el; } } return null; } // 处理单张卡片点开权限菜单选择“仅自己可见”确认保存 async function hideOne(card) { const trigger findVisibleTrigger(card); if (!trigger) return false; trigger.click(); await sleep(600); // 菜单渲染后从菜单项里按文本找到目标项 const menu document.querySelector([class*morepop], [class*dropdown]); const items menu ? menu.querySelectorAll(li, [rolemenuitem]) : []; let target null; for (const el of items) { if (el.textContent el.textContent.includes(RESULT_TEXT)) { target el; break; } } if (!target) return false; target.click(); await sleep(600); // 部分界面会弹确认框找不到“确定”按钮就直接跳过 const confirmBtn Array.from(document.querySelectorAll(button)) .find((b) b.textContent b.textContent.includes(确定)); if (confirmBtn) confirmBtn.click(); await sleep(1000); return true; } async function runLoop() { // 微博卡片的选择器需要用页面实际结构来定 const cards document.querySelectorAll([class*card], [class*WB_cardwrap]); let done 0; for (const card of cards) { try { const ok await hideOne(card); if (ok) done; } catch (e) { console.warn([weibo-hide-all] 处理失败, e); } // 每条之间随机停顿避免固定频率触发风控 const delay MIN_DELAY Math.random() * (MAX_DELAY - MIN_DELAY); await sleep(delay); } console.log([weibo-hide-all] 本轮处理完成成功切换 done 条未匹配剩余 (cards.length - done) 条); } runLoop(); })();代码逻辑分三段说明hideOne是这个脚本的心脏它先找卡片上的“公开”入口点击后等菜单弹出再按文字找“仅自己可见”点完后处理确认框runLoop负责把页面上所有卡片遍历一遍sleep配合随机延迟控制整体节奏。这个脚本只处理当前页面已渲染出来的微博不负责翻页加载翻页能力放在第 4 章扩展。参数说明NEED_TEXT是触发按钮上的文字默认“公开”如果页面改成“公开可见”之类的文案这里要跟着改RESULT_TEXT是目标菜单项的文字MIN_DELAY和MAX_DELAY是两条微博之间的间隔毫秒数默认 2 到 5 秒随机。选择器是通用占位符不能保证在你的页面上一次命中第一次跑之前必须做选择器适配。3.3 选择器适配第一次跑通前必做的两分钟检查脚本卡住的最常见原因不是逻辑写错而是页面压根没被选中。先不要急着跑全量打开微博主页按 F12 进入开发者工具在 Console 里执行一行document.querySelectorAll([class*card], [class*WB_cardwrap]).length如果返回 0说明选择器完全没匹配上去 Elements 面板随便点一条微博看它最外层节点的 class 是什么再把实际值替换进脚本。接着检查权限入口按钮document.querySelectorAll([class*morepop], [class*visible], [class*permission])同样看返回结果里有没有文本为“公开”的节点。如果按钮文案或图标不是“公开”而是只显示一个小眼睛图标那就要把查找逻辑改成 class 匹配不再依赖文本。适配完成后再跑脚本成功率会高很多。4. 把批量隐藏调到能过夜延迟、过滤与翻页4.1 先调“踩刹车的节奏”延迟参数决定你能跑多久批量隐藏本身不复杂复杂的是别把账号跑进风控。微博对频繁修改可见范围是有频率限制的脚本跑得太快几十条之后就可能弹验证码。频率限制通常不是看总数量而是看短时间内的请求密度。所以延迟参数不是随便给的它直接决定这个任务能否跑完。我常用的延迟区间如下表所示按任务规模和账号状态选场景建议每条间隔说明第一次试跑、数量少于 50 条2 到 5 秒随机快速验证脚本逻辑就算触发风险也能及时收手常规批量清理500 条以内6 到 12 秒随机节奏适中单晚能处理 300 到 500 条夜间挂机处理大量历史微博8 到 15 秒随机配合低峰时段尽量少与正常操作撞在一起已经出现过一次验证码15 秒以上随机此时必须降速宁可跑得慢也不能再触发把随机延迟写进脚本而不是固定一个值是因为固定间隔容易被识别为自动化行为。随机区间让每次请求之间的间隔没有规律更像人手操作。MIN_DELAY 和 MAX_DELAY 的差值越大随机效果越好。4.2 只处理真正需要处理的微博可见范围过滤与日期过滤不是所有微博都要处理。已经“仅自己可见”的微博卡片上本身就带着“仅自己可见”标记再去点一遍没有意义。日期过滤也很常用有时你只想把某个时间点以前的公开微博收起来新发的保持公开。给脚本加一个前置判断就好// 过滤已经切换过的微博卡片里能看到“仅自己可见”就不处理 function alreadyHidden(card) { return card.textContent card.textContent.includes(RESULT_TEXT); } // 过滤指定日期之前的微博按需要打开这行开关 function isBeforeDate(card) { const timeEl card.querySelector(time, [class*time]); if (!timeEl || !timeEl.getAttribute(datetime)) return false; const ts Date.parse(timeEl.getAttribute(datetime)); return ts Date.parse(2023-01-01T00:00:00); }在runLoop里加一行判断for (const card of cards) { if (alreadyHidden(card)) continue; // 如果只想处理 2023 年以前的微博放开下面这行 // if (!isBeforeDate(card)) continue; const ok await hideOne(card); if (ok) done; }日期解析依赖time标签的datetime属性这个属性在不同版本的微博页面上不一定存在。如果卡片上的时间不是标准格式可以直接用正则从文本里取年份代价是只能做年份级过滤。过滤逻辑放到hideOne之前还有一个好处那些已经被隐藏的微博根本不会触发点击减少不必要的风控风险。4.3 配合无限滚动滚到底再继续下一轮微博主页是典型的无限加载页面脚本能处理的只是“当前已经渲染在 DOM 里的卡片”。不滚动页面一批最多处理几十条。要跑完整个主页必须让页面持续往下滚。这里有一个关键细节必须在上一轮处理结束后再滚动否则滚动过程中加载进来的新卡片会混进当前循环导致同一批微博被重复处理。推荐的做法是把runLoop改成一轮一轮执行每轮结束返回处理数量数量不为 0 就继续滚动并进入下一轮let running false; async function runBatch() { if (running) return; running true; const cards document.querySelectorAll([class*card], [class*WB_cardwrap]); let done 0; for (const card of cards) { if (alreadyHidden(card)) continue; const ok await hideOne(card); if (ok) done; const delay MIN_DELAY Math.random() * (MAX_DELAY - MIN_DELAY); await sleep(delay); } running false; console.log([weibo-hide-all] 本轮完成处理 done 条); // 滚到底再跑下一轮已经到底继续跑同一批所以给个退出条件 if (done 0) return; window.scrollTo(0, document.body.scrollHeight); await sleep(2000); runBatch(); } runBatch();这种方式比MutationObserver监听新卡片更直观每轮结束先滚动等两秒让新内容加载再重新查询卡片集合。退出条件设置为“连续一轮没有任何成功处理”避免无限空转。跑过夜的脚本建议在这个基础上再包一层定时器每处理三到四轮主动休息几分钟。5. weibo-hide-all 常见问题与排查五个高频坑5.1 现象控制台有日志页面上的公开微博一条都没动脚本打印了“本轮处理完成”但切回页面一看公开微博原封不动。原因基本锁定在NEED_TEXT匹配不到按钮上。微博页面改版后可见范围入口可能不再显示“公开”两个字而是换成一个小图标鼠标悬停才有提示文字。解决先用选择器探测脚本里的按钮 class确认匹配到几个节点。如果节点是图标类型就不要再依赖文本匹配改成点击该节点。最简单的做法是把findVisibleTrigger里的文本判断去掉只要 class 命中的第一个节点直接点击。5.2 现象切换完成后一刷新微博又变回“公开”处理过程中看到了“仅自己可见”菜单项也点到了但刷新后状态没有保持。最常见的原因是脚本点中的不是真正的可见范围入口而是微博下方的“更多”按钮。有些版本里“更多”按钮也能展开一个菜单菜单里有一个“编辑可见范围”的二级入口跳过这个二级入口直接找“仅自己可见”是找不到的。解决手动点开页面上的权限按钮确认菜单里第一层到底有哪些条目。如果看到的是“编辑”“置顶”“删除”而不是权限选项说明入口找错了。需要先点“编辑可见范围”等待二级面板打开后再在里面选择“仅自己可见”。把这两步拆开中间加 600 毫秒等待脚本就能正常工作。5.3 现象处理到一半弹出验证码脚本卡住不再前进验证码弹窗出现后脚本仍然按自己的节奏点击但点击全部落在验证码遮罩上日志里出现大量失败警告。原因是频率触顶常见于延迟设得太短或者同一时间段重复处理了太多条。解决先停掉脚本手动把验证码过了。然后把MIN_DELAY和MAX_DELAY整体提高到 15 秒以上重新跑之前先确认上一轮已经处理成功的微博不会被再次处理。批量脚本里要加一个“验证码检测”逻辑每轮开始时查找页面上的验证码弹窗如果存在就直接暂停脚本不再发起任何点击等人手动处理后通过控制台备注再继续。5.4 现象跑了一整晚成功切换的只有十几条时间花了不少进度却没走多远。原因通常是两个一是脚本每一轮滚动后都把“已处理的卡片”重新查询进了列表但因为已经切成了“仅自己可见”会被alreadyHidden跳过于是每轮真正处理的只有新加载出来的那几条二是滚动没生效页面从第一屏开始就到底了但判断退出的条件没写脚本空转了一整晚。解决在控制台观察每轮返回的done数量如果每轮都只有几条甚至 0 条先检查window.scrollTo是否真的改变了scrollY。微博新版主页的滚动容器可能在某个内部 div 上而不是整个文档。这时候需要用document.querySelector([class*scroll])找到真正的滚动容器对容器设置scrollTop。5.5 现象昨天还能用的脚本今天按钮就找不到了微博前端经常改版class 名和按钮层级说变就变。脚本报错集中在“找不到目标项”日志里常见cannot read properties of null。解决这不是逻辑问题是页面结构变了。打开开发者工具重新定位权限按钮和“仅自己可见”菜单项的实际 DOM 路径更新脚本里的选择器和文本匹配。如果你不想长期维护这套选择器可以在脚本里把所有选择器集中放在文件顶部方便下次改版时快速替换。6. 进阶给批量隐藏加日志、断点续跑与随机化节奏批量隐藏跑一次不难难的是跑一个晚上不出岔子。三个小功能值得加进脚本处理日志、断点续跑、时间窗口控制。处理日志把每条微博的结果记录成数组结束时在控制台输出方便核对哪些失败断点续跑用 localStorage 保存已成功处理的微博 ID重启浏览器后不会重复处理。function getProgress() { const raw localStorage.getItem(weibo_hide_all_done); return raw ? JSON.parse(raw) : []; } function markDone(id) { const list getProgress(); list.push(id); localStorage.setItem(weibo_hide_all_done, JSON.stringify(list)); } function isDone(card) { const id card.getAttribute(mid) || card.getAttribute(data-id); return id getProgress().includes(id); }在hideOne成功返回后调用markDone在runLoop开头用isDone拦截。微博卡片的 ID 属性名不一定叫mid也可能是style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />