顯示Greasyfork用戶註冊時間,識別惡意評論

registro

目前為 2025-06-02 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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)
})()