不开电脑灵犀也能签到领智点

Lv.1 新人创作者
多维表格云端自动签到实战教程
一、原理:为什么多维表格可以不开机
先说透一件事:你在网页上点「签到」按钮的那一瞬间,浏览器实际做的只是向服务器发送了一个 HTTP 请求(附带你的登录凭证)。服务器不关心这个请求是人点的,还是脚本发的。
所以「不开机自动签到」的关键在于运行位置。本机定时任务 + 浏览器模拟点击的方案,每一步都发生在你自己的电脑上,电脑不开一切免谈;而多维表格的 AirScript 脚本跑在金山服务器上,支持定时触发、能对外发 HTTP 请求、还能读写表格——三样凑齐,就是一个免费的云端定时签到器。
方案 | 运行位置 | 依赖开机 |
本机定时任务 + 浏览器点击 | 你自己的电脑 | 是 |
多维表格自动化(本教程) | 金山服务器 | 否 |
二、抓接口:找到签到请求(约 5 分钟,只需做一次)
Chrome 打开 lingxi.kdocs.cn 并登录;
按 F12 打开开发者工具,切到 Network(网络)面板,勾选 Preserve log;
刷新页面,找到发往 lingxi.kdocs.cn 的 tasks 请求;
右键该请求 → 复制 → 复制 cURL,把其中的 cookie 整串拷出来,存到本地文件备用。
直接抄结论(建议自己抓一遍验证):查询状态是 GET /api/public/v1/tasks,执行签到是 POST /api/public/v1/tasks/daily_check_in/claim,鉴权全靠请求头里的 Cookie,没有请求体。
⚠ 提醒:这串 Cookie 等于你的账号登录态,不要发给任何人、不要贴到评论区。
三、搭台账:签到记录表(约 5 分钟)
新建一个多维表格,建一张「数据表」,6 个字段:
字段 | 类型 | 说明 |
日期 | 日期 | 主字段,格式 yyyy/MM/dd |
签到状态 | 单选项 | ✅成功 / ❌失败 / ⏭️兜底跳过 |
领取智点 | 数字 | 当天到账数量 |
失败原因 | 文本 | 过期、接口变更等排查线索 |
执行时间 | 日期 | 格式 yyyy/MM/dd HH:mm |
执行来源 | 单选项 | 云端多维表格 / 本机灵犀 / 手动 |
再加一个日历视图:每天瞄一眼,绿点代表满勤,红点代表缺勤。这张表既是台账也是告警器,别省。
四、核心:自动化流程 + AirScript 脚本
4.1 新建自动化流程
进入多维表格,顶部点「自动化」,新建一个流程:
选「创建空白流程」:第 1 步触发器选「定时触发」,设为每天 09:30;第 2 步执行动作选「执行 AirScript 脚本」。
4.2 粘贴脚本
在脚本编辑器里新建 JS 脚本,粘贴下面的完整代码。只需要改两处:把 COOKIE 换成第二节抓到的 Cookie;把「数据表」换成你的数据表名。
const COOKIE = 'COOKIE';
const API_BASE = 'https://lingxi.kdocs.cn/api/public/v1/tasks';
const SH = Application.Sheets('数据表');
function pad(n) { return String(n).padStart(2, '0'); }
function todayStr() {
const d = new Date();
return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate());
}
function nowStr() {
const d = new Date();
return todayStr() + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes());
}
function digits(s) { return String(s == null ? '' : s).replace(/\D/g, ''); }
function findTodayRow(today) {
let count = 0;
try { count = SH.RecordRange.Count; } catch (e) {}
for (let i = 1; i <= count; i++) {
try {
if (digits(SH.RecordRange(i, '@日期').Value) === digits(today)) return i;
} catch (e) {}
}
return -1;
}
function writeLedger(status, points, reason) {
const today = todayStr();
try {
let row = findTodayRow(today);
if (row < 0) {
SH.RecordRange.Add(null, null, 1);
row = SH.RecordRange.Count;
console.log('台账新增第 ' + row + ' 行');
}
SH.RecordRange(row, '@日期').Value = today;
SH.RecordRange(row, '@签到状态').Value = status;
SH.RecordRange(row, '@领取智点').Value = points;
SH.RecordRange(row, '@失败原因').Value = reason || '';
SH.RecordRange(row, '@执行时间').Value = nowStr();
SH.RecordRange(row, '@执行来源').Value = '云端多维表格';
console.log('台账写入完成: ' + status);
} catch (e) {
console.log('写台账失败(不影响签到): ' + e.message);
}
}
function main() {
const today = todayStr();
console.log('===== 灵犀云端签到 ' + today + ' =====');
const existRow = findTodayRow(today);
if (existRow > 0) {
try {
const st = String(SH.RecordRange(existRow, '@签到状态').Value || '');
if (st.indexOf('成功') >= 0) { console.log('今天已成功,跳过。'); return; }
} catch (e) {}
}
let task = null;
try {
const resp = HTTP.get(API_BASE, { headers: { 'Cookie': COOKIE, 'Accept': 'application/json' } });
const data = resp.json();
const tasks = (data && data.data && data.data.tasks) || [];
task = tasks.filter(function (t) { return t.task_key === 'daily_check_in'; })[0];
} catch (e) {
writeLedger('❌失败', 0, '查询失败: ' + e.message);
return;
}
if (!task) { writeLedger('❌失败', 0, '接口无 daily_check_in 任务'); return; }
if (task.status === 'claimed') {
const days = task.extra ? task.extra.consecutive_days : '?';
console.log('今天已签到(连续 ' + days + ' 天)。');
writeLedger('✅成功', task.extra ? task.extra.today_reward : 0, '今日已签(连续' + days + '天)');
return;
}
try {
const resp = HTTP.post(API_BASE + '/daily_check_in/claim', '', {
headers: { 'Cookie': COOKIE, 'Accept': 'application/json', 'Content-Type': 'application/json' }
});
const data = resp.json();
const dayInfo = (data.data.extra.check_in_days).filter(function (d) { return d.date === today; })[0];
if (dayInfo && dayInfo.status === 'claimed') {
console.log('签到成功,+' + (dayInfo.reward || 0) + ' 智点');
writeLedger('✅成功', dayInfo.reward || 0, '');
} else {
writeLedger('❌失败', 0, 'claim未确认');
}
} catch (e) {
writeLedger('❌失败', 0, '签到异常: ' + e.message);
}
}
main();注意最后一行 main();——环境只从上往下执行代码,定义了函数不调用,就是一次「执行成功」的空跑。这是第一个大坑。
4.3 给脚本添加服务授权
首次运行大概率报错「高级服务-网络 未添加」。AirScript 的服务授权按脚本隔离:每个脚本都要单独在编辑器顶部工具栏的「服务」菜单里添加「网络 API」(发请求用)和「云文档 API」(写表用)。
4.4 运行验证
点运行,预期日志:
===== 灵犀云端签到 2026-11-03 =====
今天已签到(连续 29 天)。
台账写入完成: ✅成功
五、踩坑清单(每一条都是实测撞出来的)
服务授权按脚本隔离:每个脚本要单独添加「网络 API」和「云文档 API」。没加会报「高级服务-网络 未添加」,且错误发生在平台层,try/catch 拦不住,表现是日志打到一半静默消失。
main() 必须显式调用:只定义函数不调用 = 一次「执行成功」的空跑,什么都不发生。
HTTP 响应要用 resp.json() 显式读:响应对象长得像 fetch 的 Response,但 .data、.body、.text 属性全取不到内容,必须调方法。
RecordRange 的两个铁律:行号必须是数字(第几行,从 1 开始),字段名要加 @ 前缀(如 @日期)。传记录 ID 字符串会被当无效参数,出现各种诡异行为。
Application.Record(GetRecords / CreateRecords)在 2.0 环境不存在:网上很多教程(含官方旧文档)用的是旧版 API,2.0 里直接是 undefined。
自动化流程的「新增记录」动作不能引用脚本的返回值:变量选择器里只有触发时间之类的系统变量,想写动态结果只能在脚本里自己写表。
六、维护:唯一需要长期做的事
Cookie 有效期有限(经验值约 30 天,且实测签到接口、登录校验接口都不会自动续期,属于固定有效期)。过期后的表现与处理:
• 你怎么知道:日历视图出现 ❌ 红点,失败原因写着具体报错——这就是台账存在的意义。
• 怎么处理:重复第二节,重新抓一次 cookie(2 分钟),替换脚本第一行的 COOKIE,保存后手动跑一次确认。
• 双保险技巧:保留本机方案。电脑碰巧开机时本机先签上,云端脚本检测到已签只记台账,两边不冲突。
祝大家满勤。有问题欢迎评论区交流。
Lv.3 优质创作者
Lv.1 新人创作者
Lv.1 新人创作者
Lv.3 优质创作者
Lv.1 新人创作者
Lv.1 新人创作者
Lv.4 核心创作者
Lv.1 新人创作者