// ==UserScript== // @name 网站自动签到 // @namespace https://docs.scriptcat.org/ // @version 0.1.0 // @description 我自用的网站自动签到工具 // @author Lin // @match https://framehdr.com/* // @match https://www.kungal.com/* // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM.deleteValue // @grant GM_registerMenuCommand // @grant GM_openInTab // @run-at document-end // @noframes // @license MIT // ==/UserScript== // 一个轻量级的 message 提示实现 class MessageService { constructor() { // 创建一个容器来放所有的提示 this.container = document.createElement('div'); this.container.style.cssText = ` position: fixed; top: 20px; left: 50%; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; z-index: 9999; `; document.body.appendChild(this.container); } show(text, type = 'success') { const p = document.createElement('p'); // 基础的样式,你可以按需调整颜色、大小等 const bgColor = type === 'success' ? '#52c41a' : '#ff4d4f'; p.style.cssText = ` margin: 10px; padding: 10px 20px; background-color: ${bgColor}; color: #fff; border-radius: 4px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); font-size: 14px; animation: fadeIn 0.3s; `; p.textContent = text; this.container.appendChild(p); // 3秒后自动消失 setTimeout(() => { if (p.parentNode) { p.style.opacity = '0'; p.style.transition = 'opacity 0.3s'; setTimeout(() => p.remove(), 300); } }, 3000); } } (function() { 'use strict'; const message = new MessageService(); var NEED_LOGIN="您还未登录,登录后自动签到"; var SITES = [ // 帧影 framehdr { name: "帧影 framehdr", test: function(h) { return h.indexOf("framehdr.com/index.php") !== -1; }, run: function() { window.setTimeout(async function(){ const preload = unsafeWindow._ckPreload; if (!preload) { message.show(NEED_LOGIN, 'error'); return; } const hasCheckedToday = preload.has_checked_today; const points = preload.points || 0; const totalDays = preload.total_days || 0; const continuousDays = preload.continuous_days || 0; if (hasCheckedToday) { message.show(`今日已签到,📊 当前积分: ${points},累计签到: ${totalDays} 天,连续签到: ${continuousDays} 天`); return; } function fetchCsrfToken() { return new Promise((resolve, reject) => { let csrfToken = preload.csrf_token || unsafeWindow._ckCsrfToken || ''; if (csrfToken) { resolve(csrfToken); return; } const now = new Date(); const year = now.getFullYear(); const month = now.getMonth() + 1; GM_xmlhttpRequest({ method: 'GET', url: `https://framehdr.com/api/checkin.php?action=init&year=${year}&month=${month}`, onload: function (res) { if (res.status === 200) { const data = JSON.parse(res.responseText); if (data.success) { csrfToken = data.data.csrf_token; resolve(csrfToken); return; } } reject('获取登录信息失败'); }, onerror: function(err) { reject(err); } }); }) } let csrfToken = await fetchCsrfToken(); if (!csrfToken) { message.show(`⚠️ 获取登录Token失败,请刷新后重试`, 'error'); return; } const url = 'https://framehdr.com/api/checkin.php?action=checkin'; const formData = new URLSearchParams(); formData.append('csrf_token', csrfToken); GM_xmlhttpRequest({ method: 'POST', url: url, data: formData, responseType: 'json', onload: function(res) { if (res.status === 200) { const data = res.response; if (data.code === 0 || data.success === true) { message.show('🎉 签到成功!', data.msg || ''); } else { message.show(`⚠️ 签到失败:${data.msg || '未知错误'}`, 'error'); } } else { message.show(`❌ HTTP 错误,状态码: ${res.status}`, 'error'); } }, onerror: function(err) { message.show(`❌ 网络请求失败: ${err.error || err}`, 'error'); } }); }, 1000); } }, // 鲲Galgame { name: "鲲Galgame", test: function(h){ return h.indexOf("kungal") !== -1; }, run: function(){ window.setTimeout(() => { const meUrl = `https://www.kungal.com/api/auth/me`; GM_xmlhttpRequest({ method: 'GET', url: meUrl, onload: function(response) { if (response.status === 200){ const checkInUrl = `https://www.kungal.com/api/user/check-in`; GM_xmlhttpRequest({ method: 'POST', url: checkInUrl, onload: function (res) { const checkInData = JSON.parse(res.responseText); if (checkInData.code === 0) { message.show('🎉 签到成功!'); } else if (checkInData.code === 233) { message.show('今日已签到'); } else { message.show(`❌ 签到失败: ${checkInData.message || '未知错误'}`, 'error'); } }, onerror: function(err) { message.show(`❌ 签到失败: ${err.error || err}`, 'error'); } }) } else { message.show(NEED_LOGIN, 'error'); } } }) }, 2000); }} ]; var href = window.location.href; for (var i = 0; i < SITES.length; i++) { if (SITES[i].test(href)) { SITES[i].run(); return; } } })();