Greasy Fork

Greasy Fork is available in English.

博客网站留言评论信息自动填充

博客网站留言评论自动填写个人信息方法

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name       博客网站留言评论信息自动填充
// @namespace    https://www.tjsky.net
// @version      1.0.3
// @description  博客网站留言评论自动填写个人信息方法
// @author      去年夏天
// @namespace   http://greasyfork.icu/zh-CN/users/39819
// @homepage    http://greasyfork.icu/zh-CN/scripts/552004
// @include     http://*/*
// @include     https://*/*
// @exclude    *://*/wp-admin/*
// @exclude    *://*/admin/*
// @exclude    *://*.aliyun.com/*
// @exclude    *://myssl.com*
// @exclude    *://*.alipay.com/*
// @exclude    *://*.taobao.com/*
// @exclude    *://*.alimama.com/*
// @exclude    *://*.tmall.com/*
// @exclude    *://*.qq.com/*
// @exclude    *://*.tencent.com/*
// @exclude    *://*.qcloud.com/*
// @exclude    *://*.tenpay.com/*
// @exclude    *://*.baidu.com/*
// @exclude    *://*.bing.com/*
// @exclude    *://*.iqiyi.com/*
// @exclude    *://*.jd.com/*
// @exclude    *://*.meituan.com/*
// @exclude    *://*.cloudflare.com/*
// @exclude    *://*.yundun.com/*
// @exclude    *://github.com/*
// @exclude    *://weibo.com/*
// @exclude    *://*.sina.com.cn/*
// @exclude    *://*.youku.com/*
// @exclude    *://*.bilibili.com/*
// @exclude    *://*.acfun.cn/*
// @exclude    *://douban.com/*
// @exclude    *://*.jd.com/*
// @exclude    *://*.huya.com/*
// @exclude    *://*.douyin.com/*
// @exclude    *://*.douyu.com/*
// @exclude    *://*.sohu.com/*
// @exclude    *://*.letv.com/*
// @exclude    *://*.toutiao.com/*
// @exclude    *://*.ixigua.com/*
// @exclude    *://*.kafan.cn/*
// @exclude    *://*.163.com/*
// @exclude    *://*.126.com/*
// @exclude    *://*.hupu.com/*
// @exclude    *://*.qidian.com/*
// @exclude    *://*.mi.com/*
// @exclude    *://*.360.cn/*
// @exclude    *://*.icbc.com.cn/*
// @exclude    *://*.ccb.com/*
// @exclude    *://*.abchina.com/*
// @exclude    *://*.cmbchina.com/*
// @exclude    *://*.boc.cn/*
// @exclude    *://*.bankcomm.com/*
// @exclude    *://*.psbc.com/*
// @exclude    *://*.pingan.com/*
// @exclude    *://*.citicbank.com/*
// @exclude    *://*.cib.com.cn/*
// @exclude    *://*.spdb.com.cn/*
// @exclude    *://*.cebbank.com/*
// @exclude    *://*.cmbc.com.cn/*
// @exclude    *://*.cgbchina.com.cn/*
// @exclude    *://*.unionpay.com/*
// @exclude    *://*.chinalife.com.cn/*
// @exclude    *://*.citi.com/*
// @exclude    *://*.hsbc.com/*
// @exclude    *://*.sc.com/*
// @exclude    *://*.google.com/*
// @exclude    *://*.google.hk/*
// @exclude    *://*.google.cn/*
// @exclude    *://*.apple.com/*
// @exclude    *://*.youtube.com/*
// @exclude    *://*.facebook.com/*
// @exclude    *://twitter.com/*
// @exclude    *://*.qianxin.com/*
// @exclude    *://*.mail-tester.com/*
// @exclude    *://*.openai.com/*
// @exclude    *://*.godaddy.com/*
// @exclude    *://*.lowendtalk.com/*
// @exclude    *://*.racknerd.com/*
// @exclude    *://*.colocrossing.com/*
// @exclude    *://*.namecheap.com/*
// @exclude    *://*.namesilo.com/*
// @exclude    *://*.expireddomains.net/*
// @exclude    *://*.mailu.io/*
// @exclude    *://*.amazon.cn/*
// @exclude    *://*.amazon.com/*
// @exclude    *://*.qiniu.com/*
// @run-at       document-end
// @grant        unsafeWindow
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license      MIT
// @icon   data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAXfSURBVFhHrVZtbFNVGG6YDMaHg8HWe2/DhzOaKBrAH0REohEjiSR+gQZj4k9/8A8NMYq6nxo3urW9Xdex0QkhsIWI+IOAG/symYKbbGy297Zbv7aVlX203UfXr9vHnNu1Xc/WDQZP8qa59573PM95znnfU4ViBZiejb4jSZJRkqQ+SZLuS5LUK0lS5VQ0foge+8TwZr37jVZ30OALx8wxSZrBIojFYjO+YPS/lsEgf+Ci63V6jpXh297D33f42lyzNN3SsM8AX7ePNytO9azQlY9bNuSesdXqzVF67kdCRW8YOWU2g+JYfR5NkRX5P94rzlXbe0wOerqVwTgArFIPdG7+qXM7zbUA2yvF4hy13X26M0LP81j46nYEOWf67Zy+dxvNmUKBxvr0xnKbZd8VH0JRiZ7jsTATjmFvgw8bNdYe1ji8juaWwWgtl/Kqx9Bg8dP5CzASkvC7NwLTUBg3RiMYDS8v+HyvD2urx8BWCCaaW6HUi0e2nPVij8mBUDRO52ZA7ZjFC+0BbGnyo6DRh9wbPpTZly+T6YiEXbV2bD17H5xWfDvNXoJVrEboW8sP4eStETovAz9Yg1h/04cdLX481xaQgwg5LQbpoYvixE0P8vTDUGqErhQ/w4vvqs55sabMgkvm7PZ3TERR2OTHs60J4mQkn6tcITSNRXA/lH076u75kFtmgap2BCpt/1uyAJYXGzjTKPLLBfw1nH0lJ81B2fL55CSebwuguNWPoiY/1iyzHa2uGWxUW8DVjYHViucV+eV3NzE60cMYnCjUiugdDdE5KXzYNQW2OW39YkEcOtG3aKeW0TUyi4IKEUyVC6zWOqBg9OLnrFaMKXkbtmhEdHuzqz9+dxrMraUFbG3y40tzdhfveILYVCGA4W1QasUZBasTG1i9DQxvxQa1gFvOaTonBWJt/h8+2XKamAR5v6nRh8ueMJ2awvWBKaw7YwHLW8kWxMgBtBIB5EVuqRn6fyfonBQ8IQkvtgfANfsXiCDPxP6Df09ieokyVt8Zw+pS85wAIa5Qaq2jLJ8QQJR9em2IzslA81hEPnCbG33Y3uLHM61+bGv2I7/Rh5f/DKBnMkanZOCjXwexPuWAEFeQg5AUQA6hirdiaHLpe0CYiskHbV/HJHa1B7C/YxKnhCCGZrOXH4HdF4ZSJ6JIK85zQGe9mtyC5DZ81/6Azl0U07G43JJDUnbL5+NUywhyS+dWT0Inxsgh/ILlBSkpgrhAwjKWvRxXgh7vLAo0Qnr1ehuUvBhUMBprIasVvFyVU/7A8VZ5jw5edCD4hG7EqbCEV887sIE0oLnVc1UuKHWCK9mKr6lMD8DyCXVkELHq2NVBhGMPZ282BCMS3rvixprSNDnhUZlGSRnWJwTorEdVdaPpvZkn4nC9C3b/0ocyG2wTYRy65JTnSZMngixYqRWPJG4jY+dqRmfp52qGUy4kReSVWbDTYAPfNSFb+TAIhGKo+Gcc2yoTpZ1JLoKr8YDVWsyKhoac1I3I6cTjql/GM1QmRRRoRHkVu88NyBVCuuXwVASzUQmxeFz+JaXb5JzGN21evFQ7II8nrZ1eOSn5hNu291PkSbA683VZhC7twvzYXCHIE29UC7Irr5js2H/Bgb0mO3YYbHIrJ9/JZUPnphZU4wGjES7S3DKUpd1FTKV9kNzV2USQYHSJciWCyMVCfskzeU+PzQh9P7hqd5Qr695Lc6dQqO3dzRjdE8uJeOSY6zOc0QXO4LIoy+/upLlT4Mr79nBGtyN9JlYqZK6sazzgqgfBGRyk/YL8+2KrHANFlWIxzZ1C4c+3Ga7K+ZuqbgyJ6ngUIWliud552wVy6Fi+f5I7O5wWwQv9NO8CsIaBz1ijs5fULQm5Y867OzJCb5O/J8Z6wRhd3ZzB/klqLq1wgDO6A/KCtBZwRjcy2bKhpOQpxug8yhpdDayh36nUW4PkIiG3WSp0Ykx+r+93MJXOy6zR8YGipGQVPRWnsbzGVLkGOYMjruSt4/8DXeOz38W5+7UAAAAASUVORK5CYII=
// ==/UserScript==

