用Vibe Coding一小时搞定微博批量隐藏:Playwright自动化脚本实战

发布时间:2026/10/11 12:28:06

用Vibe Coding一小时搞定微博批量隐藏:Playwright自动化脚本实战 最近清理微博主页翻到十年前发的那些转发、打卡、半夜emo真是想找个地缝钻进去。删掉吧舍不得留着吧又不想让新关注的人看到唯一能两全的办法就是设置成“仅自己可见”——微博用户的黑话叫“自见”。手动一条条设置点开更多、找菜单、确认每条至少四五次点击我手里还有三百多条要处理想想都绝望。刚好那阵子一直在玩 Vibe Coding就是用自然语言怼着AI让它写代码的玩法索性花了一个小时让AI帮我写了个批量隐藏微博自见的脚本几分钟把历史微博全部处理完。这篇不是教程文档记录一下这个真实的 Vibe Coding 项目怎么做下来需求怎么拆、方案怎么选、和AI怎么一来一回把它“Vibe”出来以及过程中的翻车和补救。如果你也对这种新玩法感兴趣或者单纯想解决和我一样的“历史微博社死”问题这篇应该能帮上忙。1. 这个Vibe Coding项目到底在解决什么问题1.1 “自见”是什么批量隐藏的场景有多常见先给不混微博黑话的朋友解释一下“自见”就是“仅自己可见”的简称。把一条微博设成自见之后除了你自己谁都看不到。它和删除的区别在于内容还在、数据还在只是从公开主页上消失了。很多早年微博不适合直接删——比如记录、回忆、碎碎念——但也不想继续公开那自见就是唯一能两全的操作。手动设置有多麻烦一条微博的完整流程是鼠标悬停微博右上角点开“更多”按钮等菜单弹出来找到“仅自己可见”选项点击再在弹窗里点确认。快的话四五秒慢的话十秒以上。微博网页版又没有“全选批量设为自见”这种功能所以几百条下来半小时到一个小时就没了而且特别容易漏。这时候很自然会想到写个自动化脚本。但这种脚本的恶心之处在于它不复杂但琐碎。要管登录态、页面滚动、DOM元素定位、弹窗、限速……人肉写的话光调试选择器就能耗掉一下午。而这正是 Vibe Coding 最擅长的领域任务清楚、边界明确、容错率高AI生成初版、你负责提要求和纠偏。1.2 为什么“1小时Vibe出来”是可信的Vibe Coding 的核心状态是“人给方向、AI给实现”不是一次成型而是快速循环。正常流程是我先用两三句话描述需求AI吐出第一版脚本我丢进终端跑把报错扔回给AIAI改完再跑遇到新问题再继续反馈。这中间每次循环大概5-10分钟跑通核心流程用不了一小时。我觉得这个项目特别适合 Vibe。它不需要高性能逻辑不需要复杂算法都是“点击、等待、判断”这种AI训练数据里见过一万遍的模式。调好之后AI写出来的代码甚至能直接打包给朋友用。这也是为什么我一直把“嵌入式 vibe coding”挂在嘴边——Vibe 应该被嵌入到日常提效里而不是当噱头玩两天就扔了。真正把需求说清楚、把边界写明白AI 的产出速度是肉眼可见的快。2. 方案选型官方API、油猴脚本还是浏览器自动化2.1 为什么第一时间排除了官方API一开始我确实想过走微博官方接口。但凡接触过微博开发的都知道第三方接口早就收得很紧了大量写操作接口不对个人开发者开放即使拿到了调用频率和权限也卡得很死。想用API批量改可见性光应用审核那一关就够呛而且官方风控逻辑不透明说不定哪天接口就悄悄失效了。对“一小时搞定”的目标来说这条路直接否决。2.2 油猴脚本和Playwright之间怎么选UI自动化有两条主流路线我在这之间犹豫了一阵子。方案优点缺点油猴脚本Tampermonkey轻量打开页面就自动执行需要处理跨域、页面重渲染调试麻烦选择器一旦失效很难定位问题Playwright Python完全模拟真人操作能控制滚动、等待、点击可复用登录状态环境稍微重一些但对个人小工具无所谓我最后选了 Playwright。理由很简单这次任务有三个绕不开的硬需求——长页面滚动加载、登录状态复用、稳定等待弹窗和按钮。这三个需求在油猴脚本里都得写一堆 hacky 代码而在 Playwright 里是现成能力。选择器问题两边都有但 Playwright 能方便地把当前页面 DOM dump 出来给 AI 调这个优势在 Vibe Coding 的工作流里特别值钱。2.3 核心工作量其实就三块整个项目的技术点拆开无非三块第一定位并点击“更多”菜单与“仅自己可见”选项第二循环遍历当前已加载的微博再滚动加载旧的微博直到全部处理完第三操作之间加随机延迟规避风控同时打印日志方便断点续跑。把这三块描述给 AI让它往下展开就行。其余什么登录态、等待策略、运行参数都是可以后补的细节。我当时没有在框架上纠结太久因为 Vibe Coding 的玩法本来就允许“先跑起来再说”框架问题在反馈循环里自然会暴露和修正。3. 现场记录我如何一步步把脚本Vibe出来3.1 第一轮需求扔给AI拿到能跑的骨架当时我给的 prompt 大意是这样用Python和Playwright写一个批量操作微博可见性的脚本打开微博网页版复用登录状态滚动遍历我主页所有微博对每条公开微博点击“更多”选“仅自己可见”已经有“仅自己可见”标签的跳过操作之间随机延迟2-5秒每20条暂停20秒打印日志并输出CSV备份AI 很快给了一版能跑的骨架核心逻辑没问题本地一跑就暴露了第一个大问题浏览器直接弹出登录页因为登录态没带上。初版代码大致长这样结构很标准但实际运行需要反复调from playwright.sync_api import sync_playwright import random, time with sync_playwright() as p: browser p.chromium.launch_persistent_context( user_data_dir./weibo_session, headlessFalse, localezh-CN ) page browser.pages[0] if browser.pages else browser.new_page() page.goto(https://weibo.com) # 之后的遍历、点击和确认逻辑需要逐轮完善我当时没指望它一次就对直接把运行结果扔回给 AI进入第二轮。3.2 第二轮复用登录态解决反复登录我把现象贴回去“每次启动都要求登录怎么复用已经登录的浏览器”AI 让我用launch_persistent_context指定一个本地用户数据目录第一次手动登录之后所有运行都复用这个登录态。这个改动是整个项目里最关键的一步解决了“脚本能用但每次都要你扫码”这种最劝退的问题。顺带我还让 AI 加了显式等待逻辑。微博页面是动态渲染的不等待直接点元素基本会扑空。AI 改成在关键操作前等待某个节点出现或者等待网络空闲操作就稳了很多。这一轮改动不大但直接把“能跑”变成了“能稳定跑”。3.3 第三轮搞定无限滚动加载第二个坑是脚本只处理到当前可见的微博就停了没办法继续加载历史微博。原因是微博主页是往下滚着加载的脚本必须先滚到底部等新内容渲染再接着处理下一批。AI 给的做法很直接last_count -1 while True: count page.locator(article).count() # 按实际DOM结构调整 if count last_count: break # 没有新内容说明到底了 last_count count page.mouse.wheel(0, 20000) # 滚动到底 page.wait_for_timeout(random.randint(2000, 3000))这逻辑听着简单实际调试时也要折腾几轮但 AI 很快就改对了。这种“滚动-等待-统计比较”的模式基本是所有无限流页面自动化的万能药以后处理别的平台也能直接复用。3.4 第四轮区分已隐藏微博避免重复操作再往后就是细化有些微博本来就设了自见脚本没必要再点一遍。AI 的思路是处理之前先检查这条微博上是否已经带有“仅自己可见”的标签或菜单文案有就跳过。我跑了一遍日志里出现了一堆“跳过已自见”的记录说明判断逻辑生效了。最终跑起来很顺。三百多条微博十几分钟跑完中间还故意每处理20条暂停20秒假装一个手速比较慢的人类。跑完后我去主页抽查公开区干净了历史微博全在个人可见列表里一条没漏。日志大概长这样[12:31:07] #12 已处理https://weibo.com/xxx - 仅自己可见 [12:31:12] #13 跳过已经是仅自己可见 [12:31:16] #14 已处理https://weibo.com/xxx - 仅自己可见4. 踩坑实录这些坑你大概率也会遇到4.1 微博改版导致选择器失效怎么让AI重新定位前端项目最喜欢改 class 名微博尤其勤快。我有一版脚本早上还跑得好好的晚上直接全军覆没所有元素都找不到了。后来我让 AI 改成“文本定位优先”的方式——通过可读文本“仅自己可见”“更多”来找按钮而不是死等 class。这一改抗改版能力强了很多。真到万不得已要用 class 的时候正确姿势也不是自己盯着 DevTools 猜而是复制当前页面 DOM把一小段带上下文的结构丢给 AI让它重新推理选择器。比自己埋头查快得多而且 AI 对常见的 DOM 结构理解很到位。4.2 触发风控不要硬刚降频才是正解跑第二轮的时候脚本连续点了两三百下新浪开始不给好脸色各种验证码弹出来。这时候千万别想着怎么绕过验证码那是跟平台规则硬碰硬。正确做法是把操作频率降下来。我实测有效的组合是每条随机延迟2-5秒每处理20条休息20秒整个运行控制在一小时以内。这样跑完基本不会再触发。这里得说句实在话这种自动化脚本本质上是游走在规则边缘的所以更要自觉控制强度和频次只处理自己的账号别动批量注册、刷量这类黑产心思。合规这事靠别人提醒不如自己心里有根弦。4.3 误操作了怎么办先备份再动手有一回脚本在定位“更多”菜单时点错了入口把一个本来准备保留公开的微博设置成了自见。想恢复并不麻烦进入该微博的编辑界面或者从账号管理入口里找到可见性设置改回公开就行。但这事提醒我一个道理批量自动化最怕的不是慢是干错了还不知道错在哪儿。所以我在启动脚本前让 AI 加了一个步骤先把全部微博链接和当前可见状态存成 CSV。万一误操作照着 CSV 反向恢复就行。这个习惯现在被我带到了所有自动化项目里——操作前备份操作中打日志操作后能追溯。5. 这趟Vibe Coding下来我总结的通用心法5.1 写Prompt时把“不要做”也写清楚人脑对“不做什么”的注意力远低于“要做什么”AI 也一样。在让 AI 写自动化脚本时尤其要把边界写死不要点转发、不要动置顶、不要修改已经自见的微博、不要点广告流里面的更多。AI 对 prompt 里的负面约束记忆其实很强这一步花30秒能在后面省下30分钟。我那次误操作就是因为只说了“把公开微博设成自见”没说“绝不能碰非目标内容”。5.2 把报错、截图、DOM喂给AI别让它凭空猜很多人在 Vibe Coding 时喜欢问“应该怎么写”但更高效的是直接把运行日志、报错堆栈、甚至页面截图丢给 AI让它在真实上下文里改代码。我在这个项目里大概有五六轮循环每一轮都是“跑出来 - 报错 - 贴回去 - 改”。这比让人工分析快得多也准得多。有一轮改选择器时我把页面 DOM 压缩成几十行关键片段发过去AI 立刻定位到新的按钮结构。上下文越真实AI 产出越准。Vibe Coding 不是许愿是喂料。5.3 什么项目适合Vibe什么不适合不是所有项目都适合 Vibe。这次能成是因为逻辑是线性的遍历-点击-确认、失败可接受点错了能改回来、用户只有一个我自己、操作频率不至于触发风控。反过来凡是涉及高性能、高并发、资金安全、强一致性、或者要给别人线上系统做生产开发的我建议老实写代码、看文档、做测试。Vibe Coding 是提效工具不是甩锅工具。AI 写的代码你自己要能读得懂、改得动、负得起责——这是底线。毕竟脚本跑起来是按你的要求去干活的出了问题第一个被找的还是你。我在这个项目里最大的收获不是那个脚本本身——它很糙也无所谓。真正有用的是把“让 AI 干活”变成了一种肌肉记忆。需求说清楚、边界写明白、跑挂了就把现场信息发给 AI每一轮循环都在把抽象需求变成具体可用的脚本。现在再碰到那种“简单、重复、让人崩溃”的批量操作我第一反应已经不是咬牙手动做了而是打开终端对着 AI 说给爷 Vibe 一个。如果你家也藏着几百条历史微博不用再手动一条条点了按这个思路试一次大概率也能在一小时内拥有自己的批量隐藏工具。
延伸阅读

更多相关文章

2026/10/11 12:28:06

木马程序环境模拟:从载荷生成到检测对抗的完整链路

在正式开始之前,先把一个原则说了:下面所有内容,只针对合法的安全研究、企业内部红蓝对抗和防御体系建设场景。任何未经授权的渗透测试、恶意代码编写和使用,都是违反相关法律的行为,请务必在获得书面授权的前提下开展…

2026/10/11 12:23:06

AI辅助本科论文写作:9个工具覆盖开题到答辩全流程

每年一到这个季节,后台收到的私信几乎都是同样的问题:“选题定了但文献综述写不出来”“查重率卡在27%怎么都降不下去”“开题报告后天要交,我连研究意义都说不清楚”。如果你也卡在这些地方,说明你需要的不是零散地在各个对话窗口…

2026/10/11 13:38:10

Flutter鸿蒙开发实战:电影推荐APP从环境搭建到打包上线全流程

直接说结论:用Flutter框架做鸿蒙系统上的跨平台应用,是当前性价比极高的一条路线,尤其是像电影推荐APP这类需要兼顾多端体验、快速迭代、UI要求又不低的项目。这篇文章我按自己的开发经验,完整拆解一遍从环境准备到打包上线的全流…

2026/10/11 13:38:10

Flutter跨平台开发鸿蒙应用:电影推荐Demo实战与避坑指南

最近在折腾Flutter框架的跨平台能力时,我被绕了一大圈之后才弄明白:同一套Flutter代码,能不能真正落到鸿蒙系统上?正好手上有一个电影推荐APP的想法,索性直接做成Demo,跑通了从环境搭建、页面开发到鸿蒙真机…

2026/10/11 13:38:10

AI时代一人公司:全链路赋能实操拆解

研讨会结束那晚,我回家又把笔记翻了两遍。这两年一直在琢磨"一人公司"这件事,陆陆续续折腾过几个方向,始终卡在同一个问题上:一个人到底能扛住多少环节?会上有位分享者的一句话让我印象很深——"AI时代…

2026/10/11 13:38:10

cua自动化工具实战:从零搭建到性能优化的完整指南

1. 从“cua”这个标题说起:一个被低估的缩写背后藏着什么第一次看到“cua”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个圈内人才懂的缩写。做技术的人都有个毛病,喜欢把长名字砍成三四个字母,方便在命令行里敲…

2026/10/11 13:33:10

eBPF helper函数全解析:设计逻辑、分类选型与实战排障

写eBPF程序有一段时间的朋友,应该都会遇到一个很典型的问题:我在 BPF 程序里到底能调用哪些函数?为什么不能像普通 C 代码一样直接调用内核里的printk或者kmalloc?答案就是标题里的“helper 函数”。它是内核专门开放给 eBPF 字节…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