首页/新闻资讯/正文详情

钉钉打卡脚本(基于auto.js)开发总结:TaoToken 统一 Key 接入与配置骨架

发布时间:2026/9/26 10:29:01 来源:云帆数科 栏目:资讯中心
钉钉打卡脚本(基于auto.js)开发总结:TaoToken 统一 Key 接入与配置骨架
1. 从一次打卡脚本翻车说起钉钉打卡脚本基于 auto.js这件事我一开始想得很简单Android 上跑个 JavaScript点亮屏幕、打开钉钉、找到「工作」按钮点进去、再点打卡收工。真写起来才发现坑不在业务逻辑而在工程化落地——控件找不到、页面动态加载、时间段判断写死、脚本跑一半被系统杀掉。更麻烦的是脚本里如果要接大模型做语义判断比如识别「今日是否已打卡」的文案Key 散落在各个脚本里改一次要翻好几个文件。这篇就把我这段时间折腾钉钉打卡脚本基于 auto.js的经验整理成一份可复现的骨架脚本结构怎么分层、权限怎么配、稳定性怎么保以及怎么用 TaoToken 的统一 Key/API 通道把模型调用收敛到一处配置。适合已经在写 auto.js、想把脚本从「能跑」推到「稳定跑」的人也适合刚接触 Android 自动化、想找个完整例子跟做的同学。auto.js 本身是一个支持无障碍服务的 Android 平台 JavaScript IDE操作的基本单位是控件而不是坐标这点和按键精灵那种基于坐标的方案差别很大。基于控件的好处是换分辨率、换手机不容易崩坏处是遇到动态加载的页面控件树还没渲染出来就去 findOnce直接返回 null。理解这一点后面所有稳定性优化都是围绕它展开的。2. TaoToken 统一 Key 接入为什么脚本侧也需要先说清楚 TaoToken 在这里扮演什么角色。官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 这个不加 UTM。它提供的是统一的模型调用通道你拿一个 Key就能在脚本里发起对话/补全请求不用为每个模型单独维护一套鉴权和地址。对打卡脚本来说模型调用不是必须的但一旦你想加这些能力它就有用了判断钉钉页面上那句「今日已打卡」到底是成功还是失败提示把打卡结果整理成一句自然语言写进日志或者根据当前时间节假日文案决定要不要跳过。这些逻辑用纯字符串匹配也能做但页面文案一改就废用模型做语义判断更抗造。关键是把 Key 收敛。我试过的最笨做法是每个 .js 文件顶部写一个 const KEY ...结果三个脚本三个 Key轮换的时候漏改一个脚本静默失败。正确做法是抽一个配置文件脚本启动时读进来。TaoToken 的 Key 在控制台创建地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建完在 API Keys 页面能看到页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到请求格式问题先翻它。注意Key 属于敏感信息别硬编码进要分享的脚本里也别提交到公开仓库。用配置文件 本地读取分享时把配置模板给出去就行。3. 可复制配置settings.json 与 config.toml 骨架auto.js 读本地文件用 files 模块路径一般放在 /sdcard/ 下。我习惯把配置放 /sdcard/autojs-dingtalk/config/ 目录脚本启动时读。下面给两份等价配置你按习惯选一份。先看 settings.json适合直接 JSON.parse{ taotoken: { base_url: https://taotoken.net/api, api_key: sk-替换成你自己的Key, model: gpt-4o-mini, timeout_ms: 15000 }, dingtalk: { package: com.alibaba.android.rimet, work_tab_desc: 工作, checkin_button_text: 打卡, max_retry: 3, retry_interval_ms: 1500 }, schedule: { work_days: [1, 2, 3, 4, 5], morning_after_hour: 8, morning_after_minute: 38, evening_after_hour: 18, evening_after_minute: 0 } }再看 config.toml可读性更好但 auto.js 没有内置 TOML 解析需要你自己写个简易解析或用现成库。如果你不想引依赖直接用上面的 JSON 更省事[taotoken] base_url https://taotoken.net/api api_key sk-替换成你自己的Key model gpt-4o-mini timeout_ms 15000 [dingtalk] package com.alibaba.android.rimet work_tab_desc 工作 checkin_button_text 打卡 max_retry 3 retry_interval_ms 1500 [schedule] work_days [1, 2, 3, 4, 5] morning_after_hour 8 morning_after_minute 38 evening_after_hour 18 evening_after_minute 0读取配置的脚本片段放在主入口最前面// config.js —— 统一读取配置其他脚本 require 它 var CONFIG_PATH /sdcard/autojs-dingtalk/config/settings.json; function loadConfig() { if (!files.exists(CONFIG_PATH)) { toast(配置文件不存在: CONFIG_PATH); exit(); } var raw files.read(CONFIG_PATH); try { return JSON.parse(raw); } catch (e) { toast(配置解析失败: e.message); exit(); } } module.exports loadConfig();主脚本里这样用var cfg require(./config.js); log(模型: cfg.taotoken.model); log(打卡包名: cfg.dingtalk.package);这样 Key 和业务参数都在一个文件里轮换 Key 只改一处。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 想先在网页上验证 Key 能不能用、模型返回格式对不对去那里试最快。4. 脚本结构与稳定性要点把脚本拆成四层比一个文件从头写到尾好维护得多。第一层是入口层负责点亮屏幕、判断时间段、决定要不要执行。点亮屏幕这段if (!device.isScreenOn()) { log(屏幕未唤醒尝试点亮); device.wakeUpIfNeeded(); sleep(800); }第二层是应用层负责启动钉钉并等待界面就绪。launchApp 之后不要立刻找控件给页面一点渲染时间launchApp(cfg.dingtalk.package); sleep(2500);第三层是控件层负责找控件、点击、重试。这是最容易出问题的地方核心思路是「找不到就等等不到就重试重试超限就报错退出」而不是 findOnce 返回 null 就继续往下跑function findWithRetry(selectorFn, maxRetry, interval) { for (var i 0; i maxRetry; i) { var node selectorFn(); if (node ! null) { return node; } log(第 (i 1) 次未找到控件等待重试); sleep(interval); } return null; } var workBtn findWithRetry(function () { return desc(cfg.dingtalk.work_tab_desc).findOnce(); }, cfg.dingtalk.max_retry, cfg.dingtalk.retry_interval_ms); if (workBtn null) { log(工作页签始终未出现退出); exit(); } workBtn.click(); sleep(1200);第四层是模型层负责在需要语义判断时调 TaoToken。用 auto.js 的 http.post 发请求注意把 Key 放在 Authorization 头里function askModel(prompt) { var url cfg.taotoken.base_url /v1/chat/completions; var headers { Content-Type: application/json, Authorization: Bearer cfg.taotoken.api_key }; var body { model: cfg.taotoken.model, messages: [ { role: system, content: 你是打卡结果判断助手只回答 success 或 fail。 }, { role: user, content: prompt } ] }; var res http.postJson(url, body, { headers: headers, timeout: cfg.taotoken.timeout_ms }); if (res.statusCode ! 200) { log(模型请求失败: res.statusCode res.body.string()); return null; } var data res.body.json(); return data.choices[0].message.content.trim(); }稳定性上还有几个点值得单独说。时间段判断别写死now_Hours 8用更稳否则 8 点 39 分启动脚本就永远进不去分支。工作日判断用配置里的 work_days 数组别硬编码now_day 6调休场景会翻车。脚本跑长任务时Android 可能因为省电策略杀进程建议在 auto.js 里开启前台服务或保持唤醒锁具体在应用设置里勾选。5. 验证请求与成功结果配置写完先别急着跑完整打卡流程分两步验证。第一步验证模型通道。单独写个 test-model.jsvar cfg require(./config.js); var result askModel(测试连通性回复 ok); log(模型返回: result);跑起来如果日志里出现模型返回: ok说明 Key、地址、模型名都对。如果返回 401检查 Key 是不是复制时带了空格返回 404检查 base_url 是不是漏了 /v1 或者多写了斜杠超时就把 timeout_ms 调大。第二步验证控件链路。把打卡动作先注释掉只跑到「找到工作页签并点击」为止看日志屏幕未唤醒尝试点亮 第 1 次未找到控件等待重试 找到工作页签如果一直卡在「未找到控件」多半是钉钉版本不同导致 desc 文案变了用 auto.js 的布局分析工具悬浮窗里的放大镜抓一下实际控件的 desc 或 text改配置里的 work_tab_desc 即可。完整跑通后日志大概长这样当前系统时间: 8:40 工作日进入打卡流程 启动钉钉 找到工作页签 找到打卡按钮 打卡动作已触发 模型判断结果: success看到最后一行 success说明从配置读取、控件查找、到模型语义判断整条链路都通了。6. 本篇常见错排查控件 findOnce 返回 null最常见。原因有三——页面没渲染完加 sleep 或重试、desc/text 文案和实际不符用布局分析工具核对、控件在 WebView 里auto.js 对 WebView 内控件支持有限这种情况得退回坐标点击辅助。脚本在 Android 7.0 以下报错auto.js 的部分 API 依赖较新的系统能力低版本系统上无障碍服务行为不一致。建议在 7.0 以上系统跑这是社区里反复验证过的经验。模型请求返回 401/403Key 无效或没带对。确认 Authorization 头是Bearer sk-xxx格式中间一个空格。Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成一个再试。请求超时网络抖动或模型响应慢。把 timeout_ms 调到 20000并在脚本里对模型调用做 try/catch失败时降级为字符串匹配不要让整个打卡流程因为模型超时而中断。脚本跑一半被杀Android 省电策略。在系统设置里给 auto.js 加白名单关闭电池优化auto.js 内部开启前台服务。时间段判断永远不触发检查是不是用了而不是以及 now_day 的取值周日是 0周一是 1和配置里的 work_days 对齐。如果你在接入过程中遇到请求格式、鉴权头、模型名这类问题优先翻接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 大部分报错那里都有对应说明。想把模型调用嵌进更长的编码或 Agent 流程可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合长期跑的自动化任务。ClaudeCodeAnthropic 相关入口在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 需要的话可以对照配置。最后留一个我踩过的坑配置文件里的 api_key 千万别用中文引号JSON.parse 会直接抛异常而 auto.js 的报错信息不一定明显容易误判成 Key 失效。改配置后先跑 test-model.js比直接跑主流程省时间。

相关推荐

ChatGPT Work 还是 Codex?需求、文档、代码三类任务的入口决策表
ChatGPT Work 还是 Codex?需求、文档、代码三类任务的入口决策表

ChatGPT Work 还是 Codex?需求、文档、代码三类任务的入口决策表 [!NOTE] ChatGPT Work 与 Codex 不是简单的“一个写文档、一个写代码”,真正的分界在交付物、所需工具、执行环境和验收证据。 Work 更适合从目标出发组织多来源材料并形成可审阅成果;Codex 更适合进入代码库… · 2026/9/26 10:29:01

基于MCP协议的AGI发展路径推演:从细分领域工具集群到全局智能涌现---MCP全球访问集群与TaoToken统一通道配置
基于MCP协议的AGI发展路径推演:从细分领域工具集群到全局智能涌现---MCP全球访问集群与TaoToken统一通道配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:29:01

vsftpd 550错误根源解析:chroot权限校验机制详解
vsftpd 550错误根源解析:chroot权限校验机制详解

1. 这不是FTP的锅,是权限逻辑在“装睡”你刚配好vsftpd,用户一登录就弹出550 Permission denied,刷新页面、重启服务、甚至重装软件都试过,还是不行——别急着怀疑Linux权限模型太复杂,其实问题往往藏在vsftpd自己设下… · 2026/9/26 10:28:55

数智码力:Python字符串处理大全!日常文本操作一键搞定
数智码力:Python字符串处理大全!日常文本操作一键搞定

文本处理属于最频繁出现的实践应用场景之一, 在日常办公活动里进行文字整理、数据清理、内容解析以及批量修改文件内容等事务时, 都是无法离开字符串操作环节的。很多初学者在面对文本处理工作场合,仅仅能够使用基础的拼接和切片方法, 一旦遭遇复杂的替换、分割、去除空格、格式… · 2026/9/26 11:08:11

我的编程学习启程 | 第一篇博客
我的编程学习启程 | 第一篇博客

大家好,这是我的第一篇技术博客,很高兴在这里记录我的编程成长之路。自我介绍我是一名计算机相关专业的学生,目前正在学习C语言,初步接触程序逻辑、基础语法。在学习过程中,我感受到代码解决问题的能力,也发… · 2026/9/26 11:08:11

Java 排序算法详细教学:从冒泡排序到快速排序
Java 排序算法详细教学:从冒泡排序到快速排序

1. 为什么需要掌握排序算法排序是程序开发中最常见的基础操作之一。无论是给商品列表按价格排序、给用户按注册时间排序,还是给搜索结果按相关度排序,背后都离不开排序算法。对于 Java 开发者来说,掌握排序算法不仅能帮助你理解 Arrays.sort … · 2026/9/26 11:08:11

省下千元订阅费!用 TaoToken 统一 Key 给 Cline 配置自主任务 AI 智能体,codex 平替实测
省下千元订阅费!用 TaoToken 统一 Key 给 Cline 配置自主任务 AI 智能体,codex 平替实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:08:11

C++代码实现MATLAB中的d2c函数功能
C++代码实现MATLAB中的d2c函数功能

// d2c.cpp // 完全自包含的 MATLAB d2c (ZOH) 实现 // 编译: g -stdc17 -O2 d2c.cpp -o d2c#include <iostream> #include <iomanip> #include <complex> #include <vector> #include <cmath> #include <stdexcept> #include <string&… · 2026/9/26 11:08:11

Atlas 300V部署YOLOv5全指南:从模型转换到性能调优
Atlas 300V部署YOLOv5全指南:从模型转换到性能调优

最近在做一个边缘AI推理项目&#xff0c;客户指定要在Atlas平台上跑YOLOv5目标检测&#xff0c;整个过程中从选型、部署到调优踩了不少坑。今天把整个项目完整拆一遍&#xff0c;从Atlas 300V 24G这块卡到底是不是运算加速卡开始&#xff0c;到最终YOLO模型成功上卡推理&#x… · 2026/9/26 11:08:04

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介&#xff1a;万常选版《数据库原理与设计》课后习题答案资源&#xff0c;覆盖第2至6章及第9章&#xff0c;适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件&#xff0c;含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故&#xff0c;是很多团队绕不过去的坎。线上环境里&#xff0c;服务端明明已经上线了新版接口&#xff0c;老的移动端还在照着旧文档传参数。请求一到网关&#xff0c;校验直接拒绝&#xff0c;用户操作失败&#xff0c;客服群炸了锅&#xff0c;开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码