把 WorkBuddy 每日自动签到搬上云端:一次彻底摆脱「任务被删 + 关机漏签」的踩坑实录

发布时间:2026/10/6 20:54:43

把 WorkBuddy 每日自动签到搬上云端:一次彻底摆脱「任务被删 + 关机漏签」的踩坑实录 写一个脚本每天定时签到不难难的是「它真的每天都跑成了」。本文记录我把 WorkBuddy 每日签到从 Windows 计划任务一路踩坑任务反复消失、关机不跑、代理拦截最终搬上云端自动化的全过程以及里面的鉴权、续期、安全细节。全程纯 Python 标准库无第三方依赖。1. 背景签到脚本本身很简单目标很朴素每天 09:00 自动完成 WorkBuddy 的每日签到领积分。社区已经有一个现成脚本88lin/workbuddy-auto-signin核心就一个signin.py纯标准库实现urllib零依赖逻辑也清晰读本机桌面端凭证文件workbuddy-desktop.info取出 JWTaccessTokenuidAuthorization: Bearer tokenX-User-IdX-Domain调两个接口先查状态、未签再领幂等先查后领已签过就直接返回重复跑不会多领。脚本没问题出问题的是「谁来在每天 09:00 准时把它跑起来」这件事。2. 第一版Windows 计划任务以及它怎么坑我最直接的想法用 Windows 任务计划程序Task Scheduler每天 09:00 跑python signin.py auto。于是踩坑开始了。2.1 坑一0x80070002python 不在 PATH任务建好后首次运行结果码0x80070002系统找不到文件。原因计划任务的环境变量和交互式命令行不一样python不在它的PATH里。修复Action 里不要写python直接写 Python 解释器的完整绝对路径C:\Users\Cornex\.workbuddy\binaries\python\versions\3.13.12\python.exe2.2 坑二任务反复「人间蒸发」更离谱的是任务建好跑了一段时间后凭空消失了——而且前后消失了 3 次。排查下来高度怀疑是 360 安全卫士企业版本机已启用Windows Defender 被禁用或系统清理策略把这类「非白名单计划任务」清掉了。每次都得手工重建。这是本机方案最致命的「隐性不稳定」你以为它还在其实它早没了。2.3 坑三「无论是否登录都运行」命令行搞不定用户提了个合理需求电脑没登录也要能签到。计划任务里这对应「不管用户是否登录都运行」Password / S4U 登录类型。但在本机环境里这条路被堵死了登录类型尝试方式结果S4U无需密码不支持该场景失败Password输密码schtasks /create /ru /rpschtasks.exe被程序策略拉黑SYSTEM 账户注册 SIDS-1-5-18返回「未指定的错误」权限不足PowerShell-CredentialRegister/Set-ScheduledTaskcmdlet 不支持该参数结论纯命令行在本机无法设置「无人登录也运行」只能去taskschd.msc图形界面手点而那个图形界面又要求输入账号密码且密码框无法绕过。2.4 坑四代理变量把 HTTPS 拦了某天手动跑脚本直接报ssl.SSLEOFError: [SSL: UNEXPECTED_EOF_WHILE_READING]排查发现本机有环境变量HTTP_PROXYhttp://127.0.0.1:29630某个 sandbox 工具注入的本地代理它把对copilot.tencent.com的 HTTPS 请求做了拦截/中转握手直接被掐断。脚本本身没被改动文件时间戳可证。修复跑脚本前清掉代理变量即可$env:HTTP_PROXY $null$env:HTTPS_PROXY $nullpython signin.py auto3. 致命硬伤本机任务关机就罢工前面那些坑好歹能修但有一个是物理层面的硬限制Windows 计划任务只能在操作系统运行时触发。电脑彻底关机断电 / 软关机时任务计划程序根本没在跑自然不会执行。睡眠 / 休眠还能靠「唤醒定时器」补但完全关机 不可能签到。而用户要的恰恰是「电脑不开机也能签到」。所以本机计划任务这条路先天就到不了终点。必须换思路——把执行体挪到「不依赖这台电脑开关机」的地方。4. 选型三条出路方案原理优点代价 / 风险A. BIOS 定时开机主板 RTC 设每天 ~08:55 自动通电开机 → 本机 09:00 任务跑 → 可选跑完自动关机仍在本机改动小任务被 360 清掉的老毛病照旧笔记本需一直插电B. 常开设备代跑把脚本 凭证复制到常开的 NAS / 云服务器 / 树莓派用 cron 跑最稳彻底脱离本机开关机与清理需要一台常开设备凭证要同步过去C. 云端自动化用 WorkBuddy 内置定时自动化在服务端跑不依赖本机不依赖本机开关机抗清理需把签到凭证交给云端代理安全考量最终选了C云端自动化它不依赖本机开关机也天然免疫 360 清理正中「关机也能签」的靶心。代价是凭证要放到云端——下文专门讲怎么把这道安全闸门处理好。5. 云端方案落地四个关键点5.1 先看明白签到脚本怎么鉴权逆向看signin.py和本机凭证文件后鉴权链路清晰了凭证文件workbuddy-desktop.info是 Keycloak 风格结构auth.accessTokenJWT有效期约 55 天expiresIn ≈ 4752000sauth.refreshToken刷新令牌约 60 天refreshExpiresIn ≈ 5184000sscope含offline_accessauth.domain www.codebuddy.cnaccount.uid用户标识。解码accessToken的 JWT payload能直接看到授权服务器信息iss https://www.codebuddy.cn/auth/realms/copilotazp / client_id console由此推断刷新端点https://www.codebuddy.cn/auth/realms/copilot/protocol/openid-connect/token请求头Authorization: Bearer token、X-User-Id: uid、X-Domain: www.codebuddy.cn。接口POST {endpoint}/v2/billing/meter/checkin-activity-status查、/daily-checkin领幂等。关键结论云端只要「带着这几个值」就能签到不依赖本机文件。5.2 把凭证「安全带」进云端base64 BLOB refresh token云端自动化无法读你本机的workbuddy-desktop.info所以必须把需要的字段随脚本一起带过去。做法从本机凭证文件抽取accessToken / refreshToken / uid / domain / realm / clientId / tokenEndpoint / apiEndpoint序列化成 JSON 后base64 编码成一个 BLOB 常量内嵌进脚本脚本运行时base64.b64decode还原绝不落盘、绝不打印明文令牌。防坑提示系统会对 JWT 做输出脱敏只回显前几位。直接print(token)拿不到完整值用base64 整体转码再输出就能绕过脱敏拿到完整 blob——这是把凭证写进云端 prompt 的必要一步。生成 BLOB 的本地小脚本脱敏不打印令牌importbase64,json,os AUTHrC:\Users\Cornex\AppData\Local\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.infodjson.load(open(AUTH,encodingutf-8))auth,accd[auth],d[account]creds{accessToken:auth[accessToken],refreshToken:auth[refreshToken],uid:acc[uid],domain:auth.get(domain),realm:copilot,clientId:console,tokenEndpoint:https://www.codebuddy.cn/auth/realms/copilot/protocol/openid-connect/token,apiEndpoint:https://copilot.tencent.com,}# 写成 base64避免 JWT 特征串被脱敏写入文件而非 stdout 更安全blobbase64.b64encode(json.dumps(creds,ensure_asciiFalse).encode()).decode()open(rD:\path\to\blob.txt,w,encodingutf-8).write(blob)5.3 幂等 自动续期云端脚本在「查 / 领」两步都做了 401/403 兜底一旦 accessToken 失效先用refreshToken去刷新端点换新的再重试换不到才报NO_SESSION。这样只要刷新端点推断正确令牌就能滚动续期基本做到「设完不用管」。完整逻辑脱敏版BLOB处填上一节的 blobimportbase64,json,ssl,urllib.request,urllib.error,urllib.parse BLOBBASE64_CREDENTIAL_BLOB# 上一步生成的 base64 凭证串defload_creds():returnjson.loads(base64.b64decode(BLOB).decode(utf-8))def_req(url,headers,methodGET,payloadNone):bodyjson.dumps(payload).encode()ifpayloadisnotNoneelseNonerurllib.request.Request(url,databody,headersheaders,methodmethod)ctxssl.create_default_context()try:withurllib.request.urlopen(r,timeout30,contextctx)asresp:rawresp.read().decode()try:returnresp.status,json.loads(raw)exceptException:returnresp.status,{raw:raw[:500]}excepturllib.error.HTTPErrorase:rawe.read().decode(utf-8,replace)try:returne.code,json.loads(raw)exceptException:returne.code,{raw:raw[:500]}exceptExceptionase:return-1,{error:str(e)}defheaders_for(token,creds):h{Accept:application/json,Authorization:Bearer %s%token,Content-Type:application/json,X-User-Id:creds.get(uid,),User-Agent:WorkBuddy,}ifcreds.get(domain):h[X-Domain]creds[domain]returnhdefrefresh(creds):dataurllib.parse.urlencode({grant_type:refresh_token,refresh_token:creds[refreshToken],client_id:creds.get(clientId,console),}).encode()rurllib.request.Request(creds[tokenEndpoint],datadata,headers{Content-Type:application/x-www-form-urlencoded,User-Agent:WorkBuddy},methodPOST,)ctxssl.create_default_context()try:withurllib.request.urlopen(r,timeout30,contextctx)asresp:returnjson.loads(resp.read().decode()).get(access_token)exceptException:returnNonedefcheckin():credsload_creds()apicreds[apiEndpoint].rstrip(/)tokencreds[accessToken]hheaders_for(token,creds)defstatus():return_req(api/v2/billing/meter/checkin-activity-status,h,POST)sc,sbstatus()ifscin(401,403):# token 失效先刷新ntrefresh(creds)ifnt:tokennt;hheaders_for(token,creds);sc,sbstatus()else:return{result:NO_SESSION,report:登录态失效且刷新失败请桌面端重登后重嵌凭证}ifnot(200sc300):return{result:ERROR,http:sc,report:状态接口异常HTTP %s%sc}stsbifisinstance(sb,dict)else{}ifst.get(active)isFalse:return{result:INACTIVE,report:当前签到活动未开启}ifst.get(today_checked_in)isTrue:# 幂等已签直接返回return{result:ALREADY,report:今日已签连续 %s 天%st.get(streak_days)}cc,cb_req(api/v2/billing/meter/daily-checkin,h,POST)ifccin(401,403):ntrefresh(creds)ifnt:tokennt;hheaders_for(token,creds)cc,cb_req(api/v2/billing/meter/daily-checkin,h,POST)ifisinstance(cb,dict):ifcb.get(credit)isnotNone:return{result:CLAIMED,report:成功领取 %s 积分连续 %s 天%(cb.get(credit),st.get(streak_days))}msgstr(cb.get(msg,))ifcb.get(code)10001or已签到inmsgor今天已inmsg:return{result:ALREADY,report:服务端判定今日已签}ifcodeincbormsgincb:return{result:ERROR,http:cc,report:领取失败%s%msg}return{result:UNKNOWN,http:cc,report:未识别的领取返回,body:str(cb)[:300]}if__name____main__:print(json.dumps(checkin(),ensure_asciiFalse))自动化 prompt 里还要加一条硬约束不要回显 / 打印 BLOB 与任何令牌片段不要尝试读取本机凭证文件——凭证已内置云端不该再去碰本机。5.4 敏感内容审批闸门把令牌含refreshToken嵌进 WorkBuddy 云端会触发平台的敏感内容审批。前两次创建都因「审批超时」自动化会话里没有真实人工弹窗完成授权被拦。直到在 WorkBuddy 自动化管理界面手动批准后才创建成功。这是正常的安全闸门不是脚本问题。它提醒我们令牌上云 把登录态交给了云端代理需用户明确知情并授权。6. 效果与运维自动化创建成功状态ACTIVE频率FREQDAILY;BYHOUR9;BYMINUTE10每天 09:10错开整点。彻底脱离本机电脑关机、睡眠、被 360 清理任务都不影响由 WorkBuddy 服务端执行。脚本逻辑、网络、令牌已在本机实跑验证通过返回{result:ALREADY}。后续维护情形表现处理正常每天 09:10 返回CLAIMED/ALREADY无需干预accessToken 过期但 refresh 有效脚本自动续期无需干预刷新也失效返回NO_SESSION桌面端重新登录 → 让助手重新生成 BLOB 重嵌活动结束返回INACTIVE看情况停用自动化accessToken 约 55 天、refreshToken 约 60 天有效只要刷新端点推断正确半年内基本不用管。7. 总结本机计划任务的三个坑PATH找不到 python0x80070002、任务被 360 反复删除、命令行无法设置「无人登录也运行」、本地代理拦截 HTTPS。物理硬伤Windows 计划任务在电脑完全关机时不执行——「关机也能签」必须搬到本机之外。选型BIOS 定时开机 / 常开设备代跑 / 云端自动化三条路按「是否接受令牌上云」定夺。云端落地四件事看明白 Keycloak 风格 JWT 鉴权 → base64 BLOB 把凭证安全带进云端 → 幂等 refresh 自动续期 → 通过敏感内容审批闸门。收益设一次每天 09:10 由服务端跑电脑开不开机、任务清没清都无所谓。一句话能搬云端的定时任务就别跟 Windows 计划任务以及它身后那台会自己清理任务的安全软件较劲了。
延伸阅读

