跳至主要內容

掘金自动签到

黄曦原创大约 8 分钟掘金自动签到

🚀 掘金自动签到完全指南

本指南将带你完成从 油猴脚本Windows 定时任务 的全自动签到系统搭建,让你每天无需手动操作,系统自动模拟真人行为完成掘金签到。


📌 目录


🎯 项目概述

组件作用技术
油猴脚本在掘金签到页面自动点击签到按钮,模拟人类操作JavaScript, Tampermonkey API
Windows 定时任务每天指定时间自动打开浏览器访问签到页Windows 任务计划程序

整套方案每天定时运行,无需人工干预,且脚本内置人机模拟、状态检测等逻辑,确保稳定、安全。


🖥️ 油猴脚本(核心)

脚本代码

// ==UserScript==
// @name         掘金签到按钮自动点击(人机模拟版 增强)
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  兼容已签到和未签到两种状态,模拟真人点击,避免超时
// @author       You
// @match        https://juejin.cn/user/center/signin?from=sign_in_menu_bar
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    // ---------- 工具函数:随机延迟 ----------
    function randomDelay(min = 1000, max = 5000) {
        return new Promise(resolve => {
            const delay = Math.floor(Math.random() * (max - min + 1)) + min;
            setTimeout(resolve, delay);
        });
    }

    // ---------- 等待元素出现(MutationObserver + 超时) ----------
    function waitForElement(selector, timeout = 30000) {
        return new Promise((resolve, reject) => {
            // 如果元素已存在,直接返回
            const existing = document.querySelector(selector);
            if (existing) {
                resolve(existing);
                return;
            }

            let timer;
            const observer = new MutationObserver(() => {
                const el = document.querySelector(selector);
                if (el) {
                    clearTimeout(timer);
                    observer.disconnect();
                    resolve(el);
                }
            });

            observer.observe(document.body, {
                childList: true,
                subtree: true,
                attributes: false,
            });

            timer = setTimeout(() => {
                observer.disconnect();
                reject(new Error('等待超时'));
            }, timeout);
        });
    }

    // ---------- 模拟真实鼠标点击 ----------
    function simulateHumanClick(element) {
        if (!element) return;

        // 平滑滚动到按钮中央
        element.scrollIntoView({ behavior: 'smooth', block: 'center' });

        const rect = element.getBoundingClientRect();
        // 点击坐标在按钮范围内随机偏移 ±5px
        const x = rect.left + rect.width / 2 + (Math.random() - 0.5) * 10;
        const y = rect.top + rect.height / 2 + (Math.random() - 0.5) * 10;

        // 触发完整的鼠标事件序列
        const events = ['mouseover', 'mousedown', 'mouseup', 'click'];
        events.forEach(type => {
            const event = new MouseEvent(type, {
                view: window,
                bubbles: true,
                cancelable: true,
                clientX: x,
                clientY: y,
                screenX: window.screenX + x,
                screenY: window.screenY + y,
                button: 0,
                buttons: type === 'mousedown' ? 1 : 0
            });
            element.dispatchEvent(event);
            // 在 mousedown 和 mouseup 之间模拟人类反应延迟(10~30ms)
            if (type === 'mousedown') {
                const wait = Math.random() * 20 + 10;
                const start = Date.now();
                while (Date.now() - start < wait) {}
            }
        });
        console.log('🖱️ 模拟点击完成');
    }

    // ---------- 主流程 ----------
    async function main() {
        try {
            // 确保页面完全加载
            if (document.readyState !== 'complete') {
                await new Promise(resolve => window.addEventListener('load', resolve));
            }

            // 优先检查是否已经签到(避免无谓等待)
            const signedBtn = document.querySelector('.signedin.btn');
            if (signedBtn) {
                console.log('✅ 今日已签到,无需操作');
                return;
            }

            // 等待未签到按钮出现(最长 30 秒)
            const btn = await waitForElement('.signin.btn', 30000);
            console.log('🔍 找到签到按钮');

            // 再次校验文本(安全防护)
            if (btn.textContent.trim().includes('已签到')) {
                console.log('✅ 今日已签到,无需操作');
                return;
            }

            // 随机等待 1~5 秒,模拟人类阅读行为
            await randomDelay(1000, 5000);

            // 执行真人化点击
            simulateHumanClick(btn);
            console.log('✅ 签到操作已执行');

        } catch (err) {
            console.warn('⚠️ 签到失败:', err.message);
        }
    }

    // 启动脚本
    main();
})();

详细解读

1️⃣ 核心设计思路

  • 状态感知:脚本首先检查是否存在 signedin 类(表示已签到),若存在则直接退出,避免无效等待。
  • 动态等待:使用 MutationObserver 监听 DOM 变化,一旦签到按钮(signin 类)出现立即响应,比轮询更高效、更及时。
  • 人机模拟:点击前随机延迟、平滑滚动、坐标微调、完整事件链,降低被识别为机器人的风险。

2️⃣ 关键函数说明

