显示Greasyfork用户注册时间,识别恶意评论

如果你的脚本

当前为 2025-06-02 提交的版本,查看 最新版本

// ==UserScript==
// @name              Display GreasyFork user registration time
// @name:ar           Greasyfork عرض وقت تسجيل المستخدم
// @name:bg           GreasyforkПоказване на времето за регистрация
// @name:cs           Greasyfork Zobrazit dobu registrace
// @name:da           Greasyfork Vis registreringstid
// @name:de           Greasyfork Zeigen Sie Registrierungszeit
// @name:el           Greasyfork Εμφάνιση χρόνου εγγραφής
// @name:en           Greasyfork Display registration time
// @name:eo           Greasyfork Montru registran tempon
// @name:es           Greasyfork Muestra tiempo de registro
// @name:fi           Greasyfork Näytä rekisteröintiaika
// @name:fr           Greasyfork Afficher temps d’inscription
// @name:fr-CA        Greasyfork Afficher temps d’inscription
// @name:he           Greasyfork הצג זמן הרשמה
// @name:hr           Greasyfork Prikažite vrijeme registracije
// @name:hu           Greasyfork Jelenítse meg regisztrációs időt
// @name:id           Greasyfork Tampilkan waktu pendaftaran
// @name:it           Greasyfork Visualizza tempo di registrazione
// @name:ja           Greasyfork 登録時間を表示
// @name:ka           Greasyforkაჩვენეთ რეგისტრაციის დრო
// @name:ko           Greasyfork등록 시간을 표시
// @name:nb           Greasyfork Vis registreringstid
// @name:nl           Greasyfork Geef registratietijd weer
// @name:pl           Greasyfork Wyświetl czas rejestracji
// @name:pt-BR        Greasyfork Exibir tempo de registro
// @name:ro           Greasyfork Afișați timpul de înregistrare
// @name:ru           Greasyfork Показать время регистрации
// @name:sk           Greasyfork Zobraziť čas registrácie
// @name:sr           Greasyfork Прикажите време регистрације
// @name:sv           Greasyfork Visa registreringstid
// @name:th           Greasyfork แสดงเวลาลงทะเบียน
// @name:tr           Greasyfork Görüntüle kayıt süresi
// @name:ug           Greasyfork تىزىملىتىش ۋاقتىنى كۆرستۈڭ
// @name:uk           Greasyfork Відобразити час реєстрації
// @name:vi           Greasyfork Hiển thị thời gian đăng ký
// @name:zh           显示Greasyfork用户注册时间,识别恶意评论
// @name:zh-CN        显示Greasyfork用户注册时间,识别恶意评论
// @name:zh-HK        顯示Greasyfork用戶註冊時間,識別惡意評論
// @name:zh-SG        显示Greasyfork用户注册时间,识别恶意评论
// @name:zh-TW        顯示Greasyfork用戶註冊時間,識別惡意評論
// @description       If your script interfere
// @description:ar    إذا كان اب تلقي مراجأن الحساب عادة ما يكون أن يكون المستخدم حسابًا ضارًا مسجلاً.
// @description:bg    Ако вашият сценарий пречи на интеотрицатееристики на злонамеренитент.
// @description:cs    Pokud váš skript narušuje zájmy některých lidí, není divu, že obdrží škodlivé negativní recenze. t.
// @description:da    Hvis dit script forstyrrer nogle menneskers interesser, er det ikke streret.
// @description:de    Wenn Ihr Skript die Interessen einiger Menschen beeinträch
// @description:el    Εάν το σενάριό σας παρεμβαίνει στα συμφέροντα ορισι δίπλα στο όνομα χρ έχει καταχωρηθεί.
// @description:en    Ifbe a malicious account registered.
// @description:eo    Se via skr negativajn recenzporita.
// @description:es    Si suiiosn registrada,de usuario. Si el tiempo que se muestra junto al no
// @description:fi    Jos käsiää  ja näkyy käyttäjänimen vieressä. Jos käyttäjänimen vieressä näkyv
// @description:fr    Si votre scs rebtient le temps d’enregistrement
// @description:fr-CA Si votre script interfère avec lesps aprèe temps d’enregis
// @description:he    אם התסריט שלך מפריע
// @description:nb    dada
// @description:hr    Ako vaša skripta ometa interese nekih registrirani, a drugi je da će se negativni pregledi dati
// @description:hu    Ha a szkript zavarja néhány ember érdeke: az egyik az, gisz
// @description:id    Jika skrip Anda mengganggu minat beberapa oradalah bahwa akun biasanya baru terdafta
// @description:it    Se la tua sceneggiatura interferisce con censioni negative dannose. Esistono due caratteristiche di recensioni negative d
// @description:ja    スクリプトが一部の人々の利益を妨げている場合、悪意否定的なレビューには2つの特徴があります。1つは通常、
// @description:ka    თუ თქვენი სკრიპტი ერევა ზოგიერთი ადამიანის ინტერესებში, გასაკვირი არ არის, რომ მიიღოთ
// @description:ko    스크립트가 일부 사람들의 관심사를 방해한다면 악의적 인 부정적인 리뷰
// @description:nl    Als uw script de belangen van sommige mensen belemmert, is het niet
// @description:pl    Jeśli twój skrypt zakłóca interesy niektórych osób, nie jest zaskakujące, że ot
// @description:pt-BR Se o seu script interferir nos interesses de alguma
// @description:ro    Dacă scriptul dvs. interfereaz
// @description:ru    Если ваш сценарий мешает интересам некоторых людей, неудивительно получать вредоносные негативные отзывы. Есть две характ
// @description:sk    Ak váš scenár narúša záujmy niektorých ľudí, nie je prekvapujúce, že dostávajú škodlivé negatívne recen
// @description:sr    Ако ваша сценариј омета интересе неких људи, то није изненађујуће примање
// @description:sv    Om ditt skript stör vissa människors intressen är det inte förvånande
// @description:th    หากสคริปต์
// @description:tr    Komut dosyanız bazı insanların çıkarlarına müdahale ederse
// @description:ug    ئەگەر سىزنىڭ قوليازما بەزى كىشىلەرنىڭ مەنپەئەتىگە دەخلى-تەرۇز قىلغان بولسا, يامان غەرڭىدىن كېيىن, تىزىم
// @description:uk    Якщо ваш сценарій з
// @description:vi    Nếu kịch bản của bạn can thiệp vào l
// @description:zh    如果你的脚本
// @description:zh-CN 如果你的脚本
// @description:zh-HK 如果你的腳本
// @description:zh-SG 如果
// @description:zh-TW registro
// @grant             GM_setValue
// @grant             GM_getValue
// @grant             GM_xmlhttpRequest
// @match             *://greasyfork.org/*
// @require           https://code.jquery.com/jquery-3.7.1.min.js
// @author            yysk.org,人民的勤务员 <[email protected]>
// @namespace         https://github.com/ChinaGodMan/UserScripts
// @supportURL        https://github.com/ChinaGodMan/UserScripts/issues
// @homepageURL       https://github.com/ChinaGodMan/UserScripts
// @license           MIT
// @icon              https://raw.githubusercontent.com/ChinaGodMan/UserScriptsHistory/main/scriptsIcon/greasyfork-webhook-sync-enhanced.svg
// @compatible        chrome
// @compatible        firefox
// @compatible        edge
// @compatible        opera
// @compatible        safari
// @compatible        kiwi
// @version           2025.6.2.1
// @created           2025-03-10 09:59:11
// @modified          2025-03-10 09:59:11
// ==/UserScript==
/**
 * File: greasyfork-user-registration-time.user.js
 * Project: UserScripts
 * File Created: 2025/03/10,Monday 09:59:36
 * Author: 人民的勤务员@ChinaGodMan ([email protected])
 * -----
 * Last Modified: 2025/06/02,Monday 09:39:23
 * Modified By: 人民的勤务员@ChinaGodMan ([email protected])
 * -----
 * License: MIT License
 * Copyright © 2024 - 2025 ChinaGodMan,Inc
 */

