// ==UserScript== // @name 壹速云机场自动签到 (傻瓜通用版) // @namespace http://tampermonkey.net/ // @version 5.0 // @description 全自动后台签到。首次安装后,请在你想作为“签到主页”的网站上进行配置,之后仅在该网站运行。 // @author You // @connect www.onesy1.cc // @match *://*/* // @run-at document-idle // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_registerMenuCommand // @downloadURL https://update.greasyfork.icu/scripts/556532/%E5%A3%B9%E9%80%9F%E4%BA%91%E6%9C%BA%E5%9C%BA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%20%28%E5%82%BB%E7%93%9C%E9%80%9A%E7%94%A8%E7%89%88%29.user.js // @updateURL https://update.greasyfork.icu/scripts/556532/%E5%A3%B9%E9%80%9F%E4%BA%91%E6%9C%BA%E5%9C%BA%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%20%28%E5%82%BB%E7%93%9C%E9%80%9A%E7%94%A8%E7%89%88%29.meta.js // ==/UserScript== (function() { 'use strict'; // 防止在 iframe (网页里的广告框) 中运行,只在主窗口运行 if (window.top !== window.self) return; // ================= 常量定义 ================= const SITE_CONFIG = { siteUrl: "https://www.onesy1.cc", loginApi: "/auth/login", checkinApi: "/user/checkin" }; const ICONS = { waiting: '🟠', success: '🟢', error: '🔴', info: '🔵', setting: '⚙️' }; const PANEL_ID = 'vpn-checkin-panel-v5'; const MODAL_ID = 'vpn-checkin-settings-modal'; const SETUP_BTN_ID = 'vpn-setup-float-btn'; // ================= 样式定义 ================= GM_addStyle(` /* 主面板 (极致隐形风) */ #${PANEL_ID} { position: fixed; top: 20px; right: 20px; z-index: 2147483647; background: rgba(20, 20, 20, 0.9); backdrop-filter: blur(4px); color: #fff; border-radius: 50px; font-size: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); font-family: -apple-system, BlinkMacSystemFont, sans-serif; display: flex; align-items: center; padding: 3px; border: 1px solid rgba(255,255,255,0.05); cursor: pointer; } #${PANEL_ID} .icon-box { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; margin-right: 6px; } #${PANEL_ID}.waiting .icon-box { background: rgba(255, 152, 0, 0.2); color: #ff9800; } #${PANEL_ID}.success .icon-box { background: rgba(76, 175, 80, 0.2); color: #4caf50; } #${PANEL_ID}.info .icon-box { background: rgba(33, 150, 243, 0.2); color: #2196f3; } #${PANEL_ID}.error .icon-box { background: rgba(244, 67, 54, 0.2); color: #f44336; } #${PANEL_ID} .content-box { margin-right: 8px; display: flex; flex-direction: column; justify-content: center; } #${PANEL_ID} .status { font-weight: bold; font-size: 12px; line-height: 1; } /* 缩回模式 */ #${PANEL_ID}.collapsed { padding: 2px; width: 28px; height: 28px; background: rgba(0,0,0,0.15); border: none; box-shadow: none; } #${PANEL_ID}.collapsed .icon-box { margin: 0; width: 100%; height: 100%; font-size: 12px; } #${PANEL_ID}.collapsed .content-box { display: none; } #${PANEL_ID}.collapsed:hover { width: auto; height: auto; background: rgba(20, 20, 20, 0.95); padding: 4px; box-shadow: 0 4px 15px rgba(0,0,0,0.3); } #${PANEL_ID}.collapsed:hover .icon-box { width: 24px; height: 24px; margin-right: 6px; } #${PANEL_ID}.collapsed:hover .content-box { display: flex; } /* 初始设置按钮 (未配置时显示) */ #${SETUP_BTN_ID} { position: fixed; bottom: 30px; right: 30px; z-index: 2147483647; background: #4caf50; color: white; padding: 10px 20px; border-radius: 30px; font-weight: bold; cursor: pointer; box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4); font-family: sans-serif; font-size: 14px; animation: vpn-pulse 2s infinite; } @keyframes vpn-pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } /* 设置弹窗 */ #${MODAL_ID} { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.6); z-index: 2147483648; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(3px); } #${MODAL_ID} .card { background: #2d2d2d; color: #fff; width: 320px; padding: 25px; border-radius: 12px; border: 1px solid #444; font-family: sans-serif; } #${MODAL_ID} h3 { margin: 0 0 15px 0; color: #4caf50; text-align: center; } #${MODAL_ID} .group { margin-bottom: 15px; } #${MODAL_ID} label { display: block; font-size: 12px; color: #aaa; margin-bottom: 5px; } #${MODAL_ID} input { width: 100%; padding: 10px; background: #3d3d3d; border: 1px solid #444; color: white; border-radius: 6px; box-sizing: border-box; } #${MODAL_ID} .tip { font-size: 11px; color: #888; margin-top: 5px; } #${MODAL_ID} .btn-row { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; } #${MODAL_ID} button { padding: 8px 16px; border-radius: 6px; border: none; cursor: pointer; font-weight: bold; } #${MODAL_ID} .save { background: #4caf50; color: white; } #${MODAL_ID} .cancel { background: transparent; color: #aaa; } #${MODAL_ID} .use-curr { font-size: 11px; color: #2196f3; cursor: pointer; float: right; margin-top: -20px; } `); // ================= 核心逻辑入口 ================= // 1. 读取配置 const config = GM_getValue('vpn_config', {}); const currentUrl = window.location.href; // 2. 逻辑分支 if (!config.email || !config.password || !config.homepage) { // 场景A: 未配置 -> 显示右下角“配置”大按钮 showSetupButton(); } else { // 场景B: 已配置 -> 检查当前网页是不是主页 if (isHomepage(currentUrl, config.homepage)) { // 是主页 -> 运行签到程序 initCheckinUI(config); } else { // 不是主页 -> 什么都不做,静默退出 (不占内存) return; } } // ================= 辅助函数 ================= // 判断当前 URL 是否匹配用户设置的主页 function isHomepage(current, target) { // 简单包含匹配,比如 target是 "baidu.com",current是 "www.baidu.com/s?wd=1" -> 匹配 return current.includes(target) || target.includes(current); } // 显示右下角配置按钮 function showSetupButton() { const btn = document.createElement('div'); btn.id = SETUP_BTN_ID; btn.innerText = "⚙️ 配置自动签到"; btn.onclick = () => showSettings(true); document.body.appendChild(btn); } // 显示设置弹窗 function showSettings(isFirstTime) { if (document.getElementById(MODAL_ID)) return; const oldConfig = GM_getValue('vpn_config', {}); // 默认主页地址填入当前网址 const defaultHome = oldConfig.homepage || window.location.hostname; const modal = document.createElement('div'); modal.id = MODAL_ID; modal.innerHTML = `