SparkAi 自动签到

SparkAi 无感知自动签到

  1. // ==UserScript==
  2. // @name SparkAi 自动签到
  3. // @icon https://ai.sparkaigf.com/logo.png
  4. // @namespace https://github.com/NPC2000
  5. // @version 1.0.0
  6. // @description SparkAi 无感知自动签到
  7. // @author NPC
  8. // @match https://ai.sparkaigf.com/*
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. // 获取并解析 Authorization 令牌
  17. const secretToken = localStorage.getItem('SECRET_TOKEN');
  18. let token;
  19.  
  20. if (secretToken) {
  21. try {
  22. const parsedToken = JSON.parse(secretToken); // 解析 JSON
  23. token = parsedToken.data; // 提取 data 字段中的令牌
  24. } catch (e) {
  25. console.error('无法解析 SECRET_TOKEN:', e);
  26. return;
  27. }
  28. } else {
  29. console.error('未找到 SECRET_TOKEN');
  30. return;
  31. }
  32.  
  33. // 确保 token 存在
  34. if (!token) {
  35. console.error('未找到有效的 Authorization 令牌');
  36. return;
  37. }
  38.  
  39. // 自动获取 X-Website-Domain 和 Fingerprint
  40. const xWebsiteDomain = document.querySelector('meta[name="x-website-domain"]')?.getAttribute('content') || 'ai.sparkaigf.com';
  41.  
  42. // 生成一个随机的 Fingerprint(长度为10的随机数字)
  43. const randomFingerprint = Math.floor(Math.random() * 9000000000) + 1000000000;
  44.  
  45. const fingerprint = document.querySelector('meta[name="fingerprint"]')?.getAttribute('content') || randomFingerprint.toString() ;
  46.  
  47. // 获取用户信息
  48. const parsedToken = JSON.parse(atob(token.split('.')[1])); // 解码 JWT 获取用户信息
  49. const username = parsedToken.username; // 获取用户名
  50.  
  51. // 获取当前日期
  52. const today = new Date().toISOString().split('T')[0]; // 格式化为 YYYY-MM-DD
  53.  
  54. // 从 localStorage 检查此用户是否已经签到
  55. const lastSignInDate = localStorage.getItem(`lastSignIn_${username}`);
  56.  
  57. if (lastSignInDate === today) {
  58. console.log(`用户 ${username} 今天已经签到,跳过签到`);
  59. return; // 如果用户今天已经签到,直接返回
  60. }
  61.  
  62. // 定义签到的 URL 和请求体
  63. const signInUrl = 'https://ai.sparkaigf.com/api/signin/sign';
  64. const requestBody = JSON.stringify({}); // 请求体为空的 JSON 对象
  65.  
  66. // 发送 POST 请求
  67. fetch(signInUrl, {
  68. method: 'POST',
  69. headers: {
  70. 'Authorization': `Bearer ${token}`, // 使用从 localStorage 中解析的 Authorization 令牌
  71. 'Content-Type': 'application/json',
  72. 'X-Website-Domain': xWebsiteDomain, // 自动获取的自定义头部字段
  73. 'Fingerprint': fingerprint, // 自动获取的自定义头部字段
  74. },
  75. body: requestBody
  76. })
  77. .then(response => response.json()) // 解析为 JSON
  78. .then(data => {
  79. console.log('签到请求已发送');
  80. console.log(data); // 打印返回的响应,以便检查是否成功
  81.  
  82. // 检查签到是否成功
  83. if (data.code === 200 || data.message.includes('今日已签到')) {
  84. console.log(`用户 ${username} 签到成功`);
  85.  
  86. // 签到成功后,记录签到日期
  87. localStorage.setItem(`lastSignIn_${username}`, today);
  88. } else {
  89. console.error('签到失败:', data.message);
  90. }
  91. })
  92. .catch((error) => {
  93. console.error('签到请求失败:', error);
  94. });
  95.  
  96. })();