news 2026/4/16 14:44:27

【QQ】空间说说批量删除脚本(不用任何额外插件,打开F12控制台即可使用)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【QQ】空间说说批量删除脚本(不用任何额外插件,打开F12控制台即可使用)

原创,原因是不想配油猴,之前的脚本又太老,就自己写了一个。

一、脚本

1.内容

// 一键批量删除说说(支持自定义页面数量)(()=>{constdelay=2000;letcurrentIndex=0;letlistItems=[];letdialogObserver=null;letisProcessing=true;lettotalPagesToDelete=0;letpagesDeleted=0;// 1. 询问用户要删除的页面数量functionaskPageCount(){constinput=prompt('请输入要连续删除的页面数量(请输入数字):','5');if(input===null){console.log('用户取消了操作');returnnull;}constpageCount=parseInt(input);if(isNaN(pageCount)||pageCount<=0){alert('请输入有效的正数!');returnnull;}returnpageCount;}// 2. 自动查找iframefunctionfindIframe(){// 尝试多种方式找到包含日志的iframeletiframe=document.querySelector('iframe.app_canvas_frame')||document.querySelector('iframe[src*="app.qzone"]')||document.querySelector('iframe[src*="qzone"]');if(!iframe){// 遍历所有iframe,查找包含#msgList的constiframes=document.querySelectorAll('iframe');for(letframeofiframes){try{constdoc=frame.contentDocument;if(doc&&doc.querySelector('#msgList')){iframe=frame;break;}}catch(e){// 跳过跨域iframe}}}if(!iframe){console.log('未找到包含日志的iframe');returnnull;}try{returniframe.contentDocument||iframe.contentWindow.document;}catch(e){console.log('无法访问iframe内容');returnnull;}}// 3. 自动点击确认对话框functionsetupDialogMonitor(){if(dialogObserver)return;dialogObserver=newMutationObserver((mutations)=>{for(letmutationofmutations){if(mutation.addedNodes.length>0){for(letnodeofmutation.addedNodes){if(node.nodeType===1&&(node.matches('.qz_dialog_layer')||node.querySelector?.('.qz_dialog_layer'))){console.log('检测到确认对话框');setTimeout(()=>{constconfirmBtn=document.querySelector('a[title="点击这里确认"]');if(confirmBtn){confirmBtn.click();console.log('已点击确认按钮');}},300);}}}}});dialogObserver.observe(document.body,{childList:true,subtree:true});}// 4. 查找分页控件并跳转到上一页functiongoToPreviousPage(iframeDoc){constpager=iframeDoc.querySelector('p.mod_pagenav_main');if(!pager){console.log('未找到分页控件');returnfalse;}// 获取pager的所有子元素(包括a和span)constchildren=Array.from(pager.children);if(children.length<3){console.log('分页元素不足,可能是最后一页');returnfalse;}// 倒数第三个元素(因为倒数第一是"下一页",倒数第二是"当前页")constprevPageElement=children[children.length-3];if(!prevPageElement||prevPageElement.tagName!=='A'){console.log('未找到上一页链接');returnfalse;}// 检查是否是可点击的链接(不是disabled状态)if(prevPageElement.classList.contains('mod_pagenav_disable')||prevPageElement.style.pointerEvents==='none'){console.log('上一页不可点击');returnfalse;}console.log('正在跳转到上一页...');prevPageElement.click();returntrue;}// 5. 处理单条说说functionprocessItem(li){returnnewPromise((resolve)=>{consttrigger=li.querySelector('.dropdown-trigger');if(!trigger){resolve(false);return;}// 滚动到元素li.scrollIntoView({behavior:'smooth',block:'center'});setTimeout(()=>{trigger.click();setTimeout(()=>{constdeleteBtn=li.querySelector('.del.del_btn.author_display');if(deleteBtn){deleteBtn.click();console.log(`已点击删除按钮 (${currentIndex+1}/${listItems.length})`);// 等待确认对话框被自动处理setTimeout(resolve,1000);}else{resolve(false);}},500);},500);});}// 6. 显示进度信息functionshowProgress(){console.log(`进度:${pagesDeleted}/${totalPagesToDelete}页面`);console.log(`剩余:${totalPagesToDelete-pagesDeleted}个页面`);}// 7. 处理单个页面asyncfunctionprocessPage(){constiframeDoc=findIframe();if(!iframeDoc){console.log('无法访问iframe,停止处理');isProcessing=false;returnfalse;}listItems=iframeDoc.querySelectorAll('#msgList li.feed.feed_private');if(listItems.length===0){console.log('当前页面没有说说,尝试跳转到上一页');// 尝试跳转到上一页if(goToPreviousPage(iframeDoc)){console.log('等待新页面加载...');awaitnewPromise(resolve=>setTimeout(resolve,3000));returntrue;// 继续处理}else{console.log('没有更多页面可处理');returnfalse;// 停止处理}}console.log(`当前页面找到${listItems.length}条说说,开始删除...`);// 启动对话框监视器setupDialogMonitor();// 处理当前页所有说说for(leti=0;i<listItems.length;i++){currentIndex=i;console.log(`处理第${i+1}/${listItems.length}条说说...`);constsuccess=awaitprocessItem(listItems[i]);if(!success){console.log(`${i+1}条说说处理失败,跳过`);}// 如果不是最后一条,等待延迟if(i<listItems.length-1){console.log(`等待${delay/1000}秒...`);awaitnewPromise(resolve=>setTimeout(resolve,delay));}}console.log('当前页面所有说说已删除!');pagesDeleted++;showProgress();// 等待一小段时间让页面稳定awaitnewPromise(resolve=>setTimeout(resolve,1000));// 检查是否已达到指定的页面数量if(pagesDeleted>=totalPagesToDelete){console.log(`已达到指定的${totalPagesToDelete}个页面,停止处理`);returnfalse;}// 当前页处理完成后,跳转到上一页returngoToPreviousPage(iframeDoc);}// 8. 主处理函数 - 处理指定数量的页面asyncfunctionprocessPages(){console.log('=== 说说批量删除脚本 ===');// 询问用户要删除的页面数量totalPagesToDelete=askPageCount();if(totalPagesToDelete===null){console.log('脚本已取消');return;}console.log(`目标: 删除${totalPagesToDelete}个页面的说说`);console.log('开始处理...');lethasMorePages=true;while(hasMorePages&&isProcessing&&pagesDeleted<totalPagesToDelete){console.log(`\n=== 开始处理第${pagesDeleted+1}个页面 ===`);// 处理当前页面hasMorePages=awaitprocessPage();if(hasMorePages&&pagesDeleted<totalPagesToDelete){console.log(`等待${delay/1000}秒,让新页面加载...`);awaitnewPromise(resolve=>setTimeout(resolve,delay*2));}}console.log('\n=== 处理完成 ===');console.log(`总共处理了${pagesDeleted}个页面`);console.log(`目标:${totalPagesToDelete}个页面`);if(pagesDeleted>=totalPagesToDelete){console.log('✓ 已完成指定数量的页面删除!');}else{console.log('⚠ 未完成所有指定页面,可能是没有更多页面了');}// 清理if(dialogObserver){dialogObserver.disconnect();}}// 9. 立即执行processPages();// 10. 添加控制函数到全局window.pauseDeletion=()=>{isProcessing=false;if(dialogObserver)dialogObserver.disconnect();console.log('已暂停');};window.resumeDeletion=()=>{isProcessing=true;console.log('已恢复,继续处理');processPages();};window.getProgress=()=>{return{pagesDeleted,totalPagesToDelete,remaining:totalPagesToDelete-pagesDeleted,progress:totalPagesToDelete>0?(pagesDeleted/totalPagesToDelete*100).toFixed(1):0};};window.showProgressInfo=()=>{constprogress=getProgress();console.log(`进度:${progress.pagesDeleted}/${progress.totalPagesToDelete}页面`);console.log(`剩余:${progress.remaining}个页面`);console.log(`完成:${progress.progress}%`);};})();