更多相关文章

2026/10/6 20:54:43

解读 INT8 量化经典论文《Integer Quantization for Deep Learning Inference》:什么叫量化、为什么选量化、还有哪些替代方案——原理、校准与产业应用

解读 INT8 量化经典论文《Integer Quantization for Deep Learning Inference》:什么叫量化、为什么选量化这条路线、还有哪些替代方案——原理、校准与产业应用本文作为笔者个人备忘的文章,不喜勿喷。以及 AI 生成。全文基于 NVIDIA 论文《Integer Quan…

2026/10/6 20:54:43

别再为护眼灯交智商税了!书客、明基、柏曼、霍尼韦尔等10款热门型号深度拆解:什么样的台灯最护眼?一篇讲透选购逻辑和隐藏坑

​最近后台问护眼灯的家长特别多,问题高度一致:想给孩子选一盏真正护眼的灯,怎么选才不踩坑?但现实很残酷。要么图便宜买低价网红款,孩子用不了多久就喊眼睛酸,回头一看参数全是虚标;要么冲着大…

2026/10/6 21:54:48

AI视频成本拐点:智能体编排为何比模型本身更烧钱

1. 项目概述:一场被价格标签刺痛的AI视频生成现实最近在几个技术社区刷到一条标题特别扎眼的消息:“Twelve AI clay films for $184: The agents cost more than the video model”——直译过来就是“用184美元做了12部AI黏土动画短片,结果光…