(function () {
    'use strict'
    const interval = 3000
    const absoluteTime = 'relative-time1'//随便修改个类名,显示精确时间.比如relative-time1
    var lang = document.querySelector('html').lang.toLowerCase() || navigator.language.toLowerCase()
    if (!['en', 'zh-cn', 'zh-tw', 'ja', 'ru', 'kr', 'fr', 'fr-CA'].includes(lang)) lang = 'en'
    const i18n = {
        en: {
            title: 'Registration time',
            prefix: 'R'
        },
        'zh-cn': {
            title: '注册时间',
            prefix: '注'
        },
        'zh-tw': {
            title: '註冊時間',
            prefix: '注'
        },
        ja: {
            title: '登録時間',
            prefix: 'R'
        },
        ru: {
            title: 'время регистрации',
            prefix: 'R'
        },
        kr: {
            title: '등록 시간',
            prefix: 'R'
        },
        fr: {
            title: 'Heure d\'inscription',
            prefix: 'R'
        },
        'fr-CA': {
            title: 'Heure d\'inscription',
            prefix: 'Heure d\'inscription'
        }
    }
    const title = i18n[lang].title
    const prefix = i18n[lang].prefix

    function pad(s, d) {
        s = `000000${s}`
        return s.substring(s.length - d)
    }

    const formatUFn = (dt) => {
        return `${dt.getFullYear()}.${pad(dt.getMonth() + 1, 2)}.${pad(dt.getDate(), 2)} ${pad(dt.getHours(), 2)}:${pad(dt.getMinutes(), 2)}:${pad(dt.getSeconds(), 2)}`
    }

    const formatFrFn = (dt) => {
        return `${pad(dt.getDate(), 2)}.${pad(dt.getMonth() + 1, 2)}.${dt.getFullYear()} ${pad(dt.getHours(), 2)}:${pad(dt.getMinutes(), 2)}:${pad(dt.getSeconds(), 2)}`
    }

    function formatTime(utcTime, lang = 'en') {
        const dt = new Date(utcTime)

        let formatFn = (lang === 'fr' || lang.startsWith('fr-')) ? formatFrFn : formatUFn

        return formatFn(dt)
    }

    async function genregtime(uid) {
        if (GM_getValue(uid) !== undefined && GM_getValue(uid) !== null) {
            return GM_getValue(uid)
        }
        const user_api = `https://api.greasyfork.org/users/${uid}.json`
        var created_at
        try {
            const response = await fetch(user_api)
            const data = await response.json()
            created_at = data.created_at
            console.log('🔍 ~ created_at:', created_at)
        } catch (error) {
            console.error('请求失败:', error)
        }
        GM_setValue(uid, created_at)
        return created_at
    }
    function gensnippet(regtime, uid) {
        return `<span class="regtime" style="margin-left: 10px; font-weight: bold; color: red;" title="uid ${uid} ${title}">${prefix} <${absoluteTime} datetime="${regtime}+00:00" prefix="">${regtime}</${absoluteTime}></span>`
    }
    let isProcessing = false
    function run() {
        if (isProcessing) return
        isProcessing = true
        var maxuid = 0
        const uids = document.documentElement.innerHTML.matchAll(/\/users\/(\d+)/g)
        for (const uid of uids) {
            if (parseInt(uid[1]) > maxuid) maxuid = parseInt(uid[1])
        }
        if (window.location.href.match(/(greasyfork|sleazyfork).org\/\w+-\w+\/users\/\d+(-[^/]*)?$/) && jQuery('section#about-user > span.regtime').length === 0) {
            let uid = jQuery('section#about-user > a.report-link').attr('href').match(/item_id=(\d+)/)[1]
            genregtime(uid).then(regtime => {
                regtime = formatTime(regtime, lang)
                jQuery('section#about-user > h2').after(gensnippet(regtime, uid))
            })

        }
        jQuery('a.user-link, dd.script-list-author > span > a, dd.script-show-author > span > a, table.log-table > tbody > tr > td > a, i:contains(\'Deleted user \')').each(function (i, el) {
            var lastele = jQuery(el).parent().children().last()
            if (lastele.attr('class') === 'regtime' || lastele.attr('class') === 'small-btn') return
            var button = jQuery('<button>').text(i18n[lang].prefix).addClass('small-btn')
            var m = (el.tagName === 'A') ? jQuery(el).attr('href').match(/\/users\/(\d+)/) : jQuery(el).text().match(/Deleted user (\d+)/)
            if (!m) return

            button.on('click', function () {
                isProcessing = true
                genregtime(m[1]).then(regtime => {
                    regtime = formatTime(regtime, lang)
                    lastele.after(gensnippet(regtime, m[1]))
                })
                button.remove()
            })

            // 如果存在时间就直接插入,不存在显示按钮
            if (GM_getValue(m[1]) !== undefined && GM_getValue(m[1]) !== null) {
                lastele.after(gensnippet(formatTime(GM_getValue(m[1]), lang), m[1]))
            } else {
                lastele.after(button)
            }

        })
        isProcessing = false

        return run
    }
    setInterval(run(), interval)
})()