(function() {
    'use strict';

    // 默认配置值
    const DEFAULT_CONFIG = {
        authorName: '请输入你的昵称',
        authorEmail: '请输入你的邮箱',
        authorUrl: '请输入你的网站(可留空)',
        autoFillEnabled: true,
        hotkey: 'Ctrl+Shift+F'
    };

    // 初始化配置
    function initConfig() {
        if (typeof GM_getValue === 'undefined') return;

        if (GM_getValue('authorName') === undefined) {
            GM_setValue('authorName', DEFAULT_CONFIG.authorName);
        }
        if (GM_getValue('authorEmail') === undefined) {
            GM_setValue('authorEmail', DEFAULT_CONFIG.authorEmail);
        }
        if (GM_getValue('authorUrl') === undefined) {
            GM_setValue('authorUrl', DEFAULT_CONFIG.authorUrl);
        }
        if (GM_getValue('autoFillEnabled') === undefined) {
            GM_setValue('autoFillEnabled', DEFAULT_CONFIG.autoFillEnabled);
        }
        if (GM_getValue('hotkey') === undefined) {
            GM_setValue('hotkey', DEFAULT_CONFIG.hotkey);
        }
    }

    // 注册菜单
    function registerMenuCommands() {
        if (typeof GM_registerMenuCommand === 'undefined') return;

        GM_registerMenuCommand('设置昵称', () => {
            const currentName = GM_getValue('authorName', DEFAULT_CONFIG.authorName);
            const newName = prompt('请输入您的昵称:', currentName);
            if (newName !== null) {
                GM_setValue('authorName', newName);
                alert('昵称已更新!');
            }
        });

        GM_registerMenuCommand('设置邮箱', () => {
            const currentEmail = GM_getValue('authorEmail', DEFAULT_CONFIG.authorEmail);
            const newEmail = prompt('请输入您的邮箱:', currentEmail);
            if (newEmail !== null) {
                GM_setValue('authorEmail', newEmail);
                alert('邮箱已更新!');
            }
        });

        GM_registerMenuCommand('设置网址', () => {
            const currentUrl = GM_getValue('authorUrl', DEFAULT_CONFIG.authorUrl);
            const newUrl = prompt('请输入您的网址(可留空):', currentUrl);
            if (newUrl !== null) {
                GM_setValue('authorUrl', newUrl);
                alert('网址已更新!');
            }
        });

        GM_registerMenuCommand('切换自动填充状态', () => {
            const currentStatus = GM_getValue('autoFillEnabled', DEFAULT_CONFIG.autoFillEnabled);
            const newStatus = !currentStatus;
            GM_setValue('autoFillEnabled', newStatus);
            alert(`自动填充功能已${newStatus ? '开启' : '关闭'}!`);
        });

        GM_registerMenuCommand('设置填充快捷键', () => {
            const currentHotkey = GM_getValue('hotkey', DEFAULT_CONFIG.hotkey);
            const newHotkey = prompt('请输入新的快捷键组合(例如:Ctrl+Shift+F):', currentHotkey);
            if (newHotkey !== null && newHotkey.trim() !== '') {
                GM_setValue('hotkey', newHotkey);
                setupHotkeyListener();
                alert(`快捷键已更新为:${newHotkey}`);
            }
        });
    }

    // 快捷键监听
    function setupHotkeyListener() {
        if (window.dr_gm_hotkeyHandler) {
            document.removeEventListener('keydown', window.dr_gm_hotkeyHandler);
        }

        const hotkey = GM_getValue('hotkey', DEFAULT_CONFIG.hotkey);
        const keys = hotkey.split('+').map(k => k.trim().toLowerCase());

        window.dr_gm_hotkeyHandler = function(event) {
            const pressed = [];
            if (event.ctrlKey) pressed.push('ctrl');
            if (event.shiftKey) pressed.push('shift');
            if (event.altKey) pressed.push('alt');
            if (event.metaKey) pressed.push('meta');

            if (event.key.length === 1) {
                pressed.push(event.key.toLowerCase());
            } else if (event.key.startsWith('F') && event.key.length > 1) {
                pressed.push(event.key.toLowerCase());
            }

            // 检查是否匹配快捷键
            const match = keys.length === pressed.length &&
                          keys.every(k => pressed.includes(k));

            if (match) {
                event.preventDefault();
                manualFill();
            }
        };

        document.addEventListener('keydown', window.dr_gm_hotkeyHandler);
    }

    // 手动触发填充
    function manualFill() {
        const result = dr_js_autofill_commentinfos();
        if (!result) {
            alert('未找到可填充的评论表单!');
        }
    }

    // 填充三要素
    function dr_js_autofill_commentinfos() {
        const authorName = GM_getValue('authorName', DEFAULT_CONFIG.authorName);
        const authorEmail = GM_getValue('authorEmail', DEFAULT_CONFIG.authorEmail);
        const authorUrl = GM_getValue('authorUrl', DEFAULT_CONFIG.authorUrl);

        var lauthor = ["input#author","input[name='comname']","input#inpName","input[name='author']","input#ds-dialog-name","input#name","input[name='name']","input[name='nick']","input#comment_author", ".comment-form input[placeholder='昵称(必填)']","input.atk-name","input#nick"],
        lmail =["input#mail","input#email","input[name='commail']","input#inpEmail","input[name='email']","input#ds-dialog-email","input[name='mail']","input#comment_email", ".comment-form input[type='email']","input.atk-email"],
        lurl =["input#url","input[name='comurl']","input#inpHomePage","input#ds-dialog-url","input[name='url']","input[name='website']","input#website","input[name='link']","input#comment_url", ".comment-form input[type='url']","input.atk-link"];

        let filled = false;

        for (var i = 0; i < lauthor.length; i++) {
            var author = document.querySelector(lauthor[i]);
            if (author != null) {
                author.value = authorName;
                author.dispatchEvent(new Event('input'));
                author.dispatchEvent(new Event('change'));
                filled = true;
                break;
            }
        }
        for (var j = 0; j < lmail.length; j++) {
            var mail = document.querySelector(lmail[j]);
            if (mail != null) {
                mail.value = authorEmail;
                mail.dispatchEvent(new Event('input'));
                mail.dispatchEvent(new Event('change'));
                filled = true;
                break;
            }
        }
        for (var k = 0; k < lurl.length; k++) {
            var url = document.querySelector(lurl[k]);
            if (url != null) {
                url.value = authorUrl;
                url.dispatchEvent(new Event('input'));
                url.dispatchEvent(new Event('change'));
                filled = true;
                break;
            }
        }

        return filled;
    }

    // init
    function dr_init(){
        var filled = false;

        var obj = dr_get_type();
        const dr_gm_debug = false;

        if ( dr_gm_debug ) {
            console.log( 'GM脚本填充评论信息:', obj );
        }

        if( obj && obj.fill ){
            filled = dr_js_autofill_commentinfos();
        }
        console.log( 'GM脚本填充评论信息'+( filled?'成功':'失败' )+':', obj ? obj.type : '未知类型' );
    }

    // 判断评论程序类型函数
    function dr_get_type(){
        if( dr_is_wordpress() ){
            return { type: 'WordPress', fill: true };
        }else if( dr_is_typecho() ){
            return { type: 'Typecho', fill: true };
        }else if( dr_is_zblog() ){
            return { type: 'ZBlog', fill: true };
        }else if( dr_is_emlog() ){
            return { type: 'Emlog', fill: true };
        }else if( dr_is_twikoojs() ){
            return { type: 'TwikooJS', fill: true };
        }else if( dr_is_artalkjs() ){
            return { type: 'ArtalkJS', fill: true };
        }else if( dr_is_valinejs() ){
            return { type: 'ValineJS', fill: true };
        }else if( dr_is_walinejs() ){
            return { type: 'WalineJS', fill: true };
        }else{
            return { type: '未知', fill: false };
        }
    }

    // 检测评论程序函数
    function dr_is_wordpress(){
        return document.querySelector('#commentform') !== null ||
               document.querySelector('#wp-comment-list') !== null ||
               document.querySelector('input#comment_post_ID') !== null;
    }
    function dr_is_typecho(){
        return document.querySelector('form#comment-form') !== null ||
               document.querySelector('input[name=_]') !== null;
    }
    function dr_is_zblog() {
        return document.querySelector('form#frmSumbit') !== null ||
               document.querySelector('div.commentpost') !== null;
    }
    function dr_is_emlog() {
        return document.querySelector('form#commentform') !== null ||
               document.querySelector('input#comment') !== null;
    }
    function dr_is_twikoojs() {
        return document.querySelector('div.twikoo') !== null ||
               document.querySelector('div#twikoo') !== null;
    }
    function dr_is_artalkjs() {
        return document.querySelector('div#Artalk') !== null ||
               document.querySelector('div.artalk') !== null;
    }
    function dr_is_valinejs() {
        return document.querySelector('div#valine') !== null ||
               document.querySelector('div.v[data-class=v]') !== null;
    }
    function dr_is_walinejs() {
        return document.querySelector('div#waline') !== null ||
               document.querySelector('div.wl-comment') !== null;
    }

    // 初始化
    function init() {
        initConfig();
        registerMenuCommands();
        setupHotkeyListener();

        // 仅在自动填充开启时执行自动填充
        const autoFillEnabled = GM_getValue('autoFillEnabled', DEFAULT_CONFIG.autoFillEnabled);
        if (autoFillEnabled) {
            // 缺失必填项不执行脚本
            const authorName = GM_getValue('authorName', DEFAULT_CONFIG.authorName);
            const authorEmail = GM_getValue('authorEmail', DEFAULT_CONFIG.authorEmail);

            if (authorName === '' || authorEmail === '') {
                console.log('评论信息不完整,自动填充未执行');
                return;
            }

            if (window.top !== window.self) { return; }

            setTimeout(dr_init, 1500);
        }
    }

    init();
})();