您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows exact timestamps and post information on Facebook Posts.
// ==UserScript== // @name FB: Post Tools & Statistics DEBUG // @match https://www.facebook.com/* // @match https://*.facebook.com/* // @match http://www.facebook.com/* // @match http://*.facebook.com/* // @run-at document-start // @grant GM_addStyle // @author JZersche & wOxxOm // @require https://greasyfork.org/scripts/12228/code/setMutationHandler.js // @ require https://momentjs.com/downloads/moment.min.js // @ require https://momentjs.com/downloads/moment-with-locales.min.js // @ require https://html2canvas.hertzen.com/dist/html2canvas.js // @version 0.0.1 DEBUG VERSION // @namespace https://greasyfork.org/users/95175 // @description Shows exact timestamps and post information on Facebook Posts. // ==/UserScript== var options = { weekday: 'long', year: 'numeric', month: 'numeric', day: '2-digit' }; //GM_addStyle(''); // process the already loaded portion of the page if any expandDates(document.querySelectorAll('abbr[data-utime]')); RecentTimestamps(document.querySelectorAll('.q_1zif-zjsq')); RecentPostURLs(document.querySelectorAll('.q_1zif-zjsq, ._5r69, ._6ks')); ExternalURLs(document.querySelectorAll('._52c6')) //expandSeeMoreText(document.querySelectorAll('.mtm ._5pco')) document.querySelectorAll('.hasCaption'); // process the stuff added from now on setMutationHandler(document, 'abbr[data-utime]', expandDates); setMutationHandler(document, '.q_1zif-zjsq', RecentTimestamps); setMutationHandler(document, '.q_1zif-zjsq, ._5r69, ._6ks', RecentPostURLs); setMutationHandler(document, '._52c6', ExternalURLs); setMutationHandler({ target: document.querySelector('._5pcr'), selector: '.mtm._5pco, ._5pbx.userContent._3576', handler: nodes => nodes.forEach(node => { console.log('Before —> '+node.childNodes[0].classList); let _seemore = node.childNodes[0]; if(_seemore.classList.length == 1 && _seemore.innerText.match(/\w+\s/)) { _seemore.classList.add('text_exposed'); console.log('After —> '+node.childNodes[0].classList); } }) }) setMutationHandler({ target: document.querySelector('._n9'), selector: '._n3', handler: nodes => nodes.forEach(node => { console.log('Before —> '+node.childNodes[1]); //if() { //} }) }) /* — Copy Text Button Functionality — */ setMutationHandler({ target: document.querySelector('._3576'), selector: '.copybtnP', handler: nodes => nodes.forEach(node => { //node.setAttribute("style", ""); node.addEventListener('click', function (event) { var classCheck = document.getElementsByClassName('canvasArea'); //console.log(event.target.parentNode.parentNode.nextSibling.nextSibling.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.nextSibling.className); //console.log(event.target.closest("._1dwg._1w_m._q7o").childNodes[0].nextSibling.childNodes[0].nextSibling.className); //alert(event.target.previousSibling.innerText); if (classCheck.length == 0) { //node.parentNode.appendChild(eTxT1); getSelection().removeAllRanges(); var status_content1 = event.target.closest('._1dwg._1w_m._q7o'); var sName = event.target.closest('._6a._5u5j._6b').children[0].children[0].children[0].children[0];var sTime = event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[0]; var sURL = event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[0].nextSibling.nextSibling; var sContent = event.target.closest('.n_1zif-ycce._5eit.h_1zif-v9xd.clearfix').nextSibling; var shared_sName = event.target.closest('.n_1zif-ycce._5eit.h_1zif-v9xd.clearfix').nextSibling.nextSibling.nextSibling.children[0].nextSibling.children[0].children[0].children[1].children[0].children[0] //var status_content2 = event.target.closest('._1dwg._1w_m._q7o').children[1].children[1]; var range1 = document.createRange(); var range2 = document.createRange(); var range3 = document.createRange(); var range4 = document.createRange(); var range5 = document.createRange(); range1.selectNodeContents(sName); range2.selectNodeContents(sTime); range3.selectNodeContents(sURL); range4.selectNodeContents(sContent); range5.selectNodeContents(shared_sName); window.getSelection().addRange(range1); window.getSelection().addRange(range2); window.getSelection().addRange(range3); window.getSelection().addRange(range4); window.getSelection().addRange(range5); var eTxT1 = document.createElement("span"); eTxT1.classList.add("nSpan"); var eTxT1_class = document.getElementsByClassName("nSpan")[0]; //var eTxT1_text = document.createTextNode("<br>"); //eTxT1.appendChild(eTxT1_text); node.parentNode.appendChild(eTxT1); console.log(node); console.log(document.getElementsByClassName("nSpan")[0].className); let ranges = []; var selection = window.getSelection(); for(let i = 0; i < selection.rangeCount; i++) { ranges[i] = selection.getRangeAt(i); } selection.getRangeAt(3).insertNode(eTxT1); console.log(ranges); //alert(window.getSelection() + ' (Workings)'); ////////var rCon = event.target.closest('._1dwg._1w_m._q7o').textContent = range1.toString() + '<br />' + range2.toString() + '<br />' + range3.toString() + '<br />' + range4.toString(); //var ts = range1.toString().replace('·',''); //window.getSelection().addRange(range2); //alert(status_content1 + ' (Working)'); } if (classCheck.length == 1) { console.log('classcheck length 1'); getSelection().removeAllRanges(); //console.log(event.target.className); var status_content0 = event.target.parentNode.childNodes[3]; //status_content1 = event.target.parentNode.children[0]; //status_content2 = event.target.closest('._1dwg._1w_m._q7o').children[1].children[1]; //Base64 -- event.target.parentNode.children[3] var range0 = document.createRange(); //range1 = document.createRange(); //range2 = document.createRange(); range0.selectNode(status_content0); //range1.selectNode(status_content1); //range2.selectNode(status_content2); window.getSelection().addRange(range0); //window.getSelection().addRange(range1); //window.getSelection().addRange(range2); } try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; //console.log('Copying text command was ' + msg); } catch (err) { console.log('Oops, unable to copy'); } return false; }) }) }); /* — Insert Copy Text/HTML Button — */ var nodeCount = 0; var NumIncr = 0; setMutationHandler({ target: document.querySelector('._3576'), selector: '._5pcp', processExisting: false, handler: nodes => nodes.forEach(node => { /*._5pcq*/ /* node.setAttribute("style", ""); */ nodeCount++; /* ———---> */ console.log('Amount of Nodes' + nodeCount); /* Delay Script */ setTimeout(function () { if (!node.parentNode.innerHTML.match(/copybtnP"|s2img"/)) { /*uncomment-to-enable/* Node Counter console.log('(' + NumIncr++ + ') ' + node.innerText); */ var PosterName = 'Posted By: '+node.closest('._6a._5u5j._6b').children[0].innerText; var PostInformation = node.innerText; var PostCategory = document.getElementsByClassName('_5pcq')[1].parentNode.innerText.replace(' · ',''); var PostContent = node.closest('.n_1zif-ycce.h_1zif-v9xd.clearfix').nextSibling.innerText; if(!PostCategory) {console.log(PosterName+'\n'+PostInformation+'\n\n'+PostContent)} else {console.log(PosterName+'\n'+PostInformation+'\n\n'+PostContent+'\n\nPost Category: ['+PostCategory+']')} // Next Next Next Update //console.log('node is'+node.className); if(!node.parentNode.parentNode.outerHTML.match(/copybtnP"|copybtnHTML"|s2img"/)) { node.insertAdjacentHTML('afterend', '<input type="button" class="copybtnP" name="copyp" value="Copy Text"/>'); node.insertAdjacentHTML('afterend', '<input type="button" class="copybtnHTML" name="copyHTML" value="Copy HTML"/>'); node.insertAdjacentHTML('afterend', '<input type="button" class="s2img" name="s2img" value="Export Status"/>');console.log(node.parentNode);} } }, 0); }) }); /* — Copy Test/HTML Button Functionality — */ setMutationHandler({ target: document.querySelector('._3576'), selector: '.copybtnHTML', handler: nodes => nodes.forEach(node => { //node.setAttribute("style", ""); nodeCount++; try { if(node.parentNode.parentNode.closest('.n_1zif-ycce').nextSibling.nextSibling.children[0].children[0].children[0].children[0].children[0].children[0].children[0].children[0].children[0]) { var youtube_attach = node.parentNode.parentNode.closest('.n_1zif-ycce').nextSibling.nextSibling.children[0].children[0].children[0].children[0].children[0].children[0].children[0].children[0].children[0]; //console.log(youtube_attach); if(youtube_attach.href.match(/youtube/)[0] == "youtube") { youtube_attach.parentNode.parentNode.nextSibling.setAttribute("style","position: absolute;top: 0px;height: 72px;left: 170px;padding: 2px;z-index: 0;width: 340px"); youtube_attach.children[0].nextSibling.children[0].setAttribute("style", "width: 160px;height: auto;max-width: 175px;max-height: 90px;left: 8px; border-radius:8px; overflow: hidden"); youtube_attach.children[1].setAttribute('style','background: #0000;'); } } } catch (Error) {var Error = {name:"YouTube Link not Found ", message:nodeCount}; console.log(Error.name + Error.message);} node.addEventListener('click', function (event) { var classCheck = document.getElementsByClassName('canvasArea'); //console.log(event.target.parentNode.parentNode.nextSibling.nextSibling.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.nextSibling.className); //console.log(event.target.closest("._1dwg._1w_m._q7o").childNodes[0].nextSibling.childNodes[0].nextSibling.className); //alert(event.target.previousSibling.innerText); if (classCheck.length == 0) { console.log('LENGTH IS 0 [Line 231]'); //node.parentNode.appendChild(eTxT1); getSelection().removeAllRanges(); var status_content1 = event.target.closest('._1dwg._1w_m._q7o'); var sName = event.target.closest('._6a._5u5j._6b').children[0].children[0].children[0].children[0]; var sNr = sName.innerHTML; event.target.closest('._6a._5u5j._6b').children[0].children[0].children[0].children[0].innerHTML = '</span class="status_uname">'+sNr+'</span><br>'; var sTime = event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[0]; var sTr = sTime.innerHTML; event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[0].innerHTML = '<span class="status_time">'+sTr+'</span>'; var sURL = event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[2]; var sURLr = sURL.innerHTML; event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[2].innerHTML = '<br style="display:block;"><br><span class="_hrefURL">'+event.target.closest('._6a._5u5j._6b').children[1].children[0].children[0].children[0].children[2].innerHTML+'</span>'; var sContent = event.target.closest('.n_1zif-ycce._5eit.h_1zif-v9xd.clearfix').nextSibling; var sCont = sContent.innerHTML; event.target.closest('.n_1zif-ycce._5eit.h_1zif-v9xd.clearfix').nextSibling.innerHTML = '<span class="status_text">'+sCont+'</span>'; var shared_sName = event.target.closest('.n_1zif-ycce._5eit.h_1zif-v9xd.clearfix').nextSibling.nextSibling.children[0].nextSibling.children[0].children[0].children[1].children[0]; //var status_content2 = event.target.closest('._1dwg._1w_m._q7o').children[1].children[1]; var range0 = document.createRange(); var range1 = document.createRange(); var range2 = document.createRange(); var range3 = document.createRange(); var range4 = document.createRange(); var range5 = document.createRange(); range0.selectNodeContents(sName); range1.selectNodeContents(sTime); range2.selectNodeContents(sURL); range3.selectNodeContents(sContent);//range3.collapse(true); range4.selectNodeContents(sContent.nextSibling); range4.setStartAfter(sContent); range4.setEndBefore(sContent.nextSibling); range5.selectNodeContents(shared_sName); //range4.collapse(true); window.getSelection().addRange(range0); window.getSelection().addRange(range1); window.getSelection().addRange(range2); window.getSelection().addRange(range3); window.getSelection().addRange(range4); window.getSelection().addRange(range5); var r_ins_before = document.createElement("span"); r_ins_before.classList.add("range_ins_Before"); var r_ins_before_text = document.createTextNode("BEFORE"); r_ins_before.appendChild(r_ins_before_text); var r_ins_after = document.createElement("span"); r_ins_after.classList.add("range_ins_After"); var r_ins_after_text = document.createTextNode("AFTER"); r_ins_after.appendChild(r_ins_after_text); //node.parentNode.appendChild(eTxT1); let ranges = []; var selection = window.getSelection(); for(let i = 0; i < selection.rangeCount; i++) { ranges[i] = selection.getRangeAt(i); } selection.getRangeAt(0).insertNode(r_ins_before); selection.getRangeAt(4).insertNode(r_ins_after); console.log(ranges); console.log(range4.endOffset) //alert(window.getSelection() + ' (Workings)'); ////////var rCon = event.target.closest('._1dwg._1w_m._q7o').textContent = range1.toString() + '<br />' + range2.toString() + '<br />' + range3.toString() + '<br />' + range4.toString(); //var ts = range1.toString().replace('·',''); //window.getSelection().addRange(range2); //alert(status_content1 + ' (Working)'); /**********/event.target.closest('._1dwg._1w_m._q7o').insertAdjacentHTML('afterend','<textarea style="max-width: 100%;resize: none;border: none;font-size: 10px !important;line-height: 10px;background-color: #000;color: #262 !important;height: 100px">sdasds</textarea>'); } try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; //console.log('Copying text command was ' + msg); } catch (err) { console.log('Oops, unable to copy'); } return false; }) }) }); setMutationHandler({ target: document.querySelector('.fbPhotosPhotoCaption'), selector: '.hasCaption', handler: nodes => nodes.forEach(node => { node.style.color = '#f00'; var PhotoCaption = document.getElementsByClassName('hasCaption')[0]; console.log('Current Image: ' + PhotoCaption.innerText); if (!document.getElementsByClassName('fbPhotosPhotoCaption')[0].innerHTML.includes('copybtn"')) { PhotoCaption.insertAdjacentHTML('afterend', '<input type="button" class="copybtn" name="copy" value="Copy"/>'); } var copyTextareaBtn = document.querySelector('.copybtn'); copyTextareaBtn.addEventListener('click', function (event) { var copy_text = document.getElementsByClassName("hasCaption")[0]; var range = document.createRange(); range.selectNode(copy_text); window.getSelection().addRange(range); try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; console.log('Copying text command was ' + msg); } catch (err) { console.log('Oops, unable to copy'); } }); }) }); function pad(n, width, z) { z = z || '0'; n = n + ''; return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } function expandDates(e) { for (var t, a = 0; t = e[a++];) { t.querySelector(".full-timestamp") || t.insertAdjacentHTML("beforeend", '<span class="full-timestamp"> on ' + moment(new Date(1e3 * t.dataset.utime)).format("l \\at LTS") + '</span>'); if(t.children[0].innerText.match(/[A-Z]\D+\s\d{1,2}\s\D{2}\s\d{1,2}\:\d{2}\s(A|P)M/)) {t.removeChild(t.children[0])} }; } function RecentTimestamps(e) { for (var t, n = 0; t = e[n++];) if (!t.querySelector(".full-timestamp")) { if (1 == t.innerText.includes("min")) { var a = t.innerText.match(/[0-9]{1,2}/), s = parseInt(a, 10); t.insertAdjacentHTML("beforeend", '<span class="full-timestamp"> <span style="color:#365899">(' + moment(new Date).subtract(s, "minutes").format("h:mm:ss A") + ' ≃ <span style="color:#365899">ᴀᴘᴘʀᴏxɪᴍᴀᴛᴇ)</span><br>') } if (1 == t.innerText.includes("hr")) { var r = t.innerText.match(/[0-9]{1,2}/), m = parseInt(r, 10), o = 10 * parseInt(moment(new Date).format("mm") / 10, 10), l = 10 * parseInt(moment(new Date).format("ss") / 10, 10); t.insertAdjacentHTML("beforeend", '<span class="full-timestamp"> <span style="color:#365899">on ' + moment(new Date).subtract(m, "hours").format("l \\at h:") + pad(o, 2) + ":" + pad(l, 2) + '<span style="color:#365899"> ≃ (ᴀᴘᴘʀᴏxɪᴍᴀᴛᴇ)</span><br>') } } } function RecentPostURLs(e) { if (e.parentNode) { for (var a = 0; a < e.length; a++) { var r = e[a]; !1 === r.innerHTML.includes("<br>") && "_5r69" != r.className && (r.getElement, r.insertAdjacentHTML("afterend", '<br><span style="color:#9c9dc3">' + r.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.previousSibling.href.replace(/\?fref=nf/, "").replace("&__tn__=", "").replace("&__tn__=m-R", "").replace("7%2Cdm-R-R", "").replace("%2Cdm-R-R", "").replace(/&eid=.+/, "").replace(/xts/, "").match(/facebook.com\/[a-z|A-Z|[0-9|\-|_|.]+.[a-zA-Z|[0-9|\-|_|.|]+[a-zA-Z|[0-9|\-|_|.|?=]+/) + "</span>")) } } } function ExternalURLs(e) { for (var n = 0; n < e.length; n++) { var r = e[n], a = r.href.replace(/https:\/\/l\.facebook.com\/l.php\?u=/, ""); console.log('log '+e.length); if(r.parentNode.innerHTML.match(/external/) == null) { r.parentNode.insertAdjacentHTML("afterend", '<div class="externalURLs">' + decodeURIComponent(a.replace(/\+/g, " ")).replace(/.fbclid=[\D}\d]+/, "").slice(0, 256) + "</div>"); break; } else {break;} } } setMutationHandler({ target: document.querySelector('.f_1zif-zmj1'), selector: '.q_1zif-zjsq', handler: nodes => nodes.forEach(node => { if(node) { var event1 = new MouseEvent('mouseover'); node.dispatchEvent(event1); var _newsfeed__fulltimes = event1.target.title; console.log(_newsfeed__fulltimes); //if(!node.parentNode.innerHTML.includes(/timess/)) { alert('test'); //alert(node.parentNode.innerHTML); setTimeout( function() { if(!node.parentNode.innerHTML.includes('timess')) { node.insertAdjacentHTML("beforebegin", "<span class='timess' style='color:#f00;margin-left:0px;'>" + event1.target.title + '</span>'); node.parentNode.childNodes[0].parentNode.childNodes[1].setAttribute('style','margin-left:3px;color:#fff!important;background:#000;border-radius:0px;border-left:0px solid #bbb;padding-right:2px;padding-left:4px!important;z-index: 0;font-weight: 600;font-family: \'Segoe UI\';font-size:13px;'); } }, 1000) //alert(node.parentNode.innerHTML); //node.previousSibling.setAttribute('style','background:red!important;border-radius:6px!important;'); //var ago_formatter = node.parentNode.childNodes[1].parentNode.childNodes[1].innerText.match(/([0-9]{1,2}\D)/); //alert(node.parentNode.childNodes[0].parentNode.childNodes[1].innerHTML.length); //node.parentNode.innerText = ago_formatter; } }) }); setMutationHandler({ target: document.querySelector('._1dwg._1w_m._q7o'), selector: '._5ptz', handler: nodes => nodes.forEach(node => { if(!node.parentNode.innerHTML.includes("<br>")) { /* DISPLAYED URL SANITIZATION */ var hrefp = node.parentNode.href.replace(/(\?__xts__%\S+)/,"<span style='color:lime!important;display:none;'> $1 </span>").replace(/(\&__xts__\S+)/,"<span style='color:red!important;display:none;'> $1 </span>").replace(/(https:\/\/www.facebook.com\/#)/,"<span style='display:none!important;color:orange!important;display:none;'> $1</span>").replace(/(https:\/\/www.facebook.com\/)/,"<span style='color:indigo!important;display:none;'> $1</span>").replace(/(\/\?story_token=S%3A_)/,"<span style='color:#f0f!important;display:;'><br>Story Token: </span>").replace(/(\w+)(\%3A)(\w+)/,"<span style='color:#f0f!important;'>$1:$3</span>"); /* HREF LINK SANITIZATION */ node.parentNode.href = node.parentNode.href.replace(/(.__xts__.+)/,"#FBTools"); node.parentNode.setAttribute('style','background:red!important;border-radius:6px!important;'); node.insertAdjacentHTML("beforeend", "<br><span class='_hrefURL'>" + hrefp + '</span>'); } }) }); setMutationHandler({ target: document.querySelector('._5pcp._5lel._2jyu._232_'), selector: '._5pcq', handler: nodes => nodes.forEach(node => { if(!node.innerHTML.includes("<br>")) { if(!window.location.href.match(/Galactic/)){ /* DISPLAYED URL SANITIZATION */ var hrefp = node.href.replace(/(\?__xts__%\S+)/,"<span style='color:lime!important;display:none;'> $1 </span>").replace(/(\&__xts__\S+)/,"<span style='color:red!important;display:;'> $1 </span>").replace(/(https:\/\/www.facebook.com\/#)/,"<span style='display:none!important;color:orange!important;display:;'> $1</span>").replace(/(https:\/\/www.facebook.com)(\/\S+#)/,"<span style='color:#f64!important;display:none;'>aaaa</span>").replace(/(\/\?story_token=S%3A_)/,"<span style='color:#f0f!important;display:;'><br>Story Token: </span>").replace(/(\w+)(\%3A)(\w+)/,"<span style='color:#f0f!important;'>$1:$3</span>").replace(/\/\?type=3/,'<br>FB Post Tools 2020'); node.insertAdjacentHTML("beforeend", "<br><span class='_hrefURL'>" + hrefp + '</span>'); } /* HREF LINK SANITIZATION */ node.href = node.href.replace(/(.__xts__.+)/,"#FBTools"); node.setAttribute('style','border:0px solid #fff!important;border-radius:12px;line-height:14px!important;letter-spacing:-0.15px!important;'); //node.insertAdjacentHTML("beforeend", "<br><span class='_hrefURL'>" + hrefp + '</span>'); } }) });