已收录

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

杨景程
杨景程 KVPLv.1 新人创作者

Lv.1 新人创作者

多维表格云端自动签到实战教程

一、原理:为什么多维表格可以不开机

先说透一件事:你在网页上点「签到」按钮的那一瞬间,浏览器实际做的只是向服务器发送了一个 HTTP 请求(附带你的登录凭证)。服务器不关心这个请求是人点的,还是脚本发的。

所以「不开机自动签到」的关键在于运行位置。本机定时任务 + 浏览器模拟点击的方案,每一步都发生在你自己的电脑上,电脑不开一切免谈;而多维表格的 AirScript 脚本跑在金山服务器上,支持定时触发、能对外发 HTTP 请求、还能读写表格——三样凑齐,就是一个免费的云端定时签到器。

方案

运行位置

依赖开机

本机定时任务 + 浏览器点击

你自己的电脑

是

多维表格自动化(本教程)

金山服务器

否

二、抓接口:找到签到请求(约 5 分钟,只需做一次)

  1. Chrome 打开 lingxi.kdocs.cn 并登录;

  1. 按 F12 打开开发者工具,切到 Network(网络)面板,勾选 Preserve log;

  1. 刷新页面,找到发往 lingxi.kdocs.cn 的 tasks 请求;

  1. 右键该请求 → 复制 → 复制 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 天)。

台账写入完成: ✅成功

五、踩坑清单(每一条都是实测撞出来的)

  1. 服务授权按脚本隔离:每个脚本要单独添加「网络 API」和「云文档 API」。没加会报「高级服务-网络 未添加」,且错误发生在平台层,try/catch 拦不住,表现是日志打到一半静默消失。

  1. main() 必须显式调用:只定义函数不调用 = 一次「执行成功」的空跑,什么都不发生。

  1. HTTP 响应要用 resp.json() 显式读:响应对象长得像 fetch 的 Response,但 .data、.body、.text 属性全取不到内容,必须调方法。

  1. RecordRange 的两个铁律:行号必须是数字(第几行,从 1 开始),字段名要加 @ 前缀(如 @日期)。传记录 ID 字符串会被当无效参数,出现各种诡异行为。

  1. Application.Record(GetRecords / CreateRecords)在 2.0 环境不存在:网上很多教程(含官方旧文档)用的是旧版 API,2.0 里直接是 undefined。

  1. 自动化流程的「新增记录」动作不能引用脚本的返回值:变量选择器里只有触发时间之类的系统变量,想写动态结果只能在脚本里自己写表。

六、维护:唯一需要长期做的事

Cookie 有效期有限(经验值约 30 天,且实测签到接口、登录校验接口都不会自动续期,属于固定有效期)。过期后的表现与处理:

• 你怎么知道:日历视图出现 ❌ 红点,失败原因写着具体报错——这就是台账存在的意义。

• 怎么处理:重复第二节,重新抓一次 cookie(2 分钟),替换脚本第一行的 COOKIE,保存后手动跑一次确认。

• 双保险技巧:保留本机方案。电脑碰巧开机时本机先签上,云端脚本检测到已签只记台账,两边不冲突。

祝大家满勤。有问题欢迎评论区交流。

浏览 183
2
10
分享
10 +1
10
2 +1
全部评论 10
 
Mr Chen
Mr Chen WPS资深用户Lv.3 优质创作者KVPWPS产品体验官WPS寻令官

Lv.3 优质创作者

厉害学到了!我领略到了一种更方便的,直接告诉灵犀创建多维表,利用自动化实现对灵犀签到领取智点,也可以反向完成,因为我直接看不懂代码。
   甘肃省
举报
0
1
杨景程
杨景程KVPLv.1 新人创作者

Lv.1 新人创作者

·
举报
0
0
 
流沙
楼主威武,照着做一次成功!
举报
0
1
杨景程
杨景程KVPLv.1 新人创作者

Lv.1 新人创作者

厉害!
·
举报
0
0
 
熠林
熠林 Lv.3 优质创作者

Lv.3 优质创作者

好牛,不过要是手机端能签到也就不用这么麻烦了
   浙江省
举报
0
1
杨景程
杨景程KVPLv.1 新人创作者

Lv.1 新人创作者

哈哈哈哈,好多人也想这样子,最好一部手机搞定一切,但是目前还不行。
·
举报
0
0
 
企鱼
企鱼 Lv.1 新人创作者

Lv.1 新人创作者

感觉官方并不鼓励这种行为
   福建省
举报
0
0
 
晨あ星
真六啊
   河南省
举报
1
0
 
Hypnotist
Hypnotist WPS资深用户Lv.4 核心创作者WPS产品体验官WPS寻令官

Lv.4 核心创作者

JSA果然是亲儿子,没什么问题 我用Python会遇到网络隔离的问题
   四川省
举报
1
1
杨景程
杨景程KVPLv.1 新人创作者

Lv.1 新人创作者

嗯是滴~~
·
举报
1
0