- // ==UserScript==
- // @name 微博一键清空
- // @namespace https://github.com/hbc007/weibo-cleaner
- // @version 1.0
- // @description 微博一键清空[动态|关注|粉丝|收藏]
- // @author hbc007
- // @license GNU GPLv3
- // @match https://weibo.com
- // @match https://weibo.com/*
- // @icon https://weibo.com/favicon.ico
- // @grant GM_xmlhttpRequest
- // ==/UserScript==
-
- (function () {
- 'use strict';
-
- var GlobalInfo = null;
- var cookie = null;
- var wbVersion = null;
-
- function updateInfo(info) {
- if (GlobalInfo == null) {
- return;
- }
- console.log(info);
- GlobalInfo.innerText = info;
- }
- function getXSRFToken(cookieStr) {
- var cookieItems = cookieStr.split('; ');
- for (var i = 0, len = cookieItems.length; i < len; i++) {
- var item = cookieItems[i];
- var itemArr = item.split('=');
- if (itemArr[0] === 'XSRF-TOKEN') {
- return itemArr[1];
- }
- }
- }
- function getWB(uid, callback, last_id = 0) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "get",
- url: "/ajax/statuses/mymblog?feature=0&uid=" + uid + "&since_id=" + last_id,
- headers: {
- "Accept": "application/json",
- "Cookie": cookie,
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- var data = JSON.parse(res.responseText);
- var wblist = data.data.list;
- if (wblist == null || wblist.length == 0) {
- location.reload();
- return;
- }
- for (var i = 0, len = wblist.length, id = 0; i < len; i++) {
- id = wblist[i].id;
- last_id = id;
- callback(id);
- }
- getWB(uid, callback, last_id);
- } else {
- updateInfo("请求失败:" + res.status + "请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
- function destroyWB(id) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "post",
- url: "/ajax/statuses/destroy",
- data: "{\"id\":\"" + id + "\"}",
- headers: {
- "content-type": "application/json; charset=utf-8",
- "Cookie": cookie,
- "accept": "application/json, text/plain, */*",
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- updateInfo("删除成功:" + id);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
- function getFollows(uid, callback, page = 1) {
- if (wbVersion != 6) {
- alert("由于微博限制,“清空关注”功能需切换到“旧版”微博,请在设置中切换");
- return -1;
- }
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "get",
- url: "https://weibo.com/p/1005053026435753/myfollow?Pl_Official_RelationMyfollow__88_page=" + page,
- headers: {
- "Accept": "application/json",
- "Cookie": cookie,
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- var data = res.responseText;
- var uidset = new Set(data.match(/(?<=uid=)([a-z0-9:]+)/g));
- uidset.delete(uid)
- if (uidset.size == 0) {
- location.reload();
- return;
- }
- for (var id of uidset) {
- callback(id);
- }
- page += 1;
- setTimeout(() => {
- getFollows(uid, callback, page);
- }, 100);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
- function destroyFollow(id) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "post",
- url: "/aj/f/unfollow?ajwvr=6&__rnd=" + new Date().getTime(),
- data: "refer_sort=relationManage&location=page_100505_myfollow&refer_flag=unfollow&uid=" + encodeURIComponent(id),
- headers: {
- "content-type": "application/x-www-form-urlencoded",
- "Cookie": cookie,
- "accept": "*/*",
- "origin": "https://weibo.com",
- "sec-fetch-site": "same-origin",
- "x-xsrf-token": xsrfToken,
- "referer": window.location.href,
- },
- onload: (res) => {
- if (res.status === 200) {
- updateInfo("删除成功:" + id);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
-
- function getFans(uid, callback, page = 1) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "get",
- url: "https://weibo.com/ajax/friendships/friends?uid=" + uid + "&relate=fans&count=20&page=" + page + "&type=fans&fansSortType=fansCount",
- headers: {
- "Accept": "application/json",
- "Cookie": cookie,
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- var data = JSON.parse(res.responseText);
- var userlist = data.users;
- if (userlist == null || userlist.length == 0) {
- location.reload();
- return;
- }
- for (var i = 0, len = userlist.length, id = 0; i < len; i++) {
- id = userlist[i].id;
- callback(id);
- }
- page += 1;
- setTimeout(() => { getFans(uid, callback, page) }, 100);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
- function destroyFan(id) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "post",
- url: "/ajax/profile/destroyFollowers",
- data: "{\"uid\":\"" + id + "\"}",
- headers: {
- "content-type": "application/json; charset=utf-8",
- "Cookie": cookie,
- "accept": "application/json, text/plain, */*",
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- updateInfo("删除成功:" + id);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
- function getFavorite(uid, callback, page = 1) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "get",
- url: "/ajax/favorites/all_fav?uid=" + uid + "&page=" + page,
- headers: {
- "Accept": "application/json",
- "Cookie": cookie,
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- var data = JSON.parse(res.responseText);
- var favlist = data.data;
- if (favlist.length == 0) {
- location.reload();
- return;
- }
- for (var i = 0, len = favlist.length, id = 0; i < len; i++) {
- id = favlist[i].id;
- callback(id);
- }
- page += 1;
- setTimeout(() => { getFavorite(uid, callback, page) }, 100);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
- function destroyFavorite(id) {
- var xsrfToken = getXSRFToken(cookie);
- GM_xmlhttpRequest(
- {
- method: "post",
- url: "/ajax/statuses/destoryFavorites",
- data: "{\"id\":\"" + id + "\"}",
- headers: {
- "content-type": "application/json; charset=utf-8",
- "Cookie": cookie,
- "accept": "application/json, text/plain, */*",
- "x-xsrf-token": xsrfToken
- },
- onload: (res) => {
- if (res.status === 200) {
- updateInfo("删除成功:" + id);
- } else {
- updateInfo("请求失败[" + res.status + "]:请手动刷新页面,稍后再试");
- }
- },
- }
- );
- }
-
- function getUid() {
- var url, uid = null;
- try {
- url = document.getElementsByClassName('woo-box-flex woo-tab-nav')[0].lastElementChild.href;
- uid = url.match(/(?<=u\/)\d+/)[0];
- wbVersion = 7;
- } catch (e) {
- console.log('error: not new weibo')
- }
- try {
- url = document.getElementsByClassName('gn_nav_list')[0].lastElementChild.firstElementChild.href;
- uid = url.match(/(?<=weibo.com\/)\d+/)[0];
- wbVersion = 6;
- } catch (e) {
- console.log('error: not old weibo')
- }
- console.log('wbVersion', wbVersion);
- return uid;
- }
- function init() {
- cookie = document.cookie;
- var uid = getUid();
- let mask = document.createElement('div');
- mask.style.color = 'white';
- mask.style.position = 'fixed';
- mask.style.top = '0';
- mask.style.left = '0';
- mask.style.width = '100%';
- mask.style.height = '100%';
- mask.style.background = 'rgba(128,128,128,0.5)';
- mask.style.zIndex = '9999';
- mask.style.lineHeight = '100vh';
- mask.style.fontSize = '50px';
- mask.style.textAlign = 'center';
- mask.style.textShadow = '0 0 10px black';
- mask.style.display = 'none';
- mask.innerText = '正在清理中,请勿刷新页面';
- GlobalInfo = document.createElement('div');
- GlobalInfo.style.position = 'fixed';
- GlobalInfo.style.bottom = '10%';
- GlobalInfo.style.left = '0';
- GlobalInfo.style.width = '100%';
- GlobalInfo.style.textAlign = 'center';
- GlobalInfo.style.zIndex = '10000';
- GlobalInfo.style.textShadow = '0 0 15px blue';
- GlobalInfo.style.fontSize = '16px';
- GlobalInfo.style.color = 'white';
-
- function showMask() {
- mask.style.display = 'block';
- }
-
- let container = document.createElement("div");
- container.style.position = "fixed";
- container.style.bottom = "0";
- container.style.left = "0";
- container.style.zIndex = "9999";
-
- let clrWBbtn = document.createElement("button");
- clrWBbtn.innerHTML = "清空微博";
- clrWBbtn.onclick = () => {
- getWB(uid, destroyWB);
- showMask();
- };
- container.append(clrWBbtn);
- container.append(document.createElement("br"));
-
- let clrFollowBtn = document.createElement("button");
- clrFollowBtn.innerHTML = "清空关注";
- clrFollowBtn.onclick = () => {
- if (getFollows(uid, destroyFollow) != -1) {
- showMask();
- }
- };
- container.append(clrFollowBtn);
- container.append(document.createElement("br"));
-
- let clrFanBtn = document.createElement("button");
- clrFanBtn.innerHTML = "清空粉丝";
- clrFanBtn.onclick = () => {
- getFans(uid, destroyFan);
- showMask();
- };
- container.append(clrFanBtn);
- container.append(document.createElement("br"));
-
- let clrFavBtn = document.createElement("button");
- clrFavBtn.innerHTML = "清空收藏";
- clrFavBtn.onclick = () => {
- getFavorite(uid, destroyFavorite);
- showMask();
- };
- container.append(clrFavBtn);
-
- document.body.append(container);
- document.body.append(mask);
- document.body.append(GlobalInfo);
- }
- window.addEventListener('load', () => { init(); });
- })();