weibo微博批量取消关注
微博找回、账号找回

网页登录后,F12审核元素,控制台执行,
";/* eslint-disable no-unused-vars *//* eslint-disable no-extra-semi *//* eslint-disable no-console */// ==UserScript==// @name 柠檬精僵尸清道夫一键僵尸粉清除助手v2023.06.22// @namespace https://blog.csdn.net/wangwei490202517/category_10507403.html?spm=1001.2014.3001.5482// @version 1.0.9// @description 一键批量删除僵尸粉:兴趣推荐、互相关注、不活跃用户、垃圾昵称、等塞粉微博粉丝记录// @author echo_wx:WZMSLR// @match https://weibo.com/*// @icon https://tva2.sinaimg.cn/crop.2.18.304.304.180/ad573135jw8f33qt1c74sj208k08z75q.jpg?KID=imgbed,tva&Expires=1671381776&ssig=du6gqkc8OF// @license MIT// @grant none// ==/UserScript==let removeTargetFans = false; /*是否删除符合条件的粉丝,默认关闭*/let deepSearchMode =false; /*是否开启深度清理模式*/let ignoreLikes = true; /*是否无视用户最近点赞*/let minDayCount = 180; /*最小不活跃天数*/let fansMinCount = 2; /*最小粉丝数*/let weiboMinCount = 3; /*最小微博数*/let totalCount = 0;let checkIsFromRecommended = true; /*是否检查通过推荐关注*/let checkIsInactive = true; /*是否检查不活跃用户*/let checkFansOrWeibo = false; /*是否只判断粉丝数或微博数*/let checkIsFollowing =true; /*是否检查相互关注*/let checkIsDefaultIcon = false; /*是否检查默认头像*/let checkIsNormalFollowed = false; /*是否检查关注来源*/let isError = false;let isRunning = false;let userID = 0;let zeroFanPageCount = 0;function clearLog(){let logger = document.querySelector("p.logger");logger.innerHTML = "";}function logError(msg){let logger = document.querySelector("p.logger");let parent = logger.parentElement;logger.innerHTML +="" + msg + "
";parent.scrollTop = parent.scrollHeight;}function logSuccessMsg(msg){let logger = document.querySelector("p.logger");let parent = logger.parentElement;logger.innerHTML +=""+ msg + "
parent.scrollTop = parent.scrollHeight;}
function logImportantMsg(msg){ let logger = document.querySelector("p.logger"); let parent = logger.parentElement; logger.innerHTML +=""
+ msg + ""; parent.scrollTop = parent.scrollHeight;}
function logMsg(msg){ let logger = document.querySelector("p.logger"); let parent = logger.parentElement; logger.innerHTML +=""
+ msg + ""; parent.scrollTop = parent.scrollHeight;}
async function removeFanMainFunc() { const delay = ms => new Promise(res => setTimeout(res, ms)); const minute = 1000 * 60; const hour = minute * 60; const day = hour * 24;
clearTimeout(); isError = false;
let startIndex = 0; let pageIndex = 1;
while(true) { if(!isRunning) { if (removeTargetFans) logError("【WX:WZMSLR】用户退出程序。总计清理了 " + totalCount + " 个疑似僵尸粉"); else logError("【WX:WZMSLR】用户退出程序。总计发现了 " + totalCount + " 个疑似僵尸粉"); break; }
await delay(300); let fanListJson = await fetch( 'https://weibo.com/ajax/friendships/friends?relate=fans&count=20&type=fans&fansSortType=followTime' + '&page=' + pageIndex + '&uid=' + userID, { method: "GET", }).then(response => response.json()) .catch((e) => { }); if (fanListJson == null || fanListJson.ok != 1 || fanListJson['users'].length === 0) { fanListJson = await fetch( 'https://weibo.com/ajax/friendships/friends?relate=fans&count=20&type=fans&fansSortType=followTime' + '&page=' + pageIndex + '&uid=' + userID, { method: "GET", }).then(response => response.json()) .catch((e) => { });
if (fanListJson == null || fanListJson.ok != 1) { if (removeTargetFans) logError("【WX:WZMSLR】请求异常,退出程序。总计清理了 " + totalCount + " 个疑似僵尸粉"); else logError("【WX:WZMSLR】请求异常,退出程序。总计发现了 " + totalCount + " 个疑似僵尸粉"); break; } }
let fans = fanListJson['users']; let count = 0;
for (let i = startIndex; i if(!isRunning) { if (removeTargetFans) logError("【柠檬精】提醒:用户退出程序。总计清理了 " + totalCount + " 个疑似僵尸粉"); else logError("【柠檬精】提醒:用户退出程序。总计发现了 " + totalCount + " 个疑似僵尸粉"); return; }
let isFromRecommended = false; let isInactive = false; let isFollowing = false; let isDefaultIcon = false; let isNormalFollowed = false; let isIrrelevant = false; let fansCount, weiboCount;
/*关注来源*/ let originSrc = fans[i]['origin_source_info']; isNormalFollowed = originSrc != null && originSrc['text'] !== "兴趣推荐" && originSrc['text'] !== "微博推荐";
/*是否为铁粉*/if(fans[i].fansIcon != null) {if(fans[i].fansIcon == "loyal_fans")continue; }
/*是否为非推荐的会员*/ if (isNormalFollowed && (fans[i]['mbtype'] === 12)) continue;
/*关注来源是否为兴趣推荐*/ if (checkIsFromRecommended) { isFromRecommended = originSrc != null && originSrc['text'] === "兴趣推荐"; }
let fanID = fans[i]['id']; let fanName = fans[i]['name'];
/*粉丝数与微博数*/ if (checkIsInactive) { fansCount = fans[i]['followers_count']; weiboCount = fans[i]['statuses_count']; if (checkFansOrWeibo) isInactive = fansCount else isInactive = fansCount 0 || fansCount === 0; }
/*是否为默认头像*/ if (checkIsDefaultIcon) { let icon = fans[i]['avatar_hd']; isDefaultIcon = icon != null && icon.includes("/default/images/default_avatar_"); } /*是否互相关注*/ if (checkIsFollowing) { isFollowing = fans[i]['following']; }
let isZombie = false; if (!isFollowing) if (!checkIsNormalFollowed || (checkIsNormalFollowed && !isNormalFollowed)) if (isDefaultIcon || isFromRecommended || isInactive || isDefaultIcon || (deepSearchMode && weiboCount === 0)) isZombie = true;
/*深度检查*/ if (deepSearchMode && !isFollowing && !isZombie) { await delay(600); let weiboJson = await fetch('https://weibo.com/ajax/statuses/mymblog?page=1&feature=0&uid=' + fanID, { method: "GET", }).then(response => response.json()) .catch((e) => { });
if (weiboJson == null || weiboJson.ok != 1) { await delay(800); weiboJson = await fetch('https://weibo.com/ajax/statuses/mymblog?page=1&feature=0&uid=' + fanID, { method: "GET", }).then(response => response.json()) .catch((e) => { });
if (weiboJson == null || weiboJson.ok != 1) { logError(fanName + "主页请求失败,跳过检查"); continue; } }
let weiboList = weiboJson.data['list']; let invalidWeiboCount = 0; let validWeiboCount = 0; let currDate = Date.now(); for (let index = 0; index let currWeibo = weiboList[index]; let weiboSrc = currWeibo['source']; if(weiboSrc != null && weiboSrc.includes("生日动态")) continue;
if (weiboSrc != null && (weiboSrc.includes("渔场") || weiboSrc.includes("活动") || weiboSrc.includes("森林") || weiboSrc.includes("微博积分") || weiboSrc.includes("支付宝") || weiboSrc.includes("淘宝") || weiboSrc.includes("芭芭农场") || weiboSrc.includes("任务") || weiboSrc.includes("签到") || weiboSrc.includes("新浪游戏") || weiboSrc.includes("微博游戏") || weiboSrc.includes("红包") || weiboSrc.includes("微博会员") || weiboSrc.includes("微博运动") || weiboSrc.includes("熊猫守护者") || weiboSrc.includes("点淘"))) { invalidWeiboCount++; continue; }
if (ignoreLikes && currWeibo['title'] != null && currWeibo['title']['text'].includes("赞")) continue;
let createTime = currWeibo['created_at']; if (currWeibo['retweeted_status'] != null) { createTime = currWeibo['retweeted_status']['created_at']; }
if (Math.round((currDate - new Date(createTime)) / day) validWeiboCount++; }
invalidWeiboCount--; }
if (invalidWeiboCount > 3) { isIrrelevant = true; isZombie = true; }
if (validWeiboCount 3) { isInactive = true; isZombie = true; } } await delay(300); if (isZombie) { let reason = "原因: "; if (isFromRecommended) reason += " 兴趣推荐"; if (isInactive) reason += " 不活跃用户"; if (isIrrelevant) reason += " 不相关用户"; if (isDefaultIcon) reason += " 默认头像"; if (removeTargetFans) { let fData = new FormData(); fData.append("uid", fanID); fData.append("_t", "0"); const json = await fetch('/aj/f/remove?ajwvr=6&__rnd=' + Math.round(new Date().getTime()), { method: "POST", body: fData }).then(response => response.json()) .catch((e) => { });
if (json != null && json.code == 100000) { logSuccessMsg("【WX:WZMSLR】提示:"+ fanName + "\t删除成功 " + reason); count++; totalCount++;
} else logError("【WX:WZMSLR】提示:" + fanName + "\t删除失败 "); } else { logMsg("【WX:WZMSLR】提示:"+ fanName + "→疑似僵尸粉 " + reason);
count++; totalCount++; } } }
if (fans.length > 0) { startIndex = 0; zeroFanPageCount = 0; if (removeTargetFans) { logImportantMsg("【WX:WZMSLR】提醒:第 " + pageIndex + " 页删除了 " + count + " 个粉丝"); if (count > 0) { startIndex = fans.length - count; if (startIndex 0) startIndex = 0; } else { pageIndex++; } } else { logImportantMsg("【WX:WZMSLR】提醒:第 " + pageIndex + " 页发现了 " + count + " 个疑似僵尸粉"); pageIndex++; } } else { if(zeroFanPageCount 5) { zeroFanPageCount++; pageIndex++; }else { if (removeTargetFans) logError("【柠檬精】已到达粉丝列表上限,退出程序。总计清理了 " + totalCount + " 个疑似僵尸粉"); else logError("【柠檬精】已到达粉丝列表上限,退出程序。总计发现了 " + totalCount + " 个疑似僵尸粉"); break; } } } StopFunc();}
function RemoveFans(startIndex){ let p = new Promise(function(){removeFanMainFunc(startIndex)});}
let InitParameters = ()=>{ checkIsFromRecommended = document.body.querySelector("input#checkIsFromRecommended").checked; checkIsFollowing = document.body.querySelector("input#checkIsFollowing").checked; checkIsNormalFollowed = document.body.querySelector("input#checkIsNormalFollowed").checked; checkIsDefaultIcon= document.body.querySelector("input#checkIsDefaultIcon").checked;
checkIsInactive = document.body.querySelector("input#checkIsInactive").checked; checkFansOrWeibo = document.body.querySelector("input#checkFansOrWeibo").checked; fansMinCount = parseInt(document.body.querySelector("input#fansMinCount").value); weiboMinCount = parseInt(document.body.querySelector("input#weiboMinCount").value);
deepSearchMode = document.body.querySelector("input#deepSearchMode").checked; ignoreLikes = document.body.querySelector("input#ignoreLikes").checked; minDayCount = parseInt(document.body.querySelector("input#minDayCount").value);};
let StartCheckFans = ()=>{ SetMode("running"); InitParameters(); clearLog(); totalCount = 0; removeTargetFans = false; isRunning = true; RemoveFans(0);};
let StartRemoveFans = ()=>{ SetMode("running"); InitParameters(); clearLog(); totalCount = 0; removeTargetFans = true; isRunning = true; RemoveFans(0);};
let StopFunc = ()=>{ SetMode("ready"); clearInterval(); clearTimeout(); isRunning = false;};
let SetDeepSearchParam = ()=>{ let disable = document.body.querySelector("input#deepSearchMode").checked === false; let params = document.body.querySelectorAll("input.DeepSearchParam"); for(let i = 0; i params[i].disabled = disable;};
let SetMode = (mode) =>{ let params = document.querySelector("div.parameter").querySelectorAll("input"); let readyPanel = document.querySelector("div.ready"); let runningPanel = document.querySelector("div.running"); if(mode === "running") { for(let i = 0; i true; readyPanel.style.display = "none"; runningPanel.style.display = ""; } else if(mode === "ready") { for(let i = 0; i false; runningPanel.style.display = "none"; readyPanel.style.display = ""; }};
let ReplaceHTML = ()=>{ let list = document.querySelector("div.woo-box-flex.woo-tab-nav")?.querySelectorAll("a"); let href = document.location.href; if(list == null || list.length !== 5) { if(document.location.href.includes("https://weibo.com/u/")) { userID = document.location.href.replace("https://weibo.com/u/", ""); let numIndex = 0; for(numIndex = 0; numIndex { if(userID[numIndex] '0' || userID[numIndex] > '9') break; } userID = userID.slice(0, numIndex); }else { console.error("无法找到用户id,请打开微博主页再运行代码"); return; } }else{ userID = list[4].href.replace("https://weibo.com/u/", ""); href = "https://weibo.com/u/page/follow/"+ userID +"?relate=fans"; }
document.head.innerHTML = '柠檬精僵尸清道夫 '; let body = 'Title 柠檬精僵尸清道夫v2023.06.22
快速清粉参数-博主微博@当时我就没憋住
清除兴趣推荐用户 排除相互关注 只检查通过推荐关注 清除不活跃用户 最低粉丝数 满足任一条件即清除 最低微博数 清除默认头像用户
深度清粉参数-博主微博@当时我就没憋住
开启深度清粉 最小不活跃天数: 无视用户最近点赞
'; document.body.innerHTML = body.replaceAll('ο', 'o'); let iframe = document.body.querySelector('iframe.web'); iframe.src = href; iframe.onload=()=>{ iframe.contentDocument.body.querySelector("div[node-type=outer]")?.remove(); }}
ReplaceHTML();
>服务链接:
>https://tool.panda.tw/
>https://www.panda.tw/
>关键词:
>熊猫云搜导航、>微博用户搜索免登录、>B站直播弹幕查询、>B站视频解析、查B站弹幕发送者、B站评论查询、B站弹幕查询、微博图片反查、身份证生成器、社工密码学生成字典、IP探针定位、贴吧隐藏发言查询
推荐阅读:

21 天前
导演: 大卫·博伦斯坦 / 帕维尔·塔兰金编剧: 大卫·博伦斯坦主演: 帕维尔·塔兰金类型: 纪录片制片国家/地区: 丹麦 / 捷克 / 德国语言: 俄语上映日期: 2025-01-25(圣丹斯电影节) / 2025-03-22(丹麦)片长: 90分钟又名: 无名氏先生(港)IMDb: tt34965515 当俄罗斯对乌克兰发起全面入侵后,俄罗斯内陆地区的小学纷纷变成了战争征兵的阵地。一位勇敢的教师面临着在充斥着宣传与暴力的体系中工作的道德困境,他选择卧底拍摄,记录下自己所在学校里真实发生的一切。 在乌拉尔山脉的家乡,生性开朗的帕夏在自己儿时就读的那所小学任教,他是个不墨守成规的老师。然而,2022 年俄罗斯对乌克兰发起的入侵改变了一切。一夜之间,他所热爱的学校与社区从一个专注教育与自我表达的地方,变成了充斥着军事化思想与国家意识形态的场所。不久后,他的学生及他们的家人被征召入伍,帕夏不得不开始思考:一个人究竟能做些什么? 《反对普京的无名先生》历经两年秘密拍摄而成,它深刻描绘了当下俄罗斯的生活图景,以及当国民深爱的国家落入一位迫使它变成自己无法接受的模样的统治者手中时,民众所面临的艰难抉择,令人难以忘怀。 在线观看 《反对普京的无名先生》HD完整版免费在线播放 - 纪录片 - 飘花影院 《反对普京的无名先生》HD中字在线播放_记录免费观看-155电影

2 个月前
稳定,便宜实用,流量大,

8 个月前
免登录·匿名AI助手 ——即刻体验,零收费畅聊 使用链接: https://panda.tw/yu_ai/ 核心 ✓特点匿名:注册/登录,不收集个人信息 ✓即问即答:打开网页直接输入问题,级响应 ✓隐私保护:对话内容不关联用户身份,无痕迹留存 ✓多端装备:手机/电脑浏览器一键访...

8 个月前
关于开源,云搜工具箱 我们计划将工具箱的全部功能开源,具体原因如下: 一、目前服务器配置为4G内存、4核CPU,部分功能依赖于实时爬取和调用第三方API。随着用户数量增加,服务器负载逐渐升高,导致有时会过载甚至宕机,需要频繁的重启服务器,影响了系统的稳定性。为了确保工具箱的持续可用, 对互联网共享精神的坚守 。 二、出于对互联网共享精神的尊重和对初...

8 个月前
B站评论查询,人物画像,大数据溯源【熊猫云搜】 使用链接: https://tool.panda.tw/bilireply https://www.panda.tw/ 在当今视频内容不断丰富、互动日益频繁的时代,B站(哔哩哔哩)作为年轻人聚集的创新社区,用户的评论不仅反映着观众的真实想法,也成为内容创作者了解受众、优化内容的重要依据。为了帮助用户...

8 个月前
B站弹幕查询,人物画像,大数据溯源【熊猫云搜】 使用地址: https://tool.panda.tw/bili_userdanmu https://www.panda.tw/ 在数字娱乐的浪潮中,弹幕已成为B站(哔哩哔哩)视频互动的核心特色,赋予视频独特的趣味性与参与感。弹幕不仅让观众表达即时感受,也营造出热烈的社区氛围。然而,随着弹幕数量...

8 个月前
B站直播间,弹幕查询,人物画像,大数据溯源【熊猫云搜】 使用链接: https://tool.panda.tw/bili_livedanmu https://www.panda.tw/ 在当今直播娱乐盛行的时代,弹幕已成为B站(哔哩哔哩)直播互动的重要方式。实时弹幕不仅让观众表达情感、分享观点,也为主播营造出热烈的互动氛围。然而,随着直播弹幕数量...

8 个月前
哔哩哔哩高清视频解析下载,视频所有弹幕解析【B站视频解析】 使用链接: https://tool.panda.tw/bili_video https://www.panda.tw/ 🎥【轻松下载哔哩哔哩视频】保存高清内容,随时随地掌控精彩!🎥 想要将喜欢的哔哩哔哩(B站)视频保存到本地?我们为你提供简便的操作指...
You can ask me anything about tech, tools, or site content.
@fkmY9h1M:您好,贵站已经添加!
提交链接
类别:在线工具 名称:喵喵工具集 地...
提交链接
您好站长,申请贵站收录 网站名称:...
提交链接
@5ZN2liXC:您好,已经添加了哦!...
提交链接
您好站长,申请贵站收录 网站名称:...
提交链接
@5ZN2liXC:您好,已经添加了哦!...
提交链接
类别:博客站点 名称:小报童专栏 地...
提交链接
类别:在线工具 名称:夸克搜 地址:...
提交链接