FB 預設使用所有留言

FB default set all comment

目前为 2022-08-21 提交的版本。查看 最新版本

// ==UserScript==
// @name         FB 預設使用所有留言
// @namespace    http://tampermonkey.net/
// @version      2.74
// @description  FB default set all comment
// @description:zh-tw  FB 預設開啟所有留言
// @author       You
// @match        https://www.facebook.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=facebook.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    console.log("FB 預設開啟所有留言 開始作業")
    async function onMyClick() {
        for(let t=0;t<2;t++){
            //console.log("click")
            let a,b
            let has=false
            let originAll=false
            await new Promise(r => setTimeout(r, 300));
            let timeOut=0;
            let article=[]
            while(!has){
                a = document.querySelectorAll("span:not([fb_doac]), div:not([fb_doac])")
                let top= window.scrollTop
                for (let i = 0; i < a.length; i++) {
                    b=a[i];
                    let c=b.closest("div[aria-posinset]")
                    if(c==null) continue;
                    if(c.getAttribute("fb_doac")=="true"){
                        //console.log("jump")
                        continue;
                    }
                    if(getInnerDepth(b)>5) continue;
                    let text=b.innerText
                    //this line is show the possible menu text, you can change to your language
                    if((text.indexOf("與星星一同傳送的留言")==0||text.indexOf("即時留言")==0||text.indexOf("最舊")==0||text.indexOf("最相關")==0||text.indexOf("最新")==0) && b.querySelector("[data-ad-preview]")==null && b.closest("[data-ad-preview]") ==null ){
                        b.click()
                        window.scrollTop=top
                        //b.innerText="-"+b.innerText
                        let topElement=b.closest("div[aria-posinset]")
                        topElement.setAttribute("fb_doac",true);
                        article.push(topElement)
                        has=true
                        //console.log("發現 所有留言的存在")
                    }
                    if(text.indexOf("所有留言")==0){
                        has=true
                        originAll=true
                        let topElement=b.closest("div[aria-posinset]")
                        topElement.setAttribute("fb_doac",true);
                        article.push(topElement)
                    }
                }
                await new Promise(r => setTimeout(r, 100));
                timeOut+=100
                if(timeOut>5000) return;
            }
            if(!has) return
            //console.log(article)

            timeOut=0
            /*if(originAll){
            has=false
        }*/
            let second=[]
            while(has){
                a = document.querySelectorAll("span:not([fb_doac]), div:not([fb_doac])")
                let top= window.scrollTop
                for (let i = 0; i < a.length; i++) {
                    b=a[i];
                    if(getInnerDepth(b)>3) continue;
                    let text=b.innerText
                    //this line is show the possible menu text's under explain, you can change to your language
                    if((text.indexOf("顯示所有留言,從舊到新排序。")!=-1||text.indexOf("留言出現在影片中的時候便會同步顯示。")!=-1||text.indexOf("顯示所有留言,包含可能是垃圾訊息的內容。最相關的留言會顯示在最上方。")!=-1|| text.indexOf("依時間順序顯示所有留言,包括可能是垃圾訊息的留言。")!=-1) && b.querySelector("[data-ad-preview]")==null && b.closest("[data-ad-preview]") ==null ){
                        //console.log(b)
                        b.click()
                        window.scrollTop=top
                        //b.innerText="-"+b.innerText
                        //console.log("自動按所有留言")
                        has=false
                    }
                    else if(second==null && (text.indexOf("顯示所有留言,且最新的留言顯示在最上方。")!=-1 ) && b.querySelector("[data-ad-preview]")==null && b.closest("[data-ad-preview]") ==null ){
                        second.push(b)
                    }
                }
                await new Promise(r => setTimeout(r, 100));
                timeOut+=50
                if(has && timeOut>1000){
                    if(second.length>0){
                        second.foreach(x=>x.click())
                        window.scrollTop=top
                        has=false
                    }
                }
            }
            await new Promise(r => setTimeout(r, 700));

            timeOut=0
            has=false
            while(!has){
                let top= window.scrollTop
                for(let i=0;i<article.length;i++){
                    let item=article[i]
                    let c= item.querySelectorAll("span:not([fb_doac]), div:not([fb_doac])")
                    for(let j=0;j<c.length;j++){
                        b=c[j]
                        let text=b.innerText
                        if(getInnerDepth(b)>3) continue
                        //this line is show the possible menu text's under explain, you can change to your language
                        if(text.indexOf("顯示先前的留言")!=-1 || text.indexOf("檢視另")!=-1 || text.indexOf("查看")!=-1) {
                            b.click()
                            window.scrollTop=top
                            has=true
                        }
                    }
                }

                await new Promise(r => setTimeout(r, 100))
                timeOut+=100
                if(timeOut>5000) break
            }
            await new Promise(r => setTimeout(r, 300))
        }
        //console.log("完成任務")
    }
   document.body.addEventListener('mousedown', onMyClick)

   function getInnerDepth(node,max=10,now=1) {
        if(now>=max){
            return max
        }
        if (node.children.length) {
            let mm=0
            for(let i=0;i<node.children.length;i++){
                let n=node.children[i]
                if(now+1>=max) return max
                let x=getInnerDepth(n,max,now+1);
                if(x>mm){mm=x}
                if(mm>=max){
                    return max
                }
            }
            return 1 + mm;
        } else {
            return 1;
        }
    }
})();