Avant de procéder à l'installation, Greasy Forkattention ce script contient des contre-fonctionnalités, qui sont là pour le bénéfice de l'auteur du script, plutôt que pour le vôtre.
Ce script contient du code qui suivra votre navigation.
Greasy Fork is available in English.
như tên
// ==UserScript== // @name Hiện Join date // @namespace idmresettrial // @version 2021.05.18.03 // @description như tên // @author You // @match https://voz.vn/t/* // @grant GM_setValue // @grant GM_getValue // @run-at document-start // @antifeature tracking // ==/UserScript== document.addEventListener('DOMContentLoaded', function () { 'use strict'; const warningDate = new Date(new Date() - 3 * 30 * 86400 * 1000); let cachedIds = GM_getValue("cachedIds", {}); let dataVersion = 1; if (GM_getValue("dataVersion", 0) < dataVersion) { cachedIds = {}; GM_setValue("dataVersion", dataVersion); } function gnsJd(id) { if (Object.keys(cachedIds).includes(id)) { showJd(id); return; } let token = document.getElementsByName("_xfToken")[0].value; let queryUrl = "https://voz.vn/u/{username}.{id}/?tooltip=true&_xfRequestUri={requestUri}&_xfWithData=1&_xfToken={token}&_xfResponseType=json"; let username = document.querySelector(".message-userDetails a.username[data-user-id='" + id + "']").innerText; queryUrl = queryUrl .replace("{username}", encodeURIComponent(username)) .replace("{id}", id) .replace("{requestUri}", document.location.pathname) .replace("{token}", token); let httpRequest = new XMLHttpRequest(); httpRequest.onreadystatechange = function() { if (httpRequest.readyState === XMLHttpRequest.DONE && httpRequest.status === 200) { let joindate = JSON.parse(httpRequest.responseText).html.content.match(/data-time=\"(.*?)\"/); if (joindate && !isNaN(Number(joindate[1]))) { cachedIds[id] = Number(joindate[1]); showJd(id); } } } httpRequest.open("GET", queryUrl); httpRequest.send(); } let done = []; function showJd(id) { if (done.includes(id)) { return; } let els = document.querySelectorAll(".message-userDetails a.username[data-user-id='" + id + "']"); els.forEach(el => { let jd = new Date(cachedIds[id]*1000) jd = jd.toLocaleDateString("vi-VN") + (jd < warningDate ? "" : " *"); let jdEl = ('<h5 class="message-userTitle joindate" dir="auto" itemprop="joindate">Joined: {jd}</h5>{br}') .replace("{jd}", jd); let parent = el.parentElement.parentElement; let userBanners = parent.querySelectorAll(".userBanner"); jdEl = jdEl.replace("{br}", (userBanners.length >= 2)? "<br/>" : ""); parent.querySelector("[itemProp=jobTitle]").insertAdjacentHTML('afterend', jdEl); }); done.push(id); } window.addEventListener("beforeunload", function() { GM_setValue("cachedIds", cachedIds); }); function inoHandler(entries, observer) { entries.forEach(entry => { let id = entry.target.getAttribute("data-user-id"); if (Object.keys(cachedIds).includes(id)) { observer.unobserve(entry.target); } gnsJd(id); }); } let observer = new IntersectionObserver(inoHandler); let els = document.querySelectorAll(".message-userDetails a.username"); els.forEach(el => observer.observe(el)); let style = document.createElement('style'); style.innerHTML = '@media (max-width: 751px) { .message-userTitle.joindate:before {content: ". "} }' + '@media (min-width: 752px) { .message-userTitle.joindate + br {display: none;} }'; document.head.appendChild(style); });