Greasy Fork is available in English.

SparkAi 自动签到

SparkAi 无感知自动签到

// ==UserScript==
// @name         SparkAi 自动签到
// @icon         https://ai.sparkaigf.com/logo.png
// @namespace    https://github.com/NPC2000
// @version      1.0.0
// @description  SparkAi 无感知自动签到
// @author       NPC
// @match        https://ai.sparkaigf.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 获取并解析 Authorization 令牌
    const secretToken = localStorage.getItem('SECRET_TOKEN');
    let token;

    if (secretToken) {
        try {
            const parsedToken = JSON.parse(secretToken);  // 解析 JSON
            token = parsedToken.data;  // 提取 data 字段中的令牌
        } catch (e) {
            console.error('无法解析 SECRET_TOKEN:', e);
            return;
        }
    } else {
        console.error('未找到 SECRET_TOKEN');
        return;
    }

    // 确保 token 存在
    if (!token) {
        console.error('未找到有效的 Authorization 令牌');
        return;
    }

    // 自动获取 X-Website-Domain 和 Fingerprint
    const xWebsiteDomain = document.querySelector('meta[name="x-website-domain"]')?.getAttribute('content') || 'ai.sparkaigf.com';

    // 生成一个随机的 Fingerprint(长度为10的随机数字)
    const randomFingerprint = Math.floor(Math.random() * 9000000000) + 1000000000;

    const fingerprint = document.querySelector('meta[name="fingerprint"]')?.getAttribute('content') || randomFingerprint.toString() ;

    // 获取用户信息
    const parsedToken = JSON.parse(atob(token.split('.')[1]));  // 解码 JWT 获取用户信息
    const username = parsedToken.username;  // 获取用户名

    // 获取当前日期
    const today = new Date().toISOString().split('T')[0];  // 格式化为 YYYY-MM-DD

    // 从 localStorage 检查此用户是否已经签到
    const lastSignInDate = localStorage.getItem(`lastSignIn_${username}`);

    if (lastSignInDate === today) {
        console.log(`用户 ${username} 今天已经签到,跳过签到`);
        return;  // 如果用户今天已经签到,直接返回
    }

    // 定义签到的 URL 和请求体
    const signInUrl = 'https://ai.sparkaigf.com/api/signin/sign';
    const requestBody = JSON.stringify({});  // 请求体为空的 JSON 对象

    // 发送 POST 请求
    fetch(signInUrl, {
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${token}`,  // 使用从 localStorage 中解析的 Authorization 令牌
            'Content-Type': 'application/json',
            'X-Website-Domain': xWebsiteDomain,  // 自动获取的自定义头部字段
            'Fingerprint': fingerprint,  // 自动获取的自定义头部字段
        },
        body: requestBody
    })
    .then(response => response.json())  // 解析为 JSON
    .then(data => {
        console.log('签到请求已发送');
        console.log(data);  // 打印返回的响应,以便检查是否成功

        // 检查签到是否成功
        if (data.code === 200 || data.message.includes('今日已签到')) {
            console.log(`用户 ${username} 签到成功`);

            // 签到成功后,记录签到日期
            localStorage.setItem(`lastSignIn_${username}`, today);
        } else {
            console.error('签到失败:', data.message);
        }
    })
    .catch((error) => {
        console.error('签到请求失败:', error);
    });

})();