Greasy Fork

Greasy Fork is available in English.

斗鱼小工具

斗鱼批量取关

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name			斗鱼小工具
// @namespace		http://tampermonkey.net/
// @version			0.0.3
// @icon			http://www.douyutv.com/favicon.ico
// @description		斗鱼批量取关
// @author			H2P
// @compatible		chrome
// @match           https://www.douyu.com/directory/myFollow
// @note			2020.04.28-V0.0.3 删除对 jQuery 的依赖
// ==/UserScript==

(()=>{
    'use strict';

    const isFollowList = window.location.href.startsWith('https://www.douyu.com/directory/myFollow');

    const $H2P = function (xpath, one = true) {
        if (one) { return document.querySelector(xpath); }
        else { return document.querySelectorAll(xpath); }
    }

    if (isFollowList){
        let anchorsSelected = [];

    	let INVL_AddBtnCancelFollow = setInterval(() => {
			if ($H2P('div#filter-tab-expandable-wrapper') && !$H2P('a#a-cancelFollow')){
				window.clearInterval(INVL_AddBtnCancelFollow);
				INVL_AddBtnCancelFollow = null;

				new Promise((resolve, reject) => {
					let btn_cancelFollow = document.createElement('a');
					btn_cancelFollow.id = 'a-cancelFollow';
					btn_cancelFollow.className = 'layout-Module-label';
					btn_cancelFollow.innerHTML = `
						<strong>取消关注</strong>
					`;
					$H2P('div#filter-tab-expandable-wrapper').append(btn_cancelFollow);
					resolve();
				})
				.then(() => {
					$H2P('a#a-cancelFollow').addEventListener('click', () => {
						let anchorSelected = Array.from($H2P('li.layout-Cover-item div.DyLiveCover-selectArea.is-active', false));
						anchorSelected.forEach(anchor => {
							let anchorHref = anchor.nextSibling.href;
							if (!anchorHref || anchorHref.length == 0){
								anchorHref = anchor.parentNode.href;
							}
							let anchorId = anchorHref.split('/').pop();
							anchorsSelected.push(anchorId);
						});
						console.log(anchorsSelected);
						Set_TO_CancelFollow();
					});
				})
				.catch((error) => { console.log(error); })
			}
		}, 500);
		
		function Set_TO_CancelFollow () {
			if (anchorsSelected && anchorsSelected.length > 0) {
				for (let i = 0; i < anchorsSelected.length; i++) {
					let anchorId = anchorsSelected[i];
					setTimeout(() => {
						cancelFollow(anchorId);
					}, (i + 1) * 1000);
				}
			}
		}

		function cancelFollow(anchorId){
			fetch(`https://www.douyu.com/room/follow/cancel_confuse/${anchorId}`, {
				method: 'POST'
			})
			.then(res => res.json())
			.then((res) => {
				if (res && 'error' in res && res.error === 0) {
					console.log(`成功取消关注主播:${anchorId}`);
					let parentEle = $H2P(`a[href="/${anchorId}"]`).parentNode;
					// 从主播 id 找到主播信息所在 ele 的根节点
					while (!parentEle.classList.contains('layout-Cover-item') && parentEle.tagName.toLowerCase() !== 'body') {
						parentEle = parentEle.parentNode;
					}
					if (parentEle.classList.contains('layout-Cover-item') && parentEle.tagName.toLowerCase() !== 'body') {
						parentEle.remove();
					}
				} else {
					console.log(`取消关注主播:${anchorId} 失败`);
				}
			});
		}
    }
})();