Greasy Fork

Greasy Fork is available in English.

抽奖动态删除&取关

删除所有抽奖动态并自动取关

当前为 2022-01-24 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         抽奖动态删除&取关
// @namespace    mscststs
// @version      0.2
// @description  删除所有抽奖动态并自动取关
// @author       mscststs
// @match        http*://space.bilibili.com/*
// @require http://greasyfork.icu/scripts/38220-mscststs-tools/code/MSCSTSTS-TOOLS.js?version=713767
// @require      https://cdn.bootcss.com/axios/0.17.1/axios.js
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    let uid = window.location.pathname.split("/")[1];
    function getUserCSRF(){
		let cookies = document.cookie.split(" ");
		for(let ck of cookies){
			let key = ck.split("=")[0];
			let value = ck.split("=")[1].split(";")[0];
			if(key=="bili_jct"){
				return value;
			}
		}
	}
    let csrf_token = getUserCSRF();

    class Api{
		/*
			api部分
		*/
		constructor(){

		}
		async getFollowers(){
			let data =  await fetchJsonp("https://api.bilibili.com/x/relation/followers?jsonp=jsonp&vmid="+window.BilibiliLive.UID).then(res=>res.json());
			return data;
		}
        async space_history(offset= 0){
            let data = await this._api(`https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?visitor_uid=${uid}&host_uid=${uid}&offset_dynamic_id=${offset}`,{},"get")
            return data;
        }
        async rm_dynamic(id){
            let data = await this._api("https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic",{
                dynamic_id: id,
                csrf_token: csrf_token,
            })
            return data;
        }
        async uf_user(id){//取关
            let data = await this._api("https://api.live.bilibili.com/relation/v1/Feed/SetUserFollow",{
                uid: uid,
                type: 0,
                follow: id,
                re_src: 18,
                csrf_token: csrf_token,
                csrf: csrf_token,
                visit_id: "",
            })
            return data;
        }
		async _api(url,data,method="post") {
			return axios({
				url,
				method,
				data: data,
				transformRequest: [function (data) {
					// Do whatever you want to transform the data
					let ret = '';
					for (let it in data) {
						ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&';
					}
					return ret;
				}],
				withCredentials: true,
				headers: {
					'Content-Type': 'application/x-www-form-urlencoded'
				}
			}).then(function (res) {
				return res.data;
			});
		}

	}

    let api = new Api();
    let buttons = [".onlyDeleteAll",".deleteAll",".onlyDeleteRepost",".deleteRepost",".unfollowAll"]; //初始化 button 列表
    let logNode={};
    let whiteList = [];

    async function init(){ //初始化panel

        let shijiao = await mscststs.wait(".h-version-state",true,100);
        if(!shijiao || shijiao.innerText != "我自己"){
            console.log(`当前不是自己的个人动态`)
            return ;
        } //判断当前是否是自己的动态页面

        await mscststs.wait("#page-dynamic");//等待进入该页面


        await mscststs.wait("#page-dynamic .col-2");
        let node = document.createElement("div");
        node.className="msc_panel";
        node.innerHTML = `
        <div class="inner">
        <button class="onlyDeleteAll">删除所有抽奖动态但是不取关</button><br>
        <button class="onlyDeleteRepost">删除所有转发动态但是不取关</button><br>
        <button class="deleteAll">删除所有抽奖动态并取关</button><br>
        <button class="deleteRepost">删除所有转发动态并取关</button><br>
        <button class="unfollowAll">取关所有</button>
        <div class="log"></div></div>`
        document.querySelector("#page-dynamic .col-2").append(node); //插入节点

        //实例化buttons
        buttons = buttons.map((b)=>{
            return document.querySelector(b);
        });
        logNode = document.querySelector(".msc_panel .log");


        //绑定事件
        document.querySelector(".onlyDeleteAll").addEventListener("click",async function(e){
            disableAll();
            //在这里删除所有抽奖动态并取关
            let deleteCount = 0;
            let unfollowCount = 0;
            let has_more = 1;
            let offset = 0;
            let follow = {};
            while(has_more){
                let rq = await api.space_history(offset);
                let data = rq.data;
                has_more = data.has_more;
                if(!has_more){ break; }
                for(let card of data.cards){
                    offset = card.desc.dynamic_id_str
                    if(card.desc.orig_dy_id){
                        //该动态是转发动态
                        try{
                            let content = JSON.parse(card.card);
                            if(content.origin_extension && content.origin_extension.lott &&content.origin_extension.lott.indexOf("lottery_id")>=0){
                                //是互动抽奖

                                //删除动态
                                let rm = await api.rm_dynamic(card.desc.dynamic_id_str);
                                if(rm.code === 0){
                                    //删除成功
                                    deleteCount++;
                                }else{
                                    throw new Error("删除出错")
                                }
                                await mscststs.sleep(50); //延时
                                log(`已删除 ${deleteCount} 条`)
                            }
                        }catch(e){
                            console.log(e);

                            break;
                        }
                    }
                }
            }

            enableAll();
        })

        document.querySelector(".onlyDeleteRepost").addEventListener("click",async function(e){
            disableAll();
            //在这里删除所有抽奖动态并取关
            let deleteCount = 0;
            let unfollowCount = 0;
            let has_more = 1;
            let offset = 0;
            let follow = {};
            while(has_more){
                let rq = await api.space_history(offset);
                if(rq.code==-22){
                    alert("过于频繁,请稍等几分钟再次运行");
                    break;
                }
                let data = rq.data;
                has_more = data.has_more;
                if(!has_more){ break; }
                for(let card of data.cards){
                    offset = card.desc.dynamic_id_str
                    if(card.desc.orig_dy_id){
                        //该动态是转发动态
                        try{
                            let content = JSON.parse(card.card);
                            if(1){
                                //

                                //删除动态
                                let rm = await api.rm_dynamic(card.desc.dynamic_id_str);
                                if(rm.code === 0){
                                    //删除成功
                                    deleteCount++;
                                }else{
                                    throw new Error("删除出错")
                                }
                                await mscststs.sleep(50); //延时
                                log(`已删除 ${deleteCount} 条`)
                            }
                        }catch(e){
                            console.log(e);
                            break;
                        }
                    }
                }
            }

            enableAll();
        })


        document.querySelector(".deleteAll").addEventListener("click",async function(e){
            disableAll();
            //在这里删除所有抽奖动态并取关
            let deleteCount = 0;
            let unfollowCount = 0;
            let has_more = 1;
            let offset = 0;
            let follow = {};
            while(has_more){
                let rq = await api.space_history(offset);
                let data = rq.data;
                has_more = data.has_more;
                if(!has_more){ break; }
                for(let card of data.cards){
                    offset = card.desc.dynamic_id_str
                    if(card.desc.orig_dy_id){
                        //该动态是转发动态
                        try{
                            let content = JSON.parse(card.card);
                            if(content.origin_extension && content.origin_extension.lott &&content.origin_extension.lott.indexOf("lottery_id")>=0){
                                //是互动抽奖

                                //删除动态
                                let rm = await api.rm_dynamic(card.desc.dynamic_id_str);
                                if(rm.code === 0){
                                    //删除成功
                                    deleteCount++;
                                }else{
                                    throw new Error("删除出错")
                                }
                                //取消关注,这里需要使用直播间的取关接口
                                if(follow[content.origin_user.info.uid]){
                                    //已经删除过
                                }else{

                                    let uf = await api.uf_user(content.origin_user.info.uid);
                                    if(uf.code===0){
                                        follow[content.origin_user.info.uid] = 1;
                                        unfollowCount++;
                                        //取关成功
                                    }else{
                                        throw new Error("取关出错")
                                    }
                                }
                                await mscststs.sleep(50); //延时
                                log(`已删除 ${deleteCount} 条 ,取关 ${unfollowCount} 个`)
                            }
                        }catch(e){
                            console.log(e);

                            break;
                        }
                    }
                }
            }

            enableAll();
        })

        document.querySelector(".deleteRepost").addEventListener("click",async function(e){
            disableAll();
            //在这里删除所有抽奖动态并取关
            let deleteCount = 0;
            let unfollowCount = 0;
            let has_more = 1;
            let offset = 0;
            let follow = {};
            while(has_more){
                let rq = await api.space_history(offset);
                if(rq.code==-22){
                    alert("过于频繁,请稍等几分钟再次运行");
                    break;
                }
                let data = rq.data;
                has_more = data.has_more;
                if(!has_more){ break; }
                for(let card of data.cards){
                    offset = card.desc.dynamic_id_str
                    if(card.desc.orig_dy_id){
                        //该动态是转发动态
                        try{
                            let content = JSON.parse(card.card);
                            if(1){
                                //

                                //删除动态
                                let rm = await api.rm_dynamic(card.desc.dynamic_id_str);
                                if(rm.code === 0){
                                    //删除成功
                                    deleteCount++;
                                }else{
                                    throw new Error("删除出错")
                                }
                                //取消关注,这里需要使用直播间的取关接口
                                if(content.origin_user && !follow[content.origin_user.info.uid]){
                                    let uf = await api.uf_user(content.origin_user.info.uid);
                                    if(uf.code===0){
                                        follow[content.origin_user.info.uid] = 1;
                                        unfollowCount++;
                                        //取关成功
                                    }else{
                                        throw new Error("取关出错")
                                    }
                                }
                                await mscststs.sleep(50); //延时
                                log(`已删除 ${deleteCount} 条 ,取关 ${unfollowCount} 个`)
                            }
                        }catch(e){
                            console.log(e);
                            break;
                        }
                    }
                }
            }

            enableAll();
        })

        document.querySelector(".unfollowAll").addEventListener("click",async function(e){
            disableAll();
            //在这里删除所有抽奖动态并取关
            let deleteCount = 0;
            let unfollowCount = 0;
            let has_more = 1;
            let offset = 0;
            let follow = {};
            let rq = await api.space_history(offset);

            for(let attention of rq.data.attentions.uids){
                if(attention == uid){
                    continue;
                }
                let uf = await api.uf_user(attention);
                if(uf.code===0){
                    unfollowCount++;
                    //取关成功
                }else{
                    alert("取关出错,可能是过于频繁,请稍后再试")
                    break;
                }
                await mscststs.sleep(50); //延时
                log(`已取关 ${unfollowCount} 个`)

            }

            enableAll();
        })
    }
    function log(word){
        logNode.innerText = word;
    }
    function disableAll(){
        buttons.forEach(b=>{
            b.disabled = true;
        })
    }
    function enableAll(){
        buttons.forEach(b=>{
            b.disabled = false;
        })
    }
    init();
})();