函数作用
randomDelay(min, max)返回一个在指定范围内的随机延迟 Promise,用于模拟人类思考时间。
waitForElement(selector, timeout)使用 MutationObserver 监听元素出现,若超时则 reject。
simulateHumanClick(element)模拟真实鼠标点击:滚动、计算随机坐标、依次触发 mouseovermousedownmouseupclick,并在 mousedown 后加入微小阻塞延迟。
main()异步主流程,按顺序执行状态检测、元素等待、随机延迟、点击操作。

3️⃣ 兼容性处理

  • 已签到状态:直接匹配 .signedin.btn,立即返回。
  • 未签到状态:匹配 .signin.btn,执行点击。
  • 双重校验:即使通过类名匹配,仍检查按钮文本是否包含“已签到”,确保万无一失。

4️⃣ 安全性说明

  • 使用 @grant none,不申请额外权限,仅操作当前页面 DOM。
  • 所有事件均通过标准 MouseEvent 构造,不篡改网页原生逻辑。
  • 添加随机延迟和坐标偏移,模拟人类操作特征,减少账号风险。

⏰ Windows 定时任务

创建任务

管理员命令提示符 中执行以下命令,创建一个名为“掘金自动签到助手”的每日定时任务。

schtasks /create /tn "掘金自动签到助手" /tr "\"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe\" https://juejin.cn/user/center/signin?from=sign_in_menu_bar" /sc daily /st 07:49:30 /ru "HX\18421"
参数说明
/tn任务名称(中文,带引号)
/tr要执行的命令:Edge 浏览器路径 + 签到页 URL(路径含空格需用 \" 包裹)
/sc daily每天触发一次
/st 07:49:30开始时间(24小时制,可自行修改)
/ru运行任务的用户账户(通过 whoami 可查看当前用户名)

⚠️ 如果 Edge 安装路径不同,请修改为你的实际路径(常见为 C:\Program Files\Microsoft\Edge\Application\msedge.exe)。

管理任务

操作命令
查看任务详情schtasks /query /tn "掘金自动签到助手" /fo LIST /v
修改开始时间(如改为 08:00)schtasks /change /tn "掘金自动签到助手" /st 08:00
手动运行一次schtasks /run /tn "掘金自动签到助手"
删除任务schtasks /delete /tn "掘金自动签到助手" /f

图形界面操作(可选)

  1. 按下 Win + R,输入 taskschd.msc 打开“任务计划程序”。
  2. 在左侧导航栏点击“任务计划程序库”,右侧列表中找到“掘金自动签到助手”。
  3. 右键点击任务,可进行 属性修改运行禁用导出 等操作。

🔧 安装与使用

1. 安装油猴脚本

2. 配置定时任务

  • 以管理员身份打开命令提示符,执行上述创建命令(根据实际路径和用户名调整)。
  • 可通过 schtasks /query /tn "掘金自动签到助手" 验证是否创建成功。

3. 测试运行

  • 手动测试脚本:直接打开 https://juejin.cn/user/center/signin?from=sign_in_menu_bar,观察控制台日志(F12),确认脚本正常工作。
  • 测试定时任务:在任务计划程序中右键点击任务 → “运行”,观察是否自动打开浏览器并跳转到签到页。

4. 自动运行

  • 每天到达设定时间,Windows 会自动启动 Edge 并访问签到页,油猴脚本随即执行签到。
  • 签到完成后,浏览器窗口会保持打开(可手动关闭),建议保持浏览器已登录掘金账号。

❓ 常见问题

Q1: 脚本提示“等待超时”怎么办?

  • 可能是网络较慢或页面加载过久,脚本已设置 30 秒超时,通常足够。
  • 如果频繁超时,可尝试提高超时时间(修改 waitForElementtimeout 参数)。
  • 确保浏览器已登录掘金,否则页面会跳转到登录页,按钮不会出现。

Q2: 如何修改签到时间?

  • 使用命令 schtasks /change /tn "掘金自动签到助手" /st HH:MM 修改开始时间。
  • 或在任务计划程序图形界面中右键 → 属性 → 触发器 → 编辑时间。

Q3: 签到按钮变化了怎么办?

  • 掘金可能更新页面结构,若 .signin.btn.signedin.btn 失效,需更新脚本中的选择器。
  • 打开页面,使用 F12 检查元素,找到正确的类名,替换脚本中的对应选择器即可。

Q4: 能否让浏览器在后台运行不弹窗?

  • 可以通过修改任务动作为启动 Edge 的“后台模式”,但需要额外参数(如 --headless--background),但此类模式可能不支持扩展脚本运行,建议保持默认。
  • 或者使用 -new-window 参数,但依然会弹出窗口。

Q5: 任务运行后浏览器关闭了,签到成功了吗?

  • 签到操作在页面打开后由脚本自动完成,通常只需几秒,之后浏览器可手动关闭。
  • 可访问掘金签到页查看是否显示“今日已签到”来确认。

📝 总结

通过这套方案,你实现了:

  • 零手动操作:每天定时自动签到。
  • 拟人化行为:模拟鼠标、延迟、滚动,降低风险。
  • 稳定可靠:状态检测、异常处理,确保脚本健壮。
  • 灵活可控:随时修改时间、脚本逻辑,适应网站变化。

现在,你只需一次配置,即可长期享受自动签到的便利。如有任何问题,欢迎随时反馈!🎉