// ==UserScript== // @name QQ空间说说删除脚本 // @namespace none // @version 1.0.3 // @description 用于一键删除QQ空间的说说,大概700毫秒左右删除一条 // @author gogofishman // @license MIT // @include *://user.qzone.qq.com/* // @downloadURL none // ==/UserScript== var isStart = false; var delayTime = 500; // 已完成数量 var completed = 0; // 剩余数量 var number = '0'; (function () { 'use strict'; //添加删除面板 window.onload = AddDiv; })(); //添加控制面板 function AddDiv() { Beautify(); let newDiv = document.createElement('div'); newDiv.id = 'ShuoShuoDelete'; //样式 let style = newDiv.style; style.width = '200px'; style.height = '200px'; style.position = 'fixed'; style.top = '41px'; style.right = '0'; style.zIndex = '99999'; style.padding = '10px'; style.backgroundColor = 'white'; style.backgroundImage = 'url(https://p.sda1.dev/13/3f9eb408f25616eb024b972f7fd1a70d/忍野忍.png)'; style.backgroundRepeat = 'no-repeat'; style.backgroundSize = 'cover'; style.boxShadow = '0px 2px 5px rgba(0, 0, 0, 0.5)'; //内容 newDiv.innerHTML = `

QQ空间说说删除脚本

删除顺序:

正序 倒序

未运行

`; let div = document.getElementById('layBackground'); if (div !== null) { div.appendChild(newDiv); //添加启动停止 document .getElementById('shuoshuoDelete_start') .addEventListener('click', start); document.getElementById('shuoshuoDelete_end').addEventListener('click', end); } } //空间界面美化 function Beautify() { Print('美化空间'); //移除flash悬浮窗 WaitUntilRemove(() => document.getElementById('flowerContainerDiv')); //移除开通黄钻 WaitUntilRemove(() => document.getElementById('QM_Container_3').children[1]); //移除签到 WaitUntilRemove(() => document.getElementById('QM_Container_31')); WaitUntilRemove(() => document.getElementById('QM_Container_100005')); //移除天气 WaitUntilRemove(() => document.getElementById('weather-module')); //移除小游戏 WaitUntilRemove(() => document.getElementById('leftMenu').children[1]); } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } function Print(text) { console.log(`[说说脚本] - ${text}`); } /** * 异步执行当某个元素出现时立马删除它 * @param {function} element 返回指定元素的函数 * @param {number} step 每次检查间隔时间 ms * @param {number} timeOut 超时时间 ms * @returns {Promise} * @constructor */ async function WaitUntilRemove(element, step = 50, timeOut = 1000 * 30) { let count = 0; let outCount = timeOut / step; while (count <= outCount) { count++; await sleep(step); try { let _c = element(); if (_c != null) { console.log('移除元素', _c); _c.remove(); return; } } catch (e) { } } } /** * 等待直到条件成立 * @param {function} control 控制条件 * @param {number} step 每次验证间隔时间 ms * @param {number} timeOut 超时时间 ms * @returns {Promise} * @constructor */ async function WaitUntil(control, step = 500, timeOut = 10000) { let count = 0; let outCount = timeOut / step; while (count <= outCount) { count++; await sleep(step); let _c = control(); if (_c) { return; } } } //启动 function start() { if (isStart) return; if (confirm('是否开始删除说说?')) { isStart = true; ChangeStateText('正在删除', 'green'); Print('开始删除...'); completed = 0; DeleteRun().then(() => Print('删除完成')); } } //停止 function end() { if (!isStart) return; isStart = false; Print('停止删除!'); } //改变状态文字 function ChangeStateText(text, color) { let p = document.getElementById('shuoshuoDelete_state'); p.innerText = text; p.style.color = color; } //删除程序 async function DeleteRun() { //删除顺序 let order = document.querySelector('input[name="order"]:checked').value; //转到说说页面 let shushuo = document.querySelector('a[title="说说"]'); if (shushuo == null) return; shushuo.click(); //等待跳转成功,10秒超时 await WaitUntil(() => document.querySelector('.app_canvas_frame') != null); if (document.querySelector('.app_canvas_frame') == null) { Print('跳转超时!'); return; } Print('跳转到说说界面'); //如果倒序,跳转到最后一页 if (order === '倒序') { Print('倒序'); await WaitUntil( () => document .querySelector('.app_canvas_frame') .contentDocument.querySelector('a[title="末页"]') != null ); let last = document .querySelector('.app_canvas_frame') .contentDocument.querySelector('a[title="末页"]'); if (last != null) { last.click(); await sleep(3000); Print('跳转到末页...'); Print('开始删除当前页说说...'); } } //开始删除 DeleteCurrentPage(order); } //删除当前页中所有的说说 async function DeleteCurrentPage(order) { if (!isStart) { alert('已停止删除说说功能!'); ChangeStateText(`已停止 ${completed}`, 'red'); return; } //等待页面加载完成 if (order !== '倒序') { await WaitUntil( () => document .querySelector('.app_canvas_frame') .contentDocument.querySelector('a[title="末页"]') != null ); } else { await WaitUntil( () => document .querySelector('.app_canvas_frame') .contentDocument.querySelector('a[title="首页"]') != null ); } //获取第一个说说 let li = document .querySelector('.app_canvas_frame') .contentDocument.querySelector('.feed'); if (li == null) { Print('当前页删除完成!'); NextPage(order); } else { //删除 let button = li.querySelector('.del_btn'); if (button != null) { button.click(); await WaitUntil( () => document.querySelector('.qz_dialog_layer_btn') != null ); //点击删除 document.querySelector('.qz_dialog_layer_btn').click(); Print('删除说说+1'); completed++; ChangeStateText(`正在删除 ${completed}`, 'green'); await sleep(delayTime); // 记录剩余说说数量 let _n = document.querySelector('.app_canvas_frame').contentDocument .querySelector('.feed_num').firstElementChild.textContent; if (_n !== number) { number = _n; } else { alert('由于最近删除过多,说说需要通过验证删除。请等待几小时到几天后再继续!'); ChangeStateText(`已停止 ${completed}`, 'red'); Print('无法继续删除,程序已停止'); end(); } } //往下循环执行 DeleteCurrentPage(order); } } async function NextPage(order) { let html = document.querySelector('.app_canvas_frame').contentDocument; let next = order !== '倒序' ? html.querySelector('a[title="下一页"]') : html.querySelector('a[title="上一页"]'); if (next != null) { next.click(); Print('点击下一页'); await WaitUntil( () => document .querySelector('.app_canvas_frame') .contentDocument.getElementById('msgList').childElementCount > 0 ); DeleteCurrentPage(order); } else { //全部完成 ChangeStateText('未运行', 'red'); } }