2026/10/6 21:54:48

MCP与SERP接入实战:让AI Agent告别幻觉,实时搜索落地指南

最近好几个做 Agent 的朋友问我同一个问题:模型明明很能打,一碰最新消息就开始编。原因不复杂,LLM 的训练数据有截止时间,知识是“冷冻”的,你让它分析今天的新闻、查竞品刚上线的功能、追一篇昨天才发的论文&#xff…

2026/10/6 21:54:48

全栈项目从零到上线:TaskFlow实战系列之开发环境搭建

很多关注我的朋友后台催了好几次:想学一个完整项目,但不知道从哪下手,网上教程要么是零散的知识点,要么一上来就甩一堆代码,装完环境就卡住了。所以这次我干脆把带项目的全过程整理成一个连载系列——从技术选型、环境…

2026/10/6 21:54:48

KV-aware Router候选Worker打分机制:从一致性哈希到动态评分实践

在Dynamo系架构里摸爬滚打这几年,KV-aware Router一直是我觉得最挠头、也最值得琢磨的一块。很多人觉得它不就是个一致性哈希环加虚拟节点嘛,把key打到对应worker上就完事了。可真到了线上,你会发现事情远没那么简单。当一个key的候选worker列…

2026/10/6 21:49:48

OpenShell深度体验:将大模型融入终端命令行工作流的实战指南

1. 项目概述:OpenShell到底是什么,为什么值得折腾OpenShell这个项目,我第一次看到名字的时候以为又是个套壳脚本工具,但真正在终端里跑起来之后,我发现它解决的是一个特别实际的问题——把大型语言模型直接塞进你的命令…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