2.用法

先打开网页版qq空间,点击说说:

然后划到最下面,点最后一页说说:

按 F12 打开控制台,并选择 console 页面:

有些人应该第一次开这个控制台,所以会发现不让粘帖脚本代码 —— 会有个黄色的警告
有些人应该第一次开这个控制台,所以会发现不让粘帖脚本代码 —— 会有个黄色的警告
有些人应该第一次开这个控制台,所以会发现不让粘帖脚本代码 —— 会有个黄色的警告

在这里输入:

allow pasting

然后回车。
就可以粘贴脚本代码了。

粘贴脚本代码,并回车:

如果没错,会出现这个让你输入删除的页面数量的提示框。
它的规则是:从后往前删几页。

比如说,我们刚才在 171 页,那么我往前删 5 页,删到 160 多页
你就填 5,然后点击确定即可。

然后脚本就会自动开始运行:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:59:20

长文本生成卡顿问题解决:TensorRT的KV Cache优化技巧

长文本生成卡顿问题解决&#xff1a;TensorRT的KV Cache优化技巧 在构建智能客服、自动写作或代码补全系统时&#xff0c;你是否遇到过这样的尴尬场景&#xff1f;用户输入一段长提示后&#xff0c;模型开始“思考”&#xff0c;前几个字飞快输出&#xff0c;随后越来越慢&…

作者头像 李华
网站建设 2026/4/16 12:46:28

区块链+AI应用场景探索:去中心化推理节点中的TensorRT

区块链AI应用场景探索&#xff1a;去中心化推理节点中的TensorRT 在自动驾驶的毫秒级决策、智能安防的实时人脸识别&#xff0c;以及边缘设备上不断增长的AI应用需求背后&#xff0c;一个共同的挑战日益凸显&#xff1a;如何让深度学习模型在资源受限或分布式的环境中依然保持…

作者头像 李华
网站建设 2026/4/16 13:05:35

自动扩缩容策略设计:基于QPS的TensorRT实例弹性伸缩

自动扩缩容策略设计&#xff1a;基于QPS的TensorRT实例弹性伸缩 在电商大促的零点高峰&#xff0c;一个推荐系统的请求量可能在一分钟内从几千QPS飙升至数万。如果推理服务仍按日常流量部署固定数量的GPU实例&#xff0c;结果往往是延迟激增、请求超时——用户体验瞬间崩塌。而…

作者头像 李华
网站建设 2026/4/16 11:04:14

Java面试必考:Object类与equals解析2

四、实验实训数据及结果分析&#xff08;数据、表格、程序、图形图像、注释、分析说明等&#xff09;五、实验实训结论与思考1、为什么说 Object 类是所有类的超类&#xff1f;创建一个没有显式继承任何类的自定义类&#xff0c;如何证明它继承了 Object 类&#xff1f;在 Java…

作者头像 李华
网站建设 2026/4/14 0:20:03

VoxCPM 1.5.0 macOS

Python 版本python3 --versionPython 3.11.13python3 -c "import torch; print(fPyTorch: {torch.__version__}); print(fMPS Available: {torch.backends.mps.is_available()}); print(fMPS Built: {torch.backends.mps.is_built()})" 2>/dev/null || echo "…

作者头像 李华