// ==UserScript== // @name glados.rocks 自动签到 (脚本猫后台版) // @namespace https://glados.rocks/ // @version 1.2.0 // @description 利用脚本猫 crontab 定时发包自动签到GLaDOS,无需硬编码Cookie // @author Gemini // @crontab * 8-23 once * * // @grant GM_xmlhttpRequest // @grant GM_notification // @grant GM_log // @connect glados.rocks // @license GPL-2.0 // ==/UserScript== // 脚本猫后台/定时任务要求返回一个 Promise 以判定任务何时真正结束 return new Promise((resolve, reject) => { const CHECKIN_URL = 'https://glados.rocks/api/user/checkin'; // 核心提示:脚本猫环境下的 GM_xmlhttpRequest 发包会自动携带当前浏览器的登录 Cookie, // 因此这里无需手动死板地写死 Cookie 变量,只要你的浏览器正常登录过 glados 即可无感自动签到! function notify(message) { try { GM_notification({ text: message, title: 'Glados 自动签到', timeout: 5000, }); } catch (err) { // 后台脚本可能没有通知权限,记录到日志便于排查 GM_log('[glados checkin] 通知发送失败: ' + err.message); } // 使用 GM_log 可在脚本猫扩展的后台日志控制台中查看记录 GM_log('[glados checkin] ' + message); } GM_xmlhttpRequest({ method: 'POST', url: CHECKIN_URL, headers: { 'Content-Type': 'application/json;charset=UTF-8', 'Accept': 'application/json, text/plain, */*', 'Origin': 'https://glados.rocks', 'Referer': 'https://glados.rocks/console/checkin' }, data: JSON.stringify({ token: 'glados.rocks' }), timeout: 10000, // 10 秒超时:代理未开启时快速失败,避免长时间挂起 onload: function (response) { // --- 守卫1: 检查 HTTP 状态码 --- // 无代理时可能收到代理软件的拦截页面(HTML),而非正常 JSON 响应 if (response.status !== 200) { GM_log(`[glados checkin] HTTP ${response.status},可能代理未就绪或 Cookie 过期,稍后重试`); reject(new CATRetryError('HTTP ' + response.status, 300)); return; } // --- 守卫2: 安全解析 JSON --- let data; try { data = JSON.parse(response.responseText); } catch (e) { GM_log('[glados checkin] 响应非 JSON,可能被代理/中间件拦截,稍后重试'); reject(new CATRetryError('Invalid JSON response', 300)); return; } // --- 按 API 返回的 code 值做分支判断 --- // 根据实采数据: code=0 签到成功, code=1 今日已签到 if (data.code === 0) { // 从响应 list[0] 中提取本次签到积分和账户余额 const record = data.list && data.list[0]; const points = record ? parseFloat(record.change) : (data.points || 0); const balance = record ? parseFloat(record.balance) : 0; notify(`签到成功!+${points} 积分,当前余额: ${balance}`); resolve('Success'); } else if (data.code === 1) { notify('今日已签到,无需重复操作。'); resolve('Already checked in'); } else { // 未知 code,可能是接口变更或新状态 notify(`签到异常 [code=${data.code}]: ${data.message || '无消息'}`); resolve('Failed logic'); // 逻辑失败直接 resolve 避免无限重试 } }, onerror: function (error) { GM_log('[glados checkin] 网络请求失败,5 分钟后重试'); // CATRetryError 告知脚本猫在指定秒数后重新执行脚本,比依赖下一轮 crontab 更高效 reject(new CATRetryError('Network error', 300)); }, ontimeout: function () { GM_log('[glados checkin] 请求超时(可能代理未开启),5 分钟后重试'); reject(new CATRetryError('Request timeout', 300)); } }); });