AnilistLiker

Allows users to quickly like posts on Anilist just by one click ,this version allow you to blacklist or whitelist any user for ease of use

目前為 2022-08-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name         AnilistLiker
// @namespace    https://github.com/Makhloufbel/AnilistLiker
// @homepage     https://github.com/Makhloufbel
// @version      0.3.8b
// @description  Allows users to quickly like posts on Anilist just by one click ,this version allow you to blacklist  or whitelist any user for ease of use
// @author       Makhloufbel
// @match        https://anilist.co/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=anilist.co

// ==/UserScript==

(function() {
    'use strict';
    const svgns = 'http://www.w3.org/2000/svg';
    const BLACKLIST_BUTTON_CLASSNAMES = ['btn', 'btn-primary', 'mmd1'];
    //the current allowed max likes per minute is 32
    const Max_likes = 30;
    /******** CSS of buttons divs uls ... ect ********/
    const css = [
        `
  .btn-primary {
      color: rgb(var(--color-text));
      background-color: rgb(var(--color-foreground-blue));
  }
  .btn {
      display: inline-block;
      width: max-content;
      font-weight: bold;
      line-height: 1.5;
      color: rgb(var(--color-text));
      text-align: center;
      text-decoration: none;
      vertical-align: middle;
      cursor: pointer;
      -webkit-user-select: none;
      -moz-user-select: none;
      user-select: none;
      padding: 0.275rem 0.5rem;
      font-size: 1rem;
      border-radius: 0.25rem;
      transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
  }
  .btn.mmd1 {
      box-sizing: border-box;
      font-size: 1.2rem;
      border: none;
      opacity: 0;
      position: absolute;
      top: .7em;
      left: 58%;
  }
  .btn:hover {
      background-color: rgb(var(--color-foreground-blue-dark));
      color: rgb(var(--color-blue));
      transition: .02s;
  }
  div.details:hover > .mmd1 {
      opacity: 1!important;
      transition: inherit;
      transform-origin: center;
  }
          .POPUP {
              padding: 5px;
              margin: 5px;
              background: #eee;
              border: 1px solid #aaa;
          }
          .mackDisplayBox {
              position: fixed;
              top: 80px;
              left: 200px;
              z-index: 999;
              min-width: 300px;
              min-height: 200px;
              padding: 20px;
              background-color: rgb(var(--color-foreground));
              border: solid 1px;
              border-radius: 4px;
              box-shadow: black 2px 2px 20px;
              overflow: hidden;
              filter: brightness(110%);
          }
          .mackDisplayBox .scrollableContent {
              overflow: auto;
              height: 100%;
              scrollbar-width: thin;
              margin-top: 5px;
              padding: 30px;
              padding-top: 35px;
              padding-left: 15px;
          }
          .mackDisplayBoxClose {
              position: absolute;
              right: 15px;
              top: 15px;
              cursor: pointer;
              background-color: red;
              border: solid;
              border-width: 1px;
              border-radius: 2px;
              color: white;
              border-color: rgb(var(--color-text));
              filter: drop-shadow(0 0 0.2rem crimson);
              z-index: 20;
          }

          .mackDisplayBoxClose:hover {
              filter: drop-shadow(0 0 0.75rem crimson);
          }
          .mackNewChapter .mackDisplayBoxClose {
              display: none;
              top: 7px;
          }
          .mackNewChapter:hover .mackDisplayBoxClose {
              display: inline;
          }
          .mackDisplayBoxTitle {
              position: absolute;
              top: 5px;
              left: 5px;
              padding: 1rem;
              font-weight: bold;
              font-size: 1.2em;
              background-color: inherit;
              z-index: 9999;
          }

          .mackResizePearl {
              position: absolute;
              right: 2px;
              bottom: 2px;
              width: 20px;
              height: 20px;
              border: solid;
              border-radius: 10px;
              background: rgb(var(--color-foreground));
              cursor: se-resize;
          }
          .mackGuideHeading,
          .mackGuideHeading:visited {
              color: rgb(var(--color-blue));
          }
          * {
              scrollbar-color: rgb(var(--color-blue)) rgba(0, 0, 0, 0);
              scrollbar-width: thin;
          }
          ::-webkit-scrollbar {
              width: 4px;
              height: 8px;
          }

          ::-webkit-scrollbar-button {
              display: none;
          }

          ::-webkit-scrollbar-track {
              background-color: #1110;
              width: 0px;
          }

          ::-webkit-scrollbar-track-piece {
              display: none;
          }

          ::-webkit-scrollbar-thumb {
              background-color: rgb(var(--color-blue));
          }
			#myContainer {
				position: fixed;
				left: 5px;
				align-items: center;
				height: 7rem;
				width: 100px;
			}

.mmd2{
      border: 2px solid rgb(var(--color-foreground-blue-dark));
      width: 9em;
      height: 2.125em;
      cursor: pointer;
      display: inline-block;
      font-weight: bold;
      font-size: inherit;
      padding: 0 5px;
      line-height: 1.2em;
      text-align: center;
      text-decoration: none;
      user-select: none;
      -webkit-user-select: none;
      touch-action: manipulation;
  }
  .mmd2.btntop{
              border-radius: 10px 10px 0 0;
  }
  .mmd2.btnbottom{
              border-radius: 0 0 10px 10px;
  }
  .mmd2.btnbottom[disabled]{
        border: 1px solid #999999;
        background-color: darkgrey;
        color: #fff;
        cursor: not-allowed;
    }
  .mmd2:active {
      box-shadow: rgb(var(--color-foreground-blue)) 2px 2px 0 0;
      transform: translate(2px, 2px);
  }
  .scrollableContent >p{
      display: flex;
      flex-direction: column;
      justify-content: center;
      width: 100%;
      height: 2em;
      margin: 0;
      font-weight: bold;
      font-size: inherit;
      padding: 10px 50px;
  }
  .scrollableContent >p{
      font-size: 1.8rem;
  }
  .scrollableContent p:nth-child(2n) {
      background-color: rgba(var(--color-foreground-blue),.0);
  }
  .scrollableContent p:nth-child(2n-1) {
      background-color: rgba(var(--color-foreground-blue-dark),.2);
  }
  p >.mackDisplayBoxClose{
      display: inline-block;
      right: 30px;
      font-weight: normal;
      background-color: red;
      transform: translateY(30%)
  }
  .mackDisplayBox .scrollableContent{
      padding: 30px 0 0 0;
      margin: 0 -20px 0 -20px;
  }
  div.scrollableContent {
      counter-reset: section1;
  }
  p.mackNewChapter::before {
      position: absolute;
      left: 1.4em;
      counter-increment: section1;
      content: counter(section1) " - ";
      transform: translateX(-5%);
  }
  .profile-btn{
    display: flex;
    transform: translate(0px, -40%);
    place-content: flex-start center;
    background: rgba(var(--color-blue),.8);
    border-radius: 4px;
    color: rgb(var(--color-white));
    cursor: pointer;
    display: inline-block;
    margin-left: 10px;
    margin-right: 10px;
    padding: 10px 12px;
    text-align: center;
    transition: .4s;
    border: none;
  }
`,
    ];
    /*********** verify if logged in**********/

    let userObject;
    let whoAmI = '';
    let whoAmIid = 0;
    try {
        userObject = JSON.parse(localStorage.getItem('auth'));
    } catch (err) {
        console.warn('could not get userObject');
    }
    if (userObject) {
        whoAmI = userObject.name;
        whoAmIid = userObject.id;
    } else {
        try {
            whoAmI = document
                .querySelector(".nav .links .link[href^='/user/']")
                .href.match(/\/user\/(.*)\//)[1]; //looks at the navbar
        } catch (e) {
            console.warn('could not get username');
            alert('Please login before to use this script!!!');
            return;
        }
    }
    /********* add CSS ********/
    window.addEventListener('load', document.head.insertAdjacentHTML('beforeend', '<style>' + css + '</style>'), false);

    let username = String('https://anilist.co/user/' + whoAmI + '/');
    //document.querySelector(".nav .links .link[href^='/user/']").href;

    /********* functions to store data *********/
    const setObj = (key, obj) => {
        localStorage.setItem(key, JSON.stringify(obj));
    };
    const getObj = (key) => {
        return JSON.parse(localStorage.getItem(key));
    };

    if (getObj('blacklist') === null || getObj('blacklist').length == 0) {
        setObj('blacklist', [username]);
    }



    /***************************** Timer by @as280093 **********************************************/

      const css2 = [
        `
  #countdowner{
    cursor: default;
  }
 .base-timer {
  position: fixed;
    bottom: 20px;
    left: 20px;
    z-index: 999;
    cursor: pointer;
  width: 50px;
  height: 50px;
  right: 3rem;
  width: 50px;
  height: 50px;
}

.base-timer__svg {
  transform: scaleX(-1);
}

.base-timer__circle {
  fill: none;
  stroke: none;
}

.base-timer__path-elapsed {
  stroke-width: 5px;
  stroke: grey;
}

.base-timer__path-remaining {
  stroke-width: 5px;
  stroke-linecap: round;
  transform: rotate(90deg);
  transform-origin: center;
  transition: 1s linear all;
  fill-rule: nonzero;
  stroke: currentColor;
}

.base-timer__path-remaining.green {
  color: rgb(65, 184, 131);
}

.base-timer__path-remaining.orange {
  color: orange;
}

.base-timer__path-remaining.red {
  color: red;
}

.base-timer__label {
position: fixed;
   bottom: 20px;
  left: 20px;
  z-index: 999;
  cursor: pointer;
  width: 50px;
  height: 50px;
  right: 3rem;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
}
`,
  ];
    // css end here
    window.addEventListener('load', function() {
        document.head.insertAdjacentHTML("beforeend", "<style>" + css2 + "</style>")}, false);
        // html injection

        let countdowner = create(
            'div',
            '#countdowner',
            false,
            document.querySelector('#app')
        );

        //COUNDTDOWN CODE

        const FULL_DASH_ARRAY = 283;
        const WARNING_THRESHOLD = 10;
        const ALERT_THRESHOLD = 5;

        const COLOR_CODES = {
            info: {
                color: "red"
            },
            warning: {
                color: "orange",
                threshold: WARNING_THRESHOLD
            },
            alert: {
                color: "green",
                threshold: ALERT_THRESHOLD
            }
        };

        const TIME_LIMIT = 60;
        let timePassed = 0;
        let timeLeft = TIME_LIMIT;
        let timerInterval = null;
        let remainingPathColor = COLOR_CODES.info.color;


        //startTimer();

        function onTimesUp() {
            clearInterval(timerInterval);
        }

        function startTimer() {
            timePassed = 0;
            timeLeft = TIME_LIMIT;
            timerInterval = null;
            remainingPathColor = COLOR_CODES.info.color;

            document.getElementById("countdowner").innerHTML = `
            <div class="base-timer">
              <svg class="base-timer__svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
                <g class="base-timer__circle">
                  <circle class="base-timer__path-elapsed" cx="50" cy="50" r="45"></circle>
                  <path
                    id="base-timer-path-remaining"
                    stroke-dasharray="283"
                    class="base-timer__path-remaining ${remainingPathColor}"
                    d="
                      M 50, 50
                      m -45, 0
                                  a 45,45 0 1,0 90,0
                      a 45,45 0 1,0 -90,0
                    "
                  ></path>
                </g>
              </svg>
              <span id="base-timer-label" class="base-timer__label">${formatTime(timeLeft)}</span>
            </div>`;


            timerInterval = setInterval(() => {
                timePassed = timePassed += 1;
                timeLeft = TIME_LIMIT - timePassed;
                document.getElementById("base-timer-label").innerHTML = formatTime(
                    timeLeft
                );
                setCircleDasharray();
                setRemainingPathColor(timeLeft);

                if (timeLeft === 0) {
                    onTimesUp();
                    document.getElementById("countdowner").innerHTML = ''
                    let likeAllbtn = document.querySelector(".btn.btn-primary.mmd2.btnbottom")
                    likeAllbtn.disabled = false;
                    likeAllbtn.innerHTML = "Like all posts"
                }
            }, 1000);

        }

        function formatTime(time) {
            const minutes = Math.floor(time / 60);
            let seconds = time % 60;

            if (seconds < 10) {
                seconds = `0${seconds}`;
            }

            return `${minutes}:${seconds}`;
        }

        function setRemainingPathColor(timeLeft) {
            const { alert, warning, info } = COLOR_CODES;
            if (timeLeft <= alert.threshold) {
                document
                    .getElementById("base-timer-path-remaining")
                    .classList.remove(warning.color);
                document
                    .getElementById("base-timer-path-remaining")
                    .classList.add(alert.color);
            } else if (timeLeft <= warning.threshold) {
                document
                    .getElementById("base-timer-path-remaining")
                    .classList.remove(info.color);
                document
                    .getElementById("base-timer-path-remaining")
                    .classList.add(warning.color);
            }
        }

        function calculateTimeFraction() {
            const rawTimeFraction = timeLeft / TIME_LIMIT;
            return rawTimeFraction - (1 / TIME_LIMIT) * (1 - rawTimeFraction);
        }

        function setCircleDasharray() {
            const circleDasharray = `${(
                calculateTimeFraction() * FULL_DASH_ARRAY
            ).toFixed(0)} 283`;
            document
                .getElementById("base-timer-path-remaining")
                .setAttribute("stroke-dasharray", circleDasharray);
        }

        // end here

    /*********************** End Of Timer **************************************/





















    /****** the Main function *******/
    (function main() {
        let div = create(
            'div',
            '#myContainer',
            false,
            document.querySelector('#nav > div.wrap')
        );
        let blacklistbtn = create(
            'button',
            ['btn', 'btn-primary', 'mmd2', 'btntop'],
            'Show blacklist',
            div
        );
        var likeAllbtn = create(
            'button',
            ['btn', 'btn-primary', 'mmd2', 'btnbottom'],
            'Like all posts',
            div
        );
        blacklistbtn.onclick = () => {
            POPUP();
        };

        likeAllbtn.onclick = () => {
            likeBtnHandler();


        };
    })();
    /******** Utilities functions *********/
    function homePageHandler() {
        let divs = document.querySelectorAll('div.details:not(.ided)');
        for (let e of divs) {
            createbtn(e);
        }
    }

    function createbtn(e) {
        let tempUserName= e.closest('.wrap').getElementsByClassName('name')[0].href;
        if ( tempUserName === username ) return;

        addAttribute(e);

        let btn = create(
            'button',
            ['btn', 'btn-primary', 'mmd1'],
            String(e.getAttribute('data-status')) === 'blacklisted'
            ? 'whitelist'
            : 'blacklist',
            false,
            'position : absolute;'
        );
        btn.onclick = () => {
            switch (String(e.getAttribute('data-status'))) {
                case 'whitelisted':
                    blacklistbtn(e);
                    btn.remove();
                    addAttribute(e);
                    createbtn(e);
                    break;
                case 'blacklisted':
                    whitelistbtn(e);
                    btn.remove();
                    addAttribute(e);
                    createbtn(e);
                    break;
            }
            deleteAllBtn();
        };
        e.children[0].after(btn);
        e.classList.add('ided');
    }
    function userProfileHandler() {
        let div = document.querySelector('.name-wrapper');
        createProfilebtn(div);
    }
    function createProfilebtn(e) {
        if (String('https://anilist.co/user/' + e.innerText + '/') === username) return;

        addAttributeToProfile(e);
        let btn = create(
            'button',
            ['nav-btn', 'profile-btn'],
            String(e.getAttribute('data-status')) === 'blacklisted'
            ? 'whitelist'
            : 'blacklist',
            false,
            false
        );
        btn.onclick = () => {
            switch (String(e.getAttribute('data-status'))) {
                case 'whitelisted':
                    blacklistbtn(e);
                    break;
                case 'blacklisted':
                    whitelistbtn(e);
                    break;
                default:
                    console.log('Error');
                    break;
            }
            deleteAllBtn();
            userProfileHandler(e);
        };
        e.after(btn);
    }

    function addAttributeToProfile(b) {
        let blacklist = getObj('blacklist');
        if (String('https://anilist.co/user/' + b.innerText + '/') == username) return;

        if ( blacklist.includes(String('https://anilist.co/user/' + b.innerText + '/'))){
            b.setAttribute('data-status', 'blacklisted');
        } else {
            b.setAttribute('data-status', 'whitelisted');
        }
    }
    function deleteAllBtn() {
        document
            .querySelectorAll('button.btn.btn-primary.mmd1')
            .forEach((e) => {
            e.remove();
        });
        document.querySelectorAll('div.details').forEach((e) => {
            e.classList.remove('ided');
        });
        document.querySelectorAll('.profile-btn').forEach((e) => {
            e.remove();
        });
    }

    function POPUP() {
        let blacklist = getObj('blacklist');
        let box = createDisplayBox(
            'width:600px;height:500px;top:100px;left:220px;',
            'Blacklisted'
        );
        for (let e of blacklist) {
            let listing = create(
                'p',
                'mackNewChapter',
                false,
                false,
                'position:relative;'
            );
            create('a', ['link', 'newTab'], getName(e), listing).href =
                '/user/' + getName(e) + '/';
            let listClose = create(
                'span',
                'mackDisplayBoxClose',
                '✕',
                listing,
                'top:0 !important;'
            );
            listClose.onclick = function () {
                whitelistbtn(listing);
                listing.remove();
                blacklist.filter((item) => item !== e);
                deleteAllBtn();
                userProfileHandler();
            };
            box.appendChild(listing);
        }
    }

    function addAttribute(b) {
        let blacklist = getObj('blacklist');
        if (b.firstChild.href == username) return;

        if (blacklist.includes(b.firstChild.href)) {
            b.setAttribute('data-status', 'blacklisted');
        } else {
            b.setAttribute('data-status', 'whitelisted');
        }
    }
    /********* Create a DOMElement *********/
    function create(HTMLtag, classes, text, appendLocation, cssText) {
        let element = document.createElement(HTMLtag);
        if (Array.isArray(classes)) {
            element.classList.add(...classes);
            if (classes.includes('newTab')) {
                element.setAttribute('target', '_blank');
            }
        } else if (classes) {
            if (classes[0] === '#') {
                element.id = classes.substring(1);
            } else {
                element.classList.add(classes);
                if (classes === 'newTab') {
                    element.setAttribute('target', '_blank');
                }
            }
        }
        if (text || text === 0) {
            element.innerText = text;
        }
        if (appendLocation && appendLocation.appendChild) {
            appendLocation.appendChild(element);
        }
        if (cssText) {
            element.style.cssText = cssText;
        }
        return element;
    }
    /********* Create hovering box *********/
    function createDisplayBox(cssProperties, windowTitle) {
        let displayBox = create(
            'div',
            'mackDisplayBox',
            false,
            document.querySelector('#app') ||
            document.querySelector('.termsFeed') ||
            document.body,
            cssProperties
        );
        if (windowTitle) {
            create('span', 'mackDisplayBoxTitle', windowTitle, displayBox);
        }
        let mousePosition;
        let offset = [0, 0];
        let isDown = false;
        let isDownResize = false;
        let displayBoxClose = create(
            'span',
            'mackDisplayBoxClose',
            '✕',
            displayBox
        );
        displayBoxClose.onclick = function () {
            displayBox.remove();
        };
        let resizePearl = create('span', 'mackResizePearl', false, displayBox);
        displayBox.addEventListener(
            'mousedown',
            function (e) {
                if (!['P', 'PRE'].includes(e.target.tagName)) {
                    //don't annoy people trying to copy-paste
                    isDown = true;
                    offset = [
                        displayBox.offsetLeft - e.clientX,
                        displayBox.offsetTop - e.clientY,
                    ];
                }
            },
            true
        );
        resizePearl.addEventListener(
            'mousedown',
            function (event) {
                event.stopPropagation();
                event.preventDefault();
                isDownResize = true;
                offset = [displayBox.offsetLeft, displayBox.offsetTop];
            },
            true
        );
        document.addEventListener(
            'mouseup',
            function () {
                isDown = false;
                isDownResize = false;
            },
            true
        );
        document.addEventListener(
            'mousemove',
            function (event) {
                if (isDownResize) {
                    mousePosition = {
                        x: event.clientX,
                        y: event.clientY,
                    };
                    displayBox.style.width =
                        mousePosition.x - offset[0] + 5 + 'px';
                    displayBox.style.height =
                        mousePosition.y - offset[1] + 5 + 'px';
                    return;
                }
                if (isDown) {
                    mousePosition = {
                        x: event.clientX,
                        y: event.clientY,
                    };
                    displayBox.style.left = mousePosition.x + offset[0] + 'px';
                    displayBox.style.top = mousePosition.y + offset[1] + 'px';
                }
            },
            true
        );
        let innerSpace = create('div', 'scrollableContent', false, displayBox);
        return innerSpace;
    }

    function getName(link) {
        if (link === null) return;
        return link.split('/')[4];
    }

    function whitelistbtn(b) {
        let blacklist = getObj('blacklist');
        var value = String(
            'https://anilist.co/user/' + b.children[0].innerText + '/'
        );
        var val = b.children[0].innerText;

        if (blacklist.includes(value)) {
            blacklist.splice(blacklist.indexOf(value), 1);
            blacklist = setObj('blacklist', blacklist);
            //alert(val +' has been whitelisted !');
            //console.log(blacklist);
        } else {
            //alert(val +' is not blacklisted !');
        }
    }
    function blacklistbtn(b) {
        let blacklist = getObj('blacklist');
        var value = (value = String(
            'https://anilist.co/user/' + b.children[0].innerText + '/'
        ));
        var val = b.children[0].innerText;

        if (!blacklist.includes(value)) {
            blacklist.push(value);
            setObj('blacklist', blacklist);
            // alert(val +' has been blacklisted !');
            //console.log(blacklist);
        } else {
            // alert(val +' is already blacklisted !');
        }
    }

    function eventFire(el, etype) {
        if (el.fireEvent) {
            el.fireEvent('on' + etype);
        } else {
            var evObj = document.createEvent('Events');
            evObj.initEvent(etype, true, false);
            el.dispatchEvent(evObj);
        }
    }



    let currentLiked = 0;
    let date = new Date;
    function likeBtnHandler() {
        //console.log("after first call:",timer)

        let likes = document.querySelectorAll('.button:not(.liked)');

        let notBlacklisted = blacklistedarray(likes);


        if(notBlacklisted.length + currentLiked > Max_likes){
            let end_arr = Max_likes - currentLiked ;
            notBlacklisted = notBlacklisted.slice(0,end_arr)
        }
        //console.log(likes, notBlacklisted);
        for (let e of notBlacklisted) {
            eventFire(e, 'click');

        }

        if((new Date() - date) /1000 < TIME_LIMIT){
            currentLiked += notBlacklisted.length;
            notBlacklisted = [];

            if(currentLiked >= Max_likes){
                //console.log( "inside :",(new Date()- date)/1000 , currentLiked )
                let likeAllbtn = document.querySelector(".btn.btn-primary.mmd2.btnbottom")
                likeAllbtn.disabled = true;
                likeAllbtn.innerHTML = "Wait 60 Second!"

                startTimer();
                currentLiked = 0;
            }
        }else{
            date = new Date();

            currentLiked += notBlacklisted.length;
            notBlacklisted = [];

            if(currentLiked >= Max_likes){
                //console.log( "inside :",(new Date()- date)/1000 , currentLiked )
                let likeAllbtn = document.querySelector(".btn.btn-primary.mmd2.btnbottom")
                likeAllbtn.disabled = true;
                likeAllbtn.innerHTML = "Wait 60 Second!"

                startTimer();
                currentLiked = 0;
            }



        }
        //console.log( (new Date()- date)/1000 , currentLiked )




    }

    function blacklistedarray(array) {
        let blacklist = getObj('blacklist');
        if (!blacklist.includes(username)) {
            blacklist.push(username);
        }
        let notBlacklisted = new Array();
        let isBlacklisted;
        for (let c of array) {
            isBlacklisted = false;
            for (let e of blacklist) {
                if (
                    c.closest('.wrap').getElementsByClassName('name')[0].href ==
                    e
                ) {
                    isBlacklisted = true;
                    break;
                }
            }
            if (isBlacklisted == false) {
                notBlacklisted.push(c);
            }
        }
        return notBlacklisted;
    }
    function profileBtnHandler() {
        let isAdded = document.querySelector('button.nav-btn.profile-btn');
        //console.log([...isAdded].length);
        if (isAdded !== null) return;
        window.onload = userProfileHandler();
    }

    const onMutate = function (mutationsList) {
        if (window.location.href == 'https://anilist.co/home') {
            homePageHandler();
        }
        if (window.location.href.match(/(^https?:\/\/)?(www\.)?anilist.co\/user\/\w+/gi)!= null){
            profileBtnHandler();
        }
    };
    const observer = new MutationObserver(onMutate);
    observer.observe(document.body, { childList: true, subtree: true });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址